+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
- <attributes>
- <attribute name="module" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>net.mograsim.logic.ui</name>
- <comment></comment>
- <projects>
- <project>net.mograsim.logic.core</project>
- <project>SWTZoomableCanvas</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.pde.PluginNature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=10
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.APILeak=warning
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=10
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
-org.eclipse.jdt.core.formatter.align_with_spaces=false
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=140
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.lineSplit=140
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=true
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
+++ /dev/null
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_MoGraSim
-formatter_settings_version=16
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: net.mograsim.logic.ui
-Bundle-SymbolicName: net.mograsim.logic.ui;singleton:=true
-Bundle-Version: 1.0.0
-Export-Package: net.mograsim.logic.ui,
- net.mograsim.logic.ui.examples,
- net.mograsim.logic.ui.model,
- net.mograsim.logic.ui.model.components,
- net.mograsim.logic.ui.model.wires,
- net.mograsim.logic.ui.modeladapter,
- net.mograsim.logic.ui.modeladapter.componentadapters
-Bundle-RequiredExecutionEnvironment: JavaSE-10
-Require-Bundle: org.eclipse.swt;bundle-version="3.110.0",
- SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport,
- net.mograsim.logic.core;bundle-version="1.0.0";visibility:=reexport
-Automatic-Module-Name: net.mograsim.logic.ui
+++ /dev/null
-source.. = src/
-bin.includes = META-INF/,\
- .
+++ /dev/null
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.components.Merger;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUIMerger extends Merger implements GUIComponent
-{
- private final int inputCount;
- private final double height;
- private final List<ReadEnd> connectedWireEnds;
- private final List<Point> WireEndConnectionPoints;
-
- public GUIMerger(ReadWriteEnd union, ReadEnd... inputs)
- {
- super(union, inputs);
-
- List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
- List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
-
- this.inputCount = inputs.length;
- this.height = (inputCount - 1) * 10;
-
- {
- connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
- double inputHeight = 0;
- for (int i = 0; i < inputCount; i++, inputHeight += 10)
- WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
- }
-
- connectedWireEndsModifiable.add(union);
- WireEndConnectionPointsModifiable.add(new Point(20, height / 2));
-
- this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
- this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
- }
-
- @Override
- public Rectangle getBounds()
- {
- return new Rectangle(0, 0, 20, height);
- }
-
- @Override
- public void render(GeneralGC gc)
- {
- double inputHeight = 0;
- for (int i = 0; i < inputCount; i++, inputHeight += 10)
- gc.drawLine(0, inputHeight, 10, inputHeight);
- gc.drawLine(10, 0, 10, height);
- gc.drawLine(10, height / 2, 20, height / 2);
- }
-
- @Override
- public int getConnectedWireEndsCount()
- {
- return connectedWireEnds.size();
- }
-
- @Override
- public ReadEnd getConnectedWireEnd(int connectionIndex)
- {
- return connectedWireEnds.get(connectionIndex);
- }
-
- @Override
- public Point getWireEndConnectionPoint(int connectionI)
- {
- return WireEndConnectionPoints.get(connectionI);
- }
-}
\ No newline at end of file
+++ /dev/null
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.logic.components.Mux;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUIMux extends Mux implements GUIComponent
-{
- private final double height;
- private final List<ReadEnd> connectedWireEnds;
- private final List<Point> WireEndConnectionPoints;
-
- public GUIMux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
- {
- super(processTime, out, select, inputs);
-
- double height = inputs.length * 5;
- if (height < 10)
- height = 10;
- this.height = height;
-
- List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
- List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
-
- connectedWireEndsModifiable.add(out);
- WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));
-
- connectedWireEndsModifiable.add(select);
- WireEndConnectionPointsModifiable.add(new Point(10, 5));
-
- {
- connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
- double inputHeightIncrement = (height + 20) / inputs.length;
- double inputHeight = inputHeightIncrement / 2;
- for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)
- WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
- }
-
- this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
- this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
- }
-
- @Override
- public Rectangle getBounds()
- {
- return new Rectangle(0, 0, 20, height + 20);
- }
-
- @Override
- public void render(GeneralGC gc)
- {
- gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });
- }
-
- @Override
- public int getConnectedWireEndsCount()
- {
- return connectedWireEnds.size();
- }
-
- @Override
- public ReadEnd getConnectedWireEnd(int connectionIndex)
- {
- return connectedWireEnds.get(connectionIndex);
- }
-
- @Override
- public Point getWireEndConnectionPoint(int connectionI)
- {
- return WireEndConnectionPoints.get(connectionI);
- }
-}
\ No newline at end of file
+++ /dev/null
-package era.mi.gui.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import era.mi.gui.ViewModel;
-import era.mi.logic.components.Splitter;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class GUISplitter extends GUIComponent
-{
- public GUISplitter(ViewModel model)
- {
- super(model);
-
- this.outputCount = outputs.length;
- this.height = (outputCount - 1) * 10;
-
- connectedWireEndsModifiable.add(input);
- WireEndConnectionPointsModifiable.add(new Point(0, height / 2));
-
- {
- connectedWireEndsModifiable.addAll(Arrays.asList(outputs));
- double outputHeight = 0;
- for (int i = 0; i < outputCount; i++, outputHeight += 10)
- WireEndConnectionPointsModifiable.add(new Point(20, outputHeight));
- }
-
- this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
- this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
- }
-
- @Override
- public Rectangle getBounds()
- {
- return new Rectangle(0, 0, 20, height);
- }
-
- @Override
- public void render(GeneralGC gc)
- {
- gc.drawLine(0, height / 2, 10, height / 2);
- gc.drawLine(10, 0, 10, height);
- double outputHeight = 0;
- for (int i = 0; i < outputCount; i++, outputHeight += 10)
- gc.drawLine(10, outputHeight, 20, outputHeight);
- }
-
- @Override
- public int getConnectedWireEndsCount()
- {
- return connectedWireEnds.size();
- }
-
- @Override
- public ReadEnd getConnectedWireEnd(int connectionIndex)
- {
- return connectedWireEnds.get(connectionIndex);
- }
-
- @Override
- public Point getWireEndConnectionPoint(int connectionI)
- {
- return WireEndConnectionPoints.get(connectionI);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.mograsim.logic.core.types.ColorDefinition;
-import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
-
-//TODO replace with a proper ColorManager
-public class ColorHelper
-{
- public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
- {
- executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
- }
-
- public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
- {
- executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
- }
-
- private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
- Runnable exec)
- {
- Color oldColor = getColor.get();
- boolean isNoSystemColor = col.builtInColor == null;
- Color newColor;
- if (isNoSystemColor)
- newColor = new Color(device, col.r, col.g, col.b);
- else
- newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
- setColor.accept(newColor);
-
- exec.run();
-
- setColor.accept(oldColor);
- if (isNoSystemColor)
- newColor.dispose();
- }
-
- public static int toSWTColorConstant(BuiltInColor col)
- {
- switch (col)
- {
- case COLOR_BLACK:
- return SWT.COLOR_BLACK;
- case COLOR_BLUE:
- return SWT.COLOR_BLUE;
- case COLOR_CYAN:
- return SWT.COLOR_CYAN;
- case COLOR_DARK_BLUE:
- return SWT.COLOR_DARK_BLUE;
- case COLOR_DARK_CYAN:
- return SWT.COLOR_DARK_CYAN;
- case COLOR_DARK_GRAY:
- return SWT.COLOR_DARK_GRAY;
- case COLOR_DARK_GREEN:
- return SWT.COLOR_DARK_GREEN;
- case COLOR_DARK_MAGENTA:
- return SWT.COLOR_DARK_MAGENTA;
- case COLOR_DARK_RED:
- return SWT.COLOR_DARK_RED;
- case COLOR_DARK_YELLOW:
- return SWT.COLOR_DARK_YELLOW;
- case COLOR_GRAY:
- return SWT.COLOR_GRAY;
- case COLOR_GREEN:
- return SWT.COLOR_GREEN;
- case COLOR_MAGENTA:
- return SWT.COLOR_MAGENTA;
- case COLOR_RED:
- return SWT.COLOR_RED;
- case COLOR_WHITE:
- return SWT.COLOR_WHITE;
- case COLOR_YELLOW:
- return SWT.COLOR_YELLOW;
- default:
- throw new IllegalArgumentException("Unknown enum constant: " + col);
- }
- }
-
- private ColorHelper()
- {
- throw new UnsupportedOperationException("No instances of ColorHelper");
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
-import net.mograsim.logic.core.timeline.Timeline;
-
-//TODO maybe move to logic core?
-public class LogicExecuter
-{
- // TODO replace with LogicModel when it exists
- private final Timeline timeline;
-
- private final AtomicBoolean shouldBeRunningLive;
- private final AtomicBoolean isRunningLive;
- private final AtomicLong nextExecSimulTime;
- private final Thread simulationThread;
-
- public LogicExecuter(Timeline timeline)
- {
- this.timeline = timeline;
-
- timeline.setTimeFunction(System::currentTimeMillis);
- shouldBeRunningLive = new AtomicBoolean();
- isRunningLive = new AtomicBoolean();
- nextExecSimulTime = new AtomicLong();
- simulationThread = new Thread(() ->
- {
- isRunningLive.set(true);
- synchronized (isRunningLive)
- {
- isRunningLive.notify();
- }
- while (shouldBeRunningLive.get())
- {
- // always execute to keep timeline from "hanging behind" for too long
- long current = System.currentTimeMillis();
- timeline.executeUntil(timeline.laterThan(current), current + 10);
- long sleepTime;
- if (timeline.hasNext())
- sleepTime = timeline.nextEventTime() - current;
- else
- sleepTime = 10000;
- try
- {
- nextExecSimulTime.set(current + sleepTime);
- if (sleepTime > 0)
- Thread.sleep(sleepTime);
- }
- catch (@SuppressWarnings("unused") InterruptedException e)
- {// do nothing; it is normal execution flow to be interrupted
- }
- }
- isRunningLive.set(false);
- synchronized (isRunningLive)
- {
- isRunningLive.notify();
- }
- });
- timeline.addEventAddedListener(event ->
- {
- if (isRunningLive.get())
- if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0)
- simulationThread.interrupt();
- });
- }
-
- public void executeNextStep()
- {
- timeline.executeNext();
- }
-
- public synchronized void startLiveExecution()
- {
- if (shouldBeRunningLive.get())
- return;
- shouldBeRunningLive.set(true);
- simulationThread.start();
- waitForIsRunning(true);
- }
-
- public synchronized void stopLiveExecution()
- {
- if (!shouldBeRunningLive.get())
- return;
- shouldBeRunningLive.set(false);
- simulationThread.interrupt();
- waitForIsRunning(false);
- }
-
- private void waitForIsRunning(boolean expectedState)
- {
- while (isRunningLive.get() ^ expectedState)
- try
- {
- synchronized (isRunningLive)
- {
- isRunningLive.wait();
- }
- }
- catch (@SuppressWarnings("unused") InterruptedException e)
- {// no need to do anything
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.Pin;
-
-/**
- * Simulation visualizer canvas.
- *
- * @author Daniel Kirschten
- */
-public class LogicUICanvas extends ZoomableCanvas
-{
- private static final boolean DRAW_PINS = false;
-
- private final ViewModel model;
-
- public LogicUICanvas(Composite parent, int style, ViewModel model)
- {
- super(parent, style);
-
- this.model = model;
-
- Consumer<Object> redrawConsumer = o -> redrawThreadsafe();
- Consumer<Pin> pinAddedListener = p ->
- {
- p.addPinMovedListener(redrawConsumer);
- redrawThreadsafe();
- };
- Consumer<Pin> pinRemovedListener = p ->
- {
- p.removePinMovedListener(redrawConsumer);
- redrawThreadsafe();
- };
- Consumer<? super GUIComponent> componentAddedListener = c ->
- {
- c.addComponentLookChangedListener(redrawConsumer);
- c.addComponentMovedListener(redrawConsumer);
- c.addPinAddedListener(pinAddedListener);
- c.addPinRemovedListener(pinRemovedListener);
- redrawThreadsafe();
- };
- model.addComponentAddedListener(componentAddedListener);
- model.getComponents().forEach(componentAddedListener);
- model.addComponentRemovedListener(c ->
- {
- c.removeComponentLookChangedListener(redrawConsumer);
- c.removeComponentMovedListener(redrawConsumer);
- c.removePinAddedListener(pinAddedListener);
- c.removePinRemovedListener(pinRemovedListener);
- redrawThreadsafe();
- });
- Consumer<? super GUIWire> wireAddedListener = w ->
- {
- w.addWireLookChangedListener(redrawConsumer);
- redrawThreadsafe();
- };
- model.addWireAddedListener(wireAddedListener);
- model.getWires().forEach(wireAddedListener);
- model.addWireRemovedListener(w ->
- {
- w.removeWireLookChangedListener(redrawConsumer);
- redrawThreadsafe();
- });
-
- addZoomedRenderer(gc ->
- {
- gc.setLineWidth(.5);
- model.getWires().forEach(w -> w.render(gc));
- Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);
- model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));
- });
- addListener(SWT.MouseDown, this::mouseDown);
- }
-
- private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)
- {
- component.render(gc, visibleRegion);
- if (DRAW_PINS)
- {
- gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_CYAN));
- for (Pin p : component.getPins())
- {
- Point pos = p.getPos();
- gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);
- }
- }
- }
-
- private void mouseDown(Event e)
- {
- if (e.button == 1)
- {
- Point click = displayToWorldCoords(e.x, e.y);
- for (GUIComponent component : model.getComponents())
- if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
- {
- redraw();
- break;
- }
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
-import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-
-/**
- * Standalone simulation visualizer graphical user interface.
- *
- * @author Daniel Kirschten
- */
-public class LogicUIStandaloneGUI
-{
- private final Display display;
- private final Shell shell;
- private final LogicUICanvas ui;
-
- public LogicUIStandaloneGUI(ViewModel model)
- {
- display = new Display();
- shell = new Shell(display);
- shell.setLayout(new FillLayout());
- ui = new LogicUICanvas(shell, SWT.NONE, model);
-
- ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
- userInput.buttonDrag = 3;
- userInput.buttonZoom = 2;
- userInput.enableUserInput();
- new ZoomableCanvasOverlay(ui, null).enableScale();
-
- // TODO don't do this here
- LogicModelParameters params = new LogicModelParameters();
- params.gateProcessTime = 50;
- params.wireTravelTime = 10;
-// timeline = ViewLogicModelAdapter.convert(model, params);
- }
-
- public LogicUICanvas getLogicUICanvas()
- {
- return ui;
- }
-
- /**
- * Opens the UI shell. Returns when the shell is closed.
- */
- public void run()
- {
- shell.open();
- while (!shell.isDisposed())
- if (!display.readAndDispatch())
- display.sleep();
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui;
-
-import java.util.function.Consumer;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
-
-public class SimpleLogicUIStandalone
-{
- public static void executeVisualisation(Consumer<ViewModel> setupViewModel)
- {
- // setup view model
- ViewModel viewModel = new ViewModel();
- setupViewModel.accept(viewModel);
-
- // convert to logic model
- LogicModelParameters params = new LogicModelParameters();
- params.gateProcessTime = 50;
- params.wireTravelTime = 10;
- Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
-
- // initialize UI and executer
- LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(viewModel);
- LogicExecuter exec = new LogicExecuter(timeline);
-
- // run it
- exec.startLiveExecution();
- ui.run();
- exec.stopLiveExecution();
- }
-
- private SimpleLogicUIStandalone()
- {
- throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances");
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.examples;
-
-import net.mograsim.logic.ui.SimpleLogicUIStandalone;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIManualSwitch;
-import net.mograsim.logic.ui.model.components.GUINotGate;
-import net.mograsim.logic.ui.model.components.GUIOrGate;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.WireCrossPoint;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-
-public class RSLatchExample
-{
- public static void main(String[] args)
- {
- SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample);
- }
-
- @SuppressWarnings("unused") // for GUIWires being created
- public static void createRSLatchExample(ViewModel model)
- {
- GUIManualSwitch rIn = new GUIManualSwitch(model);
- rIn.moveTo(100, 100);
- GUIManualSwitch sIn = new GUIManualSwitch(model);
- sIn.moveTo(100, 200);
-
- GUIOrGate or1 = new GUIOrGate(model, 1);
- or1.moveTo(160, 102.5);
- new GUIWire(model, rIn.getOutputPin(), or1.getInputPins().get(0));
-
- GUIOrGate or2 = new GUIOrGate(model, 1);
- or2.moveTo(160, 192.5);
- new GUIWire(model, sIn.getOutputPin(), or2.getInputPins().get(1));
-
- GUINotGate not1 = new GUINotGate(model, 1);
- not1.moveTo(200, 107.5);
- new GUIWire(model, or1.getOutputPin(), not1.getInputPins().get(0));
-
- GUINotGate not2 = new GUINotGate(model, 1);
- not2.moveTo(200, 197.5);
- new GUIWire(model, or2.getOutputPin(), not2.getInputPins().get(0));
-
- WireCrossPoint p1 = new WireCrossPoint(model, 1);
- p1.moveTo(250, 112.5);
- new GUIWire(model, not1.getOutputPin(), p1.getPin());
- new GUIWire(model, p1.getPin(), or2.getInputPins().get(0), new Point(250, 130), new Point(140, 185), new Point(140, 197.5));
-
- WireCrossPoint p2 = new WireCrossPoint(model, 1);
- p2.moveTo(250, 202.5);
- new GUIWire(model, not2.getOutputPin(), p2.getPin());
- new GUIWire(model, p2.getPin(), or1.getInputPins().get(1), new Point(250, 185), new Point(140, 130), new Point(140, 117.5));
-
- WireCrossPoint o1 = new WireCrossPoint(model, 1);
- o1.moveTo(270, 112.5);
- new GUIWire(model, p1.getPin(), o1.getPin());
-
- WireCrossPoint o2 = new WireCrossPoint(model, 1);
- o2.moveTo(270, 202.5);
- new GUIWire(model, p2.getPin(), o2.getPin());
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-
-public class ViewModel
-{
- private final List<GUIComponent> components;
- private final List<GUIComponent> componentsUnmodifiable;
- private final List<GUIWire> wires;
- private final List<GUIWire> wiresUnmodifiable;
-
- private final List<Consumer<? super GUIComponent>> componentAddedListeners;
- private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
- private final List<Consumer<? super GUIWire>> wireAddedListeners;
- private final List<Consumer<? super GUIWire>> wireRemovedListeners;
-
- public ViewModel()
- {
- components = new ArrayList<>();
- componentsUnmodifiable = Collections.unmodifiableList(components);
- wires = new ArrayList<>();
- wiresUnmodifiable = Collections.unmodifiableList(wires);
-
- componentAddedListeners = new ArrayList<>();
- componentRemovedListeners = new ArrayList<>();
- wireAddedListeners = new ArrayList<>();
- wireRemovedListeners = new ArrayList<>();
- }
-
- /**
- * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
- * code as it is automatically called in GUIComponent::new.
- */
- public void componentCreated(GUIComponent component)
- {
- if (components.contains(component))
- throw new IllegalStateException("Don't add the same component twice!");
- components.add(component);
- callComponentAddedListeners(component);
- }
-
- /**
- * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
- * application code as it is automatically called in GUIComponent::destroy.
- */
- public void componentDestroyed(GUIComponent component)
- {
- if (!components.contains(component))
- throw new IllegalStateException("Don't remove the same component twice!");
- components.remove(component);
- callComponentRemovedListeners(component);
- }
-
- /**
- * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
- * code as it is automatically called in GUIComponent::new.
- */
- public void wireCreated(GUIWire wire)
- {
- if (wires.contains(wire))
- throw new IllegalStateException("Don't add the same wire twice!");
- wires.add(wire);
- callWireAddedListeners(wire);
- }
-
- /**
- * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
- * application code as it is automatically called in GUIComponent::destroy.
- */
- public void wireDestroyed(GUIWire wire)
- {
- if (!wires.contains(wire))
- throw new IllegalStateException("Don't remove the same wire twice!");
- wires.remove(wire);
- callWireRemovedListeners(wire);
- }
-
- public List<GUIComponent> getComponents()
- {
- return componentsUnmodifiable;
- }
-
- public List<GUIWire> getWires()
- {
- return wiresUnmodifiable;
- }
-
- // @formatter:off
- public void addComponentAddedListener (Consumer<? super GUIComponent> listener){componentAddedListeners .add (listener);}
- public void addComponentRemovedListener (Consumer<? super GUIComponent> listener){componentRemovedListeners.add (listener);}
- public void addWireAddedListener (Consumer<? super GUIWire > listener){wireAddedListeners .add (listener);}
- public void addWireRemovedListener (Consumer<? super GUIWire > listener){wireRemovedListeners .add (listener);}
-
- public void removeComponentAddedListener (Consumer<? super GUIComponent> listener){componentAddedListeners .remove(listener);}
- public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener){componentRemovedListeners.remove(listener);}
- public void removeWireAddedListener (Consumer<? super GUIWire > listener){wireAddedListeners .remove(listener);}
- public void removeWireRemovedListener (Consumer<? super GUIWire > listener){wireRemovedListeners .remove(listener);}
-
- private void callComponentAddedListeners (GUIComponent c) {componentAddedListeners .forEach(l -> l.accept(c));}
- private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));}
- private void callWireAddedListeners (GUIWire w ) {wireAddedListeners .forEach(l -> l.accept(w));}
- private void callWireRemovedListeners (GUIWire w ) {wireRemovedListeners .forEach(l -> l.accept(w));}
- // @formatter:on
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUIAndGate extends SimpleRectangularGUIGate
-{
- public GUIAndGate(ViewModel model, int logicWidth)
- {
- super(model, logicWidth, "&", false);
- setInputCount(2);// TODO make variable
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public abstract class GUIComponent
-{
- protected final ViewModel model;
- private final Rectangle bounds;
- private final List<Pin> pins;
- protected final List<Pin> pinsUnmodifiable;
-
- private final List<Consumer<? super GUIComponent>> componentLookChangedListeners;
- private final List<Consumer<? super GUIComponent>> componentMovedListeners;
- private final List<Consumer<? super Pin>> pinAddedListeners;
- private final List<Consumer<? super Pin>> pinRemovedListeners;
-
- public GUIComponent(ViewModel model)
- {
- this.model = model;
- this.bounds = new Rectangle(0, 0, 0, 0);
- this.pins = new ArrayList<>();
- this.pinsUnmodifiable = Collections.unmodifiableList(pins);
-
- this.componentLookChangedListeners = new ArrayList<>();
- this.componentMovedListeners = new ArrayList<>();
- this.pinAddedListeners = new ArrayList<>();
- this.pinRemovedListeners = new ArrayList<>();
-
- model.componentCreated(this);
- }
-
- public void destroy()
- {
- pins.forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
- model.componentDestroyed(this);
- }
-
- public void moveTo(double x, double y)
- {
- bounds.x = x;
- bounds.y = y;
- callComponentMovedListeners();
- }
-
- /**
- * Returns the bounds of this component. Used for calculating which component is clicked.
- */
- public Rectangle getBounds()
- {
- return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
- }
-
- /**
- * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this
- * click.
- */
- @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden
- public boolean clicked(double x, double y)
- {
- return false;
- }
-
- /**
- * Returns a list of pins of this component.
- */
- public List<Pin> getPins()
- {
- return pinsUnmodifiable;
- }
-
- // @formatter:off
- public void addComponentLookChangedListener (Consumer<? super GUIComponent> listener) {componentLookChangedListeners.add (listener);}
- public void addComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .add (listener);}
- public void addPinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .add (listener);}
- public void addPinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .add (listener);}
-
- public void removeComponentLookChangedListener(Consumer<? super GUIComponent> listener) {componentLookChangedListeners.remove(listener);}
- public void removeComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .remove(listener);}
- public void removePinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .remove(listener);}
- public void removePinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .remove(listener);}
-
- protected void callComponentLookChangedListeners( ) {componentLookChangedListeners.forEach(l -> l.accept(this));}
- private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));}
- private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));}
- private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));}
- // @form atter:on
-
- /**
- * Render this component to the given gc.
- */
- public abstract void render(GeneralGC gc, Rectangle visibleRegion);
-
- protected void setSize(double width, double height)
- {
- bounds.width = width;
- bounds.height = height;
- callComponentLookChangedListeners();
- }
-
- protected void addPin(Pin pin)
- {
- pins.add(pin);
- callPinAddedListeners(pin);
- }
-
- protected void removePin(Pin pin)
- {
- pins.remove(pin);
- callPinRemovedListeners(pin);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.mograsim.logic.core.components.ManualSwitch;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class GUIManualSwitch extends GUIComponent
-{
- private static final double width = 20;
- private static final double height = 15;
- private static final double fontHeight = 5;
-
- private final Pin outputPin;
-
- private ManualSwitch logicSwitch;
- private ReadEnd end;
-
- public GUIManualSwitch(ViewModel model)
- {
- super(model);
- setSize(width, height);
- addPin(this.outputPin = new Pin(this, 1, width, height / 2));
- }
-
- @Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
- {
- double posX = getBounds().x;
- double posY = getBounds().y;
-
- gc.drawRectangle(posX, posY, width, height);
- String label = BitVectorFormatter.formatValueAsString(end);
- Font oldFont = gc.getFont();
- Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
- gc.setFont(labelFont);
- Point textExtent = gc.textExtent(label);
- gc.drawText(label, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
- gc.setFont(oldFont);
- }
-
- public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
- {
- this.logicSwitch = logicSwitch;
- this.end = end;
- // TODO when ManualSwitch supports it, add listeners
- end.addObserver((i, o) -> callComponentLookChangedListeners());
- }
-
- @Override
- public boolean clicked(double x, double y)
- {
- if (logicSwitch != null)
- logicSwitch.toggle();
- return true;
- }
-
- public Pin getOutputPin()
- {
- return outputPin;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUINotGate extends SimpleRectangularGUIGate
-{
- public GUINotGate(ViewModel model, int logicWidth)
- {
- super(model, logicWidth, "1", true);
- setInputCount(1);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import net.mograsim.logic.ui.model.ViewModel;
-
-public class GUIOrGate extends SimpleRectangularGUIGate
-{
- public GUIOrGate(ViewModel model, int logicWidth)
- {
- super(model, logicWidth, "\u22651", false);// ">=1"
- setInputCount(2);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.components;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.wires.MovablePin;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class SimpleRectangularGUIGate extends GUIComponent
-{
- private static final double width = 20;
- private static final double pinDistance = 10;
- private static final double fontHeight = 5;
- private static final double invertedCircleDiam = 3.5;
-
- private final String label;
- protected final int logicWidth;
- private final boolean isInverted;
- private final double rectWidth;
-
- private MovablePin outputPin;
- private final List<Pin> inputPins;
- private final List<Pin> inputPinsUnmodifiable;
-
- protected SimpleRectangularGUIGate(ViewModel model, int logicWidth, String label, boolean isInverted)
- {
- super(model);
- this.label = label;
- this.logicWidth = logicWidth;
- this.isInverted = isInverted;
- this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
- this.outputPin = new MovablePin(this, logicWidth, width, 0);
- addPin(outputPin);
- this.inputPins = new ArrayList<>();
- this.inputPinsUnmodifiable = Collections.unmodifiableList(inputPins);
- setInputCount(1);
- }
-
- protected void setInputCount(int inputCount)
- {
- int oldInputCount = inputPins.size();
- setSize(width, inputCount * pinDistance);
- if (oldInputCount > inputCount)
- while (inputPins.size() > inputCount)
- removePin(inputPins.get(inputCount));
- else if (oldInputCount < inputCount)
- for (int i = oldInputCount; i < inputCount; i++)
- {
- Pin pin = new Pin(this, logicWidth, 0, pinDistance / 2 + i * pinDistance);
- inputPins.add(pin);
- addPin(pin);
- }
- outputPin.setRelPos(width, inputCount * pinDistance / 2);
- }
-
- public Pin getOutputPin()
- {
- return outputPin;
- }
-
- public List<Pin> getInputPins()
- {
- return inputPinsUnmodifiable;
- }
-
- @Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
- {
- double posX = getBounds().x;
- double posY = getBounds().y;
-
- double height = inputPins.size() * pinDistance;
- gc.drawRectangle(posX, posY, rectWidth, height);
- Font oldFont = gc.getFont();
- Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
- gc.setFont(labelFont);
- Point textExtent = gc.textExtent(label);
- gc.drawText(label, posX + (rectWidth - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
- gc.setFont(oldFont);
- if (isInverted)
- gc.drawOval(posX + rectWidth, posY + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.wires;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.ColorHelper;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class GUIWire
-{
- private final ViewModel model;
- public final int logicWidth;
- private Pin pin1;
- private Pin pin2;
- private double[] path;
-
- private final List<Consumer<? super GUIWire>> wireLookChangedListeners;
-
- private ReadEnd end;
-
- public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
- {
- this.model = model;
- this.logicWidth = pin1.logicWidth;
- if (pin2.logicWidth != pin1.logicWidth)
- throw new IllegalArgumentException("Can't connect pins of different logic width");
- this.path = new double[path.length * 2 + 4];
- for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)
- {
- this.path[dstI + 0] = path[srcI].x;
- this.path[dstI + 1] = path[srcI].y;
- }
-
- this.pin1 = pin1;
- this.pin2 = pin2;
-
- wireLookChangedListeners = new ArrayList<>();
-
- pin1.addPinMovedListener(p -> pin1Moved());
- pin2.addPinMovedListener(p -> pin2Moved());
- pin1Moved();
- pin2Moved();
-
- model.wireCreated(this);
- }
-
- private void pin1Moved()
- {
- Point pos = pin1.getPos();
- this.path[0] = pos.x;
- this.path[1] = pos.y;
- }
-
- private void pin2Moved()
- {
- Point pos = pin2.getPos();
- this.path[this.path.length - 2] = pos.x;
- this.path[this.path.length - 1] = pos.y;
- }
-
- public void destroy()
- {
- model.wireDestroyed(this);
- }
-
- public void render(GeneralGC gc)
- {
- ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
- }
-
- public void setLogicModelBinding(ReadEnd end)
- {
- this.end = end;
- end.addObserver((i, o) -> callWireLookChangedListeners());
- }
-
- public Pin getPin1()
- {
- return pin1;
- }
-
- public Pin getPin2()
- {
- return pin2;
- }
-
- // @formatter:off
- public void addWireLookChangedListener (Consumer<? super GUIWire> listener) {wireLookChangedListeners.add (listener);}
-
- public void removeWireLookChangedListener(Consumer<? super GUIWire> listener) {wireLookChangedListeners.remove(listener);}
-
- private void callWireLookChangedListeners() {wireLookChangedListeners.forEach(l -> l.accept(this));}
- // @formatter:on
-
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.wires;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-
-public class MovablePin extends Pin
-{
- public MovablePin(GUIComponent component, int logicWidth, double relX, double relY)
- {
- super(component, logicWidth, relX, relY);
- }
-
- @Override
- public void setRelPos(double relX, double relY)
- {
- super.setRelPos(relX, relY);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.wires;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-
-public class Pin
-{
- public final GUIComponent component;
- public final int logicWidth;
-
- protected double relX;
- protected double relY;
-
- private final List<Consumer<? super Pin>> pinMovedListeners;
-
- public Pin(GUIComponent component, int logicWidth, double relX, double relY)
- {
- this.component = component;
- this.logicWidth = logicWidth;
- this.relX = relX;
- this.relY = relY;
-
- this.pinMovedListeners = new ArrayList<>();
-
- component.addComponentMovedListener(c -> callPinMovedListeners());
- }
-
- public double getRelX()
- {
- return relX;
- }
-
- public double getRelY()
- {
- return relY;
- }
-
- public Point getRelPos()
- {
- return new Point(relX, relY);
- }
-
- public Point getPos()
- {
- Rectangle componentBounds = component.getBounds();
- return new Point(relX + componentBounds.x, relY + componentBounds.y);
- }
-
- // @formatter:off
- public void addPinMovedListener (Consumer<? super Pin> listener){pinMovedListeners.add (listener);}
-
- public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
-
- private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
- // @formatter:on
-
- protected void setRelPos(double relX, double relY)
- {
- this.relX = relX;
- this.relY = relY;
- callPinMovedListeners();
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.model.wires;
-
-import net.mograsim.logic.ui.ColorHelper;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.haspamelodica.swt.helper.gcs.GeneralGC;
-import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
-import net.mograsim.logic.core.types.BitVectorFormatter;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class WireCrossPoint extends GUIComponent
-{
- private final Pin pin;
-
- private ReadEnd end;
- private final int logicWidth;
-
- public WireCrossPoint(ViewModel model, int logicWidth)
- {
- super(model);
- this.logicWidth = logicWidth;
- setSize(0, 0);
- addPin(this.pin = new Pin(this, logicWidth, 0, 0));
- }
-
- @Override
- public void render(GeneralGC gc, Rectangle visibleRegion)
- {
- Rectangle bounds = getBounds();
- ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
- () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
- }
-
- public void setLogicModelBinding(ReadEnd end)
- {
- this.end = end;
- end.addObserver((i, o) -> callComponentLookChangedListeners());
- }
-
- public int getLogicWidth()
- {
- return logicWidth;
- }
-
- public Pin getPin()
- {
- return pin;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.modeladapter;
-
-public class LogicModelParameters
-{
- public int wireTravelTime;
- public int gateProcessTime;
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.modeladapter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.model.components.GUIAndGate;
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.components.GUINotGate;
-import net.mograsim.logic.ui.model.components.GUIOrGate;
-import net.mograsim.logic.ui.model.wires.GUIWire;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.model.wires.WireCrossPoint;
-import net.mograsim.logic.ui.modeladapter.componentadapters.ComponentAdapter;
-import net.mograsim.logic.ui.modeladapter.componentadapters.ManualSwitchAdapter;
-import net.mograsim.logic.ui.modeladapter.componentadapters.SimpleGateAdapter;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.components.gates.AndGate;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class ViewLogicModelAdapter
-{
- private final static Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdapters;
- static
- {
- Set<ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashSet<>();
- componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new));
- componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new));
- componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o)));
- componentAdaptersModifiable.add(new ManualSwitchAdapter());
- // TODO list all "primitive" adapters here
- componentAdapters = Collections.unmodifiableMap(
- componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity())));
- }
-
- public static Timeline convert(ViewModel viewModel, LogicModelParameters params)
- {
- // TODO replace Timeline with LogicModel as soon as it exists
- Timeline timeline = new Timeline(10);
-
- Map<Pin, Wire> logicWiresPerPin = convertWires(
- viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()),
- viewModel.getWires(), params, timeline);
- Map<Pin, Wire> logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin);
-
- Map<GUIComponent, Component> oneToOneComponents = new HashMap<>();
- for (GUIComponent guiComp : viewModel.getComponents())
- {
- if (!(guiComp instanceof WireCrossPoint))
- oneToOneComponents.put(guiComp, createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable,
- componentAdapters.get(guiComp.getClass())));
- else
- {
- WireCrossPoint guiCompCasted = (WireCrossPoint) guiComp;
- guiCompCasted.setLogicModelBinding(logicWiresPerPin.get(guiCompCasted.getPin()).createReadOnlyEnd());
- }
- }
-
- // TODO handle complex components
-
- List<Component> logicComponents = new ArrayList<>();
- logicComponents.addAll(oneToOneComponents.values());
-
- return timeline;
- }
-
- private static Map<Pin, Wire> convertWires(Set<Pin> allPins, List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
- {
- Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(allPins, wires);
- Map<Pin, Wire> logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups);
- setGUIWiresLogicModelBinding(wires, logicWiresPerPin);
- return logicWiresPerPin;
- }
-
- private static Map<Pin, Wire> createLogicWires(LogicModelParameters params, Timeline timeline, Map<Pin, Set<Pin>> connectedPinGroups)
- {
- Map<Pin, Wire> logicWiresPerPin = new HashMap<>();
- Map<Set<Pin>, Wire> logicWiresPerPinGroup = new HashMap<>();
- for (Entry<Pin, Set<Pin>> e : connectedPinGroups.entrySet())
- logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(),
- set -> new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime)));
- return logicWiresPerPin;
- }
-
- private static void setGUIWiresLogicModelBinding(List<GUIWire> wires, Map<Pin, Wire> logicWiresPerPin)
- {
- Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct()
- .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd));
- for (GUIWire guiWire : wires)
- guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1())));
- }
-
- private static Map<Pin, Set<Pin>> getConnectedPinGroups(Set<Pin> allPins, List<GUIWire> wires)
- {
- Map<Pin, Set<Pin>> connectedPinsPerPin = new HashMap<>();
-
- for (Pin p : allPins)
- {
- HashSet<Pin> connectedPins = new HashSet<>();
- connectedPins.add(p);
- connectedPinsPerPin.put(p, connectedPins);
- }
-
- wires.forEach(wire ->
- {
- Pin pin1 = wire.getPin1();
- Pin pin2 = wire.getPin2();
-
- Set<Pin> pin1ConnectedPins = connectedPinsPerPin.get(pin1);
- Set<Pin> pin2ConnectedPins = connectedPinsPerPin.get(pin2);
-
- pin1ConnectedPins.addAll(pin2ConnectedPins);
- pin1ConnectedPins.add(pin1);
- pin1ConnectedPins.add(pin2);
-
- pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins));
- });
- return connectedPinsPerPin;
- }
-
- @SuppressWarnings("unchecked")
- private static <G extends GUIComponent> Component createAndLinkComponent(Timeline timeline, LogicModelParameters params,
- GUIComponent guiComponent, Map<Pin, Wire> logicWiresPerPin, ComponentAdapter<G> adapter)
- {
- if (adapter == null)
- throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass());
- return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin);
- }
-
- private ViewLogicModelAdapter()
- {
- throw new UnsupportedOperationException("No ViewLogicModelConverter instances");
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.GUIComponent;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-
-public interface ComponentAdapter<G extends GUIComponent>
-{
- public Class<G> getSupportedClass();
-
- public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent,
- Map<Pin, Wire> logicWiresPerPin);
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.GUIManualSwitch;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.components.ManualSwitch;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class ManualSwitchAdapter implements ComponentAdapter<GUIManualSwitch>
-{
- @Override
- public Class<GUIManualSwitch> getSupportedClass()
- {
- return GUIManualSwitch.class;
- }
-
- @Override
- public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIManualSwitch guiComponent,
- Map<Pin, Wire> logicWiresPerPin)
- {
- ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
- ManualSwitch manualSwitch = new ManualSwitch(timeline, end);
- guiComponent.setLogicModelBinding(manualSwitch, end);
- return manualSwitch;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.ui.modeladapter.componentadapters;
-
-import java.util.List;
-import java.util.Map;
-
-import net.mograsim.logic.ui.model.components.SimpleRectangularGUIGate;
-import net.mograsim.logic.ui.model.wires.Pin;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.core.components.Component;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class SimpleGateAdapter<G extends SimpleRectangularGUIGate> implements ComponentAdapter<G>
-{
- private final Class<G> supportedClass;
- private final ComponentConstructor constructor;
-
- public SimpleGateAdapter(Class<G> supportedClass, ComponentConstructor constructor)
- {
- this.supportedClass = supportedClass;
- this.constructor = constructor;
- }
-
- @Override
- public Class<G> getSupportedClass()
- {
- return supportedClass;
- }
-
- @Override
- public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent, Map<Pin, Wire> logicWiresPerPin)
- {
- ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
- List<Pin> inputPins = guiComponent.getInputPins();
- ReadEnd[] ins = new ReadEnd[inputPins.size()];
- for (int i = 0; i < inputPins.size(); i++)
- ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
- return constructor.newComponent(timeline, params.gateProcessTime, out, ins);
- }
-
- public static interface ComponentConstructor
- {
- public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
- }
-
-}
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
- <attributes>
- <attribute name="module" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-/bin/
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>net.mograsim.rcp</name>
- <comment></comment>
- <projects>
- <project>net.mograsim.rcp</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.APILeak=warning
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=1.8
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
-org.eclipse.jdt.core.formatter.align_with_spaces=false
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=140
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
-org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.lineSplit=140
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=true
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
+++ /dev/null
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_MoGraSim
-formatter_settings_version=16
-org.eclipse.jdt.ui.text.custom_code_templates=
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=false
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=false
-sp_cleanup.remove_redundant_semicolons=false
-sp_cleanup.remove_redundant_type_arguments=false
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
+++ /dev/null
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.build.bin.includes=1
-compilers.p.build.encodings=1
-compilers.p.build.java.compiler=1
-compilers.p.build.java.compliance=1
-compilers.p.build.missing.output=2
-compilers.p.build.output.library=1
-compilers.p.build.source.library=1
-compilers.p.build.src.includes=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=1
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.no.automatic.module=1
-compilers.p.not-externalized-att=1
-compilers.p.service.component.without.lazyactivation=1
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
+++ /dev/null
-eclipse.preferences.version=1
-task-tags/use-project-settings=true
+++ /dev/null
-autoEnabled=true
-eclipse.preferences.version=1
-extraProperties=
-fileExclusions=
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_6wlLcMgZEeSyMNYR5xypkQ" elementId="Sample.application" bindingContexts="_6wlLecgZEeSyMNYR5xypkQ">
- <children xsi:type="basic:TrimmedWindow" xmi:id="_6wlLccgZEeSyMNYR5xypkQ" elementId="Sample.window.main" label="Sample RCP4" iconURI="platform:/plugin/net.mograsim.rcp/icons/app/ico_16t.png" width="500" height="400">
- <children xsi:type="basic:PartSashContainer" xmi:id="_6wlLksgZEeSyMNYR5xypkQ" elementId="Sample.partsashcontainer.sample">
- <children xsi:type="basic:PartStack" xmi:id="_6wlLk8gZEeSyMNYR5xypkQ" elementId="Sample.partstack.sample">
- <children xsi:type="basic:Part" xmi:id="_6wlLlMgZEeSyMNYR5xypkQ" elementId="Sample.part.sample" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.SamplePart" label="Sample Part" iconURI="platform:/plugin/net.mograsim.rcp/icons/home.png"/>
- <children xsi:type="basic:Part" xmi:id="_cldhcH1HEema06ZDPR6BSw" elementId="net.mograsim.rcp.part.logicui" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.LogicUIPart" label="LogicUI part"/>
- </children>
- <children xsi:type="basic:PartStack" xmi:id="_l2EzYG6wEemo__tDmTCqCQ" elementId="sample.partstack.0">
- <children xsi:type="basic:Part" xmi:id="_mW1XEG6wEemo__tDmTCqCQ" elementId="sample.part.none" label="None" tooltip="Something"/>
- </children>
- </children>
- <mainMenu xmi:id="_6wlLicgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.menu">
- <children xsi:type="menu:Menu" xmi:id="_6wlLisgZEeSyMNYR5xypkQ" elementId="file" label="File">
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLi8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.file.open" label="Open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.save" label="Save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjcgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.quit" label="Quit" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
- </children>
- <children xsi:type="menu:Menu" xmi:id="_6wlLjsgZEeSyMNYR5xypkQ" elementId="help" label="Help">
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLj8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.about" label="About" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
- </children>
- </mainMenu>
- <trimBars xmi:id="_6wlLlcgZEeSyMNYR5xypkQ" elementId="Sample.trimbar.top">
- <children xsi:type="menu:ToolBar" xmi:id="_6wlLlsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.toolbar">
- <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLmMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
- <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLl8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
- </children>
- </trimBars>
- </children>
- <handlers xmi:id="_6wlLfcgZEeSyMNYR5xypkQ" elementId="sample.handler.quitCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.QuitHandler" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
- <handlers xmi:id="_6wlLgcgZEeSyMNYR5xypkQ" elementId="sample.handler.openCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.OpenHandler" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
- <handlers xmi:id="_6wlLhMgZEeSyMNYR5xypkQ" elementId="sample.handler.saveCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.SaveHandler" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
- <handlers xmi:id="_6wlLh8gZEeSyMNYR5xypkQ" elementId="sample.handler.aboutCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.AboutHandler" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
- <bindingTables xmi:id="_6wlLfsgZEeSyMNYR5xypkQ" elementId="Sample.bindingtable" bindingContext="_6wlLecgZEeSyMNYR5xypkQ">
- <bindings xmi:id="_6wlLf8gZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1q" keySequence="M1+Q" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
- <bindings xmi:id="_6wlLgsgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1o" keySequence="M1+O" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
- <bindings xmi:id="_6wlLhcgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1s" keySequence="M1+S" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
- <bindings xmi:id="_6wlLiMgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1a" keySequence="M1+A" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
- </bindingTables>
- <rootContext xmi:id="_6wlLecgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
- <children xmi:id="_6wlLesgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
- <children xmi:id="_6wlLe8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
- </rootContext>
- <commands xmi:id="_6wlLfMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>
- <commands xmi:id="_6wlLgMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.open" commandName="openCommand"/>
- <commands xmi:id="_6wlLg8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>
- <commands xmi:id="_6wlLhsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>
- <addons xmi:id="_6wlLcsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
- <addons xmi:id="_6wlLc8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
- <addons xmi:id="_6wlLdMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
- <addons xmi:id="_6wlLdcgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
- <addons xmi:id="_6wlLdsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.handler.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
- <addons xmi:id="_6wlLd8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
- <addons xmi:id="_6wlLeMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
-</application:Application>
+++ /dev/null
-Eclipse Public License - v 2.0
-
- THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
- PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
- OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
- a) in the case of the initial Contributor, the initial content
- Distributed under this Agreement, and
-
- b) in the case of each subsequent Contributor:
- i) changes to the Program, and
- ii) additions to the Program;
- where such changes and/or additions to the Program originate from
- and are Distributed by that particular Contributor. A Contribution
- "originates" from a Contributor if it was added to the Program by
- such Contributor itself or anyone acting on such Contributor's behalf.
- Contributions do not include changes or additions to the Program that
- are not Modified Works.
-
-"Contributor" means any person or entity that Distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which
-are necessarily infringed by the use or sale of its Contribution alone
-or when combined with the Program.
-
-"Program" means the Contributions Distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement
-or any Secondary License (as applicable), including Contributors.
-
-"Derivative Works" shall mean any work, whether in Source Code or other
-form, that is based on (or derived from) the Program and for which the
-editorial revisions, annotations, elaborations, or other modifications
-represent, as a whole, an original work of authorship.
-
-"Modified Works" shall mean any work in Source Code or other form that
-results from an addition to, deletion from, or modification of the
-contents of the Program, including, for purposes of clarity any new file
-in Source Code form that contains any contents of the Program. Modified
-Works shall not include works that contain only declarations,
-interfaces, types, classes, structures, or files of the Program solely
-in each case in order to link to, bind by name, or subclass the Program
-or Modified Works thereof.
-
-"Distribute" means the acts of a) distributing or b) making available
-in any manner that enables the transfer of a copy.
-
-"Source Code" means the form of a Program preferred for making
-modifications, including but not limited to software source code,
-documentation source, and configuration files.
-
-"Secondary License" means either the GNU General Public License,
-Version 2.0, or any later versions of that license, including any
-exceptions or additional permissions as identified by the initial
-Contributor.
-
-2. GRANT OF RIGHTS
-
- a) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free copyright
- license to reproduce, prepare Derivative Works of, publicly display,
- publicly perform, Distribute and sublicense the Contribution of such
- Contributor, if any, and such Derivative Works.
-
- b) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free patent
- license under Licensed Patents to make, use, sell, offer to sell,
- import and otherwise transfer the Contribution of such Contributor,
- if any, in Source Code or other form. This patent license shall
- apply to the combination of the Contribution and the Program if, at
- the time the Contribution is added by the Contributor, such addition
- of the Contribution causes such combination to be covered by the
- Licensed Patents. The patent license shall not apply to any other
- combinations which include the Contribution. No hardware per se is
- licensed hereunder.
-
- c) Recipient understands that although each Contributor grants the
- licenses to its Contributions set forth herein, no assurances are
- provided by any Contributor that the Program does not infringe the
- patent or other intellectual property rights of any other entity.
- Each Contributor disclaims any liability to Recipient for claims
- brought by any other entity based on infringement of intellectual
- property rights or otherwise. As a condition to exercising the
- rights and licenses granted hereunder, each Recipient hereby
- assumes sole responsibility to secure any other intellectual
- property rights needed, if any. For example, if a third party
- patent license is required to allow Recipient to Distribute the
- Program, it is Recipient's responsibility to acquire that license
- before distributing the Program.
-
- d) Each Contributor represents that to its knowledge it has
- sufficient copyright rights in its Contribution, if any, to grant
- the copyright license set forth in this Agreement.
-
- e) Notwithstanding the terms of any Secondary License, no
- Contributor makes additional grants to any Recipient (other than
- those set forth in this Agreement) as a result of such Recipient's
- receipt of the Program under the terms of a Secondary License
- (if permitted under the terms of Section 3).
-
-3. REQUIREMENTS
-
-3.1 If a Contributor Distributes the Program in any form, then:
-
- a) the Program must also be made available as Source Code, in
- accordance with section 3.2, and the Contributor must accompany
- the Program with a statement that the Source Code for the Program
- is available under this Agreement, and informs Recipients how to
- obtain it in a reasonable manner on or through a medium customarily
- used for software exchange; and
-
- b) the Contributor may Distribute the Program under a license
- different than this Agreement, provided that such license:
- i) effectively disclaims on behalf of all other Contributors all
- warranties and conditions, express and implied, including
- warranties or conditions of title and non-infringement, and
- implied warranties or conditions of merchantability and fitness
- for a particular purpose;
-
- ii) effectively excludes on behalf of all other Contributors all
- liability for damages, including direct, indirect, special,
- incidental and consequential damages, such as lost profits;
-
- iii) does not attempt to limit or alter the recipients' rights
- in the Source Code under section 3.2; and
-
- iv) requires any subsequent distribution of the Program by any
- party to be under a license that satisfies the requirements
- of this section 3.
-
-3.2 When the Program is Distributed as Source Code:
-
- a) it must be made available under this Agreement, or if the
- Program (i) is combined with other material in a separate file or
- files made available under a Secondary License, and (ii) the initial
- Contributor attached to the Source Code the notice described in
- Exhibit A of this Agreement, then the Program may be made available
- under the terms of such Secondary Licenses, and
-
- b) a copy of this Agreement must be included with each copy of
- the Program.
-
-3.3 Contributors may not remove or alter any copyright, patent,
-trademark, attribution notices, disclaimers of warranty, or limitations
-of liability ("notices") contained within the Program from any copy of
-the Program which they Distribute, provided that Contributors may add
-their own appropriate notices.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities
-with respect to end users, business partners and the like. While this
-license is intended to facilitate the commercial use of the Program,
-the Contributor who includes the Program in a commercial product
-offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes
-the Program in a commercial product offering, such Contributor
-("Commercial Contributor") hereby agrees to defend and indemnify every
-other Contributor ("Indemnified Contributor") against any losses,
-damages and costs (collectively "Losses") arising from claims, lawsuits
-and other legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such
-Commercial Contributor in connection with its distribution of the Program
-in a commercial product offering. The obligations in this section do not
-apply to any claims or Losses relating to any actual or alleged
-intellectual property infringement. In order to qualify, an Indemnified
-Contributor must: a) promptly notify the Commercial Contributor in
-writing of such claim, and b) allow the Commercial Contributor to control,
-and cooperate with the Commercial Contributor in, the defense and any
-related settlement negotiations. The Indemnified Contributor may
-participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial
-product offering, Product X. That Contributor is then a Commercial
-Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance
-claims and warranties are such Commercial Contributor's responsibility
-alone. Under this section, the Commercial Contributor would have to
-defend claims against the other Contributors related to those performance
-claims and warranties, and if a court requires any other Contributor to
-pay any damages as a result, the Commercial Contributor must pay
-those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
-PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the
-appropriateness of using and distributing the Program and assumes all
-risks associated with its exercise of rights under this Agreement,
-including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs
-or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
-PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
-SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
-PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE
-EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of
-the remainder of the terms of this Agreement, and without further
-action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity
-(including a cross-claim or counterclaim in a lawsuit) alleging that the
-Program itself (excluding combinations of the Program with other software
-or hardware) infringes such Recipient's patent(s), then such Recipient's
-rights granted under Section 2(b) shall terminate as of the date such
-litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it
-fails to comply with any of the material terms or conditions of this
-Agreement and does not cure such failure in a reasonable period of
-time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use
-and distribution of the Program as soon as reasonably practicable.
-However, Recipient's obligations under this Agreement and any licenses
-granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement,
-but in order to avoid inconsistency the Agreement is copyrighted and
-may only be modified in the following manner. The Agreement Steward
-reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement
-Steward has the right to modify this Agreement. The Eclipse Foundation
-is the initial Agreement Steward. The Eclipse Foundation may assign the
-responsibility to serve as the Agreement Steward to a suitable separate
-entity. Each new version of the Agreement will be given a distinguishing
-version number. The Program (including Contributions) may always be
-Distributed subject to the version of the Agreement under which it was
-received. In addition, after a new version of the Agreement is published,
-Contributor may elect to Distribute the Program (including its
-Contributions) under the new version.
-
-Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
-receives no rights or licenses to the intellectual property of any
-Contributor under this Agreement, whether expressly, by implication,
-estoppel or otherwise. All rights in the Program not expressly granted
-under this Agreement are reserved. Nothing in this Agreement is intended
-to be enforceable by any entity that is not a Contributor or Recipient.
-No third-party beneficiary rights are created under this Agreement.
-
-Exhibit A - Form of Secondary Licenses Notice
-
-"This Source Code may also be made available under the following
-Secondary Licenses when the conditions for such availability set forth
-in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
-version(s), and exceptions or additional permissions here}."
-
- Simply including a copy of this Agreement, including this Exhibit A
- is not sufficient to license the Source Code under Secondary Licenses.
-
- If it is not possible or desirable to put the notice in a particular
- file, then You may include the notice in a location (such as a LICENSE
- file in a relevant directory) where a recipient would be likely to
- look for such a notice.
-
- You may add additional accurate notices of copyright ownership.
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: net.mograsim.rcp;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.200",
- org.eclipse.e4.ui.model.workbench;bundle-version="2.1.300",
- org.eclipse.jface;bundle-version="3.15.100",
- org.eclipse.e4.ui.workbench;bundle-version="1.9.0",
- org.eclipse.e4.core.di;bundle-version="1.7.100",
- org.eclipse.e4.ui.di;bundle-version="1.2.500",
- org.eclipse.ui.workbench;bundle-version="3.113.0",
- javax.annotation;bundle-version="1.2.0",
- net.mograsim.logic.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Automatic-Module-Name: Sample
-Export-Package: net.mograsim.rcp.handlers;uses:="org.eclipse.swt.widgets,org.eclipse.e4.ui.workbench,org.eclipse.e4.ui.workbench.modeling",
- net.mograsim.rcp.parts;uses:="org.eclipse.swt.widgets",
- net.mograsim.rcp.splashhandlers
+++ /dev/null
-#Properties file for Sample
-Bundle-Vendor = MYSELF
-Bundle-Name = Sample
-product.name = Sample
-extension-point.name = Splash Extensions
-product.name.0 = Simulator WIP
\ No newline at end of file
+++ /dev/null
-output.. = bin/
-bin.includes = plugin.xml,\
- META-INF/,\
- .,\
- icons/,\
- Application.e4xmi,\
- css/,\
- splash.bmp,\
- schema/,\
- OSGI-INF/l10n/bundle.properties,\
- OSGI-INF/
-source.. = src/
-src.includes = Application.e4xmi,\
- OSGI-INF/l10n/bundle.properties,\
- css/,\
- icons/,\
- schema/,\
- splash.bmp
+++ /dev/null
-/* XPM */
-static char * C:\Users\Christian\Documents\Informatik_Studium\ico_256t_xpm[] = {
-"256 256 2750 2",
-" c None",
-". c #000000",
-"+ c #00100E",
-"@ c #001312",
-"# c #001413",
-"$ c #001C1B",
-"% c #001A19",
-"& c #001515",
-"* c #002120",
-"= c #002221",
-"- c #001918",
-"; c #002525",
-"> c #002927",
-", c #002323",
-"' c #000F0E",
-") c #001C1A",
-"! c #002726",
-"~ c #002C2B",
-"{ c #002928",
-"] c #001110",
-"^ c #001E1C",
-"/ c #002727",
-"( c #002D2C",
-"_ c #002B2B",
-": c #002827",
-"< c #001E1D",
-"[ c #001211",
-"} c #001F1C",
-"| c #002E2E",
-"1 c #002625",
-"2 c #001D1D",
-"3 c #002121",
-"4 c #002C2C",
-"5 c #001514",
-"6 c #002F2E",
-"7 c #002B2C",
-"8 c #002424",
-"9 c #001816",
-"0 c #002F2D",
-"a c #00302F",
-"b c #001A18",
-"c c #002725",
-"d c #002A29",
-"e c #001B1A",
-"f c #003130",
-"g c #003131",
-"h c #002F2F",
-"i c #001F1D",
-"j c #000D0B",
-"k c #001615",
-"l c #00110F",
-"m c #001010",
-"n c #001F1E",
-"o c #002B2A",
-"p c #002220",
-"q c #002321",
-"r c #002021",
-"s c #00201E",
-"t c #001D1C",
-"u c #001D1B",
-"v c #001917",
-"w c #001716",
-"x c #001313",
-"y c #001111",
-"z c #001F1F",
-"A c #003333",
-"B c #003231",
-"C c #003332",
-"D c #003232",
-"E c #002020",
-"F c #002E2C",
-"G c #002929",
-"H c #002524",
-"I c #001E1E",
-"J c #001818",
-"K c #001717",
-"L c #001414",
-"M c #002E2F",
-"N c #003233",
-"O c #002E2D",
-"P c #002423",
-"Q c #00201F",
-"R c #001A1A",
-"S c #002F30",
-"T c #003434",
-"U c #002322",
-"V c #003334",
-"W c #002D2D",
-"X c #002828",
-"Y c #002324",
-"Z c #002222",
-"` c #001817",
-" . c #003635",
-".. c #003535",
-"+. c #003534",
-"@. c #003636",
-"#. c #003433",
-"$. c #002D2E",
-"%. c #003533",
-"&. c #003837",
-"*. c #003736",
-"=. c #003836",
-"-. c #003735",
-";. c #003432",
-">. c #002C2A",
-",. c #002422",
-"'. c #002320",
-"). c #001C1C",
-"!. c #003331",
-"~. c #002A28",
-"{. c #002624",
-"]. c #003737",
-"^. c #002D2B",
-"/. c #003839",
-"(. c #003838",
-"_. c #003939",
-":. c #003230",
-"<. c #002B29",
-"[. c #003637",
-"}. c #000C0B",
-"|. c #001412",
-"1. c #00393A",
-"2. c #003A3A",
-"3. c #002626",
-"4. c #001715",
-"5. c #002523",
-"6. c #003A3B",
-"7. c #003536",
-"8. c #003A39",
-"9. c #00302E",
-"0. c #003C3C",
-"a. c #003B3C",
-"b. c #003B3B",
-"c. c #003B3A",
-"d. c #003A3C",
-"e. c #003738",
-"f. c #003030",
-"g. c #00292A",
-"h. c #001919",
-"i. c #001614",
-"j. c #002A2A",
-"k. c #003C3D",
-"l. c #003B3D",
-"m. c #003D3D",
-"n. c #003132",
-"o. c #003537",
-"p. c #003C3E",
-"q. c #003D3C",
-"r. c #003E3E",
-"s. c #003E3D",
-"t. c #003F3F",
-"u. c #003F3E",
-"v. c #003E3F",
-"w. c #003C3B",
-"x. c #003938",
-"y. c #003D3F",
-"z. c #004041",
-"A. c #004040",
-"B. c #003F40",
-"C. c #003F41",
-"D. c #003E40",
-"E. c #004042",
-"F. c #00403F",
-"G. c #004141",
-"H. c #004142",
-"I. c #004241",
-"J. c #003031",
-"K. c #004242",
-"L. c #003634",
-"M. c #004140",
-"N. c #004243",
-"O. c #004344",
-"P. c #004345",
-"Q. c #004445",
-"R. c #004244",
-"S. c #004343",
-"T. c #004444",
-"U. c #002C2D",
-"V. c #00383A",
-"W. c #004546",
-"X. c #004446",
-"Y. c #004245",
-"Z. c #004646",
-"`. c #004143",
-" + c #004545",
-".+ c #004647",
-"++ c #004747",
-"@+ c #004447",
-"#+ c #004547",
-"$+ c #004746",
-"%+ c #004748",
-"&+ c #00484A",
-"*+ c #004849",
-"=+ c #00474A",
-"-+ c #00484B",
-";+ c #004749",
-">+ c #004848",
-",+ c #004A4C",
-"'+ c #00494C",
-")+ c #004B4C",
-"!+ c #00494B",
-"~+ c #00494A",
-"{+ c #004A4B",
-"]+ c #004C4C",
-"^+ c #004949",
-"/+ c #004B4B",
-"(+ c #004C4D",
-"_+ c #004C4B",
-":+ c #004D4D",
-"<+ c #004D4E",
-"[+ c #004E4F",
-"}+ c #004D4F",
-"|+ c #004E4E",
-"1+ c #004C4E",
-"2+ c #004645",
-"3+ c #004E50",
-"4+ c #004F4F",
-"5+ c #004F50",
-"6+ c #004649",
-"7+ c #005052",
-"8+ c #005051",
-"9+ c #004F51",
-"0+ c #005053",
-"a+ c #005153",
-"b+ c #003D3E",
-"c+ c #005254",
-"d+ c #004B4D",
-"e+ c #005253",
-"f+ c #005152",
-"g+ c #005355",
-"h+ c #005255",
-"i+ c #005154",
-"j+ c #005356",
-"k+ c #005354",
-"l+ c #005456",
-"m+ c #005050",
-"n+ c #005455",
-"o+ c #005457",
-"p+ c #005557",
-"q+ c #005556",
-"r+ c #005658",
-"s+ c #005659",
-"t+ c #004A4A",
-"u+ c #005759",
-"v+ c #005558",
-"w+ c #004648",
-"x+ c #00575A",
-"y+ c #00585A",
-"z+ c #005859",
-"A+ c #00585B",
-"B+ c #004C4F",
-"C+ c #00595C",
-"D+ c #005A5D",
-"E+ c #005A5C",
-"F+ c #00595B",
-"G+ c #00595D",
-"H+ c #005B5D",
-"I+ c #00585C",
-"J+ c #005A5B",
-"K+ c #004D50",
-"L+ c #005B5E",
-"M+ c #005C5E",
-"N+ c #005C5F",
-"O+ c #005C5D",
-"P+ c #005B5F",
-"Q+ c #005D5E",
-"R+ c #005E60",
-"S+ c #005D5F",
-"T+ c #005E5F",
-"U+ c #005B5C",
-"V+ c #005151",
-"W+ c #005F60",
-"X+ c #004342",
-"Y+ c #005657",
-"Z+ c #005F62",
-"`+ c #005F63",
-" @ c #005E61",
-".@ c #005758",
-"+@ c #005D62",
-"@@ c #005D60",
-"#@ c #005C60",
-"$@ c #005E62",
-"%@ c #006063",
-"&@ c #005F61",
-"*@ c #006164",
-"=@ c #006364",
-"-@ c #006264",
-";@ c #006265",
-">@ c #006163",
-",@ c #006365",
-"'@ c #006465",
-")@ c #006466",
-"!@ c #006162",
-"~@ c #006064",
-"{@ c #006366",
-"]@ c #006367",
-"^@ c #006062",
-"/@ c #006567",
-"(@ c #00595A",
-"_@ c #006568",
-":@ c #006467",
-"<@ c #006566",
-"[@ c #006267",
-"}@ c #006165",
-"|@ c #006569",
-"1@ c #006469",
-"2@ c #004346",
-"3@ c #004A4D",
-"4@ c #006468",
-"5@ c #006769",
-"6@ c #006669",
-"7@ c #00676A",
-"8@ c #006668",
-"9@ c #005E63",
-"0@ c #00666A",
-"a@ c #003A38",
-"b@ c #006667",
-"c@ c #005D61",
-"d@ c #00686B",
-"e@ c #00676B",
-"f@ c #00686A",
-"g@ c #2A5B5C",
-"h@ c #00686C",
-"i@ c #00696C",
-"j@ c #00676C",
-"k@ c #004548",
-"l@ c #00696B",
-"m@ c #00666B",
-"n@ c #006B6D",
-"o@ c #006A6D",
-"p@ c #006A6C",
-"q@ c #005458",
-"r@ c #00696A",
-"s@ c #00696D",
-"t@ c #006A6E",
-"u@ c #006C6D",
-"v@ c #006B6E",
-"w@ c #005252",
-"x@ c #006C6E",
-"y@ c #006B6F",
-"z@ c #006C6F",
-"A@ c #006E71",
-"B@ c #006D6F",
-"C@ c #006E70",
-"D@ c #006D70",
-"E@ c #006C70",
-"F@ c #006D6E",
-"G@ c #006E6F",
-"H@ c #007072",
-"I@ c #006F71",
-"J@ c #007071",
-"K@ c #006D71",
-"L@ c #006F72",
-"M@ c #007073",
-"N@ c #007173",
-"O@ c #006F73",
-"P@ c #007074",
-"Q@ c #006A6B",
-"R@ c #00575B",
-"S@ c #007172",
-"T@ c #007174",
-"U@ c #006266",
-"V@ c #007175",
-"W@ c #00656A",
-"X@ c #007274",
-"Y@ c #006E72",
-"Z@ c #006368",
-"`@ c #004F52",
-" # c #004E51",
-".# c #007376",
-"+# c #007275",
-"@# c #007276",
-"## c #007375",
-"$# c #007477",
-"%# c #007476",
-"&# c #005353",
-"*# c #007377",
-"=# c #007578",
-"-# c #005A5E",
-";# c #007577",
-"># c #005155",
-",# c #007679",
-"'# c #007678",
-")# c #00777A",
-"!# c #007779",
-"~# c #00787A",
-"{# c #00767A",
-"]# c #00787B",
-"^# c #007478",
-"/# c #00797C",
-"(# c #00797B",
-"_# c #007A7C",
-":# c #007576",
-"<# c #007879",
-"[# c #007A7B",
-"}# c #006263",
-"|# c #005C5C",
-"1# c #007A7D",
-"2# c #007B7E",
-"3# c #007B7D",
-"4# c #00797D",
-"5# c #007273",
-"6# c #007C7E",
-"7# c #007A7E",
-"8# c #007D7F",
-"9# c #007D80",
-"0# c #007D81",
-"a# c #007E80",
-"b# c #007B7C",
-"c# c #007F81",
-"d# c #007D7E",
-"e# c #007C7F",
-"f# c #007E7F",
-"g# c #007E83",
-"h# c #007F82",
-"i# c #007E81",
-"j# c #007E82",
-"k# c #007F83",
-"l# c #007D82",
-"m# c #007C80",
-"n# c #008084",
-"o# c #004C50",
-"p# c #008184",
-"q# c #008083",
-"r# c #008183",
-"s# c #008082",
-"t# c #008286",
-"u# c #008487",
-"v# c #008387",
-"w# c #008386",
-"x# c #008185",
-"y# c #006B6C",
-"z# c #008284",
-"A# c #008588",
-"B# c #008488",
-"C# c #008388",
-"D# c #008287",
-"E# c #008285",
-"F# c #008589",
-"G# c #00868B",
-"H# c #00858A",
-"I# c #00858B",
-"J# c #00868A",
-"K# c #00868C",
-"L# c #008489",
-"M# c #00797E",
-"N# c #004A4E",
-"O# c #00878B",
-"P# c #00878D",
-"Q# c #00878C",
-"R# c #00888D",
-"S# c #00888C",
-"T# c #00888B",
-"U# c #00898C",
-"V# c #00878E",
-"W# c #00898D",
-"X# c #008A8E",
-"Y# c #00898E",
-"Z# c #008A8F",
-"`# c #008A8D",
-" $ c #00898F",
-".$ c #008389",
-"+$ c #008990",
-"@$ c #00777B",
-"#$ c #008C91",
-"$$ c #008D91",
-"%$ c #008C90",
-"&$ c #008D92",
-"*$ c #008B90",
-"=$ c #006D72",
-"-$ c #008B91",
-";$ c #008186",
-">$ c #008E92",
-",$ c #008F93",
-"'$ c #008E93",
-")$ c #009094",
-"!$ c #008F92",
-"~$ c #008B8F",
-"{$ c #008F94",
-"]$ c #009195",
-"^$ c #009095",
-"/$ c #009194",
-"($ c #007F84",
-"_$ c #009093",
-":$ c #006869",
-"<$ c #009296",
-"[$ c #009297",
-"}$ c #009196",
-"|$ c #009397",
-"1$ c #009197",
-"2$ c #009096",
-"3$ c #009498",
-"4$ c #009598",
-"5$ c #009398",
-"6$ c #009497",
-"7$ c #008C8F",
-"8$ c #009295",
-"9$ c #009499",
-"0$ c #009599",
-"a$ c #00959A",
-"b$ c #00969A",
-"c$ c #009399",
-"d$ c #00969B",
-"e$ c #00959B",
-"f$ c #00949A",
-"g$ c #006061",
-"h$ c #009298",
-"i$ c #00989F",
-"j$ c #00979D",
-"k$ c #00989D",
-"l$ c #00989E",
-"m$ c #00979C",
-"n$ c #00979B",
-"o$ c #00979E",
-"p$ c #00999F",
-"q$ c #009A9F",
-"r$ c #0099A0",
-"s$ c #009AA0",
-"t$ c #008C92",
-"u$ c #009AA1",
-"v$ c #00999E",
-"w$ c #008689",
-"x$ c #009BA0",
-"y$ c #009CA0",
-"z$ c #009CA1",
-"A$ c #009BA1",
-"B$ c #00787C",
-"C$ c #009DA2",
-"D$ c #009EA3",
-"E$ c #009CA2",
-"F$ c #009DA3",
-"G$ c #009EA2",
-"H$ c #009CA3",
-"I$ c #009EA5",
-"J$ c #009FA5",
-"K$ c #009EA4",
-"L$ c #009DA4",
-"M$ c #00A0A6",
-"N$ c #009EA6",
-"O$ c #009FA6",
-"P$ c #008F95",
-"Q$ c #009BA2",
-"R$ c #00A1A7",
-"S$ c #00A0A7",
-"T$ c #007A7F",
-"U$ c #00959C",
-"V$ c #00A3A9",
-"W$ c #00A2A9",
-"X$ c #00A1A8",
-"Y$ c #00A2A8",
-"Z$ c #00A3AA",
-"`$ c #009B9F",
-" % c #00A4AA",
-".% c #00A5AA",
-"+% c #00A3A8",
-"@% c #008D90",
-"#% c #009FA4",
-"$% c #00A5AB",
-"%% c #00A4A9",
-"&% c #00787D",
-"*% c #008385",
-"=% c #00A4AB",
-"-% c #00A5AC",
-";% c #00A6AC",
-">% c #00A6AD",
-",% c #00A6AB",
-"'% c #00A7AC",
-")% c #00A8AE",
-"!% c #00A7AE",
-"~% c #00A8B0",
-"{% c #00A7AF",
-"]% c #00A9AF",
-"^% c #00A8AF",
-"/% c #007B80",
-"(% c #00A7AD",
-"_% c #00A6AE",
-":% c #00A9B0",
-"<% c #00777C",
-"[% c #00A9B1",
-"}% c #00A4AC",
-"|% c #007B7F",
-"1% c #00AAB1",
-"2% c #00AAB2",
-"3% c #00A9B2",
-"4% c #01A3AA",
-"5% c #01AAB2",
-"6% c #01ABB3",
-"7% c #01AAB1",
-"8% c #01949A",
-"9% c #01A5AC",
-"0% c #01A8B0",
-"a% c #018D91",
-"b% c #01A1A6",
-"c% c #019498",
-"d% c #01A6AC",
-"e% c #01ADB4",
-"f% c #01ACB3",
-"g% c #01ACB4",
-"h% c #02ACB5",
-"i% c #02ACB4",
-"j% c #01ACB5",
-"k% c #02A9B2",
-"l% c #019DA2",
-"m% c #018286",
-"n% c #019AA0",
-"o% c #02A8B0",
-"p% c #00ABB3",
-"q% c #01ADB5",
-"r% c #01A7AF",
-"s% c #02999F",
-"t% c #019399",
-"u% c #01A6AD",
-"v% c #02ADB4",
-"w% c #01A9B1",
-"x% c #019CA2",
-"y% c #018183",
-"z% c #02787A",
-"A% c #01989D",
-"B% c #02A8AF",
-"C% c #02AEB5",
-"D% c #02ADB5",
-"E% c #01AEB4",
-"F% c #02AEB4",
-"G% c #01ADB3",
-"H% c #02A9B1",
-"I% c #029BA1",
-"J% c #017B7F",
-"K% c #018387",
-"L% c #019FA5",
-"M% c #02AAB2",
-"N% c #03AEB6",
-"O% c #02A6AD",
-"P% c #01787B",
-"Q% c #03AEB4",
-"R% c #02ACB3",
-"S% c #02A8B1",
-"T% c #029A9F",
-"U% c #017A7C",
-"V% c #028084",
-"W% c #039EA4",
-"X% c #03AAB3",
-"Y% c #03AEB5",
-"Z% c #03AFB6",
-"`% c #03AFB5",
-" & c #03B0B6",
-".& c #03A8AF",
-"+& c #02989D",
-"@& c #028B8F",
-"#& c #03A3AB",
-"$& c #03ACB5",
-"%& c #02AFB6",
-"&& c #02AEB6",
-"*& c #03ADB4",
-"=& c #03A5AC",
-"-& c #028F93",
-";& c #039FA6",
-">& c #03ABB3",
-",& c #02AFB5",
-"'& c #02969A",
-")& c #048B8F",
-"!& c #03A3AA",
-"~& c #04ADB5",
-"{& c #04B1B7",
-"]& c #05B1B8",
-"^& c #04B0B7",
-"/& c #04B1B8",
-"(& c #05B0B7",
-"_& c #05A8AF",
-":& c #049399",
-"<& c #026C70",
-"[& c #039399",
-"}& c #03A7AF",
-"|& c #05AFB7",
-"1& c #04ADB6",
-"2& c #04A3AA",
-"3& c #048A8D",
-"4& c #038C90",
-"5& c #03A4AA",
-"6& c #04AEB5",
-"7& c #049297",
-"8& c #036B6D",
-"9& c #049296",
-"0& c #05B0B6",
-"a& c #05B2B9",
-"b& c #05A7AD",
-"c& c #048D92",
-"d& c #03787B",
-"e& c #039AA0",
-"f& c #05ABB3",
-"g& c #05AEB5",
-"h& c #049FA5",
-"i& c #048185",
-"j& c #036C6F",
-"k& c #049397",
-"l& c #05A9B0",
-"m& c #04AFB7",
-"n& c #05AFB6",
-"o& c #04A5AD",
-"p& c #038B8F",
-"q& c #037477",
-"r& c #04979E",
-"s& c #06B3B9",
-"t& c #06B3BA",
-"u& c #05A3AA",
-"v& c #04878B",
-"w& c #05A1A6",
-"x& c #05B2B8",
-"y& c #05ADB4",
-"z& c #049CA1",
-"A& c #03767A",
-"B& c #059BA0",
-"C& c #06B2B9",
-"D& c #04B2B9",
-"E& c #04A2A8",
-"F& c #048589",
-"G& c #047E82",
-"H& c #05A0A6",
-"I& c #06AFB7",
-"J& c #08B4BB",
-"K& c #07B4BB",
-"L& c #06B4BB",
-"M& c #06B4BA",
-"N& c #07B3BA",
-"O& c #06B0B7",
-"P& c #069FA5",
-"Q& c #047F81",
-"R& c #058B90",
-"S& c #05A6AD",
-"T& c #07B4BA",
-"U& c #07B2B9",
-"V& c #06ABB3",
-"W& c #05989C",
-"X& c #058084",
-"Y& c #059FA6",
-"Z& c #07AFB6",
-"`& c #059EA4",
-" * c #047D81",
-".* c #05878C",
-"+* c #08A6AC",
-"@* c #09B3B9",
-"#* c #08B5BC",
-"$* c #09B5BC",
-"%* c #09B4BB",
-"&* c #09AFB6",
-"** c #069CA1",
-"=* c #069399",
-"-* c #07ABB2",
-";* c #09B5BB",
-">* c #08B6BD",
-",* c #09B4BA",
-"'* c #07AAB1",
-")* c #049298",
-"!* c #058A8E",
-"~* c #07A5AC",
-"{* c #08B2B9",
-"]* c #08B4BC",
-"^* c #07AEB5",
-"/* c #079AA0",
-"(* c #079195",
-"_* c #09AAB2",
-":* c #0AB5BC",
-"<* c #0AB7BE",
-"[* c #09B6BD",
-"}* c #0AB6BD",
-"|* c #09ADB5",
-"1* c #07979C",
-"2* c #057578",
-"3* c #08AEB5",
-"4* c #0AB7BD",
-"5* c #08A9AF",
-"6* c #078D91",
-"7* c #069296",
-"8* c #09ACB3",
-"9* c #0AB6BC",
-"0* c #06969A",
-"a* c #057174",
-"b* c #08999F",
-"c* c #0AB0B6",
-"d* c #0AB8BF",
-"e* c #09B7BE",
-"f* c #0BB8BF",
-"g* c #0BB7BE",
-"h* c #09AAB1",
-"i* c #089196",
-"j* c #067F83",
-"k* c #09A1A8",
-"l* c #0AB2BA",
-"m* c #06868A",
-"n* c #067276",
-"o* c #099BA0",
-"p* c #0AB6BE",
-"q* c #0AB5BD",
-"r* c #078F93",
-"s* c #077C80",
-"t* c #0AA1A8",
-"u* c #0BB3BA",
-"v* c #0DBAC1",
-"w* c #0CB9C0",
-"x* c #0CBAC1",
-"y* c #0BB9C0",
-"z* c #0CB6BD",
-"A* c #0AA9AF",
-"B* c #098B90",
-"C* c #07888C",
-"D* c #0AA7AF",
-"E* c #0DB7BE",
-"F* c #0CBAC0",
-"G* c #0CB2BA",
-"H* c #077E82",
-"I* c #0BA2A8",
-"J* c #0AB4BB",
-"K* c #0BBAC1",
-"L* c #0CB9C1",
-"M* c #0BB6BE",
-"N* c #07888E",
-"O* c #08868B",
-"P* c #0BA6AE",
-"Q* c #0DBBC2",
-"R* c #0CBBC2",
-"S* c #0EBBC2",
-"T* c #0CBBC1",
-"U* c #0DBBC1",
-"V* c #0DBAC2",
-"W* c #0DB9C0",
-"X* c #0BB5BB",
-"Y* c #0BA4AB",
-"Z* c #088488",
-"`* c #0A9297",
-" = c #0BACB3",
-".= c #0EBAC1",
-"+= c #0A9CA2",
-"@= c #08888D",
-"#= c #0BA7AE",
-"$= c #0EB7BD",
-"%= c #0EBAC2",
-"&= c #0CB4BB",
-"*= c #0AA3AA",
-"== c #088085",
-"-= c #05585C",
-";= c #098F94",
-">= c #0DABB3",
-",= c #0CB8BF",
-"'= c #0EBCC2",
-")= c #0EBCC3",
-"!= c #0FBCC3",
-"~= c #0EB5BC",
-"{= c #0AA0A6",
-"]= c #0A999F",
-"^= c #0CB1B8",
-"/= c #0FBBC1",
-"(= c #0DB0B7",
-"_= c #0A959B",
-":= c #0A9196",
-"<= c #0DADB4",
-"[= c #0EB9C0",
-"}= c #0FBBC2",
-"|= c #0EBAC0",
-"1= c #0EB3BB",
-"2= c #0B9FA4",
-"3= c #097B80",
-"4= c #0A969C",
-"5= c #0DB1B7",
-"6= c #0FBDC3",
-"7= c #10BDC4",
-"8= c #0EBDC3",
-"9= c #0FBCC4",
-"0= c #10BCC2",
-"a= c #0EB4BA",
-"b= c #0B9BA0",
-"c= c #087C80",
-"d= c #0CA3A9",
-"e= c #0FB7BD",
-"f= c #0FBEC3",
-"g= c #0FBDC2",
-"h= c #0FBDC4",
-"i= c #10BAC1",
-"j= c #0DACB3",
-"k= c #0A9095",
-"l= c #0B999F",
-"m= c #0EB2BA",
-"n= c #0EBDC2",
-"o= c #0FBCC2",
-"p= c #10BDC3",
-"q= c #0EB2B9",
-"r= c #0B989F",
-"s= c #0C959A",
-"t= c #09787B",
-"u= c #0C9FA5",
-"v= c #10B6BE",
-"w= c #11BEC4",
-"x= c #10BEC4",
-"y= c #12BFC6",
-"z= c #11BEC5",
-"A= c #11BFC5",
-"B= c #10BFC4",
-"C= c #12BEC5",
-"D= c #11BFC6",
-"E= c #11BDC3",
-"F= c #0DB0B8",
-"G= c #0B9498",
-"H= c #0A868A",
-"I= c #0CA7AE",
-"J= c #10BBC0",
-"K= c #10BFC5",
-"L= c #11BDC5",
-"M= c #12BFC5",
-"N= c #10B9C0",
-"O= c #0DAAB0",
-"P= c #0A898E",
-"Q= c #0A7B7F",
-"R= c #0CA2A8",
-"S= c #10B7BE",
-"T= c #10BEC5",
-"U= c #0EB0B7",
-"V= c #0A9197",
-"W= c #0DA2A9",
-"X= c #11B0B8",
-"Y= c #0D9DA3",
-"Z= c #0B8487",
-"`= c #0EA7AF",
-" - c #11BBC1",
-".- c #13C1C7",
-"+- c #12C0C6",
-"@- c #14C1C7",
-"#- c #12C1C7",
-"$- c #13C0C6",
-"%- c #11BCC2",
-"&- c #0EACB3",
-"*- c #0B8D91",
-"=- c #0A8E94",
-"-- c #10AFB6",
-";- c #12C1C6",
-">- c #11B9C0",
-",- c #0EA7AD",
-"'- c #0A8689",
-")- c #10A9B0",
-"!- c #12BCC2",
-"~- c #13C0C5",
-"{- c #11C0C6",
-"]- c #12C0C5",
-"^- c #12BDC4",
-"/- c #0B8C90",
-"(- c #0FA8B0",
-"_- c #12BBC2",
-":- c #11B3BB",
-"<- c #0D969B",
-"[- c #0C8D91",
-"}- c #10AEB5",
-"|- c #13BEC4",
-"1- c #14C2C8",
-"2- c #13BCC3",
-"3- c #10A9B1",
-"4- c #0E999F",
-"5- c #10B3BA",
-"6- c #13BFC5",
-"7- c #13C2C8",
-"8- c #15C2C8",
-"9- c #15C1C7",
-"0- c #12B8BE",
-"a- c #0EA0A6",
-"b- c #0D8E93",
-"c- c #11AEB5",
-"d- c #13BDC4",
-"e- c #10A9AF",
-"f- c #104547",
-"g- c #0A8085",
-"h- c #11AFB5",
-"i- c #14BEC5",
-"j- c #11AFB6",
-"k- c #0D8F94",
-"l- c #0D959B",
-"m- c #11B3BA",
-"n- c #14BFC6",
-"o- c #15C3C9",
-"p- c #16C3C9",
-"q- c #16C2C8",
-"r- c #13B9C0",
-"s- c #10A5AB",
-"t- c #0A787C",
-"u- c #10A2A8",
-"v- c #13B9BF",
-"w- c #17C3C9",
-"x- c #13B6BD",
-"y- c #0F9BA1",
-"z- c #0D989E",
-"A- c #13B4BC",
-"B- c #10A3A9",
-"C- c #0E8B90",
-"D- c #14B4BB",
-"E- c #18C3C9",
-"F- c #17C4CA",
-"G- c #16BFC6",
-"H- c #11ABB2",
-"I- c #10A0A6",
-"J- c #16BAC1",
-"K- c #17C2C8",
-"L- c #18C5CA",
-"M- c #18C5CB",
-"N- c #16C1C7",
-"O- c #16B9BF",
-"P- c #109FA5",
-"Q- c #0C8286",
-"R- c #12A9AF",
-"S- c #15BDC3",
-"T- c #13B3B9",
-"U- c #0F949A",
-"V- c #10A1A7",
-"W- c #15BAC2",
-"X- c #15B8BF",
-"Y- c #0F9DA3",
-"Z- c #0F9297",
-"`- c #15B7BD",
-" ; c #19C6CC",
-".; c #19C5CA",
-"+; c #17BCC3",
-"@; c #12A6AD",
-"#; c #0C8185",
-"$; c #12A8AF",
-"%; c #17BDC4",
-"&; c #19C5CB",
-"*; c #19C6CD",
-"=; c #19C6CB",
-"-; c #18C5CC",
-";; c #17B6BD",
-">; c #10999F",
-",; c #0F8D92",
-"'; c #15B0B8",
-"); c #18C1C8",
-"!; c #1AC7CC",
-"~; c #18C6CB",
-"{; c #17C0C6",
-"]; c #14AFB6",
-"^; c #0D8388",
-"/; c #14AAAF",
-"(; c #17BFC5",
-"_; c #1AC6CC",
-":; c #19C2C9",
-"<; c #15B4BA",
-"[; c #11979C",
-"}; c #11989D",
-"|; c #17BAC0",
-"1; c #1AC7CD",
-"2; c #19C7CC",
-"3; c #18BBC2",
-"4; c #139FA6",
-"5; c #0E8A90",
-"6; c #16AFB5",
-"7; c #19C1C8",
-"8; c #1BC8CD",
-"9; c #1AC2C9",
-"0; c #15B2B8",
-"a; c #109196",
-"b; c #16B6BD",
-"c; c #1AC5CB",
-"d; c #1AC7CE",
-"e; c #18BFC5",
-"f; c #14AAB1",
-"g; c #0F8C92",
-"h; c #15B0B7",
-"i; c #19C2C8",
-"j; c #1BC7CD",
-"k; c #1AC7CB",
-"l; c #1BC8CE",
-"m; c #16B1B9",
-"n; c #108F94",
-"o; c #139FA4",
-"p; c #1ABFC5",
-"q; c #1CCACF",
-"r; c #1CC9CF",
-"s; c #1CC9CE",
-"t; c #1BC6CB",
-"u; c #19B8BF",
-"v; c #1299A0",
-"w; c #12949A",
-"x; c #18B5BC",
-"y; c #1AC4C9",
-"z; c #1CC8CE",
-"A; c #1BC8CF",
-"B; c #1CC9CD",
-"C; c #1BC7CE",
-"D; c #1AC2C8",
-"E; c #17B0B6",
-"F; c #13A1A7",
-"G; c #19BCC2",
-"H; c #1CC8CD",
-"I; c #1BC9CE",
-"J; c #1CC7CD",
-"K; c #1ABEC4",
-"L; c #14A5AB",
-"M; c #11979D",
-"N; c #18B7BD",
-"O; c #1AC4CA",
-"P; c #1CC8CF",
-"Q; c #1AC1C8",
-"R; c #16AEB4",
-"S; c #15A5AB",
-"T; c #1DC3C9",
-"U; c #1DCBCF",
-"V; c #1ECBD0",
-"W; c #1DCACF",
-"X; c #1CC6CC",
-"Y; c #19B5BB",
-"Z; c #129398",
-"`; c #159EA4",
-" > c #1ABBC1",
-".> c #1DC8CD",
-"+> c #1DCAD0",
-"@> c #1DCBD0",
-"#> c #1ECCD0",
-"$> c #1CC2C7",
-"%> c #17AAB0",
-"&> c #0F8084",
-"*> c #16A9AF",
-"=> c #1CC2C6",
-"-> c #1DC9CE",
-";> c #1ABCC2",
-">> c #14A0A5",
-",> c #14A1A7",
-"'> c #1ABDC3",
-")> c #1DC7CE",
-"!> c #1DCBD1",
-"~> c #1BC1C7",
-"{> c #17ABB1",
-"]> c #1DC6CC",
-"^> c #20CED2",
-"/> c #1FCCD1",
-"(> c #1FCDD1",
-"_> c #1ECCD1",
-":> c #1EC6CB",
-"<> c #1AB2B8",
-"[> c #17A7AD",
-"}> c #1DC1C7",
-"|> c #20CCD1",
-"1> c #1FCDD2",
-"2> c #20CDD2",
-"3> c #1FCED2",
-"4> c #1FCBD0",
-"5> c #1DC0C7",
-"6> c #18A5AB",
-"7> c #128B90",
-"8> c #19B1B8",
-"9> c #1DC5CA",
-"0> c #1EC8CD",
-"a> c #1BBAC0",
-"b> c #15999D",
-"c> c #107F83",
-"d> c #18A9AF",
-"e> c #1CC0C7",
-"f> c #1FCCD2",
-"g> c #1CBEC5",
-"h> c #12A0A5",
-"i> c #016E73",
-"j> c #1AB1B8",
-"k> c #1FCACF",
-"l> c #20CDD0",
-"m> c #1EC3C9",
-"n> c #19ABB2",
-"o> c #12888B",
-"p> c #1AB0B6",
-"q> c #1EC5CB",
-"r> c #20CDD1",
-"s> c #20CBCF",
-"t> c #1CBBC1",
-"u> c #159CA1",
-"v> c #15959B",
-"w> c #1CB8BE",
-"x> c #1FC7CC",
-"y> c #1FC8CD",
-"z> c #1BB5BC",
-"A> c #138F94",
-"B> c #12898F",
-"C> c #19B0B7",
-"D> c #20CACF",
-"E> c #1DBCC2",
-"F> c #12888C",
-"G> c #1CB8BD",
-"H> c #20CCD0",
-"I> c #20CFD3",
-"J> c #21CFD3",
-"K> c #20CED3",
-"L> c #1EC1C6",
-"M> c #18A4A9",
-"N> c #149197",
-"O> c #1BB7BD",
-"P> c #20C9CF",
-"Q> c #1FC9CE",
-"R> c #149499",
-"S> c #17A0A5",
-"T> c #1CBDC3",
-"U> c #20CAD0",
-"V> c #21CFD2",
-"W> c #1FC6CB",
-"X> c #1BAFB6",
-"Y> c #1CB7BD",
-"Z> c #1FCED3",
-"`> c #1FC7CD",
-" , c #1CB6BD",
-"., c #0F8D93",
-"+, c #158F94",
-"@, c #1EBCC3",
-"#, c #22CFD3",
-"$, c #21D1D4",
-"%, c #21D0D4",
-"&, c #21D0D5",
-"*, c #21D1D5",
-"=, c #20CFD4",
-"-, c #22D1D5",
-";, c #22D0D4",
-">, c #21CDD1",
-",, c #1EBFC4",
-"', c #179DA2",
-"), c #189EA2",
-"!, c #1FBEC4",
-"~, c #22D1D4",
-"{, c #20C8CD",
-"], c #1CB4B9",
-"^, c #1AA8AE",
-"/, c #1FC4C9",
-"(, c #21CED2",
-"_, c #1FC5CA",
-":, c #19A9AF",
-"<, c #189FA4",
-"[, c #21CDD2",
-"}, c #22D0D5",
-"|, c #21CFD4",
-"1, c #1BB1B7",
-"2, c #004B4E",
-"3, c #17979D",
-"4, c #20C1C7",
-"5, c #23D2D6",
-"6, c #24D3D5",
-"7, c #23D2D5",
-"8, c #24D3D7",
-"9, c #24D2D6",
-"0, c #23CED2",
-"a, c #1FBAC1",
-"b, c #17969A",
-"c, c #1BA8AD",
-"d, c #21C4C9",
-"e, c #24D3D6",
-"f, c #23D0D4",
-"g, c #21C8CC",
-"h, c #1DAEB5",
-"i, c #15888C",
-"j, c #1DB1B7",
-"k, c #22C9CF",
-"l, c #23D1D5",
-"m, c #23D3D6",
-"n, c #23D0D3",
-"o, c #19A3A8",
-"p, c #1BA9AF",
-"q, c #22C6CB",
-"r, c #23D0D5",
-"s, c #23D3D5",
-"t, c #22C7CC",
-"u, c #13A7AD",
-"v, c #005256",
-"w, c #189EA3",
-"x, c #22C5CA",
-"y, c #25D3D7",
-"z, c #26D4D7",
-"A, c #26D4D8",
-"B, c #25D2D6",
-"C, c #23CCD0",
-"D, c #1EB6BC",
-"E, c #148588",
-"F, c #1DAFB4",
-"G, c #22C8CD",
-"H, c #25D2D5",
-"I, c #26D3D7",
-"J, c #25D3D6",
-"K, c #26D4D6",
-"L, c #25D4D7",
-"M, c #21C6CA",
-"N, c #1BA8AE",
-"O, c #179297",
-"P, c #20B9BE",
-"Q, c #23CDD0",
-"R, c #24CFD3",
-"S, c #20BEC3",
-"T, c #189AA0",
-"U, c #14868B",
-"V, c #1DB2B7",
-"W, c #24D1D5",
-"X, c #1FC2C8",
-"Y, c #21A7AD",
-"Z, c #1CA6AB",
-"`, c #23C9CD",
-" ' c #27D5D8",
-".' c #27D4D8",
-"+' c #26D5D8",
-"@' c #23CBCF",
-"#' c #1EAFB4",
-"$' c #178E93",
-"%' c #1FB7BC",
-"&' c #24CCD0",
-"*' c #27D4D7",
-"=' c #27D5D7",
-"-' c #25D1D5",
-";' c #21C2C7",
-">' c #1BA2A6",
-",' c #1A9DA2",
-"'' c #21BFC4",
-")' c #25D0D5",
-"!' c #25CED1",
-"~' c #20B9BF",
-"{' c #179196",
-"]' c #20B8BD",
-"^' c #24CDD1",
-"/' c #25D0D4",
-"(' c #19BCC1",
-"_' c #10979C",
-":' c #1EACB2",
-"<' c #27CED2",
-"[' c #29D8DA",
-"}' c #29D7DA",
-"|' c #28D7DA",
-"1' c #29D8DB",
-"2' c #29D6D9",
-"3' c #28D4D7",
-"4' c #24C6CB",
-"5' c #1DA9AE",
-"6' c #1A999E",
-"7' c #22BEC3",
-"8' c #27D2D5",
-"9' c #28D6D9",
-"0' c #23BEC4",
-"a' c #1A999D",
-"b' c #1DA7AC",
-"c' c #25C7CA",
-"d' c #28D4D8",
-"e' c #29D7D9",
-"f' c #26CDD0",
-"g' c #1FB5B9",
-"h' c #1B9DA2",
-"i' c #21BFC5",
-"j' c #27D2D6",
-"k' c #28D1D4",
-"l' c #1AB9BE",
-"m' c #026D72",
-"n' c #20B4B9",
-"o' c #28D4D6",
-"p' c #23C3C8",
-"q' c #1CA1A6",
-"r' c #1DA4A8",
-"s' c #25C5CA",
-"t' c #29D4D8",
-"u' c #2AD9DB",
-"v' c #28D8DA",
-"w' c #2AD8DB",
-"x' c #2AD8DA",
-"y' c #26CFD3",
-"z' c #21B7BD",
-"A' c #1FB0B5",
-"B' c #27CCD0",
-"C' c #28D8DB",
-"D' c #28D6D8",
-"E' c #26CACF",
-"F' c #1EADB3",
-"G' c #1EA6AA",
-"H' c #26C6CB",
-"I' c #29D5D8",
-"J' c #27CFD3",
-"K' c #1CAFB4",
-"L' c #168488",
-"M' c #23BABF",
-"N' c #2AD5D8",
-"O' c #2ADADD",
-"P' c #2AD9DC",
-"Q' c #2ADADC",
-"R' c #2ADADB",
-"S' c #2ADBDC",
-"T' c #29D9DA",
-"U' c #29D2D6",
-"V' c #23BFC4",
-"W' c #1B999E",
-"X' c #1FAEB2",
-"Y' c #26CBCF",
-"Z' c #2AD7DB",
-"`' c #29D9DB",
-" ) c #28CDD1",
-".) c #20B1B6",
-"+) c #198F95",
-"@) c #22B9BF",
-"#) c #2AD9DD",
-"$) c #2BDADC",
-"%) c #2AD6D9",
-"&) c #1EA5AB",
-"*) c #20AFB5",
-"=) c #29D8DC",
-"-) c #2ADBDD",
-";) c #2BD8DA",
-">) c #26C8CD",
-",) c #178A8F",
-"') c #25C0C5",
-")) c #2CD9DC",
-"!) c #2CDDDF",
-"~) c #2BDBDD",
-"{) c #2CDBDD",
-"]) c #2BDCDD",
-"^) c #2DDCDE",
-"/) c #2CDCDD",
-"() c #2CDBDE",
-"_) c #2CDDDE",
-":) c #29D2D5",
-"<) c #24BAC0",
-"[) c #188B90",
-"}) c #23B7BD",
-"|) c #2AD0D4",
-"1) c #2CDCDE",
-"2) c #2BDBDC",
-"3) c #2DDCDD",
-"4) c #2CDBDC",
-"5) c #2BD8DB",
-"6) c #28CACF",
-"7) c #21ADB1",
-"8) c #1C9AA0",
-"9) c #26C1C6",
-"0) c #2DDDDD",
-"a) c #2BDADD",
-"b) c #2BD7D9",
-"c) c #26C3C8",
-"d) c #1D9FA4",
-"e) c #198D92",
-"f) c #23B9BD",
-"g) c #2CDDDD",
-"h) c #2BD7D8",
-"i) c #1A9397",
-"j) c #27C6CA",
-"k) c #2EDBDD",
-"l) c #2DDEDF",
-"m) c #2DDDDF",
-"n) c #2EDDDF",
-"o) c #2DDEDE",
-"p) c #2EDEDF",
-"q) c #2DDDDE",
-"r) c #2EDEDE",
-"s) c #2BD1D4",
-"t) c #22B5BA",
-"u) c #1C969B",
-"v) c #27C0C5",
-"w) c #2CD6D8",
-"x) c #2DDBDD",
-"y) c #28C8CC",
-"z) c #1FA4AA",
-"A) c #1FA5AA",
-"B) c #2CD9DB",
-"C) c #2AD4D7",
-"D) c #26C0C4",
-"E) c #1D999D",
-"F) c #26C0C5",
-"G) c #2BD6D9",
-"H) c #2EDDDE",
-"I) c #07575A",
-"J) c #1E9DA0",
-"K) c #29CACE",
-"L) c #2EE0E1",
-"M) c #2EDFE0",
-"N) c #2FDFE0",
-"O) c #2EDEE0",
-"P) c #2EDCDE",
-"Q) c #2ACED2",
-"R) c #22AEB2",
-"S) c #1FA2A6",
-"T) c #29C6CA",
-"U) c #2DD9DC",
-"V) c #2EDFDF",
-"W) c #2CD8DA",
-"X) c #27C3C8",
-"Y) c #1D9CA1",
-"Z) c #23AFB3",
-"`) c #2ACED1",
-" ! c #2FDFDF",
-".! c #2CD4D7",
-"+! c #25B9BD",
-"@! c #1FA3A8",
-"#! c #29C9CC",
-"$! c #2DDADC",
-"%! c #085E62",
-"&! c #21A3A9",
-"*! c #2CCFD2",
-"=! c #2FE0E1",
-"-! c #30E1E1",
-";! c #30E0E1",
-">! c #2AC9CC",
-",! c #22A5AA",
-"'! c #22ABB1",
-")! c #2BCCD0",
-"!! c #2DDBDC",
-"~! c #2DD6D9",
-"{! c #27BEC4",
-"]! c #24B8BD",
-"^! c #2CD3D7",
-"/! c #2FDEE0",
-"(! c #2FDEDF",
-"_! c #2CD1D4",
-":! c #23B2B7",
-"<! c #23AEB2",
-"[! c #0A666B",
-"}! c #23ABB1",
-"|! c #2DD3D5",
-"1! c #2EDADD",
-"2! c #2AC3C8",
-"3! c #25B5BA",
-"4! c #2DD3D4",
-"5! c #30DFE0",
-"6! c #2DD4D6",
-"7! c #26B7BC",
-"8! c #1C959A",
-"9! c #28C1C6",
-"0! c #2ED9DB",
-"a! c #30E1E2",
-"b! c #2FDDDF",
-"c! c #23AAB0",
-"d! c #26B8BD",
-"e! c #0C6E72",
-"f! c #25B4B9",
-"g! c #2ED7D8",
-"h! c #31E3E3",
-"i! c #32E2E3",
-"j! c #31E1E2",
-"k! c #32E2E2",
-"l! c #31E2E2",
-"m! c #32E3E3",
-"n! c #2ED8DA",
-"o! c #29BFC3",
-"p! c #1E9498",
-"q! c #28BFC2",
-"r! c #2FD8DA",
-"s! c #32E3E2",
-"t! c #31E1E1",
-"u! c #31DFE1",
-"v! c #2ED2D4",
-"w! c #24AEB4",
-"x! c #22A3A7",
-"y! c #2BC8CD",
-"z! c #2FDDDE",
-"A! c #31E2E1",
-"B! c #32E1E2",
-"C! c #30DDDE",
-"D! c #2BC8CA",
-"E! c #21A1A6",
-"F! c #1E969A",
-"G! c #29C0C3",
-"H! c #2FD7DA",
-"I! c #32E1E1",
-"J! c #30E2E2",
-"K! c #32E1E3",
-"L! c #12787C",
-"M! c #29BCC0",
-"N! c #31DDDD",
-"O! c #33E5E4",
-"P! c #33E3E3",
-"Q! c #33E4E3",
-"R! c #33E4E4",
-"S! c #2FD6D8",
-"T! c #28B7BC",
-"U! c #219EA2",
-"V! c #2CC7CB",
-"W! c #31DDDE",
-"X! c #34E4E3",
-"Y! c #32E4E3",
-"Z! c #32E0E0",
-"`! c #2CCCCF",
-" ~ c #24A7AC",
-".~ c #24ADB2",
-"+~ c #2ED1D3",
-"@~ c #32E4E4",
-"#~ c #33E3E4",
-"$~ c #33E2E3",
-"%~ c #34E4E4",
-"&~ c #30DBDC",
-"*~ c #2BC2C6",
-"=~ c #22A1A6",
-"-~ c #2CC8CB",
-";~ c #1C868A",
-">~ c #2BC3C6",
-",~ c #34E0E0",
-"'~ c #34E5E5",
-")~ c #34E5E4",
-"!~ c #34E6E5",
-"~~ c #34E6E4",
-"{~ c #35E6E5",
-"]~ c #34E6E6",
-"^~ c #33E2E2",
-"/~ c #2FD4D6",
-"(~ c #26B1B6",
-"_~ c #24A9AE",
-":~ c #2ED0D1",
-"<~ c #34E2E2",
-"[~ c #35E6E6",
-"}~ c #35E5E4",
-"|~ c #32DEDF",
-"1~ c #2DC8CB",
-"2~ c #31D8D9",
-"3~ c #34E5E6",
-"4~ c #35E5E5",
-"5~ c #35E4E3",
-"6~ c #31DADB",
-"7~ c #2ABFC2",
-"8~ c #26ACB0",
-"9~ c #2ECFD2",
-"0~ c #1F8F93",
-"a~ c #34E3E3",
-"b~ c #36E8E7",
-"c~ c #37E8E7",
-"d~ c #37E7E6",
-"e~ c #36E7E6",
-"f~ c #37E7E7",
-"g~ c #36E6E6",
-"h~ c #35E2E3",
-"i~ c #2FD0D2",
-"j~ c #25A9AD",
-"k~ c #28B4B8",
-"l~ c #31D7D9",
-"m~ c #37E5E5",
-"n~ c #36E8E6",
-"o~ c #36E7E5",
-"p~ c #36E7E7",
-"q~ c #33DEDE",
-"r~ c #2CC3C7",
-"s~ c #209397",
-"t~ c #2CC1C4",
-"u~ c #32DDDD",
-"v~ c #35E7E5",
-"w~ c #35E7E6",
-"x~ c #37E8E6",
-"y~ c #36E6E5",
-"z~ c #31D9DB",
-"A~ c #29B7BB",
-"B~ c #29B6BB",
-"C~ c #32D7D9",
-"D~ c #36E5E4",
-"E~ c #21979C",
-"F~ c #2FCDD0",
-"G~ c #36E5E6",
-"H~ c #38E9E8",
-"I~ c #38E8E8",
-"J~ c #38E8E7",
-"K~ c #38E7E7",
-"L~ c #35E1E2",
-"M~ c #2ECBCD",
-"N~ c #2BBFC2",
-"O~ c #33DCDE",
-"P~ c #37E6E6",
-"Q~ c #37E8E8",
-"R~ c #33DBDB",
-"S~ c #2BBCC0",
-"T~ c #239DA2",
-"U~ c #2FC9CC",
-"V~ c #31D4D6",
-"W~ c #27AEB3",
-"X~ c #34DDDE",
-"Y~ c #186467",
-"Z~ c #239EA2",
-"`~ c #32D2D5",
-" { c #39E9E8",
-".{ c #39E8E8",
-"+{ c #35E0E0",
-"@{ c #2EC5C7",
-"#{ c #239B9E",
-"${ c #2EC7CA",
-"%{ c #35E1E1",
-"&{ c #32D7D8",
-"*{ c #2AB5B8",
-"={ c #25A8AC",
-"-{ c #32D0D2",
-";{ c #37E4E4",
-">{ c #2FCFD0",
-",{ c #239CA0",
-"'{ c #2EC9CC",
-"){ c #36E1E1",
-"!{ c #3AEAE8",
-"~{ c #39E9E7",
-"{{ c #239EA1",
-"]{ c #32D2D3",
-"^{ c #39E7E7",
-"/{ c #3AEAE9",
-"({ c #3AE8E7",
-"_{ c #35DDDD",
-":{ c #2CBDC0",
-"<{ c #26A6AA",
-"[{ c #31D0D1",
-"}{ c #37E4E3",
-"|{ c #3AE9E8",
-"1{ c #38E5E4",
-"2{ c #31D3D4",
-"3{ c #27ADB0",
-"4{ c #2AB4B9",
-"5{ c #33D8D9",
-"6{ c #36E2E1",
-"7{ c #2FC8CC",
-"8{ c #27A8AC",
-"9{ c #31D2D4",
-"0{ c #37E5E4",
-"a{ c #0A8084",
-"b{ c #30C7CA",
-"c{ c #38E3E3",
-"d{ c #3BEBE9",
-"e{ c #3BECEA",
-"f{ c #3CECEA",
-"g{ c #34D8D9",
-"h{ c #2AB3B6",
-"i{ c #2AB2B5",
-"j{ c #33D8D8",
-"k{ c #39E7E6",
-"l{ c #37E3E3",
-"m{ c #31CDCF",
-"n{ c #2CBFC2",
-"o{ c #37E0E0",
-"p{ c #3BEAE9",
-"q{ c #36DFDF",
-"r{ c #2DC1C4",
-"s{ c #2AB4B8",
-"t{ c #35D9DA",
-"u{ c #3BEAE8",
-"v{ c #149BA0",
-"w{ c #36D7D7",
-"x{ c #3CE9E7",
-"y{ c #3DEDEB",
-"z{ c #3DECEB",
-"A{ c #3DEDEC",
-"B{ c #3EEEEB",
-"C{ c #3EEDEB",
-"D{ c #3BE9E8",
-"E{ c #34D4D5",
-"F{ c #28ACB0",
-"G{ c #2DBDC0",
-"H{ c #37DEDE",
-"I{ c #3DEAE9",
-"J{ c #3DEEEB",
-"K{ c #3EEDEC",
-"L{ c #39E5E3",
-"M{ c #31C9CA",
-"N{ c #249B9E",
-"O{ c #31CBCD",
-"P{ c #3AE5E4",
-"Q{ c #3DEDEA",
-"R{ c #3CEBE9",
-"S{ c #37DCDC",
-"T{ c #2CBBBD",
-"U{ c #2FBFC2",
-"V{ c #37DFDF",
-"W{ c #14A7AA",
-"X{ c #39DDDC",
-"Y{ c #3DEBEA",
-"Z{ c #3FEEEC",
-"`{ c #3EEEED",
-" ] c #3EEFED",
-".] c #3FEDEC",
-"+] c #3FEFED",
-"@] c #3EEEEC",
-"#] c #3EEDED",
-"$] c #3CE7E6",
-"%] c #33CFD0",
-"&] c #249599",
-"*] c #31C6C8",
-"=] c #3AE4E2",
-"-] c #3FEEED",
-";] c #3FEDED",
-">] c #38E1E0",
-",] c #2FC2C3",
-"'] c #28A6AA",
-")] c #34D2D4",
-"!] c #3DEAE8",
-"~] c #36DADA",
-"{] c #2CB3B6",
-"]] c #23999D",
-"^] c #30C9CA",
-"/] c #3AE4E3",
-"(] c #23B9BB",
-"_] c #39E1E1",
-":] c #3FEEEB",
-"<] c #40EFED",
-"[] c #40F0ED",
-"}] c #40EEED",
-"|] c #3FEFEC",
-"1] c #3BE5E3",
-"2] c #32C9CB",
-"3] c #26A1A5",
-"4] c #33D0D0",
-"5] c #3DE8E7",
-"6] c #40EFEE",
-"7] c #3FF0ED",
-"8] c #40F0EE",
-"9] c #38DDDD",
-"0] c #2CB7BB",
-"a] c #2BB2B6",
-"b] c #37DADA",
-"c] c #3EEBE9",
-"d] c #3DEAE7",
-"e] c #35D5D6",
-"f] c #28A4A7",
-"g] c #35D1D3",
-"h] c #3DE9E7",
-"i] c #0C868C",
-"j] c #33CACB",
-"k] c #3DE7E4",
-"l] c #40EFEC",
-"m] c #41F1ED",
-"n] c #41F0ED",
-"o] c #3AE2E1",
-"p] c #30C1C4",
-"q] c #2BADB0",
-"r] c #37D8D8",
-"s] c #3FECEA",
-"t] c #41F1EE",
-"u] c #3EECEA",
-"v] c #2BAEB3",
-"w] c #2FBDC0",
-"x] c #3AE0E0",
-"y] c #40EDEA",
-"z] c #40F1ED",
-"A] c #3DE8E6",
-"B] c #34CED0",
-"C] c #2BB0B4",
-"D] c #38D9D9",
-"E] c #3FEBE9",
-"F] c #40F0EC",
-"G] c #1E9DA2",
-"H] c #36D2D3",
-"I] c #3FEAE8",
-"J] c #42F0EE",
-"K] c #42F1EE",
-"L] c #43F2EF",
-"M] c #43F1EE",
-"N] c #41EEEC",
-"O] c #3ADEDE",
-"P] c #2FB9BC",
-"Q] c #2FBABD",
-"R] c #3AE0DF",
-"S] c #42F1ED",
-"T] c #3FEBE8",
-"U] c #35D2D2",
-"V] c #32C7C9",
-"W] c #3DE5E4",
-"X] c #41EFEC",
-"Y] c #32C8CA",
-"Z] c #2EBABE",
-"`] c #3BE0DF",
-" ^ c #40EEEC",
-".^ c #25ACAF",
-"+^ c #39DBDA",
-"@^ c #41EEEA",
-"#^ c #40EDEB",
-"$^ c #39D9DA",
-"%^ c #2BAEB1",
-"&^ c #31C4C6",
-"*^ c #3EE5E3",
-"=^ c #42F0ED",
-"-^ c #42F2EE",
-";^ c #43F2EE",
-">^ c #3EE8E6",
-",^ c #28A1A6",
-"'^ c #35CFD1",
-")^ c #3FE9E7",
-"!^ c #43F1EF",
-"~^ c #42F2EF",
-"{^ c #41EFED",
-"]^ c #3CE3E0",
-"^^ c #30BDC0",
-"/^ c #32C6C8",
-"(^ c #3EE7E4",
-"_^ c #30BCBF",
-":^ c #3DE3E1",
-"<^ c #44F1EE",
-"[^ c #45F4F0",
-"}^ c #43F3EF",
-"|^ c #44F4F0",
-"1^ c #44F3F0",
-"2^ c #43F2F0",
-"3^ c #37D4D4",
-"4^ c #279DA1",
-"5^ c #35CECF",
-"6^ c #40EBE7",
-"7^ c #43F3F0",
-"8^ c #3DE5E2",
-"9^ c #32C3C5",
-"0^ c #2BADB1",
-"a^ c #3AD9D9",
-"b^ c #42EFEC",
-"c^ c #44F3EF",
-"d^ c #3ADDDC",
-"e^ c #2EB4B7",
-"f^ c #27A0A4",
-"g^ c #36D2D1",
-"h^ c #41ECE9",
-"i^ c #44F2EF",
-"j^ c #45F3F0",
-"k^ c #34C8CA",
-"l^ c #40E8E6",
-"m^ c #46F5F0",
-"n^ c #47F6F1",
-"o^ c #46F5F1",
-"p^ c #47F5F1",
-"q^ c #45F5F0",
-"r^ c #45F5F1",
-"s^ c #45F4F1",
-"t^ c #46F4F1",
-"u^ c #41EBE8",
-"v^ c #36CCCD",
-"w^ c #2BAAAD",
-"x^ c #3BD9D8",
-"y^ c #44EFEC",
-"z^ c #3EE3E1",
-"A^ c #30BBBD",
-"B^ c #30BABD",
-"C^ c #3EE3E2",
-"D^ c #46F3F0",
-"E^ c #47F5F0",
-"F^ c #46F4F0",
-"G^ c #39D8D8",
-"H^ c #2CADB0",
-"I^ c #3AD9DA",
-"J^ c #43F0EC",
-"K^ c #2AA1A4",
-"L^ c #38D1D2",
-"M^ c #42EDE9",
-"N^ c #47F5F2",
-"O^ c #47F6F2",
-"P^ c #48F5F1",
-"Q^ c #40E7E5",
-"R^ c #34C4C6",
-"S^ c #30B6B9",
-"T^ c #3DDFDD",
-"U^ c #44F1ED",
-"V^ c #48F5F2",
-"W^ c #45F2EE",
-"X^ c #3CDEDC",
-"Y^ c #2EB1B5",
-"Z^ c #34C4C7",
-"`^ c #40E8E5",
-" / c #48F6F2",
-"./ c #48F6F1",
-"+/ c #43EDEA",
-"@/ c #30B8BC",
-"#/ c #3EE1E0",
-"$/ c #44F2EE",
-"%/ c #46F5F2",
-"&/ c #3BDBDA",
-"*/ c #45F1ED",
-"=/ c #49F7F2",
-"-/ c #4AF7F2",
-";/ c #49F7F1",
-">/ c #49F6F2",
-",/ c #46F3EF",
-"'/ c #3FE2E0",
-")/ c #31BBBD",
-"!/ c #33C1C3",
-"~/ c #3FE5E2",
-"{/ c #47F3EF",
-"]/ c #45F2EC",
-"^/ c #3AD6D7",
-"// c #38CECF",
-"(/ c #43EDE9",
-"_/ c #49F6F1",
-":/ c #49F7F3",
-"</ c #48F7F2",
-"[/ c #47F4F1",
-"}/ c #42EAE6",
-"|/ c #36C9CA",
-"1/ c #33C2C4",
-"2/ c #40E7E3",
-"3/ c #47F3F0",
-"4/ c #32B9BD",
-"5/ c #40E3E1",
-"6/ c #47F4EF",
-"7/ c #4CF8F3",
-"8/ c #4BF8F3",
-"9/ c #4BF7F2",
-"0/ c #4DF8F3",
-"a/ c #49F6F3",
-"b/ c #4BF7F3",
-"c/ c #4BF8F2",
-"d/ c #46F1ED",
-"e/ c #3EDDDC",
-"f/ c #2FB1B3",
-"g/ c #36CACC",
-"h/ c #44EDE9",
-"i/ c #4CF7F2",
-"j/ c #45EEEB",
-"k/ c #38CFCF",
-"l/ c #2CA9AB",
-"m/ c #3AD9D7",
-"n/ c #46F1EC",
-"o/ c #4CF7F3",
-"p/ c #49F6F0",
-"q/ c #42E7E4",
-"r/ c #34C2C3",
-"s/ c #38CCCD",
-"t/ c #4AF6F1",
-"u/ c #36C5C6",
-"v/ c #42E9E5",
-"w/ c #4FF8F3",
-"x/ c #50F8F4",
-"y/ c #4FF8F4",
-"z/ c #4EF8F3",
-"A/ c #4DF7F4",
-"B/ c #47F1ED",
-"C/ c #3AD7D6",
-"D/ c #2CA3A6",
-"E/ c #3BD6D5",
-"F/ c #45F1EC",
-"G/ c #4DF7F3",
-"H/ c #4EF8F4",
-"I/ c #50F9F4",
-"J/ c #4CF6F2",
-"K/ c #43E9E5",
-"L/ c #35C5C7",
-"M/ c #30B5B7",
-"N/ c #3FE0DF",
-"O/ c #49F4F0",
-"P/ c #4BF5F0",
-"Q/ c #40E2DF",
-"R/ c #30B7B9",
-"S/ c #2CA6A9",
-"T/ c #4DF8F2",
-"U/ c #39CFCF",
-"V/ c #46EFEA",
-"W/ c #4EF7F2",
-"X/ c #52F9F5",
-"Y/ c #52F8F4",
-"Z/ c #53F9F5",
-"`/ c #51F8F4",
-" ( c #51F9F5",
-".( c #50F8F3",
-"+( c #3AD0D0",
-"@( c #2FB2B3",
-"#( c #3FDFDD",
-"$( c #49F4EF",
-"%( c #52F9F4",
-"&( c #51F8F5",
-"*( c #4CF6F1",
-"=( c #33BEBF",
-"-( c #34C0C2",
-";( c #42E8E4",
-">( c #4DF6F2",
-",( c #50F9F3",
-"'( c #49F3EF",
-")( c #3CDBDA",
-"!( c #30B3B6",
-"~( c #40E1E0",
-"{( c #2DA9AC",
-"]( c #3EDAD8",
-"^( c #4BF3EE",
-"/( c #54FBF5",
-"(( c #54FAF5",
-"_( c #55FAF5",
-":( c #53FAF5",
-"<( c #54F9F5",
-"[( c #56FAF5",
-"}( c #55F9F5",
-"|( c #45ECE8",
-"1( c #37C8C9",
-"2( c #33BDC0",
-"3( c #43E7E3",
-"4( c #4EF6F2",
-"5( c #4CF5F1",
-"6( c #40E1DD",
-"7( c #38CBCC",
-"8( c #46EEE9",
-"9( c #56FBF5",
-"0( c #55FAF6",
-"a( c #47F1EE",
-"b( c #3BD5D5",
-"c( c #35C0C2",
-"d( c #44E8E6",
-"e( c #4FF7F2",
-"f( c #32B4B6",
-"g( c #41E2DF",
-"h( c #50F7F2",
-"i( c #58FBF6",
-"j( c #56FBF6",
-"k( c #58FAF5",
-"l( c #57FBF6",
-"m( c #56F9F5",
-"n( c #57FAF5",
-"o( c #56FAF6",
-"p( c #58FBF5",
-"q( c #52F7F3",
-"r( c #44E7E4",
-"s( c #34BEBF",
-"t( c #38C9CA",
-"u( c #45EDE8",
-"v( c #53F9F3",
-"w( c #57FAF6",
-"x( c #58FAF6",
-"y( c #57FBF5",
-"z( c #4CF3EE",
-"A( c #3EDAD9",
-"B( c #3CD6D4",
-"C( c #53F9F4",
-"D( c #48EFEA",
-"E( c #39CECE",
-"F( c #39CCCD",
-"G( c #47EFEA",
-"H( c #35C0C1",
-"I( c #46E9E5",
-"J( c #53F8F3",
-"K( c #59FBF5",
-"L( c #59FBF6",
-"M( c #5AFBF6",
-"N( c #5AFBF7",
-"O( c #5BFCF7",
-"P( c #5BFBF6",
-"Q( c #58FBF7",
-"R( c #52F8F2",
-"S( c #40E1DF",
-"T( c #3CD4D2",
-"U( c #4DF1ED",
-"V( c #5AFCF7",
-"W( c #59FBF7",
-"X( c #59FCF7",
-"Y( c #59FAF5",
-"Z( c #4DF2ED",
-"`( c #3BD3D2",
-" _ c #30AFB2",
-"._ c #40DFDD",
-"+_ c #51F6F1",
-"@_ c #5BFBF7",
-"#_ c #55F9F4",
-"$_ c #46EBE7",
-"%_ c #36C3C5",
-"&_ c #3CD5D4",
-"*_ c #4EF3EF",
-"=_ c #39CDCC",
-"-_ c #4AEFEB",
-";_ c #5DFCF8",
-">_ c #5CFCF7",
-",_ c #5EFCF8",
-"'_ c #5CFCF8",
-")_ c #5FFCF8",
-"!_ c #60FDF8",
-"~_ c #4FF4F0",
-"{_ c #3FDBD9",
-"]_ c #2FAAAE",
-"^_ c #3FDCDA",
-"/_ c #4FF4EF",
-"(_ c #5EFCF7",
-"__ c #5EFDF8",
-":_ c #4BEFEA",
-"<_ c #39CBCC",
-"[_ c #34BCBE",
-"}_ c #45E8E4",
-"|_ c #56F9F4",
-"1_ c #5DFCF7",
-"2_ c #5DFDF7",
-"3_ c #54F9F3",
-"4_ c #45E5E1",
-"5_ c #34BABB",
-"6_ c #30AEB0",
-"7_ c #41DFDD",
-"8_ c #51F5F1",
-"9_ c #3ED7D6",
-"0_ c #50F4EF",
-"a_ c #5CFBF7",
-"b_ c #61FDF8",
-"c_ c #62FDF8",
-"d_ c #5FFDF8",
-"e_ c #60FCF8",
-"f_ c #4CF1EC",
-"g_ c #3BD2D1",
-"h_ c #33B7B9",
-"i_ c #56F8F4",
-"j_ c #5BFAF5",
-"k_ c #48EAE6",
-"l_ c #35BFC1",
-"m_ c #39C9C9",
-"n_ c #49EDEA",
-"o_ c #5CFAF5",
-"p_ c #61FCF8",
-"q_ c #5CFBF6",
-"r_ c #54F7F2",
-"s_ c #42DFDD",
-"t_ c #32B9BA",
-"u_ c #45E5E2",
-"v_ c #58F9F4",
-"w_ c #31AFB1",
-"x_ c #43E1DF",
-"y_ c #55F8F3",
-"z_ c #64FDF8",
-"A_ c #62FEF8",
-"B_ c #63FEF9",
-"C_ c #63FEF8",
-"D_ c #63FDF9",
-"E_ c #63FDF8",
-"F_ c #64FEF9",
-"G_ c #5CFBF5",
-"H_ c #4CEFEA",
-"I_ c #3ACAC9",
-"J_ c #37C3C4",
-"K_ c #48EBE7",
-"L_ c #5BFAF6",
-"M_ c #62FDF9",
-"N_ c #62FEF9",
-"O_ c #57F9F4",
-"P_ c #44E3E1",
-"Q_ c #4FF3EE",
-"R_ c #5EFBF6",
-"S_ c #64FEF8",
-"T_ c #53F5F0",
-"U_ c #3FD8D6",
-"V_ c #34C3C3",
-"W_ c #4AEEE9",
-"X_ c #5FFCF6",
-"Y_ c #35BCBD",
-"Z_ c #47E8E5",
-"`_ c #5DFAF4",
-" : c #68FEF9",
-".: c #66FEF9",
-"+: c #65FEF9",
-"@: c #67FEF9",
-"#: c #65FDF9",
-"$: c #65FEF8",
-"%: c #66FEF8",
-"&: c #63FCF8",
-"*: c #69FEF9",
-"=: c #64FDF9",
-"-: c #5FFBF5",
-";: c #48EAE5",
-">: c #36C0C0",
-",: c #3BD0CF",
-"': c #51F2EE",
-"): c #62FCF7",
-"!: c #68FEF8",
-"~: c #65FDF8",
-"{: c #57F7F2",
-"]: c #30A9AD",
-"^: c #41DEDB",
-"/: c #59F7F1",
-"(: c #62FCF8",
-"_: c #66FDF9",
-":: c #66FDF8",
-"<: c #62FBF6",
-"[: c #4EF1ED",
-"}: c #38CECE",
-"|: c #53F3ED",
-"1: c #64FCF7",
-"2: c #3BC9C8",
-"3: c #55EFEA",
-"4: c #6BFCF7",
-"5: c #76FFFA",
-"6: c #72FFFA",
-"7: c #6BFEF9",
-"8: c #72FEF9",
-"9: c #74FFFA",
-"0: c #6EFEF9",
-"a: c #6BFFFA",
-"b: c #6DFEFA",
-"c: c #70FFF9",
-"d: c #70FFFA",
-"e: c #6CFEF9",
-"f: c #71FEFA",
-"g: c #74FEFA",
-"h: c #6EFFFA",
-"i: c #75FEF9",
-"j: c #73FFFA",
-"k: c #74FFF9",
-"l: c #63FAF5",
-"m: c #48E5E2",
-"n: c #46DCDA",
-"o: c #5FF7F2",
-"p: c #6AFEF9",
-"q: c #71FFFA",
-"r: c #6FFEF9",
-"s: c #6CFFF9",
-"t: c #6EFFF9",
-"u: c #71FEF9",
-"v: c #70FEF9",
-"w: c #6DFFF9",
-"x: c #70FEFA",
-"y: c #6CFFFA",
-"z: c #6AFEFA",
-"A: c #6EFDF8",
-"B: c #5DF5EF",
-"C: c #42D6D3",
-"D: c #35B7B9",
-"E: c #4EE7E2",
-"F: c #60F9F4",
-"G: c #76FEFA",
-"H: c #72FEFA",
-"I: c #6FFEFA",
-"J: c #6DFEF9",
-"K: c #6FFFFA",
-"L: c #68FDF6",
-"M: c #53EEEA",
-"N: c #39C6C6",
-"O: c #1D9A9D",
-"P: c #48DFDB",
-"Q: c #64F9F3",
-"R: c #41D4D1",
-"S: c #66F3EE",
-"T: c #77FEF8",
-"U: c #79FFFA",
-"V: c #78FFFA",
-"W: c #77FFFA",
-"X: c #77FFF9",
-"Y: c #7AFFFA",
-"Z: c #75FFFA",
-"`: c #76FEF9",
-" < c #78FEF9",
-".< c #6AF8F2",
-"+< c #4BDEDB",
-"@< c #35B3B4",
-"#< c #50E4E0",
-"$< c #6CFAF4",
-"%< c #75FEFA",
-"&< c #77FEF9",
-"*< c #76FEF8",
-"=< c #5FF1EB",
-"-< c #3DCDCB",
-";< c #3CC5C4",
-">< c #5AEDE8",
-",< c #75FCF6",
-"'< c #7BFFFA",
-")< c #78FFF9",
-"!< c #6FFCF6",
-"~< c #56EAE5",
-"{< c #20A6A7",
-"]< c #57E9E4",
-"^< c #33AAAB",
-"/< c #4CDDD9",
-"(< c #6BF7F1",
-"_< c #73FEF9",
-":< c #7CFFFA",
-"<< c #7EFFFA",
-"[< c #7DFFFA",
-"}< c #7DFEF8",
-"|< c #6BF5EF",
-"1< c #47D6D3",
-"2< c #3ABFBE",
-"3< c #5EEBE5",
-"4< c #78FCF5",
-"5< c #7AFEF9",
-"6< c #74FCF5",
-"7< c #5BECE7",
-"8< c #39C2C1",
-"9< c #45CFCC",
-"0< c #5EF1EC",
-"a< c #7FFFFA",
-"b< c #76FFF9",
-"c< c #72FAF4",
-"d< c #52E4DE",
-"e< c #28B9B8",
-"f< c #3AB6B4",
-"g< c #5EE6E0",
-"h< c #7CFAF4",
-"i< c #82FEF9",
-"j< c #84FFFA",
-"k< c #81FFFA",
-"l< c #85FFFA",
-"m< c #82FFFA",
-"n< c #83FFFA",
-"o< c #80FFFA",
-"p< c #83FEF9",
-"q< c #6BF1EB",
-"r< c #44CCCA",
-"s< c #42CCC9",
-"t< c #68EFEA",
-"u< c #80FDF7",
-"v< c #82FFF9",
-"w< c #7AFAF4",
-"x< c #61E7E2",
-"y< c #50DAD6",
-"z< c #78F7F1",
-"A< c #81FEF9",
-"B< c #81FFF9",
-"C< c #76F7F2",
-"D< c #53DCD8",
-"E< c #45C4C2",
-"F< c #6AEDE8",
-"G< c #86FCF7",
-"H< c #8DFFFA",
-"I< c #87FFFA",
-"J< c #8BFFFA",
-"K< c #88FFFA",
-"L< c #8AFFFA",
-"M< c #89FFFA",
-"N< c #8CFFFA",
-"O< c #83FCF6",
-"P< c #70ECE6",
-"Q< c #44C2C0",
-"R< c #55D6D2",
-"S< c #7CF4EF",
-"T< c #8AFDF9",
-"U< c #8FFFFA",
-"V< c #8CFEF9",
-"W< c #80F9F4",
-"X< c #59E0DC",
-"Y< c #3BB1B1",
-"Z< c #5FE3DE",
-"`< c #84FAF5",
-" [ c #86FFFA",
-".[ c #8EFFFA",
-"+[ c #8AFFFB",
-"@[ c #87FEF8",
-"#[ c #76F3ED",
-"$[ c #4BD1CE",
-"%[ c #4FD0CD",
-"&[ c #75F3ED",
-"*[ c #84FEF9",
-"=[ c #86FAF4",
-"-[ c #61E5DF",
-";[ c #3AACAB",
-">[ c #59E0DB",
-",[ c #7FF8F2",
-"'[ c #85FEF9",
-")[ c #7CF6F0",
-"![ c #56D8D4",
-"~[ c #44BEBD",
-"{[ c #69EBE5",
-"][ c #85FCF6",
-"^[ c #87FFFB",
-"/[ c #7FFCF8",
-"([ c #74EEE8",
-"_[ c #44C6C5",
-":[ c #57DAD6",
-"<[ c #83F6F1",
-"[[ c #88FEF9",
-"}[ c #90FFFA",
-"|[ c #94FFFA",
-"1[ c #92FFFB",
-"2[ c #91FFFA",
-"3[ c #83F7F1",
-"4[ c #59DED9",
-"5[ c #41B9B8",
-"6[ c #70E8E2",
-"7[ c #88FBF5",
-"8[ c #93FFFA",
-"9[ c #92FFFA",
-"0[ c #8EFEF8",
-"a[ c #74F1EC",
-"b[ c #4CCEC9",
-"c[ c #47CCC8",
-"d[ c #79F1EB",
-"e[ c #8DFDF8",
-"f[ c #90FFFB",
-"g[ c #86FFF9",
-"h[ c #87FBF5",
-"i[ c #6BE9E4",
-"j[ c #40B1AF",
-"k[ c #71E4DE",
-"l[ c #8EFAF4",
-"m[ c #98FFFA",
-"n[ c #96FFFA",
-"o[ c #98FFFB",
-"p[ c #95FFFA",
-"q[ c #9AFFFA",
-"r[ c #97FFFA",
-"s[ c #99FFFB",
-"t[ c #96FFFB",
-"u[ c #95FFFB",
-"v[ c #96FEF8",
-"w[ c #8AF5EF",
-"x[ c #5DD7D2",
-"y[ c #4EC6C2",
-"z[ c #80EFE8",
-"A[ c #95FEF8",
-"B[ c #97FFFB",
-"C[ c #99FFFA",
-"D[ c #9AFFFB",
-"E[ c #92FDF8",
-"F[ c #7EEDE7",
-"G[ c #4BC2C0",
-"H[ c #61D7D1",
-"I[ c #83F6EF",
-"J[ c #91FEF8",
-"K[ c #94FFFB",
-"L[ c #91FAF4",
-"M[ c #72E5DF",
-"N[ c #4CBEBC",
-"O[ c #7BEAE3",
-"P[ c #94FCF6",
-"Q[ c #9CFFFA",
-"R[ c #9CFFFB",
-"S[ c #9BFFFB",
-"T[ c #9EFFFB",
-"U[ c #9EFFFA",
-"V[ c #9DFFFB",
-"W[ c #9BFFFA",
-"X[ c #93FDF7",
-"Y[ c #86F2EB",
-"Z[ c #5BCFCB",
-"`[ c #60D3CE",
-" } c #86F4ED",
-".} c #94FFF9",
-"+} c #98FBF5",
-"@} c #75E7E1",
-"#} c #6BDFD9",
-"$} c #90F7F2",
-"%} c #9BFEFA",
-"&} c #9FFFFB",
-"*} c #90F7F1",
-"=} c #68DDD7",
-"-} c #57C9C4",
-";} c #88F0E9",
-">} c #9AFDF7",
-",} c #9FFFFA",
-"'} c #A0FFFB",
-")} c #A1FFFB",
-"!} c #9BFDF8",
-"~} c #85EEE8",
-"{} c #66DCD7",
-"]} c #90F8F1",
-"^} c #95F9F2",
-"/} c #73E1DC",
-"(} c #48B8B5",
-"_} c #7EE6E0",
-":} c #97FBF5",
-"<} c #9FFEFA",
-"[} c #A0FFFA",
-"}} c #9DFFFA",
-"|} c #9DFEF9",
-"1} c #8FF5EF",
-"2} c #63D4CE",
-"3} c #61D3CE",
-"4} c #91F3ED",
-"5} c #9EFDF8",
-"6} c #A1FFFA",
-"7} c #A3FFFB",
-"8} c #A4FFFB",
-"9} c #A2FFFB",
-"0} c #A3FFFA",
-"a} c #A2FFFA",
-"b} c #9BFBF6",
-"c} c #80E8E2",
-"d} c #46B2B0",
-"e} c #79E5DE",
-"f} c #99FAF4",
-"g} c #A0FEFA",
-"h} c #9FFEF9",
-"i} c #93F6EF",
-"j} c #69D9D3",
-"k} c #55C5C0",
-"l} c #85EDE6",
-"m} c #9AFCF6",
-"n} c #9CFEF8",
-"o} c #57C9C5",
-"p} c #76DDD7",
-"q} c #9CF8F3",
-"r} c #A8FFFB",
-"s} c #A7FFFB",
-"t} c #A6FFFB",
-"u} c #A5FFFB",
-"v} c #A9FFFB",
-"w} c #A7FFFA",
-"x} c #9BF9F3",
-"y} c #77DFD9",
-"z} c #55C0BB",
-"A} c #8AEBE4",
-"B} c #A1FCF6",
-"C} c #A6FFFA",
-"D} c #A4FFFA",
-"E} c #A2FDF8",
-"F} c #91F2EB",
-"G} c #67D0C9",
-"H} c #63CFC9",
-"I} c #94F2EB",
-"J} c #A4FEF9",
-"K} c #97FCF6",
-"L} c #88EAE2",
-"M} c #4AB6B2",
-"N} c #87E7E1",
-"O} c #A1FCF5",
-"P} c #ABFFFC",
-"Q} c #ABFFFB",
-"R} c #AAFFFB",
-"S} c #ACFFFC",
-"T} c #AAFFFC",
-"U} c #A9FFFC",
-"V} c #A4FFF9",
-"W} c #94F5EF",
-"X} c #6FD6D0",
-"Y} c #64CDC7",
-"Z} c #93F1EA",
-"`} c #A2FEF8",
-" | c #ADFFFC",
-".| c #ACFFFB",
-"+| c #A7FDF7",
-"@| c #8EEDE7",
-"#| c #5FC5BF",
-"$| c #74DAD4",
-"%| c #9EF8F1",
-"&| c #A8FFFC",
-"*| c #9FFAF4",
-"=| c #84E2DC",
-"-| c #5EC3BF",
-";| c #94EEE8",
-">| c #A9FEF7",
-",| c #ADFFFB",
-"'| c #AEFFFB",
-")| c #AEFFFC",
-"!| c #A9FDF9",
-"~| c #9AF1EA",
-"{| c #67CEC8",
-"]| c #73D6D0",
-"^| c #9DF5EF",
-"/| c #A9FFFA",
-"(| c #A6FCF6",
-"_| c #89E8E1",
-":| c #80E4DD",
-"<| c #A0FAF3",
-"[| c #AAFFFA",
-"}| c #9DF7F1",
-"|| c #7FDCD5",
-"1| c #6DCFCA",
-"2| c #9DF3EC",
-"3| c #ABFDF8",
-"4| c #B0FFFC",
-"5| c #AFFFFB",
-"6| c #B1FFFB",
-"7| c #AFFFFC",
-"8| c #B2FFFC",
-"9| c #B1FFFC",
-"0| c #AAFCF7",
-"a| c #95ECE6",
-"b| c #88DFD8",
-"c| c #A4F9F2",
-"d| c #AEFFFA",
-"e| c #B0FFFB",
-"f| c #B2FFFB",
-"g| c #A6F9F3",
-"h| c #80E1DA",
-"i| c #58BEB8",
-"j| c #91EBE3",
-"k| c #ACFFFA",
-"l| c #9CF4ED",
-"m| c #75D3CD",
-"n| c #77D9D3",
-"o| c #A1F6EF",
-"p| c #ACFEF9",
-"q| c #B3FFFC",
-"r| c #B4FFFC",
-"s| c #A8FBF5",
-"t| c #8EE7E1",
-"u| c #59B7B3",
-"v| c #90E6E0",
-"w| c #A9FCF6",
-"x| c #ABFFFA",
-"y| c #A7F7F0",
-"z| c #78D8D1",
-"A| c #6FC9C3",
-"B| c #97F1EA",
-"C| c #A9FDF7",
-"D| c #B3FEFC",
-"E| c #B3FFFB",
-"F| c #A9FEF8",
-"G| c #98F0E9",
-"H| c #66CAC5",
-"I| c #8BE1DB",
-"J| c #A8FAF3",
-"K| c #B6FEFA",
-"L| c #B4FFFB",
-"M| c #B5FFFC",
-"N| c #B5FFFB",
-"O| c #B6FFFC",
-"P| c #B9FFFC",
-"Q| c #B7FFFC",
-"R| c #B2FEFA",
-"S| c #AAF9F3",
-"T| c #8AE0DA",
-"U| c #65C5BF",
-"V| c #9CEFE6",
-"W| c #B0FDF7",
-"X| c #B3FEFA",
-"Y| c #A2F2EB",
-"Z| c #74CEC7",
-"`| c #79D4CD",
-" 1 c #A0F4ED",
-".1 c #B2FDF9",
-"+1 c #B8FFFC",
-"@1 c #AFFCF6",
-"#1 c #96EBE4",
-"$1 c #60BAB6",
-"%1 c #93E8E1",
-"&1 c #AEFBF5",
-"*1 c #B5FEFA",
-"=1 c #A3F6EF",
-"-1 c #7AD7D1",
-";1 c #73CFC9",
-">1 c #A2F3EC",
-",1 c #B4FEF8",
-"'1 c #AFFCF7",
-")1 c #9BECE5",
-"!1 c #88DED5",
-"~1 c #A3F7F0",
-"{1 c #B2FEF9",
-"]1 c #A9FAF4",
-"^1 c #8FE4DD",
-"/1 c #6DC6C0",
-"(1 c #9FEEE7",
-"_1 c #B2FDF7",
-":1 c #BAFFFC",
-"<1 c #B9FFFB",
-"[1 c #B6FEF9",
-"}1 c #A6F1E9",
-"|1 c #74CDC7",
-"11 c #85DAD3",
-"21 c #ACF7F0",
-"31 c #B7FEFA",
-"41 c #B6FFFB",
-"51 c #B1FAF4",
-"61 c #95E6DF",
-"71 c #61B6B2",
-"81 c #94E5DE",
-"91 c #AFFBF4",
-"01 c #B4FEFA",
-"a1 c #A8F8F1",
-"b1 c #86DCD4",
-"c1 c #7FD3CC",
-"d1 c #A9F2EC",
-"e1 c #BCFFFC",
-"f1 c #BBFFFC",
-"g1 c #B8FFFB",
-"h1 c #B6FCF6",
-"i1 c #9FEBE4",
-"j1 c #8FE3DB",
-"k1 c #B1FAF3",
-"l1 c #BAFEFA",
-"m1 c #BDFFFC",
-"n1 c #AFF8F2",
-"o1 c #91E0D8",
-"p1 c #6FC3BB",
-"q1 c #A0ECE5",
-"r1 c #B7FDF7",
-"s1 c #BAFFFB",
-"t1 c #B8FFF9",
-"u1 c #AAF4EC",
-"v1 c #80D2CB",
-"w1 c #89D6CF",
-"x1 c #ACF4ED",
-"y1 c #BCFEFA",
-"z1 c #BEFFFC",
-"A1 c #BFFFFC",
-"B1 c #BEFFFB",
-"C1 c #B8FBF6",
-"D1 c #9EE7E0",
-"E1 c #64B7B1",
-"F1 c #9AE5DE",
-"G1 c #B5FAF3",
-"H1 c #BBFFFA",
-"I1 c #B9FEFA",
-"J1 c #AFF7F0",
-"K1 c #8DDAD3",
-"L1 c #77C8C1",
-"M1 c #A6EFE8",
-"N1 c #B6FCF7",
-"O1 c #BBFDF9",
-"P1 c #A8F0E9",
-"Q1 c #7CCDC5",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" . ",
-" + @ ",
-" # $ % ",
-" & * = ",
-" - ; > , ",
-" ' ) ! ~ { * ",
-" ] ^ / ( _ : < ",
-" [ } > | | ~ 1 2 ",
-" @ 3 _ | | | 4 ; ",
-" 5 , 4 | | | 6 7 8 ",
-" 9 ; 0 a a a a a ( , ",
-" b c 6 a a a a a 6 d * ",
-" e { a f f f f f g h { i j [ k 5 5 @ l ",
-" m n o a g g g f f f f 6 : 5 < p q r s t u % v w k x [ ",
-" y z ( A B C A A A A A D 6 / E d | | F ~ G d : c H , p z I t % J K L x ",
-" @ = | C A A A A A A A A D 6 1 1 M N C D g D f f h 6 O 4 _ o G / 1 P = * Q < $ R w k 5 @ ",
-" 5 8 S A A T A A T T A A A A ( U e : S C A A T A A T V T V A g g B a 6 | W ( ~ d X ! 1 Y Z * t ",
-" ` 1 B .T T ..T T T .T T ..C ~ I o D ..T ....+.V +.T T T .....@...T T A A #.A D B f h $.d p ",
-" % > %.&.@. .*. . .@.=. . .*.-.;.>. ,.0 +.*.*.*.*...*.@. . .*.*.@.*.*. .*. .*.&.&.@.*. .@...#.( '. ",
-" ).>.+.*.*.*.*.*.*.*.*.*.*.*.*.-.!.~. {.6 +.*.*.*.*.&.].*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.C ^. ",
-" < O @././././.(.(._./.(./.(.(./.].:./ { D ].(./.(./.(./.(.(./.(./.(.(.(.(./.(._.(.(.(.(.(./.].C <. ",
-" Q 6 [./././.(./.(././.(.(./.(./.(.[.h 1 z ~ T ]././.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(.(.(.(.(.(.].B : }. ",
-" |.Z f (._.1.1._.2._.2.1._.1.1._.1._._.@.6 U 6 @.1.1.1.1.2._.1._._.1.1.1.1.1._.1._._._.2.1.1.1.1.1.&.f 3. y - I z ^ $ $ J w ",
-" 4.5.C 2.1.2.6._.1.2._.1.1._.6.2.2.2._.1.7.~ ; f (.6.2._.2._.1.1.8.2.6.1.2.2.1.6.1.6.6.2.1.6._.2.2.1.].9.P e / $.h ( o G 3.8 P p Q I t % 9 & ",
-" ` : @.0.a.a.0.2.a.a.2.b.6.b.0.0.b.a.2.a.a.+.4 { T a.a.2.0.c.a.d.6.0.0.b.a.6.d.a.6.a.0.d.a.0.b.6.0.6.b.].| ; g (.(.[.e.@.+.T D f.h W g.{ ! P 8 = Q i e h.w i. ",
-" - j.].k.l.a.0.k.k.k.0.k.a.a.a.k.a.0.k.k.m.b...d 4 ].a.m.k.0.m.k.a.a.m.0.a.0.k.k.0.a.a.k.a.a.k.m.m.0.k.k.&.( d T 6.m.a.k.a.6.0.6.6././.e. .7.T n.a O ^.d X : 1 ,.3 n $ R ",
-" $ ( _.m.k.k.a.m.k.k.m.k.m.k.k.k.m.k.m.0.m.k.6.A ! = a 1.k.k.k.m.m.k.k.m.m.k.m.0.k.m.k.a.m.k.0.k.k.m.k.m.m.0.o.j. _ ].k.0.m.k.0.m.k.p.k.m.m.k.k.k.a.6.6._.(.].*...A D h O _ 3. ",
-" I h q.r.s.r.t.k.r.r.m.m.u.m.u.u.r.m.m.m.u.s.u.b.D ; D 1.r.m.u.t.m.r.u.u.v.k.k.r.r.r.r.m.u.u.m.k.u.m.k.r.r.k. .> U h (.k.r.m.u.m.m.u.m.k.r.m.r.u.r.s.u.t.u.k.m.m.m.0.0.2.8...d ",
-" Q B q.t.t.r.u.u.u.u.t.u.u.t.r.r.t.r.u.u.u.u.t.u.2.f. { .m.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.r.r.u.u.u.r.w.#. 1 C 0.u.t.r.u.r.u.t.r.u.u.u.u.r.u.u.u.u.t.u.u.u.u.u.u.u.q. .{ ",
-" P C s.u.v.t.r.t.t.t.u.u.u.u.u.u.t.r.u.u.u.u.r.u.r.x.( ^.x.m.t.u.t.u.u.u.t.u.r.t.u.t.u.r.t.u.t.u.u.u.t.r.u.u.s.c.f > .m.t.t.u.r.u.u.u.u.u.u.u.r.t.u.r.u.u.u.u.t.t.u.u.u.t.0.#. ",
-" k ! ..y.t.t.z.t.A.t.A.z.B.t.t.t.t.t.t.t.t.z.t.C.t.B.t.].~ f.b.D.B.t.t.t.t.B.t.t.z.t.A.t.t.E.B.A.B.z.t.z.t.t.t.B.t.8.0 ~ (.v.z.u.B.z.B.z.z.t.z.t.t.t.t.t.t.t.t.t.A.A.B.u.z.z.F.0.n. ",
-" ` d 8.z.G.G.H.G.A.z.G.E.A.H.z.z.H.H.G.z.z.H.G.G.G.H.G.v...{ H V 0.I.H.z.H.H.H.z.z.E.G.G.z.G.G.H.A.z.H.G.A.H.G.z.H.H.A._.~ f.0.z.B.H.H.H.z.E.G.z.H.H.z.H.G.H.z.z.G.G.H.A.G.H.H.G.B.0.J. ",
-" - >.c.K.K.K.K.K.G.H.K.K.G.K.z.H.K.K.K.H.H.K.K.K.K.K.K.H.r.L. > *.A.G.H.K.K.K.H.H.K.K.K.H.K.K.K.K.H.K.K.G.K.G.H.K.K.K.t.&.<. ; +.s.G.K.K.K.H.K.K.H.K.H.G.K.K.K.H.H.K.K.K.G.K.K.K.K.I.M.b.O ",
-" d 2.N.O.P.Q.O.P.Q.R.N.O.O.K.O.Q.S.N.P.O.O.O.O.P.P.O.O.O.r.#. W a.G.S.P.O.K.O.P.P.O.O.P.O.O.P.O.P.O.K.O.P.N.S.O.O.K.O.A.[. : /.z.P.T.N.P.O.N.O.O.S.N.P.O.K.O.Q.O.O.P.O.P.O.O.P.P.S.G.1.^. ",
-" , V t.O.O.O.O.O.Q.P.Q.P.O.P.O.P.O.Q.O.O.P.O.P.O.P.O.O.O.N.m.f. g y.N.O.O.O.O.O.P.O.P.O.O.O.P.P.O.O.P.P.P.O.O.P.O.P.O.N.v.V U.6.H.O.P.P.O.O.P.O.Q.P.Q.O.O.P.O.P.O.P.O.O.O.P.Q.O.O.N.z.]. ",
-" G V.H.O.P.W.P.W.P.Q.P.O.P.O.O.P.W.W.W.X.W.W.P.Q.X.W.O.W.R.b.O T B.O.W.X.W.X.W.X.W.Q.P.X.X.Q.X.P.X.P.Q.O.O.Q.P.X.W.W.Q.v.B S r.O.Q.Q.X.X.O.O.P.O.O.X.X.W.X.X.W.X.W.Q.X.Q.Q.P.P.X.Y.B... ",
-" ( d.H.X.W.X.X.X.X.X.W.Q.Z.Q.W.X.X.X.X.O.W.X.P.X.X.X.W.Q.`.1. : /.H.X.W.X.X.X.P.Q.X.P.Q.W.X.X.W.X.X.W.W.W.Q.W.X.W.X.X.N.0.6 A B.P.X.X.X.W.W.W.W.W.W.X.X.X.X.Q. +X.P.T.W.X.X.X.X.X.P.B.N ",
-" g t.P..+Z.W.Z.W.W.W..+++@+X.Z.W.Z.W..+W.Z..+W.W.W.W.W.W.H.*. U.b.N.Z.Z.W.W..+X.W..+#+W.Z.Z.W.W.Z.W.W.++#+X.Z.Z.W.Z.Z.N.a.U. : [.K.W..+W.Z.Z.W.Z.++X.W.W.W.W.#+X.W..+.+W.W.W.W.Z.W..+O.v.f. ",
-" +.A..+++.+++++++Z.++++.+Z..+++.+++++$+++++W.++++++$+++Z.M.+. a r. +++++++++Z.++++.+Z.++.+.+++++$+++++++Z.++++++++++Z.S._. _ b.Q.$+++++.+Z.++++Z.++++++++++W.$+++++Z.++++++++++++.+T.q.W ",
-" / /.Y.%+&+*+&+*+&+&+%+&+*+$+*+=+++%+-+*+$+*+*+*+*+&+*+&+%+G.D #.A..+-+%+++&+&+*+%+&+&+;+=+*+*+&+*+%+*+&+.+%+&+%+++&+=+H.[. f.v..+&+*+=+*+>+%+&+%+++&+*+$+*+*+*+%+&+&+&+&+&+&+*+*+%+O.d. ",
-" ~ l.W.;+-+&+-+&+-+&+&+-+&+-+-+&+-+-+&+&+-+&+-+-+&+&+-+-+.+r.h : e.O.&+-+-+-+-+&+-+-+&+-+&+-+-+&+-+&+&+-+&+-+&+-+&+&+-+%+N.V +.`.;+-+-+&+-+-+&+&+&+-+-+&+-+&+&+-+&+-+&+-+&+-+-+&+-+&+O.e. ",
-" f B.#+-+,+'+&+)+)+,+!+!+,+)+&+~+)+)+)+)+)+)+&+&+,+!+&+)+++q. o a.;+!+,+)+)+)+)+)+)+~+-+!+{+&+,+)+)+!+{+!+]+!+-+)+)+)+^+G.B ].O.,+!+~+)+)+)+!+-+)+,+!+)+)+)+)+)+)+{+-+&+)+&+!+)+]+*+S.T ",
-" +.K.~+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+{+#+2. h B.^+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+>+m. >.0.%+/+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+^+G.B ",
-" /. +/+)+)+)+)+)+)+)+)+]+)+)+]+)+)+)+)+)+)+)+)+)+)+)+)+)+ +&. T K./+(+)+)+)+)+)+)+)+)+)+)+)+)+]+)+)+)+)+)+)+)+)+)+)+_+.+b. h t.>+)+)+)+)+)+)+]+)+)+]+)+)+)+)+]+]+)+)+)+)+)+)+)+)+)+*+v.6 ",
-" d w.>+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+(+(+(+(+(+(+(+(+(+)+O.T (.W.)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+W.x. A K.{+<+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+(+(+(+(+(+(+(+:+(+*+k. ",
-" 6 G.)+[+(+[+[+[+[+[+[+}+[+<+<+<+|+1+[+}+}+[+}+[+:+[+[+|+)+N.g o 0.>+(+<+<+<+<+[+[+[+[+[+<+<+[+}+[+<+[+[+[+[+<+<+<+<+<+:+2+*. (. +)+3+[+[+[+}+4+}+[+<+<+<+<+1+[+[+[+[+[+<+<+[+<+[+[+}+;+6. ",
-" T T.(+5+5+5+5+[+[+5+5+5+3+5+5+5+3+[+5+5+5+3+3+4+[+5+5+[+)+B. h A.^+5+5+3+5+3+5+3+3+5+3+5+[+3+5+5+3+[+5+5+5+5+[+[+5+5+1+T.T o b.*+3+5+[+3+[+3+3+5+<+[+5+3+5+5+5+5+[+5+5+5+5+5+[+5+5+5+++(. ",
-" (.6+5+7+8+7+8+7+8+7+7+7+8+7+8+8+8+8+8+8+7+8+8+8+8+7+7+9+,+m. A O.<+7+7+8+7+7+7+8+7+7+8+8+7+8+8+8+7+8+8+8+7+8+7+8+7+7+<+H. 6 B.)+8+8+8+7+8+8+8+8+8+8+8+7+8+7+7+8+8+8+7+7+8+7+7+7+8+[+ +%. ",
-" o k.{+9+0+8+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+8+8+7+9+*+6. &.++5+a+7+7+7+7+7+7+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+0+)+b+ C +}+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+7+7+7+7+7+:+K. ",
-" f.A.[+c+a+a+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+c+c+a+a+c+c+a+>+&. s.d+c+c+c+c+c+c+c+a+a+c+c+a+c+c+c+c+c+c+c+c+c+c+c+c+c+e+)+b. (.^+f+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+a+c+c+7+c+c+c+c+c+[+z. ",
-" #.Q.8+c+g+c+c+h+c+c+c+c+c+c+c+c+c+g+g+c+g+c+c+g+g+c+c+g+7+.+#. W E.3+c+c+c+c+h+c+g+g+c+c+g+c+c+c+c+c+c+c+c+c+c+c+c+c+g+i+~+(. 0.(+c+h+c+c+c+c+c+c+g+g+c+c+c+g+c+g+g+h+c+g+c+c+c+c+g+a+d+y. ",
-" (.^+e+g+j+k+g+g+g+g+g+l+g+c+g+g+c+g+g+g+g+g+l+g+g+g+g+g+m+N. A X.5+n+g+j+g+l+g+j+j+g+g+g+k+g+g+g+g+g+g+g+c+l+l+g+g+j+a+.+.. W H.5+g+g+g+g+j+k+g+l+c+g+l+g+c+g+g+j+j+l+l+g+g+c+g+g+g+a+{+b. ",
-" 0.(+c+l+o+l+l+p+l+o+o+p+p+g+o+l+l+p+j+o+p+o+j+l+p+p+l+l+5+A. (.~+c+o+p+l+p+g+j+p+p+j+j+o+l+g+o+p+o+o+p+p+g+l+l+l+p+n+0+ + D +8+l+n+j+l+o+l+l+l+j+l+o+j+l+l+g+l+p+g+g+p+p+g+l+o+q+c+~+]. ",
-" W G.[+p+p+p+p+p+l+p+o+o+p+p+p+p+p+o+o+p+p+p+p+p+p+p+o+p+j+(+k. 0.(+h+p+p+o+j+l+o+o+p+l+p+p+o+o+o+p+p+l+l+l+p+o+p+o+o+g+3+H. @.*+a+l+p+l+l+p+p+o+p+o+l+p+p+l+j+o+l+p+l+l+o+p+p+l+o+p+a+Z. ",
-" B +a+p+l+p+o+o+p+p+o+l+l+o+p+p+p+l+r+s+o+o+p+p+o+p+p+p+g+t+(. 4 A.3+j+o+l+p+o+p+o+l+o+l+l+p+p+p+o+q+o+p+l+o+p+o+p+l+p+r+<+b+ b./+l+p+o+l+p+o+l+p+l+p+l+p+l+q+o+p+l+o+l+l+o+p+l+p+o+l+9+K. ",
-" ].~+l+u+u+u+u+u+u+u+p+u+u+v+r+u+u+u+u+u+u+u+u+u+u+u+u+u+g+*++. D w+a+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+u+u+r+v+u+u+u+u+p+(+b. z.7+s+u+u+u+u+r+r+u+u+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+9+G. ",
-" l.3+r+u+u+u+x+x+u+y+u+x+z+u+u+x+x+x+u+u+u+u+x+x+u+u+u+u+k+W. @.~+p+y+x+u+u+u+u+u+x+u+u+u+u+u+x+u+y+u+u+u+z+u+u+u+u+y+o+/+(. f.W.j+y+u+x+u+u+x+u+x+y+u+x+u+x+x+x+u+u+u+u+x+x+x+u+x+y+r+[+w. ",
-" H.f+u+x+y+A+x+y+y+y+y+y+A+y+A+y+A+y+y+y+y+y+y+x+y+y+u+x+e+S. 8.B+u+A+y+y+y+y+y+y+y+y+u+y+y+x+x+y+y+y+y+y+y+y+y+A+y+y+l+%+ @.*+l+A+y+u+y+A+y+y+y+y+y+y+A+A+A+y+y+y+y+x+y+A+y+x+A+y+r+d+&. ",
-" f W.o+C+D+D+C+C+E+C+E+F+C+C+C+F+y+E+E+E+C+E+E+C+G+E+C+D+A+a+C. z.c+F+C+E+C+E+C+E+D+D+E+E+E+E+C+C+C+C+F+F+E+C+C+A+C+E+C+j+Q. c.}+y+E+C+E+C+C+E+C+C+E+C+C+E+D+C+C+G+D+C+C+D+D+C+C+G+E+r+*+ ",
-" T &+x+E+A+E+D+H+D+D+D+D+H+H+H+D+D+D+D+H+C+I+D+F+A+D+D+H+A+3+0. f.#+q+G+D+H+E+H+H+J+A+D+H+F+E+D+H+D+D+D+D+D+D+H+D+D+D+H+E+e+t. z.e+y+D+D+D+H+D+D+H+D+H+H+H+A+D+D+C+F+E+H+F+F+H+H+H+D+C+p+w+ ",
-" 2.K+y+D+H+D+D+D+H+D+H+D+D+D+H+D+D+D+D+D+D+D+H+D+H+D+D+H+x+d+ T t+r+D+D+D+D+H+D+D+H+D+D+H+D+D+D+D+D+H+D+D+H+D+D+D+D+H+F+9+k. h X.g+C+H+H+D+H+D+H+D+D+D+H+D+D+H+H+D+D+D+D+D+H+D+D+H+D+C+c+S. ",
-" z.c+E+L+M+M+M+M+L+L+L+M+M+M+L+M+M+M+L+M+M+L+M+M+M+M+M+H+s+*+ 2.[+A+M+M+M+M+M+M+M+M+M+M+L+M+M+M+L+M+M+L+L+M+M+M+M+M+L+A+}+1. 7.!+s+L+L+L+L+M+M+M+M+L+M+M+L+M+M+M+M+M+M+L+M+M+M+L+M+M+C+0+r. ",
-" +o+L+M+N+M+L+M+M+M+L+M+M+M+M+L+M+M+L+L+M+L+L+M+L+M+M+O+o+ + t.0+C+M+M+L+M+L+M+M+M+M+M+P+M+L+M+L+L+M+M+L+L+L+M+M+M+H+s+!+ _.B+C+M+M+M+M+M+L+M+L+M+M+M+M+L+M+L+L+M+L+L+M+M+M+M+Q+L+C+K+_. ",
-" A t+x+Q+R+S+N+T+T+S+N+S+S+M+S+S+S+M+N+S+Q+N+S+Q+S+S+N+T+O+g+G. O.l+M+S+Q+S+S+S+S+Q+S+N+R+S+N+T+R+M+S+S+Q+S+N+S+Q+M+N+O+r+Z. s.c+H+S+S+S+S+N+S+Q+Q+Q+S+S+N+Q+N+Q+S+N+N+T+R+S+S+R+M+S+A+,+ ",
-" 2.3+U+T+R+R+T+T+R+T+R+T+T+T+T+R+T+T+T+T+R+T+T+T+R+T+R+R+H+V+q. D ^+y+W+R+R+R+R+R+T+R+T+R+R+R+T+R+T+T+T+T+T+T+R+T+T+T+R+S+o+X+ O.Y+Q+R+T+T+R+T+T+T+T+R+R+R+T+R+T+T+R+R+R+R+R+T+R+T+T+R+z+>+ ",
-" t.c+N+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+L+3+ (.<+O+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+`+N+n+B. N ~+y+ @Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+ @.@P. ",
-" T.p++@`+`+`+`+`+`+`+`+`+`+`+`+`+Z+ @`+`+ @`+`+`+`+`+`+`+G+)+ b+e+@@`+`+`+ @`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+ @`+#@9+ e.}+L+`+`+`+`+`+`+`+`+`+`+`+`+$@Z+`+`+`+`+`+`+`+`+`+`+`+@@g+B. ",
-" ^+A+$@`+`+`+`+`+`+`+`+`+%@`+%@`+`+`+`+`+`+`+`+%@%@`+%@&@x+w+ N.v+@@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@`+`+`+`+`+`+Z+E+)+ 0.c+#@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@%@`+`+`+`+M+0+w. ",
-" (.[+N+*@*@*@=@*@*@-@*@*@-@*@;@-@*@*@*@;@*@;@-@;@;@*@=@=@%@r+X+ *+J+>@*@;@*@*@*@*@*@=@*@*@*@*@*@-@*@-@;@=@,@*@*@*@*@*@>@J+^+ S.Y+&@*@-@,@=@,@*@=@-@=@-@;@,@*@-@;@-@-@*@;@-@*@*@-@-@%@N+3+ ",
-" 0.k+W+;@'@,@;@'@,@-@,@;@'@;@,@,@;@'@;@;@,@,@;@;@'@,@,@,@&@g+r. *.[+N+*@;@,@;@;@-@;@,@;@;@-@,@,@,@'@;@;@,@,@'@;@'@-@'@)@!@u+ + >+F+~@-@,@,@,@;@=@,@-@{@,@,@;@,@-@)@,@;@;@;@-@'@,@;@;@;@D+{+ ",
-" K.r+*@)@)@)@)@,@'@)@)@)@)@)@)@'@)@)@)@)@)@)@)@)@)@)@)@]@ @7+ q.h+&@)@)@,@{@)@)@)@)@)@)@'@)@,@)@,@)@)@)@)@)@)@,@)@)@,@^@q+A. .<+N+,@/@)@)@)@)@)@)@'@)@)@)@)@)@)@)@'@)@)@'@)@)@)@'@)@-@(@w. ",
-" ;+C+;@_@)@/@/@)@)@'@/@,@'@/@:@/@'@)@/@/@'@'@/@/@)@/@/@=@S+1+ G.r+^@/@:@)@)@)@/@/@'@/@:@)@/@/@)@)@)@/@)@,@)@:@/@:@)@:@%@e+ b.a+&@:@/@/@'@)@<@:@)@:@/@/@:@,@)@/@:@)@)@/@:@/@/@/@)@)@~@A+3 ",
-" ..1+S+;@)@_@/@)@_@/@_@)@_@_@_@_@/@_@_@_@_@)@_@:@_@_@/@,@[@H+&+ .+C+]@_@_@_@,@_@_@/@<@:@)@_@_@)@:@_@_@)@/@_@_@_@_@_@_@_@Z+[+ z.n+}@|@:@)@_@_@:@/@_@_@_@_@/@:@/@_@_@)@_@)@/@_@:@)@_@1@%@8+ ",
-" 6.e+S+:@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@:@/@_@{@A+2@ 3@N+]@_@_@_@_@_@_@_@:@/@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@]@#@'+ W.C+{@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@/@)@_@_@_@_@_@_@4@$@w+ ",
-" B.v+)@5@_@6@5@_@7@_@_@_@_@_@_@_@6@8@8@6@_@_@7@6@_@6@5@_@,@p+t. 1.7+9@4@_@5@_@5@8@6@_@7@7@_@6@7@8@6@_@_@_@_@_@_@_@5@_@5@:@D+W. ]+N+_@8@5@8@6@_@_@_@_@_@_@6@8@5@_@5@_@8@7@6@_@5@0@8@5@:@@@Q. ",
-" %+D+<@7@5@5@7@5@5@5@7@5@5@7@5@7@7@6@6@7@5@_@5@5@5@5@5@8@=@c+ t.r+,@6@5@5@0@8@5@7@7@5@5@7@5@7@5@5@5@5@5@7@5@5@5@7@5@6@)@u+E. a@f+>@5@5@5@7@5@5@7@5@7@6@6@7@5@_@7@5@7@5@5@5@5@5@7@5@7@b@M+(. ",
-" z )+c@6@d@e@7@7@7@f@d@7@d@7@e@7@f@5@f@f@5@f@7@5@7@d@d@f@7@%@5+ T.E+8@d@f@5@e@f@7@7@7@d@5@e@e@7@7@d@e@7@5@f@7@7@f@5@d@e@;@q+ B.q+{@7@e@7@f@7@7@5@e@f@e@7@7@f@7@f@5@f@7@5@f@7@7@e@f@7@{@a+g@ ",
-" G &. (.f+>@d@h@h@h@h@e@i@h@7@i@h@h@7@d@h@7@d@h@h@7@h@i@7@h@h@6@ @{+ )+&@d@d@d@i@j@d@h@h@7@d@i@i@h@h@e@h@h@0@d@h@h@7@d@h@h@e@~@a+ Q.D+|@h@h@j@h@i@d@d@i@i@d@7@h@h@7@d@i@d@7@i@h@h@h@j@h@d@:@k@ ",
-" f %+&+ s.p+:@h@i@h@h@d@h@h@e@h@h@h@e@h@h@e@h@i@i@d@h@h@e@h@h@l@7@D+Q. [.8+*@6@h@h@h@h@h@h@e@h@h@h@h@i@d@h@h@e@e@h@h@d@i@h@h@h@m@$@d+ &+@@7@i@h@h@i@h@l@h@i@d@i@h@h@d@h@h@d@i@h@h@h@i@h@h@i@h@,@;+",
-" .c+E+!+ W.D+7@n@i@n@o@p@h@o@o@n@n@n@o@n@n@o@n@n@o@n@n@n@h@o@n@i@:@A+K. r.q@:@p@n@n@n@n@n@n@o@o@o@i@o@n@o@h@p@n@o@n@o@n@n@o@n@n@7@@@&+ 8+>@e@o@n@h@h@n@o@n@o@n@n@n@o@n@o@o@n@o@o@o@i@o@n@h@h@o@&@",
-" 2.u+[@D+T. {+$@l@o@n@n@n@n@n@n@o@n@o@n@n@o@n@n@n@n@o@n@o@o@n@n@n@o@)@l+ S.E+f@n@o@n@o@o@n@n@n@n@o@n@o@n@n@n@o@n@o@o@n@n@o@n@o@n@6@E+S. 0.q+4@n@n@n@n@n@o@o@n@o@o@n@o@o@n@o@n@n@n@o@n@n@n@o@n@n@7@",
-" P r.E+r@8@r+ 9+-@s@o@n@n@o@n@n@n@o@n@n@o@n@n@o@n@o@n@n@n@n@t@n@o@n@p@;@m+ ~+T+i@u@n@o@n@v@n@n@n@n@o@n@o@o@n@n@n@n@n@n@o@o@n@o@n@n@_@Y+ H.E+7@n@o@n@n@o@o@v@n@o@n@n@n@o@o@o@n@n@n@n@n@o@n@n@n@p@",
-" ! I.M+p@v@)@w@ a.l+_@n@x@o@n@n@o@n@y@v@n@x@x@n@n@u@v@o@o@n@x@v@n@v@v@n@l@^@d+ [+-@n@x@o@n@z@v@v@v@x@x@n@n@o@n@n@n@x@n@v@v@z@n@o@n@z@o@,@a+ %+R+d@n@n@o@n@z@z@n@n@x@x@o@n@x@n@x@v@n@x@n@v@n@v@n@n@",
-" { Z.&@o@n@p@-@[+ H.(@7@x@v@x@x@n@x@x@z@v@x@x@x@v@x@x@n@v@v@n@n@x@n@x@x@u@i@@@#+ 8.k+4@u@n@x@x@n@v@x@v@n@x@v@n@x@v@x@x@x@z@x@y@x@n@v@z@n@o@*@1+ (+>@o@x@v@n@x@x@x@x@x@z@n@x@z@n@n@z@x@v@x@z@v@x@v@n@",
-" ~ ]+)@A@B@C@x@Z+~+ Z.@@n@C@C@C@C@D@B@E@B@z@x@D@D@z@D@B@B@D@B@z@C@C@C@C@C@D@l@E+ A.z+f@C@C@F@B@B@C@D@x@D@C@C@C@A@C@x@B@z@B@n@B@D@C@F@G@C@v@Z+*+ _.g+8@B@C@B@z@v@x@D@v@B@C@C@B@B@B@C@B@x@z@D@D@C@C@D@",
-" 6 9+7@H@I@A@A@i@S+Z. (+)@D@I@A@B@A@A@I@I@I@C@I@A@I@B@C@A@I@A@A@A@A@I@I@B@A@I@d@u+ $+S+n@I@A@A@I@A@I@C@A@I@A@I@C@C@I@I@I@I@C@A@A@I@C@B@I@J@o@L+Q. u.y+i@B@B@I@C@A@I@D@C@C@I@A@I@A@A@I@C@I@I@I@I@C@D@",
-" D g+l@H@A@I@B@A@l@y+ e+:@A@I@x@I@I@A@A@A@I@I@A@A@I@A@I@A@A@A@B@G@I@A@x@A@I@C@8@e+ (+-@z@A@I@A@I@A@I@A@B@I@A@B@D@I@I@A@I@A@A@A@A@A@I@I@A@K@h@.@ +N+i@z@I@I@I@A@I@A@I@I@I@A@A@A@I@I@I@B@A@A@D@B@",
-" [.p+i@L@I@I@I@A@D@0@l+ u.y+d@I@I@I@A@I@I@A@I@A@I@A@A@A@I@I@A@A@I@A@I@A@I@A@I@J@E@*@1+ e+/@z@A@A@I@I@I@A@A@A@I@A@A@A@I@I@A@A@I@A@I@I@A@A@I@A@z@8@n+ )+*@z@L@A@I@I@I@I@A@I@I@I@I@A@I@A@I@A@A@I@A@A@",
-" b.F+x@M@I@H@H@H@L@B@<@m+ X.R+x@L@H@H@H@L@H@H@H@H@L@L@H@H@L@H@I@H@H@L@L@L@H@H@H@L@B@Z+w+ m.y+l@I@N@H@L@A@H@H@L@H@H@H@H@H@H@H@L@H@H@H@L@H@H@H@L@I@C@/@3+ e+8@A@H@L@H@H@H@H@H@L@L@H@H@L@J@H@L@H@L@H@L@",
-" t.M+B@H@H@H@L@H@H@J@z@>@{+ {+*@v@H@H@L@H@H@H@I@L@H@I@L@L@H@L@H@H@H@I@H@A@L@H@I@H@L@n@H+ O.H+n@H@H@H@H@L@H@L@I@I@H@H@L@H@L@H@I@L@H@I@I@H@H@H@H@H@z@`+^+ b.q+d@L@H@H@H@H@I@H@I@I@H@H@H@H@H@J@L@I@L@I@",
-" ! X+^@L@N@O@N@M@N@H@N@H@v@ @#+ 7+|@C@M@P@M@L@N@H@M@N@H@N@M@H@M@M@N@H@H@N@M@H@H@M@M@L@M@Q@R@ ~+*@C@M@N@M@N@I@L@S@M@M@L@N@M@H@N@M@M@N@N@M@N@H@S@H@N@H@v@@@ G.E+n@M@L@H@S@M@T@T@H@T@N@O@N@N@L@L@H@N@H@",
-" { *+U@P@V@M@H@H@V@L@N@M@N@v@A+ 0.p+f@M@V@M@H@T@N@M@V@V@M@N@N@T@H@M@N@N@T@M@H@T@M@L@H@T@O@W@j+ K+:@A@T@M@M@H@P@V@P@H@M@V@N@L@M@T@M@T@T@T@M@T@V@H@M@M@N@t@F+ *+~@K@H@N@T@M@P@V@T@M@M@M@N@H@H@N@T@T@H@",
-" 4 )+|@X@T@V@T@T@V@T@T@T@T@M@d@p+ G.L+v@T@T@T@V@V@T@V@M@N@V@T@T@T@T@V@V@T@T@V@T@T@T@T@T@V@Y@Z@B+ l+d@M@T@T@T@T@V@T@T@V@V@T@T@V@T@T@V@T@H@V@V@T@V@T@T@T@M@d@l+ K+4@L@V@M@M@T@T@L@N@T@T@T@T@T@T@V@T@T@",
-" | `@d@V@V@T@T@T@V@T@T@T@T@T@O@|@`@ .+9@K@V@T@V@T@T@T@T@V@T@T@T@V@V@T@T@T@V@T@T@T@V@T@T@T@T@E@^@%+ z.D+o@T@T@V@T@T@T@T@V@V@T@T@V@V@V@V@T@T@V@T@T@T@V@V@T@T@A@]@ # n+e@O@V@V@T@T@T@T@T@T@V@V@T@T@V@T@V@",
-" A j+x@.#+#+#+#X@T@V@V@T@V@T@T@Y@:@,+ 3+_@L@@#T@T@.#.#+#@#.#T@.#+#+#T@V@T@T@T@V@+#+#+#T@##.#.#z@S+ k@%@K@T@V@T@T@T@V@.#T@@#+#X@V@.#.###+#.#+#+#T@##T@V@T@T@D@%@-+ A.I+x@P@##.#+#V@##+#+#+#T@T@T@T@T@T@",
-" &.y+B@.#.#.#.#.#.#.#.#####.#.#+#L@Z+ q+d@X@.#.#+#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#+#+#.#.#+#$###v@A+ :+)@M@.#.#.#.#.#.#.#@#+#.#.#+#.#.###.###.#.#.#.#.#.#.#.#G@R+ #+Z+L@%#.#####.###.#.#.#####.#.#.#",
-" b.H+A@.#.###.#.#.#.#.###.#.#.#.#.#B@U+ r.F+x@##.#.###.#.#.#.#.#####.#.#.###.#.#.###.#.#.#.#.#.#N@7@g+ &#e@T@.###.#.#.#.#.#####.#.#.#.#.###.#.#.#.###.###.#.#+#x@E+ )+{@P@.#.#.###.#.#.#.#.#.###.#.#",
-" v.c@M@$#.#%#.#.#$#.#X@.#$#@#.#%#$###v@s+ T.&@A@.#$#%#.#$#$#.#$#.#.#$#$#+###$#$#.#$#$#.#.#$#$#.#$#T@_@3+ x+x@%###+#$#$#.#.#%#.###$#$###.#$#.#$#.#.#.#$#+#+#$#$#+#s@r+ 7+e@##.###$#.#*#%###.#$#.#+#$#",
-" 1 T.;@+#$#$#$#$#$#$#$#.#$#$#*#$#.#$#$###f@a+ {+-@M@.#.#$#$#$#$#$#$#$#$#$#.#$#$#$#$#.#$#.#$#$#$#$#$#$#H@;@~+ S.@@Y@*#.#$#$#$#$#.#.#%#$#.#%#$#$#$#$#$#$#$#$#.#.#$#$#$#V@6@7+ u+n@+#$#$#$#$#$#$#$#$#$#.#$#",
-" : *+6@.#$#$#$#$#$#.#.#$#$###%#$#$#$#$#$#T@{@]+ 7+f@X@$#$#$#$#$#$#$#$#.#.#$#$#.#.#$#$#$#$#$#$#$#$#$#$#$#I@&@ *+~@M@$#.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%###$#$#.#.#$#$#N@,@~+ H.#@A@$#$#$#$#$#$#$#.#.#$#%#",
-" j.(+d@$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#Y@&@ r+o@.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$###v@x+ 3+8@+#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#L@@@ &+*@M@$#$#$#$#$#$#$#$#$#$#",
-" 6 8+p@$#$#$#=#$#$#=#=#$#$#$#$#$#$#$#$#$#$#$#D@-# A.D+G@%#$#$#$#=#=#$#$#=###$#$#;#$#$#=#$#$#$#$#$#$#$#$#=#X@f@># o+p@%#=#$#$#$#$#$#$#$#=#$#$#$#=#=#$#$#=#$#$#$#=#$#$#;#$#x@C+ }+_@X@$#$#=#$#$#$#$#.#$#",
-" D p+z@=#=#=#,#,#=#'#)#=#=#=#=#=#=#,#=#=#=#!#%#v@u+ W.;@+#=#=#=#,#,#=#,#,#=#=#'#'#=#=#,#=#=#=#,#=#=#=#=#'#!#+#|@K+ D.H+C@,#=#=#'#=#=#=#=#!#=#=#=#,#)#=#=#)#,#=#=#,#=#=#'#!#.#s@Y+ j+x@.#=#,#,#=#=#=#=#=#",
-" &.A+T@~#)#{#,#)#{#,#)#]#]#{#)#)#~#]#)#)#~#,#)#;#n@k+ 3+7@=#)#)#=#)#{#]#)#{#~#~#{#)#)#)#)#)#{#)#{#~#~#{#'#~#]#+#{@ ++*@##,#)#!#)#)#)#)#,#)#~#)#)#)#)#]#)#,#)#)#{#~#)#,#)#]#^#Q@8+ L+I@=#,#]#~#)#{#)#]#",
-" k.@@$#/#(#_#]#]#(#]#)#/#/#(#(#]#(#]#)#/#/#{#(#(#:#7@1+ q+D@~#_#)#(#(#/#/#(#(#/#]#]#/#]#]#]#(#<#]#[#/#(#/#]#_#]#N@>@ [+|@.#~#]#]#/#_#_#)#/#/#(#]#)#/#/#(#(#_#_#~#(#]#]#]#~#(#.#8@(+ W.}#@#)#/#/#]#(#(#/#",
-" G.,@'#/#_#/#_#_#_#_#/#_#_#_#_#_#_#_#/#_#_#_#_#_#_#%#;@ |#N@~#/#_#/#/#_#_#_#_#/#_#/#_#_#_#/#/#_#/#/#/#_#_#/#_#)#N@O+ g+x@!#_#_#/#_#_#_#/#_#/#_#/#_#_#_#/#_#_#_#_#_#_#_#/#_#/#.#;@ ]+5@'#/#/#_#_#_#_#",
-" W.6@~#1#2#_#_#3#4#/#_#3#1#3#_#_#2#_#_#3#3#/#/#_#2#(#5#R+ +;@##(#1#3#_#_#2#_#2#_#_#3#1#_#_#_#/#/#_#2#/#_#1#3#_#/#/#D@.@ J+O@/#_#/#_#_#_#_#3#3#_#_#2#/#_#3#1#2#/#_#1#3#/#_#_#_#_#N@ @ c+n@]#4#_#_#3#1#",
-" { )+x@6#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#6#1#O@C+ (+0@{#2#6#2#2#2#2#2#2#2#7#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#/#t@7+ T.!@;#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#1#M@F+ D+T@1#2#2#2#2#",
-" <.[+G@8#9#9#9#8#9#0#9#9#8#8#9#9#8#9#0#9#9#9#9#8#9#9#9#a#b#A@p+ n+A@/#c#0#8#8#8#9#9#9#8#9#9#8#9#9#d#9#9#9#9#8#9#9#0#9#9#(#r@ (+l@/#8#9#9#8#8#9#9#9#e#9#9#9#8#8#9#9#9#9#9#9#8#9#9#9#f#3#K@n+ P.*@'#8#8#9#9#",
-" %+l@_#g#h#i#i#h#j#c#j#i#9#j#h#0#k#j#i#h#i#j#0#h#h#i#i#j#1#E@7+ L+.#9#j#0#c#8#h#j#i#c#j#j#9#k#i#9#h#k#j#j#j#h#h#j#h#9#c#~#_@ j+Y@2#h#h#9#0#k#j#h#j#h#j#h#h#9#h#j#h#l#k#j#9#h#j#9#i#k#1#t@ ]+e@1#9#i#9#",
-" y+T@m#k#j#j#k#j#k#g#g#h#k#k#k#k#g#j#k#h#g#k#k#k#j#j#k#h#1#e@ -@)#j#k#k#j#k#j#k#k#k#g#k#k#i#k#k#h#i#i#g#k#h#g#k#j#k#i#,#`+ E+@#l#k#h#k#k#g#k#j#h#g#k#k#h#k#g#k#k#h#i#h#k#g#h#j#n#j#]#8@ o#Y@2#k#h#",
-" %@!#k#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#q#(#)@ /+l@2#p#p#p#p#p#p#q#n#p#p#p#p#p#p#r#p#p#p#p#p#p#p#p#p#p#c#%#D+ -@!#k#p#p#p#p#p#p#r#p#p#r#p#p#p#p#q#q#p#p#p#p#p#p#n#p#q#]#;@ h+%#c#p#",
-" %+8@_#n#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#,#R+ e+I@a#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#p#p#p#r#a#N@l+ {+d@3#q#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#n#q#p#p#p#h#;#S+ W+!#s#",
-" a+K@0#t#t#t#u#t#u#t#v#u#t#u#w#v#v#w#t#t#t#t#t#t#t#t#u#w#r#*#C+ M+=#x#t#t#w#v#v#w#u#t#u#t#t#t#t#t#t#t#t#v#w#u#t#w#u#w#w#a#A@ c+K@i#t#t#t#u#t#t#w#v#v#w#t#t#u#w#v#v#w#u#t#t#t#t#t#t#t#s#.#x+ T.y#e#",
-" F+;#z#A#B#B#B#B#v#C#B#B#u#B#B#u#u#B#B#B#B#B#B#B#B#B#B#B#q#X@ ,@2#w#D#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#B#B#B#B#v#B#B#u#u#9#l@ E+$#E#B#B#B#B#B#B#B#B#B#v#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#n#H@ Q.##",
-" *@7#F#G#G#H#G#G#H#I#G#A#J#K#H#J#G#I#G#G#I#I#H#K#G#I#K#I#k#E@ {+o@j#H#I#K#F#J#G#G#F#K#I#H#K#J#G#H#G#G#I#J#K#I#I#G#F#G#L#e#:@ U@M#L#G#J#H#J#G#H#I#G#G#H#K#J#F#G#G#A#G#H#I#J#K#G#I#G#H#h#y@ N#",
-" l@h#O#P#Q#R#S#S#R#R#S#S#R#S#S#S#K#S#R#Q#G#S#R#R#O#R#R#G#j#l@ e+T@E#G#P#R#R#R#O#S#R#Q#O#S#S#Q#S#S#R#O#S#S#S#T#R#S#R#U#A#1#Z+ l@q#O#S#Q#S#S#S#T#R#S#Q#R#O#S#R#O#S#S#Q#O#S#R#Q#O#S#R#J#i#5@ ",
-" 8+J@z#V#W#W#U#X#Y#W#W#X#U#W#Z#W#R#Z#X#Y#`#W#W#X#W#W#W#Y#G#6#,@ E+{#L#R#X#X#U#S#Z#X#W#X#X#W#W#U#W#X#Y#W#W#Y#`#W#W#X#W#S#J#)#A+ 7+T@t#Y#W#W#W#W#W#W#U#Z#W#R#Z#Y#S#Z#X#W#W#Z#Y#Y#W#W#X#Y#I#6#*@ ",
-" x+=#L#Y#Z#X#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $I#/#c@ >@e#O# $Z#X#Z#Z#Z#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $.$@# F+)#H# $Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#+$I#@$-# ",
-" %@6#R##$$$%$%$&$%$%$&$#$$$#$%$&$%$%$%$%$%$%$%$#$$$%$%$#$G#{# p@v#*$&$&$&$&$%$%$&$%$%$%$%$%$%$%$%$&$%$%$$$#$%$&$&$#$*$w#=$ -@9#Y#*$%$%$%$$$#$%$&$$$#$&$&$&$%$%$#$$$%$%$%$%$%$%$%$#$G#$# ",
-" d@x#*$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$$J#@# a+@#G##$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$-$;$i@ o@x#*$>$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$#$A#M@ ",
-" T@F#,$,$'$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$>$,$,$&$L#D@ E+/#X#>$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$,$>$,$,$,$,$,$,$,$*$h#{@ 8+@#O#,$)$,$'$,$,$>$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$'$!$$$v#B@ ",
-" s+]#~${$]$^$]$^$^$]$^$^$^$)$]$)$)$)$]$)$)$]$)$)$]$^$]$/$>$w#f@ ;@($>$]$]$^$]$)$^$]$)$)$]$)$)$]$^$/$/$]$]$]$]$]$^$]$]$)$~$9#S+ z+_#X#_$^$]$]$]$]$]$^$]$]$]$]$^$)$)$]$)$)$^$/$)$]$]$]$)$>$w#:$ ",
-" ^@g#>$<$[$<$[$<$[$[$}$[$^$[$<$<$]$<$<$^$|$<$]$1$[$}$}$}$'$p#;@ v@F#)$<$[$[$}$[$}$}$}$<$<$]$|$1$}$<$|$<$|$}$|$<$[$|$]$]$*$]# >@j#&$]$[$<$<$[$|$<$}$[$<$|$<$2$}$<$<$<$<$<$}$<$[$<$]$|$,$q#%@ ",
-" l@B#]$|$3$|$4$3$5$3$3$5$5$|$4$3$|$3$5$3$3$3$3$3$|$|$|$3$!$e# ##Y#<$3$5$6$5$|$3$3$|$4$3$3$3$6$|$3$6$|$|$3$|$3$3$3$5$<$7$^# l@J#8$5$6$|$5$3$|$[$3$3$3$|$5$9$6$4$3$|$5$3$|$5$|$3$0$|$$$2# ",
-" N@X#5$a$a$a$a$a$b$b$a$a$a$b$a$3$b$a$a$a$a$a$a$a$a$a$a$0$>$/# y+2#>$c$a$a$a$a$a$a$9$a$a$a$a$a$a$b$a$a$a$b$b$a$d$a$a$d$5$Y#H@ .#X#3$d$a$b$a$a$a$a$a$a$a$a$b$b$a$a$b$3$b$a$a$b$b$a$a$9$&$@$ ",
-" v+4#>$a$a$d$a$a$a$d$a$a$a$e$b$a$a$b$a$f$b$a$a$d$a$e$d$a$5$~$%# g$p#]$a$e$b$a$a$d$a$e$a$a$9$a$a$e$d$a$a$a$a$a$a$e$a$a$e$h$F#7@ .@4#>$9$b$e$a$d$a$a$a$a$a$a$a$a$a$a$a$a$a$a$9$a$b$e$d$a$c$ $T@ ",
-" Z+x#}$d$i$j$j$k$l$l$j$l$i$j$k$l$j$l$l$j$l$l$m$j$i$j$m$n$a$S#A@ p@T#e$i$l$m$l$o$j$i$j$l$l$o$k$i$j$m$l$l$j$j$l$i$l$m$i$l$5$w# !@u#|$d$i$l$m$m$l$j$k$j$i$i$k$l$l$j$l$j$k$l$l$m$i$o$n$o$b$O#x@ ",
-" d@S#d$p$p$q$p$i$p$p$r$r$p$s$p$p$p$p$p$p$p$q$q$p$p$q$p$l$b$O#7@ $#t$j$q$p$p$p$s$p$s$p$p$p$p$i$q$s$u$p$r$r$p$p$q$p$p$p$p$|$j# i@W#d$v$p$s$s$p$p$s$p$i$r$p$p$p$s$p$r$p$p$p$p$p$p$s$s$l$e$w$/@ ",
-" +#%$j$x$y$p$p$x$s$p$s$z$s$z$s$r$s$s$x$p$u$q$s$x$z$s$p$s$b$z# 1#}$s$p$q$s$s$s$s$x$p$x$r$p$s$x$x$q$y$s$p$x$z$q$q$s$A$p${$B$ @#$$k$r$z$s$p$x$s$q$p$u$s$q$q$x$q$x$s$p$x$p$r$p$z$s$q$u$4$q# ",
-" (#}$z$C$C$C$D$C$C$C$D$E$F$C$C$C$C$F$C$F$C$C$F$F$C$C$F$C$0$c# ^@u#m$z$C$C$C$C$E$D$C$F$C$C$C$E$E$C$G$E$C$G$D$E$C$C$C$C$s$_$$# 2#[$z$C$E$E$D$E$E$C$H$C$E$C$C$C$C$G$C$C$C$C$C$C$E$C$C$x$4$i# ",
-" S+t#j$F$I$I$I$I$J$I$J$I$I$I$J$I$J$J$J$I$J$I$I$J$I$I$J$I$F$c$/# o@Z#q$K$L$I$J$J$J$J$J$I$J$I$J$I$J$I$J$J$J$J$J$I$J$I$I$K$x$$$Y@ @w#k$L$J$J$J$I$I$I$J$I$I$F$I$I$I$I$J$J$J$I$I$I$J$I$I$I$F$5$B$ ",
-" 6@W#x$J$J$M$M$N$I$O$O$O$O$O$O$O$M$O$O$O$M$M$O$O$J$O$O$O$H$P$.# $#)$Q$O$O$M$M$O$O$O$O$M$O$O$M$M$O$O$J$O$M$O$I$O$O$O$O$I$x$W# i@X#A$O$J$O$M$O$I$O$M$O$O$M$O$O$O$O$O$O$O$O$O$O$O$O$M$O$E${$T@ ",
-" +#)$D$O$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$O$R$R$R$M$z$$$z@ e#0$J$R$R$R$R$O$R$R$R$R$R$R$R$R$R$M$S$R$R$R$R$R$R$R$R$S$q$F# .#}$K$R$R$R$R$M$R$R$R$R$R$R$R$R$O$R$R$R$R$R$R$R$R$R$R$M$z$~$ ",
-" T$U$R$V$W$V$V$W$X$V$W$V$W$V$W$V$R$V$V$Y$W$V$Z$W$V$V$Z$W$Q$P# @L#u$Y$V$W$V$W$Y$V$W$X$V$V$V$W$V$Y$W$V$W$V$V$W$V$V$V$W$M$i$n# 8#j$X$Y$V$V$Y$V$Y$V$V$V$Y$W$W$V$R$W$V$Y$X$V$V$W$W$V$W$Y$A$K# ",
-" w#`$Y$ % %Z$Z$Z$ %V$ %.% % % %Z$ % %V$+% %V$+% % %V$ %V$x$u# d@@%#% %Z$ %V$ % %V$Z$V$ %$%V$ %V$Z$.%V$ % %.% % % % %%%Y$d$&% u#`$X$ % %V$V$ % % % %.%V$ % % %V$ %Z$Z$ % %Z$V$ %V$$%W$q$*% ",
-" |@U#K$=%-%=%$%;%>%-%>%>%>%>%>%>%-%;%;%-%>%.%;%-%$%=%-%>% %v$k# V@3$+%,%;%;%-%>%;%>% %>%,%;%;%$%$%-%;%$%-%;%>%$%;%>%-%>%+%5$+# f@%$J$=%=%=%$%;%$%$%$%>%;%>%>%;%;%;%>%-%;%-%>%-%-%$%;%'%Z$k$a# ",
-" I@5$W$>%)%!%!%~%!%{%!%]%{%!%!%^%{%^%^%!%!%~%^%!%^%^%!%^%Z$m$/# /%q$ %(%!%{%^%!%!%^%!%(%]%^%!%^%^%!%^%!%!%^%!%!%!%{%!%;%R$)$ +#9$Z$>%_%]%^%^%(%(%^%^%!%!%(%~%!%!%^%{%!%:%^%!%!%^%{%^% %d$<% ",
-" _#k$-%:%:%:%[%:%[%~%[%[%[%:%[%:%[%~%:%~%~%:%:%~%:%:%[%~%}%a$ J#K${%[%:%[%[%:%[%~%[%~%~%:%~%:%~%[%:%[%[%[%:%[%~%[%:%!%R$~$ |%k$-%~%~%[%[%[%1%[%[%:%[%~%[%:%1%[%~%[%:%~%~%:%~%:%[%^% %5$ ",
-" x#F$^%[%[%[%[%[%2%[%[%2%[%[%2%1%[%2%[%2%[%1%[%[%[%[%[%[%Z$,$ 5@$$W$:%1%[%2%[%[%2%2%[%[%1%2%[%[%[%[%[%[%[%[%2%[%[%2%[%!%I$F# u#F${%1%[%[%[%[%[%[%[%2%[%[%[%2%[%2%2%1%[%[%2%3%[%[%[%~%Y$>$ ",
-" *$4%5%6%6%6%6%6%2%6%6%6%6%6%2%6%6%2%6%6%2%6%6%6%6%6%6%7%R$U# V@8%9%5%2%6%6%6%6%2%6%6%2%6%6%6%6%6%6%6%6%6%6%6%2%6%6%5%0%u$k# a%V$5%6%6%6%6%6%6%6%6%6%2%6%6%6%6%2%6%6%6%2%6%6%6%6%6%7%b%T# ",
-" A@c%d%5%e%f%6%g%h%6%g%g%i%f%i%g%6%6%f%i%6%g%f%6%g%g%6%j%k%l%m% _#n%o%6%p%g%e%6%g%g%f%6%i%g%6%e%f%6%j%f%6%g%g%g%6%i%q%6%r%s%)# O@t%u%6%i%g%f%6%v%g%f%i%q%6%f%h%f%f%g%g%6%6%i%6%e%g%6%6%w%x%y% ",
-" z%A%B%v%C%C%e%D%C%C%e%v%E%F%e%e%G%e%e%e%v%F%e%v%C%F%q%i%H%I%J% K%L%M%g%v%F%F%C%g%f%v%e%v%v%C%v%g%v%v%F%C%i%C%C%f%F%q%N%O%c% P%s%o%i%C%F%e%F%C%v%e%F%C%F%v%Q%F%f%e%e%e%R%g%C%C%e%e%v%S%T%U% ",
-" V%W%X%Y%Z%`%`%Z%`%Z%`% &Z%`%Z%`%`%Z%`%Z%`%Z%`%`%`%`%C%Y%.&+& @&#&$&%&Z%Z%`%Z%`%Z%Z%%&`%C%Y%Z%Y%`%`%Y%&&*&`%Y%`%Z%Z%v%=&-& K%;&>&Y%,&Z%Z%Z%C%`%C%Z%`%`%Z%Z%Y%`%Z%Z%Y%Y%Y%`%Z%Z%Z%Y%B%'& ",
-" )&!&~&{&]&{&^&]&]&^&^&]&^&^&]&/&]&^&]&/&]&^&^&^&/&]&^&(&_&:& <&[&}&|&^&^&^&]&^&/&/&]&^&]&^&]&^&^&^&/&]&^&/&]&^&^&^&]&1&2&3& 4&5&6&(&/&^&^&]&]&]&^&^&/&^&^&]&^&^&]&]&^&/&^&]&]&^&^&(&_&7& ",
-" 8&9&_&0&]&/&]&]&]&a&a&/&a&a&]&]&]&a&a&]&]&a&a&]&]&/&]&]&(&b&c& d&e&f&]&a&]&]&a&/&/&]&]&a&a&/&a&a&/&/&]&]&]&]&a&a&]&/&a&g&h&i& j&k&l&m&]&a&]&]&]&]&]&]&a&a&]&]&a&a&]&]&]&a&a&]&]&a&]&]&n&o&p& ",
-" q&r&f&]&a&a&a&s&a&a&t&a&a&a&a&a&a&a&a&a&]&a&a&a&a&a&a&a&(&u&v& i&w&n&]&a&a&a&a&]&a&a&a&a&a&]&a&a&a&a&a&a&t&a&a&a&t&a&x&y&z& A&B&f&]&/&a&a&a&a&a&a&t&a&C&a&a&a&a&/&a&a&C&a&a&D&a&a&]&n&E&F& ",
-" G&H&I&t&J&K&t&t&K&K&t&t&J&L&M&K&J&s&L&J&t&M&L&L&t&t&t&N&O&P&Q& R&S&O&J&K&K&K&K&J&L&M&t&s&K&N&L&L&t&T&K&t&t&t&K&N&K&K&U&V&W& X&Y&Z&N&K&J&M&t&L&L&t&t&K&t&J&N&K&K&K&L&K&t&N&K&L&J&t&t&Z&`& * ",
-" .*+*@*#*K&#*K&#*J&$*%*J&#*$*#*J&#*$*#*%*$*$*$*J&K&#*J&$*&*** =*-*J&#*#*#*#*#*$*;*%*J&#*#*#*$*>*J&#*$*J&$*J&#*#*J&J&,*'*)* !*~*{*J&#*#*%*J&J&#*$*K&J&#*J&J&#*#*$*L&#*J&J&J&J&#*$*]*^*/* ",
-" (*_*:*$*<*[*[*}*[*$*$*}*<*$*$*<*$*}*$*$*$*[*}*#*<*#*[*:*|*1* 2*/*3*:*[*$*#*<*$*$*[*:*[*[*}*#*<*[*$*}*:*[*$*<*[*:*}*4*%*5*6* 7*8*:*$*<*$*}*$*<*[*[*}*[*#*:*<*$*$*[*<*$*[*}*#*}*$*9*%*|*0* ",
-" a*b*c*:*d*<*e*f*<*<*<*f*d*e*<*f*e*g*<*<*<*d*f*<*f*<*<*f*:*h*i* j*k*l*e*<*<*d*<*<*d*g*<*<*d*<*f*d*<*<*g*<*<*d*<*g*f*d*<*:*+*m* n*o*c*p*d*<*d*<*<*<*<*f*<*<*g*f*<*<*g*f*e*<*f*<*g*<*<*<*q*_*r* ",
-" s*t*u*f*v*v*w*x*x*x*w*x*v*w*w*v*x*f*y*y*x*v*w*y*v*v*y*w*z*A*B* C*D*E*x*w*x*v*x*f*x*x*y*x*w*w*x*y*y*v*F*w*w*x*v*w*x*v*w*G*t* H*I*J*f*x*x*w*w*x*w*w*F*v*v*w*x*v*d*w*v*w*K*w*w*x*x*w*L*M*D*N* ",
-" ). O*P*z*v*Q*R*v*F*w*x*S*v*x*Q*S*S*v*T*Q*v*x*v*Q*x*T*U*V*W*X*Y*Z* `* =g*x*U*x*x*.=Q*S*v*Q*x*S*F*F*S*v*S*v*Q*x*y*x*U*v*F*W*G*+= @=#=$=F*Q*v*S*U*x*Q*S*v*w*Q*.=x*x*U*S*v*Q*v*S*x*v*v*U*%=&=*=== ",
-" [.-= ;=>=,=S*'=S*Q*S*'=)=U*S*)=S*)=U*'=)=S*'=U*!=S*)='=S*S*v*~={= ]=^=/='=Q*S*U*S*'=S*'=S*)=Q*Q*)=U*)=S*'=Q*S*'=!=S*Q*)=v*(=_= :=<=[='=}=)='=S*!=S*Q*Q*)=Q*S*S*!=S*!=!=Q*!=U*!=S*Q*'=|=1=2= ",
-" '+3= 4=5=}=!=6=7=6=6=6=7=7=6='=7=!=6='=8=7='='=7=7=9='=6=6=0=a=b= c=d=e=6=f=7=!=!=6=!=7='=g=6=h=!='=!=6='=6=6=h=7=7=7=6=!=i=j=k= l=m=!=6='=6=7='=7=h=!=7=7=7='=6=!=n=6=o=n=6=6='=!=6=p=.=q=r= ",
-" C+s=l= t=u=v=w=x=y=6=7=x=z=7=x=x=A=p=z=B=w=A=x=z=C=D=x=x=A=x=7=E=F=G= H=I=J=w=x=6=x=A=7=A=z=K=w=w=x=p=A=x=7=x=x=6=x=w=L=7=x=M=N=O=P= Q=R=S=z=T=B=x=6=C=x=6=x=z=x=6=w=w=T=x=z=K=x=A=z=x=x=A=w=/=U=V= ",
-" ]@W=X=Y= Z=`= -M=.-A=A=+-A=A=+-@-.-M=+-#-$-.-.-+-$-$-@-+-.-A=+-M=%-&-*- =---E=A=A=.-.-A=.-.-+-$-.-.-M=.-+-;-+-y=A=+-+-A=M=.-.-w=>-,- '-)-!-M=+-+-+-~-y=M=+-+-A=A=+-@-+-+-.-+-+-@-.-+-+-{-.-]-^-&-/- ",
-" s@(-_-:-<- [-}-|-.-.-1-1-.-1-1-.-1-.-.-.-.-.-@-.-1-.-.-1-.-.-1-1-.-2-3- 4-5-6-.-7-1-.-@-.-.-.-.-.-7-.-1-.-1-.-1-1-.-.-8-9-1-.-+-0-a- b-c-d-.-1-1-1-.-@-1-.-1-.-7-.-7-.-@-.-.-.-.-1-.-7-.-1-@-2-e- ",
-" f-g-h-6-i-j-k- l-m-n-1-1-8-o-8-8-p-p-p-p-p-p-p-p-q-p-p-8-1-1-p-1-8-o-@-r-s- t-u-v-$-8-p-p-p-p-p-p-p-1-p-q-o-.-1-1-1-1-p-1-1-o-p-p-w-q-x-y- z-A-9-o-1-1-1-1-1-p-p-q-1-p-p-p-p-p-p-p-o-o-8-p-.-1-1-@-r-B- ",
-" 6.C-D-E-F-G-H- I-J-K-F-F-F-F-F-F-F-F-F-L-F-F-M-F-F-M-F-F-M-F-F-F-F-F-N-O-P- Q-R-S-w-F-F-F-M-F-F-M-F-F-M-M-F-M-F-F-F-F-F-F-F-F-F-F-M-N-T-U- V-W-w-F-F-F-F-F-F-F-F-F-F-F-F-M-F-F-F-M-F-M-M-F-F-M-F-K-X-Y- ",
-" Y.Z-`- ; ;.;+;@; #;$;%;&;*;M-=; ; ; ;=;=; ;-;=; ;=; ;M- ; ; ;M- ; ;M- ; ;E-;;>; ,;';); ; ; ; ; ;M- ; ;=; ;M- ; ;M- ;!; ;L- ; ; ; ;=; ;~;{;];C- ^;/;(;&;_; ;M-!;=;-; ; ; ; ; ; ; ;M-M- ; ; ;M- ; ; ;M-!;:;<;[; ",
-" B+};|;1;1;2;_;3;4; 5;6;7;!; ;1;!;!;!;!;=;!;8;=;!;1;!; ;!;1;!;!;1;!; ;!;1;_;9;0;a; };b;c;1; ;!;d;1; ;1;1;!;!;!;1;!;1;8; ;!;1;!;1;!; ;!;8; ;e;f; g;h;i;j;k;1;8;1;1;!;!;1;d; ;!;1;l;M-!;!;1;1;1;1;!;!;l;_;i;m;n; ",
-" q@o;p;8;q;r;s;t;u;v; w;x;y;z;A;z;s;8;r;r;8;8;s;r;l;s;r;l;r;s;B;l;8;r;8;A;r;C;D;E; F;G;_;s;B;8;l;s;l;r;s;s;8;H;B;A;8;r;s;l;s;l;s;s;B;8;I;J;K;L; M;N;O;P;P;8;s;l;z;r;s;8;s;B;8;l;s;8;s;r;r;8;A;s;s;l;s;l;Q;R; ",
-" N+S;T;U;V;W;W;W;X;Y;Z; `; >.>+>@>W;W;+>+>W;r;U;+>W;W;#>+>V;W;W;+>W;W;W;+>W;W;W;$>%> &>*>=>->W;W;q;U;W;W;#>#>W;W;W;@>W;W;+>@>W;W;W;U;W;W;q;W;J;;>>> ,>'>)>!>W;W;+>U;+>W;U;W;W;W;s;W;W;W;V;V;W;+>W;W;+>W;W;->~>*> ",
-" |@{>]>^>/>/>(>^>_>:><> [>}>|>1>/>_>/>(>^>2>#>^>1>/>/>2>(>/>/>^>/>/>3>^>/>/>/>4>5>6> 7>8>9>/>1>_>V;1>/>_>/>1>_>/>^>^>_>^>^>(>(>/>/>^>^>_>(>^>0>a>b> c>d>e>|>^>/>^>/>/>2>/>_>3>^>1>#>^>f>/>(>^>/>/>(>^>/>1>^>4>g>h> ",
-" i>j>k>1>1>^>^>1>^>l>m>n> o>p>q>r>^>^>^>^>1>1>1>1>^>1>^>^>1>1>^>1>^>^>1>1>^>1>^>3>s>t>u> v>w>x>1>^>1>^>1>1>^>^>^>1>^>1>^>^>1>^>^>1>^>1>^>^>^>^>(>y>z>A> B>C>:>r>^>1>^>^>(>^>2>^>^>2>1>^>1>^>^>1>^>1>^>1>^>^>1>^>D>E>*$ ",
-" F>G>H>I>J>J>I>J>K>J>/>L>M> N>O>P>^>3>^>K>^>I>I>1>I>K>I>J>J>I>K>^>I>J>^>K>K>^>3>I>3>Q>G>R> S>T>U>J>^>J>J>J>J>I>J>I>1>K>J>1>V>J>2>1>K>I>^>J>^>J>K>^>W>X> R>Y>D>J>^>^>I>^>(>I>^>^>K>I>^>I>J>K>J>K>I>^>Z>J>^>^>J>3>`> ,., ",
-" O.+,@,#,$,%,%,&,*,=,-,;,>,,,', ),!,>,%,%,*,*,*,$,~,*,%,$,$,%,;,*,*,&,%,%,$,*,*,%,%,-,J>{,], ^,/,(,-,*,;,%,;,*,%,~,-,$,=,;,%,%,;,%,-,*,$,*,~,~,%,*,J>_,:, <,,,[,-,%,~,*,%,*,~,*,%,~,%,*,%,%,*,%,%,},-,I>*,%,$,~,|,{,1, ",
-" 2,3,4,5,6,5,7,5,8,5,5,6,9,0,a,b, c,d,#,5,e,8,e,6,7,e,5,e,e,5,5,8,e,8,9,5,6,e,8,5,e,8,e,f,g,h, i,j,k,l,8,7,7,7,e,5,7,m,e,5,e,5,e,7,7,e,e,6,8,9,6,7,8,5,n,4,o, p,q,r,5,e,e,7,8,5,e,8,s,l,e,5,5,e,7,5,5,8,5,8,7,6,6,7,f,t,u, ",
-" v,w,x,y,z,y,z,z,A,z,9,z,z,B,C,D, E,F,G,H,I,z,J,z,7,z,y,K,L,z,z,A,z,z,B,L,z,y,z,A,L,z,y,I,f,M,N, O,P,Q,y,y,z,z,z,z,y,L,z,z,J,z,J,z,z,z,y,z,z,9,y,y,A,y,L,R,S,T, U,V,G,B,A,y,z,z,9,z,y,L,y,y,z,z,z,z,L,y,z,z,J,z,z,y,z,I,W,X,Y, ",
-" -#Z,`,A, 'z, ' ' ' '.' ' '+'z,@'#' $'%'&'*' 'z, 'z, 'A,='+' ' ' ' ' 'z, ' 'A, ' '+' 'A, 'z,-';'>' ,''')'z, ' ' ' ' ' ' ' 'z, 'z, ' ' 'A, ' 'z,A,A, 'A, '.'!'~' {']'^'A,A, ' '*' 'A, 'A,A, ' ' ' ' ' ' ' 'z, ' 'A, ' 'z,/'('_' ",
-" [@:'<'['}'|'|'}'}'|'1'}'}'|'2'3'4'5' 6'7'8'|'|'}'|'}'|'}'}'}'}'}'}'|'1'}'|'|'}'9'}'}'|'|'|'|'8'0'a' b'c'd'}'}'|'}'|'}'|'}'1'|'}'|'9'}'|'|'|'|'}'}'|'}'}'}'e'f'g' h'i'j'|'}'}'}'}'}'|'|'|'}'}'}'|'|'}'|'}'1'}'|'}'9'}'|'2'k'l' ",
-" m'n'8'1'1'1'1'}'1'}'|'1'1'1'1'1'o'p'q' r's't'|'1'|'1'1'1'1'1'1'}'1'1'|'1'1'1'1'1'1'u'v'w'}'1'x'y'z' A'B'9'1'1'w'}'1'w'}'}'u'u'1'1'u'1'1'C'}'1'1'1'1'1'1'}'D'E'F' G'H'I'w'1'}'1'|'1'}'w'1'1'1'1'1'['u'}'|'1'1'1'1'1'1'1'e'J'K'",
-" L'M'N'O'P'1'P'Q'O'P'1'R'O'u'Q'S'T'U'V'W' X'Y'Z'Q'P'Q'`'O'Q'R'O'P'Q'Q'u'P'Q'u'P'Q'P'1'P'P'P'Q'Q'x' ).) +)@)k'P'Q'O'`'P'Q'Q'P'O'`'P'Q'Q'1'P'#)u'Q'1'Q'P'Q'R'P'$)%)H'&) *)B'x'$)u'P'Q'O'P'=)u'Q'P'P'P'`'-)Q'u'O'Q'u'P'Q'w'P'P';)>)",
-" ,)')))!)~)~){)])^)/)(){)_)_)])/)~){):)<) [)})|){)1)~)/)1)2)~)_){)/)/)1){)3)/)/)~){)4){)3)1)~){)1)5)6)7) 8)9)N'{)_)1){)/)0){)1)~)/)a)/)$){)1)/)~){)!){)$)1)/)/)1)b)c)d) e)f):){)]){)3)1){){)1)g)~)1)3)1)1)0)1)1)/)]){){)a)1)/)!)h)",
-" i)j)k)l)m)0)n)_)o)p)q)1)r)p)g)m)m)n){)s)t) u)v)w)^)q)p)r)^)x)r)q)!)p)m)1)m)l)p)1)m)q)n)l)q)q)p)p)_)5)y)z) A)y)B)p)m)1)p)l)1)/)^)p)/)^)q)p)r)m)^)p)p)m)^)r)m)m)p)n)C)D) E)F)G)m)l)l)H)1)l)p)p)q)p)m)1)H)l)/){)!)o)^)^)q)p)p)p)/)",
-" I)J)K)n)L)M)p)M)p)M)N)!)O)N)N)p)M)M)N)M)P)Q)R) S)T)U)M)M)M)N)V)N)p)M)M)o)O)M)M)N)O)M)M)N)M)N)M)N)N)M)p)W)X)Y) Z)`)P)p)p)N)M)p)V)M)M)p)N)N)N)M)M)M)M)M)M)M) !O)N)N)M)^).!+! @!#!$!p)M)M)M)M)M)M)M)M)O)m)N)M)p)p)M)M)p)N)M)N)N)M)M)",
-" %!&!*!=!-!;!;!=!=!=!=!=!=!=!=!=!=!M)=!=!=!k)>!,! '!)!!!=!=!=!=!=!;!=!=!=!=!=!=!=!=!L)M)=!=!=!N)=!=!=!=!N)~!{! ]!^!/!=!=!;!=!=!N);!=!=!=!M);!;!M)=!=!=!=!=!=!=!=!=!=!(!_!:! <!Q)P)N)=!=!M)=!=!=!=!=!=!=!=!=!=!=!N);!=!;!M)=!=!;!",
-" [!}!|!-!-!=!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!1!2! 3!4!N)-!=!-!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!5!6!7! 8!9!0!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!=!-!-!-!a!b!)!c! d!6! !-!-!=!-!-!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!",
-" e!f!g!h!i!j!j!k!j!j!l!-!j!l!l!j!j!m!l!-!l!k!-!n!o! p!q!r!s!i!j!m!t!j!j!-!j!t!j!j!j!i!i!-!j!i!j!t!i!j!t!i!j!u!v!w! x!y!z!t!j!-!j!l!k!-!j!i!a!A!k!j!j!i!i!i!B!j!j!j!l!-!j!l!C!D!E! F!G!H!k!i!j!i!m!j!j!l!-!j!j!-!t!j!I!l!J!k!l!-!m!K!",
-" L!M!N!O!m!P!Q!P!s!R!R!R!Q!Q!R!Q!m!R!R!m!P!R!R!B!S!T! U!V!W!P!R!Q!s!R!X!m!Q!Q!P!R!P!Q!R!Y!P!Q!R!s!P!R!P!P!s!Q!Z!`! ~ .~+~I!m!i!R!@~#~Y!$~P!Q!k!R!Q!Q!P!s!R!R!Y!R!%~R!#~P!Q!s!&~*~ =~-~C!Y!Q!R!m!P!Q!P!m!O!Q!P!Q!Q!P!R!R!R!R!i!k!R!",
-" ;~>~,~'~'~)~!~~~'~'~O!'~)~)~)~{~%~{~'~'~Q!'~]~%~^~/~(~ _~:~<~{~%~{~)~)~R!~~)~'~[~'~)~{~{~O!'~}~O!)~'~'~O!{~~~'~|~1~ T!2~P!'~3~)~[~!~R!{~~~)~)~~~4~R!{~)~{~{~}~{~)~'~O!'~)~5~6~7~ 8~9~^~}~)~'~O!)~O!R!!~)~!~{~)~'~{~%~)~)~!~#~4~",
-" 0~1~a~b~c~d~c~e~f~e~e~g~e~e~c~c~f~c~e~e~c~e~[~b~e~h~i~j~ k~l~m~g~c~e~e~e~e~e~c~c~f~c~n~g~c~c~o~e~b~e~p~e~c~d~e~o~q~r~ s~t~u~{~p~n~c~f~c~c~e~b~c~v~f~e~f~d~c~c~d~w~d~e~e~b~f~x~y~z~A~ B~C~D~n~c~e~e~e~e~e~d~e~c~e~c~c~f~f~o~e~c~f~",
-" E~F~G~H~I~I~J~I~I~J~I~I~I~I~I~I~I~I~c~c~I~I~f~I~I~K~L~M~ N~O~P~I~I~I~J~I~J~J~I~J~I~c~f~I~I~Q~c~I~I~I~I~J~I~J~I~K~R~S~ T~U~,~J~J~I~I~I~I~c~Q~I~I~I~I~I~J~I~I~I~I~J~I~I~I~I~I~I~D~V~W~ t~X~K~I~I~I~I~I~J~I~I~I~J~I~I~I~I~Q~f~J~J~",
-" Y~Z~`~J~ { { { { { { {I~ { { { { { { { { {I~ { {I~ { {.{+{@{ #{${%{J~ { {I~ { { { { { { { {c~ { { {I~ { { { { { {H~ {d~&{*{ ={-{m~ { { {J~ { {J~H~ { {I~ { { { { { {I~ { { { { { { {;{>{ ,{'{){.{ { { { {!{~{ { { { { {I~ { { {c~ {",
-" {{]{^{/{!{/{/{!{/{!{/{/{!{!{!{!{!{/{!{!{/{/{!{!{!{!{/{({_{:{ <{[{}{/{/{!{!{/{/{/{!{!{/{/{/{!{!{!{!{!{!{!{!{!{/{/{!{|{1{2{3{ 4{5{^{/{!{!{/{!{/{!{/{!{/{!{/{/{!{!{/{!{/{!{!{!{!{/{!{|{6{7{ 8{9{0{|{!{!{!{!{!{/{/{!{!{/{!{!{/{/{!{!{",
-" a{b{c{d{e{f{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{({g{h{ i{j{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{l{m{ n{o{|{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{d{d{d{d{p{q{r{ s{t{({u{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{",
-" v{w{x{y{y{y{y{y{y{z{y{y{y{y{A{y{y{A{y{y{B{z{y{y{y{y{y{C{D{E{F{ G{H{I{y{y{y{y{y{J{y{J{A{y{K{y{y{y{y{y{y{y{y{y{z{y{y{y{z{L{M{ N{O{P{Q{y{y{y{z{C{y{y{y{y{y{y{y{y{y{z{y{y{y{y{A{y{y{y{z{R{S{T{ U{V{R{J{J{y{y{A{y{y{y{A{y{y{J{z{y{C{",
-" W{X{Y{Z{K{K{`{ ]Z{K{`{K{`{.]`{+]Z{`{Z{@].]K{Z{#]K{ ] ]@]$]%] &]*]=]C{`{K{-];]`{-]-]K{`{K{@]K{-]`{K{`{K{@]`{K{#]K{`{Z{C{>],] '])]x{@]-]`{;]K{.]K{#]@]K{ ]C{`{`{.]+]K{;]-]K{@].]`{`{K{!]~]{] ]]^]/]C{-]`{+]Z{`{K{-]@]K{-]`{-].]K{",
-" (]_]:]<]<][]<]<]+]<]<]}]|][]-]-]<]-]@]<]<]+]<]<]<][]<]Z{1]2] 3]4]5]6]<]Z{+]<]7]+]<][]K{<]<]-]}]<][]<]<][]-]<]<][]Z{8]C{9]0] a]b]c]@][]<]@]+]<]<]<]<][]<]<]<]<]+]<]+]-]<]<]|][]<]@]|]d]e] f]g]h]-][][]Z{[]<]-]}]<]@]<]<]+]K{",
-" i]j]k]l]m]m]m]m]m]n]m]n]m]n]n]n]n]n]n]m]m]m]m]m]n]m]m]m]l]o]p] q]r]s]n]n]m]m]m]m]n]m][]m]m]n]n]n]n]m]m]m]n]m]m]m]n]n]t]u]r]v] w]x]y]m]m]n]m]n]n]m]m]m]m]n]m]m]z]m]m]n]n]m]m]m]m]n]m]n]A]B] C]D]E]n]n][]n]m]n]n]n]F]n]m]m]n]",
-" G]H]I]J]K]K]K]L]K]K]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]M]N]O]P] Q]R]N]S]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]K]n]K]J]T]U] V]W]X]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]n]K]K]K]K]K]K]K]n]W]Y] Z]`] ^K]L]K]K]K]m]K]K]K]K]K]K]",
-" .^+^@^K]L]K]m]L]L]L]L]L]L]L]L]L]K]K]L]K]L]L]L]L]L]L]n]M]#^$^%^ &^*^=^L]L]L]L]K]L]m]L]L]K]L]L]L]K]L]L]m]-^L]L]L]L]L];^K]>^j] ,^'^)^!^-^-^L]L]L]L]L]K]L]L]K]K]L]L]L]L]L]L]L]L]K]~^L]L]{^]^^^ /^(^S]K]L]L]L]L]L]L]L]K]K]K]",
-" _^:^<^[^[^}^[^|^1^|^1^L]|^1^1^}^|^|^L]1^2^|^1^1^|^}^[^1^y]3^ 4^5^6^L]1^2^1^1^|^L]1^L][^1^2^|^1^[^|^7^[^|^1^|^1^L]1^1^M]8^9^ 0^a^b^c^1^2^|^2^1^c^1^[^|^[^}^[^1^|^1^1^;^|^1^1^7^2^|^c^b^d^e^ f^g^h^i^j^[^2^|^[^L]1^1^1^c^",
-" k^l^m^n^o^o^p^p^q^r^r^o^q^p^r^o^o^o^s^o^o^r^o^p^o^o^p^t^u^v^ w^x^y^[^r^p^r^o^o^r^o^o^[^o^o^o^o^p^o^o^p^p^p^q^r^p^r^p^i^z^A^ B^C^D^t^o^o^r^s^E^o^o^p^p^o^o^p^p^r^q^r^o^F^o^q^o^o^r^t^y^G^ H^I^J^t^o^o^r^o^o^t^p^p^o^",
-" K^L^M^p^F^o^p^p^p^p^n^N^o^N^p^p^p^o^O^p^P^o^p^p^o^o^p^p^F^Q^R^ S^T^U^p^N^o^N^o^p^p^N^O^p^N^p^o^p^t^o^p^p^p^p^p^V^o^O^t^W^X^Y^ Z^`^F^p^p^o^O^ /p^o^p^p^o^o^./p^o^p^O^N^./o^p^p^p^o^ /n^+/L^ @/#/$/p^./%/o^o^ /p^N^o^",
-" H^&/*/n^O^n^n^ /././=/ /=/ / /=/n^-/ /;/>/ /n^n^O^n^O^n^,/'/)/ !/~/{/-/ /=/ / / /;/=/./=/ /=/O^N^O^O^ /O^./ /=/./=/./ /]/^/ //(/p^-/ /-/_/./O^O^n^n^n^ /=/ / /_/=/=/./././=/ /:/</[/}/|/ 1/2/3/>/</./ /./>/=/ /",
-" 4/5/6/7/8/9/8/8/-/-/9/0/a/>/0/7/9/7/9/7/7/7/8/7/8/b/c/9/d/e/f/ g/h/_/8/0/-/./i/0/b/7/9/7/0/7/9/8/7/9/8/9/8/9/-/0/-/_/-/j/k/ l/m/n/>/7/9/8/7/7/7/8/9/0/-/7/9/8/-/-/7/7/ /b/0/7/o/c/9/p/q/r/ s/h/t/7/8/9/-/9/7/-/",
-" u/v/t/w/x/y/0/0/y/y/y/z/y/y/y/0/0/x/A/7/y/0/0/y/x/z/0/9/B/C/ D/E/F/z/x/0/z/x/y/G/7/y/x/0/y/z/0/y/y/y/0/0/H/y/y/0/H/I/J/K/L/ M/N/O/0/-/y/y/0/y/x/0/0/0/y/z/0/0/y/x/z/0/x/y/z/9/y/x/z/P/Q/R/ S/E/n/T/0/0/y/y/H/0/",
-" U/V/W/x/x/x/X/x/x/Y/X/x/X/Z/x/`/ (x/x/`/w/`/x/x/x/x/X/.(V/+( @(#($(%(Z/x/`/X/X/`/X/y/x/x/w/x/`/x/y/x/X/`/x/x/X/x/&(Z/*(5/=( -(;(>(`/X/x/x/x/y/w/`/x/`/`/`/X/x/X/Z/`/`/X/X/`/X/x/x/,('()( !(~(P/.(Z/x/x/Z/X/",
-" {(](^(Z//(((((_(((:(((_(((:(((_(:(<([(((Z/_(_(((<(((((}(I/|(1( 2(3(4(((((_(Z/((_(((X/_(_(Z/((_(((Z/((((_(((:(((((((:(((5(6( 7(8(%(_(X/_(9(((Z/[(((_(((((((((:(:(((_(((Z/[(_(X/_(0(%(a(b( c(d(e(((((((X/((",
-" f(g(h(i(j([(k([(_([(l(m(_(_(n(_(9(n([(_(n(o([(i([(n(p(o(q(r(s( t(u(v(l(n(_(w(w(_([(n([(_([([([(p([([(x(n(_([([(y((([(w(z(A( D/B(z(_(9([(i(_(_(k([(k(n([([([(_(_(_(k(_([(k([([(n(w([(C(D(E( F(G((([(l(<([(",
-" H(I(J(K(L(L(L(M(N(n(p(O(p(M(P(L(Q(L(i(N(i(i(L(L(L(L(L(N(R(S( T(U(n(L(O(K(V(N(O(W(i(i(W(p(L(L(L(L(L(L(L(V(p(w(X(K(L(Y(Z(`( _._+_@_P(k(i(i(L(i(L(L(L(L(L(L(V(L(L(L(V(K(M(O(N(p(p(M(#_$_%_ &_*_n(k(M(X(",
-" =_-_Y(;_;_>_,_,_P('_)_;_;_,_>_,_;_O(!_,_;_;_;_;_;_,_,_>_~_{_ ]_^_/_P((_;_,_,_O(;_,_O(__,_;_;_,_;_,_O('_;_'_@_,_;_,_,_k(:_<_ [_}_|_(_,_;_>_,_,_;_;_,_,_;_>_,_;_O(,_>_;_)_1_,_,_;_2_,_3_4_5_ 6_7_8_L(,_;_",
-" 9_0_a_b_!_1_)_c_1_,_b_)_,_!_c_1_,_b_d_(_!_,_)_b_,_1_e_(_f_g_ h_4_i_a_b_e_,_,_c_d_>_!_b_1_!_)_,_!_b_1_,_c_d_1_!_)_)_)_j_k_l_ m_n_o_p_1_e_b_e_!_)_1_e_c_1_1_p_b_>_)_p_,_)_b_e_1_e_c_q_r_s_ t_u_v_N(!_",
-" w_x_y_z_z_A_!_B_b_c_c_C_p_b_b_b_b_b_b_D_B_c_b_E_F_C_!_z_G_H_I_ J_K_L_M_B_b_b_b_b_p_b_p_b_E_C_c_b_F_B_b_c_A_N_c_B_b_p_p_O_P_ T(Q_R_S_b_b_b_N_C_C_c_F_B_C_c_C_b_E_B_B_p_b_b_b_b_b_p_p_T_U_ V_W_X_E_",
-" Y_Z_`_c_ :.:b_+:@:S_@:#:.:@:$:%:&:@:F_z_+:S_F_E_*:+:!_=:-:;:>: ,:':):!:~:.:$:%:.:E_.:+:+:z_F_#:c_@:@:c_E_ :S_@:.:.:%:#:{:{_ ]:^:/:(:_:_:+:+:#:F_z_c_F_@:=:+:@:.:$:::.:S_@:+:~:z_+:#:<:[:,: }:|:1:",
-" 2:3:4:5:6:7:8:9:0:a:b:c:d:e:8:c:f:0:g:0:h:d:e:i:6:7:j:k:l:m: n:o:e:p:q:r:s:t:u:j:0:6:v:w:x:r:9:9:e:r:5:v:y:z:q:r:b:A:B:C: D:E:F:G:g:v:d:f:b:v:H:v:5:I:7:g:d:J:p:K:r:r:7:8:u:v:x:u:L:M:N: O:P:Q:",
-" R:S:T:U:U:V:W:V:8:X:5:V:W:W:Y:5:5:V:V:Z:`:V:V:V:U:U:V: <.<+< @<#<$<X:Z:W:%<U:U:V:V:&<V:5:5:U:W:V:U:V:V:U:8:5:G:V:W:V:*<=<-< ;<><,<V:U:&<X:V:5:'<V:V:U:5:U:i:Z:Z:i:V:Z:V:V:V:V:W:W:)<!<~< {<]<",
-" ^</<(<_<:<Y:W:<<<<:<'<'<[<Y:V:'<U:W:Y:Z:U:'<W:9:'<'<W:<<}<|<1< 2<3<4<5<'<:<:<V:U:'<U:Y:W:W:'<Y:_<Y:Y:W:'<<<:<'<Y:[<'<G:6<7<8< 9<0<*<'<U:U:U:Z:Y:'<_<V::<'<U:a<<<'<'<'<[<V:V:'<U:U:U:b<c<d< e<",
-" f<g<h<i<j<j<k<k<l<m<m<k<n<j<n<k<j<k<n<n<o<n<n<m<j<n<k<k<p<q<r< s<t<u<v<n<m<j<j<k<n<m<m<j<k<j<m<n<m<j<m<o<j<j<m<m<n<j<j<w<x< y<z<A<m<n<k<j<m<m<n<o<o<j<n<k<o<n<k<n<k<j<j<k<m<n<k<j<B<C<D< ",
-" E<F<G<H<I<J<K<L<M<H<N<N<I<N<H<M<l<N<H<I<H<L<M<H<K<N<H<L<O<P<Q< R<S<T<N<U<M<J<N<J<l<L<U<I<J<I<K<H<M<J<K<N<I<H<N<H<K<N<V<W<X< Y<Z<`<H<j< [.[L<M<M<l<N<N<K<L<M<H<N<H<H<N<K<H<H< [I<.[+[@[#[$[ ",
-" %[&[*[l<H<N<L<L<.[M< [M<J<l< [H<J<N<I<l<K<M< [j<N<I<L<L<=[-[ ;[>[,[L<n<l<.[ [I<L<M<L<L<I<l<N<l<l<J<.[N<K<.[L<l<I<H< ['[)[![ ~[{[][K<N< [N<I<k<L<K<J<K<.[H<M<K<N<l<n<N<K< [K<N<I<N<^[/[([_[ ",
-" :[<[[[}[M<U<}[U<}[L<|[U<J<U<1[K<2[}[H<+[U<}[ [U<M<U<}[H<3[4[ 5[6[7[N<U<8[J<U<}[J<H<2[2[ [}[.[N<H<L<.[U<}[U<J<}[9[J<U<0[a[b[ c[d[e[U< [}[}[I<.[J<f[J<N<J<U<9[U<U<N<|[N<.[U<U<M<2[9[g[h[i[ ",
-" j[k[l[9[m[n[9[|[m[o[p[o[q[n[2[m[r[8[o[p[r[s[r[8[r[t[9[u[v[w[x[ y[z[A[n[B[C[t[}[u[C[8[r[n[p[D[r[8[n[r[9[8[o[C[p[r[C[o[1[E[F[G[ H[I[J[r[r[r[o[8[n[B[8[9[r[B[p[t[s[B[u[C[s[2[8[s[K[p[s[p[L[M[ ",
-" N[O[P[Q[R[D[S[S[n[C[T[C[B[S[U[V[q[Q[D[R[U[s[R[R[R[C[W[S[X[Y[Z[ `[ }.}T[R[q[o[V[T[D[V[C[S[V[S[D[R[T[C[R[R[r[B[T[q[r[S[V[+}@} #}$}%}R[S[S[S[W[V[C[R[V[s[o[Q[s[p[S[V[S[B[R[&}S[S[S[S[%}*}=} ",
-" -};}>},},},}&}s[&}'}V[T['})}'}&},}'},}'},})}&}&}'}&}&}C[!}~} {}]},}&}&}'})})}&}'}R[)}&},}'}U[,},}'}&}D[Q['}T[V['})},}^}/} (}_}:}<}[}R['}U['}&}'}'}}}&}&}Q[s[,},}&}&}[})},}'}W[,}&}|}1}2} ",
-" 3}4}5}6})}7}[}8}7})})}7}V[7}[}9}T[U[7}[}Q['}6})}7}0}[}a}b}c} d}e}f}g}9}9},}V['}0}&}}}9}8}}})}[}9})}8})}7}7})}9}9}&}&}h}i}j} k}l}m}6})}R[,}8}9}6})}9}7}8}9}[}7})}9})}9}}}'}6})}R['}8}n};}o} ",
-" p}q},}9}r}9}8}s}t}8}7}8}t}8}t}u}t}s}8},}8}v}U[&}s}9}9}w}x}y} z}A}B}C}8}D}t}t}s}u}t}s}r},}'}s}8},}v}u}7}t}s}u}7}7}t}0}E}F}G} H}I}J}t}7}s}r}8}T[t}s})}s}u})}u}s}s}7}8}u}s}s}t}t}s}r}a}K}L} ",
-" M}N}O}s}r}9}8}r}s}u}s}P}Q}t}R}R}s}Q}S}s}s}T}U}v}T}8}r}r}V}W}X} Y}Z}`}u}P} |t}P}S}r}v}S}.|t}Q}r}r}v}8}7}r}r}8}t}R}S}t}r}+|@|#| $|%|Q}v}r}P}R}U}v}s}s}r}u}U[s}r}r}u}v} |r}&| |v}r}.|S}s}*|=| ",
-" -|;|>|S}v} |S}.|S}Q}R} |Q}T}P},|v}P}S},|P}'|)|P}S}'|)|P}!|~|{| ]|^|/|T}.|S}&|P}S}P}T}P},|P}P}'| |v}S})|Q} |Q}P} |P}T}R}(|_| :|<|R}S}v}P} |.|R},|,|Q}R}'|Q}.|S}P}S}S}T}U}P}S}T}T} |[|}||| ",
-" 1|2|3| |4|5|4|6|)|7|8|4|,|7|8| |)|S}9|4|4|7|'| |9|9| |7|0|a| b|c|d|8|9|,|7|4|6|)|.|9|)|'|7|5|)|e|e|)|9|'|7|f|e|,|7|5|g|h| i|j|+|e|S}7|7|e|)|)|9|)|7|9|7|8|4|5|4|8|'|'|5|f|'|,|)|4|k|l|m| ",
-" n|o|p|6|4|6|9|4|6|e|'|q|4|R}4|r|5|9|r|4|5|9|9|9|5|4|4|7|s|t| u|v|w|4|'|6|q| |7|q|7|4|q|q|)|4|e|9|4|4|e|4|9|9|)|8|8|P}x|y|z| A|B|C|D|8|4|r|f|)|4|7|'|9|9|6|6|9|9|5|5|r| | |q|9|'|8|E|F|G|H| ",
-" I|J|K|L|M|M|M|M|M|r|N|O|9|r|O|M|M|M|r|M|M|E|P|M|q|O|Q|R|S|T| U|V|W|E|r|M|8|8|M|M|M|O|r|M|O|q|Q|O|O|M|M|O|M|r|M|M|8|9|X|Y|Z| `| 1.1q|O|Q|q|Q|O|q|r|+1O|M|M|M|M|M|r|O|r|8|O|M|M|M|L|N|@1#1 ",
-" $1%1&1L|O|O|r|r|+1q|8|O|+1e|q|O|M|q|M|Q|r|q|Q|+1E|Q|M|r|*1=1-1 ;1>1,1'|r|+1q|5|O|O|q|r|O|M|8|O|Q|M|O|r|r|O|M|6|r|Q|8|e|'1)1 !1~1{1O|M|q|Q|Q|r|M|Q|M|O|r|r|M|+19|9|O|O|7|M|Q|M|q|Q|*1]1^1 ",
-" /1(1_1+1:1+1+1P|P|:1+1+1:1:1Q|P|+1Q|M|Q|O|O|M|Q|P|+1Q|<1[1}1|1 112131P|Q|P|P|Q|P|+1:1Q|+1Q|Q|O|Q|:1P|Q|P|:1:1P|+1:1:1415161 71819141P|Q|Q|Q|+1O|Q|Q|P|:1:1+1P|:1:1Q|P|+1P|+1P|P|Q|Q|01a1b1 ",
-" c1d1[1P|:1:1+1P|e1P|M|P|f1:1:1f1e1f1:1f1f1f1f1f1f1:1+1g1h1i1 j1k1l1P|P|f1:1:1m1:1:1f1f1f1f1:1P|:1:1P|Q|f1:1O|+1f1<1<1n1o1 p1q1r1e1f1e1f1f1f1e1f1P|f1:1P|Q|:1e1:1Q|f1:1:1e1e1:1e1s1t1u1v1 ",
-" w1x1y1m1m1m1m1z1z1f1m1A1m1f1e1m1z1e1A1A1z1m1A1A1m1z1z1B1C1D1 E1F1G1H1m1z1m1m1e1m1m1m1z1A1A1m1A1m1m1m1e1m1A1e1e1A1z1e1I1J1K1 L1M1N1e1A1A1e1A1A1e1m1m1m1m1m1m1A1m1m1z1m1m1e1e1m1m1m1z1O1P1Q1 "};
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.5"?>
-
-<product name="Simulator WIP" uid="sample" id="net.mograsim.rcp.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
-
- <aboutInfo>
- <text>
- Example
- </text>
- </aboutInfo>
-
- <configIni use="default">
- </configIni>
-
- <launcherArgs>
- <programArgs>-clearPersistedState
- </programArgs>
- <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
- </vmArgsMac>
- </launcherArgs>
-
- <windowImages i16="/net.mograsim.rcp/icons/app/ico_16t.png" i32="/net.mograsim.rcp/icons/app/ico_32t.png" i48="/net.mograsim.rcp/icons/app/ico_48t.png" i64="/net.mograsim.rcp/icons/app/ico_64t.png" i128="/net.mograsim.rcp/icons/app/ico_128t.png" i256="/net.mograsim.rcp/icons/app/ico_256t.png"/>
-
- <splash
- handlerType="extensible" />
- <launcher name="Sample">
- <linux icon="/net.mograsim.rcp/icons/app/ico_256t.xpm"/>
- <macosx icon="/net.mograsim.rcp/icons/app/ico_256t.icns"/>
- <win useIco="true">
- <ico path="/net.mograsim.rcp/icons/app/ico_all.ico"/>
- <bmp/>
- </win>
- </launcher>
-
-
- <vm>
- <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</linux>
- <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</macos>
- <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</windows>
- </vm>
-
- <license>
- <url>https://www.eclipse.org/legal/epl-2.0/</url>
- <text>
- Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler
-
-This program and the accompanying materials are made
-available under the terms of the Eclipse Public License 2.0
-which is available at https://www.eclipse.org/legal/epl-2.0/
-
-This Source Code may also be made available under the following Secondary
-Licenses when the conditions for such availability set forth in the Eclipse
-Public License, v. 2.0 are satisfied: GNU General Public License, version 2
-with the GNU Classpath Exception which is
-available at https://www.gnu.org/software/classpath/license.html.
-
-SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- </text>
- </license>
-
- <plugins>
- <plugin id="SWTBufferedCanvas"/>
- <plugin id="SWTObjectWrappers"/>
- <plugin id="SWTZoomableCanvas"/>
- <plugin id="com.ibm.icu"/>
- <plugin id="javax.annotation"/>
- <plugin id="javax.inject"/>
- <plugin id="javax.xml"/>
- <plugin id="net.mograsim.logic.core"/>
- <plugin id="net.mograsim.logic.ui"/>
- <plugin id="net.mograsim.rcp"/>
- <plugin id="org.apache.batik.constants"/>
- <plugin id="org.apache.batik.css"/>
- <plugin id="org.apache.batik.i18n"/>
- <plugin id="org.apache.batik.util"/>
- <plugin id="org.apache.commons.io"/>
- <plugin id="org.apache.commons.jxpath"/>
- <plugin id="org.apache.commons.logging"/>
- <plugin id="org.apache.xmlgraphics"/>
- <plugin id="org.eclipse.core.commands"/>
- <plugin id="org.eclipse.core.contenttype"/>
- <plugin id="org.eclipse.core.databinding"/>
- <plugin id="org.eclipse.core.databinding.observable"/>
- <plugin id="org.eclipse.core.databinding.property"/>
- <plugin id="org.eclipse.core.expressions"/>
- <plugin id="org.eclipse.core.jobs"/>
- <plugin id="org.eclipse.core.runtime"/>
- <plugin id="org.eclipse.e4.core.commands"/>
- <plugin id="org.eclipse.e4.core.contexts"/>
- <plugin id="org.eclipse.e4.core.di"/>
- <plugin id="org.eclipse.e4.core.di.annotations"/>
- <plugin id="org.eclipse.e4.core.di.extensions"/>
- <plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
- <plugin id="org.eclipse.e4.core.services"/>
- <plugin id="org.eclipse.e4.emf.xpath"/>
- <plugin id="org.eclipse.e4.ui.bindings"/>
- <plugin id="org.eclipse.e4.ui.css.core"/>
- <plugin id="org.eclipse.e4.ui.css.swt"/>
- <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
- <plugin id="org.eclipse.e4.ui.di"/>
- <plugin id="org.eclipse.e4.ui.model.workbench"/>
- <plugin id="org.eclipse.e4.ui.services"/>
- <plugin id="org.eclipse.e4.ui.widgets"/>
- <plugin id="org.eclipse.e4.ui.workbench"/>
- <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
- <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
- <plugin id="org.eclipse.e4.ui.workbench.swt"/>
- <plugin id="org.eclipse.e4.ui.workbench3"/>
- <plugin id="org.eclipse.emf.common"/>
- <plugin id="org.eclipse.emf.ecore"/>
- <plugin id="org.eclipse.emf.ecore.change"/>
- <plugin id="org.eclipse.emf.ecore.xmi"/>
- <plugin id="org.eclipse.equinox.app"/>
- <plugin id="org.eclipse.equinox.common"/>
- <plugin id="org.eclipse.equinox.preferences"/>
- <plugin id="org.eclipse.equinox.region" fragment="true"/>
- <plugin id="org.eclipse.equinox.registry"/>
- <plugin id="org.eclipse.equinox.supplement"/>
- <plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
- <plugin id="org.eclipse.equinox.weaving.hook" fragment="true"/>
- <plugin id="org.eclipse.help"/>
- <plugin id="org.eclipse.jface"/>
- <plugin id="org.eclipse.jface.databinding"/>
- <plugin id="org.eclipse.osgi"/>
- <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
- <plugin id="org.eclipse.osgi.services"/>
- <plugin id="org.eclipse.osgi.util"/>
- <plugin id="org.eclipse.swt"/>
- <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
- <plugin id="org.eclipse.ui.workbench"/>
- <plugin id="org.w3c.css.sac"/>
- <plugin id="org.w3c.dom.events"/>
- <plugin id="org.w3c.dom.smil"/>
- <plugin id="org.w3c.dom.svg"/>
- </plugins>
-
- <configurations>
- <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
- </configurations>
-
- <preferencesInfo>
- <targetfile overwrite="false"/>
- </preferencesInfo>
-
- <cssInfo>
- <file path="/net.mograsim.rcp/css/default.css"/>
- </cssInfo>
-
-</product>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
- <extension-point id="splashExtension" name="%extension-point.name" schema="schema/splashExtension.exsd"/>
-
- <extension
- id="product"
- point="org.eclipse.core.runtime.products">
- <product
- application="org.eclipse.e4.ui.workbench.swt.E4Application"
- name="Simulator WIP">
- <property
- name="applicationCSS"
- value="platform:/plugin/net.mograsim.rcp/css/default.css">
- </property>
- <property
- name="appName"
- value="Simulator WIP">
- </property>
- <property
- name="windowImages"
- value="icons/app/ico_16t.png,icons/app/ico_32t.png,icons/app/ico_48t.png,icons/app/ico_64t.png,icons/app/ico_128t.png,icons/app/ico_256t.png">
- </property>
- <property
- name="aboutText"
- value="Example">
- </property>
- </product>
- </extension>
- <extension
- point="org.eclipse.ui.splashHandlers">
- <splashHandler
- class="net.mograsim.rcp.splashhandlers.ExtensibleSplashHandler"
- id="net.mograsim.rcp.splashHandlers.extensible">
- </splashHandler>
- <splashHandlerProductBinding
- productId="net.mograsim.rcp.product"
- splashId="net.mograsim.rcp.splashHandlers.extensible">
- </splashHandlerProductBinding>
- </extension>
- <extension
- point="net.mograsim.rcp.splashExtension">
- <splashExtension
- icon="icons/af.png"
- id="af"
- tooltip="Application Framework">
- </splashExtension>
- <splashExtension
- icon="icons/embedded.png"
- id="embedded"
- tooltip="Embedded">
- </splashExtension>
- <splashExtension
- icon="icons/enterprise.png"
- id="enterprise"
- tooltip="Enterprise">
- </splashExtension>
- <splashExtension
- icon="icons/languages.png"
- id="languages"
- tooltip="Languages">
- </splashExtension>
- <splashExtension
- icon="icons/rcp.png"
- id="rcp"
- tooltip="RCP">
- </splashExtension>
- </extension>
-
-</plugin>
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="Sample">
-<annotation>
- <appInfo>
- <meta.schema plugin="Sample" id="splashExtension" name="Splash Extensions"/>
- </appInfo>
- <documentation>
- [Enter description of this extension point.]
- </documentation>
- </annotation>
-
- <element name="extension">
- <complexType>
- <sequence minOccurs="1" maxOccurs="unbounded">
- <element ref="splashExtension"/>
- </sequence>
- <attribute name="point" type="string" use="required">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- <attribute name="id" type="string">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- <attribute name="name" type="string">
- <annotation>
- <documentation>
-
- </documentation>
- <appInfo>
- <meta.attribute translatable="true"/>
- </appInfo>
- </annotation>
- </attribute>
- </complexType>
- </element>
-
- <element name="splashExtension">
- <annotation>
- <appInfo>
- <meta.element labelAttribute="id" icon="icon"/>
- </appInfo>
- </annotation>
- <complexType>
- <attribute name="id" type="string" use="required">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- <attribute name="icon" type="string" use="required">
- <annotation>
- <documentation>
- 50x50 icon
- </documentation>
- <appInfo>
- <meta.attribute kind="resource"/>
- </appInfo>
- </annotation>
- </attribute>
- <attribute name="tooltip" type="string">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- </complexType>
- </element>
-
- <annotation>
- <appInfo>
- <meta.section type="since"/>
- </appInfo>
- <documentation>
- [Enter the first release in which this extension point appears.]
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="examples"/>
- </appInfo>
- <documentation>
- [Enter extension point usage example here.]
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="apiInfo"/>
- </appInfo>
- <documentation>
- [Enter API information here.]
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="implementation"/>
- </appInfo>
- <documentation>
- [Enter information about supplied implementation of this extension point.]
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="copyright"/>
- </appInfo>
- <documentation>
-
- </documentation>
- </annotation>
-
-</schema>
+++ /dev/null
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class AboutHandler
-{
- @Execute
- public void execute(Shell shell)
- {
- MessageDialog.openInformation(shell, "About", "Sample RCP4");
- }
-}
+++ /dev/null
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class OpenHandler
-{
-
- @Execute
- public void execute(Shell shell)
- {
- FileDialog dialog = new FileDialog(shell);
- dialog.open();
- }
-}
+++ /dev/null
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.e4.ui.workbench.IWorkbench;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class QuitHandler
-{
- @Execute
- public void execute(IWorkbench workbench, Shell shell)
- {
- if (MessageDialog.openConfirm(shell, "Confirmation", "Do you want to exit?"))
- {
- workbench.close();
- }
- }
-}
+++ /dev/null
-package net.mograsim.rcp.handlers;
-
-import org.eclipse.e4.core.di.annotations.CanExecute;
-import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.e4.ui.workbench.modeling.EPartService;
-
-public class SaveHandler
-{
-
- @CanExecute
- public boolean canExecute(EPartService partService)
- {
- if (partService != null)
- {
- return !partService.getDirtyParts().isEmpty();
- }
- return false;
- }
-
- @Execute
- public void execute(EPartService partService)
- {
- partService.saveAll(false);
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.rcp.parts;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-import net.mograsim.logic.ui.LogicExecuter;
-import net.mograsim.logic.ui.LogicUICanvas;
-import net.mograsim.logic.ui.examples.RSLatchExample;
-import net.mograsim.logic.ui.model.ViewModel;
-import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
-import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
-import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
-import net.mograsim.logic.core.timeline.Timeline;
-
-public class LogicUIPart
-{
- @Inject
- private MPart part;
-
- @PostConstruct
- public void create(Composite parent)
- {
- // setup view model
- ViewModel viewModel = new ViewModel();
- RSLatchExample.createRSLatchExample(viewModel);
-
- // convert to logic model
- LogicModelParameters params = new LogicModelParameters();
- params.gateProcessTime = 50;
- params.wireTravelTime = 10;
- Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
-
- // initialize UI
- LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE, viewModel);
- ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
- ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
- userInput.buttonDrag = 3;
- userInput.buttonZoom = 2;
- userInput.enableUserInput();
-
- // initialize executer
- LogicExecuter exec = new LogicExecuter(timeline);
-
- // run it
- exec.startLiveExecution();
-
- // TODO find a better condition when to stop
- ui.addDisposeListener(e -> exec.stopLiveExecution());
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.rcp.parts;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-
-import org.eclipse.e4.ui.di.Focus;
-import org.eclipse.e4.ui.di.Persist;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-public class SamplePart
-{
-
- private TableViewer tableViewer;
-
- @Inject
- private MPart part;
-
- @PostConstruct
- public void createComposite(Composite parent)
- {
- parent.setLayout(new GridLayout(1, false));
-
- Text txtInput = new Text(parent, SWT.BORDER);
- txtInput.setMessage("Enter text to mark part as dirty");
- txtInput.addModifyListener(e -> part.setDirty(true));
- txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- tableViewer = new TableViewer(parent);
-
- tableViewer.setContentProvider(ArrayContentProvider.getInstance());
- tableViewer.setInput(createInitialDataModel());
- tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
- }
-
- @Focus
- public void setFocus()
- {
- tableViewer.getTable().setFocus();
- }
-
- @Persist
- public void save()
- {
- part.setDirty(false);
- }
-
- private static List<String> createInitialDataModel()
- {
- return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.rcp.splashhandlers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.splash.AbstractSplashHandler;
-
-/**
- * @since 3.3
- *
- */
-public class ExtensibleSplashHandler extends AbstractSplashHandler
-{
-
- private ArrayList<Image> fImageList;
-
- private ArrayList<String> fTooltipList;
-
- private static final String F_SPLASH_EXTENSION_ID = "Sample.splashExtension"; // NON-NLS-1
-
- private static final String F_ELEMENT_ICON = "icon"; // NON-NLS-1
-
- private static final String F_ELEMENT_TOOLTIP = "tooltip"; // NON-NLS-1
-
- private static final String F_DEFAULT_TOOLTIP = "Image"; // NON-NLS-1
-
- private static final int F_IMAGE_WIDTH = 50;
-
- private static final int F_IMAGE_HEIGHT = 50;
-
- private static final int F_SPLASH_SCREEN_BEVEL = 5;
-
- private Composite fIconPanel;
-
- /**
- *
- */
- public ExtensibleSplashHandler()
- {
- fImageList = new ArrayList<>();
- fTooltipList = new ArrayList<>();
- fIconPanel = null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets. Shell)
- */
- @Override
- public void init(Shell splash)
- {
- // Store the shell
- super.init(splash);
- // Configure the shell layout
- configureUISplash();
- // Load all splash extensions
- loadSplashExtensions();
- // If no splash extensions were loaded abort the splash handler
- if (!hasSplashExtensions())
- {
- return;
- }
- // Create UI
- createUI();
- // Configure the image panel bounds
- configureUICompositeIconPanelBounds();
- // Enter event loop and prevent the RCP application from
- // loading until all work is done
- doEventLoop();
- }
-
- /**
- * @return
- */
- private boolean hasSplashExtensions()
- {
- return !fImageList.isEmpty();
- }
-
- /**
- *
- */
- private void createUI()
- {
- // Create the icon panel
- createUICompositeIconPanel();
- // Create the images
- createUIImages();
- }
-
- /**
- *
- */
- private void createUIImages()
- {
- Iterator<Image> imageIterator = fImageList.iterator();
- Iterator<String> tooltipIterator = fTooltipList.iterator();
- int i = 1;
- int columnCount = ((GridLayout) fIconPanel.getLayout()).numColumns;
- // Create all the images
- // Abort if we run out of columns (left-over images will not fit within
- // the usable splash screen width)
- while (imageIterator.hasNext() && (i <= columnCount))
- {
- Image image = imageIterator.next();
- String tooltip = tooltipIterator.next();
- // Create the image using a label widget
- createUILabel(image, tooltip);
- i++;
- }
- }
-
- /**
- * @param image
- * @param tooltip
- */
- private void createUILabel(Image image, String tooltip)
- {
- // Create the label (no text)
- Label label = new Label(fIconPanel, SWT.NONE);
- label.setImage(image);
- label.setToolTipText(tooltip);
- }
-
- /**
- *
- */
- private void createUICompositeIconPanel()
- {
- Shell splash = getSplash();
- // Create the composite
- fIconPanel = new Composite(splash, SWT.NONE);
- // Determine the maximum number of columns that can fit on the splash
- // screen. One 50x50 image per column.
- int maxColumnCount = getUsableSplashScreenWidth() / F_IMAGE_WIDTH;
- // Limit size to the maximum number of columns if the number of images
- // exceed this amount; otherwise, use the exact number of columns
- // required.
- int actualColumnCount = Math.min(fImageList.size(), maxColumnCount);
- // Configure the layout
- GridLayout layout = new GridLayout(actualColumnCount, true);
- layout.horizontalSpacing = 0;
- layout.verticalSpacing = 0;
- layout.marginHeight = 0;
- layout.marginWidth = 0;
- fIconPanel.setLayout(layout);
- }
-
- /**
- *
- */
- private void configureUICompositeIconPanelBounds()
- {
- // Determine the size of the panel and position it at the bottom-right
- // of the splash screen.
- Point panelSize = fIconPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-
- int xCoord = getSplash().getSize().x - F_SPLASH_SCREEN_BEVEL - panelSize.x;
- int yCoord = getSplash().getSize().y - F_SPLASH_SCREEN_BEVEL - panelSize.y;
- int xWidth = panelSize.x;
- int yWidth = panelSize.y;
-
- fIconPanel.setBounds(xCoord, yCoord, xWidth, yWidth);
- }
-
- /**
- * @return
- */
- private int getUsableSplashScreenWidth()
- {
- // Splash screen width minus two graphic border bevel widths
- return getSplash().getSize().x - (F_SPLASH_SCREEN_BEVEL * 2);
- }
-
- /**
- *
- */
- private void loadSplashExtensions()
- {
- // Get all splash handler extensions
- IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();
- // Process all splash handler extensions
- for (int i = 0; i < extensions.length; i++)
- {
- processSplashExtension(extensions[i]);
- }
- }
-
- /**
- * @param extension
- */
- private void processSplashExtension(IExtension extension)
- {
- // Get all splash handler configuration elements
- IConfigurationElement[] elements = extension.getConfigurationElements();
- // Process all splash handler configuration elements
- for (int j = 0; j < elements.length; j++)
- {
- processSplashElements(elements[j]);
- }
- }
-
- /**
- * @param configurationElement
- */
- private void processSplashElements(IConfigurationElement configurationElement)
- {
- // Attribute: icon
- processSplashElementIcon(configurationElement);
- // Attribute: tooltip
- processSplashElementTooltip(configurationElement);
- }
-
- /**
- * @param configurationElement
- */
- private void processSplashElementTooltip(IConfigurationElement configurationElement)
- {
- // Get attribute tooltip
- String tooltip = configurationElement.getAttribute(F_ELEMENT_TOOLTIP);
- // If a tooltip is not defined, give it a default
- if ((tooltip == null) || (tooltip.length() == 0))
- {
- fTooltipList.add(F_DEFAULT_TOOLTIP);
- } else
- {
- fTooltipList.add(tooltip);
- }
- }
-
- /**
- * @param configurationElement
- */
- private void processSplashElementIcon(IConfigurationElement configurationElement)
- {
- // Get attribute icon
- String iconImageFilePath = configurationElement.getAttribute(F_ELEMENT_ICON);
- // Abort if an icon attribute was not specified
- if ((iconImageFilePath == null) || (iconImageFilePath.length() == 0))
- {
- return;
- }
- // Create a corresponding image descriptor
- ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getNamespaceIdentifier(),
- iconImageFilePath);
- // Abort if no corresponding image was found
- if (descriptor == null)
- {
- return;
- }
- // Create the image
- Image image = descriptor.createImage();
- // Abort if image creation failed
- if (image == null)
- {
- return;
- }
- // Abort if the image does not have dimensions of 50x50
- if ((image.getBounds().width != F_IMAGE_WIDTH) || (image.getBounds().height != F_IMAGE_HEIGHT))
- {
- // Dipose of the image
- image.dispose();
- return;
- }
- // Store the image and tooltip
- fImageList.add(image);
- }
-
- /**
- *
- */
- private void configureUISplash()
- {
- // Configure layout
- GridLayout layout = new GridLayout(1, true);
- getSplash().setLayout(layout);
- // Force shell to inherit the splash background
- getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT);
- }
-
- /**
- *
- */
- private void doEventLoop()
- {
- Shell splash = getSplash();
- if (!splash.getDisplay().readAndDispatch())
- {
- splash.getDisplay().sleep();
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.ui.splash.AbstractSplashHandler#dispose()
- */
- @Override
- public void dispose()
- {
- super.dispose();
- // Check to see if any images were defined
- if ((fImageList == null) || fImageList.isEmpty())
- {
- return;
- }
- // Dispose of all the images
- Iterator<Image> iterator = fImageList.iterator();
- while (iterator.hasNext())
- {
- Image image = iterator.next();
- image.dispose();
- }
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
- <attributes>
- <attribute name="module" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-/bin/
-*.class
-*.log
-
-# package files
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# vm crash logs
-hs_err_pid*
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>net.mograsim.logic.core</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.pde.PluginNature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=10
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.APILeak=warning
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=enabled
-org.eclipse.jdt.core.compiler.source=10
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
-org.eclipse.jdt.core.formatter.align_with_spaces=false
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=140
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
-org.eclipse.jdt.core.formatter.lineSplit=140
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=true
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
+++ /dev/null
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_MoGraSim
-formatter_settings_version=16
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_missing_override_annotations_interface_methods=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=false
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_functional_interfaces=true
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.insert_inferred_type_arguments=false
-sp_cleanup.make_local_variable_final=true
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_type_abstract_if_missing_method=false
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=true
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=false
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_redundant_modifiers=true
-sp_cleanup.remove_redundant_semicolons=true
-sp_cleanup.remove_redundant_type_arguments=true
-sp_cleanup.remove_trailing_whitespaces=true
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=true
-sp_cleanup.remove_unused_imports=true
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_anonymous_class_creation=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_lambda=true
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=true
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=true
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: net.mograsim.logic.core
-Bundle-SymbolicName: net.mograsim.logic.core
-Bundle-Version: 1.0.0.qualifier
-Export-Package: net.mograsim.logic.core,
- net.mograsim.logic.core.components,
- net.mograsim.logic.core.components.gates,
- net.mograsim.logic.core.tests,
- net.mograsim.logic.core.timeline,
- net.mograsim.logic.core.types,
- net.mograsim.logic.core.wires
-Bundle-RequiredExecutionEnvironment: JavaSE-10
-Automatic-Module-Name: net.mograsim.logic.core
+++ /dev/null
-source.. = src/
-bin.includes = META-INF/,\
- .
+++ /dev/null
-package net.mograsim.logic.core;
-
-import java.util.Arrays;
-
-import net.mograsim.logic.core.types.Bit;
-
-public final class Util
-{
-
- @SuppressWarnings("unchecked")
- public static <T> T[] concat(T[]... arrays)
- {
- if (arrays.length == 0)
- throw new IllegalArgumentException("Cannot concatenate 0 arrays.");
-
- int length = 0;
- for (T[] array : arrays)
- length += array.length;
-
- T[] newArray = Arrays.copyOf(arrays[0], length);
- int appendIndex = arrays[0].length;
- for (int i = 1; i < arrays.length; i++)
- {
- System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);
- appendIndex += arrays[i].length;
- }
-
- return newArray;
- }
-
-// @SuppressWarnings("unchecked")
-// public static <T> T[][] split(T[] array, int... lengths)
-// {
-// //TODO: implement array split again; This version contains an illegal cast
-// int totalLength = 0;
-// for(int length : lengths)
-// totalLength += length;
-//
-// if(totalLength != array.length)
-// throw new IllegalArgumentException(); //TODO: add proper error message
-//
-// Object[][] newArray = new Object[lengths.length][];
-// int splitIndex = 0;
-// for(int i = 0; i < lengths.length; i++)
-// {
-// System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);
-// splitIndex += lengths[i];
-// }
-//
-// return (T[][]) newArray;
-// }
-
- public static Bit[] and(Bit[] a, Bit[] b)
- {
- return binBitOp(a, b, Bit::and);
- }
-
- public static Bit[] or(Bit[] a, Bit[] b)
- {
- return binBitOp(a, b, Bit::or);
- }
-
- public static Bit[] xor(Bit[] a, Bit[] b)
- {
- return binBitOp(a, b, Bit::xor);
- }
-
- private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)
- {
- if (a.length != b.length)
- throw new IllegalArgumentException("Bit Arrays were not of equal length.");
- Bit[] out = new Bit[a.length];
- for (int i = 0; i < a.length; i++)
- {
- out[i] = op.execute(a[i], b[i]);
- }
- return out;
- }
-
- public static Bit[] not(Bit[] a)
- {
- Bit[] out = new Bit[a.length];
- for (int i = 0; i < a.length; i++)
- {
- out[i] = a[i].not();
- }
- return out;
- }
-
- /**
- * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array.
- *
- * @author Christian Femers
- */
- public static Bit[] combineInto(Bit[] dest, Bit[] addition)
- {
- if (dest.length != addition.length)
- throw new IllegalArgumentException("Bit Arrays were not of equal length.");
- for (int i = 0; i < addition.length; i++)
- {
- dest[i] = dest[i].join(addition[i]);
- }
- return dest;
- }
-
- interface BitOp
- {
- Bit execute(Bit a, Bit b);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-/**
- * A basic component that recomputes all outputs (with a delay), when it is updated.
- *
- * @author Fabian Stemmler
- */
-public abstract class BasicComponent extends Component implements WireObserver
-{
- private int processTime;
-
- /**
- *
- * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed.
- *
- * @author Fabian Stemmler
- */
- public BasicComponent(Timeline timeline, int processTime)
- {
- super(timeline);
- this.processTime = processTime > 0 ? processTime : 1;
- }
-
- @Override
- public void update(ReadEnd initiator, BitVector oldValues)
- {
- timeline.addEvent(e -> compute(), processTime);
- }
-
- protected abstract void compute();
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class BitDisplay extends BasicComponent
-{
- private final ReadEnd in;
- private BitVector displayedValue;
-
- public BitDisplay(Timeline timeline, ReadEnd in)
- {
- super(timeline, 1);
- this.in = in;
- in.addObserver(this);
- compute();
- }
-
- @Override
- protected void compute()
- {
- displayedValue = in.getValues();
- }
-
- public BitVector getDisplayedValue()
- {
- return displayedValue;
- }
-
- public boolean isDisplaying(Bit... values)
- {
- return displayedValue.equals(BitVector.of(values));
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(in);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of();
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.timeline.TimelineEvent;
-import net.mograsim.logic.core.timeline.TimelineEventHandler;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Clock extends Component implements TimelineEventHandler
-{
- private boolean toggle = false;
- private ReadWriteEnd out;
- private int delta;
-
- /**
- *
- * @param out {@link Wire} the clock's impulses are fed into
- * @param delta ticks between rising and falling edge
- */
- public Clock(Timeline timeline, ReadWriteEnd out, int delta)
- {
- super(timeline);
- this.delta = delta;
- this.out = out;
- addToTimeline();
- }
-
- @Override
- public void handle(TimelineEvent e)
- {
- addToTimeline();
- out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
- toggle = !toggle;
- }
-
- public ReadWriteEnd getOut()
- {
- return out;
- }
-
- private void addToTimeline()
- {
- timeline.addEvent(this, delta);
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of();
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public abstract class Component
-{
- protected Timeline timeline;
-
- public Component(Timeline timeline)
- {
- this.timeline = timeline;
- }
-
- /**
- * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization
- * in the UI.
- */
- public abstract List<ReadEnd> getAllInputs();
-
- /**
- * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.
- */
- public abstract List<ReadWriteEnd> getAllOutputs();
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Connector extends Component implements WireObserver
-{
- private boolean connected;
- private final ReadWriteEnd a;
- private final ReadWriteEnd b;
-
- public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
- {
- super(timeline);
- if (a.length() != b.length())
- throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
- this.a = a;
- this.b = b;
- a.addObserver(this);
- b.addObserver(this);
- }
-
- public void connect()
- {
- connected = true;
- update(a);
- update(b);
- }
-
- public void disconnect()
- {
- connected = false;
- a.clearSignals();
- b.clearSignals();
- }
-
- public void setConnection(boolean connected)
- {
- if (connected)
- connect();
- else
- disconnect();
- }
-
- @Override
- public void update(ReadEnd initiator, BitVector oldValues)
- {
- if (connected)
- timeline.addEvent(e -> update(initiator), 1);
- }
-
- private void update(ReadEnd initiator)
- {
- if (initiator == a)
- b.feedSignals(a.wireValuesExcludingMe());
- else
- a.feedSignals(b.wireValuesExcludingMe());
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(a, b);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(a, b);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
- * output.
- *
- * @author Fabian Stemmler
- *
- */
-public class Demux extends BasicComponent
-{
- private final ReadEnd select, in;
- private final ReadWriteEnd[] outputs;
- private final int outputSize;
- private int selected = -1;
-
- /**
- * Output {@link Wire}s and in must be of uniform length
- *
- * @param in Must be of uniform length with all outputs.
- * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs.
- * @param outputs One of these outputs receives the input signal, depending on the select bits
- */
- public Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
- {
- super(timeline, processTime);
- outputSize = in.length();
-
- this.in = in;
- this.outputs = outputs;
- for (int i = 0; i < this.outputs.length; i++)
- {
- if (outputs[i].length() != outputSize)
- throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");
- this.outputs[i] = outputs[i];
- }
-
- this.select = select;
- select.addObserver(this);
-
- int maxInputs = 1 << select.length();
- if (this.outputs.length > maxInputs)
- throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by "
- + select.length() + " select bits (" + maxInputs + ").");
- in.addObserver(this);
- }
-
- @Override
- public void compute()
- {
- int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;
- if (selectValue >= outputs.length)
- selectValue = -1;
-
- if (selected != selectValue && selected != -1)
- outputs[selected].clearSignals();
-
- selected = selectValue;
-
- if (selectValue != -1)
- outputs[selectValue].feedSignals(in.getValues());
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(in, select);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(outputs);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * This class models a simple on/off (ONE/ZERO) switch for user interaction.
- *
- * @author Christian Femers
- *
- */
-public class ManualSwitch extends Component
-{
- private ReadWriteEnd output;
- private boolean isOn;
-
- public ManualSwitch(Timeline timeline, ReadWriteEnd output)
- {
- super(timeline);
- if (output.length() != 1)
- throw new IllegalArgumentException("Switch output can be only a single wire");
- this.output = output;
- }
-
- public void switchOn()
- {
- setState(true);
- }
-
- public void switchOff()
- {
- setState(false);
- }
-
- public void toggle()
- {
- setState(!isOn);
- }
-
- public void setState(boolean isOn)
- {
- if (this.isOn == isOn)
- return;
- this.isOn = isOn;
- output.feedSignals(getValue());
- }
-
- public boolean isOn()
- {
- return isOn;
- }
-
- public Bit getValue()
- {
- return isOn ? Bit.ONE : Bit.ZERO;
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of();
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(output);
- }
-
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Merger extends Component implements WireObserver
-{
- private ReadWriteEnd out;
- private ReadEnd[] inputs;
- private int[] beginningIndex;
-
- /**
- *
- * @param union The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
- * @param inputs The inputs to be merged into the union
- */
- public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
- {
- super(timeline);
- this.inputs = inputs;
- this.out = union;
- this.beginningIndex = new int[inputs.length];
-
- int length = 0;
- for (int i = 0; i < inputs.length; i++)
- {
- beginningIndex[i] = length;
- length += inputs[i].length();
- inputs[i].addObserver(this);
- }
-
- if (length != union.length())
- throw new IllegalArgumentException(
- "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
- }
-
- public ReadEnd getInput(int index)
- {
- return inputs[index];
- }
-
- public ReadEnd getUnion()
- {
- return out;
- }
-
- @Override
- public void update(ReadEnd initiator, BitVector oldValues)
- {
- int index = find(initiator);
- int beginning = beginningIndex[index];
- out.feedSignals(beginning, inputs[index].getValues());
- }
-
- private int find(ReadEnd r)
- {
- for (int i = 0; i < inputs.length; i++)
- if (inputs[i] == r)
- return i;
- return -1;
- }
-
- public ReadEnd[] getInputs()
- {
- return inputs.clone();
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(inputs);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
- * output.
- *
- * @author Fabian Stemmler
- *
- */
-public class Mux extends BasicComponent
-{
- private ReadEnd select;
- private ReadWriteEnd out;
- private ReadEnd[] inputs;
- private final int outputSize;
-
- /**
- * Input {@link Wire}s and out must be of uniform length
- *
- * @param out Must be of uniform length with all inputs.
- * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs.
- * @param inputs One of these inputs is mapped to the output, depending on the select bits
- */
- public Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
- {
- super(timeline, processTime);
- outputSize = out.length();
-
- this.inputs = inputs.clone();
- for (int i = 0; i < this.inputs.length; i++)
- {
- if (inputs[i].length() != outputSize)
- throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");
- inputs[i].addObserver(this);
- }
-
- this.select = select;
- select.addObserver(this);
-
- int maxInputs = 1 << select.length();
- if (this.inputs.length > maxInputs)
- throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "
- + select.length() + " select bits (" + maxInputs + ").");
-
- this.out = out;
- }
-
- public ReadEnd getOut()
- {
- return out;
- }
-
- public ReadEnd getSelect()
- {
- return select;
- }
-
- @Override
- public void compute()
- {
- int selectValue;
- if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
- {
- out.clearSignals();
- return;
- }
-
- ReadEnd active = inputs[selectValue];
- out.feedSignals(active.getValues());
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));
- wires.add(select);
- return Collections.unmodifiableList(wires);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.WireObserver;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class Splitter extends Component implements WireObserver
-{
- private ReadEnd input;
- private ReadWriteEnd[] outputs;
-
- public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
- {
- super(timeline);
- this.input = input;
- this.outputs = outputs;
- input.addObserver(this);
- int length = 0;
- for (ReadEnd out : outputs)
- length += out.length();
-
- if (input.length() != length)
- throw new IllegalArgumentException(
- "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");
- }
-
- protected void compute()
- {
- BitVector inputBits = input.getValues();
- int startIndex = 0;
- for (int i = 0; i < outputs.length; i++)
- {
- outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));
- startIndex += outputs[i].length();
- }
- }
-
- @Override
- public void update(ReadEnd initiator, BitVector oldValues)
- {
- compute();
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(input);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(outputs);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class TriStateBuffer extends BasicComponent
-{
- ReadEnd in, enable;
- ReadWriteEnd out;
-
- public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
- {
- super(timeline, processTime);
- if (in.length() != out.length())
- throw new IllegalArgumentException(
- "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());
- if (enable.length() != 1)
- throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");
- this.in = in;
- in.addObserver(this);
- this.enable = enable;
- enable.addObserver(this);
- this.out = out;
- }
-
- @Override
- protected void compute()
- {
- if (enable.getValue() == Bit.ONE)
- out.feedSignals(in.getValues());
- else
- out.clearSignals();
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(in, enable);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-
-}
+++ /dev/null
-package net.mograsim.logic.core.components.gates;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class AndGate extends MultiInputGate
-{
- public AndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
- {
- super(timeline, processTime, BitVectorMutator::and, out, in);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components.gates;
-
-import java.util.List;
-
-import net.mograsim.logic.core.components.BasicComponent;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.MutationOperation;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public abstract class MultiInputGate extends BasicComponent
-{
- protected ReadEnd[] in;
- protected ReadWriteEnd out;
- protected final int length;
- protected MutationOperation op;
-
- protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
- {
- super(timeline, processTime);
- this.op = op;
- length = out.length();
- this.in = in.clone();
- if (in.length < 1)
- throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));
- for (ReadEnd w : in)
- {
- if (w.length() != length)
- throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");
- w.addObserver(this);
- }
- this.out = out;
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(in);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-
- @Override
- protected void compute()
- {
- BitVectorMutator mutator = BitVectorMutator.empty();
- for (ReadEnd w : in)
- op.apply(mutator, w.getValues());
- out.feedSignals(mutator.get());
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components.gates;
-
-import java.util.List;
-
-import net.mograsim.logic.core.components.BasicComponent;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class NotGate extends BasicComponent
-{
- private ReadEnd in;
- private ReadWriteEnd out;
-
- public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
- {
- super(timeline, processTime);
- this.in = in;
- in.addObserver(this);
- this.out = out;
- }
-
- @Override
- protected void compute()
- {
- out.feedSignals(in.getValues().not());
- }
-
- public ReadEnd getIn()
- {
- return in;
- }
-
- public ReadEnd getOut()
- {
- return out;
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of(in);
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(out);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components.gates;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-public class OrGate extends MultiInputGate
-{
- public OrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
- {
- super(timeline, processTime, BitVectorMutator::or, out, in);
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.components.gates;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * Outputs 1 when the number of 1 inputs is odd.
- *
- * @author Fabian Stemmler
- */
-public class XorGate extends MultiInputGate
-{
- public XorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
- {
- super(timeline, processTime, BitVectorMutator::xor, out, in);
- }
-
-}
+++ /dev/null
-package net.mograsim.logic.core.tests;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import java.util.function.LongConsumer;
-
-import org.junit.jupiter.api.Test;
-
-import net.mograsim.logic.core.components.Connector;
-import net.mograsim.logic.core.components.Demux;
-import net.mograsim.logic.core.components.Merger;
-import net.mograsim.logic.core.components.Mux;
-import net.mograsim.logic.core.components.Splitter;
-import net.mograsim.logic.core.components.TriStateBuffer;
-import net.mograsim.logic.core.components.gates.AndGate;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.components.gates.XorGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-class ComponentTest
-{
- private Timeline t = new Timeline(11);
-
- @Test
- void circuitExampleTest()
- {
- Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
- f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
- k = new Wire(t, 1, 1);
- new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
- new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
- new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
- new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
- new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
-
- a.createReadWriteEnd().feedSignals(Bit.ZERO);
- b.createReadWriteEnd().feedSignals(Bit.ONE);
- c.createReadWriteEnd().feedSignals(Bit.ZERO);
- d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
- e.createReadWriteEnd().feedSignals(Bit.ZERO);
-
- t.executeAll();
-
- assertEquals(Bit.ONE, j.getValue());
- assertEquals(Bit.ZERO, k.getValue());
- }
-
- @Test
- void splitterTest()
- {
- t.reset();
- Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
- in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
- new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
-
- t.executeAll();
-
- assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
- assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
- }
-
- @Test
- void mergerTest()
- {
- t.reset();
- Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
- b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
- c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
- new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
-
- t.executeAll();
-
- assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
- }
-
- @Test
- void triStateBufferTest()
- {
- Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
- new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
- new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
- new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
-
- ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
- enI.feedSignals(Bit.ONE);
- aI.feedSignals(Bit.ONE);
- bI.feedSignals(Bit.Z);
-
- t.executeAll();
-
- assertEquals(Bit.ONE, b.getValue());
-
- bI.feedSignals(Bit.ZERO);
-
- t.executeAll();
-
- assertEquals(Bit.X, b.getValue());
- assertEquals(Bit.ONE, a.getValue());
-
- aI.clearSignals();
- enI.feedSignals(Bit.ZERO);
-
- t.executeAll();
-
- assertEquals(Bit.ZERO, a.getValue());
-
- }
-
- @Test
- void muxTest()
- {
- t.reset();
- Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(t, 4, 1);
- ReadWriteEnd selectIn = select.createReadWriteEnd();
-
- selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
- c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
- new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
- c.createReadOnlyEnd());
- t.executeAll();
-
- assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
- selectIn.feedSignals(Bit.ZERO, Bit.ONE);
- t.executeAll();
-
- assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
- selectIn.feedSignals(Bit.ONE, Bit.ONE);
- t.executeAll();
-
- assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
- }
-
- @Test
- void demuxTest()
- {
- t.reset();
- Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(t, 4, 1);
- ReadWriteEnd selectIn = select.createReadWriteEnd();
-
- selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
- in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
- new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
- c.createReadWriteEnd());
- t.executeAll();
-
- assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
- assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
- selectIn.feedSignals(Bit.ZERO, Bit.ONE);
- t.executeAll();
-
- assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
-
- selectIn.feedSignals(Bit.ONE, Bit.ONE);
- t.executeAll();
-
- assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
- assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
-
- }
-
- @Test
- void andTest()
- {
- t.reset();
- Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
- new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
- b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
- t.executeAll();
-
- assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
- }
-
- @Test
- void orTest()
- {
- t.reset();
- Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
- new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
- b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
-
- t.executeAll();
-
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
- }
-
- @Test
- void xorTest()
- {
- t.reset();
- Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
- new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
- b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
- c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
-
- t.executeAll();
-
- assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
- }
-
- @Test
- void notTest()
- {
- t.reset();
- Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
- new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
-
- t.executeAll();
-
- assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
- }
-
- @Test
- void rsLatchCircuitTest()
- {
- t.reset();
- Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
- nq = new Wire(t, 1, 1);
-
- new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
- new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
- new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
- new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
-
- ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
-
- sIn.feedSignals(Bit.ONE);
- rIn.feedSignals(Bit.ZERO);
-
- t.executeAll();
-
- assertEquals(Bit.ONE, q.getValue());
- assertEquals(Bit.ZERO, nq.getValue());
-
- sIn.feedSignals(Bit.ZERO);
-
- t.executeAll();
- assertEquals(Bit.ONE, q.getValue());
- assertEquals(Bit.ZERO, nq.getValue());
-
- rIn.feedSignals(Bit.ONE);
-
- t.executeAll();
-
- assertEquals(Bit.ZERO, q.getValue());
- assertEquals(Bit.ONE, nq.getValue());
- }
-
- @Test
- void numericValueTest()
- {
- t.reset();
-
- Wire a = new Wire(t, 4, 1);
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
-
- t.executeAll();
-
- assertEquals(15, a.getUnsignedValue());
- assertEquals(-1, a.getSignedValue());
- }
-
- boolean flag = false;
-
- @Test
- void simpleTimelineTest()
- {
- Timeline t = new Timeline(3);
- flag = false;
- t.addEvent((e) ->
- {
- if (!flag)
- fail();
- flag = false;
- }, 15);
- t.addEvent((e) ->
- {
- if (flag)
- fail();
- flag = true;
- }, 10);
- t.addEvent((e) ->
- {
- if (flag)
- fail();
- flag = true;
- }, 20);
- t.addEvent((e) ->
- {
- fail("Only supposed to execute until timestamp 20, not 25");
- }, 25);
-
- t.executeUntil(t.laterThan(20), 100);
-
- if (!flag)
- fail();
- }
-
- @Test
- void multipleInputs()
- {
- t.reset();
- Wire w = new Wire(t, 2, 1);
- ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
- wI1.feedSignals(Bit.ONE, Bit.Z);
- wI2.feedSignals(Bit.Z, Bit.X);
- t.executeAll();
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
-
- wI2.feedSignals(Bit.ZERO, Bit.Z);
- t.executeAll();
- assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
-
- wI2.feedSignals(Bit.Z, Bit.Z);
- t.executeAll();
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
-
- wI2.feedSignals(Bit.ONE, Bit.Z);
- ReadEnd rE = w.createReadOnlyEnd();
- rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));
- t.executeAll();
- rE.close();
- wI1.feedSignals(Bit.X, Bit.X);
- t.executeAll();
- wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));
- wI1.close();
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
- }
-
- @Test
- void wireConnections()
- {
- // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
-
- t.reset();
-
- Wire a = new Wire(t, 1, 2);
- Wire b = new Wire(t, 1, 2);
- Wire c = new Wire(t, 1, 2);
- ReadWriteEnd aI = a.createReadWriteEnd();
- ReadWriteEnd bI = b.createReadWriteEnd();
- ReadWriteEnd cI = c.createReadWriteEnd();
-
- TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
- TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
- LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);
-
- cI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
-
- cI.feedSignals(Bit.X);
- test.assertAfterSimulationIs(print, Bit.X);
-
- cI.feedSignals(Bit.X);
- cI.feedSignals(Bit.Z);
- test.assertAfterSimulationIs(print, Bit.Z);
-
- new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
- test.assertAfterSimulationIs(print, Bit.Z);
- System.err.println("ONE");
- bI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
- System.err.println("ZERO");
- bI.feedSignals(Bit.ZERO);
- test.assertAfterSimulationIs(print, Bit.ZERO);
- System.err.println("Z");
- bI.feedSignals(Bit.Z);
- test.assertAfterSimulationIs(print, Bit.Z);
-
- new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
- System.err.println("Z 2");
- aI.feedSignals(Bit.Z);
- test.assertAfterSimulationIs(print, Bit.Z);
- test2.assertAfterSimulationIs(Bit.Z);
- System.err.println("ONE 2");
- aI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
- test2.assertAfterSimulationIs(Bit.ONE);
- System.err.println("ZERO 2");
- aI.feedSignals(Bit.ZERO);
- test.assertAfterSimulationIs(print, Bit.ZERO);
- test2.assertAfterSimulationIs(Bit.ZERO);
- System.err.println("Z 2 II");
- aI.feedSignals(Bit.Z);
- test.assertAfterSimulationIs(print, Bit.Z);
- test2.assertAfterSimulationIs(Bit.Z);
-
- System.err.println("No Conflict yet");
- bI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
- test2.assertAfterSimulationIs(Bit.ONE);
- aI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
- test2.assertAfterSimulationIs(Bit.ONE);
- System.err.println("Conflict");
- aI.feedSignals(Bit.ZERO);
- test.assertAfterSimulationIs(print, Bit.X);
- test2.assertAfterSimulationIs(Bit.X);
- aI.feedSignals(Bit.ONE);
- test.assertAfterSimulationIs(print, Bit.ONE);
- test2.assertAfterSimulationIs(Bit.ONE);
- }
-
- private static void assertBitArrayEquals(BitVector actual, Bit... expected)
- {
- assertArrayEquals(expected, actual.getBits());
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.tests;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.WindowConstants;
-
-import net.mograsim.logic.core.components.ManualSwitch;
-import net.mograsim.logic.core.components.gates.NotGate;
-import net.mograsim.logic.core.components.gates.OrGate;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
-import net.mograsim.logic.core.wires.Wire;
-
-public class GUITest extends JPanel
-{
-
- private static final long serialVersionUID = 1L;
-
- private static final int WIRE_DELAY = 40;
- private static final int OR_DELAY = 100;
- private static final int NOT_DELAY = 100;
-
- private Timeline t = new Timeline(11);
-
- Wire r = new Wire(t, 1, WIRE_DELAY);
- Wire s = new Wire(t, 1, WIRE_DELAY);
- Wire t1 = new Wire(t, 1, WIRE_DELAY);
- Wire t2 = new Wire(t, 1, WIRE_DELAY);
- Wire q = new Wire(t, 1, WIRE_DELAY);
- Wire nq = new Wire(t, 1, WIRE_DELAY);
-
- ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
- ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
-
- OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
- OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
- NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
- NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
-
- Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
-
- int height;
- int width;
- boolean sizeChanged;
-
- public GUITest()
- {
- addMouseListener(new MouseListener()
- {
-
- @Override
- public void mouseReleased(MouseEvent e)
- {
- for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
- {
- if (dim.getValue().contains(e.getPoint()))
- {
- dim.getKey().switchOff();
- repaint();
- }
- }
- }
-
- @Override
- public void mousePressed(MouseEvent e)
- {
- for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
- {
- if (dim.getValue().contains(e.getPoint()))
- {
- dim.getKey().switchOn();
- repaint();
- }
- }
- }
-
- @Override
- public void mouseExited(MouseEvent e)
- {
- // none
- }
-
- @Override
- public void mouseEntered(MouseEvent e)
- {
- // none
- }
-
- @Override
- public void mouseClicked(MouseEvent e)
- {
- // If you want toggle buttons, use this code instead
-// for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {
-// if (dim.getValue().contains(e.getPoint())) {
-// dim.getKey().toggle();
-// repaint();
-// }
-// }
- }
- });
- }
-
- public Timeline getTimeline()
- {
- return t;
- };
-
- @Override
- public void paint(Graphics some_g)
- {
- super.paint(some_g);
- Graphics2D g = ((Graphics2D) some_g);
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
-
- checkSizeChange();
- adaptFont(g);
-
- drawWire(g, r, "r", 2, 9, 4, 9);
-
- drawWire(g, s, "s", 2, 3, 4, 3);
-
- drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
-
- drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
-
- drawWire(g, q, "q", 7, 8.5, 9, 8.5);
-
- drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
-
- drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);
- drawWire(g, q, "", 7.5, 7.5, 3, 4.5);
- drawWire(g, q, "", 3, 4.5, 3, 4);
- drawWire(g, q, "q", 3, 4, 4, 4);
-
- drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);
- drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);
- drawWire(g, nq, "", 3, 7.5, 3, 8);
- drawWire(g, nq, "nq", 3, 8, 4, 8);
-
- drawSquare(g, 4, 8, "OR");
- drawSquare(g, 4, 3, "OR");
-
- drawSquare(g, 6, 8, "NOT");
- drawSquare(g, 6, 3, "NOT");
-
- drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);
- drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);
-
- drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
- }
-
- private void checkSizeChange()
- {
- sizeChanged = height != getHeight() || width != getWidth();
- if (sizeChanged)
- {
- height = getHeight();
- width = getWidth();
- }
- }
-
- private void adaptFont(Graphics g)
- {
- g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
- }
-
- private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
- {
- int h = g.getFontMetrics().getAscent();
- int w = g.getFontMetrics().stringWidth(s);
- g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));
- }
-
- private void drawWire(Graphics g, Wire wa, String name, double x1, double y1, double x2, double y2)
- {
- setTo(g, wa);
- g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));
- drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);
- }
-
- private void drawSquare(Graphics g, int posX, int posY, String text)
- {
- int x1 = gX(posX) - 5;
- int x2 = gX(posX + 1) + 5;
- int y1 = gY(posY) - 5;
- int y2 = gY(posY + 1) + 5;
-
- g.setColor(Color.WHITE);
- g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
- setBlack(g);
- g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
- drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
-
- }
-
- private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
- {
- int x1 = gX(posX1) - 5;
- int x2 = gX(posX2) + 5;
- int y1 = gY(posY1) - 5;
- int y2 = gY(posY2) + 5;
-
- if (sizeChanged)
- {
- Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
- switchMap.put(ms, r);
- }
-
- g.setColor(ms.isOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
- g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
- setBlack(g);
- g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
- drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
- }
-
- private static void setBlack(Graphics g)
- {
- g.setColor(Color.BLACK);
- }
-
- private static void setTo(Graphics g, Wire wa)
- {
- switch (wa.getValue())
- {
- case ONE:
- g.setColor(Color.GREEN);
- break;
- case X:
- g.setColor(Color.RED);
- break;
- case Z:
- g.setColor(Color.DARK_GRAY);
- break;
- case ZERO:
- g.setColor(Color.BLACK);
- break;
- case U:
- g.setColor(Color.MAGENTA);
- break;
- default:
- throw new IllegalArgumentException();
- }
- }
-
- private int gY(double pos)
- {
- return (int) (pos * height / 11);
- }
-
- private int gX(double pos)
- {
- return (int) (pos * width / 11) + 50;
- }
-
- public static void main(String[] args)
- {
- JFrame f = new JFrame("Test circuit 1.0.0");
- GUITest gt = new GUITest();
- f.add(gt);
- f.setSize(800, 600);
- f.setLocation(500, 400);
- f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- f.setVisible(true);
-
- long begin = System.currentTimeMillis();
-
- long lastFrame = begin;
- long updateT = 16;
-
- while (f.isVisible())
- {
- ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
-// if (t.hasNext())
-// t.executeNext();
- if (er != ExecutionResult.NOTHING_DONE)
- gt.repaint(12);
- try
- {
- Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- lastFrame = System.currentTimeMillis();
- }
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.tests;
-
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-
-import java.util.function.LongConsumer;
-
-import net.mograsim.logic.core.components.BitDisplay;
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public final class TestBitDisplay extends BitDisplay
-{
-
- public TestBitDisplay(Timeline timeline, ReadEnd in)
- {
- super(timeline, in);
- }
-
- public void assertDisplays(Bit... expected)
- {
- assertArrayEquals(expected, getDisplayedValue().getBits());
- }
-
- public void assertAfterSimulationIs(Bit... expected)
- {
- timeline.executeAll();
- assertDisplays(expected);
- }
-
- public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
- {
- while (timeline.hasNext())
- {
- timeline.executeNext();
- r.accept(timeline.getSimulationTime());
- }
- assertDisplays(expected);
- }
-
- @Override
- protected void compute()
- {
- super.compute();
- System.out.println("update: value is " + getDisplayedValue());
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.timeline;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.PriorityQueue;
-import java.util.function.BooleanSupplier;
-import java.util.function.Consumer;
-import java.util.function.LongSupplier;
-
-/**
- * Orders Events by the time they are due to be executed. Can execute Events individually.
- *
- * @author Fabian Stemmler
- *
- */
-public class Timeline
-{
- private PriorityQueue<InnerEvent> events;
- private LongSupplier time;
- private long lastTimeUpdated = 0;
-
- private final List<Consumer<TimelineEvent>> eventAddedListener;
-
- public Timeline(int initCapacity)
- {
- events = new PriorityQueue<InnerEvent>(initCapacity);
-
- eventAddedListener = new ArrayList<>();
- time = () -> lastTimeUpdated;
- }
-
- /**
- * @param timestamp exclusive
- * @return true if the first event is later than the timestamp
- */
- public BooleanSupplier laterThan(long timestamp)
- {
- return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;
- }
-
- public boolean hasNext()
- {
- return !events.isEmpty();
- }
-
- /**
- * Executes all events at the next timestamp, at which there are any
- */
- public void executeNext()
- {
- InnerEvent first = events.peek();
- if (first != null)
- executeUntil(laterThan(first.getTiming()), -1);
- }
-
- public void executeAll()
- {
- while (hasNext())
- executeNext();
- }
-
- /**
- * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp.
- *
- * @param condition the condition until which the events are be processed
- * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout.
- * @return State of the event execution
- * @formatter:off
- * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty
- * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached
- * <code>EXEC_UNTIL_CONDITION</code> if the condition was met
- * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty
- * @formatter:on
- * @author Christian Femers, Fabian Stemmler
- */
- public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)
- {
- if (events.isEmpty())
- {
- lastTimeUpdated = getSimulationTime();
- return ExecutionResult.NOTHING_DONE;
- }
- int checkStop = 0;
- InnerEvent first = events.peek();
- while (hasNext() && !condition.getAsBoolean())
- {
- events.remove();
- lastTimeUpdated = first.getTiming();
- first.run();
- // Don't check after every run
- checkStop = (checkStop + 1) % 10;
- if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
- return ExecutionResult.EXEC_OUT_OF_TIME;
- first = events.peek();
- }
- lastTimeUpdated = getSimulationTime();
- return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;
- }
-
- public void setTimeFunction(LongSupplier time)
- {
- this.time = time;
- }
-
- public long getSimulationTime()
- {
- return time.getAsLong();
- }
-
- public long nextEventTime()
- {
- if (!hasNext())
- return -1;
- return events.peek().getTiming();
- }
-
- public void reset()
- {
- events.clear();
- lastTimeUpdated = 0;
- }
-
- public void addEventAddedListener(Consumer<TimelineEvent> listener)
- {
- eventAddedListener.add(listener);
- }
-
- public void removeEventAddedListener(Consumer<TimelineEvent> listener)
- {
- eventAddedListener.remove(listener);
- }
-
- /**
- * Adds an Event to the {@link Timeline}
- *
- * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline.
- * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time.
- */
- public void addEvent(TimelineEventHandler function, int relativeTiming)
- {
- long timing = getSimulationTime() + relativeTiming;
- TimelineEvent event = new TimelineEvent(timing);
- events.add(new InnerEvent(function, event));
- eventAddedListener.forEach(l -> l.accept(event));
- }
-
- private class InnerEvent implements Runnable, Comparable<InnerEvent>
- {
- private final TimelineEventHandler function;
- private final TimelineEvent event;
-
- /**
- * Creates an {@link InnerEvent}
- *
- * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs
- * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed;
- */
- InnerEvent(TimelineEventHandler function, TimelineEvent event)
- {
- this.function = function;
- this.event = event;
- }
-
- public long getTiming()
- {
- return event.getTiming();
- }
-
- @Override
- public void run()
- {
- function.handle(event);
- }
-
- @Override
- public String toString()
- {
- return event.toString();
- }
-
- @Override
- public int compareTo(InnerEvent o)
- {
- return timeCmp(getTiming(), o.getTiming());
- }
- }
-
- public static int timeCmp(long a, long b)
- {
- return Long.signum(a - b);
- }
-
- @Override
- public String toString()
- {
- return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());
- }
-
- public enum ExecutionResult
- {
- NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.timeline;
-
-/**
- * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to
- * store.
- *
- * @author Fabian Stemmler
- *
- */
-public class TimelineEvent
-{
- private final long timing;
-
- TimelineEvent(long timing)
- {
- super();
- this.timing = timing;
- }
-
- public long getTiming()
- {
- return timing;
- }
-
- @Override
- public String toString()
- {
- return "timestamp: " + timing;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.timeline;
-
-@FunctionalInterface
-public interface TimelineEventHandler
-{
- public void handle(TimelineEvent e);
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * stdlogic according to IEEE 1164
- */
-public enum Bit implements StrictLogicType<Bit>
-{
- U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z");
-
- private final String symbol;
-
- private Bit(String symbol)
- {
- this.symbol = symbol;
- }
-
- @Override
- public Bit and(Bit other)
- {
- return fromTable(AND_TABLE, this, other);
- }
-
- @Override
- public Bit or(Bit other)
- {
- return fromTable(OR_TABLE, this, other);
- }
-
- @Override
- public Bit xor(Bit other)
- {
- return fromTable(XOR_TABLE, this, other);
- }
-
- @Override
- public Bit not()
- {
- switch (this)
- {
- case U:
- return U;
- case ONE:
- return ZERO;
- case ZERO:
- return ONE;
- default:
- return X;
- }
- }
-
- public Bit[] makeArray(int length)
- {
- Bit[] bits = new Bit[length];
- Arrays.fill(bits, this);
- return bits;
- }
-
- public BitVector toVector(int length)
- {
- return BitVector.of(this, length);
- }
-
- @Override
- public Bit join(Bit other)
- {
- return fromTable(JOIN_TABLE, this, other);
- }
-
- @Override
- public String toString()
- {
- return getSymbol();
- }
-
- public String getSymbol()
- {
- return symbol;
- }
-
- public static Bit parse(String s)
- {
- Bit bit = SYMBOL_MAP.get(s);
- Objects.requireNonNull(bit, "No Bit found for symbol " + s);
- return bit;
- }
-
- public static Bit parse(String s, int symbolPosition)
- {
- return parse(s.substring(symbolPosition, symbolPosition + 1));
- }
-
- private static Bit fromTable(Bit[][] table, Bit a, Bit b)
- {
- return table[a.ordinal()][b.ordinal()];
- }
-
- static final Map<String, Bit> SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z);
-
- // @formatter:off
- private static final Bit[][] JOIN_TABLE =
- { { U, U, U, U, U },
- { U, X, X, X, X },
- { U, X, ZERO, X, ZERO },
- { U, X, X, ONE, ONE },
- { U, X, ZERO, ONE, Z } };
-
- private static final Bit[][] AND_TABLE =
- { { U, U, ZERO, U, U },
- { U, X, ZERO, X, X },
- { ZERO, ZERO, ZERO, ZERO, ZERO },
- { U, X, ZERO, ONE, X },
- { U, X, ZERO, X, X } };
-
- private static final Bit[][] OR_TABLE =
- { { U, U, U, ONE, U },
- { U, X, X, ONE, X },
- { U, X, ZERO, ONE, X },
- { ONE, ONE, ONE, ONE, ONE },
- { U, X, X, ONE, X } };
-
- private static final Bit[][] XOR_TABLE =
- { { U, U, U, U, U },
- { U, X, X, X, X },
- { U, X, ZERO, ONE, X },
- { U, X, ONE, ZERO, X },
- { U, X, X, X, X } };
- // @formatter:on
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-import static java.lang.String.format;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.RandomAccess;
-import java.util.function.BinaryOperator;
-import java.util.function.UnaryOperator;
-
-/**
- * Immutable class representing a {@link Bit}Vector
- *
- *
- * @author Christian Femers
- *
- */
-public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit>, RandomAccess
-{
- private final Bit[] bits;
-
- private BitVector(Bit[] bits)
- {
- this.bits = Objects.requireNonNull(bits);
- }
-
- public static BitVector of(Bit... bits)
- {
- return new BitVector(bits.clone());
- }
-
- public static BitVector of(Bit bit, int length)
- {
- return new BitVector(bit.makeArray(length));
- }
-
- public BitVectorMutator mutator()
- {
- return BitVectorMutator.of(this);
- }
-
- public Bit getBit(int bitIndex)
- {
- return bits[bitIndex];
- }
-
- public Bit[] getBits()
- {
- return bits.clone();
- }
-
- @Override
- public BitVector join(BitVector t)
- {
- checkCompatibility(t);
- return new BitVector(binOp(bits.clone(), t.bits, Bit::join));
- }
-
- @Override
- public BitVector and(BitVector t)
- {
- checkCompatibility(t);
- return new BitVector(binOp(bits.clone(), t.bits, Bit::and));
- }
-
- @Override
- public BitVector or(BitVector t)
- {
- checkCompatibility(t);
- return new BitVector(binOp(bits.clone(), t.bits, Bit::or));
- }
-
- @Override
- public BitVector xor(BitVector t)
- {
- checkCompatibility(t);
- return new BitVector(binOp(bits.clone(), t.bits, Bit::xor));
- }
-
- @Override
- public BitVector not()
- {
- return new BitVector(unOp(bits.clone(), Bit::not));
- }
-
- public int length()
- {
- return bits.length;
- }
-
- public BitVector concat(BitVector other)
- {
- Bit[] newBits = Arrays.copyOf(bits, length() + other.length());
- System.arraycopy(other.bits, 0, newBits, length(), other.length());
- return new BitVector(newBits);
- }
-
- public BitVector subVector(int start)
- {
- return new BitVector(Arrays.copyOfRange(bits, start, length()));
- }
-
- public BitVector subVector(int start, int end)
- {
- return new BitVector(Arrays.copyOfRange(bits, start, end));
- }
-
- private void checkCompatibility(BitVector bv)
- {
- if (length() != bv.length())
- throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length()));
- }
-
- static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator<Bit> op)
- {
- if (dest == null)
- return second.clone();
- for (int i = 0; i < dest.length; i++)
- {
- dest[i] = op.apply(dest[i], second[i]);
- }
- return dest;
- }
-
- static Bit[] unOp(Bit[] dest, UnaryOperator<Bit> op)
- {
- if (dest == null)
- return null;
- for (int i = 0; i < dest.length; i++)
- {
- dest[i] = op.apply(dest[i]);
- }
- return dest;
- }
-
- /**
- * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder}
- *
- * @author Christian Femers
- */
- @SuppressWarnings("synthetic-access")
- public static final class BitVectorMutator implements LogicType<BitVectorMutator, BitVector>
- {
- private Bit[] bits;
-
- private BitVectorMutator(Bit[] bits)
- {
- this.bits = bits;
- }
-
- static BitVectorMutator of(BitVector bv)
- {
- return new BitVectorMutator(bv.getBits());
- }
-
- /**
- * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed.
- *
- */
- public static BitVectorMutator empty()
- {
- return new BitVectorMutator(null);
- }
-
- /**
- * Produces the resulting, immutable {@link BitVector}<br>
- *
- * @throws IllegalStateException if the mutator is (still) empty
- */
- public BitVector get()
- {
- if (bits == null)
- throw new IllegalStateException("cannot create a BitVector from an empty mutator");
- return new BitVector(bits);
- }
-
- @Override
- public BitVectorMutator join(BitVector t)
- {
- checkCompatibility(t);
- bits = binOp(bits, t.bits, Bit::join);
- return this;
- }
-
- @Override
- public BitVectorMutator and(BitVector t)
- {
- checkCompatibility(t);
- bits = binOp(bits, t.bits, Bit::and);
- return this;
- }
-
- @Override
- public BitVectorMutator or(BitVector t)
- {
- checkCompatibility(t);
- bits = binOp(bits, t.bits, Bit::or);
- return this;
- }
-
- @Override
- public BitVectorMutator xor(BitVector t)
- {
- checkCompatibility(t);
- bits = binOp(bits, t.bits, Bit::xor);
- return this;
- }
-
- @Override
- public BitVectorMutator not()
- {
- unOp(bits, Bit::not);
- return this;
- }
-
- private void checkCompatibility(BitVector bv)
- {
- if (bits != null && bits.length != bv.length())
- throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length()));
- }
- }
-
- /**
- * @see Arrays#hashCode(Object[])
- */
- @Override
- public int hashCode()
- {
- return Arrays.hashCode(bits);
- }
-
- /**
- * Does test for equality of values/content
- *
- * @see Object#equals(Object)
- */
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- return true;
- if (!(obj instanceof BitVector))
- return false;
- BitVector other = (BitVector) obj;
- return Arrays.equals(bits, other.bits);
- }
-
- /**
- * Does test for equality of values/content, shifting the other BitVector by <code>offset</code> to the right.<br>
- * Therefore <code>offset + other.length() <= this.length()</code> needs to be true.
- *
- * @throws ArrayIndexOutOfBoundsException if <code>offset + other.length() > this.length()</code>
- *
- * @see Object#equals(Object)
- */
- public boolean equalsWithOffset(BitVector other, int offset)
- {
- if (other == null)
- return false;
- return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length());
- }
-
- /**
- * All {@link Bit}s symbols concatenated together
- *
- * @see #parse(String)
- */
- @Override
- public String toString()
- {
- StringBuilder sb = new StringBuilder(bits.length);
- for (Bit bit : bits)
- sb.append(bit);
- return sb.toString();
- }
-
- /**
- * Parses a String containing solely {@link Bit} symbols
- *
- * @see #toString()
- */
- public static BitVector parse(String s)
- {
- Bit[] values = new Bit[s.length()];
- for (int i = 0; i < s.length(); i++)
- {
- values[i] = Bit.parse(s, i);
- }
- return new BitVector(values);
- }
-
- @Override
- public Iterator<Bit> iterator()
- {
- return new Iterator<>()
- {
- private int pos = 0;
-
- @Override
- public Bit next()
- {
- if (!hasNext())
- throw new NoSuchElementException();
- return getBit(pos++);
- }
-
- @Override
- public boolean hasNext()
- {
- return pos != length();
- }
- };
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public class BitVectorFormatter
-{
- public static String formatValueAsString(ReadEnd end)
- {
- return formatAsString(end == null ? null : end.getValues());
- }
-
- public static String formatAsString(BitVector bitVector)
- {
- if (bitVector == null)
- return "null";
- else
- return bitVector.toString();
- }
-
- public static ColorDefinition formatAsColor(ReadEnd end)
- {
- return formatAsColor(end == null ? null : end.getValues());
- }
-
- public static ColorDefinition formatAsColor(BitVector bitVector)
- {
- // TODO maybe find a color assignment for multiple-bit bit vectors?
- if (bitVector == null || bitVector.length() != 1)
- return new ColorDefinition(BuiltInColor.COLOR_BLACK);
- else
- switch (bitVector.getBit(0))
- {
- case ONE:
- return new ColorDefinition(BuiltInColor.COLOR_GREEN);
- case U:
- return new ColorDefinition(BuiltInColor.COLOR_CYAN);
- case X:
- return new ColorDefinition(BuiltInColor.COLOR_RED);
- case Z:
- return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
- case ZERO:
- return new ColorDefinition(BuiltInColor.COLOR_GRAY);
- default:
- throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(0));
- }
- }
-
- private BitVectorFormatter()
- {
- throw new UnsupportedOperationException("No BitVectorFormatter instances");
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-/**
- * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT).
- * <p>
- * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case <code>r==g==b==-1</code>, or by red / green
- * / blue components, in which case <code>builtInColor==null</code>
- */
-public class ColorDefinition
-{
- /**
- * The built-in color constant defining this color.
- */
- public final ColorDefinition.BuiltInColor builtInColor;
- /**
- * The red color component defining this color.
- */
- public final int r;
- /**
- * The green color component defining this color.
- */
- public final int g;
- /**
- * The blue color component defining this color.
- */
- public final int b;
-
- public ColorDefinition(ColorDefinition.BuiltInColor col)
- {
- if (col == null)
- throw new IllegalArgumentException("Illegal built-in color: " + col);
- this.builtInColor = col;
- this.r = -1;
- this.g = -1;
- this.b = -1;
- }
-
- public ColorDefinition(int r, int g, int b)
- {
- if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255)
- throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b);
- this.builtInColor = null;
- this.r = r;
- this.g = g;
- this.b = b;
- }
-
- public static enum BuiltInColor
- {
- COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE,
- COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY;
- }
-
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-/**
- * Interface for types that support the basic logic operations
- *
- * @author Christian Femers
- *
- * @param <T> the logic type itself, to make the operations closed in T
- * @param <S> the operand type, may be the same as T, see {@link StrictLogicType}
- */
-public interface LogicType<T extends LogicType<T, S>, S>
-{
- /**
- * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164)
- *
- * For example:
- *
- * <pre>
- * 0 joined 0 == 0
- * 1 joined 0 == X
- * 0 joined 1 == X
- * 1 joined 1 == 1
- * </pre>
- *
- * @param t the second logic signal
- * @return the resulting value
- * @author Christian Femers
- */
- T join(S t);
-
- /**
- * Classical logic AND
- *
- * For example:
- *
- * <pre>
- * 0 AND 0 == 0
- * 1 AND 0 == 0
- * 0 AND 1 == 0
- * 1 AND 1 == 1
- * </pre>
- *
- * @param t the second logic signal
- * @return the resulting value
- * @author Christian Femers
- */
- T and(S t);
-
- /**
- * Classical logic OR
- *
- * For example:
- *
- * <pre>
- * 0 OR 0 == 0
- * 1 OR 0 == 1
- * 0 OR 1 == 1
- * 1 OR 1 == 1
- * </pre>
- *
- * @param t the second logic signal
- * @return the resulting value
- * @author Christian Femers
- */
- T or(S t);
-
- /**
- * Classical logic XOR (exclusive OR)
- *
- * For example:
- *
- * <pre>
- * 0 XOR 0 == 0
- * 1 XOR 0 == 1
- * 0 XOR 1 == 1
- * 1 XOR 1 == 0
- * </pre>
- *
- * @param t the second logic signal
- * @return the resulting value
- * @author Christian Femers
- */
- T xor(S t);
-
- /**
- * Classical logic NOT (logical negation)
- *
- * For example:
- *
- * <pre>
- * NOT 0 == 1
- * NOT 1 == 0
- * </pre>
- *
- * @return the resulting value
- * @author Christian Femers
- */
- T not();
-
- /**
- * {@link #and(Object) AND} and then {@link #not() NOT}
- *
- * @author Christian Femers
- */
- default T nand(S t)
- {
- return and(t).not();
- }
-
- /**
- * {@link #or(Object) OR} and then {@link #not() NOT}
- *
- * @author Christian Femers
- */
- default T nor(S t)
- {
- return or(t).not();
- }
-
- /**
- * {@link #xor(Object) XOR} and then {@link #not() NOT}<br>
- * Used to determine equality (alias parity, consistency)
- *
- * @author Christian Femers
- */
- default T xnor(S t)
- {
- return xor(t).not();
- }
-}
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-import java.util.function.BiFunction;
-
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-
-@FunctionalInterface
-public interface MutationOperation extends BiFunction<BitVectorMutator, BitVector, BitVectorMutator>
-{
- // no changes necessary, only for convenience and readability
-}
+++ /dev/null
-package net.mograsim.logic.core.types;
-
-/**
- * Interface for types that support the basic logic operations only among themselves, making it mathematically closed
- *
- * @author Christian Femers
- * @see LogicType
- *
- * @param <T> the logic type itself to make the operations closed
- */
-public interface StrictLogicType<T extends StrictLogicType<T>> extends LogicType<T, T>
-{
- // this is just a matter of type parameters
-}
+++ /dev/null
-package net.mograsim.logic.core.wires;
-
-import static net.mograsim.logic.core.types.Bit.U;
-import static net.mograsim.logic.core.types.Bit.Z;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
-
-/**
- * Represents an array of wires that can store n bits of information.
- *
- * @author Fabian Stemmler
- *
- */
-public class Wire
-{
- private BitVector values;
- public final int travelTime;
- private List<ReadEnd> attached = new ArrayList<ReadEnd>();
- public final int length;
- private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();
- private Timeline timeline;
-
- public Wire(Timeline timeline, int length, int travelTime)
- {
- if (length < 1)
- throw new IllegalArgumentException(
- String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
- this.timeline = timeline;
- this.length = length;
- this.travelTime = travelTime;
- initValues();
- }
-
- private void initValues()
- {
- values = U.toVector(length);
- }
-
- private void recalculateSingleInput()
- {
- setNewValues(inputs.get(0).getInputValues());
- }
-
- private void recalculateMultipleInputs()
- {
- BitVectorMutator mutator = BitVectorMutator.empty();
- for (ReadWriteEnd wireArrayEnd : inputs)
- mutator.join(wireArrayEnd.getInputValues());
- setNewValues(mutator.get());
- }
-
- private void setNewValues(BitVector newValues)
- {
- if (values.equals(newValues))
- return;
- BitVector oldValues = values;
- values = newValues;
- notifyObservers(oldValues);
- }
-
- private void recalculate()
- {
- switch (inputs.size())
- {
- case 0:
- return;
- case 1:
- recalculateSingleInput();
- break;
- default:
- recalculateMultipleInputs();
- }
- }
-
- /**
- * The {@link Wire} is interpreted as an unsigned integer with n bits.
- *
- * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the same
- * value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
- *
- * @author Fabian Stemmler
- */
- public boolean hasNumericValue()
- {
- for (Bit b : values)
- {
- if (b != Bit.ZERO && b != Bit.ONE)
- return false;
- }
- return true;
- }
-
- /**
- * The {@link Wire} is interpreted as an unsigned integer with n bits.
- *
- * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
- *
- * @author Fabian Stemmler
- */
- public long getUnsignedValue()
- {
- long val = 0;
- long mask = 1;
- for (Bit bit : values)
- {
- switch (bit)
- {
- default:
- case Z:
- case X:
- return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;
- case ONE:
- val |= mask;
- break;
- case ZERO:
- }
- mask = mask << 1;
- }
- return val;
- }
-
- /**
- * The {@link Wire} is interpreted as a signed integer with n bits.
- *
- * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
- *
- * @author Fabian Stemmler
- */
- public long getSignedValue()
- {
- long val = getUnsignedValue();
- long mask = 1 << (length - 1);
- if ((mask & val) != 0)
- {
- int shifts = 64 - length;
- return (val << shifts) >> shifts;
- }
- return val;
- }
-
- public Bit getValue()
- {
- return getValue(0);
- }
-
- public Bit getValue(int index)
- {
- return values.getBit(index);
- }
-
- public BitVector getValues(int start, int end)
- {
- return values.subVector(start, end);
- }
-
- public BitVector getValues()
- {
- return values;
- }
-
- /**
- * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated.
- *
- * @param ob The {@link WireObserver} to be notified of changes.
- * @return true if the given {@link WireObserver} was not already registered, false otherwise
- *
- * @author Fabian Stemmler
- */
- private void attachEnd(ReadEnd end)
- {
- attached.add(end);
- }
-
- private void detachEnd(ReadEnd end)
- {
- attached.remove(end);
- }
-
- private void notifyObservers(BitVector oldValues)
- {
- for (ReadEnd o : attached)
- o.update(oldValues);
- }
-
- /**
- * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link Wire}. This {@link ReadWriteEnd} can be written to.
- */
- public ReadWriteEnd createReadWriteEnd()
- {
- return new ReadWriteEnd();
- }
-
- /**
- * Create a {@link ReadEnd} object, which is tied to this {@link Wire}. This {@link ReadEnd} cannot be written to.
- */
- public ReadEnd createReadOnlyEnd()
- {
- return new ReadEnd();
- }
-
- private void registerInput(ReadWriteEnd toRegister)
- {
- inputs.add(toRegister);
- }
-
- /**
- * A {@link ReadEnd} feeds a constant signal into the {@link Wire} it is tied to. The combination of all inputs determines the
- * {@link Wire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than Z 0
- * and 1 turn into X when they are mixed
- *
- * @author Fabian Stemmler
- */
- public class ReadEnd
- {
- private List<WireObserver> observers = new ArrayList<WireObserver>();
-
- private ReadEnd()
- {
- super();
- Wire.this.attachEnd(this);
- }
-
- public void update(BitVector oldValues)
- {
- for (WireObserver ob : observers)
- ob.update(this, oldValues);
- }
-
- /**
- * Included for convenient use on {@link Wire}s of length 1.
- *
- * @return The value of bit 0.
- *
- * @author Fabian Stemmler
- */
- public Bit getValue()
- {
- return Wire.this.getValue();
- }
-
- /**
- * @param index Index of the requested bit.
- * @return The value of the indexed bit.
- *
- * @author Fabian Stemmler
- */
- public Bit getValue(int index)
- {
- return Wire.this.getValue(index);
- }
-
- /**
- * @param index Index of the requested bit.
- * @return The value of the indexed bit.
- *
- * @author Fabian Stemmler
- */
- public BitVector getValues()
- {
- return Wire.this.getValues();
- }
-
- /**
- * @param start Start of the wanted segment. (inclusive)
- * @param end End of the wanted segment. (exclusive)
- * @return The values of the segment of {@link Bit}s indexed.
- *
- * @author Fabian Stemmler
- */
- public BitVector getValues(int start, int end)
- {
- return Wire.this.getValues(start, end);
- }
-
- /**
- * The {@link Wire} is interpreted as an unsigned integer with n bits.
- *
- * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the
- * same value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
- *
- * @author Fabian Stemmler
- */
- public boolean hasNumericValue()
- {
- return Wire.this.hasNumericValue();
- }
-
- /**
- * The {@link Wire} is interpreted as an unsigned integer with n bits.
- *
- * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
- *
- * @author Fabian Stemmler
- */
- public long getUnsignedValue()
- {
- return Wire.this.getUnsignedValue();
- }
-
- /**
- * The {@link Wire} is interpreted as a signed integer with n bits.
- *
- * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
- *
- * @author Fabian Stemmler
- */
- public long getSignedValue()
- {
- return Wire.this.getSignedValue();
- }
-
- @Override
- public String toString()
- {
- return Wire.this.toString();
- }
-
- public void close()
- {
- inputs.remove(this);
- detachEnd(this);
- recalculate();
- }
-
- public int length()
- {
- return length;
- }
-
- public boolean addObserver(WireObserver ob)
- {
- return observers.add(ob);
- }
-
- public Wire getWire()
- {
- return Wire.this;
- }
- }
-
- public class ReadWriteEnd extends ReadEnd
- {
- private boolean open;
- private BitVector inputValues;
-
- private ReadWriteEnd()
- {
- super();
- open = true;
- initValues();
- registerInput(this);
- }
-
- private void initValues()
- {
- inputValues = U.toVector(length);
- }
-
- /**
- * Sets the wires values. This takes up time, as specified by the {@link Wire}s travel time.
- *
- * @param newValues The new values the wires should take on.
- *
- * @author Fabian Stemmler
- */
- public void feedSignals(Bit... newValues)
- {
- feedSignals(BitVector.of(newValues));
- }
-
- public void feedSignals(BitVector newValues)
- {
- if (newValues.length() != length)
- throw new IllegalArgumentException(
- String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));
- if (!open)
- throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
- timeline.addEvent(e -> setValues(newValues), travelTime);
- }
-
- /**
- * Sets values of a subarray of wires. This takes up time, as specified by the {@link Wire}s travel time.
- *
- * @param bitVector The new values the wires should take on.
- * @param startingBit The first index of the subarray of wires.
- *
- * @author Fabian Stemmler
- */
- public void feedSignals(int startingBit, BitVector bitVector)
- {
- if (!open)
- throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
- timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);
- }
-
- private void setValues(int startingBit, BitVector newValues)
- {
- // index check covered in equals
- if (!inputValues.equalsWithOffset(newValues, startingBit))
- {
- Bit[] vals = inputValues.getBits();
- System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length());
- inputValues = BitVector.of(vals);
- Wire.this.recalculate();
- }
- }
-
- private void setValues(BitVector newValues)
- {
- if (inputValues.equals(newValues))
- return;
- inputValues = newValues;
- Wire.this.recalculate();
- }
-
- /**
- * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
- */
- public Bit getInputValue()
- {
- return getInputValue(0);
- }
-
- /**
- * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link Wire} at the indexed {@link Bit}.
- */
- public Bit getInputValue(int index)
- {
- return inputValues.getBit(index);
- }
-
- /**
- * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
- */
- public BitVector getInputValues()
- {
- return getInputValues(0, length);
- }
-
- public BitVector getInputValues(int start, int end)
- {
- return inputValues.subVector(start, end);
- }
-
- /**
- * {@link ReadEnd} now feeds Z into the associated {@link Wire}.
- */
- public void clearSignals()
- {
- feedSignals(Z.toVector(length));
- }
-
- public BitVector wireValuesExcludingMe()
- {
- BitVectorMutator mutator = BitVectorMutator.empty();
- for (ReadWriteEnd wireEnd : inputs)
- {
- if (wireEnd == this)
- continue;
- mutator.join(wireEnd.inputValues);
- }
- return mutator.get();
- }
-
- @Override
- public String toString()
- {
- return inputValues.toString();
- }
- }
-
- @Override
- public String toString()
- {
- return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs);
- // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)
- }
-
- public static ReadEnd[] extractEnds(Wire[] w)
- {
- ReadEnd[] inputs = new ReadEnd[w.length];
- for (int i = 0; i < w.length; i++)
- inputs[i] = w[i].createReadWriteEnd();
- return inputs;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.wires;
-
-import net.mograsim.logic.core.types.BitVector;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-
-public interface WireObserver
-{
- public void update(ReadEnd initiator, BitVector oldValues);
-}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+/bin/
+*.class
+*.log
+
+# package files
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# vm crash logs
+hs_err_pid*
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>net.mograsim.logic.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=10
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=10
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=140
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=140
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
--- /dev/null
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_MoGraSim
+formatter_settings_version=16
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=false
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=true
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=true
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=true
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: net.mograsim.logic.core
+Bundle-SymbolicName: net.mograsim.logic.core
+Bundle-Version: 1.0.0.qualifier
+Export-Package: net.mograsim.logic.core,
+ net.mograsim.logic.core.components,
+ net.mograsim.logic.core.components.gates,
+ net.mograsim.logic.core.tests,
+ net.mograsim.logic.core.timeline,
+ net.mograsim.logic.core.types,
+ net.mograsim.logic.core.wires
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+Automatic-Module-Name: net.mograsim.logic.core
--- /dev/null
+source.. = src/
+bin.includes = META-INF/,\
+ .
--- /dev/null
+package net.mograsim.logic.core;
+
+import java.util.Arrays;
+
+import net.mograsim.logic.core.types.Bit;
+
+public final class Util
+{
+
+ @SuppressWarnings("unchecked")
+ public static <T> T[] concat(T[]... arrays)
+ {
+ if (arrays.length == 0)
+ throw new IllegalArgumentException("Cannot concatenate 0 arrays.");
+
+ int length = 0;
+ for (T[] array : arrays)
+ length += array.length;
+
+ T[] newArray = Arrays.copyOf(arrays[0], length);
+ int appendIndex = arrays[0].length;
+ for (int i = 1; i < arrays.length; i++)
+ {
+ System.arraycopy(arrays[i], 0, newArray, appendIndex, arrays[i].length);
+ appendIndex += arrays[i].length;
+ }
+
+ return newArray;
+ }
+
+// @SuppressWarnings("unchecked")
+// public static <T> T[][] split(T[] array, int... lengths)
+// {
+// //TODO: implement array split again; This version contains an illegal cast
+// int totalLength = 0;
+// for(int length : lengths)
+// totalLength += length;
+//
+// if(totalLength != array.length)
+// throw new IllegalArgumentException(); //TODO: add proper error message
+//
+// Object[][] newArray = new Object[lengths.length][];
+// int splitIndex = 0;
+// for(int i = 0; i < lengths.length; i++)
+// {
+// System.arraycopy(array, splitIndex, newArray, 0, lengths[i]);
+// splitIndex += lengths[i];
+// }
+//
+// return (T[][]) newArray;
+// }
+
+ public static Bit[] and(Bit[] a, Bit[] b)
+ {
+ return binBitOp(a, b, Bit::and);
+ }
+
+ public static Bit[] or(Bit[] a, Bit[] b)
+ {
+ return binBitOp(a, b, Bit::or);
+ }
+
+ public static Bit[] xor(Bit[] a, Bit[] b)
+ {
+ return binBitOp(a, b, Bit::xor);
+ }
+
+ private static Bit[] binBitOp(Bit[] a, Bit[] b, BitOp op)
+ {
+ if (a.length != b.length)
+ throw new IllegalArgumentException("Bit Arrays were not of equal length.");
+ Bit[] out = new Bit[a.length];
+ for (int i = 0; i < a.length; i++)
+ {
+ out[i] = op.execute(a[i], b[i]);
+ }
+ return out;
+ }
+
+ public static Bit[] not(Bit[] a)
+ {
+ Bit[] out = new Bit[a.length];
+ for (int i = 0; i < a.length; i++)
+ {
+ out[i] = a[i].not();
+ }
+ return out;
+ }
+
+ /**
+ * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, the result is stored in the first array.
+ *
+ * @author Christian Femers
+ */
+ public static Bit[] combineInto(Bit[] dest, Bit[] addition)
+ {
+ if (dest.length != addition.length)
+ throw new IllegalArgumentException("Bit Arrays were not of equal length.");
+ for (int i = 0; i < addition.length; i++)
+ {
+ dest[i] = dest[i].join(addition[i]);
+ }
+ return dest;
+ }
+
+ interface BitOp
+ {
+ Bit execute(Bit a, Bit b);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+/**
+ * A basic component that recomputes all outputs (with a delay), when it is updated.
+ *
+ * @author Fabian Stemmler
+ */
+public abstract class BasicComponent extends Component implements WireObserver
+{
+ private int processTime;
+
+ /**
+ *
+ * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed.
+ *
+ * @author Fabian Stemmler
+ */
+ public BasicComponent(Timeline timeline, int processTime)
+ {
+ super(timeline);
+ this.processTime = processTime > 0 ? processTime : 1;
+ }
+
+ @Override
+ public void update(ReadEnd initiator, BitVector oldValues)
+ {
+ timeline.addEvent(e -> compute(), processTime);
+ }
+
+ protected abstract void compute();
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class BitDisplay extends BasicComponent
+{
+ private final ReadEnd in;
+ private BitVector displayedValue;
+
+ public BitDisplay(Timeline timeline, ReadEnd in)
+ {
+ super(timeline, 1);
+ this.in = in;
+ in.addObserver(this);
+ compute();
+ }
+
+ @Override
+ protected void compute()
+ {
+ displayedValue = in.getValues();
+ }
+
+ public BitVector getDisplayedValue()
+ {
+ return displayedValue;
+ }
+
+ public boolean isDisplaying(Bit... values)
+ {
+ return displayedValue.equals(BitVector.of(values));
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(in);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of();
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.TimelineEvent;
+import net.mograsim.logic.core.timeline.TimelineEventHandler;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Clock extends Component implements TimelineEventHandler
+{
+ private boolean toggle = false;
+ private ReadWriteEnd out;
+ private int delta;
+
+ /**
+ *
+ * @param out {@link Wire} the clock's impulses are fed into
+ * @param delta ticks between rising and falling edge
+ */
+ public Clock(Timeline timeline, ReadWriteEnd out, int delta)
+ {
+ super(timeline);
+ this.delta = delta;
+ this.out = out;
+ addToTimeline();
+ }
+
+ @Override
+ public void handle(TimelineEvent e)
+ {
+ addToTimeline();
+ out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
+ toggle = !toggle;
+ }
+
+ public ReadWriteEnd getOut()
+ {
+ return out;
+ }
+
+ private void addToTimeline()
+ {
+ timeline.addEvent(this, delta);
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of();
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public abstract class Component
+{
+ protected Timeline timeline;
+
+ public Component(Timeline timeline)
+ {
+ this.timeline = timeline;
+ }
+
+ /**
+ * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization
+ * in the UI.
+ */
+ public abstract List<ReadEnd> getAllInputs();
+
+ /**
+ * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.
+ */
+ public abstract List<ReadWriteEnd> getAllOutputs();
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Connector extends Component implements WireObserver
+{
+ private boolean connected;
+ private final ReadWriteEnd a;
+ private final ReadWriteEnd b;
+
+ public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)
+ {
+ super(timeline);
+ if (a.length() != b.length())
+ throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));
+ this.a = a;
+ this.b = b;
+ a.addObserver(this);
+ b.addObserver(this);
+ }
+
+ public void connect()
+ {
+ connected = true;
+ update(a);
+ update(b);
+ }
+
+ public void disconnect()
+ {
+ connected = false;
+ a.clearSignals();
+ b.clearSignals();
+ }
+
+ public void setConnection(boolean connected)
+ {
+ if (connected)
+ connect();
+ else
+ disconnect();
+ }
+
+ @Override
+ public void update(ReadEnd initiator, BitVector oldValues)
+ {
+ if (connected)
+ timeline.addEvent(e -> update(initiator), 1);
+ }
+
+ private void update(ReadEnd initiator)
+ {
+ if (initiator == a)
+ b.feedSignals(a.wireValuesExcludingMe());
+ else
+ a.feedSignals(b.wireValuesExcludingMe());
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(a, b);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(a, b);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
+ * output.
+ *
+ * @author Fabian Stemmler
+ *
+ */
+public class Demux extends BasicComponent
+{
+ private final ReadEnd select, in;
+ private final ReadWriteEnd[] outputs;
+ private final int outputSize;
+ private int selected = -1;
+
+ /**
+ * Output {@link Wire}s and in must be of uniform length
+ *
+ * @param in Must be of uniform length with all outputs.
+ * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs.
+ * @param outputs One of these outputs receives the input signal, depending on the select bits
+ */
+ public Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)
+ {
+ super(timeline, processTime);
+ outputSize = in.length();
+
+ this.in = in;
+ this.outputs = outputs;
+ for (int i = 0; i < this.outputs.length; i++)
+ {
+ if (outputs[i].length() != outputSize)
+ throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");
+ this.outputs[i] = outputs[i];
+ }
+
+ this.select = select;
+ select.addObserver(this);
+
+ int maxInputs = 1 << select.length();
+ if (this.outputs.length > maxInputs)
+ throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by "
+ + select.length() + " select bits (" + maxInputs + ").");
+ in.addObserver(this);
+ }
+
+ @Override
+ public void compute()
+ {
+ int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;
+ if (selectValue >= outputs.length)
+ selectValue = -1;
+
+ if (selected != selectValue && selected != -1)
+ outputs[selected].clearSignals();
+
+ selected = selectValue;
+
+ if (selectValue != -1)
+ outputs[selectValue].feedSignals(in.getValues());
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(in, select);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(outputs);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * This class models a simple on/off (ONE/ZERO) switch for user interaction.
+ *
+ * @author Christian Femers
+ *
+ */
+public class ManualSwitch extends Component
+{
+ private ReadWriteEnd output;
+ private boolean isOn;
+
+ public ManualSwitch(Timeline timeline, ReadWriteEnd output)
+ {
+ super(timeline);
+ if (output.length() != 1)
+ throw new IllegalArgumentException("Switch output can be only a single wire");
+ this.output = output;
+ }
+
+ public void switchOn()
+ {
+ setState(true);
+ }
+
+ public void switchOff()
+ {
+ setState(false);
+ }
+
+ public void toggle()
+ {
+ setState(!isOn);
+ }
+
+ public void setState(boolean isOn)
+ {
+ if (this.isOn == isOn)
+ return;
+ this.isOn = isOn;
+ output.feedSignals(getValue());
+ }
+
+ public boolean isOn()
+ {
+ return isOn;
+ }
+
+ public Bit getValue()
+ {
+ return isOn ? Bit.ONE : Bit.ZERO;
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of();
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(output);
+ }
+
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Merger extends Component implements WireObserver
+{
+ private ReadWriteEnd out;
+ private ReadEnd[] inputs;
+ private int[] beginningIndex;
+
+ /**
+ *
+ * @param union The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().
+ * @param inputs The inputs to be merged into the union
+ */
+ public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)
+ {
+ super(timeline);
+ this.inputs = inputs;
+ this.out = union;
+ this.beginningIndex = new int[inputs.length];
+
+ int length = 0;
+ for (int i = 0; i < inputs.length; i++)
+ {
+ beginningIndex[i] = length;
+ length += inputs[i].length();
+ inputs[i].addObserver(this);
+ }
+
+ if (length != union.length())
+ throw new IllegalArgumentException(
+ "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");
+ }
+
+ public ReadEnd getInput(int index)
+ {
+ return inputs[index];
+ }
+
+ public ReadEnd getUnion()
+ {
+ return out;
+ }
+
+ @Override
+ public void update(ReadEnd initiator, BitVector oldValues)
+ {
+ int index = find(initiator);
+ int beginning = beginningIndex[index];
+ out.feedSignals(beginning, inputs[index].getValues());
+ }
+
+ private int find(ReadEnd r)
+ {
+ for (int i = 0; i < inputs.length; i++)
+ if (inputs[i] == r)
+ return i;
+ return -1;
+ }
+
+ public ReadEnd[] getInputs()
+ {
+ return inputs.clone();
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(inputs);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the
+ * output.
+ *
+ * @author Fabian Stemmler
+ *
+ */
+public class Mux extends BasicComponent
+{
+ private ReadEnd select;
+ private ReadWriteEnd out;
+ private ReadEnd[] inputs;
+ private final int outputSize;
+
+ /**
+ * Input {@link Wire}s and out must be of uniform length
+ *
+ * @param out Must be of uniform length with all inputs.
+ * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs.
+ * @param inputs One of these inputs is mapped to the output, depending on the select bits
+ */
+ public Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+ {
+ super(timeline, processTime);
+ outputSize = out.length();
+
+ this.inputs = inputs.clone();
+ for (int i = 0; i < this.inputs.length; i++)
+ {
+ if (inputs[i].length() != outputSize)
+ throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");
+ inputs[i].addObserver(this);
+ }
+
+ this.select = select;
+ select.addObserver(this);
+
+ int maxInputs = 1 << select.length();
+ if (this.inputs.length > maxInputs)
+ throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "
+ + select.length() + " select bits (" + maxInputs + ").");
+
+ this.out = out;
+ }
+
+ public ReadEnd getOut()
+ {
+ return out;
+ }
+
+ public ReadEnd getSelect()
+ {
+ return select;
+ }
+
+ @Override
+ public void compute()
+ {
+ int selectValue;
+ if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)
+ {
+ out.clearSignals();
+ return;
+ }
+
+ ReadEnd active = inputs[selectValue];
+ out.feedSignals(active.getValues());
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));
+ wires.add(select);
+ return Collections.unmodifiableList(wires);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.WireObserver;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class Splitter extends Component implements WireObserver
+{
+ private ReadEnd input;
+ private ReadWriteEnd[] outputs;
+
+ public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)
+ {
+ super(timeline);
+ this.input = input;
+ this.outputs = outputs;
+ input.addObserver(this);
+ int length = 0;
+ for (ReadEnd out : outputs)
+ length += out.length();
+
+ if (input.length() != length)
+ throw new IllegalArgumentException(
+ "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");
+ }
+
+ protected void compute()
+ {
+ BitVector inputBits = input.getValues();
+ int startIndex = 0;
+ for (int i = 0; i < outputs.length; i++)
+ {
+ outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));
+ startIndex += outputs[i].length();
+ }
+ }
+
+ @Override
+ public void update(ReadEnd initiator, BitVector oldValues)
+ {
+ compute();
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(input);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(outputs);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components;
+
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class TriStateBuffer extends BasicComponent
+{
+ ReadEnd in, enable;
+ ReadWriteEnd out;
+
+ public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)
+ {
+ super(timeline, processTime);
+ if (in.length() != out.length())
+ throw new IllegalArgumentException(
+ "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());
+ if (enable.length() != 1)
+ throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");
+ this.in = in;
+ in.addObserver(this);
+ this.enable = enable;
+ enable.addObserver(this);
+ this.out = out;
+ }
+
+ @Override
+ protected void compute()
+ {
+ if (enable.getValue() == Bit.ONE)
+ out.feedSignals(in.getValues());
+ else
+ out.clearSignals();
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(in, enable);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+
+}
--- /dev/null
+package net.mograsim.logic.core.components.gates;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class AndGate extends MultiInputGate
+{
+ public AndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
+ {
+ super(timeline, processTime, BitVectorMutator::and, out, in);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components.gates;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.MutationOperation;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public abstract class MultiInputGate extends BasicComponent
+{
+ protected ReadEnd[] in;
+ protected ReadWriteEnd out;
+ protected final int length;
+ protected MutationOperation op;
+
+ protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)
+ {
+ super(timeline, processTime);
+ this.op = op;
+ length = out.length();
+ this.in = in.clone();
+ if (in.length < 1)
+ throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));
+ for (ReadEnd w : in)
+ {
+ if (w.length() != length)
+ throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");
+ w.addObserver(this);
+ }
+ this.out = out;
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(in);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+
+ @Override
+ protected void compute()
+ {
+ BitVectorMutator mutator = BitVectorMutator.empty();
+ for (ReadEnd w : in)
+ op.apply(mutator, w.getValues());
+ out.feedSignals(mutator.get());
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components.gates;
+
+import java.util.List;
+
+import net.mograsim.logic.core.components.BasicComponent;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class NotGate extends BasicComponent
+{
+ private ReadEnd in;
+ private ReadWriteEnd out;
+
+ public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)
+ {
+ super(timeline, processTime);
+ this.in = in;
+ in.addObserver(this);
+ this.out = out;
+ }
+
+ @Override
+ protected void compute()
+ {
+ out.feedSignals(in.getValues().not());
+ }
+
+ public ReadEnd getIn()
+ {
+ return in;
+ }
+
+ public ReadEnd getOut()
+ {
+ return out;
+ }
+
+ @Override
+ public List<ReadEnd> getAllInputs()
+ {
+ return List.of(in);
+ }
+
+ @Override
+ public List<ReadWriteEnd> getAllOutputs()
+ {
+ return List.of(out);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components.gates;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class OrGate extends MultiInputGate
+{
+ public OrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
+ {
+ super(timeline, processTime, BitVectorMutator::or, out, in);
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.components.gates;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+/**
+ * Outputs 1 when the number of 1 inputs is odd.
+ *
+ * @author Fabian Stemmler
+ */
+public class XorGate extends MultiInputGate
+{
+ public XorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)
+ {
+ super(timeline, processTime, BitVectorMutator::xor, out, in);
+ }
+
+}
--- /dev/null
+package net.mograsim.logic.core.tests;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.function.LongConsumer;
+
+import org.junit.jupiter.api.Test;
+
+import net.mograsim.logic.core.components.Connector;
+import net.mograsim.logic.core.components.Demux;
+import net.mograsim.logic.core.components.Merger;
+import net.mograsim.logic.core.components.Mux;
+import net.mograsim.logic.core.components.Splitter;
+import net.mograsim.logic.core.components.TriStateBuffer;
+import net.mograsim.logic.core.components.gates.AndGate;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.components.gates.XorGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+class ComponentTest
+{
+ private Timeline t = new Timeline(11);
+
+ @Test
+ void circuitExampleTest()
+ {
+ Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
+ f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
+ k = new Wire(t, 1, 1);
+ new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+ new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
+ new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
+ new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
+ new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
+
+ a.createReadWriteEnd().feedSignals(Bit.ZERO);
+ b.createReadWriteEnd().feedSignals(Bit.ONE);
+ c.createReadWriteEnd().feedSignals(Bit.ZERO);
+ d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
+ e.createReadWriteEnd().feedSignals(Bit.ZERO);
+
+ t.executeAll();
+
+ assertEquals(Bit.ONE, j.getValue());
+ assertEquals(Bit.ZERO, k.getValue());
+ }
+
+ @Test
+ void splitterTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
+ in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+ new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
+
+ t.executeAll();
+
+ assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
+ assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
+ assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
+ }
+
+ @Test
+ void mergerTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
+ a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
+ b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
+ c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+
+ t.executeAll();
+
+ assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+ }
+
+ @Test
+ void triStateBufferTest()
+ {
+ Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
+ new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
+ new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
+ new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
+
+ ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
+ enI.feedSignals(Bit.ONE);
+ aI.feedSignals(Bit.ONE);
+ bI.feedSignals(Bit.Z);
+
+ t.executeAll();
+
+ assertEquals(Bit.ONE, b.getValue());
+
+ bI.feedSignals(Bit.ZERO);
+
+ t.executeAll();
+
+ assertEquals(Bit.X, b.getValue());
+ assertEquals(Bit.ONE, a.getValue());
+
+ aI.clearSignals();
+ enI.feedSignals(Bit.ZERO);
+
+ t.executeAll();
+
+ assertEquals(Bit.ZERO, a.getValue());
+
+ }
+
+ @Test
+ void muxTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(t, 4, 1);
+ ReadWriteEnd selectIn = select.createReadWriteEnd();
+
+ selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+ a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+ c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
+ c.createReadOnlyEnd());
+ t.executeAll();
+
+ assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+ selectIn.feedSignals(Bit.ZERO, Bit.ONE);
+ t.executeAll();
+
+ assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ selectIn.feedSignals(Bit.ONE, Bit.ONE);
+ t.executeAll();
+
+ assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+
+ }
+
+ @Test
+ void demuxTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(t, 4, 1);
+ ReadWriteEnd selectIn = select.createReadWriteEnd();
+
+ selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
+ in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+
+ new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
+ c.createReadWriteEnd());
+ t.executeAll();
+
+ assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+ assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+ assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+ selectIn.feedSignals(Bit.ZERO, Bit.ONE);
+ t.executeAll();
+
+ assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+ assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+ assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
+
+ selectIn.feedSignals(Bit.ONE, Bit.ONE);
+ t.executeAll();
+
+ assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+ assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
+ assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
+
+ }
+
+ @Test
+ void andTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+ new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+ a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+ b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ t.executeAll();
+
+ assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
+ }
+
+ @Test
+ void orTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
+ new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
+ a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
+ b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ t.executeAll();
+
+ assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
+ }
+
+ @Test
+ void xorTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
+ new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
+ a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+ b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+ c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
+
+ t.executeAll();
+
+ assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
+ }
+
+ @Test
+ void notTest()
+ {
+ t.reset();
+ Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
+ new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
+ a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
+
+ t.executeAll();
+
+ assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
+ }
+
+ @Test
+ void rsLatchCircuitTest()
+ {
+ t.reset();
+ Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
+ nq = new Wire(t, 1, 1);
+
+ new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+ new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+ new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+ new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+
+ ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
+
+ sIn.feedSignals(Bit.ONE);
+ rIn.feedSignals(Bit.ZERO);
+
+ t.executeAll();
+
+ assertEquals(Bit.ONE, q.getValue());
+ assertEquals(Bit.ZERO, nq.getValue());
+
+ sIn.feedSignals(Bit.ZERO);
+
+ t.executeAll();
+ assertEquals(Bit.ONE, q.getValue());
+ assertEquals(Bit.ZERO, nq.getValue());
+
+ rIn.feedSignals(Bit.ONE);
+
+ t.executeAll();
+
+ assertEquals(Bit.ZERO, q.getValue());
+ assertEquals(Bit.ONE, nq.getValue());
+ }
+
+ @Test
+ void numericValueTest()
+ {
+ t.reset();
+
+ Wire a = new Wire(t, 4, 1);
+ a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
+
+ t.executeAll();
+
+ assertEquals(15, a.getUnsignedValue());
+ assertEquals(-1, a.getSignedValue());
+ }
+
+ boolean flag = false;
+
+ @Test
+ void simpleTimelineTest()
+ {
+ Timeline t = new Timeline(3);
+ flag = false;
+ t.addEvent((e) ->
+ {
+ if (!flag)
+ fail();
+ flag = false;
+ }, 15);
+ t.addEvent((e) ->
+ {
+ if (flag)
+ fail();
+ flag = true;
+ }, 10);
+ t.addEvent((e) ->
+ {
+ if (flag)
+ fail();
+ flag = true;
+ }, 20);
+ t.addEvent((e) ->
+ {
+ fail("Only supposed to execute until timestamp 20, not 25");
+ }, 25);
+
+ t.executeUntil(t.laterThan(20), 100);
+
+ if (!flag)
+ fail();
+ }
+
+ @Test
+ void multipleInputs()
+ {
+ t.reset();
+ Wire w = new Wire(t, 2, 1);
+ ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
+ wI1.feedSignals(Bit.ONE, Bit.Z);
+ wI2.feedSignals(Bit.Z, Bit.X);
+ t.executeAll();
+ assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
+
+ wI2.feedSignals(Bit.ZERO, Bit.Z);
+ t.executeAll();
+ assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
+
+ wI2.feedSignals(Bit.Z, Bit.Z);
+ t.executeAll();
+ assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
+
+ wI2.feedSignals(Bit.ONE, Bit.Z);
+ ReadEnd rE = w.createReadOnlyEnd();
+ rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));
+ t.executeAll();
+ rE.close();
+ wI1.feedSignals(Bit.X, Bit.X);
+ t.executeAll();
+ wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));
+ wI1.close();
+ assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
+ }
+
+ @Test
+ void wireConnections()
+ {
+ // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
+
+ t.reset();
+
+ Wire a = new Wire(t, 1, 2);
+ Wire b = new Wire(t, 1, 2);
+ Wire c = new Wire(t, 1, 2);
+ ReadWriteEnd aI = a.createReadWriteEnd();
+ ReadWriteEnd bI = b.createReadWriteEnd();
+ ReadWriteEnd cI = c.createReadWriteEnd();
+
+ TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
+ TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
+ LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);
+
+ cI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+
+ cI.feedSignals(Bit.X);
+ test.assertAfterSimulationIs(print, Bit.X);
+
+ cI.feedSignals(Bit.X);
+ cI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(print, Bit.Z);
+
+ new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
+ test.assertAfterSimulationIs(print, Bit.Z);
+ System.err.println("ONE");
+ bI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ System.err.println("ZERO");
+ bI.feedSignals(Bit.ZERO);
+ test.assertAfterSimulationIs(print, Bit.ZERO);
+ System.err.println("Z");
+ bI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(print, Bit.Z);
+
+ new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
+ System.err.println("Z 2");
+ aI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(print, Bit.Z);
+ test2.assertAfterSimulationIs(Bit.Z);
+ System.err.println("ONE 2");
+ aI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ test2.assertAfterSimulationIs(Bit.ONE);
+ System.err.println("ZERO 2");
+ aI.feedSignals(Bit.ZERO);
+ test.assertAfterSimulationIs(print, Bit.ZERO);
+ test2.assertAfterSimulationIs(Bit.ZERO);
+ System.err.println("Z 2 II");
+ aI.feedSignals(Bit.Z);
+ test.assertAfterSimulationIs(print, Bit.Z);
+ test2.assertAfterSimulationIs(Bit.Z);
+
+ System.err.println("No Conflict yet");
+ bI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ test2.assertAfterSimulationIs(Bit.ONE);
+ aI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ test2.assertAfterSimulationIs(Bit.ONE);
+ System.err.println("Conflict");
+ aI.feedSignals(Bit.ZERO);
+ test.assertAfterSimulationIs(print, Bit.X);
+ test2.assertAfterSimulationIs(Bit.X);
+ aI.feedSignals(Bit.ONE);
+ test.assertAfterSimulationIs(print, Bit.ONE);
+ test2.assertAfterSimulationIs(Bit.ONE);
+ }
+
+ private static void assertBitArrayEquals(BitVector actual, Bit... expected)
+ {
+ assertArrayEquals(expected, actual.getBits());
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.tests;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.WindowConstants;
+
+import net.mograsim.logic.core.components.ManualSwitch;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
+import net.mograsim.logic.core.wires.Wire;
+
+public class GUITest extends JPanel
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private static final int WIRE_DELAY = 40;
+ private static final int OR_DELAY = 100;
+ private static final int NOT_DELAY = 100;
+
+ private Timeline t = new Timeline(11);
+
+ Wire r = new Wire(t, 1, WIRE_DELAY);
+ Wire s = new Wire(t, 1, WIRE_DELAY);
+ Wire t1 = new Wire(t, 1, WIRE_DELAY);
+ Wire t2 = new Wire(t, 1, WIRE_DELAY);
+ Wire q = new Wire(t, 1, WIRE_DELAY);
+ Wire nq = new Wire(t, 1, WIRE_DELAY);
+
+ ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());
+ ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());
+
+ OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
+ OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
+ NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());
+ NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
+
+ Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();
+
+ int height;
+ int width;
+ boolean sizeChanged;
+
+ public GUITest()
+ {
+ addMouseListener(new MouseListener()
+ {
+
+ @Override
+ public void mouseReleased(MouseEvent e)
+ {
+ for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
+ {
+ if (dim.getValue().contains(e.getPoint()))
+ {
+ dim.getKey().switchOff();
+ repaint();
+ }
+ }
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e)
+ {
+ for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())
+ {
+ if (dim.getValue().contains(e.getPoint()))
+ {
+ dim.getKey().switchOn();
+ repaint();
+ }
+ }
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e)
+ {
+ // none
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e)
+ {
+ // none
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e)
+ {
+ // If you want toggle buttons, use this code instead
+// for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {
+// if (dim.getValue().contains(e.getPoint())) {
+// dim.getKey().toggle();
+// repaint();
+// }
+// }
+ }
+ });
+ }
+
+ public Timeline getTimeline()
+ {
+ return t;
+ };
+
+ @Override
+ public void paint(Graphics some_g)
+ {
+ super.paint(some_g);
+ Graphics2D g = ((Graphics2D) some_g);
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
+
+ checkSizeChange();
+ adaptFont(g);
+
+ drawWire(g, r, "r", 2, 9, 4, 9);
+
+ drawWire(g, s, "s", 2, 3, 4, 3);
+
+ drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);
+
+ drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);
+
+ drawWire(g, q, "q", 7, 8.5, 9, 8.5);
+
+ drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);
+
+ drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);
+ drawWire(g, q, "", 7.5, 7.5, 3, 4.5);
+ drawWire(g, q, "", 3, 4.5, 3, 4);
+ drawWire(g, q, "q", 3, 4, 4, 4);
+
+ drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);
+ drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);
+ drawWire(g, nq, "", 3, 7.5, 3, 8);
+ drawWire(g, nq, "nq", 3, 8, 4, 8);
+
+ drawSquare(g, 4, 8, "OR");
+ drawSquare(g, 4, 3, "OR");
+
+ drawSquare(g, 6, 8, "NOT");
+ drawSquare(g, 6, 3, "NOT");
+
+ drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);
+ drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);
+
+ drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);
+ }
+
+ private void checkSizeChange()
+ {
+ sizeChanged = height != getHeight() || width != getWidth();
+ if (sizeChanged)
+ {
+ height = getHeight();
+ width = getWidth();
+ }
+ }
+
+ private void adaptFont(Graphics g)
+ {
+ g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));
+ }
+
+ private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)
+ {
+ int h = g.getFontMetrics().getAscent();
+ int w = g.getFontMetrics().stringWidth(s);
+ g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));
+ }
+
+ private void drawWire(Graphics g, Wire wa, String name, double x1, double y1, double x2, double y2)
+ {
+ setTo(g, wa);
+ g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));
+ drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);
+ }
+
+ private void drawSquare(Graphics g, int posX, int posY, String text)
+ {
+ int x1 = gX(posX) - 5;
+ int x2 = gX(posX + 1) + 5;
+ int y1 = gY(posY) - 5;
+ int y2 = gY(posY + 1) + 5;
+
+ g.setColor(Color.WHITE);
+ g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+ setBlack(g);
+ g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+ drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
+
+ }
+
+ private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)
+ {
+ int x1 = gX(posX1) - 5;
+ int x2 = gX(posX2) + 5;
+ int y1 = gY(posY1) - 5;
+ int y2 = gY(posY2) + 5;
+
+ if (sizeChanged)
+ {
+ Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);
+ switchMap.put(ms, r);
+ }
+
+ g.setColor(ms.isOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);
+ g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+ setBlack(g);
+ g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
+ drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);
+ }
+
+ private static void setBlack(Graphics g)
+ {
+ g.setColor(Color.BLACK);
+ }
+
+ private static void setTo(Graphics g, Wire wa)
+ {
+ switch (wa.getValue())
+ {
+ case ONE:
+ g.setColor(Color.GREEN);
+ break;
+ case X:
+ g.setColor(Color.RED);
+ break;
+ case Z:
+ g.setColor(Color.DARK_GRAY);
+ break;
+ case ZERO:
+ g.setColor(Color.BLACK);
+ break;
+ case U:
+ g.setColor(Color.MAGENTA);
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private int gY(double pos)
+ {
+ return (int) (pos * height / 11);
+ }
+
+ private int gX(double pos)
+ {
+ return (int) (pos * width / 11) + 50;
+ }
+
+ public static void main(String[] args)
+ {
+ JFrame f = new JFrame("Test circuit 1.0.0");
+ GUITest gt = new GUITest();
+ f.add(gt);
+ f.setSize(800, 600);
+ f.setLocation(500, 400);
+ f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ f.setVisible(true);
+
+ long begin = System.currentTimeMillis();
+
+ long lastFrame = begin;
+ long updateT = 16;
+
+ while (f.isVisible())
+ {
+ ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);
+// if (t.hasNext())
+// t.executeNext();
+ if (er != ExecutionResult.NOTHING_DONE)
+ gt.repaint(12);
+ try
+ {
+ Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ lastFrame = System.currentTimeMillis();
+ }
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.tests;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
+import java.util.function.LongConsumer;
+
+import net.mograsim.logic.core.components.BitDisplay;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public final class TestBitDisplay extends BitDisplay
+{
+
+ public TestBitDisplay(Timeline timeline, ReadEnd in)
+ {
+ super(timeline, in);
+ }
+
+ public void assertDisplays(Bit... expected)
+ {
+ assertArrayEquals(expected, getDisplayedValue().getBits());
+ }
+
+ public void assertAfterSimulationIs(Bit... expected)
+ {
+ timeline.executeAll();
+ assertDisplays(expected);
+ }
+
+ public void assertAfterSimulationIs(LongConsumer r, Bit... expected)
+ {
+ while (timeline.hasNext())
+ {
+ timeline.executeNext();
+ r.accept(timeline.getSimulationTime());
+ }
+ assertDisplays(expected);
+ }
+
+ @Override
+ protected void compute()
+ {
+ super.compute();
+ System.out.println("update: value is " + getDisplayedValue());
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.timeline;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.PriorityQueue;
+import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
+import java.util.function.LongSupplier;
+
+/**
+ * Orders Events by the time they are due to be executed. Can execute Events individually.
+ *
+ * @author Fabian Stemmler
+ *
+ */
+public class Timeline
+{
+ private PriorityQueue<InnerEvent> events;
+ private LongSupplier time;
+ private long lastTimeUpdated = 0;
+
+ private final List<Consumer<TimelineEvent>> eventAddedListener;
+
+ public Timeline(int initCapacity)
+ {
+ events = new PriorityQueue<InnerEvent>(initCapacity);
+
+ eventAddedListener = new ArrayList<>();
+ time = () -> lastTimeUpdated;
+ }
+
+ /**
+ * @param timestamp exclusive
+ * @return true if the first event is later than the timestamp
+ */
+ public BooleanSupplier laterThan(long timestamp)
+ {
+ return () -> timeCmp(events.peek().getTiming(), timestamp) > 0;
+ }
+
+ public boolean hasNext()
+ {
+ return !events.isEmpty();
+ }
+
+ /**
+ * Executes all events at the next timestamp, at which there are any
+ */
+ public void executeNext()
+ {
+ InnerEvent first = events.peek();
+ if (first != null)
+ executeUntil(laterThan(first.getTiming()), -1);
+ }
+
+ public void executeAll()
+ {
+ while (hasNext())
+ executeNext();
+ }
+
+ /**
+ * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp.
+ *
+ * @param condition the condition until which the events are be processed
+ * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout.
+ * @return State of the event execution
+ * @formatter:off
+ * <code>NOTHING_DONE</code> if the {@link Timeline} was already empty
+ * <code>EXEC_OUT_OF_TIME</code> if the given maximum time was reached
+ * <code>EXEC_UNTIL_CONDITION</code> if the condition was met
+ * <code>EXEC_UNTIL_EMPTY</code> if events were executed until the {@link Timeline} was empty
+ * @formatter:on
+ * @author Christian Femers, Fabian Stemmler
+ */
+ public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis)
+ {
+ if (events.isEmpty())
+ {
+ lastTimeUpdated = getSimulationTime();
+ return ExecutionResult.NOTHING_DONE;
+ }
+ int checkStop = 0;
+ InnerEvent first = events.peek();
+ while (hasNext() && !condition.getAsBoolean())
+ {
+ events.remove();
+ lastTimeUpdated = first.getTiming();
+ first.run();
+ // Don't check after every run
+ checkStop = (checkStop + 1) % 10;
+ if (checkStop == 0 && System.currentTimeMillis() >= stopMillis)
+ return ExecutionResult.EXEC_OUT_OF_TIME;
+ first = events.peek();
+ }
+ lastTimeUpdated = getSimulationTime();
+ return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION;
+ }
+
+ public void setTimeFunction(LongSupplier time)
+ {
+ this.time = time;
+ }
+
+ public long getSimulationTime()
+ {
+ return time.getAsLong();
+ }
+
+ public long nextEventTime()
+ {
+ if (!hasNext())
+ return -1;
+ return events.peek().getTiming();
+ }
+
+ public void reset()
+ {
+ events.clear();
+ lastTimeUpdated = 0;
+ }
+
+ public void addEventAddedListener(Consumer<TimelineEvent> listener)
+ {
+ eventAddedListener.add(listener);
+ }
+
+ public void removeEventAddedListener(Consumer<TimelineEvent> listener)
+ {
+ eventAddedListener.remove(listener);
+ }
+
+ /**
+ * Adds an Event to the {@link Timeline}
+ *
+ * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline.
+ * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time.
+ */
+ public void addEvent(TimelineEventHandler function, int relativeTiming)
+ {
+ long timing = getSimulationTime() + relativeTiming;
+ TimelineEvent event = new TimelineEvent(timing);
+ events.add(new InnerEvent(function, event));
+ eventAddedListener.forEach(l -> l.accept(event));
+ }
+
+ private class InnerEvent implements Runnable, Comparable<InnerEvent>
+ {
+ private final TimelineEventHandler function;
+ private final TimelineEvent event;
+
+ /**
+ * Creates an {@link InnerEvent}
+ *
+ * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs
+ * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed;
+ */
+ InnerEvent(TimelineEventHandler function, TimelineEvent event)
+ {
+ this.function = function;
+ this.event = event;
+ }
+
+ public long getTiming()
+ {
+ return event.getTiming();
+ }
+
+ @Override
+ public void run()
+ {
+ function.handle(event);
+ }
+
+ @Override
+ public String toString()
+ {
+ return event.toString();
+ }
+
+ @Override
+ public int compareTo(InnerEvent o)
+ {
+ return timeCmp(getTiming(), o.getTiming());
+ }
+ }
+
+ public static int timeCmp(long a, long b)
+ {
+ return Long.signum(a - b);
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString());
+ }
+
+ public enum ExecutionResult
+ {
+ NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.timeline;
+
+/**
+ * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to
+ * store.
+ *
+ * @author Fabian Stemmler
+ *
+ */
+public class TimelineEvent
+{
+ private final long timing;
+
+ TimelineEvent(long timing)
+ {
+ super();
+ this.timing = timing;
+ }
+
+ public long getTiming()
+ {
+ return timing;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "timestamp: " + timing;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.timeline;
+
+@FunctionalInterface
+public interface TimelineEventHandler
+{
+ public void handle(TimelineEvent e);
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.types;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * stdlogic according to IEEE 1164
+ */
+public enum Bit implements StrictLogicType<Bit>
+{
+ U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z");
+
+ private final String symbol;
+
+ private Bit(String symbol)
+ {
+ this.symbol = symbol;
+ }
+
+ @Override
+ public Bit and(Bit other)
+ {
+ return fromTable(AND_TABLE, this, other);
+ }
+
+ @Override
+ public Bit or(Bit other)
+ {
+ return fromTable(OR_TABLE, this, other);
+ }
+
+ @Override
+ public Bit xor(Bit other)
+ {
+ return fromTable(XOR_TABLE, this, other);
+ }
+
+ @Override
+ public Bit not()
+ {
+ switch (this)
+ {
+ case U:
+ return U;
+ case ONE:
+ return ZERO;
+ case ZERO:
+ return ONE;
+ default:
+ return X;
+ }
+ }
+
+ public Bit[] makeArray(int length)
+ {
+ Bit[] bits = new Bit[length];
+ Arrays.fill(bits, this);
+ return bits;
+ }
+
+ public BitVector toVector(int length)
+ {
+ return BitVector.of(this, length);
+ }
+
+ @Override
+ public Bit join(Bit other)
+ {
+ return fromTable(JOIN_TABLE, this, other);
+ }
+
+ @Override
+ public String toString()
+ {
+ return getSymbol();
+ }
+
+ public String getSymbol()
+ {
+ return symbol;
+ }
+
+ public static Bit parse(String s)
+ {
+ Bit bit = SYMBOL_MAP.get(s);
+ Objects.requireNonNull(bit, "No Bit found for symbol " + s);
+ return bit;
+ }
+
+ public static Bit parse(String s, int symbolPosition)
+ {
+ return parse(s.substring(symbolPosition, symbolPosition + 1));
+ }
+
+ private static Bit fromTable(Bit[][] table, Bit a, Bit b)
+ {
+ return table[a.ordinal()][b.ordinal()];
+ }
+
+ static final Map<String, Bit> SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z);
+
+ // @formatter:off
+ private static final Bit[][] JOIN_TABLE =
+ { { U, U, U, U, U },
+ { U, X, X, X, X },
+ { U, X, ZERO, X, ZERO },
+ { U, X, X, ONE, ONE },
+ { U, X, ZERO, ONE, Z } };
+
+ private static final Bit[][] AND_TABLE =
+ { { U, U, ZERO, U, U },
+ { U, X, ZERO, X, X },
+ { ZERO, ZERO, ZERO, ZERO, ZERO },
+ { U, X, ZERO, ONE, X },
+ { U, X, ZERO, X, X } };
+
+ private static final Bit[][] OR_TABLE =
+ { { U, U, U, ONE, U },
+ { U, X, X, ONE, X },
+ { U, X, ZERO, ONE, X },
+ { ONE, ONE, ONE, ONE, ONE },
+ { U, X, X, ONE, X } };
+
+ private static final Bit[][] XOR_TABLE =
+ { { U, U, U, U, U },
+ { U, X, X, X, X },
+ { U, X, ZERO, ONE, X },
+ { U, X, ONE, ZERO, X },
+ { U, X, X, X, X } };
+ // @formatter:on
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.types;
+
+import static java.lang.String.format;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.RandomAccess;
+import java.util.function.BinaryOperator;
+import java.util.function.UnaryOperator;
+
+/**
+ * Immutable class representing a {@link Bit}Vector
+ *
+ *
+ * @author Christian Femers
+ *
+ */
+public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit>, RandomAccess
+{
+ private final Bit[] bits;
+
+ private BitVector(Bit[] bits)
+ {
+ this.bits = Objects.requireNonNull(bits);
+ }
+
+ public static BitVector of(Bit... bits)
+ {
+ return new BitVector(bits.clone());
+ }
+
+ public static BitVector of(Bit bit, int length)
+ {
+ return new BitVector(bit.makeArray(length));
+ }
+
+ public BitVectorMutator mutator()
+ {
+ return BitVectorMutator.of(this);
+ }
+
+ public Bit getBit(int bitIndex)
+ {
+ return bits[bitIndex];
+ }
+
+ public Bit[] getBits()
+ {
+ return bits.clone();
+ }
+
+ @Override
+ public BitVector join(BitVector t)
+ {
+ checkCompatibility(t);
+ return new BitVector(binOp(bits.clone(), t.bits, Bit::join));
+ }
+
+ @Override
+ public BitVector and(BitVector t)
+ {
+ checkCompatibility(t);
+ return new BitVector(binOp(bits.clone(), t.bits, Bit::and));
+ }
+
+ @Override
+ public BitVector or(BitVector t)
+ {
+ checkCompatibility(t);
+ return new BitVector(binOp(bits.clone(), t.bits, Bit::or));
+ }
+
+ @Override
+ public BitVector xor(BitVector t)
+ {
+ checkCompatibility(t);
+ return new BitVector(binOp(bits.clone(), t.bits, Bit::xor));
+ }
+
+ @Override
+ public BitVector not()
+ {
+ return new BitVector(unOp(bits.clone(), Bit::not));
+ }
+
+ public int length()
+ {
+ return bits.length;
+ }
+
+ public BitVector concat(BitVector other)
+ {
+ Bit[] newBits = Arrays.copyOf(bits, length() + other.length());
+ System.arraycopy(other.bits, 0, newBits, length(), other.length());
+ return new BitVector(newBits);
+ }
+
+ public BitVector subVector(int start)
+ {
+ return new BitVector(Arrays.copyOfRange(bits, start, length()));
+ }
+
+ public BitVector subVector(int start, int end)
+ {
+ return new BitVector(Arrays.copyOfRange(bits, start, end));
+ }
+
+ private void checkCompatibility(BitVector bv)
+ {
+ if (length() != bv.length())
+ throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length()));
+ }
+
+ static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator<Bit> op)
+ {
+ if (dest == null)
+ return second.clone();
+ for (int i = 0; i < dest.length; i++)
+ {
+ dest[i] = op.apply(dest[i], second[i]);
+ }
+ return dest;
+ }
+
+ static Bit[] unOp(Bit[] dest, UnaryOperator<Bit> op)
+ {
+ if (dest == null)
+ return null;
+ for (int i = 0; i < dest.length; i++)
+ {
+ dest[i] = op.apply(dest[i]);
+ }
+ return dest;
+ }
+
+ /**
+ * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder}
+ *
+ * @author Christian Femers
+ */
+ @SuppressWarnings("synthetic-access")
+ public static final class BitVectorMutator implements LogicType<BitVectorMutator, BitVector>
+ {
+ private Bit[] bits;
+
+ private BitVectorMutator(Bit[] bits)
+ {
+ this.bits = bits;
+ }
+
+ static BitVectorMutator of(BitVector bv)
+ {
+ return new BitVectorMutator(bv.getBits());
+ }
+
+ /**
+ * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed.
+ *
+ */
+ public static BitVectorMutator empty()
+ {
+ return new BitVectorMutator(null);
+ }
+
+ /**
+ * Produces the resulting, immutable {@link BitVector}<br>
+ *
+ * @throws IllegalStateException if the mutator is (still) empty
+ */
+ public BitVector get()
+ {
+ if (bits == null)
+ throw new IllegalStateException("cannot create a BitVector from an empty mutator");
+ return new BitVector(bits);
+ }
+
+ @Override
+ public BitVectorMutator join(BitVector t)
+ {
+ checkCompatibility(t);
+ bits = binOp(bits, t.bits, Bit::join);
+ return this;
+ }
+
+ @Override
+ public BitVectorMutator and(BitVector t)
+ {
+ checkCompatibility(t);
+ bits = binOp(bits, t.bits, Bit::and);
+ return this;
+ }
+
+ @Override
+ public BitVectorMutator or(BitVector t)
+ {
+ checkCompatibility(t);
+ bits = binOp(bits, t.bits, Bit::or);
+ return this;
+ }
+
+ @Override
+ public BitVectorMutator xor(BitVector t)
+ {
+ checkCompatibility(t);
+ bits = binOp(bits, t.bits, Bit::xor);
+ return this;
+ }
+
+ @Override
+ public BitVectorMutator not()
+ {
+ unOp(bits, Bit::not);
+ return this;
+ }
+
+ private void checkCompatibility(BitVector bv)
+ {
+ if (bits != null && bits.length != bv.length())
+ throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length()));
+ }
+ }
+
+ /**
+ * @see Arrays#hashCode(Object[])
+ */
+ @Override
+ public int hashCode()
+ {
+ return Arrays.hashCode(bits);
+ }
+
+ /**
+ * Does test for equality of values/content
+ *
+ * @see Object#equals(Object)
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof BitVector))
+ return false;
+ BitVector other = (BitVector) obj;
+ return Arrays.equals(bits, other.bits);
+ }
+
+ /**
+ * Does test for equality of values/content, shifting the other BitVector by <code>offset</code> to the right.<br>
+ * Therefore <code>offset + other.length() <= this.length()</code> needs to be true.
+ *
+ * @throws ArrayIndexOutOfBoundsException if <code>offset + other.length() > this.length()</code>
+ *
+ * @see Object#equals(Object)
+ */
+ public boolean equalsWithOffset(BitVector other, int offset)
+ {
+ if (other == null)
+ return false;
+ return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length());
+ }
+
+ /**
+ * All {@link Bit}s symbols concatenated together
+ *
+ * @see #parse(String)
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder(bits.length);
+ for (Bit bit : bits)
+ sb.append(bit);
+ return sb.toString();
+ }
+
+ /**
+ * Parses a String containing solely {@link Bit} symbols
+ *
+ * @see #toString()
+ */
+ public static BitVector parse(String s)
+ {
+ Bit[] values = new Bit[s.length()];
+ for (int i = 0; i < s.length(); i++)
+ {
+ values[i] = Bit.parse(s, i);
+ }
+ return new BitVector(values);
+ }
+
+ @Override
+ public Iterator<Bit> iterator()
+ {
+ return new Iterator<>()
+ {
+ private int pos = 0;
+
+ @Override
+ public Bit next()
+ {
+ if (!hasNext())
+ throw new NoSuchElementException();
+ return getBit(pos++);
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return pos != length();
+ }
+ };
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.types;
+
+import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class BitVectorFormatter
+{
+ public static String formatValueAsString(ReadEnd end)
+ {
+ return formatAsString(end == null ? null : end.getValues());
+ }
+
+ public static String formatAsString(BitVector bitVector)
+ {
+ if (bitVector == null)
+ return "null";
+ else
+ return bitVector.toString();
+ }
+
+ public static ColorDefinition formatAsColor(ReadEnd end)
+ {
+ return formatAsColor(end == null ? null : end.getValues());
+ }
+
+ public static ColorDefinition formatAsColor(BitVector bitVector)
+ {
+ // TODO maybe find a color assignment for multiple-bit bit vectors?
+ if (bitVector == null || bitVector.length() != 1)
+ return new ColorDefinition(BuiltInColor.COLOR_BLACK);
+ else
+ switch (bitVector.getBit(0))
+ {
+ case ONE:
+ return new ColorDefinition(BuiltInColor.COLOR_GREEN);
+ case U:
+ return new ColorDefinition(BuiltInColor.COLOR_CYAN);
+ case X:
+ return new ColorDefinition(BuiltInColor.COLOR_RED);
+ case Z:
+ return new ColorDefinition(BuiltInColor.COLOR_YELLOW);
+ case ZERO:
+ return new ColorDefinition(BuiltInColor.COLOR_GRAY);
+ default:
+ throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getBit(0));
+ }
+ }
+
+ private BitVectorFormatter()
+ {
+ throw new UnsupportedOperationException("No BitVectorFormatter instances");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.types;
+
+/**
+ * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT).
+ * <p>
+ * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case <code>r==g==b==-1</code>, or by red / green
+ * / blue components, in which case <code>builtInColor==null</code>
+ */
+public class ColorDefinition
+{
+ /**
+ * The built-in color constant defining this color.
+ */
+ public final ColorDefinition.BuiltInColor builtInColor;
+ /**
+ * The red color component defining this color.
+ */
+ public final int r;
+ /**
+ * The green color component defining this color.
+ */
+ public final int g;
+ /**
+ * The blue color component defining this color.
+ */
+ public final int b;
+
+ public ColorDefinition(ColorDefinition.BuiltInColor col)
+ {
+ if (col == null)
+ throw new IllegalArgumentException("Illegal built-in color: " + col);
+ this.builtInColor = col;
+ this.r = -1;
+ this.g = -1;
+ this.b = -1;
+ }
+
+ public ColorDefinition(int r, int g, int b)
+ {
+ if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255)
+ throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b);
+ this.builtInColor = null;
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ }
+
+ public static enum BuiltInColor
+ {
+ COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE,
+ COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.types;
+
+/**
+ * Interface for types that support the basic logic operations
+ *
+ * @author Christian Femers
+ *
+ * @param <T> the logic type itself, to make the operations closed in T
+ * @param <S> the operand type, may be the same as T, see {@link StrictLogicType}
+ */
+public interface LogicType<T extends LogicType<T, S>, S>
+{
+ /**
+ * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164)
+ *
+ * For example:
+ *
+ * <pre>
+ * 0 joined 0 == 0
+ * 1 joined 0 == X
+ * 0 joined 1 == X
+ * 1 joined 1 == 1
+ * </pre>
+ *
+ * @param t the second logic signal
+ * @return the resulting value
+ * @author Christian Femers
+ */
+ T join(S t);
+
+ /**
+ * Classical logic AND
+ *
+ * For example:
+ *
+ * <pre>
+ * 0 AND 0 == 0
+ * 1 AND 0 == 0
+ * 0 AND 1 == 0
+ * 1 AND 1 == 1
+ * </pre>
+ *
+ * @param t the second logic signal
+ * @return the resulting value
+ * @author Christian Femers
+ */
+ T and(S t);
+
+ /**
+ * Classical logic OR
+ *
+ * For example:
+ *
+ * <pre>
+ * 0 OR 0 == 0
+ * 1 OR 0 == 1
+ * 0 OR 1 == 1
+ * 1 OR 1 == 1
+ * </pre>
+ *
+ * @param t the second logic signal
+ * @return the resulting value
+ * @author Christian Femers
+ */
+ T or(S t);
+
+ /**
+ * Classical logic XOR (exclusive OR)
+ *
+ * For example:
+ *
+ * <pre>
+ * 0 XOR 0 == 0
+ * 1 XOR 0 == 1
+ * 0 XOR 1 == 1
+ * 1 XOR 1 == 0
+ * </pre>
+ *
+ * @param t the second logic signal
+ * @return the resulting value
+ * @author Christian Femers
+ */
+ T xor(S t);
+
+ /**
+ * Classical logic NOT (logical negation)
+ *
+ * For example:
+ *
+ * <pre>
+ * NOT 0 == 1
+ * NOT 1 == 0
+ * </pre>
+ *
+ * @return the resulting value
+ * @author Christian Femers
+ */
+ T not();
+
+ /**
+ * {@link #and(Object) AND} and then {@link #not() NOT}
+ *
+ * @author Christian Femers
+ */
+ default T nand(S t)
+ {
+ return and(t).not();
+ }
+
+ /**
+ * {@link #or(Object) OR} and then {@link #not() NOT}
+ *
+ * @author Christian Femers
+ */
+ default T nor(S t)
+ {
+ return or(t).not();
+ }
+
+ /**
+ * {@link #xor(Object) XOR} and then {@link #not() NOT}<br>
+ * Used to determine equality (alias parity, consistency)
+ *
+ * @author Christian Femers
+ */
+ default T xnor(S t)
+ {
+ return xor(t).not();
+ }
+}
--- /dev/null
+package net.mograsim.logic.core.types;
+
+import java.util.function.BiFunction;
+
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+
+@FunctionalInterface
+public interface MutationOperation extends BiFunction<BitVectorMutator, BitVector, BitVectorMutator>
+{
+ // no changes necessary, only for convenience and readability
+}
--- /dev/null
+package net.mograsim.logic.core.types;
+
+/**
+ * Interface for types that support the basic logic operations only among themselves, making it mathematically closed
+ *
+ * @author Christian Femers
+ * @see LogicType
+ *
+ * @param <T> the logic type itself to make the operations closed
+ */
+public interface StrictLogicType<T extends StrictLogicType<T>> extends LogicType<T, T>
+{
+ // this is just a matter of type parameters
+}
--- /dev/null
+package net.mograsim.logic.core.wires;
+
+import static net.mograsim.logic.core.types.Bit.U;
+import static net.mograsim.logic.core.types.Bit.Z;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.types.Bit;
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
+
+/**
+ * Represents an array of wires that can store n bits of information.
+ *
+ * @author Fabian Stemmler
+ *
+ */
+public class Wire
+{
+ private BitVector values;
+ public final int travelTime;
+ private List<ReadEnd> attached = new ArrayList<ReadEnd>();
+ public final int length;
+ private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();
+ private Timeline timeline;
+
+ public Wire(Timeline timeline, int length, int travelTime)
+ {
+ if (length < 1)
+ throw new IllegalArgumentException(
+ String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));
+ this.timeline = timeline;
+ this.length = length;
+ this.travelTime = travelTime;
+ initValues();
+ }
+
+ private void initValues()
+ {
+ values = U.toVector(length);
+ }
+
+ private void recalculateSingleInput()
+ {
+ setNewValues(inputs.get(0).getInputValues());
+ }
+
+ private void recalculateMultipleInputs()
+ {
+ BitVectorMutator mutator = BitVectorMutator.empty();
+ for (ReadWriteEnd wireArrayEnd : inputs)
+ mutator.join(wireArrayEnd.getInputValues());
+ setNewValues(mutator.get());
+ }
+
+ private void setNewValues(BitVector newValues)
+ {
+ if (values.equals(newValues))
+ return;
+ BitVector oldValues = values;
+ values = newValues;
+ notifyObservers(oldValues);
+ }
+
+ private void recalculate()
+ {
+ switch (inputs.size())
+ {
+ case 0:
+ return;
+ case 1:
+ recalculateSingleInput();
+ break;
+ default:
+ recalculateMultipleInputs();
+ }
+ }
+
+ /**
+ * The {@link Wire} is interpreted as an unsigned integer with n bits.
+ *
+ * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the same
+ * value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
+ *
+ * @author Fabian Stemmler
+ */
+ public boolean hasNumericValue()
+ {
+ for (Bit b : values)
+ {
+ if (b != Bit.ZERO && b != Bit.ONE)
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * The {@link Wire} is interpreted as an unsigned integer with n bits.
+ *
+ * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+ *
+ * @author Fabian Stemmler
+ */
+ public long getUnsignedValue()
+ {
+ long val = 0;
+ long mask = 1;
+ for (Bit bit : values)
+ {
+ switch (bit)
+ {
+ default:
+ case Z:
+ case X:
+ return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;
+ case ONE:
+ val |= mask;
+ break;
+ case ZERO:
+ }
+ mask = mask << 1;
+ }
+ return val;
+ }
+
+ /**
+ * The {@link Wire} is interpreted as a signed integer with n bits.
+ *
+ * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+ *
+ * @author Fabian Stemmler
+ */
+ public long getSignedValue()
+ {
+ long val = getUnsignedValue();
+ long mask = 1 << (length - 1);
+ if ((mask & val) != 0)
+ {
+ int shifts = 64 - length;
+ return (val << shifts) >> shifts;
+ }
+ return val;
+ }
+
+ public Bit getValue()
+ {
+ return getValue(0);
+ }
+
+ public Bit getValue(int index)
+ {
+ return values.getBit(index);
+ }
+
+ public BitVector getValues(int start, int end)
+ {
+ return values.subVector(start, end);
+ }
+
+ public BitVector getValues()
+ {
+ return values;
+ }
+
+ /**
+ * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated.
+ *
+ * @param ob The {@link WireObserver} to be notified of changes.
+ * @return true if the given {@link WireObserver} was not already registered, false otherwise
+ *
+ * @author Fabian Stemmler
+ */
+ private void attachEnd(ReadEnd end)
+ {
+ attached.add(end);
+ }
+
+ private void detachEnd(ReadEnd end)
+ {
+ attached.remove(end);
+ }
+
+ private void notifyObservers(BitVector oldValues)
+ {
+ for (ReadEnd o : attached)
+ o.update(oldValues);
+ }
+
+ /**
+ * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link Wire}. This {@link ReadWriteEnd} can be written to.
+ */
+ public ReadWriteEnd createReadWriteEnd()
+ {
+ return new ReadWriteEnd();
+ }
+
+ /**
+ * Create a {@link ReadEnd} object, which is tied to this {@link Wire}. This {@link ReadEnd} cannot be written to.
+ */
+ public ReadEnd createReadOnlyEnd()
+ {
+ return new ReadEnd();
+ }
+
+ private void registerInput(ReadWriteEnd toRegister)
+ {
+ inputs.add(toRegister);
+ }
+
+ /**
+ * A {@link ReadEnd} feeds a constant signal into the {@link Wire} it is tied to. The combination of all inputs determines the
+ * {@link Wire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than Z 0
+ * and 1 turn into X when they are mixed
+ *
+ * @author Fabian Stemmler
+ */
+ public class ReadEnd
+ {
+ private List<WireObserver> observers = new ArrayList<WireObserver>();
+
+ private ReadEnd()
+ {
+ super();
+ Wire.this.attachEnd(this);
+ }
+
+ public void update(BitVector oldValues)
+ {
+ for (WireObserver ob : observers)
+ ob.update(this, oldValues);
+ }
+
+ /**
+ * Included for convenient use on {@link Wire}s of length 1.
+ *
+ * @return The value of bit 0.
+ *
+ * @author Fabian Stemmler
+ */
+ public Bit getValue()
+ {
+ return Wire.this.getValue();
+ }
+
+ /**
+ * @param index Index of the requested bit.
+ * @return The value of the indexed bit.
+ *
+ * @author Fabian Stemmler
+ */
+ public Bit getValue(int index)
+ {
+ return Wire.this.getValue(index);
+ }
+
+ /**
+ * @param index Index of the requested bit.
+ * @return The value of the indexed bit.
+ *
+ * @author Fabian Stemmler
+ */
+ public BitVector getValues()
+ {
+ return Wire.this.getValues();
+ }
+
+ /**
+ * @param start Start of the wanted segment. (inclusive)
+ * @param end End of the wanted segment. (exclusive)
+ * @return The values of the segment of {@link Bit}s indexed.
+ *
+ * @author Fabian Stemmler
+ */
+ public BitVector getValues(int start, int end)
+ {
+ return Wire.this.getValues(start, end);
+ }
+
+ /**
+ * The {@link Wire} is interpreted as an unsigned integer with n bits.
+ *
+ * @return <code>true</code> if all bits are either <code>Bit.ONE</code> or <code>Bit.ZERO</code> (they do not all have to have the
+ * same value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.
+ *
+ * @author Fabian Stemmler
+ */
+ public boolean hasNumericValue()
+ {
+ return Wire.this.hasNumericValue();
+ }
+
+ /**
+ * The {@link Wire} is interpreted as an unsigned integer with n bits.
+ *
+ * @return The unsigned value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+ *
+ * @author Fabian Stemmler
+ */
+ public long getUnsignedValue()
+ {
+ return Wire.this.getUnsignedValue();
+ }
+
+ /**
+ * The {@link Wire} is interpreted as a signed integer with n bits.
+ *
+ * @return The signed value of the {@link Wire}'s bits, where value 0 corresponds with 2^0, value 1 is 2^1 and so on.
+ *
+ * @author Fabian Stemmler
+ */
+ public long getSignedValue()
+ {
+ return Wire.this.getSignedValue();
+ }
+
+ @Override
+ public String toString()
+ {
+ return Wire.this.toString();
+ }
+
+ public void close()
+ {
+ inputs.remove(this);
+ detachEnd(this);
+ recalculate();
+ }
+
+ public int length()
+ {
+ return length;
+ }
+
+ public boolean addObserver(WireObserver ob)
+ {
+ return observers.add(ob);
+ }
+
+ public Wire getWire()
+ {
+ return Wire.this;
+ }
+ }
+
+ public class ReadWriteEnd extends ReadEnd
+ {
+ private boolean open;
+ private BitVector inputValues;
+
+ private ReadWriteEnd()
+ {
+ super();
+ open = true;
+ initValues();
+ registerInput(this);
+ }
+
+ private void initValues()
+ {
+ inputValues = U.toVector(length);
+ }
+
+ /**
+ * Sets the wires values. This takes up time, as specified by the {@link Wire}s travel time.
+ *
+ * @param newValues The new values the wires should take on.
+ *
+ * @author Fabian Stemmler
+ */
+ public void feedSignals(Bit... newValues)
+ {
+ feedSignals(BitVector.of(newValues));
+ }
+
+ public void feedSignals(BitVector newValues)
+ {
+ if (newValues.length() != length)
+ throw new IllegalArgumentException(
+ String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));
+ if (!open)
+ throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
+ timeline.addEvent(e -> setValues(newValues), travelTime);
+ }
+
+ /**
+ * Sets values of a subarray of wires. This takes up time, as specified by the {@link Wire}s travel time.
+ *
+ * @param bitVector The new values the wires should take on.
+ * @param startingBit The first index of the subarray of wires.
+ *
+ * @author Fabian Stemmler
+ */
+ public void feedSignals(int startingBit, BitVector bitVector)
+ {
+ if (!open)
+ throw new RuntimeException("Attempted to write to closed WireArrayEnd.");
+ timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);
+ }
+
+ private void setValues(int startingBit, BitVector newValues)
+ {
+ // index check covered in equals
+ if (!inputValues.equalsWithOffset(newValues, startingBit))
+ {
+ Bit[] vals = inputValues.getBits();
+ System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length());
+ inputValues = BitVector.of(vals);
+ Wire.this.recalculate();
+ }
+ }
+
+ private void setValues(BitVector newValues)
+ {
+ if (inputValues.equals(newValues))
+ return;
+ inputValues = newValues;
+ Wire.this.recalculate();
+ }
+
+ /**
+ * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
+ */
+ public Bit getInputValue()
+ {
+ return getInputValue(0);
+ }
+
+ /**
+ * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link Wire} at the indexed {@link Bit}.
+ */
+ public Bit getInputValue(int index)
+ {
+ return inputValues.getBit(index);
+ }
+
+ /**
+ * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link Wire}.
+ */
+ public BitVector getInputValues()
+ {
+ return getInputValues(0, length);
+ }
+
+ public BitVector getInputValues(int start, int end)
+ {
+ return inputValues.subVector(start, end);
+ }
+
+ /**
+ * {@link ReadEnd} now feeds Z into the associated {@link Wire}.
+ */
+ public void clearSignals()
+ {
+ feedSignals(Z.toVector(length));
+ }
+
+ public BitVector wireValuesExcludingMe()
+ {
+ BitVectorMutator mutator = BitVectorMutator.empty();
+ for (ReadWriteEnd wireEnd : inputs)
+ {
+ if (wireEnd == this)
+ continue;
+ mutator.join(wireEnd.inputValues);
+ }
+ return mutator.get();
+ }
+
+ @Override
+ public String toString()
+ {
+ return inputValues.toString();
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs);
+ // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)
+ }
+
+ public static ReadEnd[] extractEnds(Wire[] w)
+ {
+ ReadEnd[] inputs = new ReadEnd[w.length];
+ for (int i = 0; i < w.length; i++)
+ inputs[i] = w[i].createReadWriteEnd();
+ return inputs;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.core.wires;
+
+import net.mograsim.logic.core.types.BitVector;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public interface WireObserver
+{
+ public void update(ReadEnd initiator, BitVector oldValues);
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>net.mograsim.logic.ui</name>
+ <comment></comment>
+ <projects>
+ <project>net.mograsim.logic.core</project>
+ <project>SWTZoomableCanvas</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=10
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=10
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=140
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=140
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
--- /dev/null
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_MoGraSim
+formatter_settings_version=16
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=false
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: net.mograsim.logic.ui
+Bundle-SymbolicName: net.mograsim.logic.ui;singleton:=true
+Bundle-Version: 1.0.0
+Export-Package: net.mograsim.logic.ui,
+ net.mograsim.logic.ui.examples,
+ net.mograsim.logic.ui.model,
+ net.mograsim.logic.ui.model.components,
+ net.mograsim.logic.ui.model.wires,
+ net.mograsim.logic.ui.modeladapter,
+ net.mograsim.logic.ui.modeladapter.componentadapters
+Bundle-RequiredExecutionEnvironment: JavaSE-10
+Require-Bundle: org.eclipse.swt;bundle-version="3.110.0",
+ SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport,
+ net.mograsim.logic.core;bundle-version="1.0.0";visibility:=reexport
+Automatic-Module-Name: net.mograsim.logic.ui
--- /dev/null
+source.. = src/
+bin.includes = META-INF/,\
+ .
--- /dev/null
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.logic.components.Merger;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUIMerger extends Merger implements GUIComponent
+{
+ private final int inputCount;
+ private final double height;
+ private final List<ReadEnd> connectedWireEnds;
+ private final List<Point> WireEndConnectionPoints;
+
+ public GUIMerger(ReadWriteEnd union, ReadEnd... inputs)
+ {
+ super(union, inputs);
+
+ List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
+ List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
+
+ this.inputCount = inputs.length;
+ this.height = (inputCount - 1) * 10;
+
+ {
+ connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
+ double inputHeight = 0;
+ for (int i = 0; i < inputCount; i++, inputHeight += 10)
+ WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
+ }
+
+ connectedWireEndsModifiable.add(union);
+ WireEndConnectionPointsModifiable.add(new Point(20, height / 2));
+
+ this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+ this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+ }
+
+ @Override
+ public Rectangle getBounds()
+ {
+ return new Rectangle(0, 0, 20, height);
+ }
+
+ @Override
+ public void render(GeneralGC gc)
+ {
+ double inputHeight = 0;
+ for (int i = 0; i < inputCount; i++, inputHeight += 10)
+ gc.drawLine(0, inputHeight, 10, inputHeight);
+ gc.drawLine(10, 0, 10, height);
+ gc.drawLine(10, height / 2, 20, height / 2);
+ }
+
+ @Override
+ public int getConnectedWireEndsCount()
+ {
+ return connectedWireEnds.size();
+ }
+
+ @Override
+ public ReadEnd getConnectedWireEnd(int connectionIndex)
+ {
+ return connectedWireEnds.get(connectionIndex);
+ }
+
+ @Override
+ public Point getWireEndConnectionPoint(int connectionI)
+ {
+ return WireEndConnectionPoints.get(connectionI);
+ }
+}
\ No newline at end of file
--- /dev/null
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.logic.components.Mux;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUIMux extends Mux implements GUIComponent
+{
+ private final double height;
+ private final List<ReadEnd> connectedWireEnds;
+ private final List<Point> WireEndConnectionPoints;
+
+ public GUIMux(int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
+ {
+ super(processTime, out, select, inputs);
+
+ double height = inputs.length * 5;
+ if (height < 10)
+ height = 10;
+ this.height = height;
+
+ List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
+ List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
+
+ connectedWireEndsModifiable.add(out);
+ WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));
+
+ connectedWireEndsModifiable.add(select);
+ WireEndConnectionPointsModifiable.add(new Point(10, 5));
+
+ {
+ connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
+ double inputHeightIncrement = (height + 20) / inputs.length;
+ double inputHeight = inputHeightIncrement / 2;
+ for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)
+ WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
+ }
+
+ this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+ this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+ }
+
+ @Override
+ public Rectangle getBounds()
+ {
+ return new Rectangle(0, 0, 20, height + 20);
+ }
+
+ @Override
+ public void render(GeneralGC gc)
+ {
+ gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });
+ }
+
+ @Override
+ public int getConnectedWireEndsCount()
+ {
+ return connectedWireEnds.size();
+ }
+
+ @Override
+ public ReadEnd getConnectedWireEnd(int connectionIndex)
+ {
+ return connectedWireEnds.get(connectionIndex);
+ }
+
+ @Override
+ public Point getWireEndConnectionPoint(int connectionI)
+ {
+ return WireEndConnectionPoints.get(connectionI);
+ }
+}
\ No newline at end of file
--- /dev/null
+package era.mi.gui.components;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import era.mi.gui.ViewModel;
+import era.mi.logic.components.Splitter;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class GUISplitter extends GUIComponent
+{
+ public GUISplitter(ViewModel model)
+ {
+ super(model);
+
+ this.outputCount = outputs.length;
+ this.height = (outputCount - 1) * 10;
+
+ connectedWireEndsModifiable.add(input);
+ WireEndConnectionPointsModifiable.add(new Point(0, height / 2));
+
+ {
+ connectedWireEndsModifiable.addAll(Arrays.asList(outputs));
+ double outputHeight = 0;
+ for (int i = 0; i < outputCount; i++, outputHeight += 10)
+ WireEndConnectionPointsModifiable.add(new Point(20, outputHeight));
+ }
+
+ this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
+ this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
+ }
+
+ @Override
+ public Rectangle getBounds()
+ {
+ return new Rectangle(0, 0, 20, height);
+ }
+
+ @Override
+ public void render(GeneralGC gc)
+ {
+ gc.drawLine(0, height / 2, 10, height / 2);
+ gc.drawLine(10, 0, 10, height);
+ double outputHeight = 0;
+ for (int i = 0; i < outputCount; i++, outputHeight += 10)
+ gc.drawLine(10, outputHeight, 20, outputHeight);
+ }
+
+ @Override
+ public int getConnectedWireEndsCount()
+ {
+ return connectedWireEnds.size();
+ }
+
+ @Override
+ public ReadEnd getConnectedWireEnd(int connectionIndex)
+ {
+ return connectedWireEnds.get(connectionIndex);
+ }
+
+ @Override
+ public Point getWireEndConnectionPoint(int connectionI)
+ {
+ return WireEndConnectionPoints.get(connectionI);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Device;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.mograsim.logic.core.types.ColorDefinition;
+import net.mograsim.logic.core.types.ColorDefinition.BuiltInColor;
+
+//TODO replace with a proper ColorManager
+public class ColorHelper
+{
+ public static void executeWithDifferentForeground(GeneralGC gc, ColorDefinition col, Runnable exec)
+ {
+ executeWithDifferentColor(gc.getDevice(), col, gc::getForeground, gc::setForeground, exec);
+ }
+
+ public static void executeWithDifferentBackground(GeneralGC gc, ColorDefinition col, Runnable exec)
+ {
+ executeWithDifferentColor(gc.getDevice(), col, gc::getBackground, gc::setBackground, exec);
+ }
+
+ private static void executeWithDifferentColor(Device device, ColorDefinition col, Supplier<Color> getColor, Consumer<Color> setColor,
+ Runnable exec)
+ {
+ Color oldColor = getColor.get();
+ boolean isNoSystemColor = col.builtInColor == null;
+ Color newColor;
+ if (isNoSystemColor)
+ newColor = new Color(device, col.r, col.g, col.b);
+ else
+ newColor = device.getSystemColor(ColorHelper.toSWTColorConstant(col.builtInColor));
+ setColor.accept(newColor);
+
+ exec.run();
+
+ setColor.accept(oldColor);
+ if (isNoSystemColor)
+ newColor.dispose();
+ }
+
+ public static int toSWTColorConstant(BuiltInColor col)
+ {
+ switch (col)
+ {
+ case COLOR_BLACK:
+ return SWT.COLOR_BLACK;
+ case COLOR_BLUE:
+ return SWT.COLOR_BLUE;
+ case COLOR_CYAN:
+ return SWT.COLOR_CYAN;
+ case COLOR_DARK_BLUE:
+ return SWT.COLOR_DARK_BLUE;
+ case COLOR_DARK_CYAN:
+ return SWT.COLOR_DARK_CYAN;
+ case COLOR_DARK_GRAY:
+ return SWT.COLOR_DARK_GRAY;
+ case COLOR_DARK_GREEN:
+ return SWT.COLOR_DARK_GREEN;
+ case COLOR_DARK_MAGENTA:
+ return SWT.COLOR_DARK_MAGENTA;
+ case COLOR_DARK_RED:
+ return SWT.COLOR_DARK_RED;
+ case COLOR_DARK_YELLOW:
+ return SWT.COLOR_DARK_YELLOW;
+ case COLOR_GRAY:
+ return SWT.COLOR_GRAY;
+ case COLOR_GREEN:
+ return SWT.COLOR_GREEN;
+ case COLOR_MAGENTA:
+ return SWT.COLOR_MAGENTA;
+ case COLOR_RED:
+ return SWT.COLOR_RED;
+ case COLOR_WHITE:
+ return SWT.COLOR_WHITE;
+ case COLOR_YELLOW:
+ return SWT.COLOR_YELLOW;
+ default:
+ throw new IllegalArgumentException("Unknown enum constant: " + col);
+ }
+ }
+
+ private ColorHelper()
+ {
+ throw new UnsupportedOperationException("No instances of ColorHelper");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
+import net.mograsim.logic.core.timeline.Timeline;
+
+//TODO maybe move to logic core?
+public class LogicExecuter
+{
+ // TODO replace with LogicModel when it exists
+ private final Timeline timeline;
+
+ private final AtomicBoolean shouldBeRunningLive;
+ private final AtomicBoolean isRunningLive;
+ private final AtomicLong nextExecSimulTime;
+ private final Thread simulationThread;
+
+ public LogicExecuter(Timeline timeline)
+ {
+ this.timeline = timeline;
+
+ timeline.setTimeFunction(System::currentTimeMillis);
+ shouldBeRunningLive = new AtomicBoolean();
+ isRunningLive = new AtomicBoolean();
+ nextExecSimulTime = new AtomicLong();
+ simulationThread = new Thread(() ->
+ {
+ isRunningLive.set(true);
+ synchronized (isRunningLive)
+ {
+ isRunningLive.notify();
+ }
+ while (shouldBeRunningLive.get())
+ {
+ // always execute to keep timeline from "hanging behind" for too long
+ long current = System.currentTimeMillis();
+ timeline.executeUntil(timeline.laterThan(current), current + 10);
+ long sleepTime;
+ if (timeline.hasNext())
+ sleepTime = timeline.nextEventTime() - current;
+ else
+ sleepTime = 10000;
+ try
+ {
+ nextExecSimulTime.set(current + sleepTime);
+ if (sleepTime > 0)
+ Thread.sleep(sleepTime);
+ }
+ catch (@SuppressWarnings("unused") InterruptedException e)
+ {// do nothing; it is normal execution flow to be interrupted
+ }
+ }
+ isRunningLive.set(false);
+ synchronized (isRunningLive)
+ {
+ isRunningLive.notify();
+ }
+ });
+ timeline.addEventAddedListener(event ->
+ {
+ if (isRunningLive.get())
+ if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0)
+ simulationThread.interrupt();
+ });
+ }
+
+ public void executeNextStep()
+ {
+ timeline.executeNext();
+ }
+
+ public synchronized void startLiveExecution()
+ {
+ if (shouldBeRunningLive.get())
+ return;
+ shouldBeRunningLive.set(true);
+ simulationThread.start();
+ waitForIsRunning(true);
+ }
+
+ public synchronized void stopLiveExecution()
+ {
+ if (!shouldBeRunningLive.get())
+ return;
+ shouldBeRunningLive.set(false);
+ simulationThread.interrupt();
+ waitForIsRunning(false);
+ }
+
+ private void waitForIsRunning(boolean expectedState)
+ {
+ while (isRunningLive.get() ^ expectedState)
+ try
+ {
+ synchronized (isRunningLive)
+ {
+ isRunningLive.wait();
+ }
+ }
+ catch (@SuppressWarnings("unused") InterruptedException e)
+ {// no need to do anything
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.Pin;
+
+/**
+ * Simulation visualizer canvas.
+ *
+ * @author Daniel Kirschten
+ */
+public class LogicUICanvas extends ZoomableCanvas
+{
+ private static final boolean DRAW_PINS = false;
+
+ private final ViewModel model;
+
+ public LogicUICanvas(Composite parent, int style, ViewModel model)
+ {
+ super(parent, style);
+
+ this.model = model;
+
+ Consumer<Object> redrawConsumer = o -> redrawThreadsafe();
+ Consumer<Pin> pinAddedListener = p ->
+ {
+ p.addPinMovedListener(redrawConsumer);
+ redrawThreadsafe();
+ };
+ Consumer<Pin> pinRemovedListener = p ->
+ {
+ p.removePinMovedListener(redrawConsumer);
+ redrawThreadsafe();
+ };
+ Consumer<? super GUIComponent> componentAddedListener = c ->
+ {
+ c.addComponentLookChangedListener(redrawConsumer);
+ c.addComponentMovedListener(redrawConsumer);
+ c.addPinAddedListener(pinAddedListener);
+ c.addPinRemovedListener(pinRemovedListener);
+ redrawThreadsafe();
+ };
+ model.addComponentAddedListener(componentAddedListener);
+ model.getComponents().forEach(componentAddedListener);
+ model.addComponentRemovedListener(c ->
+ {
+ c.removeComponentLookChangedListener(redrawConsumer);
+ c.removeComponentMovedListener(redrawConsumer);
+ c.removePinAddedListener(pinAddedListener);
+ c.removePinRemovedListener(pinRemovedListener);
+ redrawThreadsafe();
+ });
+ Consumer<? super GUIWire> wireAddedListener = w ->
+ {
+ w.addWireLookChangedListener(redrawConsumer);
+ redrawThreadsafe();
+ };
+ model.addWireAddedListener(wireAddedListener);
+ model.getWires().forEach(wireAddedListener);
+ model.addWireRemovedListener(w ->
+ {
+ w.removeWireLookChangedListener(redrawConsumer);
+ redrawThreadsafe();
+ });
+
+ addZoomedRenderer(gc ->
+ {
+ gc.setLineWidth(.5);
+ model.getWires().forEach(w -> w.render(gc));
+ Rectangle visibleRegion = new Rectangle(offX, offY, gW / zoom, gH / zoom);
+ model.getComponents().forEach(c -> drawComponent(gc, c, visibleRegion));
+ });
+ addListener(SWT.MouseDown, this::mouseDown);
+ }
+
+ private void drawComponent(GeneralGC gc, GUIComponent component, Rectangle visibleRegion)
+ {
+ component.render(gc, visibleRegion);
+ if (DRAW_PINS)
+ {
+ gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_DARK_CYAN));
+ for (Pin p : component.getPins())
+ {
+ Point pos = p.getPos();
+ gc.fillOval(pos.x - 1, pos.y - 1, 2, 2);
+ }
+ }
+ }
+
+ private void mouseDown(Event e)
+ {
+ if (e.button == 1)
+ {
+ Point click = displayToWorldCoords(e.x, e.y);
+ for (GUIComponent component : model.getComponents())
+ if (component.getBounds().contains(click) && component.clicked(click.x, click.y))
+ {
+ redraw();
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay;
+import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+
+/**
+ * Standalone simulation visualizer graphical user interface.
+ *
+ * @author Daniel Kirschten
+ */
+public class LogicUIStandaloneGUI
+{
+ private final Display display;
+ private final Shell shell;
+ private final LogicUICanvas ui;
+
+ public LogicUIStandaloneGUI(ViewModel model)
+ {
+ display = new Display();
+ shell = new Shell(display);
+ shell.setLayout(new FillLayout());
+ ui = new LogicUICanvas(shell, SWT.NONE, model);
+
+ ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
+ userInput.buttonDrag = 3;
+ userInput.buttonZoom = 2;
+ userInput.enableUserInput();
+ new ZoomableCanvasOverlay(ui, null).enableScale();
+
+ // TODO don't do this here
+ LogicModelParameters params = new LogicModelParameters();
+ params.gateProcessTime = 50;
+ params.wireTravelTime = 10;
+// timeline = ViewLogicModelAdapter.convert(model, params);
+ }
+
+ public LogicUICanvas getLogicUICanvas()
+ {
+ return ui;
+ }
+
+ /**
+ * Opens the UI shell. Returns when the shell is closed.
+ */
+ public void run()
+ {
+ shell.open();
+ while (!shell.isDisposed())
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui;
+
+import java.util.function.Consumer;
+
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
+
+public class SimpleLogicUIStandalone
+{
+ public static void executeVisualisation(Consumer<ViewModel> setupViewModel)
+ {
+ // setup view model
+ ViewModel viewModel = new ViewModel();
+ setupViewModel.accept(viewModel);
+
+ // convert to logic model
+ LogicModelParameters params = new LogicModelParameters();
+ params.gateProcessTime = 50;
+ params.wireTravelTime = 10;
+ Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
+
+ // initialize UI and executer
+ LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(viewModel);
+ LogicExecuter exec = new LogicExecuter(timeline);
+
+ // run it
+ exec.startLiveExecution();
+ ui.run();
+ exec.stopLiveExecution();
+ }
+
+ private SimpleLogicUIStandalone()
+ {
+ throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.examples;
+
+import net.mograsim.logic.ui.SimpleLogicUIStandalone;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIManualSwitch;
+import net.mograsim.logic.ui.model.components.GUINotGate;
+import net.mograsim.logic.ui.model.components.GUIOrGate;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.WireCrossPoint;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+
+public class RSLatchExample
+{
+ public static void main(String[] args)
+ {
+ SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample);
+ }
+
+ @SuppressWarnings("unused") // for GUIWires being created
+ public static void createRSLatchExample(ViewModel model)
+ {
+ GUIManualSwitch rIn = new GUIManualSwitch(model);
+ rIn.moveTo(100, 100);
+ GUIManualSwitch sIn = new GUIManualSwitch(model);
+ sIn.moveTo(100, 200);
+
+ GUIOrGate or1 = new GUIOrGate(model, 1);
+ or1.moveTo(160, 102.5);
+ new GUIWire(model, rIn.getOutputPin(), or1.getInputPins().get(0));
+
+ GUIOrGate or2 = new GUIOrGate(model, 1);
+ or2.moveTo(160, 192.5);
+ new GUIWire(model, sIn.getOutputPin(), or2.getInputPins().get(1));
+
+ GUINotGate not1 = new GUINotGate(model, 1);
+ not1.moveTo(200, 107.5);
+ new GUIWire(model, or1.getOutputPin(), not1.getInputPins().get(0));
+
+ GUINotGate not2 = new GUINotGate(model, 1);
+ not2.moveTo(200, 197.5);
+ new GUIWire(model, or2.getOutputPin(), not2.getInputPins().get(0));
+
+ WireCrossPoint p1 = new WireCrossPoint(model, 1);
+ p1.moveTo(250, 112.5);
+ new GUIWire(model, not1.getOutputPin(), p1.getPin());
+ new GUIWire(model, p1.getPin(), or2.getInputPins().get(0), new Point(250, 130), new Point(140, 185), new Point(140, 197.5));
+
+ WireCrossPoint p2 = new WireCrossPoint(model, 1);
+ p2.moveTo(250, 202.5);
+ new GUIWire(model, not2.getOutputPin(), p2.getPin());
+ new GUIWire(model, p2.getPin(), or1.getInputPins().get(1), new Point(250, 185), new Point(140, 130), new Point(140, 117.5));
+
+ WireCrossPoint o1 = new WireCrossPoint(model, 1);
+ o1.moveTo(270, 112.5);
+ new GUIWire(model, p1.getPin(), o1.getPin());
+
+ WireCrossPoint o2 = new WireCrossPoint(model, 1);
+ o2.moveTo(270, 202.5);
+ new GUIWire(model, p2.getPin(), o2.getPin());
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+
+public class ViewModel
+{
+ private final List<GUIComponent> components;
+ private final List<GUIComponent> componentsUnmodifiable;
+ private final List<GUIWire> wires;
+ private final List<GUIWire> wiresUnmodifiable;
+
+ private final List<Consumer<? super GUIComponent>> componentAddedListeners;
+ private final List<Consumer<? super GUIComponent>> componentRemovedListeners;
+ private final List<Consumer<? super GUIWire>> wireAddedListeners;
+ private final List<Consumer<? super GUIWire>> wireRemovedListeners;
+
+ public ViewModel()
+ {
+ components = new ArrayList<>();
+ componentsUnmodifiable = Collections.unmodifiableList(components);
+ wires = new ArrayList<>();
+ wiresUnmodifiable = Collections.unmodifiableList(wires);
+
+ componentAddedListeners = new ArrayList<>();
+ componentRemovedListeners = new ArrayList<>();
+ wireAddedListeners = new ArrayList<>();
+ wireRemovedListeners = new ArrayList<>();
+ }
+
+ /**
+ * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
+ * code as it is automatically called in GUIComponent::new.
+ */
+ public void componentCreated(GUIComponent component)
+ {
+ if (components.contains(component))
+ throw new IllegalStateException("Don't add the same component twice!");
+ components.add(component);
+ callComponentAddedListeners(component);
+ }
+
+ /**
+ * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
+ * application code as it is automatically called in GUIComponent::destroy.
+ */
+ public void componentDestroyed(GUIComponent component)
+ {
+ if (!components.contains(component))
+ throw new IllegalStateException("Don't remove the same component twice!");
+ components.remove(component);
+ callComponentRemovedListeners(component);
+ }
+
+ /**
+ * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application
+ * code as it is automatically called in GUIComponent::new.
+ */
+ public void wireCreated(GUIWire wire)
+ {
+ if (wires.contains(wire))
+ throw new IllegalStateException("Don't add the same wire twice!");
+ wires.add(wire);
+ callWireAddedListeners(wire);
+ }
+
+ /**
+ * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from
+ * application code as it is automatically called in GUIComponent::destroy.
+ */
+ public void wireDestroyed(GUIWire wire)
+ {
+ if (!wires.contains(wire))
+ throw new IllegalStateException("Don't remove the same wire twice!");
+ wires.remove(wire);
+ callWireRemovedListeners(wire);
+ }
+
+ public List<GUIComponent> getComponents()
+ {
+ return componentsUnmodifiable;
+ }
+
+ public List<GUIWire> getWires()
+ {
+ return wiresUnmodifiable;
+ }
+
+ // @formatter:off
+ public void addComponentAddedListener (Consumer<? super GUIComponent> listener){componentAddedListeners .add (listener);}
+ public void addComponentRemovedListener (Consumer<? super GUIComponent> listener){componentRemovedListeners.add (listener);}
+ public void addWireAddedListener (Consumer<? super GUIWire > listener){wireAddedListeners .add (listener);}
+ public void addWireRemovedListener (Consumer<? super GUIWire > listener){wireRemovedListeners .add (listener);}
+
+ public void removeComponentAddedListener (Consumer<? super GUIComponent> listener){componentAddedListeners .remove(listener);}
+ public void removeComponentRemovedListener(Consumer<? super GUIComponent> listener){componentRemovedListeners.remove(listener);}
+ public void removeWireAddedListener (Consumer<? super GUIWire > listener){wireAddedListeners .remove(listener);}
+ public void removeWireRemovedListener (Consumer<? super GUIWire > listener){wireRemovedListeners .remove(listener);}
+
+ private void callComponentAddedListeners (GUIComponent c) {componentAddedListeners .forEach(l -> l.accept(c));}
+ private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));}
+ private void callWireAddedListeners (GUIWire w ) {wireAddedListeners .forEach(l -> l.accept(w));}
+ private void callWireRemovedListeners (GUIWire w ) {wireRemovedListeners .forEach(l -> l.accept(w));}
+ // @formatter:on
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUIAndGate extends SimpleRectangularGUIGate
+{
+ public GUIAndGate(ViewModel model, int logicWidth)
+ {
+ super(model, logicWidth, "&", false);
+ setInputCount(2);// TODO make variable
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public abstract class GUIComponent
+{
+ protected final ViewModel model;
+ private final Rectangle bounds;
+ private final List<Pin> pins;
+ protected final List<Pin> pinsUnmodifiable;
+
+ private final List<Consumer<? super GUIComponent>> componentLookChangedListeners;
+ private final List<Consumer<? super GUIComponent>> componentMovedListeners;
+ private final List<Consumer<? super Pin>> pinAddedListeners;
+ private final List<Consumer<? super Pin>> pinRemovedListeners;
+
+ public GUIComponent(ViewModel model)
+ {
+ this.model = model;
+ this.bounds = new Rectangle(0, 0, 0, 0);
+ this.pins = new ArrayList<>();
+ this.pinsUnmodifiable = Collections.unmodifiableList(pins);
+
+ this.componentLookChangedListeners = new ArrayList<>();
+ this.componentMovedListeners = new ArrayList<>();
+ this.pinAddedListeners = new ArrayList<>();
+ this.pinRemovedListeners = new ArrayList<>();
+
+ model.componentCreated(this);
+ }
+
+ public void destroy()
+ {
+ pins.forEach(p -> pinRemovedListeners.forEach(l -> l.accept(p)));
+ model.componentDestroyed(this);
+ }
+
+ public void moveTo(double x, double y)
+ {
+ bounds.x = x;
+ bounds.y = y;
+ callComponentMovedListeners();
+ }
+
+ /**
+ * Returns the bounds of this component. Used for calculating which component is clicked.
+ */
+ public Rectangle getBounds()
+ {
+ return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
+ }
+
+ /**
+ * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this
+ * click.
+ */
+ @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden
+ public boolean clicked(double x, double y)
+ {
+ return false;
+ }
+
+ /**
+ * Returns a list of pins of this component.
+ */
+ public List<Pin> getPins()
+ {
+ return pinsUnmodifiable;
+ }
+
+ // @formatter:off
+ public void addComponentLookChangedListener (Consumer<? super GUIComponent> listener) {componentLookChangedListeners.add (listener);}
+ public void addComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .add (listener);}
+ public void addPinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .add (listener);}
+ public void addPinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .add (listener);}
+
+ public void removeComponentLookChangedListener(Consumer<? super GUIComponent> listener) {componentLookChangedListeners.remove(listener);}
+ public void removeComponentMovedListener (Consumer<? super GUIComponent> listener) {componentMovedListeners .remove(listener);}
+ public void removePinAddedListener (Consumer<? super Pin > listener) {pinAddedListeners .remove(listener);}
+ public void removePinRemovedListener (Consumer<? super Pin > listener) {pinRemovedListeners .remove(listener);}
+
+ protected void callComponentLookChangedListeners( ) {componentLookChangedListeners.forEach(l -> l.accept(this));}
+ private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));}
+ private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));}
+ private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));}
+ // @form atter:on
+
+ /**
+ * Render this component to the given gc.
+ */
+ public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+
+ protected void setSize(double width, double height)
+ {
+ bounds.width = width;
+ bounds.height = height;
+ callComponentLookChangedListeners();
+ }
+
+ protected void addPin(Pin pin)
+ {
+ pins.add(pin);
+ callPinAddedListeners(pin);
+ }
+
+ protected void removePin(Pin pin)
+ {
+ pins.remove(pin);
+ callPinRemovedListeners(pin);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.core.components.ManualSwitch;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class GUIManualSwitch extends GUIComponent
+{
+ private static final double width = 20;
+ private static final double height = 15;
+ private static final double fontHeight = 5;
+
+ private final Pin outputPin;
+
+ private ManualSwitch logicSwitch;
+ private ReadEnd end;
+
+ public GUIManualSwitch(ViewModel model)
+ {
+ super(model);
+ setSize(width, height);
+ addPin(this.outputPin = new Pin(this, 1, width, height / 2));
+ }
+
+ @Override
+ public void render(GeneralGC gc, Rectangle visibleRegion)
+ {
+ double posX = getBounds().x;
+ double posY = getBounds().y;
+
+ gc.drawRectangle(posX, posY, width, height);
+ String label = BitVectorFormatter.formatValueAsString(end);
+ Font oldFont = gc.getFont();
+ Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
+ gc.setFont(labelFont);
+ Point textExtent = gc.textExtent(label);
+ gc.drawText(label, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
+ gc.setFont(oldFont);
+ }
+
+ public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
+ {
+ this.logicSwitch = logicSwitch;
+ this.end = end;
+ // TODO when ManualSwitch supports it, add listeners
+ end.addObserver((i, o) -> callComponentLookChangedListeners());
+ }
+
+ @Override
+ public boolean clicked(double x, double y)
+ {
+ if (logicSwitch != null)
+ logicSwitch.toggle();
+ return true;
+ }
+
+ public Pin getOutputPin()
+ {
+ return outputPin;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUINotGate extends SimpleRectangularGUIGate
+{
+ public GUINotGate(ViewModel model, int logicWidth)
+ {
+ super(model, logicWidth, "1", true);
+ setInputCount(1);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import net.mograsim.logic.ui.model.ViewModel;
+
+public class GUIOrGate extends SimpleRectangularGUIGate
+{
+ public GUIOrGate(ViewModel model, int logicWidth)
+ {
+ super(model, logicWidth, "\u22651", false);// ">=1"
+ setInputCount(2);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.components;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.wires.MovablePin;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Font;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class SimpleRectangularGUIGate extends GUIComponent
+{
+ private static final double width = 20;
+ private static final double pinDistance = 10;
+ private static final double fontHeight = 5;
+ private static final double invertedCircleDiam = 3.5;
+
+ private final String label;
+ protected final int logicWidth;
+ private final boolean isInverted;
+ private final double rectWidth;
+
+ private MovablePin outputPin;
+ private final List<Pin> inputPins;
+ private final List<Pin> inputPinsUnmodifiable;
+
+ protected SimpleRectangularGUIGate(ViewModel model, int logicWidth, String label, boolean isInverted)
+ {
+ super(model);
+ this.label = label;
+ this.logicWidth = logicWidth;
+ this.isInverted = isInverted;
+ this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
+ this.outputPin = new MovablePin(this, logicWidth, width, 0);
+ addPin(outputPin);
+ this.inputPins = new ArrayList<>();
+ this.inputPinsUnmodifiable = Collections.unmodifiableList(inputPins);
+ setInputCount(1);
+ }
+
+ protected void setInputCount(int inputCount)
+ {
+ int oldInputCount = inputPins.size();
+ setSize(width, inputCount * pinDistance);
+ if (oldInputCount > inputCount)
+ while (inputPins.size() > inputCount)
+ removePin(inputPins.get(inputCount));
+ else if (oldInputCount < inputCount)
+ for (int i = oldInputCount; i < inputCount; i++)
+ {
+ Pin pin = new Pin(this, logicWidth, 0, pinDistance / 2 + i * pinDistance);
+ inputPins.add(pin);
+ addPin(pin);
+ }
+ outputPin.setRelPos(width, inputCount * pinDistance / 2);
+ }
+
+ public Pin getOutputPin()
+ {
+ return outputPin;
+ }
+
+ public List<Pin> getInputPins()
+ {
+ return inputPinsUnmodifiable;
+ }
+
+ @Override
+ public void render(GeneralGC gc, Rectangle visibleRegion)
+ {
+ double posX = getBounds().x;
+ double posY = getBounds().y;
+
+ double height = inputPins.size() * pinDistance;
+ gc.drawRectangle(posX, posY, rectWidth, height);
+ Font oldFont = gc.getFont();
+ Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
+ gc.setFont(labelFont);
+ Point textExtent = gc.textExtent(label);
+ gc.drawText(label, posX + (rectWidth - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true);
+ gc.setFont(oldFont);
+ if (isInverted)
+ gc.drawOval(posX + rectWidth, posY + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.wires;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.ColorHelper;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class GUIWire
+{
+ private final ViewModel model;
+ public final int logicWidth;
+ private Pin pin1;
+ private Pin pin2;
+ private double[] path;
+
+ private final List<Consumer<? super GUIWire>> wireLookChangedListeners;
+
+ private ReadEnd end;
+
+ public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path)
+ {
+ this.model = model;
+ this.logicWidth = pin1.logicWidth;
+ if (pin2.logicWidth != pin1.logicWidth)
+ throw new IllegalArgumentException("Can't connect pins of different logic width");
+ this.path = new double[path.length * 2 + 4];
+ for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2)
+ {
+ this.path[dstI + 0] = path[srcI].x;
+ this.path[dstI + 1] = path[srcI].y;
+ }
+
+ this.pin1 = pin1;
+ this.pin2 = pin2;
+
+ wireLookChangedListeners = new ArrayList<>();
+
+ pin1.addPinMovedListener(p -> pin1Moved());
+ pin2.addPinMovedListener(p -> pin2Moved());
+ pin1Moved();
+ pin2Moved();
+
+ model.wireCreated(this);
+ }
+
+ private void pin1Moved()
+ {
+ Point pos = pin1.getPos();
+ this.path[0] = pos.x;
+ this.path[1] = pos.y;
+ }
+
+ private void pin2Moved()
+ {
+ Point pos = pin2.getPos();
+ this.path[this.path.length - 2] = pos.x;
+ this.path[this.path.length - 1] = pos.y;
+ }
+
+ public void destroy()
+ {
+ model.wireDestroyed(this);
+ }
+
+ public void render(GeneralGC gc)
+ {
+ ColorHelper.executeWithDifferentForeground(gc, BitVectorFormatter.formatAsColor(end), () -> gc.drawPolyline(path));
+ }
+
+ public void setLogicModelBinding(ReadEnd end)
+ {
+ this.end = end;
+ end.addObserver((i, o) -> callWireLookChangedListeners());
+ }
+
+ public Pin getPin1()
+ {
+ return pin1;
+ }
+
+ public Pin getPin2()
+ {
+ return pin2;
+ }
+
+ // @formatter:off
+ public void addWireLookChangedListener (Consumer<? super GUIWire> listener) {wireLookChangedListeners.add (listener);}
+
+ public void removeWireLookChangedListener(Consumer<? super GUIWire> listener) {wireLookChangedListeners.remove(listener);}
+
+ private void callWireLookChangedListeners() {wireLookChangedListeners.forEach(l -> l.accept(this));}
+ // @formatter:on
+
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.wires;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+
+public class MovablePin extends Pin
+{
+ public MovablePin(GUIComponent component, int logicWidth, double relX, double relY)
+ {
+ super(component, logicWidth, relX, relY);
+ }
+
+ @Override
+ public void setRelPos(double relX, double relY)
+ {
+ super.setRelPos(relX, relY);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.wires;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+
+public class Pin
+{
+ public final GUIComponent component;
+ public final int logicWidth;
+
+ protected double relX;
+ protected double relY;
+
+ private final List<Consumer<? super Pin>> pinMovedListeners;
+
+ public Pin(GUIComponent component, int logicWidth, double relX, double relY)
+ {
+ this.component = component;
+ this.logicWidth = logicWidth;
+ this.relX = relX;
+ this.relY = relY;
+
+ this.pinMovedListeners = new ArrayList<>();
+
+ component.addComponentMovedListener(c -> callPinMovedListeners());
+ }
+
+ public double getRelX()
+ {
+ return relX;
+ }
+
+ public double getRelY()
+ {
+ return relY;
+ }
+
+ public Point getRelPos()
+ {
+ return new Point(relX, relY);
+ }
+
+ public Point getPos()
+ {
+ Rectangle componentBounds = component.getBounds();
+ return new Point(relX + componentBounds.x, relY + componentBounds.y);
+ }
+
+ // @formatter:off
+ public void addPinMovedListener (Consumer<? super Pin> listener){pinMovedListeners.add (listener);}
+
+ public void removePinMovedListener(Consumer<? super Pin> listener){pinMovedListeners.remove(listener);}
+
+ private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));}
+ // @formatter:on
+
+ protected void setRelPos(double relX, double relY)
+ {
+ this.relX = relX;
+ this.relY = relY;
+ callPinMovedListeners();
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.model.wires;
+
+import net.mograsim.logic.ui.ColorHelper;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.haspamelodica.swt.helper.gcs.GeneralGC;
+import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
+import net.mograsim.logic.core.types.BitVectorFormatter;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class WireCrossPoint extends GUIComponent
+{
+ private final Pin pin;
+
+ private ReadEnd end;
+ private final int logicWidth;
+
+ public WireCrossPoint(ViewModel model, int logicWidth)
+ {
+ super(model);
+ this.logicWidth = logicWidth;
+ setSize(0, 0);
+ addPin(this.pin = new Pin(this, logicWidth, 0, 0));
+ }
+
+ @Override
+ public void render(GeneralGC gc, Rectangle visibleRegion)
+ {
+ Rectangle bounds = getBounds();
+ ColorHelper.executeWithDifferentBackground(gc, BitVectorFormatter.formatAsColor(end),
+ () -> gc.fillOval(bounds.x - 1, bounds.y - 1, 2, 2));
+ }
+
+ public void setLogicModelBinding(ReadEnd end)
+ {
+ this.end = end;
+ end.addObserver((i, o) -> callComponentLookChangedListeners());
+ }
+
+ public int getLogicWidth()
+ {
+ return logicWidth;
+ }
+
+ public Pin getPin()
+ {
+ return pin;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.modeladapter;
+
+public class LogicModelParameters
+{
+ public int wireTravelTime;
+ public int gateProcessTime;
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.modeladapter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.model.components.GUIAndGate;
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.components.GUINotGate;
+import net.mograsim.logic.ui.model.components.GUIOrGate;
+import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.model.wires.WireCrossPoint;
+import net.mograsim.logic.ui.modeladapter.componentadapters.ComponentAdapter;
+import net.mograsim.logic.ui.modeladapter.componentadapters.ManualSwitchAdapter;
+import net.mograsim.logic.ui.modeladapter.componentadapters.SimpleGateAdapter;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.components.gates.AndGate;
+import net.mograsim.logic.core.components.gates.NotGate;
+import net.mograsim.logic.core.components.gates.OrGate;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+
+public class ViewLogicModelAdapter
+{
+ private final static Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdapters;
+ static
+ {
+ Set<ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashSet<>();
+ componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new));
+ componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new));
+ componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o)));
+ componentAdaptersModifiable.add(new ManualSwitchAdapter());
+ // TODO list all "primitive" adapters here
+ componentAdapters = Collections.unmodifiableMap(
+ componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity())));
+ }
+
+ public static Timeline convert(ViewModel viewModel, LogicModelParameters params)
+ {
+ // TODO replace Timeline with LogicModel as soon as it exists
+ Timeline timeline = new Timeline(10);
+
+ Map<Pin, Wire> logicWiresPerPin = convertWires(
+ viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()),
+ viewModel.getWires(), params, timeline);
+ Map<Pin, Wire> logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin);
+
+ Map<GUIComponent, Component> oneToOneComponents = new HashMap<>();
+ for (GUIComponent guiComp : viewModel.getComponents())
+ {
+ if (!(guiComp instanceof WireCrossPoint))
+ oneToOneComponents.put(guiComp, createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable,
+ componentAdapters.get(guiComp.getClass())));
+ else
+ {
+ WireCrossPoint guiCompCasted = (WireCrossPoint) guiComp;
+ guiCompCasted.setLogicModelBinding(logicWiresPerPin.get(guiCompCasted.getPin()).createReadOnlyEnd());
+ }
+ }
+
+ // TODO handle complex components
+
+ List<Component> logicComponents = new ArrayList<>();
+ logicComponents.addAll(oneToOneComponents.values());
+
+ return timeline;
+ }
+
+ private static Map<Pin, Wire> convertWires(Set<Pin> allPins, List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
+ {
+ Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(allPins, wires);
+ Map<Pin, Wire> logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups);
+ setGUIWiresLogicModelBinding(wires, logicWiresPerPin);
+ return logicWiresPerPin;
+ }
+
+ private static Map<Pin, Wire> createLogicWires(LogicModelParameters params, Timeline timeline, Map<Pin, Set<Pin>> connectedPinGroups)
+ {
+ Map<Pin, Wire> logicWiresPerPin = new HashMap<>();
+ Map<Set<Pin>, Wire> logicWiresPerPinGroup = new HashMap<>();
+ for (Entry<Pin, Set<Pin>> e : connectedPinGroups.entrySet())
+ logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(),
+ set -> new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime)));
+ return logicWiresPerPin;
+ }
+
+ private static void setGUIWiresLogicModelBinding(List<GUIWire> wires, Map<Pin, Wire> logicWiresPerPin)
+ {
+ Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct()
+ .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd));
+ for (GUIWire guiWire : wires)
+ guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1())));
+ }
+
+ private static Map<Pin, Set<Pin>> getConnectedPinGroups(Set<Pin> allPins, List<GUIWire> wires)
+ {
+ Map<Pin, Set<Pin>> connectedPinsPerPin = new HashMap<>();
+
+ for (Pin p : allPins)
+ {
+ HashSet<Pin> connectedPins = new HashSet<>();
+ connectedPins.add(p);
+ connectedPinsPerPin.put(p, connectedPins);
+ }
+
+ wires.forEach(wire ->
+ {
+ Pin pin1 = wire.getPin1();
+ Pin pin2 = wire.getPin2();
+
+ Set<Pin> pin1ConnectedPins = connectedPinsPerPin.get(pin1);
+ Set<Pin> pin2ConnectedPins = connectedPinsPerPin.get(pin2);
+
+ pin1ConnectedPins.addAll(pin2ConnectedPins);
+ pin1ConnectedPins.add(pin1);
+ pin1ConnectedPins.add(pin2);
+
+ pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins));
+ });
+ return connectedPinsPerPin;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <G extends GUIComponent> Component createAndLinkComponent(Timeline timeline, LogicModelParameters params,
+ GUIComponent guiComponent, Map<Pin, Wire> logicWiresPerPin, ComponentAdapter<G> adapter)
+ {
+ if (adapter == null)
+ throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass());
+ return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin);
+ }
+
+ private ViewLogicModelAdapter()
+ {
+ throw new UnsupportedOperationException("No ViewLogicModelConverter instances");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.GUIComponent;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+
+public interface ComponentAdapter<G extends GUIComponent>
+{
+ public Class<G> getSupportedClass();
+
+ public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent,
+ Map<Pin, Wire> logicWiresPerPin);
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.GUIManualSwitch;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.components.ManualSwitch;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class ManualSwitchAdapter implements ComponentAdapter<GUIManualSwitch>
+{
+ @Override
+ public Class<GUIManualSwitch> getSupportedClass()
+ {
+ return GUIManualSwitch.class;
+ }
+
+ @Override
+ public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIManualSwitch guiComponent,
+ Map<Pin, Wire> logicWiresPerPin)
+ {
+ ReadWriteEnd end = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+ ManualSwitch manualSwitch = new ManualSwitch(timeline, end);
+ guiComponent.setLogicModelBinding(manualSwitch, end);
+ return manualSwitch;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.logic.ui.modeladapter.componentadapters;
+
+import java.util.List;
+import java.util.Map;
+
+import net.mograsim.logic.ui.model.components.SimpleRectangularGUIGate;
+import net.mograsim.logic.ui.model.wires.Pin;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.core.components.Component;
+import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.wires.Wire;
+import net.mograsim.logic.core.wires.Wire.ReadEnd;
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
+
+public class SimpleGateAdapter<G extends SimpleRectangularGUIGate> implements ComponentAdapter<G>
+{
+ private final Class<G> supportedClass;
+ private final ComponentConstructor constructor;
+
+ public SimpleGateAdapter(Class<G> supportedClass, ComponentConstructor constructor)
+ {
+ this.supportedClass = supportedClass;
+ this.constructor = constructor;
+ }
+
+ @Override
+ public Class<G> getSupportedClass()
+ {
+ return supportedClass;
+ }
+
+ @Override
+ public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, G guiComponent, Map<Pin, Wire> logicWiresPerPin)
+ {
+ ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+ List<Pin> inputPins = guiComponent.getInputPins();
+ ReadEnd[] ins = new ReadEnd[inputPins.size()];
+ for (int i = 0; i < inputPins.size(); i++)
+ ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
+ return constructor.newComponent(timeline, params.gateProcessTime, out, ins);
+ }
+
+ public static interface ComponentConstructor
+ {
+ public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+/bin/
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>net.mograsim.rcp</name>
+ <comment></comment>
+ <projects>
+ <project>net.mograsim.rcp</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=140
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=140
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
--- /dev/null
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_MoGraSim
+formatter_settings_version=16
+org.eclipse.jdt.ui.text.custom_code_templates=
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=false
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
--- /dev/null
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
--- /dev/null
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=1
+compilers.p.build.encodings=1
+compilers.p.build.java.compiler=1
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=1
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.no.automatic.module=1
+compilers.p.not-externalized-att=1
+compilers.p.service.component.without.lazyactivation=1
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
--- /dev/null
+eclipse.preferences.version=1
+task-tags/use-project-settings=true
--- /dev/null
+autoEnabled=true
+eclipse.preferences.version=1
+extraProperties=
+fileExclusions=
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_6wlLcMgZEeSyMNYR5xypkQ" elementId="Sample.application" bindingContexts="_6wlLecgZEeSyMNYR5xypkQ">
+ <children xsi:type="basic:TrimmedWindow" xmi:id="_6wlLccgZEeSyMNYR5xypkQ" elementId="Sample.window.main" label="Sample RCP4" iconURI="platform:/plugin/net.mograsim.rcp/icons/app/ico_16t.png" width="500" height="400">
+ <children xsi:type="basic:PartSashContainer" xmi:id="_6wlLksgZEeSyMNYR5xypkQ" elementId="Sample.partsashcontainer.sample">
+ <children xsi:type="basic:PartStack" xmi:id="_6wlLk8gZEeSyMNYR5xypkQ" elementId="Sample.partstack.sample">
+ <children xsi:type="basic:Part" xmi:id="_6wlLlMgZEeSyMNYR5xypkQ" elementId="Sample.part.sample" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.SamplePart" label="Sample Part" iconURI="platform:/plugin/net.mograsim.rcp/icons/home.png"/>
+ <children xsi:type="basic:Part" xmi:id="_cldhcH1HEema06ZDPR6BSw" elementId="net.mograsim.rcp.part.logicui" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.parts.LogicUIPart" label="LogicUI part"/>
+ </children>
+ <children xsi:type="basic:PartStack" xmi:id="_l2EzYG6wEemo__tDmTCqCQ" elementId="sample.partstack.0">
+ <children xsi:type="basic:Part" xmi:id="_mW1XEG6wEemo__tDmTCqCQ" elementId="sample.part.none" label="None" tooltip="Something"/>
+ </children>
+ </children>
+ <mainMenu xmi:id="_6wlLicgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.menu">
+ <children xsi:type="menu:Menu" xmi:id="_6wlLisgZEeSyMNYR5xypkQ" elementId="file" label="File">
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLi8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.file.open" label="Open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.save" label="Save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjcgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.quit" label="Quit" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+ </children>
+ <children xsi:type="menu:Menu" xmi:id="_6wlLjsgZEeSyMNYR5xypkQ" elementId="help" label="Help">
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLj8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.about" label="About" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+ </children>
+ </mainMenu>
+ <trimBars xmi:id="_6wlLlcgZEeSyMNYR5xypkQ" elementId="Sample.trimbar.top">
+ <children xsi:type="menu:ToolBar" xmi:id="_6wlLlsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.toolbar">
+ <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLmMgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.save" iconURI="platform:/plugin/net.mograsim.rcp/icons/save_edit.png" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+ <children xsi:type="menu:HandledToolItem" xmi:id="_6wlLl8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.trimbar.top.open" iconURI="platform:/plugin/net.mograsim.rcp/icons/open_in_app.png" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+ </children>
+ </trimBars>
+ </children>
+ <handlers xmi:id="_6wlLfcgZEeSyMNYR5xypkQ" elementId="sample.handler.quitCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.QuitHandler" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+ <handlers xmi:id="_6wlLgcgZEeSyMNYR5xypkQ" elementId="sample.handler.openCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.OpenHandler" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+ <handlers xmi:id="_6wlLhMgZEeSyMNYR5xypkQ" elementId="sample.handler.saveCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.SaveHandler" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+ <handlers xmi:id="_6wlLh8gZEeSyMNYR5xypkQ" elementId="sample.handler.aboutCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.AboutHandler" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+ <bindingTables xmi:id="_6wlLfsgZEeSyMNYR5xypkQ" elementId="Sample.bindingtable" bindingContext="_6wlLecgZEeSyMNYR5xypkQ">
+ <bindings xmi:id="_6wlLf8gZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1q" keySequence="M1+Q" command="_6wlLfMgZEeSyMNYR5xypkQ"/>
+ <bindings xmi:id="_6wlLgsgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1o" keySequence="M1+O" command="_6wlLgMgZEeSyMNYR5xypkQ"/>
+ <bindings xmi:id="_6wlLhcgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1s" keySequence="M1+S" command="_6wlLg8gZEeSyMNYR5xypkQ"/>
+ <bindings xmi:id="_6wlLiMgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1a" keySequence="M1+A" command="_6wlLhsgZEeSyMNYR5xypkQ"/>
+ </bindingTables>
+ <rootContext xmi:id="_6wlLecgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+ <children xmi:id="_6wlLesgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
+ <children xmi:id="_6wlLe8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+ </rootContext>
+ <commands xmi:id="_6wlLfMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>
+ <commands xmi:id="_6wlLgMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.open" commandName="openCommand"/>
+ <commands xmi:id="_6wlLg8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>
+ <commands xmi:id="_6wlLhsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>
+ <addons xmi:id="_6wlLcsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+ <addons xmi:id="_6wlLc8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+ <addons xmi:id="_6wlLdMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
+ <addons xmi:id="_6wlLdcgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
+ <addons xmi:id="_6wlLdsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.handler.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.HandlerProcessingAddon"/>
+ <addons xmi:id="_6wlLd8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
+ <addons xmi:id="_6wlLeMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
+</application:Application>
--- /dev/null
+Eclipse Public License - v 2.0
+
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+ PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
+ OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial content
+ Distributed under this Agreement, and
+
+ b) in the case of each subsequent Contributor:
+ i) changes to the Program, and
+ ii) additions to the Program;
+ where such changes and/or additions to the Program originate from
+ and are Distributed by that particular Contributor. A Contribution
+ "originates" from a Contributor if it was added to the Program by
+ such Contributor itself or anyone acting on such Contributor's behalf.
+ Contributions do not include changes or additions to the Program that
+ are not Modified Works.
+
+"Contributor" means any person or entity that Distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions Distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement
+or any Secondary License (as applicable), including Contributors.
+
+"Derivative Works" shall mean any work, whether in Source Code or other
+form, that is based on (or derived from) the Program and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship.
+
+"Modified Works" shall mean any work in Source Code or other form that
+results from an addition to, deletion from, or modification of the
+contents of the Program, including, for purposes of clarity any new file
+in Source Code form that contains any contents of the Program. Modified
+Works shall not include works that contain only declarations,
+interfaces, types, classes, structures, or files of the Program solely
+in each case in order to link to, bind by name, or subclass the Program
+or Modified Works thereof.
+
+"Distribute" means the acts of a) distributing or b) making available
+in any manner that enables the transfer of a copy.
+
+"Source Code" means the form of a Program preferred for making
+modifications, including but not limited to software source code,
+documentation source, and configuration files.
+
+"Secondary License" means either the GNU General Public License,
+Version 2.0, or any later versions of that license, including any
+exceptions or additional permissions as identified by the initial
+Contributor.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free copyright
+ license to reproduce, prepare Derivative Works of, publicly display,
+ publicly perform, Distribute and sublicense the Contribution of such
+ Contributor, if any, and such Derivative Works.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free patent
+ license under Licensed Patents to make, use, sell, offer to sell,
+ import and otherwise transfer the Contribution of such Contributor,
+ if any, in Source Code or other form. This patent license shall
+ apply to the combination of the Contribution and the Program if, at
+ the time the Contribution is added by the Contributor, such addition
+ of the Contribution causes such combination to be covered by the
+ Licensed Patents. The patent license shall not apply to any other
+ combinations which include the Contribution. No hardware per se is
+ licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the
+ licenses to its Contributions set forth herein, no assurances are
+ provided by any Contributor that the Program does not infringe the
+ patent or other intellectual property rights of any other entity.
+ Each Contributor disclaims any liability to Recipient for claims
+ brought by any other entity based on infringement of intellectual
+ property rights or otherwise. As a condition to exercising the
+ rights and licenses granted hereunder, each Recipient hereby
+ assumes sole responsibility to secure any other intellectual
+ property rights needed, if any. For example, if a third party
+ patent license is required to allow Recipient to Distribute the
+ Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has
+ sufficient copyright rights in its Contribution, if any, to grant
+ the copyright license set forth in this Agreement.
+
+ e) Notwithstanding the terms of any Secondary License, no
+ Contributor makes additional grants to any Recipient (other than
+ those set forth in this Agreement) as a result of such Recipient's
+ receipt of the Program under the terms of a Secondary License
+ (if permitted under the terms of Section 3).
+
+3. REQUIREMENTS
+
+3.1 If a Contributor Distributes the Program in any form, then:
+
+ a) the Program must also be made available as Source Code, in
+ accordance with section 3.2, and the Contributor must accompany
+ the Program with a statement that the Source Code for the Program
+ is available under this Agreement, and informs Recipients how to
+ obtain it in a reasonable manner on or through a medium customarily
+ used for software exchange; and
+
+ b) the Contributor may Distribute the Program under a license
+ different than this Agreement, provided that such license:
+ i) effectively disclaims on behalf of all other Contributors all
+ warranties and conditions, express and implied, including
+ warranties or conditions of title and non-infringement, and
+ implied warranties or conditions of merchantability and fitness
+ for a particular purpose;
+
+ ii) effectively excludes on behalf of all other Contributors all
+ liability for damages, including direct, indirect, special,
+ incidental and consequential damages, such as lost profits;
+
+ iii) does not attempt to limit or alter the recipients' rights
+ in the Source Code under section 3.2; and
+
+ iv) requires any subsequent distribution of the Program by any
+ party to be under a license that satisfies the requirements
+ of this section 3.
+
+3.2 When the Program is Distributed as Source Code:
+
+ a) it must be made available under this Agreement, or if the
+ Program (i) is combined with other material in a separate file or
+ files made available under a Secondary License, and (ii) the initial
+ Contributor attached to the Source Code the notice described in
+ Exhibit A of this Agreement, then the Program may be made available
+ under the terms of such Secondary Licenses, and
+
+ b) a copy of this Agreement must be included with each copy of
+ the Program.
+
+3.3 Contributors may not remove or alter any copyright, patent,
+trademark, attribution notices, disclaimers of warranty, or limitations
+of liability ("notices") contained within the Program from any copy of
+the Program which they Distribute, provided that Contributors may add
+their own appropriate notices.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program,
+the Contributor who includes the Program in a commercial product
+offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes
+the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify every
+other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits
+and other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program
+in a commercial product offering. The obligations in this section do not
+apply to any claims or Losses relating to any actual or alleged
+intellectual property infringement. In order to qualify, an Indemnified
+Contributor must: a) promptly notify the Commercial Contributor in
+writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those performance
+claims and warranties, and if a court requires any other Contributor to
+pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all
+risks associated with its exercise of rights under this Agreement,
+including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs
+or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
+SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software
+or hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. The Eclipse Foundation
+is the initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+Distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to Distribute the Program (including its
+Contributions) under the new version.
+
+Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted
+under this Agreement are reserved. Nothing in this Agreement is intended
+to be enforceable by any entity that is not a Contributor or Recipient.
+No third-party beneficiary rights are created under this Agreement.
+
+Exhibit A - Form of Secondary Licenses Notice
+
+"This Source Code may also be made available under the following
+Secondary Licenses when the conditions for such availability set forth
+in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+version(s), and exceptions or additional permissions here}."
+
+ Simply including a copy of this Agreement, including this Exhibit A
+ is not sufficient to license the Source Code under Secondary Licenses.
+
+ If it is not possible or desirable to put the notice in a particular
+ file, then You may include the notice in a location (such as a LICENSE
+ file in a relevant directory) where a recipient would be likely to
+ look for such a notice.
+
+ You may add additional accurate notices of copyright ownership.
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: net.mograsim.rcp;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.15.200",
+ org.eclipse.e4.ui.model.workbench;bundle-version="2.1.300",
+ org.eclipse.jface;bundle-version="3.15.100",
+ org.eclipse.e4.ui.workbench;bundle-version="1.9.0",
+ org.eclipse.e4.core.di;bundle-version="1.7.100",
+ org.eclipse.e4.ui.di;bundle-version="1.2.500",
+ org.eclipse.ui.workbench;bundle-version="3.113.0",
+ javax.annotation;bundle-version="1.2.0",
+ net.mograsim.logic.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: Sample
+Export-Package: net.mograsim.rcp.handlers;uses:="org.eclipse.swt.widgets,org.eclipse.e4.ui.workbench,org.eclipse.e4.ui.workbench.modeling",
+ net.mograsim.rcp.parts;uses:="org.eclipse.swt.widgets",
+ net.mograsim.rcp.splashhandlers
--- /dev/null
+#Properties file for Sample
+Bundle-Vendor = MYSELF
+Bundle-Name = Sample
+product.name = Sample
+extension-point.name = Splash Extensions
+product.name.0 = Simulator WIP
\ No newline at end of file
--- /dev/null
+output.. = bin/
+bin.includes = plugin.xml,\
+ META-INF/,\
+ .,\
+ icons/,\
+ Application.e4xmi,\
+ css/,\
+ splash.bmp,\
+ schema/,\
+ OSGI-INF/l10n/bundle.properties,\
+ OSGI-INF/
+source.. = src/
+src.includes = Application.e4xmi,\
+ OSGI-INF/l10n/bundle.properties,\
+ css/,\
+ icons/,\
+ schema/,\
+ splash.bmp
--- /dev/null
+/* XPM */
+static char * C:\Users\Christian\Documents\Informatik_Studium\ico_256t_xpm[] = {
+"256 256 2750 2",
+" c None",
+". c #000000",
+"+ c #00100E",
+"@ c #001312",
+"# c #001413",
+"$ c #001C1B",
+"% c #001A19",
+"& c #001515",
+"* c #002120",
+"= c #002221",
+"- c #001918",
+"; c #002525",
+"> c #002927",
+", c #002323",
+"' c #000F0E",
+") c #001C1A",
+"! c #002726",
+"~ c #002C2B",
+"{ c #002928",
+"] c #001110",
+"^ c #001E1C",
+"/ c #002727",
+"( c #002D2C",
+"_ c #002B2B",
+": c #002827",
+"< c #001E1D",
+"[ c #001211",
+"} c #001F1C",
+"| c #002E2E",
+"1 c #002625",
+"2 c #001D1D",
+"3 c #002121",
+"4 c #002C2C",
+"5 c #001514",
+"6 c #002F2E",
+"7 c #002B2C",
+"8 c #002424",
+"9 c #001816",
+"0 c #002F2D",
+"a c #00302F",
+"b c #001A18",
+"c c #002725",
+"d c #002A29",
+"e c #001B1A",
+"f c #003130",
+"g c #003131",
+"h c #002F2F",
+"i c #001F1D",
+"j c #000D0B",
+"k c #001615",
+"l c #00110F",
+"m c #001010",
+"n c #001F1E",
+"o c #002B2A",
+"p c #002220",
+"q c #002321",
+"r c #002021",
+"s c #00201E",
+"t c #001D1C",
+"u c #001D1B",
+"v c #001917",
+"w c #001716",
+"x c #001313",
+"y c #001111",
+"z c #001F1F",
+"A c #003333",
+"B c #003231",
+"C c #003332",
+"D c #003232",
+"E c #002020",
+"F c #002E2C",
+"G c #002929",
+"H c #002524",
+"I c #001E1E",
+"J c #001818",
+"K c #001717",
+"L c #001414",
+"M c #002E2F",
+"N c #003233",
+"O c #002E2D",
+"P c #002423",
+"Q c #00201F",
+"R c #001A1A",
+"S c #002F30",
+"T c #003434",
+"U c #002322",
+"V c #003334",
+"W c #002D2D",
+"X c #002828",
+"Y c #002324",
+"Z c #002222",
+"` c #001817",
+" . c #003635",
+".. c #003535",
+"+. c #003534",
+"@. c #003636",
+"#. c #003433",
+"$. c #002D2E",
+"%. c #003533",
+"&. c #003837",
+"*. c #003736",
+"=. c #003836",
+"-. c #003735",
+";. c #003432",
+">. c #002C2A",
+",. c #002422",
+"'. c #002320",
+"). c #001C1C",
+"!. c #003331",
+"~. c #002A28",
+"{. c #002624",
+"]. c #003737",
+"^. c #002D2B",
+"/. c #003839",
+"(. c #003838",
+"_. c #003939",
+":. c #003230",
+"<. c #002B29",
+"[. c #003637",
+"}. c #000C0B",
+"|. c #001412",
+"1. c #00393A",
+"2. c #003A3A",
+"3. c #002626",
+"4. c #001715",
+"5. c #002523",
+"6. c #003A3B",
+"7. c #003536",
+"8. c #003A39",
+"9. c #00302E",
+"0. c #003C3C",
+"a. c #003B3C",
+"b. c #003B3B",
+"c. c #003B3A",
+"d. c #003A3C",
+"e. c #003738",
+"f. c #003030",
+"g. c #00292A",
+"h. c #001919",
+"i. c #001614",
+"j. c #002A2A",
+"k. c #003C3D",
+"l. c #003B3D",
+"m. c #003D3D",
+"n. c #003132",
+"o. c #003537",
+"p. c #003C3E",
+"q. c #003D3C",
+"r. c #003E3E",
+"s. c #003E3D",
+"t. c #003F3F",
+"u. c #003F3E",
+"v. c #003E3F",
+"w. c #003C3B",
+"x. c #003938",
+"y. c #003D3F",
+"z. c #004041",
+"A. c #004040",
+"B. c #003F40",
+"C. c #003F41",
+"D. c #003E40",
+"E. c #004042",
+"F. c #00403F",
+"G. c #004141",
+"H. c #004142",
+"I. c #004241",
+"J. c #003031",
+"K. c #004242",
+"L. c #003634",
+"M. c #004140",
+"N. c #004243",
+"O. c #004344",
+"P. c #004345",
+"Q. c #004445",
+"R. c #004244",
+"S. c #004343",
+"T. c #004444",
+"U. c #002C2D",
+"V. c #00383A",
+"W. c #004546",
+"X. c #004446",
+"Y. c #004245",
+"Z. c #004646",
+"`. c #004143",
+" + c #004545",
+".+ c #004647",
+"++ c #004747",
+"@+ c #004447",
+"#+ c #004547",
+"$+ c #004746",
+"%+ c #004748",
+"&+ c #00484A",
+"*+ c #004849",
+"=+ c #00474A",
+"-+ c #00484B",
+";+ c #004749",
+">+ c #004848",
+",+ c #004A4C",
+"'+ c #00494C",
+")+ c #004B4C",
+"!+ c #00494B",
+"~+ c #00494A",
+"{+ c #004A4B",
+"]+ c #004C4C",
+"^+ c #004949",
+"/+ c #004B4B",
+"(+ c #004C4D",
+"_+ c #004C4B",
+":+ c #004D4D",
+"<+ c #004D4E",
+"[+ c #004E4F",
+"}+ c #004D4F",
+"|+ c #004E4E",
+"1+ c #004C4E",
+"2+ c #004645",
+"3+ c #004E50",
+"4+ c #004F4F",
+"5+ c #004F50",
+"6+ c #004649",
+"7+ c #005052",
+"8+ c #005051",
+"9+ c #004F51",
+"0+ c #005053",
+"a+ c #005153",
+"b+ c #003D3E",
+"c+ c #005254",
+"d+ c #004B4D",
+"e+ c #005253",
+"f+ c #005152",
+"g+ c #005355",
+"h+ c #005255",
+"i+ c #005154",
+"j+ c #005356",
+"k+ c #005354",
+"l+ c #005456",
+"m+ c #005050",
+"n+ c #005455",
+"o+ c #005457",
+"p+ c #005557",
+"q+ c #005556",
+"r+ c #005658",
+"s+ c #005659",
+"t+ c #004A4A",
+"u+ c #005759",
+"v+ c #005558",
+"w+ c #004648",
+"x+ c #00575A",
+"y+ c #00585A",
+"z+ c #005859",
+"A+ c #00585B",
+"B+ c #004C4F",
+"C+ c #00595C",
+"D+ c #005A5D",
+"E+ c #005A5C",
+"F+ c #00595B",
+"G+ c #00595D",
+"H+ c #005B5D",
+"I+ c #00585C",
+"J+ c #005A5B",
+"K+ c #004D50",
+"L+ c #005B5E",
+"M+ c #005C5E",
+"N+ c #005C5F",
+"O+ c #005C5D",
+"P+ c #005B5F",
+"Q+ c #005D5E",
+"R+ c #005E60",
+"S+ c #005D5F",
+"T+ c #005E5F",
+"U+ c #005B5C",
+"V+ c #005151",
+"W+ c #005F60",
+"X+ c #004342",
+"Y+ c #005657",
+"Z+ c #005F62",
+"`+ c #005F63",
+" @ c #005E61",
+".@ c #005758",
+"+@ c #005D62",
+"@@ c #005D60",
+"#@ c #005C60",
+"$@ c #005E62",
+"%@ c #006063",
+"&@ c #005F61",
+"*@ c #006164",
+"=@ c #006364",
+"-@ c #006264",
+";@ c #006265",
+">@ c #006163",
+",@ c #006365",
+"'@ c #006465",
+")@ c #006466",
+"!@ c #006162",
+"~@ c #006064",
+"{@ c #006366",
+"]@ c #006367",
+"^@ c #006062",
+"/@ c #006567",
+"(@ c #00595A",
+"_@ c #006568",
+":@ c #006467",
+"<@ c #006566",
+"[@ c #006267",
+"}@ c #006165",
+"|@ c #006569",
+"1@ c #006469",
+"2@ c #004346",
+"3@ c #004A4D",
+"4@ c #006468",
+"5@ c #006769",
+"6@ c #006669",
+"7@ c #00676A",
+"8@ c #006668",
+"9@ c #005E63",
+"0@ c #00666A",
+"a@ c #003A38",
+"b@ c #006667",
+"c@ c #005D61",
+"d@ c #00686B",
+"e@ c #00676B",
+"f@ c #00686A",
+"g@ c #2A5B5C",
+"h@ c #00686C",
+"i@ c #00696C",
+"j@ c #00676C",
+"k@ c #004548",
+"l@ c #00696B",
+"m@ c #00666B",
+"n@ c #006B6D",
+"o@ c #006A6D",
+"p@ c #006A6C",
+"q@ c #005458",
+"r@ c #00696A",
+"s@ c #00696D",
+"t@ c #006A6E",
+"u@ c #006C6D",
+"v@ c #006B6E",
+"w@ c #005252",
+"x@ c #006C6E",
+"y@ c #006B6F",
+"z@ c #006C6F",
+"A@ c #006E71",
+"B@ c #006D6F",
+"C@ c #006E70",
+"D@ c #006D70",
+"E@ c #006C70",
+"F@ c #006D6E",
+"G@ c #006E6F",
+"H@ c #007072",
+"I@ c #006F71",
+"J@ c #007071",
+"K@ c #006D71",
+"L@ c #006F72",
+"M@ c #007073",
+"N@ c #007173",
+"O@ c #006F73",
+"P@ c #007074",
+"Q@ c #006A6B",
+"R@ c #00575B",
+"S@ c #007172",
+"T@ c #007174",
+"U@ c #006266",
+"V@ c #007175",
+"W@ c #00656A",
+"X@ c #007274",
+"Y@ c #006E72",
+"Z@ c #006368",
+"`@ c #004F52",
+" # c #004E51",
+".# c #007376",
+"+# c #007275",
+"@# c #007276",
+"## c #007375",
+"$# c #007477",
+"%# c #007476",
+"&# c #005353",
+"*# c #007377",
+"=# c #007578",
+"-# c #005A5E",
+";# c #007577",
+"># c #005155",
+",# c #007679",
+"'# c #007678",
+")# c #00777A",
+"!# c #007779",
+"~# c #00787A",
+"{# c #00767A",
+"]# c #00787B",
+"^# c #007478",
+"/# c #00797C",
+"(# c #00797B",
+"_# c #007A7C",
+":# c #007576",
+"<# c #007879",
+"[# c #007A7B",
+"}# c #006263",
+"|# c #005C5C",
+"1# c #007A7D",
+"2# c #007B7E",
+"3# c #007B7D",
+"4# c #00797D",
+"5# c #007273",
+"6# c #007C7E",
+"7# c #007A7E",
+"8# c #007D7F",
+"9# c #007D80",
+"0# c #007D81",
+"a# c #007E80",
+"b# c #007B7C",
+"c# c #007F81",
+"d# c #007D7E",
+"e# c #007C7F",
+"f# c #007E7F",
+"g# c #007E83",
+"h# c #007F82",
+"i# c #007E81",
+"j# c #007E82",
+"k# c #007F83",
+"l# c #007D82",
+"m# c #007C80",
+"n# c #008084",
+"o# c #004C50",
+"p# c #008184",
+"q# c #008083",
+"r# c #008183",
+"s# c #008082",
+"t# c #008286",
+"u# c #008487",
+"v# c #008387",
+"w# c #008386",
+"x# c #008185",
+"y# c #006B6C",
+"z# c #008284",
+"A# c #008588",
+"B# c #008488",
+"C# c #008388",
+"D# c #008287",
+"E# c #008285",
+"F# c #008589",
+"G# c #00868B",
+"H# c #00858A",
+"I# c #00858B",
+"J# c #00868A",
+"K# c #00868C",
+"L# c #008489",
+"M# c #00797E",
+"N# c #004A4E",
+"O# c #00878B",
+"P# c #00878D",
+"Q# c #00878C",
+"R# c #00888D",
+"S# c #00888C",
+"T# c #00888B",
+"U# c #00898C",
+"V# c #00878E",
+"W# c #00898D",
+"X# c #008A8E",
+"Y# c #00898E",
+"Z# c #008A8F",
+"`# c #008A8D",
+" $ c #00898F",
+".$ c #008389",
+"+$ c #008990",
+"@$ c #00777B",
+"#$ c #008C91",
+"$$ c #008D91",
+"%$ c #008C90",
+"&$ c #008D92",
+"*$ c #008B90",
+"=$ c #006D72",
+"-$ c #008B91",
+";$ c #008186",
+">$ c #008E92",
+",$ c #008F93",
+"'$ c #008E93",
+")$ c #009094",
+"!$ c #008F92",
+"~$ c #008B8F",
+"{$ c #008F94",
+"]$ c #009195",
+"^$ c #009095",
+"/$ c #009194",
+"($ c #007F84",
+"_$ c #009093",
+":$ c #006869",
+"<$ c #009296",
+"[$ c #009297",
+"}$ c #009196",
+"|$ c #009397",
+"1$ c #009197",
+"2$ c #009096",
+"3$ c #009498",
+"4$ c #009598",
+"5$ c #009398",
+"6$ c #009497",
+"7$ c #008C8F",
+"8$ c #009295",
+"9$ c #009499",
+"0$ c #009599",
+"a$ c #00959A",
+"b$ c #00969A",
+"c$ c #009399",
+"d$ c #00969B",
+"e$ c #00959B",
+"f$ c #00949A",
+"g$ c #006061",
+"h$ c #009298",
+"i$ c #00989F",
+"j$ c #00979D",
+"k$ c #00989D",
+"l$ c #00989E",
+"m$ c #00979C",
+"n$ c #00979B",
+"o$ c #00979E",
+"p$ c #00999F",
+"q$ c #009A9F",
+"r$ c #0099A0",
+"s$ c #009AA0",
+"t$ c #008C92",
+"u$ c #009AA1",
+"v$ c #00999E",
+"w$ c #008689",
+"x$ c #009BA0",
+"y$ c #009CA0",
+"z$ c #009CA1",
+"A$ c #009BA1",
+"B$ c #00787C",
+"C$ c #009DA2",
+"D$ c #009EA3",
+"E$ c #009CA2",
+"F$ c #009DA3",
+"G$ c #009EA2",
+"H$ c #009CA3",
+"I$ c #009EA5",
+"J$ c #009FA5",
+"K$ c #009EA4",
+"L$ c #009DA4",
+"M$ c #00A0A6",
+"N$ c #009EA6",
+"O$ c #009FA6",
+"P$ c #008F95",
+"Q$ c #009BA2",
+"R$ c #00A1A7",
+"S$ c #00A0A7",
+"T$ c #007A7F",
+"U$ c #00959C",
+"V$ c #00A3A9",
+"W$ c #00A2A9",
+"X$ c #00A1A8",
+"Y$ c #00A2A8",
+"Z$ c #00A3AA",
+"`$ c #009B9F",
+" % c #00A4AA",
+".% c #00A5AA",
+"+% c #00A3A8",
+"@% c #008D90",
+"#% c #009FA4",
+"$% c #00A5AB",
+"%% c #00A4A9",
+"&% c #00787D",
+"*% c #008385",
+"=% c #00A4AB",
+"-% c #00A5AC",
+";% c #00A6AC",
+">% c #00A6AD",
+",% c #00A6AB",
+"'% c #00A7AC",
+")% c #00A8AE",
+"!% c #00A7AE",
+"~% c #00A8B0",
+"{% c #00A7AF",
+"]% c #00A9AF",
+"^% c #00A8AF",
+"/% c #007B80",
+"(% c #00A7AD",
+"_% c #00A6AE",
+":% c #00A9B0",
+"<% c #00777C",
+"[% c #00A9B1",
+"}% c #00A4AC",
+"|% c #007B7F",
+"1% c #00AAB1",
+"2% c #00AAB2",
+"3% c #00A9B2",
+"4% c #01A3AA",
+"5% c #01AAB2",
+"6% c #01ABB3",
+"7% c #01AAB1",
+"8% c #01949A",
+"9% c #01A5AC",
+"0% c #01A8B0",
+"a% c #018D91",
+"b% c #01A1A6",
+"c% c #019498",
+"d% c #01A6AC",
+"e% c #01ADB4",
+"f% c #01ACB3",
+"g% c #01ACB4",
+"h% c #02ACB5",
+"i% c #02ACB4",
+"j% c #01ACB5",
+"k% c #02A9B2",
+"l% c #019DA2",
+"m% c #018286",
+"n% c #019AA0",
+"o% c #02A8B0",
+"p% c #00ABB3",
+"q% c #01ADB5",
+"r% c #01A7AF",
+"s% c #02999F",
+"t% c #019399",
+"u% c #01A6AD",
+"v% c #02ADB4",
+"w% c #01A9B1",
+"x% c #019CA2",
+"y% c #018183",
+"z% c #02787A",
+"A% c #01989D",
+"B% c #02A8AF",
+"C% c #02AEB5",
+"D% c #02ADB5",
+"E% c #01AEB4",
+"F% c #02AEB4",
+"G% c #01ADB3",
+"H% c #02A9B1",
+"I% c #029BA1",
+"J% c #017B7F",
+"K% c #018387",
+"L% c #019FA5",
+"M% c #02AAB2",
+"N% c #03AEB6",
+"O% c #02A6AD",
+"P% c #01787B",
+"Q% c #03AEB4",
+"R% c #02ACB3",
+"S% c #02A8B1",
+"T% c #029A9F",
+"U% c #017A7C",
+"V% c #028084",
+"W% c #039EA4",
+"X% c #03AAB3",
+"Y% c #03AEB5",
+"Z% c #03AFB6",
+"`% c #03AFB5",
+" & c #03B0B6",
+".& c #03A8AF",
+"+& c #02989D",
+"@& c #028B8F",
+"#& c #03A3AB",
+"$& c #03ACB5",
+"%& c #02AFB6",
+"&& c #02AEB6",
+"*& c #03ADB4",
+"=& c #03A5AC",
+"-& c #028F93",
+";& c #039FA6",
+">& c #03ABB3",
+",& c #02AFB5",
+"'& c #02969A",
+")& c #048B8F",
+"!& c #03A3AA",
+"~& c #04ADB5",
+"{& c #04B1B7",
+"]& c #05B1B8",
+"^& c #04B0B7",
+"/& c #04B1B8",
+"(& c #05B0B7",
+"_& c #05A8AF",
+":& c #049399",
+"<& c #026C70",
+"[& c #039399",
+"}& c #03A7AF",
+"|& c #05AFB7",
+"1& c #04ADB6",
+"2& c #04A3AA",
+"3& c #048A8D",
+"4& c #038C90",
+"5& c #03A4AA",
+"6& c #04AEB5",
+"7& c #049297",
+"8& c #036B6D",
+"9& c #049296",
+"0& c #05B0B6",
+"a& c #05B2B9",
+"b& c #05A7AD",
+"c& c #048D92",
+"d& c #03787B",
+"e& c #039AA0",
+"f& c #05ABB3",
+"g& c #05AEB5",
+"h& c #049FA5",
+"i& c #048185",
+"j& c #036C6F",
+"k& c #049397",
+"l& c #05A9B0",
+"m& c #04AFB7",
+"n& c #05AFB6",
+"o& c #04A5AD",
+"p& c #038B8F",
+"q& c #037477",
+"r& c #04979E",
+"s& c #06B3B9",
+"t& c #06B3BA",
+"u& c #05A3AA",
+"v& c #04878B",
+"w& c #05A1A6",
+"x& c #05B2B8",
+"y& c #05ADB4",
+"z& c #049CA1",
+"A& c #03767A",
+"B& c #059BA0",
+"C& c #06B2B9",
+"D& c #04B2B9",
+"E& c #04A2A8",
+"F& c #048589",
+"G& c #047E82",
+"H& c #05A0A6",
+"I& c #06AFB7",
+"J& c #08B4BB",
+"K& c #07B4BB",
+"L& c #06B4BB",
+"M& c #06B4BA",
+"N& c #07B3BA",
+"O& c #06B0B7",
+"P& c #069FA5",
+"Q& c #047F81",
+"R& c #058B90",
+"S& c #05A6AD",
+"T& c #07B4BA",
+"U& c #07B2B9",
+"V& c #06ABB3",
+"W& c #05989C",
+"X& c #058084",
+"Y& c #059FA6",
+"Z& c #07AFB6",
+"`& c #059EA4",
+" * c #047D81",
+".* c #05878C",
+"+* c #08A6AC",
+"@* c #09B3B9",
+"#* c #08B5BC",
+"$* c #09B5BC",
+"%* c #09B4BB",
+"&* c #09AFB6",
+"** c #069CA1",
+"=* c #069399",
+"-* c #07ABB2",
+";* c #09B5BB",
+">* c #08B6BD",
+",* c #09B4BA",
+"'* c #07AAB1",
+")* c #049298",
+"!* c #058A8E",
+"~* c #07A5AC",
+"{* c #08B2B9",
+"]* c #08B4BC",
+"^* c #07AEB5",
+"/* c #079AA0",
+"(* c #079195",
+"_* c #09AAB2",
+":* c #0AB5BC",
+"<* c #0AB7BE",
+"[* c #09B6BD",
+"}* c #0AB6BD",
+"|* c #09ADB5",
+"1* c #07979C",
+"2* c #057578",
+"3* c #08AEB5",
+"4* c #0AB7BD",
+"5* c #08A9AF",
+"6* c #078D91",
+"7* c #069296",
+"8* c #09ACB3",
+"9* c #0AB6BC",
+"0* c #06969A",
+"a* c #057174",
+"b* c #08999F",
+"c* c #0AB0B6",
+"d* c #0AB8BF",
+"e* c #09B7BE",
+"f* c #0BB8BF",
+"g* c #0BB7BE",
+"h* c #09AAB1",
+"i* c #089196",
+"j* c #067F83",
+"k* c #09A1A8",
+"l* c #0AB2BA",
+"m* c #06868A",
+"n* c #067276",
+"o* c #099BA0",
+"p* c #0AB6BE",
+"q* c #0AB5BD",
+"r* c #078F93",
+"s* c #077C80",
+"t* c #0AA1A8",
+"u* c #0BB3BA",
+"v* c #0DBAC1",
+"w* c #0CB9C0",
+"x* c #0CBAC1",
+"y* c #0BB9C0",
+"z* c #0CB6BD",
+"A* c #0AA9AF",
+"B* c #098B90",
+"C* c #07888C",
+"D* c #0AA7AF",
+"E* c #0DB7BE",
+"F* c #0CBAC0",
+"G* c #0CB2BA",
+"H* c #077E82",
+"I* c #0BA2A8",
+"J* c #0AB4BB",
+"K* c #0BBAC1",
+"L* c #0CB9C1",
+"M* c #0BB6BE",
+"N* c #07888E",
+"O* c #08868B",
+"P* c #0BA6AE",
+"Q* c #0DBBC2",
+"R* c #0CBBC2",
+"S* c #0EBBC2",
+"T* c #0CBBC1",
+"U* c #0DBBC1",
+"V* c #0DBAC2",
+"W* c #0DB9C0",
+"X* c #0BB5BB",
+"Y* c #0BA4AB",
+"Z* c #088488",
+"`* c #0A9297",
+" = c #0BACB3",
+".= c #0EBAC1",
+"+= c #0A9CA2",
+"@= c #08888D",
+"#= c #0BA7AE",
+"$= c #0EB7BD",
+"%= c #0EBAC2",
+"&= c #0CB4BB",
+"*= c #0AA3AA",
+"== c #088085",
+"-= c #05585C",
+";= c #098F94",
+">= c #0DABB3",
+",= c #0CB8BF",
+"'= c #0EBCC2",
+")= c #0EBCC3",
+"!= c #0FBCC3",
+"~= c #0EB5BC",
+"{= c #0AA0A6",
+"]= c #0A999F",
+"^= c #0CB1B8",
+"/= c #0FBBC1",
+"(= c #0DB0B7",
+"_= c #0A959B",
+":= c #0A9196",
+"<= c #0DADB4",
+"[= c #0EB9C0",
+"}= c #0FBBC2",
+"|= c #0EBAC0",
+"1= c #0EB3BB",
+"2= c #0B9FA4",
+"3= c #097B80",
+"4= c #0A969C",
+"5= c #0DB1B7",
+"6= c #0FBDC3",
+"7= c #10BDC4",
+"8= c #0EBDC3",
+"9= c #0FBCC4",
+"0= c #10BCC2",
+"a= c #0EB4BA",
+"b= c #0B9BA0",
+"c= c #087C80",
+"d= c #0CA3A9",
+"e= c #0FB7BD",
+"f= c #0FBEC3",
+"g= c #0FBDC2",
+"h= c #0FBDC4",
+"i= c #10BAC1",
+"j= c #0DACB3",
+"k= c #0A9095",
+"l= c #0B999F",
+"m= c #0EB2BA",
+"n= c #0EBDC2",
+"o= c #0FBCC2",
+"p= c #10BDC3",
+"q= c #0EB2B9",
+"r= c #0B989F",
+"s= c #0C959A",
+"t= c #09787B",
+"u= c #0C9FA5",
+"v= c #10B6BE",
+"w= c #11BEC4",
+"x= c #10BEC4",
+"y= c #12BFC6",
+"z= c #11BEC5",
+"A= c #11BFC5",
+"B= c #10BFC4",
+"C= c #12BEC5",
+"D= c #11BFC6",
+"E= c #11BDC3",
+"F= c #0DB0B8",
+"G= c #0B9498",
+"H= c #0A868A",
+"I= c #0CA7AE",
+"J= c #10BBC0",
+"K= c #10BFC5",
+"L= c #11BDC5",
+"M= c #12BFC5",
+"N= c #10B9C0",
+"O= c #0DAAB0",
+"P= c #0A898E",
+"Q= c #0A7B7F",
+"R= c #0CA2A8",
+"S= c #10B7BE",
+"T= c #10BEC5",
+"U= c #0EB0B7",
+"V= c #0A9197",
+"W= c #0DA2A9",
+"X= c #11B0B8",
+"Y= c #0D9DA3",
+"Z= c #0B8487",
+"`= c #0EA7AF",
+" - c #11BBC1",
+".- c #13C1C7",
+"+- c #12C0C6",
+"@- c #14C1C7",
+"#- c #12C1C7",
+"$- c #13C0C6",
+"%- c #11BCC2",
+"&- c #0EACB3",
+"*- c #0B8D91",
+"=- c #0A8E94",
+"-- c #10AFB6",
+";- c #12C1C6",
+">- c #11B9C0",
+",- c #0EA7AD",
+"'- c #0A8689",
+")- c #10A9B0",
+"!- c #12BCC2",
+"~- c #13C0C5",
+"{- c #11C0C6",
+"]- c #12C0C5",
+"^- c #12BDC4",
+"/- c #0B8C90",
+"(- c #0FA8B0",
+"_- c #12BBC2",
+":- c #11B3BB",
+"<- c #0D969B",
+"[- c #0C8D91",
+"}- c #10AEB5",
+"|- c #13BEC4",
+"1- c #14C2C8",
+"2- c #13BCC3",
+"3- c #10A9B1",
+"4- c #0E999F",
+"5- c #10B3BA",
+"6- c #13BFC5",
+"7- c #13C2C8",
+"8- c #15C2C8",
+"9- c #15C1C7",
+"0- c #12B8BE",
+"a- c #0EA0A6",
+"b- c #0D8E93",
+"c- c #11AEB5",
+"d- c #13BDC4",
+"e- c #10A9AF",
+"f- c #104547",
+"g- c #0A8085",
+"h- c #11AFB5",
+"i- c #14BEC5",
+"j- c #11AFB6",
+"k- c #0D8F94",
+"l- c #0D959B",
+"m- c #11B3BA",
+"n- c #14BFC6",
+"o- c #15C3C9",
+"p- c #16C3C9",
+"q- c #16C2C8",
+"r- c #13B9C0",
+"s- c #10A5AB",
+"t- c #0A787C",
+"u- c #10A2A8",
+"v- c #13B9BF",
+"w- c #17C3C9",
+"x- c #13B6BD",
+"y- c #0F9BA1",
+"z- c #0D989E",
+"A- c #13B4BC",
+"B- c #10A3A9",
+"C- c #0E8B90",
+"D- c #14B4BB",
+"E- c #18C3C9",
+"F- c #17C4CA",
+"G- c #16BFC6",
+"H- c #11ABB2",
+"I- c #10A0A6",
+"J- c #16BAC1",
+"K- c #17C2C8",
+"L- c #18C5CA",
+"M- c #18C5CB",
+"N- c #16C1C7",
+"O- c #16B9BF",
+"P- c #109FA5",
+"Q- c #0C8286",
+"R- c #12A9AF",
+"S- c #15BDC3",
+"T- c #13B3B9",
+"U- c #0F949A",
+"V- c #10A1A7",
+"W- c #15BAC2",
+"X- c #15B8BF",
+"Y- c #0F9DA3",
+"Z- c #0F9297",
+"`- c #15B7BD",
+" ; c #19C6CC",
+".; c #19C5CA",
+"+; c #17BCC3",
+"@; c #12A6AD",
+"#; c #0C8185",
+"$; c #12A8AF",
+"%; c #17BDC4",
+"&; c #19C5CB",
+"*; c #19C6CD",
+"=; c #19C6CB",
+"-; c #18C5CC",
+";; c #17B6BD",
+">; c #10999F",
+",; c #0F8D92",
+"'; c #15B0B8",
+"); c #18C1C8",
+"!; c #1AC7CC",
+"~; c #18C6CB",
+"{; c #17C0C6",
+"]; c #14AFB6",
+"^; c #0D8388",
+"/; c #14AAAF",
+"(; c #17BFC5",
+"_; c #1AC6CC",
+":; c #19C2C9",
+"<; c #15B4BA",
+"[; c #11979C",
+"}; c #11989D",
+"|; c #17BAC0",
+"1; c #1AC7CD",
+"2; c #19C7CC",
+"3; c #18BBC2",
+"4; c #139FA6",
+"5; c #0E8A90",
+"6; c #16AFB5",
+"7; c #19C1C8",
+"8; c #1BC8CD",
+"9; c #1AC2C9",
+"0; c #15B2B8",
+"a; c #109196",
+"b; c #16B6BD",
+"c; c #1AC5CB",
+"d; c #1AC7CE",
+"e; c #18BFC5",
+"f; c #14AAB1",
+"g; c #0F8C92",
+"h; c #15B0B7",
+"i; c #19C2C8",
+"j; c #1BC7CD",
+"k; c #1AC7CB",
+"l; c #1BC8CE",
+"m; c #16B1B9",
+"n; c #108F94",
+"o; c #139FA4",
+"p; c #1ABFC5",
+"q; c #1CCACF",
+"r; c #1CC9CF",
+"s; c #1CC9CE",
+"t; c #1BC6CB",
+"u; c #19B8BF",
+"v; c #1299A0",
+"w; c #12949A",
+"x; c #18B5BC",
+"y; c #1AC4C9",
+"z; c #1CC8CE",
+"A; c #1BC8CF",
+"B; c #1CC9CD",
+"C; c #1BC7CE",
+"D; c #1AC2C8",
+"E; c #17B0B6",
+"F; c #13A1A7",
+"G; c #19BCC2",
+"H; c #1CC8CD",
+"I; c #1BC9CE",
+"J; c #1CC7CD",
+"K; c #1ABEC4",
+"L; c #14A5AB",
+"M; c #11979D",
+"N; c #18B7BD",
+"O; c #1AC4CA",
+"P; c #1CC8CF",
+"Q; c #1AC1C8",
+"R; c #16AEB4",
+"S; c #15A5AB",
+"T; c #1DC3C9",
+"U; c #1DCBCF",
+"V; c #1ECBD0",
+"W; c #1DCACF",
+"X; c #1CC6CC",
+"Y; c #19B5BB",
+"Z; c #129398",
+"`; c #159EA4",
+" > c #1ABBC1",
+".> c #1DC8CD",
+"+> c #1DCAD0",
+"@> c #1DCBD0",
+"#> c #1ECCD0",
+"$> c #1CC2C7",
+"%> c #17AAB0",
+"&> c #0F8084",
+"*> c #16A9AF",
+"=> c #1CC2C6",
+"-> c #1DC9CE",
+";> c #1ABCC2",
+">> c #14A0A5",
+",> c #14A1A7",
+"'> c #1ABDC3",
+")> c #1DC7CE",
+"!> c #1DCBD1",
+"~> c #1BC1C7",
+"{> c #17ABB1",
+"]> c #1DC6CC",
+"^> c #20CED2",
+"/> c #1FCCD1",
+"(> c #1FCDD1",
+"_> c #1ECCD1",
+":> c #1EC6CB",
+"<> c #1AB2B8",
+"[> c #17A7AD",
+"}> c #1DC1C7",
+"|> c #20CCD1",
+"1> c #1FCDD2",
+"2> c #20CDD2",
+"3> c #1FCED2",
+"4> c #1FCBD0",
+"5> c #1DC0C7",
+"6> c #18A5AB",
+"7> c #128B90",
+"8> c #19B1B8",
+"9> c #1DC5CA",
+"0> c #1EC8CD",
+"a> c #1BBAC0",
+"b> c #15999D",
+"c> c #107F83",
+"d> c #18A9AF",
+"e> c #1CC0C7",
+"f> c #1FCCD2",
+"g> c #1CBEC5",
+"h> c #12A0A5",
+"i> c #016E73",
+"j> c #1AB1B8",
+"k> c #1FCACF",
+"l> c #20CDD0",
+"m> c #1EC3C9",
+"n> c #19ABB2",
+"o> c #12888B",
+"p> c #1AB0B6",
+"q> c #1EC5CB",
+"r> c #20CDD1",
+"s> c #20CBCF",
+"t> c #1CBBC1",
+"u> c #159CA1",
+"v> c #15959B",
+"w> c #1CB8BE",
+"x> c #1FC7CC",
+"y> c #1FC8CD",
+"z> c #1BB5BC",
+"A> c #138F94",
+"B> c #12898F",
+"C> c #19B0B7",
+"D> c #20CACF",
+"E> c #1DBCC2",
+"F> c #12888C",
+"G> c #1CB8BD",
+"H> c #20CCD0",
+"I> c #20CFD3",
+"J> c #21CFD3",
+"K> c #20CED3",
+"L> c #1EC1C6",
+"M> c #18A4A9",
+"N> c #149197",
+"O> c #1BB7BD",
+"P> c #20C9CF",
+"Q> c #1FC9CE",
+"R> c #149499",
+"S> c #17A0A5",
+"T> c #1CBDC3",
+"U> c #20CAD0",
+"V> c #21CFD2",
+"W> c #1FC6CB",
+"X> c #1BAFB6",
+"Y> c #1CB7BD",
+"Z> c #1FCED3",
+"`> c #1FC7CD",
+" , c #1CB6BD",
+"., c #0F8D93",
+"+, c #158F94",
+"@, c #1EBCC3",
+"#, c #22CFD3",
+"$, c #21D1D4",
+"%, c #21D0D4",
+"&, c #21D0D5",
+"*, c #21D1D5",
+"=, c #20CFD4",
+"-, c #22D1D5",
+";, c #22D0D4",
+">, c #21CDD1",
+",, c #1EBFC4",
+"', c #179DA2",
+"), c #189EA2",
+"!, c #1FBEC4",
+"~, c #22D1D4",
+"{, c #20C8CD",
+"], c #1CB4B9",
+"^, c #1AA8AE",
+"/, c #1FC4C9",
+"(, c #21CED2",
+"_, c #1FC5CA",
+":, c #19A9AF",
+"<, c #189FA4",
+"[, c #21CDD2",
+"}, c #22D0D5",
+"|, c #21CFD4",
+"1, c #1BB1B7",
+"2, c #004B4E",
+"3, c #17979D",
+"4, c #20C1C7",
+"5, c #23D2D6",
+"6, c #24D3D5",
+"7, c #23D2D5",
+"8, c #24D3D7",
+"9, c #24D2D6",
+"0, c #23CED2",
+"a, c #1FBAC1",
+"b, c #17969A",
+"c, c #1BA8AD",
+"d, c #21C4C9",
+"e, c #24D3D6",
+"f, c #23D0D4",
+"g, c #21C8CC",
+"h, c #1DAEB5",
+"i, c #15888C",
+"j, c #1DB1B7",
+"k, c #22C9CF",
+"l, c #23D1D5",
+"m, c #23D3D6",
+"n, c #23D0D3",
+"o, c #19A3A8",
+"p, c #1BA9AF",
+"q, c #22C6CB",
+"r, c #23D0D5",
+"s, c #23D3D5",
+"t, c #22C7CC",
+"u, c #13A7AD",
+"v, c #005256",
+"w, c #189EA3",
+"x, c #22C5CA",
+"y, c #25D3D7",
+"z, c #26D4D7",
+"A, c #26D4D8",
+"B, c #25D2D6",
+"C, c #23CCD0",
+"D, c #1EB6BC",
+"E, c #148588",
+"F, c #1DAFB4",
+"G, c #22C8CD",
+"H, c #25D2D5",
+"I, c #26D3D7",
+"J, c #25D3D6",
+"K, c #26D4D6",
+"L, c #25D4D7",
+"M, c #21C6CA",
+"N, c #1BA8AE",
+"O, c #179297",
+"P, c #20B9BE",
+"Q, c #23CDD0",
+"R, c #24CFD3",
+"S, c #20BEC3",
+"T, c #189AA0",
+"U, c #14868B",
+"V, c #1DB2B7",
+"W, c #24D1D5",
+"X, c #1FC2C8",
+"Y, c #21A7AD",
+"Z, c #1CA6AB",
+"`, c #23C9CD",
+" ' c #27D5D8",
+".' c #27D4D8",
+"+' c #26D5D8",
+"@' c #23CBCF",
+"#' c #1EAFB4",
+"$' c #178E93",
+"%' c #1FB7BC",
+"&' c #24CCD0",
+"*' c #27D4D7",
+"=' c #27D5D7",
+"-' c #25D1D5",
+";' c #21C2C7",
+">' c #1BA2A6",
+",' c #1A9DA2",
+"'' c #21BFC4",
+")' c #25D0D5",
+"!' c #25CED1",
+"~' c #20B9BF",
+"{' c #179196",
+"]' c #20B8BD",
+"^' c #24CDD1",
+"/' c #25D0D4",
+"(' c #19BCC1",
+"_' c #10979C",
+":' c #1EACB2",
+"<' c #27CED2",
+"[' c #29D8DA",
+"}' c #29D7DA",
+"|' c #28D7DA",
+"1' c #29D8DB",
+"2' c #29D6D9",
+"3' c #28D4D7",
+"4' c #24C6CB",
+"5' c #1DA9AE",
+"6' c #1A999E",
+"7' c #22BEC3",
+"8' c #27D2D5",
+"9' c #28D6D9",
+"0' c #23BEC4",
+"a' c #1A999D",
+"b' c #1DA7AC",
+"c' c #25C7CA",
+"d' c #28D4D8",
+"e' c #29D7D9",
+"f' c #26CDD0",
+"g' c #1FB5B9",
+"h' c #1B9DA2",
+"i' c #21BFC5",
+"j' c #27D2D6",
+"k' c #28D1D4",
+"l' c #1AB9BE",
+"m' c #026D72",
+"n' c #20B4B9",
+"o' c #28D4D6",
+"p' c #23C3C8",
+"q' c #1CA1A6",
+"r' c #1DA4A8",
+"s' c #25C5CA",
+"t' c #29D4D8",
+"u' c #2AD9DB",
+"v' c #28D8DA",
+"w' c #2AD8DB",
+"x' c #2AD8DA",
+"y' c #26CFD3",
+"z' c #21B7BD",
+"A' c #1FB0B5",
+"B' c #27CCD0",
+"C' c #28D8DB",
+"D' c #28D6D8",
+"E' c #26CACF",
+"F' c #1EADB3",
+"G' c #1EA6AA",
+"H' c #26C6CB",
+"I' c #29D5D8",
+"J' c #27CFD3",
+"K' c #1CAFB4",
+"L' c #168488",
+"M' c #23BABF",
+"N' c #2AD5D8",
+"O' c #2ADADD",
+"P' c #2AD9DC",
+"Q' c #2ADADC",
+"R' c #2ADADB",
+"S' c #2ADBDC",
+"T' c #29D9DA",
+"U' c #29D2D6",
+"V' c #23BFC4",
+"W' c #1B999E",
+"X' c #1FAEB2",
+"Y' c #26CBCF",
+"Z' c #2AD7DB",
+"`' c #29D9DB",
+" ) c #28CDD1",
+".) c #20B1B6",
+"+) c #198F95",
+"@) c #22B9BF",
+"#) c #2AD9DD",
+"$) c #2BDADC",
+"%) c #2AD6D9",
+"&) c #1EA5AB",
+"*) c #20AFB5",
+"=) c #29D8DC",
+"-) c #2ADBDD",
+";) c #2BD8DA",
+">) c #26C8CD",
+",) c #178A8F",
+"') c #25C0C5",
+")) c #2CD9DC",
+"!) c #2CDDDF",
+"~) c #2BDBDD",
+"{) c #2CDBDD",
+"]) c #2BDCDD",
+"^) c #2DDCDE",
+"/) c #2CDCDD",
+"() c #2CDBDE",
+"_) c #2CDDDE",
+":) c #29D2D5",
+"<) c #24BAC0",
+"[) c #188B90",
+"}) c #23B7BD",
+"|) c #2AD0D4",
+"1) c #2CDCDE",
+"2) c #2BDBDC",
+"3) c #2DDCDD",
+"4) c #2CDBDC",
+"5) c #2BD8DB",
+"6) c #28CACF",
+"7) c #21ADB1",
+"8) c #1C9AA0",
+"9) c #26C1C6",
+"0) c #2DDDDD",
+"a) c #2BDADD",
+"b) c #2BD7D9",
+"c) c #26C3C8",
+"d) c #1D9FA4",
+"e) c #198D92",
+"f) c #23B9BD",
+"g) c #2CDDDD",
+"h) c #2BD7D8",
+"i) c #1A9397",
+"j) c #27C6CA",
+"k) c #2EDBDD",
+"l) c #2DDEDF",
+"m) c #2DDDDF",
+"n) c #2EDDDF",
+"o) c #2DDEDE",
+"p) c #2EDEDF",
+"q) c #2DDDDE",
+"r) c #2EDEDE",
+"s) c #2BD1D4",
+"t) c #22B5BA",
+"u) c #1C969B",
+"v) c #27C0C5",
+"w) c #2CD6D8",
+"x) c #2DDBDD",
+"y) c #28C8CC",
+"z) c #1FA4AA",
+"A) c #1FA5AA",
+"B) c #2CD9DB",
+"C) c #2AD4D7",
+"D) c #26C0C4",
+"E) c #1D999D",
+"F) c #26C0C5",
+"G) c #2BD6D9",
+"H) c #2EDDDE",
+"I) c #07575A",
+"J) c #1E9DA0",
+"K) c #29CACE",
+"L) c #2EE0E1",
+"M) c #2EDFE0",
+"N) c #2FDFE0",
+"O) c #2EDEE0",
+"P) c #2EDCDE",
+"Q) c #2ACED2",
+"R) c #22AEB2",
+"S) c #1FA2A6",
+"T) c #29C6CA",
+"U) c #2DD9DC",
+"V) c #2EDFDF",
+"W) c #2CD8DA",
+"X) c #27C3C8",
+"Y) c #1D9CA1",
+"Z) c #23AFB3",
+"`) c #2ACED1",
+" ! c #2FDFDF",
+".! c #2CD4D7",
+"+! c #25B9BD",
+"@! c #1FA3A8",
+"#! c #29C9CC",
+"$! c #2DDADC",
+"%! c #085E62",
+"&! c #21A3A9",
+"*! c #2CCFD2",
+"=! c #2FE0E1",
+"-! c #30E1E1",
+";! c #30E0E1",
+">! c #2AC9CC",
+",! c #22A5AA",
+"'! c #22ABB1",
+")! c #2BCCD0",
+"!! c #2DDBDC",
+"~! c #2DD6D9",
+"{! c #27BEC4",
+"]! c #24B8BD",
+"^! c #2CD3D7",
+"/! c #2FDEE0",
+"(! c #2FDEDF",
+"_! c #2CD1D4",
+":! c #23B2B7",
+"<! c #23AEB2",
+"[! c #0A666B",
+"}! c #23ABB1",
+"|! c #2DD3D5",
+"1! c #2EDADD",
+"2! c #2AC3C8",
+"3! c #25B5BA",
+"4! c #2DD3D4",
+"5! c #30DFE0",
+"6! c #2DD4D6",
+"7! c #26B7BC",
+"8! c #1C959A",
+"9! c #28C1C6",
+"0! c #2ED9DB",
+"a! c #30E1E2",
+"b! c #2FDDDF",
+"c! c #23AAB0",
+"d! c #26B8BD",
+"e! c #0C6E72",
+"f! c #25B4B9",
+"g! c #2ED7D8",
+"h! c #31E3E3",
+"i! c #32E2E3",
+"j! c #31E1E2",
+"k! c #32E2E2",
+"l! c #31E2E2",
+"m! c #32E3E3",
+"n! c #2ED8DA",
+"o! c #29BFC3",
+"p! c #1E9498",
+"q! c #28BFC2",
+"r! c #2FD8DA",
+"s! c #32E3E2",
+"t! c #31E1E1",
+"u! c #31DFE1",
+"v! c #2ED2D4",
+"w! c #24AEB4",
+"x! c #22A3A7",
+"y! c #2BC8CD",
+"z! c #2FDDDE",
+"A! c #31E2E1",
+"B! c #32E1E2",
+"C! c #30DDDE",
+"D! c #2BC8CA",
+"E! c #21A1A6",
+"F! c #1E969A",
+"G! c #29C0C3",
+"H! c #2FD7DA",
+"I! c #32E1E1",
+"J! c #30E2E2",
+"K! c #32E1E3",
+"L! c #12787C",
+"M! c #29BCC0",
+"N! c #31DDDD",
+"O! c #33E5E4",
+"P! c #33E3E3",
+"Q! c #33E4E3",
+"R! c #33E4E4",
+"S! c #2FD6D8",
+"T! c #28B7BC",
+"U! c #219EA2",
+"V! c #2CC7CB",
+"W! c #31DDDE",
+"X! c #34E4E3",
+"Y! c #32E4E3",
+"Z! c #32E0E0",
+"`! c #2CCCCF",
+" ~ c #24A7AC",
+".~ c #24ADB2",
+"+~ c #2ED1D3",
+"@~ c #32E4E4",
+"#~ c #33E3E4",
+"$~ c #33E2E3",
+"%~ c #34E4E4",
+"&~ c #30DBDC",
+"*~ c #2BC2C6",
+"=~ c #22A1A6",
+"-~ c #2CC8CB",
+";~ c #1C868A",
+">~ c #2BC3C6",
+",~ c #34E0E0",
+"'~ c #34E5E5",
+")~ c #34E5E4",
+"!~ c #34E6E5",
+"~~ c #34E6E4",
+"{~ c #35E6E5",
+"]~ c #34E6E6",
+"^~ c #33E2E2",
+"/~ c #2FD4D6",
+"(~ c #26B1B6",
+"_~ c #24A9AE",
+":~ c #2ED0D1",
+"<~ c #34E2E2",
+"[~ c #35E6E6",
+"}~ c #35E5E4",
+"|~ c #32DEDF",
+"1~ c #2DC8CB",
+"2~ c #31D8D9",
+"3~ c #34E5E6",
+"4~ c #35E5E5",
+"5~ c #35E4E3",
+"6~ c #31DADB",
+"7~ c #2ABFC2",
+"8~ c #26ACB0",
+"9~ c #2ECFD2",
+"0~ c #1F8F93",
+"a~ c #34E3E3",
+"b~ c #36E8E7",
+"c~ c #37E8E7",
+"d~ c #37E7E6",
+"e~ c #36E7E6",
+"f~ c #37E7E7",
+"g~ c #36E6E6",
+"h~ c #35E2E3",
+"i~ c #2FD0D2",
+"j~ c #25A9AD",
+"k~ c #28B4B8",
+"l~ c #31D7D9",
+"m~ c #37E5E5",
+"n~ c #36E8E6",
+"o~ c #36E7E5",
+"p~ c #36E7E7",
+"q~ c #33DEDE",
+"r~ c #2CC3C7",
+"s~ c #209397",
+"t~ c #2CC1C4",
+"u~ c #32DDDD",
+"v~ c #35E7E5",
+"w~ c #35E7E6",
+"x~ c #37E8E6",
+"y~ c #36E6E5",
+"z~ c #31D9DB",
+"A~ c #29B7BB",
+"B~ c #29B6BB",
+"C~ c #32D7D9",
+"D~ c #36E5E4",
+"E~ c #21979C",
+"F~ c #2FCDD0",
+"G~ c #36E5E6",
+"H~ c #38E9E8",
+"I~ c #38E8E8",
+"J~ c #38E8E7",
+"K~ c #38E7E7",
+"L~ c #35E1E2",
+"M~ c #2ECBCD",
+"N~ c #2BBFC2",
+"O~ c #33DCDE",
+"P~ c #37E6E6",
+"Q~ c #37E8E8",
+"R~ c #33DBDB",
+"S~ c #2BBCC0",
+"T~ c #239DA2",
+"U~ c #2FC9CC",
+"V~ c #31D4D6",
+"W~ c #27AEB3",
+"X~ c #34DDDE",
+"Y~ c #186467",
+"Z~ c #239EA2",
+"`~ c #32D2D5",
+" { c #39E9E8",
+".{ c #39E8E8",
+"+{ c #35E0E0",
+"@{ c #2EC5C7",
+"#{ c #239B9E",
+"${ c #2EC7CA",
+"%{ c #35E1E1",
+"&{ c #32D7D8",
+"*{ c #2AB5B8",
+"={ c #25A8AC",
+"-{ c #32D0D2",
+";{ c #37E4E4",
+">{ c #2FCFD0",
+",{ c #239CA0",
+"'{ c #2EC9CC",
+"){ c #36E1E1",
+"!{ c #3AEAE8",
+"~{ c #39E9E7",
+"{{ c #239EA1",
+"]{ c #32D2D3",
+"^{ c #39E7E7",
+"/{ c #3AEAE9",
+"({ c #3AE8E7",
+"_{ c #35DDDD",
+":{ c #2CBDC0",
+"<{ c #26A6AA",
+"[{ c #31D0D1",
+"}{ c #37E4E3",
+"|{ c #3AE9E8",
+"1{ c #38E5E4",
+"2{ c #31D3D4",
+"3{ c #27ADB0",
+"4{ c #2AB4B9",
+"5{ c #33D8D9",
+"6{ c #36E2E1",
+"7{ c #2FC8CC",
+"8{ c #27A8AC",
+"9{ c #31D2D4",
+"0{ c #37E5E4",
+"a{ c #0A8084",
+"b{ c #30C7CA",
+"c{ c #38E3E3",
+"d{ c #3BEBE9",
+"e{ c #3BECEA",
+"f{ c #3CECEA",
+"g{ c #34D8D9",
+"h{ c #2AB3B6",
+"i{ c #2AB2B5",
+"j{ c #33D8D8",
+"k{ c #39E7E6",
+"l{ c #37E3E3",
+"m{ c #31CDCF",
+"n{ c #2CBFC2",
+"o{ c #37E0E0",
+"p{ c #3BEAE9",
+"q{ c #36DFDF",
+"r{ c #2DC1C4",
+"s{ c #2AB4B8",
+"t{ c #35D9DA",
+"u{ c #3BEAE8",
+"v{ c #149BA0",
+"w{ c #36D7D7",
+"x{ c #3CE9E7",
+"y{ c #3DEDEB",
+"z{ c #3DECEB",
+"A{ c #3DEDEC",
+"B{ c #3EEEEB",
+"C{ c #3EEDEB",
+"D{ c #3BE9E8",
+"E{ c #34D4D5",
+"F{ c #28ACB0",
+"G{ c #2DBDC0",
+"H{ c #37DEDE",
+"I{ c #3DEAE9",
+"J{ c #3DEEEB",
+"K{ c #3EEDEC",
+"L{ c #39E5E3",
+"M{ c #31C9CA",
+"N{ c #249B9E",
+"O{ c #31CBCD",
+"P{ c #3AE5E4",
+"Q{ c #3DEDEA",
+"R{ c #3CEBE9",
+"S{ c #37DCDC",
+"T{ c #2CBBBD",
+"U{ c #2FBFC2",
+"V{ c #37DFDF",
+"W{ c #14A7AA",
+"X{ c #39DDDC",
+"Y{ c #3DEBEA",
+"Z{ c #3FEEEC",
+"`{ c #3EEEED",
+" ] c #3EEFED",
+".] c #3FEDEC",
+"+] c #3FEFED",
+"@] c #3EEEEC",
+"#] c #3EEDED",
+"$] c #3CE7E6",
+"%] c #33CFD0",
+"&] c #249599",
+"*] c #31C6C8",
+"=] c #3AE4E2",
+"-] c #3FEEED",
+";] c #3FEDED",
+">] c #38E1E0",
+",] c #2FC2C3",
+"'] c #28A6AA",
+")] c #34D2D4",
+"!] c #3DEAE8",
+"~] c #36DADA",
+"{] c #2CB3B6",
+"]] c #23999D",
+"^] c #30C9CA",
+"/] c #3AE4E3",
+"(] c #23B9BB",
+"_] c #39E1E1",
+":] c #3FEEEB",
+"<] c #40EFED",
+"[] c #40F0ED",
+"}] c #40EEED",
+"|] c #3FEFEC",
+"1] c #3BE5E3",
+"2] c #32C9CB",
+"3] c #26A1A5",
+"4] c #33D0D0",
+"5] c #3DE8E7",
+"6] c #40EFEE",
+"7] c #3FF0ED",
+"8] c #40F0EE",
+"9] c #38DDDD",
+"0] c #2CB7BB",
+"a] c #2BB2B6",
+"b] c #37DADA",
+"c] c #3EEBE9",
+"d] c #3DEAE7",
+"e] c #35D5D6",
+"f] c #28A4A7",
+"g] c #35D1D3",
+"h] c #3DE9E7",
+"i] c #0C868C",
+"j] c #33CACB",
+"k] c #3DE7E4",
+"l] c #40EFEC",
+"m] c #41F1ED",
+"n] c #41F0ED",
+"o] c #3AE2E1",
+"p] c #30C1C4",
+"q] c #2BADB0",
+"r] c #37D8D8",
+"s] c #3FECEA",
+"t] c #41F1EE",
+"u] c #3EECEA",
+"v] c #2BAEB3",
+"w] c #2FBDC0",
+"x] c #3AE0E0",
+"y] c #40EDEA",
+"z] c #40F1ED",
+"A] c #3DE8E6",
+"B] c #34CED0",
+"C] c #2BB0B4",
+"D] c #38D9D9",
+"E] c #3FEBE9",
+"F] c #40F0EC",
+"G] c #1E9DA2",
+"H] c #36D2D3",
+"I] c #3FEAE8",
+"J] c #42F0EE",
+"K] c #42F1EE",
+"L] c #43F2EF",
+"M] c #43F1EE",
+"N] c #41EEEC",
+"O] c #3ADEDE",
+"P] c #2FB9BC",
+"Q] c #2FBABD",
+"R] c #3AE0DF",
+"S] c #42F1ED",
+"T] c #3FEBE8",
+"U] c #35D2D2",
+"V] c #32C7C9",
+"W] c #3DE5E4",
+"X] c #41EFEC",
+"Y] c #32C8CA",
+"Z] c #2EBABE",
+"`] c #3BE0DF",
+" ^ c #40EEEC",
+".^ c #25ACAF",
+"+^ c #39DBDA",
+"@^ c #41EEEA",
+"#^ c #40EDEB",
+"$^ c #39D9DA",
+"%^ c #2BAEB1",
+"&^ c #31C4C6",
+"*^ c #3EE5E3",
+"=^ c #42F0ED",
+"-^ c #42F2EE",
+";^ c #43F2EE",
+">^ c #3EE8E6",
+",^ c #28A1A6",
+"'^ c #35CFD1",
+")^ c #3FE9E7",
+"!^ c #43F1EF",
+"~^ c #42F2EF",
+"{^ c #41EFED",
+"]^ c #3CE3E0",
+"^^ c #30BDC0",
+"/^ c #32C6C8",
+"(^ c #3EE7E4",
+"_^ c #30BCBF",
+":^ c #3DE3E1",
+"<^ c #44F1EE",
+"[^ c #45F4F0",
+"}^ c #43F3EF",
+"|^ c #44F4F0",
+"1^ c #44F3F0",
+"2^ c #43F2F0",
+"3^ c #37D4D4",
+"4^ c #279DA1",
+"5^ c #35CECF",
+"6^ c #40EBE7",
+"7^ c #43F3F0",
+"8^ c #3DE5E2",
+"9^ c #32C3C5",
+"0^ c #2BADB1",
+"a^ c #3AD9D9",
+"b^ c #42EFEC",
+"c^ c #44F3EF",
+"d^ c #3ADDDC",
+"e^ c #2EB4B7",
+"f^ c #27A0A4",
+"g^ c #36D2D1",
+"h^ c #41ECE9",
+"i^ c #44F2EF",
+"j^ c #45F3F0",
+"k^ c #34C8CA",
+"l^ c #40E8E6",
+"m^ c #46F5F0",
+"n^ c #47F6F1",
+"o^ c #46F5F1",
+"p^ c #47F5F1",
+"q^ c #45F5F0",
+"r^ c #45F5F1",
+"s^ c #45F4F1",
+"t^ c #46F4F1",
+"u^ c #41EBE8",
+"v^ c #36CCCD",
+"w^ c #2BAAAD",
+"x^ c #3BD9D8",
+"y^ c #44EFEC",
+"z^ c #3EE3E1",
+"A^ c #30BBBD",
+"B^ c #30BABD",
+"C^ c #3EE3E2",
+"D^ c #46F3F0",
+"E^ c #47F5F0",
+"F^ c #46F4F0",
+"G^ c #39D8D8",
+"H^ c #2CADB0",
+"I^ c #3AD9DA",
+"J^ c #43F0EC",
+"K^ c #2AA1A4",
+"L^ c #38D1D2",
+"M^ c #42EDE9",
+"N^ c #47F5F2",
+"O^ c #47F6F2",
+"P^ c #48F5F1",
+"Q^ c #40E7E5",
+"R^ c #34C4C6",
+"S^ c #30B6B9",
+"T^ c #3DDFDD",
+"U^ c #44F1ED",
+"V^ c #48F5F2",
+"W^ c #45F2EE",
+"X^ c #3CDEDC",
+"Y^ c #2EB1B5",
+"Z^ c #34C4C7",
+"`^ c #40E8E5",
+" / c #48F6F2",
+"./ c #48F6F1",
+"+/ c #43EDEA",
+"@/ c #30B8BC",
+"#/ c #3EE1E0",
+"$/ c #44F2EE",
+"%/ c #46F5F2",
+"&/ c #3BDBDA",
+"*/ c #45F1ED",
+"=/ c #49F7F2",
+"-/ c #4AF7F2",
+";/ c #49F7F1",
+">/ c #49F6F2",
+",/ c #46F3EF",
+"'/ c #3FE2E0",
+")/ c #31BBBD",
+"!/ c #33C1C3",
+"~/ c #3FE5E2",
+"{/ c #47F3EF",
+"]/ c #45F2EC",
+"^/ c #3AD6D7",
+"// c #38CECF",
+"(/ c #43EDE9",
+"_/ c #49F6F1",
+":/ c #49F7F3",
+"</ c #48F7F2",
+"[/ c #47F4F1",
+"}/ c #42EAE6",
+"|/ c #36C9CA",
+"1/ c #33C2C4",
+"2/ c #40E7E3",
+"3/ c #47F3F0",
+"4/ c #32B9BD",
+"5/ c #40E3E1",
+"6/ c #47F4EF",
+"7/ c #4CF8F3",
+"8/ c #4BF8F3",
+"9/ c #4BF7F2",
+"0/ c #4DF8F3",
+"a/ c #49F6F3",
+"b/ c #4BF7F3",
+"c/ c #4BF8F2",
+"d/ c #46F1ED",
+"e/ c #3EDDDC",
+"f/ c #2FB1B3",
+"g/ c #36CACC",
+"h/ c #44EDE9",
+"i/ c #4CF7F2",
+"j/ c #45EEEB",
+"k/ c #38CFCF",
+"l/ c #2CA9AB",
+"m/ c #3AD9D7",
+"n/ c #46F1EC",
+"o/ c #4CF7F3",
+"p/ c #49F6F0",
+"q/ c #42E7E4",
+"r/ c #34C2C3",
+"s/ c #38CCCD",
+"t/ c #4AF6F1",
+"u/ c #36C5C6",
+"v/ c #42E9E5",
+"w/ c #4FF8F3",
+"x/ c #50F8F4",
+"y/ c #4FF8F4",
+"z/ c #4EF8F3",
+"A/ c #4DF7F4",
+"B/ c #47F1ED",
+"C/ c #3AD7D6",
+"D/ c #2CA3A6",
+"E/ c #3BD6D5",
+"F/ c #45F1EC",
+"G/ c #4DF7F3",
+"H/ c #4EF8F4",
+"I/ c #50F9F4",
+"J/ c #4CF6F2",
+"K/ c #43E9E5",
+"L/ c #35C5C7",
+"M/ c #30B5B7",
+"N/ c #3FE0DF",
+"O/ c #49F4F0",
+"P/ c #4BF5F0",
+"Q/ c #40E2DF",
+"R/ c #30B7B9",
+"S/ c #2CA6A9",
+"T/ c #4DF8F2",
+"U/ c #39CFCF",
+"V/ c #46EFEA",
+"W/ c #4EF7F2",
+"X/ c #52F9F5",
+"Y/ c #52F8F4",
+"Z/ c #53F9F5",
+"`/ c #51F8F4",
+" ( c #51F9F5",
+".( c #50F8F3",
+"+( c #3AD0D0",
+"@( c #2FB2B3",
+"#( c #3FDFDD",
+"$( c #49F4EF",
+"%( c #52F9F4",
+"&( c #51F8F5",
+"*( c #4CF6F1",
+"=( c #33BEBF",
+"-( c #34C0C2",
+";( c #42E8E4",
+">( c #4DF6F2",
+",( c #50F9F3",
+"'( c #49F3EF",
+")( c #3CDBDA",
+"!( c #30B3B6",
+"~( c #40E1E0",
+"{( c #2DA9AC",
+"]( c #3EDAD8",
+"^( c #4BF3EE",
+"/( c #54FBF5",
+"(( c #54FAF5",
+"_( c #55FAF5",
+":( c #53FAF5",
+"<( c #54F9F5",
+"[( c #56FAF5",
+"}( c #55F9F5",
+"|( c #45ECE8",
+"1( c #37C8C9",
+"2( c #33BDC0",
+"3( c #43E7E3",
+"4( c #4EF6F2",
+"5( c #4CF5F1",
+"6( c #40E1DD",
+"7( c #38CBCC",
+"8( c #46EEE9",
+"9( c #56FBF5",
+"0( c #55FAF6",
+"a( c #47F1EE",
+"b( c #3BD5D5",
+"c( c #35C0C2",
+"d( c #44E8E6",
+"e( c #4FF7F2",
+"f( c #32B4B6",
+"g( c #41E2DF",
+"h( c #50F7F2",
+"i( c #58FBF6",
+"j( c #56FBF6",
+"k( c #58FAF5",
+"l( c #57FBF6",
+"m( c #56F9F5",
+"n( c #57FAF5",
+"o( c #56FAF6",
+"p( c #58FBF5",
+"q( c #52F7F3",
+"r( c #44E7E4",
+"s( c #34BEBF",
+"t( c #38C9CA",
+"u( c #45EDE8",
+"v( c #53F9F3",
+"w( c #57FAF6",
+"x( c #58FAF6",
+"y( c #57FBF5",
+"z( c #4CF3EE",
+"A( c #3EDAD9",
+"B( c #3CD6D4",
+"C( c #53F9F4",
+"D( c #48EFEA",
+"E( c #39CECE",
+"F( c #39CCCD",
+"G( c #47EFEA",
+"H( c #35C0C1",
+"I( c #46E9E5",
+"J( c #53F8F3",
+"K( c #59FBF5",
+"L( c #59FBF6",
+"M( c #5AFBF6",
+"N( c #5AFBF7",
+"O( c #5BFCF7",
+"P( c #5BFBF6",
+"Q( c #58FBF7",
+"R( c #52F8F2",
+"S( c #40E1DF",
+"T( c #3CD4D2",
+"U( c #4DF1ED",
+"V( c #5AFCF7",
+"W( c #59FBF7",
+"X( c #59FCF7",
+"Y( c #59FAF5",
+"Z( c #4DF2ED",
+"`( c #3BD3D2",
+" _ c #30AFB2",
+"._ c #40DFDD",
+"+_ c #51F6F1",
+"@_ c #5BFBF7",
+"#_ c #55F9F4",
+"$_ c #46EBE7",
+"%_ c #36C3C5",
+"&_ c #3CD5D4",
+"*_ c #4EF3EF",
+"=_ c #39CDCC",
+"-_ c #4AEFEB",
+";_ c #5DFCF8",
+">_ c #5CFCF7",
+",_ c #5EFCF8",
+"'_ c #5CFCF8",
+")_ c #5FFCF8",
+"!_ c #60FDF8",
+"~_ c #4FF4F0",
+"{_ c #3FDBD9",
+"]_ c #2FAAAE",
+"^_ c #3FDCDA",
+"/_ c #4FF4EF",
+"(_ c #5EFCF7",
+"__ c #5EFDF8",
+":_ c #4BEFEA",
+"<_ c #39CBCC",
+"[_ c #34BCBE",
+"}_ c #45E8E4",
+"|_ c #56F9F4",
+"1_ c #5DFCF7",
+"2_ c #5DFDF7",
+"3_ c #54F9F3",
+"4_ c #45E5E1",
+"5_ c #34BABB",
+"6_ c #30AEB0",
+"7_ c #41DFDD",
+"8_ c #51F5F1",
+"9_ c #3ED7D6",
+"0_ c #50F4EF",
+"a_ c #5CFBF7",
+"b_ c #61FDF8",
+"c_ c #62FDF8",
+"d_ c #5FFDF8",
+"e_ c #60FCF8",
+"f_ c #4CF1EC",
+"g_ c #3BD2D1",
+"h_ c #33B7B9",
+"i_ c #56F8F4",
+"j_ c #5BFAF5",
+"k_ c #48EAE6",
+"l_ c #35BFC1",
+"m_ c #39C9C9",
+"n_ c #49EDEA",
+"o_ c #5CFAF5",
+"p_ c #61FCF8",
+"q_ c #5CFBF6",
+"r_ c #54F7F2",
+"s_ c #42DFDD",
+"t_ c #32B9BA",
+"u_ c #45E5E2",
+"v_ c #58F9F4",
+"w_ c #31AFB1",
+"x_ c #43E1DF",
+"y_ c #55F8F3",
+"z_ c #64FDF8",
+"A_ c #62FEF8",
+"B_ c #63FEF9",
+"C_ c #63FEF8",
+"D_ c #63FDF9",
+"E_ c #63FDF8",
+"F_ c #64FEF9",
+"G_ c #5CFBF5",
+"H_ c #4CEFEA",
+"I_ c #3ACAC9",
+"J_ c #37C3C4",
+"K_ c #48EBE7",
+"L_ c #5BFAF6",
+"M_ c #62FDF9",
+"N_ c #62FEF9",
+"O_ c #57F9F4",
+"P_ c #44E3E1",
+"Q_ c #4FF3EE",
+"R_ c #5EFBF6",
+"S_ c #64FEF8",
+"T_ c #53F5F0",
+"U_ c #3FD8D6",
+"V_ c #34C3C3",
+"W_ c #4AEEE9",
+"X_ c #5FFCF6",
+"Y_ c #35BCBD",
+"Z_ c #47E8E5",
+"`_ c #5DFAF4",
+" : c #68FEF9",
+".: c #66FEF9",
+"+: c #65FEF9",
+"@: c #67FEF9",
+"#: c #65FDF9",
+"$: c #65FEF8",
+"%: c #66FEF8",
+"&: c #63FCF8",
+"*: c #69FEF9",
+"=: c #64FDF9",
+"-: c #5FFBF5",
+";: c #48EAE5",
+">: c #36C0C0",
+",: c #3BD0CF",
+"': c #51F2EE",
+"): c #62FCF7",
+"!: c #68FEF8",
+"~: c #65FDF8",
+"{: c #57F7F2",
+"]: c #30A9AD",
+"^: c #41DEDB",
+"/: c #59F7F1",
+"(: c #62FCF8",
+"_: c #66FDF9",
+":: c #66FDF8",
+"<: c #62FBF6",
+"[: c #4EF1ED",
+"}: c #38CECE",
+"|: c #53F3ED",
+"1: c #64FCF7",
+"2: c #3BC9C8",
+"3: c #55EFEA",
+"4: c #6BFCF7",
+"5: c #76FFFA",
+"6: c #72FFFA",
+"7: c #6BFEF9",
+"8: c #72FEF9",
+"9: c #74FFFA",
+"0: c #6EFEF9",
+"a: c #6BFFFA",
+"b: c #6DFEFA",
+"c: c #70FFF9",
+"d: c #70FFFA",
+"e: c #6CFEF9",
+"f: c #71FEFA",
+"g: c #74FEFA",
+"h: c #6EFFFA",
+"i: c #75FEF9",
+"j: c #73FFFA",
+"k: c #74FFF9",
+"l: c #63FAF5",
+"m: c #48E5E2",
+"n: c #46DCDA",
+"o: c #5FF7F2",
+"p: c #6AFEF9",
+"q: c #71FFFA",
+"r: c #6FFEF9",
+"s: c #6CFFF9",
+"t: c #6EFFF9",
+"u: c #71FEF9",
+"v: c #70FEF9",
+"w: c #6DFFF9",
+"x: c #70FEFA",
+"y: c #6CFFFA",
+"z: c #6AFEFA",
+"A: c #6EFDF8",
+"B: c #5DF5EF",
+"C: c #42D6D3",
+"D: c #35B7B9",
+"E: c #4EE7E2",
+"F: c #60F9F4",
+"G: c #76FEFA",
+"H: c #72FEFA",
+"I: c #6FFEFA",
+"J: c #6DFEF9",
+"K: c #6FFFFA",
+"L: c #68FDF6",
+"M: c #53EEEA",
+"N: c #39C6C6",
+"O: c #1D9A9D",
+"P: c #48DFDB",
+"Q: c #64F9F3",
+"R: c #41D4D1",
+"S: c #66F3EE",
+"T: c #77FEF8",
+"U: c #79FFFA",
+"V: c #78FFFA",
+"W: c #77FFFA",
+"X: c #77FFF9",
+"Y: c #7AFFFA",
+"Z: c #75FFFA",
+"`: c #76FEF9",
+" < c #78FEF9",
+".< c #6AF8F2",
+"+< c #4BDEDB",
+"@< c #35B3B4",
+"#< c #50E4E0",
+"$< c #6CFAF4",
+"%< c #75FEFA",
+"&< c #77FEF9",
+"*< c #76FEF8",
+"=< c #5FF1EB",
+"-< c #3DCDCB",
+";< c #3CC5C4",
+">< c #5AEDE8",
+",< c #75FCF6",
+"'< c #7BFFFA",
+")< c #78FFF9",
+"!< c #6FFCF6",
+"~< c #56EAE5",
+"{< c #20A6A7",
+"]< c #57E9E4",
+"^< c #33AAAB",
+"/< c #4CDDD9",
+"(< c #6BF7F1",
+"_< c #73FEF9",
+":< c #7CFFFA",
+"<< c #7EFFFA",
+"[< c #7DFFFA",
+"}< c #7DFEF8",
+"|< c #6BF5EF",
+"1< c #47D6D3",
+"2< c #3ABFBE",
+"3< c #5EEBE5",
+"4< c #78FCF5",
+"5< c #7AFEF9",
+"6< c #74FCF5",
+"7< c #5BECE7",
+"8< c #39C2C1",
+"9< c #45CFCC",
+"0< c #5EF1EC",
+"a< c #7FFFFA",
+"b< c #76FFF9",
+"c< c #72FAF4",
+"d< c #52E4DE",
+"e< c #28B9B8",
+"f< c #3AB6B4",
+"g< c #5EE6E0",
+"h< c #7CFAF4",
+"i< c #82FEF9",
+"j< c #84FFFA",
+"k< c #81FFFA",
+"l< c #85FFFA",
+"m< c #82FFFA",
+"n< c #83FFFA",
+"o< c #80FFFA",
+"p< c #83FEF9",
+"q< c #6BF1EB",
+"r< c #44CCCA",
+"s< c #42CCC9",
+"t< c #68EFEA",
+"u< c #80FDF7",
+"v< c #82FFF9",
+"w< c #7AFAF4",
+"x< c #61E7E2",
+"y< c #50DAD6",
+"z< c #78F7F1",
+"A< c #81FEF9",
+"B< c #81FFF9",
+"C< c #76F7F2",
+"D< c #53DCD8",
+"E< c #45C4C2",
+"F< c #6AEDE8",
+"G< c #86FCF7",
+"H< c #8DFFFA",
+"I< c #87FFFA",
+"J< c #8BFFFA",
+"K< c #88FFFA",
+"L< c #8AFFFA",
+"M< c #89FFFA",
+"N< c #8CFFFA",
+"O< c #83FCF6",
+"P< c #70ECE6",
+"Q< c #44C2C0",
+"R< c #55D6D2",
+"S< c #7CF4EF",
+"T< c #8AFDF9",
+"U< c #8FFFFA",
+"V< c #8CFEF9",
+"W< c #80F9F4",
+"X< c #59E0DC",
+"Y< c #3BB1B1",
+"Z< c #5FE3DE",
+"`< c #84FAF5",
+" [ c #86FFFA",
+".[ c #8EFFFA",
+"+[ c #8AFFFB",
+"@[ c #87FEF8",
+"#[ c #76F3ED",
+"$[ c #4BD1CE",
+"%[ c #4FD0CD",
+"&[ c #75F3ED",
+"*[ c #84FEF9",
+"=[ c #86FAF4",
+"-[ c #61E5DF",
+";[ c #3AACAB",
+">[ c #59E0DB",
+",[ c #7FF8F2",
+"'[ c #85FEF9",
+")[ c #7CF6F0",
+"![ c #56D8D4",
+"~[ c #44BEBD",
+"{[ c #69EBE5",
+"][ c #85FCF6",
+"^[ c #87FFFB",
+"/[ c #7FFCF8",
+"([ c #74EEE8",
+"_[ c #44C6C5",
+":[ c #57DAD6",
+"<[ c #83F6F1",
+"[[ c #88FEF9",
+"}[ c #90FFFA",
+"|[ c #94FFFA",
+"1[ c #92FFFB",
+"2[ c #91FFFA",
+"3[ c #83F7F1",
+"4[ c #59DED9",
+"5[ c #41B9B8",
+"6[ c #70E8E2",
+"7[ c #88FBF5",
+"8[ c #93FFFA",
+"9[ c #92FFFA",
+"0[ c #8EFEF8",
+"a[ c #74F1EC",
+"b[ c #4CCEC9",
+"c[ c #47CCC8",
+"d[ c #79F1EB",
+"e[ c #8DFDF8",
+"f[ c #90FFFB",
+"g[ c #86FFF9",
+"h[ c #87FBF5",
+"i[ c #6BE9E4",
+"j[ c #40B1AF",
+"k[ c #71E4DE",
+"l[ c #8EFAF4",
+"m[ c #98FFFA",
+"n[ c #96FFFA",
+"o[ c #98FFFB",
+"p[ c #95FFFA",
+"q[ c #9AFFFA",
+"r[ c #97FFFA",
+"s[ c #99FFFB",
+"t[ c #96FFFB",
+"u[ c #95FFFB",
+"v[ c #96FEF8",
+"w[ c #8AF5EF",
+"x[ c #5DD7D2",
+"y[ c #4EC6C2",
+"z[ c #80EFE8",
+"A[ c #95FEF8",
+"B[ c #97FFFB",
+"C[ c #99FFFA",
+"D[ c #9AFFFB",
+"E[ c #92FDF8",
+"F[ c #7EEDE7",
+"G[ c #4BC2C0",
+"H[ c #61D7D1",
+"I[ c #83F6EF",
+"J[ c #91FEF8",
+"K[ c #94FFFB",
+"L[ c #91FAF4",
+"M[ c #72E5DF",
+"N[ c #4CBEBC",
+"O[ c #7BEAE3",
+"P[ c #94FCF6",
+"Q[ c #9CFFFA",
+"R[ c #9CFFFB",
+"S[ c #9BFFFB",
+"T[ c #9EFFFB",
+"U[ c #9EFFFA",
+"V[ c #9DFFFB",
+"W[ c #9BFFFA",
+"X[ c #93FDF7",
+"Y[ c #86F2EB",
+"Z[ c #5BCFCB",
+"`[ c #60D3CE",
+" } c #86F4ED",
+".} c #94FFF9",
+"+} c #98FBF5",
+"@} c #75E7E1",
+"#} c #6BDFD9",
+"$} c #90F7F2",
+"%} c #9BFEFA",
+"&} c #9FFFFB",
+"*} c #90F7F1",
+"=} c #68DDD7",
+"-} c #57C9C4",
+";} c #88F0E9",
+">} c #9AFDF7",
+",} c #9FFFFA",
+"'} c #A0FFFB",
+")} c #A1FFFB",
+"!} c #9BFDF8",
+"~} c #85EEE8",
+"{} c #66DCD7",
+"]} c #90F8F1",
+"^} c #95F9F2",
+"/} c #73E1DC",
+"(} c #48B8B5",
+"_} c #7EE6E0",
+":} c #97FBF5",
+"<} c #9FFEFA",
+"[} c #A0FFFA",
+"}} c #9DFFFA",
+"|} c #9DFEF9",
+"1} c #8FF5EF",
+"2} c #63D4CE",
+"3} c #61D3CE",
+"4} c #91F3ED",
+"5} c #9EFDF8",
+"6} c #A1FFFA",
+"7} c #A3FFFB",
+"8} c #A4FFFB",
+"9} c #A2FFFB",
+"0} c #A3FFFA",
+"a} c #A2FFFA",
+"b} c #9BFBF6",
+"c} c #80E8E2",
+"d} c #46B2B0",
+"e} c #79E5DE",
+"f} c #99FAF4",
+"g} c #A0FEFA",
+"h} c #9FFEF9",
+"i} c #93F6EF",
+"j} c #69D9D3",
+"k} c #55C5C0",
+"l} c #85EDE6",
+"m} c #9AFCF6",
+"n} c #9CFEF8",
+"o} c #57C9C5",
+"p} c #76DDD7",
+"q} c #9CF8F3",
+"r} c #A8FFFB",
+"s} c #A7FFFB",
+"t} c #A6FFFB",
+"u} c #A5FFFB",
+"v} c #A9FFFB",
+"w} c #A7FFFA",
+"x} c #9BF9F3",
+"y} c #77DFD9",
+"z} c #55C0BB",
+"A} c #8AEBE4",
+"B} c #A1FCF6",
+"C} c #A6FFFA",
+"D} c #A4FFFA",
+"E} c #A2FDF8",
+"F} c #91F2EB",
+"G} c #67D0C9",
+"H} c #63CFC9",
+"I} c #94F2EB",
+"J} c #A4FEF9",
+"K} c #97FCF6",
+"L} c #88EAE2",
+"M} c #4AB6B2",
+"N} c #87E7E1",
+"O} c #A1FCF5",
+"P} c #ABFFFC",
+"Q} c #ABFFFB",
+"R} c #AAFFFB",
+"S} c #ACFFFC",
+"T} c #AAFFFC",
+"U} c #A9FFFC",
+"V} c #A4FFF9",
+"W} c #94F5EF",
+"X} c #6FD6D0",
+"Y} c #64CDC7",
+"Z} c #93F1EA",
+"`} c #A2FEF8",
+" | c #ADFFFC",
+".| c #ACFFFB",
+"+| c #A7FDF7",
+"@| c #8EEDE7",
+"#| c #5FC5BF",
+"$| c #74DAD4",
+"%| c #9EF8F1",
+"&| c #A8FFFC",
+"*| c #9FFAF4",
+"=| c #84E2DC",
+"-| c #5EC3BF",
+";| c #94EEE8",
+">| c #A9FEF7",
+",| c #ADFFFB",
+"'| c #AEFFFB",
+")| c #AEFFFC",
+"!| c #A9FDF9",
+"~| c #9AF1EA",
+"{| c #67CEC8",
+"]| c #73D6D0",
+"^| c #9DF5EF",
+"/| c #A9FFFA",
+"(| c #A6FCF6",
+"_| c #89E8E1",
+":| c #80E4DD",
+"<| c #A0FAF3",
+"[| c #AAFFFA",
+"}| c #9DF7F1",
+"|| c #7FDCD5",
+"1| c #6DCFCA",
+"2| c #9DF3EC",
+"3| c #ABFDF8",
+"4| c #B0FFFC",
+"5| c #AFFFFB",
+"6| c #B1FFFB",
+"7| c #AFFFFC",
+"8| c #B2FFFC",
+"9| c #B1FFFC",
+"0| c #AAFCF7",
+"a| c #95ECE6",
+"b| c #88DFD8",
+"c| c #A4F9F2",
+"d| c #AEFFFA",
+"e| c #B0FFFB",
+"f| c #B2FFFB",
+"g| c #A6F9F3",
+"h| c #80E1DA",
+"i| c #58BEB8",
+"j| c #91EBE3",
+"k| c #ACFFFA",
+"l| c #9CF4ED",
+"m| c #75D3CD",
+"n| c #77D9D3",
+"o| c #A1F6EF",
+"p| c #ACFEF9",
+"q| c #B3FFFC",
+"r| c #B4FFFC",
+"s| c #A8FBF5",
+"t| c #8EE7E1",
+"u| c #59B7B3",
+"v| c #90E6E0",
+"w| c #A9FCF6",
+"x| c #ABFFFA",
+"y| c #A7F7F0",
+"z| c #78D8D1",
+"A| c #6FC9C3",
+"B| c #97F1EA",
+"C| c #A9FDF7",
+"D| c #B3FEFC",
+"E| c #B3FFFB",
+"F| c #A9FEF8",
+"G| c #98F0E9",
+"H| c #66CAC5",
+"I| c #8BE1DB",
+"J| c #A8FAF3",
+"K| c #B6FEFA",
+"L| c #B4FFFB",
+"M| c #B5FFFC",
+"N| c #B5FFFB",
+"O| c #B6FFFC",
+"P| c #B9FFFC",
+"Q| c #B7FFFC",
+"R| c #B2FEFA",
+"S| c #AAF9F3",
+"T| c #8AE0DA",
+"U| c #65C5BF",
+"V| c #9CEFE6",
+"W| c #B0FDF7",
+"X| c #B3FEFA",
+"Y| c #A2F2EB",
+"Z| c #74CEC7",
+"`| c #79D4CD",
+" 1 c #A0F4ED",
+".1 c #B2FDF9",
+"+1 c #B8FFFC",
+"@1 c #AFFCF6",
+"#1 c #96EBE4",
+"$1 c #60BAB6",
+"%1 c #93E8E1",
+"&1 c #AEFBF5",
+"*1 c #B5FEFA",
+"=1 c #A3F6EF",
+"-1 c #7AD7D1",
+";1 c #73CFC9",
+">1 c #A2F3EC",
+",1 c #B4FEF8",
+"'1 c #AFFCF7",
+")1 c #9BECE5",
+"!1 c #88DED5",
+"~1 c #A3F7F0",
+"{1 c #B2FEF9",
+"]1 c #A9FAF4",
+"^1 c #8FE4DD",
+"/1 c #6DC6C0",
+"(1 c #9FEEE7",
+"_1 c #B2FDF7",
+":1 c #BAFFFC",
+"<1 c #B9FFFB",
+"[1 c #B6FEF9",
+"}1 c #A6F1E9",
+"|1 c #74CDC7",
+"11 c #85DAD3",
+"21 c #ACF7F0",
+"31 c #B7FEFA",
+"41 c #B6FFFB",
+"51 c #B1FAF4",
+"61 c #95E6DF",
+"71 c #61B6B2",
+"81 c #94E5DE",
+"91 c #AFFBF4",
+"01 c #B4FEFA",
+"a1 c #A8F8F1",
+"b1 c #86DCD4",
+"c1 c #7FD3CC",
+"d1 c #A9F2EC",
+"e1 c #BCFFFC",
+"f1 c #BBFFFC",
+"g1 c #B8FFFB",
+"h1 c #B6FCF6",
+"i1 c #9FEBE4",
+"j1 c #8FE3DB",
+"k1 c #B1FAF3",
+"l1 c #BAFEFA",
+"m1 c #BDFFFC",
+"n1 c #AFF8F2",
+"o1 c #91E0D8",
+"p1 c #6FC3BB",
+"q1 c #A0ECE5",
+"r1 c #B7FDF7",
+"s1 c #BAFFFB",
+"t1 c #B8FFF9",
+"u1 c #AAF4EC",
+"v1 c #80D2CB",
+"w1 c #89D6CF",
+"x1 c #ACF4ED",
+"y1 c #BCFEFA",
+"z1 c #BEFFFC",
+"A1 c #BFFFFC",
+"B1 c #BEFFFB",
+"C1 c #B8FBF6",
+"D1 c #9EE7E0",
+"E1 c #64B7B1",
+"F1 c #9AE5DE",
+"G1 c #B5FAF3",
+"H1 c #BBFFFA",
+"I1 c #B9FEFA",
+"J1 c #AFF7F0",
+"K1 c #8DDAD3",
+"L1 c #77C8C1",
+"M1 c #A6EFE8",
+"N1 c #B6FCF7",
+"O1 c #BBFDF9",
+"P1 c #A8F0E9",
+"Q1 c #7CCDC5",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . ",
+" + @ ",
+" # $ % ",
+" & * = ",
+" - ; > , ",
+" ' ) ! ~ { * ",
+" ] ^ / ( _ : < ",
+" [ } > | | ~ 1 2 ",
+" @ 3 _ | | | 4 ; ",
+" 5 , 4 | | | 6 7 8 ",
+" 9 ; 0 a a a a a ( , ",
+" b c 6 a a a a a 6 d * ",
+" e { a f f f f f g h { i j [ k 5 5 @ l ",
+" m n o a g g g f f f f 6 : 5 < p q r s t u % v w k x [ ",
+" y z ( A B C A A A A A D 6 / E d | | F ~ G d : c H , p z I t % J K L x ",
+" @ = | C A A A A A A A A D 6 1 1 M N C D g D f f h 6 O 4 _ o G / 1 P = * Q < $ R w k 5 @ ",
+" 5 8 S A A T A A T T A A A A ( U e : S C A A T A A T V T V A g g B a 6 | W ( ~ d X ! 1 Y Z * t ",
+" ` 1 B .T T ..T T T .T T ..C ~ I o D ..T ....+.V +.T T T .....@...T T A A #.A D B f h $.d p ",
+" % > %.&.@. .*. . .@.=. . .*.-.;.>. ,.0 +.*.*.*.*...*.@. . .*.*.@.*.*. .*. .*.&.&.@.*. .@...#.( '. ",
+" ).>.+.*.*.*.*.*.*.*.*.*.*.*.*.-.!.~. {.6 +.*.*.*.*.&.].*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.C ^. ",
+" < O @././././.(.(._./.(./.(.(./.].:./ { D ].(./.(./.(./.(.(./.(./.(.(.(.(./.(._.(.(.(.(.(./.].C <. ",
+" Q 6 [./././.(./.(././.(.(./.(./.(.[.h 1 z ~ T ]././.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(.(.(.(.(.(.].B : }. ",
+" |.Z f (._.1.1._.2._.2.1._.1.1._.1._._.@.6 U 6 @.1.1.1.1.2._.1._._.1.1.1.1.1._.1._._._.2.1.1.1.1.1.&.f 3. y - I z ^ $ $ J w ",
+" 4.5.C 2.1.2.6._.1.2._.1.1._.6.2.2.2._.1.7.~ ; f (.6.2._.2._.1.1.8.2.6.1.2.2.1.6.1.6.6.2.1.6._.2.2.1.].9.P e / $.h ( o G 3.8 P p Q I t % 9 & ",
+" ` : @.0.a.a.0.2.a.a.2.b.6.b.0.0.b.a.2.a.a.+.4 { T a.a.2.0.c.a.d.6.0.0.b.a.6.d.a.6.a.0.d.a.0.b.6.0.6.b.].| ; g (.(.[.e.@.+.T D f.h W g.{ ! P 8 = Q i e h.w i. ",
+" - j.].k.l.a.0.k.k.k.0.k.a.a.a.k.a.0.k.k.m.b...d 4 ].a.m.k.0.m.k.a.a.m.0.a.0.k.k.0.a.a.k.a.a.k.m.m.0.k.k.&.( d T 6.m.a.k.a.6.0.6.6././.e. .7.T n.a O ^.d X : 1 ,.3 n $ R ",
+" $ ( _.m.k.k.a.m.k.k.m.k.m.k.k.k.m.k.m.0.m.k.6.A ! = a 1.k.k.k.m.m.k.k.m.m.k.m.0.k.m.k.a.m.k.0.k.k.m.k.m.m.0.o.j. _ ].k.0.m.k.0.m.k.p.k.m.m.k.k.k.a.6.6._.(.].*...A D h O _ 3. ",
+" I h q.r.s.r.t.k.r.r.m.m.u.m.u.u.r.m.m.m.u.s.u.b.D ; D 1.r.m.u.t.m.r.u.u.v.k.k.r.r.r.r.m.u.u.m.k.u.m.k.r.r.k. .> U h (.k.r.m.u.m.m.u.m.k.r.m.r.u.r.s.u.t.u.k.m.m.m.0.0.2.8...d ",
+" Q B q.t.t.r.u.u.u.u.t.u.u.t.r.r.t.r.u.u.u.u.t.u.2.f. { .m.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.r.r.u.u.u.r.w.#. 1 C 0.u.t.r.u.r.u.t.r.u.u.u.u.r.u.u.u.u.t.u.u.u.u.u.u.u.q. .{ ",
+" P C s.u.v.t.r.t.t.t.u.u.u.u.u.u.t.r.u.u.u.u.r.u.r.x.( ^.x.m.t.u.t.u.u.u.t.u.r.t.u.t.u.r.t.u.t.u.u.u.t.r.u.u.s.c.f > .m.t.t.u.r.u.u.u.u.u.u.u.r.t.u.r.u.u.u.u.t.t.u.u.u.t.0.#. ",
+" k ! ..y.t.t.z.t.A.t.A.z.B.t.t.t.t.t.t.t.t.z.t.C.t.B.t.].~ f.b.D.B.t.t.t.t.B.t.t.z.t.A.t.t.E.B.A.B.z.t.z.t.t.t.B.t.8.0 ~ (.v.z.u.B.z.B.z.z.t.z.t.t.t.t.t.t.t.t.t.A.A.B.u.z.z.F.0.n. ",
+" ` d 8.z.G.G.H.G.A.z.G.E.A.H.z.z.H.H.G.z.z.H.G.G.G.H.G.v...{ H V 0.I.H.z.H.H.H.z.z.E.G.G.z.G.G.H.A.z.H.G.A.H.G.z.H.H.A._.~ f.0.z.B.H.H.H.z.E.G.z.H.H.z.H.G.H.z.z.G.G.H.A.G.H.H.G.B.0.J. ",
+" - >.c.K.K.K.K.K.G.H.K.K.G.K.z.H.K.K.K.H.H.K.K.K.K.K.K.H.r.L. > *.A.G.H.K.K.K.H.H.K.K.K.H.K.K.K.K.H.K.K.G.K.G.H.K.K.K.t.&.<. ; +.s.G.K.K.K.H.K.K.H.K.H.G.K.K.K.H.H.K.K.K.G.K.K.K.K.I.M.b.O ",
+" d 2.N.O.P.Q.O.P.Q.R.N.O.O.K.O.Q.S.N.P.O.O.O.O.P.P.O.O.O.r.#. W a.G.S.P.O.K.O.P.P.O.O.P.O.O.P.O.P.O.K.O.P.N.S.O.O.K.O.A.[. : /.z.P.T.N.P.O.N.O.O.S.N.P.O.K.O.Q.O.O.P.O.P.O.O.P.P.S.G.1.^. ",
+" , V t.O.O.O.O.O.Q.P.Q.P.O.P.O.P.O.Q.O.O.P.O.P.O.P.O.O.O.N.m.f. g y.N.O.O.O.O.O.P.O.P.O.O.O.P.P.O.O.P.P.P.O.O.P.O.P.O.N.v.V U.6.H.O.P.P.O.O.P.O.Q.P.Q.O.O.P.O.P.O.P.O.O.O.P.Q.O.O.N.z.]. ",
+" G V.H.O.P.W.P.W.P.Q.P.O.P.O.O.P.W.W.W.X.W.W.P.Q.X.W.O.W.R.b.O T B.O.W.X.W.X.W.X.W.Q.P.X.X.Q.X.P.X.P.Q.O.O.Q.P.X.W.W.Q.v.B S r.O.Q.Q.X.X.O.O.P.O.O.X.X.W.X.X.W.X.W.Q.X.Q.Q.P.P.X.Y.B... ",
+" ( d.H.X.W.X.X.X.X.X.W.Q.Z.Q.W.X.X.X.X.O.W.X.P.X.X.X.W.Q.`.1. : /.H.X.W.X.X.X.P.Q.X.P.Q.W.X.X.W.X.X.W.W.W.Q.W.X.W.X.X.N.0.6 A B.P.X.X.X.W.W.W.W.W.W.X.X.X.X.Q. +X.P.T.W.X.X.X.X.X.P.B.N ",
+" g t.P..+Z.W.Z.W.W.W..+++@+X.Z.W.Z.W..+W.Z..+W.W.W.W.W.W.H.*. U.b.N.Z.Z.W.W..+X.W..+#+W.Z.Z.W.W.Z.W.W.++#+X.Z.Z.W.Z.Z.N.a.U. : [.K.W..+W.Z.Z.W.Z.++X.W.W.W.W.#+X.W..+.+W.W.W.W.Z.W..+O.v.f. ",
+" +.A..+++.+++++++Z.++++.+Z..+++.+++++$+++++W.++++++$+++Z.M.+. a r. +++++++++Z.++++.+Z.++.+.+++++$+++++++Z.++++++++++Z.S._. _ b.Q.$+++++.+Z.++++Z.++++++++++W.$+++++Z.++++++++++++.+T.q.W ",
+" / /.Y.%+&+*+&+*+&+&+%+&+*+$+*+=+++%+-+*+$+*+*+*+*+&+*+&+%+G.D #.A..+-+%+++&+&+*+%+&+&+;+=+*+*+&+*+%+*+&+.+%+&+%+++&+=+H.[. f.v..+&+*+=+*+>+%+&+%+++&+*+$+*+*+*+%+&+&+&+&+&+&+*+*+%+O.d. ",
+" ~ l.W.;+-+&+-+&+-+&+&+-+&+-+-+&+-+-+&+&+-+&+-+-+&+&+-+-+.+r.h : e.O.&+-+-+-+-+&+-+-+&+-+&+-+-+&+-+&+&+-+&+-+&+-+&+&+-+%+N.V +.`.;+-+-+&+-+-+&+&+&+-+-+&+-+&+&+-+&+-+&+-+&+-+-+&+-+&+O.e. ",
+" f B.#+-+,+'+&+)+)+,+!+!+,+)+&+~+)+)+)+)+)+)+&+&+,+!+&+)+++q. o a.;+!+,+)+)+)+)+)+)+~+-+!+{+&+,+)+)+!+{+!+]+!+-+)+)+)+^+G.B ].O.,+!+~+)+)+)+!+-+)+,+!+)+)+)+)+)+)+{+-+&+)+&+!+)+]+*+S.T ",
+" +.K.~+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+{+#+2. h B.^+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+>+m. >.0.%+/+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+^+G.B ",
+" /. +/+)+)+)+)+)+)+)+)+]+)+)+]+)+)+)+)+)+)+)+)+)+)+)+)+)+ +&. T K./+(+)+)+)+)+)+)+)+)+)+)+)+)+]+)+)+)+)+)+)+)+)+)+)+_+.+b. h t.>+)+)+)+)+)+)+]+)+)+]+)+)+)+)+]+]+)+)+)+)+)+)+)+)+)+*+v.6 ",
+" d w.>+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+(+(+(+(+(+(+(+(+(+)+O.T (.W.)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+W.x. A K.{+<+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+(+(+(+(+(+(+(+:+(+*+k. ",
+" 6 G.)+[+(+[+[+[+[+[+[+}+[+<+<+<+|+1+[+}+}+[+}+[+:+[+[+|+)+N.g o 0.>+(+<+<+<+<+[+[+[+[+[+<+<+[+}+[+<+[+[+[+[+<+<+<+<+<+:+2+*. (. +)+3+[+[+[+}+4+}+[+<+<+<+<+1+[+[+[+[+[+<+<+[+<+[+[+}+;+6. ",
+" T T.(+5+5+5+5+[+[+5+5+5+3+5+5+5+3+[+5+5+5+3+3+4+[+5+5+[+)+B. h A.^+5+5+3+5+3+5+3+3+5+3+5+[+3+5+5+3+[+5+5+5+5+[+[+5+5+1+T.T o b.*+3+5+[+3+[+3+3+5+<+[+5+3+5+5+5+5+[+5+5+5+5+5+[+5+5+5+++(. ",
+" (.6+5+7+8+7+8+7+8+7+7+7+8+7+8+8+8+8+8+8+7+8+8+8+8+7+7+9+,+m. A O.<+7+7+8+7+7+7+8+7+7+8+8+7+8+8+8+7+8+8+8+7+8+7+8+7+7+<+H. 6 B.)+8+8+8+7+8+8+8+8+8+8+8+7+8+7+7+8+8+8+7+7+8+7+7+7+8+[+ +%. ",
+" o k.{+9+0+8+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+8+8+7+9+*+6. &.++5+a+7+7+7+7+7+7+8+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+0+)+b+ C +}+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+7+8+7+7+7+7+7+7+7+:+K. ",
+" f.A.[+c+a+a+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+c+c+a+a+c+c+a+>+&. s.d+c+c+c+c+c+c+c+a+a+c+c+a+c+c+c+c+c+c+c+c+c+c+c+c+c+e+)+b. (.^+f+c+c+c+c+c+c+c+c+c+c+c+c+c+c+c+a+a+c+c+7+c+c+c+c+c+[+z. ",
+" #.Q.8+c+g+c+c+h+c+c+c+c+c+c+c+c+c+g+g+c+g+c+c+g+g+c+c+g+7+.+#. W E.3+c+c+c+c+h+c+g+g+c+c+g+c+c+c+c+c+c+c+c+c+c+c+c+c+g+i+~+(. 0.(+c+h+c+c+c+c+c+c+g+g+c+c+c+g+c+g+g+h+c+g+c+c+c+c+g+a+d+y. ",
+" (.^+e+g+j+k+g+g+g+g+g+l+g+c+g+g+c+g+g+g+g+g+l+g+g+g+g+g+m+N. A X.5+n+g+j+g+l+g+j+j+g+g+g+k+g+g+g+g+g+g+g+c+l+l+g+g+j+a+.+.. W H.5+g+g+g+g+j+k+g+l+c+g+l+g+c+g+g+j+j+l+l+g+g+c+g+g+g+a+{+b. ",
+" 0.(+c+l+o+l+l+p+l+o+o+p+p+g+o+l+l+p+j+o+p+o+j+l+p+p+l+l+5+A. (.~+c+o+p+l+p+g+j+p+p+j+j+o+l+g+o+p+o+o+p+p+g+l+l+l+p+n+0+ + D +8+l+n+j+l+o+l+l+l+j+l+o+j+l+l+g+l+p+g+g+p+p+g+l+o+q+c+~+]. ",
+" W G.[+p+p+p+p+p+l+p+o+o+p+p+p+p+p+o+o+p+p+p+p+p+p+p+o+p+j+(+k. 0.(+h+p+p+o+j+l+o+o+p+l+p+p+o+o+o+p+p+l+l+l+p+o+p+o+o+g+3+H. @.*+a+l+p+l+l+p+p+o+p+o+l+p+p+l+j+o+l+p+l+l+o+p+p+l+o+p+a+Z. ",
+" B +a+p+l+p+o+o+p+p+o+l+l+o+p+p+p+l+r+s+o+o+p+p+o+p+p+p+g+t+(. 4 A.3+j+o+l+p+o+p+o+l+o+l+l+p+p+p+o+q+o+p+l+o+p+o+p+l+p+r+<+b+ b./+l+p+o+l+p+o+l+p+l+p+l+p+l+q+o+p+l+o+l+l+o+p+l+p+o+l+9+K. ",
+" ].~+l+u+u+u+u+u+u+u+p+u+u+v+r+u+u+u+u+u+u+u+u+u+u+u+u+u+g+*++. D w+a+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+u+u+r+v+u+u+u+u+p+(+b. z.7+s+u+u+u+u+r+r+u+u+p+u+u+u+u+u+u+u+u+u+u+u+u+u+u+u+p+9+G. ",
+" l.3+r+u+u+u+x+x+u+y+u+x+z+u+u+x+x+x+u+u+u+u+x+x+u+u+u+u+k+W. @.~+p+y+x+u+u+u+u+u+x+u+u+u+u+u+x+u+y+u+u+u+z+u+u+u+u+y+o+/+(. f.W.j+y+u+x+u+u+x+u+x+y+u+x+u+x+x+x+u+u+u+u+x+x+x+u+x+y+r+[+w. ",
+" H.f+u+x+y+A+x+y+y+y+y+y+A+y+A+y+A+y+y+y+y+y+y+x+y+y+u+x+e+S. 8.B+u+A+y+y+y+y+y+y+y+y+u+y+y+x+x+y+y+y+y+y+y+y+y+A+y+y+l+%+ @.*+l+A+y+u+y+A+y+y+y+y+y+y+A+A+A+y+y+y+y+x+y+A+y+x+A+y+r+d+&. ",
+" f W.o+C+D+D+C+C+E+C+E+F+C+C+C+F+y+E+E+E+C+E+E+C+G+E+C+D+A+a+C. z.c+F+C+E+C+E+C+E+D+D+E+E+E+E+C+C+C+C+F+F+E+C+C+A+C+E+C+j+Q. c.}+y+E+C+E+C+C+E+C+C+E+C+C+E+D+C+C+G+D+C+C+D+D+C+C+G+E+r+*+ ",
+" T &+x+E+A+E+D+H+D+D+D+D+H+H+H+D+D+D+D+H+C+I+D+F+A+D+D+H+A+3+0. f.#+q+G+D+H+E+H+H+J+A+D+H+F+E+D+H+D+D+D+D+D+D+H+D+D+D+H+E+e+t. z.e+y+D+D+D+H+D+D+H+D+H+H+H+A+D+D+C+F+E+H+F+F+H+H+H+D+C+p+w+ ",
+" 2.K+y+D+H+D+D+D+H+D+H+D+D+D+H+D+D+D+D+D+D+D+H+D+H+D+D+H+x+d+ T t+r+D+D+D+D+H+D+D+H+D+D+H+D+D+D+D+D+H+D+D+H+D+D+D+D+H+F+9+k. h X.g+C+H+H+D+H+D+H+D+D+D+H+D+D+H+H+D+D+D+D+D+H+D+D+H+D+C+c+S. ",
+" z.c+E+L+M+M+M+M+L+L+L+M+M+M+L+M+M+M+L+M+M+L+M+M+M+M+M+H+s+*+ 2.[+A+M+M+M+M+M+M+M+M+M+M+L+M+M+M+L+M+M+L+L+M+M+M+M+M+L+A+}+1. 7.!+s+L+L+L+L+M+M+M+M+L+M+M+L+M+M+M+M+M+M+L+M+M+M+L+M+M+C+0+r. ",
+" +o+L+M+N+M+L+M+M+M+L+M+M+M+M+L+M+M+L+L+M+L+L+M+L+M+M+O+o+ + t.0+C+M+M+L+M+L+M+M+M+M+M+P+M+L+M+L+L+M+M+L+L+L+M+M+M+H+s+!+ _.B+C+M+M+M+M+M+L+M+L+M+M+M+M+L+M+L+L+M+L+L+M+M+M+M+Q+L+C+K+_. ",
+" A t+x+Q+R+S+N+T+T+S+N+S+S+M+S+S+S+M+N+S+Q+N+S+Q+S+S+N+T+O+g+G. O.l+M+S+Q+S+S+S+S+Q+S+N+R+S+N+T+R+M+S+S+Q+S+N+S+Q+M+N+O+r+Z. s.c+H+S+S+S+S+N+S+Q+Q+Q+S+S+N+Q+N+Q+S+N+N+T+R+S+S+R+M+S+A+,+ ",
+" 2.3+U+T+R+R+T+T+R+T+R+T+T+T+T+R+T+T+T+T+R+T+T+T+R+T+R+R+H+V+q. D ^+y+W+R+R+R+R+R+T+R+T+R+R+R+T+R+T+T+T+T+T+T+R+T+T+T+R+S+o+X+ O.Y+Q+R+T+T+R+T+T+T+T+R+R+R+T+R+T+T+R+R+R+R+R+T+R+T+T+R+z+>+ ",
+" t.c+N+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+L+3+ (.<+O+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+`+N+n+B. N ~+y+ @Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+Z+ @.@P. ",
+" T.p++@`+`+`+`+`+`+`+`+`+`+`+`+`+Z+ @`+`+ @`+`+`+`+`+`+`+G+)+ b+e+@@`+`+`+ @`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+ @`+#@9+ e.}+L+`+`+`+`+`+`+`+`+`+`+`+`+$@Z+`+`+`+`+`+`+`+`+`+`+`+@@g+B. ",
+" ^+A+$@`+`+`+`+`+`+`+`+`+%@`+%@`+`+`+`+`+`+`+`+%@%@`+%@&@x+w+ N.v+@@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@`+`+`+`+`+`+Z+E+)+ 0.c+#@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@%@`+`+`+`+M+0+w. ",
+" (.[+N+*@*@*@=@*@*@-@*@*@-@*@;@-@*@*@*@;@*@;@-@;@;@*@=@=@%@r+X+ *+J+>@*@;@*@*@*@*@*@=@*@*@*@*@*@-@*@-@;@=@,@*@*@*@*@*@>@J+^+ S.Y+&@*@-@,@=@,@*@=@-@=@-@;@,@*@-@;@-@-@*@;@-@*@*@-@-@%@N+3+ ",
+" 0.k+W+;@'@,@;@'@,@-@,@;@'@;@,@,@;@'@;@;@,@,@;@;@'@,@,@,@&@g+r. *.[+N+*@;@,@;@;@-@;@,@;@;@-@,@,@,@'@;@;@,@,@'@;@'@-@'@)@!@u+ + >+F+~@-@,@,@,@;@=@,@-@{@,@,@;@,@-@)@,@;@;@;@-@'@,@;@;@;@D+{+ ",
+" K.r+*@)@)@)@)@,@'@)@)@)@)@)@)@'@)@)@)@)@)@)@)@)@)@)@)@]@ @7+ q.h+&@)@)@,@{@)@)@)@)@)@)@'@)@,@)@,@)@)@)@)@)@)@,@)@)@,@^@q+A. .<+N+,@/@)@)@)@)@)@)@'@)@)@)@)@)@)@)@'@)@)@'@)@)@)@'@)@-@(@w. ",
+" ;+C+;@_@)@/@/@)@)@'@/@,@'@/@:@/@'@)@/@/@'@'@/@/@)@/@/@=@S+1+ G.r+^@/@:@)@)@)@/@/@'@/@:@)@/@/@)@)@)@/@)@,@)@:@/@:@)@:@%@e+ b.a+&@:@/@/@'@)@<@:@)@:@/@/@:@,@)@/@:@)@)@/@:@/@/@/@)@)@~@A+3 ",
+" ..1+S+;@)@_@/@)@_@/@_@)@_@_@_@_@/@_@_@_@_@)@_@:@_@_@/@,@[@H+&+ .+C+]@_@_@_@,@_@_@/@<@:@)@_@_@)@:@_@_@)@/@_@_@_@_@_@_@_@Z+[+ z.n+}@|@:@)@_@_@:@/@_@_@_@_@/@:@/@_@_@)@_@)@/@_@:@)@_@1@%@8+ ",
+" 6.e+S+:@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@:@/@_@{@A+2@ 3@N+]@_@_@_@_@_@_@_@:@/@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@]@#@'+ W.C+{@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@/@)@_@_@_@_@_@_@4@$@w+ ",
+" B.v+)@5@_@6@5@_@7@_@_@_@_@_@_@_@6@8@8@6@_@_@7@6@_@6@5@_@,@p+t. 1.7+9@4@_@5@_@5@8@6@_@7@7@_@6@7@8@6@_@_@_@_@_@_@_@5@_@5@:@D+W. ]+N+_@8@5@8@6@_@_@_@_@_@_@6@8@5@_@5@_@8@7@6@_@5@0@8@5@:@@@Q. ",
+" %+D+<@7@5@5@7@5@5@5@7@5@5@7@5@7@7@6@6@7@5@_@5@5@5@5@5@8@=@c+ t.r+,@6@5@5@0@8@5@7@7@5@5@7@5@7@5@5@5@5@5@7@5@5@5@7@5@6@)@u+E. a@f+>@5@5@5@7@5@5@7@5@7@6@6@7@5@_@7@5@7@5@5@5@5@5@7@5@7@b@M+(. ",
+" z )+c@6@d@e@7@7@7@f@d@7@d@7@e@7@f@5@f@f@5@f@7@5@7@d@d@f@7@%@5+ T.E+8@d@f@5@e@f@7@7@7@d@5@e@e@7@7@d@e@7@5@f@7@7@f@5@d@e@;@q+ B.q+{@7@e@7@f@7@7@5@e@f@e@7@7@f@7@f@5@f@7@5@f@7@7@e@f@7@{@a+g@ ",
+" G &. (.f+>@d@h@h@h@h@e@i@h@7@i@h@h@7@d@h@7@d@h@h@7@h@i@7@h@h@6@ @{+ )+&@d@d@d@i@j@d@h@h@7@d@i@i@h@h@e@h@h@0@d@h@h@7@d@h@h@e@~@a+ Q.D+|@h@h@j@h@i@d@d@i@i@d@7@h@h@7@d@i@d@7@i@h@h@h@j@h@d@:@k@ ",
+" f %+&+ s.p+:@h@i@h@h@d@h@h@e@h@h@h@e@h@h@e@h@i@i@d@h@h@e@h@h@l@7@D+Q. [.8+*@6@h@h@h@h@h@h@e@h@h@h@h@i@d@h@h@e@e@h@h@d@i@h@h@h@m@$@d+ &+@@7@i@h@h@i@h@l@h@i@d@i@h@h@d@h@h@d@i@h@h@h@i@h@h@i@h@,@;+",
+" .c+E+!+ W.D+7@n@i@n@o@p@h@o@o@n@n@n@o@n@n@o@n@n@o@n@n@n@h@o@n@i@:@A+K. r.q@:@p@n@n@n@n@n@n@o@o@o@i@o@n@o@h@p@n@o@n@o@n@n@o@n@n@7@@@&+ 8+>@e@o@n@h@h@n@o@n@o@n@n@n@o@n@o@o@n@o@o@o@i@o@n@h@h@o@&@",
+" 2.u+[@D+T. {+$@l@o@n@n@n@n@n@n@o@n@o@n@n@o@n@n@n@n@o@n@o@o@n@n@n@o@)@l+ S.E+f@n@o@n@o@o@n@n@n@n@o@n@o@n@n@n@o@n@o@o@n@n@o@n@o@n@6@E+S. 0.q+4@n@n@n@n@n@o@o@n@o@o@n@o@o@n@o@n@n@n@o@n@n@n@o@n@n@7@",
+" P r.E+r@8@r+ 9+-@s@o@n@n@o@n@n@n@o@n@n@o@n@n@o@n@o@n@n@n@n@t@n@o@n@p@;@m+ ~+T+i@u@n@o@n@v@n@n@n@n@o@n@o@o@n@n@n@n@n@n@o@o@n@o@n@n@_@Y+ H.E+7@n@o@n@n@o@o@v@n@o@n@n@n@o@o@o@n@n@n@n@n@o@n@n@n@p@",
+" ! I.M+p@v@)@w@ a.l+_@n@x@o@n@n@o@n@y@v@n@x@x@n@n@u@v@o@o@n@x@v@n@v@v@n@l@^@d+ [+-@n@x@o@n@z@v@v@v@x@x@n@n@o@n@n@n@x@n@v@v@z@n@o@n@z@o@,@a+ %+R+d@n@n@o@n@z@z@n@n@x@x@o@n@x@n@x@v@n@x@n@v@n@v@n@n@",
+" { Z.&@o@n@p@-@[+ H.(@7@x@v@x@x@n@x@x@z@v@x@x@x@v@x@x@n@v@v@n@n@x@n@x@x@u@i@@@#+ 8.k+4@u@n@x@x@n@v@x@v@n@x@v@n@x@v@x@x@x@z@x@y@x@n@v@z@n@o@*@1+ (+>@o@x@v@n@x@x@x@x@x@z@n@x@z@n@n@z@x@v@x@z@v@x@v@n@",
+" ~ ]+)@A@B@C@x@Z+~+ Z.@@n@C@C@C@C@D@B@E@B@z@x@D@D@z@D@B@B@D@B@z@C@C@C@C@C@D@l@E+ A.z+f@C@C@F@B@B@C@D@x@D@C@C@C@A@C@x@B@z@B@n@B@D@C@F@G@C@v@Z+*+ _.g+8@B@C@B@z@v@x@D@v@B@C@C@B@B@B@C@B@x@z@D@D@C@C@D@",
+" 6 9+7@H@I@A@A@i@S+Z. (+)@D@I@A@B@A@A@I@I@I@C@I@A@I@B@C@A@I@A@A@A@A@I@I@B@A@I@d@u+ $+S+n@I@A@A@I@A@I@C@A@I@A@I@C@C@I@I@I@I@C@A@A@I@C@B@I@J@o@L+Q. u.y+i@B@B@I@C@A@I@D@C@C@I@A@I@A@A@I@C@I@I@I@I@C@D@",
+" D g+l@H@A@I@B@A@l@y+ e+:@A@I@x@I@I@A@A@A@I@I@A@A@I@A@I@A@A@A@B@G@I@A@x@A@I@C@8@e+ (+-@z@A@I@A@I@A@I@A@B@I@A@B@D@I@I@A@I@A@A@A@A@A@I@I@A@K@h@.@ +N+i@z@I@I@I@A@I@A@I@I@I@A@A@A@I@I@I@B@A@A@D@B@",
+" [.p+i@L@I@I@I@A@D@0@l+ u.y+d@I@I@I@A@I@I@A@I@A@I@A@A@A@I@I@A@A@I@A@I@A@I@A@I@J@E@*@1+ e+/@z@A@A@I@I@I@A@A@A@I@A@A@A@I@I@A@A@I@A@I@I@A@A@I@A@z@8@n+ )+*@z@L@A@I@I@I@I@A@I@I@I@I@A@I@A@I@A@A@I@A@A@",
+" b.F+x@M@I@H@H@H@L@B@<@m+ X.R+x@L@H@H@H@L@H@H@H@H@L@L@H@H@L@H@I@H@H@L@L@L@H@H@H@L@B@Z+w+ m.y+l@I@N@H@L@A@H@H@L@H@H@H@H@H@H@H@L@H@H@H@L@H@H@H@L@I@C@/@3+ e+8@A@H@L@H@H@H@H@H@L@L@H@H@L@J@H@L@H@L@H@L@",
+" t.M+B@H@H@H@L@H@H@J@z@>@{+ {+*@v@H@H@L@H@H@H@I@L@H@I@L@L@H@L@H@H@H@I@H@A@L@H@I@H@L@n@H+ O.H+n@H@H@H@H@L@H@L@I@I@H@H@L@H@L@H@I@L@H@I@I@H@H@H@H@H@z@`+^+ b.q+d@L@H@H@H@H@I@H@I@I@H@H@H@H@H@J@L@I@L@I@",
+" ! X+^@L@N@O@N@M@N@H@N@H@v@ @#+ 7+|@C@M@P@M@L@N@H@M@N@H@N@M@H@M@M@N@H@H@N@M@H@H@M@M@L@M@Q@R@ ~+*@C@M@N@M@N@I@L@S@M@M@L@N@M@H@N@M@M@N@N@M@N@H@S@H@N@H@v@@@ G.E+n@M@L@H@S@M@T@T@H@T@N@O@N@N@L@L@H@N@H@",
+" { *+U@P@V@M@H@H@V@L@N@M@N@v@A+ 0.p+f@M@V@M@H@T@N@M@V@V@M@N@N@T@H@M@N@N@T@M@H@T@M@L@H@T@O@W@j+ K+:@A@T@M@M@H@P@V@P@H@M@V@N@L@M@T@M@T@T@T@M@T@V@H@M@M@N@t@F+ *+~@K@H@N@T@M@P@V@T@M@M@M@N@H@H@N@T@T@H@",
+" 4 )+|@X@T@V@T@T@V@T@T@T@T@M@d@p+ G.L+v@T@T@T@V@V@T@V@M@N@V@T@T@T@T@V@V@T@T@V@T@T@T@T@T@V@Y@Z@B+ l+d@M@T@T@T@T@V@T@T@V@V@T@T@V@T@T@V@T@H@V@V@T@V@T@T@T@M@d@l+ K+4@L@V@M@M@T@T@L@N@T@T@T@T@T@T@V@T@T@",
+" | `@d@V@V@T@T@T@V@T@T@T@T@T@O@|@`@ .+9@K@V@T@V@T@T@T@T@V@T@T@T@V@V@T@T@T@V@T@T@T@V@T@T@T@T@E@^@%+ z.D+o@T@T@V@T@T@T@T@V@V@T@T@V@V@V@V@T@T@V@T@T@T@V@V@T@T@A@]@ # n+e@O@V@V@T@T@T@T@T@T@V@V@T@T@V@T@V@",
+" A j+x@.#+#+#+#X@T@V@V@T@V@T@T@Y@:@,+ 3+_@L@@#T@T@.#.#+#@#.#T@.#+#+#T@V@T@T@T@V@+#+#+#T@##.#.#z@S+ k@%@K@T@V@T@T@T@V@.#T@@#+#X@V@.#.###+#.#+#+#T@##T@V@T@T@D@%@-+ A.I+x@P@##.#+#V@##+#+#+#T@T@T@T@T@T@",
+" &.y+B@.#.#.#.#.#.#.#.#####.#.#+#L@Z+ q+d@X@.#.#+#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#+#+#.#.#+#$###v@A+ :+)@M@.#.#.#.#.#.#.#@#+#.#.#+#.#.###.###.#.#.#.#.#.#.#.#G@R+ #+Z+L@%#.#####.###.#.#.#####.#.#.#",
+" b.H+A@.#.###.#.#.#.#.###.#.#.#.#.#B@U+ r.F+x@##.#.###.#.#.#.#.#####.#.#.###.#.#.###.#.#.#.#.#.#N@7@g+ &#e@T@.###.#.#.#.#.#####.#.#.#.#.###.#.#.#.###.###.#.#+#x@E+ )+{@P@.#.#.###.#.#.#.#.#.###.#.#",
+" v.c@M@$#.#%#.#.#$#.#X@.#$#@#.#%#$###v@s+ T.&@A@.#$#%#.#$#$#.#$#.#.#$#$#+###$#$#.#$#$#.#.#$#$#.#$#T@_@3+ x+x@%###+#$#$#.#.#%#.###$#$###.#$#.#$#.#.#.#$#+#+#$#$#+#s@r+ 7+e@##.###$#.#*#%###.#$#.#+#$#",
+" 1 T.;@+#$#$#$#$#$#$#$#.#$#$#*#$#.#$#$###f@a+ {+-@M@.#.#$#$#$#$#$#$#$#$#$#.#$#$#$#$#.#$#.#$#$#$#$#$#$#H@;@~+ S.@@Y@*#.#$#$#$#$#.#.#%#$#.#%#$#$#$#$#$#$#$#$#.#.#$#$#$#V@6@7+ u+n@+#$#$#$#$#$#$#$#$#$#.#$#",
+" : *+6@.#$#$#$#$#$#.#.#$#$###%#$#$#$#$#$#T@{@]+ 7+f@X@$#$#$#$#$#$#$#$#.#.#$#$#.#.#$#$#$#$#$#$#$#$#$#$#$#I@&@ *+~@M@$#.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%###$#$#.#.#$#$#N@,@~+ H.#@A@$#$#$#$#$#$#$#.#.#$#%#",
+" j.(+d@$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#Y@&@ r+o@.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$###v@x+ 3+8@+#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#L@@@ &+*@M@$#$#$#$#$#$#$#$#$#$#",
+" 6 8+p@$#$#$#=#$#$#=#=#$#$#$#$#$#$#$#$#$#$#$#D@-# A.D+G@%#$#$#$#=#=#$#$#=###$#$#;#$#$#=#$#$#$#$#$#$#$#$#=#X@f@># o+p@%#=#$#$#$#$#$#$#$#=#$#$#$#=#=#$#$#=#$#$#$#=#$#$#;#$#x@C+ }+_@X@$#$#=#$#$#$#$#.#$#",
+" D p+z@=#=#=#,#,#=#'#)#=#=#=#=#=#=#,#=#=#=#!#%#v@u+ W.;@+#=#=#=#,#,#=#,#,#=#=#'#'#=#=#,#=#=#=#,#=#=#=#=#'#!#+#|@K+ D.H+C@,#=#=#'#=#=#=#=#!#=#=#=#,#)#=#=#)#,#=#=#,#=#=#'#!#.#s@Y+ j+x@.#=#,#,#=#=#=#=#=#",
+" &.A+T@~#)#{#,#)#{#,#)#]#]#{#)#)#~#]#)#)#~#,#)#;#n@k+ 3+7@=#)#)#=#)#{#]#)#{#~#~#{#)#)#)#)#)#{#)#{#~#~#{#'#~#]#+#{@ ++*@##,#)#!#)#)#)#)#,#)#~#)#)#)#)#]#)#,#)#)#{#~#)#,#)#]#^#Q@8+ L+I@=#,#]#~#)#{#)#]#",
+" k.@@$#/#(#_#]#]#(#]#)#/#/#(#(#]#(#]#)#/#/#{#(#(#:#7@1+ q+D@~#_#)#(#(#/#/#(#(#/#]#]#/#]#]#]#(#<#]#[#/#(#/#]#_#]#N@>@ [+|@.#~#]#]#/#_#_#)#/#/#(#]#)#/#/#(#(#_#_#~#(#]#]#]#~#(#.#8@(+ W.}#@#)#/#/#]#(#(#/#",
+" G.,@'#/#_#/#_#_#_#_#/#_#_#_#_#_#_#_#/#_#_#_#_#_#_#%#;@ |#N@~#/#_#/#/#_#_#_#_#/#_#/#_#_#_#/#/#_#/#/#/#_#_#/#_#)#N@O+ g+x@!#_#_#/#_#_#_#/#_#/#_#/#_#_#_#/#_#_#_#_#_#_#_#/#_#/#.#;@ ]+5@'#/#/#_#_#_#_#",
+" W.6@~#1#2#_#_#3#4#/#_#3#1#3#_#_#2#_#_#3#3#/#/#_#2#(#5#R+ +;@##(#1#3#_#_#2#_#2#_#_#3#1#_#_#_#/#/#_#2#/#_#1#3#_#/#/#D@.@ J+O@/#_#/#_#_#_#_#3#3#_#_#2#/#_#3#1#2#/#_#1#3#/#_#_#_#_#N@ @ c+n@]#4#_#_#3#1#",
+" { )+x@6#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#6#1#O@C+ (+0@{#2#6#2#2#2#2#2#2#2#7#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#/#t@7+ T.!@;#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#1#M@F+ D+T@1#2#2#2#2#",
+" <.[+G@8#9#9#9#8#9#0#9#9#8#8#9#9#8#9#0#9#9#9#9#8#9#9#9#a#b#A@p+ n+A@/#c#0#8#8#8#9#9#9#8#9#9#8#9#9#d#9#9#9#9#8#9#9#0#9#9#(#r@ (+l@/#8#9#9#8#8#9#9#9#e#9#9#9#8#8#9#9#9#9#9#9#8#9#9#9#f#3#K@n+ P.*@'#8#8#9#9#",
+" %+l@_#g#h#i#i#h#j#c#j#i#9#j#h#0#k#j#i#h#i#j#0#h#h#i#i#j#1#E@7+ L+.#9#j#0#c#8#h#j#i#c#j#j#9#k#i#9#h#k#j#j#j#h#h#j#h#9#c#~#_@ j+Y@2#h#h#9#0#k#j#h#j#h#j#h#h#9#h#j#h#l#k#j#9#h#j#9#i#k#1#t@ ]+e@1#9#i#9#",
+" y+T@m#k#j#j#k#j#k#g#g#h#k#k#k#k#g#j#k#h#g#k#k#k#j#j#k#h#1#e@ -@)#j#k#k#j#k#j#k#k#k#g#k#k#i#k#k#h#i#i#g#k#h#g#k#j#k#i#,#`+ E+@#l#k#h#k#k#g#k#j#h#g#k#k#h#k#g#k#k#h#i#h#k#g#h#j#n#j#]#8@ o#Y@2#k#h#",
+" %@!#k#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#q#(#)@ /+l@2#p#p#p#p#p#p#q#n#p#p#p#p#p#p#r#p#p#p#p#p#p#p#p#p#p#c#%#D+ -@!#k#p#p#p#p#p#p#r#p#p#r#p#p#p#p#q#q#p#p#p#p#p#p#n#p#q#]#;@ h+%#c#p#",
+" %+8@_#n#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#q#,#R+ e+I@a#p#p#p#p#p#p#p#p#p#p#p#q#n#p#p#p#p#p#p#p#p#p#p#p#r#a#N@l+ {+d@3#q#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#p#n#q#p#p#p#h#;#S+ W+!#s#",
+" a+K@0#t#t#t#u#t#u#t#v#u#t#u#w#v#v#w#t#t#t#t#t#t#t#t#u#w#r#*#C+ M+=#x#t#t#w#v#v#w#u#t#u#t#t#t#t#t#t#t#t#v#w#u#t#w#u#w#w#a#A@ c+K@i#t#t#t#u#t#t#w#v#v#w#t#t#u#w#v#v#w#u#t#t#t#t#t#t#t#s#.#x+ T.y#e#",
+" F+;#z#A#B#B#B#B#v#C#B#B#u#B#B#u#u#B#B#B#B#B#B#B#B#B#B#B#q#X@ ,@2#w#D#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#B#B#B#B#v#B#B#u#u#9#l@ E+$#E#B#B#B#B#B#B#B#B#B#v#B#B#u#u#B#B#u#B#B#B#B#B#B#B#B#n#H@ Q.##",
+" *@7#F#G#G#H#G#G#H#I#G#A#J#K#H#J#G#I#G#G#I#I#H#K#G#I#K#I#k#E@ {+o@j#H#I#K#F#J#G#G#F#K#I#H#K#J#G#H#G#G#I#J#K#I#I#G#F#G#L#e#:@ U@M#L#G#J#H#J#G#H#I#G#G#H#K#J#F#G#G#A#G#H#I#J#K#G#I#G#H#h#y@ N#",
+" l@h#O#P#Q#R#S#S#R#R#S#S#R#S#S#S#K#S#R#Q#G#S#R#R#O#R#R#G#j#l@ e+T@E#G#P#R#R#R#O#S#R#Q#O#S#S#Q#S#S#R#O#S#S#S#T#R#S#R#U#A#1#Z+ l@q#O#S#Q#S#S#S#T#R#S#Q#R#O#S#R#O#S#S#Q#O#S#R#Q#O#S#R#J#i#5@ ",
+" 8+J@z#V#W#W#U#X#Y#W#W#X#U#W#Z#W#R#Z#X#Y#`#W#W#X#W#W#W#Y#G#6#,@ E+{#L#R#X#X#U#S#Z#X#W#X#X#W#W#U#W#X#Y#W#W#Y#`#W#W#X#W#S#J#)#A+ 7+T@t#Y#W#W#W#W#W#W#U#Z#W#R#Z#Y#S#Z#X#W#W#Z#Y#Y#W#W#X#Y#I#6#*@ ",
+" x+=#L#Y#Z#X#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $I#/#c@ >@e#O# $Z#X#Z#Z#Z#Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z# $.$@# F+)#H# $Z#Z#Z#Z#Z#X#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#Z#+$I#@$-# ",
+" %@6#R##$$$%$%$&$%$%$&$#$$$#$%$&$%$%$%$%$%$%$%$#$$$%$%$#$G#{# p@v#*$&$&$&$&$%$%$&$%$%$%$%$%$%$%$%$&$%$%$$$#$%$&$&$#$*$w#=$ -@9#Y#*$%$%$%$$$#$%$&$$$#$&$&$&$%$%$#$$$%$%$%$%$%$%$%$#$G#$# ",
+" d@x#*$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$$J#@# a+@#G##$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$-$;$i@ o@x#*$>$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$#$A#M@ ",
+" T@F#,$,$'$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$>$,$,$&$L#D@ E+/#X#>$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$,$>$,$,$,$,$,$,$,$*$h#{@ 8+@#O#,$)$,$'$,$,$>$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$'$!$$$v#B@ ",
+" s+]#~${$]$^$]$^$^$]$^$^$^$)$]$)$)$)$]$)$)$]$)$)$]$^$]$/$>$w#f@ ;@($>$]$]$^$]$)$^$]$)$)$]$)$)$]$^$/$/$]$]$]$]$]$^$]$]$)$~$9#S+ z+_#X#_$^$]$]$]$]$]$^$]$]$]$]$^$)$)$]$)$)$^$/$)$]$]$]$)$>$w#:$ ",
+" ^@g#>$<$[$<$[$<$[$[$}$[$^$[$<$<$]$<$<$^$|$<$]$1$[$}$}$}$'$p#;@ v@F#)$<$[$[$}$[$}$}$}$<$<$]$|$1$}$<$|$<$|$}$|$<$[$|$]$]$*$]# >@j#&$]$[$<$<$[$|$<$}$[$<$|$<$2$}$<$<$<$<$<$}$<$[$<$]$|$,$q#%@ ",
+" l@B#]$|$3$|$4$3$5$3$3$5$5$|$4$3$|$3$5$3$3$3$3$3$|$|$|$3$!$e# ##Y#<$3$5$6$5$|$3$3$|$4$3$3$3$6$|$3$6$|$|$3$|$3$3$3$5$<$7$^# l@J#8$5$6$|$5$3$|$[$3$3$3$|$5$9$6$4$3$|$5$3$|$5$|$3$0$|$$$2# ",
+" N@X#5$a$a$a$a$a$b$b$a$a$a$b$a$3$b$a$a$a$a$a$a$a$a$a$a$0$>$/# y+2#>$c$a$a$a$a$a$a$9$a$a$a$a$a$a$b$a$a$a$b$b$a$d$a$a$d$5$Y#H@ .#X#3$d$a$b$a$a$a$a$a$a$a$a$b$b$a$a$b$3$b$a$a$b$b$a$a$9$&$@$ ",
+" v+4#>$a$a$d$a$a$a$d$a$a$a$e$b$a$a$b$a$f$b$a$a$d$a$e$d$a$5$~$%# g$p#]$a$e$b$a$a$d$a$e$a$a$9$a$a$e$d$a$a$a$a$a$a$e$a$a$e$h$F#7@ .@4#>$9$b$e$a$d$a$a$a$a$a$a$a$a$a$a$a$a$a$a$9$a$b$e$d$a$c$ $T@ ",
+" Z+x#}$d$i$j$j$k$l$l$j$l$i$j$k$l$j$l$l$j$l$l$m$j$i$j$m$n$a$S#A@ p@T#e$i$l$m$l$o$j$i$j$l$l$o$k$i$j$m$l$l$j$j$l$i$l$m$i$l$5$w# !@u#|$d$i$l$m$m$l$j$k$j$i$i$k$l$l$j$l$j$k$l$l$m$i$o$n$o$b$O#x@ ",
+" d@S#d$p$p$q$p$i$p$p$r$r$p$s$p$p$p$p$p$p$p$q$q$p$p$q$p$l$b$O#7@ $#t$j$q$p$p$p$s$p$s$p$p$p$p$i$q$s$u$p$r$r$p$p$q$p$p$p$p$|$j# i@W#d$v$p$s$s$p$p$s$p$i$r$p$p$p$s$p$r$p$p$p$p$p$p$s$s$l$e$w$/@ ",
+" +#%$j$x$y$p$p$x$s$p$s$z$s$z$s$r$s$s$x$p$u$q$s$x$z$s$p$s$b$z# 1#}$s$p$q$s$s$s$s$x$p$x$r$p$s$x$x$q$y$s$p$x$z$q$q$s$A$p${$B$ @#$$k$r$z$s$p$x$s$q$p$u$s$q$q$x$q$x$s$p$x$p$r$p$z$s$q$u$4$q# ",
+" (#}$z$C$C$C$D$C$C$C$D$E$F$C$C$C$C$F$C$F$C$C$F$F$C$C$F$C$0$c# ^@u#m$z$C$C$C$C$E$D$C$F$C$C$C$E$E$C$G$E$C$G$D$E$C$C$C$C$s$_$$# 2#[$z$C$E$E$D$E$E$C$H$C$E$C$C$C$C$G$C$C$C$C$C$C$E$C$C$x$4$i# ",
+" S+t#j$F$I$I$I$I$J$I$J$I$I$I$J$I$J$J$J$I$J$I$I$J$I$I$J$I$F$c$/# o@Z#q$K$L$I$J$J$J$J$J$I$J$I$J$I$J$I$J$J$J$J$J$I$J$I$I$K$x$$$Y@ @w#k$L$J$J$J$I$I$I$J$I$I$F$I$I$I$I$J$J$J$I$I$I$J$I$I$I$F$5$B$ ",
+" 6@W#x$J$J$M$M$N$I$O$O$O$O$O$O$O$M$O$O$O$M$M$O$O$J$O$O$O$H$P$.# $#)$Q$O$O$M$M$O$O$O$O$M$O$O$M$M$O$O$J$O$M$O$I$O$O$O$O$I$x$W# i@X#A$O$J$O$M$O$I$O$M$O$O$M$O$O$O$O$O$O$O$O$O$O$O$O$M$O$E${$T@ ",
+" +#)$D$O$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$R$O$R$R$R$M$z$$$z@ e#0$J$R$R$R$R$O$R$R$R$R$R$R$R$R$R$M$S$R$R$R$R$R$R$R$R$S$q$F# .#}$K$R$R$R$R$M$R$R$R$R$R$R$R$R$O$R$R$R$R$R$R$R$R$R$R$M$z$~$ ",
+" T$U$R$V$W$V$V$W$X$V$W$V$W$V$W$V$R$V$V$Y$W$V$Z$W$V$V$Z$W$Q$P# @L#u$Y$V$W$V$W$Y$V$W$X$V$V$V$W$V$Y$W$V$W$V$V$W$V$V$V$W$M$i$n# 8#j$X$Y$V$V$Y$V$Y$V$V$V$Y$W$W$V$R$W$V$Y$X$V$V$W$W$V$W$Y$A$K# ",
+" w#`$Y$ % %Z$Z$Z$ %V$ %.% % % %Z$ % %V$+% %V$+% % %V$ %V$x$u# d@@%#% %Z$ %V$ % %V$Z$V$ %$%V$ %V$Z$.%V$ % %.% % % % %%%Y$d$&% u#`$X$ % %V$V$ % % % %.%V$ % % %V$ %Z$Z$ % %Z$V$ %V$$%W$q$*% ",
+" |@U#K$=%-%=%$%;%>%-%>%>%>%>%>%>%-%;%;%-%>%.%;%-%$%=%-%>% %v$k# V@3$+%,%;%;%-%>%;%>% %>%,%;%;%$%$%-%;%$%-%;%>%$%;%>%-%>%+%5$+# f@%$J$=%=%=%$%;%$%$%$%>%;%>%>%;%;%;%>%-%;%-%>%-%-%$%;%'%Z$k$a# ",
+" I@5$W$>%)%!%!%~%!%{%!%]%{%!%!%^%{%^%^%!%!%~%^%!%^%^%!%^%Z$m$/# /%q$ %(%!%{%^%!%!%^%!%(%]%^%!%^%^%!%^%!%!%^%!%!%!%{%!%;%R$)$ +#9$Z$>%_%]%^%^%(%(%^%^%!%!%(%~%!%!%^%{%!%:%^%!%!%^%{%^% %d$<% ",
+" _#k$-%:%:%:%[%:%[%~%[%[%[%:%[%:%[%~%:%~%~%:%:%~%:%:%[%~%}%a$ J#K${%[%:%[%[%:%[%~%[%~%~%:%~%:%~%[%:%[%[%[%:%[%~%[%:%!%R$~$ |%k$-%~%~%[%[%[%1%[%[%:%[%~%[%:%1%[%~%[%:%~%~%:%~%:%[%^% %5$ ",
+" x#F$^%[%[%[%[%[%2%[%[%2%[%[%2%1%[%2%[%2%[%1%[%[%[%[%[%[%Z$,$ 5@$$W$:%1%[%2%[%[%2%2%[%[%1%2%[%[%[%[%[%[%[%[%2%[%[%2%[%!%I$F# u#F${%1%[%[%[%[%[%[%[%2%[%[%[%2%[%2%2%1%[%[%2%3%[%[%[%~%Y$>$ ",
+" *$4%5%6%6%6%6%6%2%6%6%6%6%6%2%6%6%2%6%6%2%6%6%6%6%6%6%7%R$U# V@8%9%5%2%6%6%6%6%2%6%6%2%6%6%6%6%6%6%6%6%6%6%6%2%6%6%5%0%u$k# a%V$5%6%6%6%6%6%6%6%6%6%2%6%6%6%6%2%6%6%6%2%6%6%6%6%6%7%b%T# ",
+" A@c%d%5%e%f%6%g%h%6%g%g%i%f%i%g%6%6%f%i%6%g%f%6%g%g%6%j%k%l%m% _#n%o%6%p%g%e%6%g%g%f%6%i%g%6%e%f%6%j%f%6%g%g%g%6%i%q%6%r%s%)# O@t%u%6%i%g%f%6%v%g%f%i%q%6%f%h%f%f%g%g%6%6%i%6%e%g%6%6%w%x%y% ",
+" z%A%B%v%C%C%e%D%C%C%e%v%E%F%e%e%G%e%e%e%v%F%e%v%C%F%q%i%H%I%J% K%L%M%g%v%F%F%C%g%f%v%e%v%v%C%v%g%v%v%F%C%i%C%C%f%F%q%N%O%c% P%s%o%i%C%F%e%F%C%v%e%F%C%F%v%Q%F%f%e%e%e%R%g%C%C%e%e%v%S%T%U% ",
+" V%W%X%Y%Z%`%`%Z%`%Z%`% &Z%`%Z%`%`%Z%`%Z%`%Z%`%`%`%`%C%Y%.&+& @&#&$&%&Z%Z%`%Z%`%Z%Z%%&`%C%Y%Z%Y%`%`%Y%&&*&`%Y%`%Z%Z%v%=&-& K%;&>&Y%,&Z%Z%Z%C%`%C%Z%`%`%Z%Z%Y%`%Z%Z%Y%Y%Y%`%Z%Z%Z%Y%B%'& ",
+" )&!&~&{&]&{&^&]&]&^&^&]&^&^&]&/&]&^&]&/&]&^&^&^&/&]&^&(&_&:& <&[&}&|&^&^&^&]&^&/&/&]&^&]&^&]&^&^&^&/&]&^&/&]&^&^&^&]&1&2&3& 4&5&6&(&/&^&^&]&]&]&^&^&/&^&^&]&^&^&]&]&^&/&^&]&]&^&^&(&_&7& ",
+" 8&9&_&0&]&/&]&]&]&a&a&/&a&a&]&]&]&a&a&]&]&a&a&]&]&/&]&]&(&b&c& d&e&f&]&a&]&]&a&/&/&]&]&a&a&/&a&a&/&/&]&]&]&]&a&a&]&/&a&g&h&i& j&k&l&m&]&a&]&]&]&]&]&]&a&a&]&]&a&a&]&]&]&a&a&]&]&a&]&]&n&o&p& ",
+" q&r&f&]&a&a&a&s&a&a&t&a&a&a&a&a&a&a&a&a&]&a&a&a&a&a&a&a&(&u&v& i&w&n&]&a&a&a&a&]&a&a&a&a&a&]&a&a&a&a&a&a&t&a&a&a&t&a&x&y&z& A&B&f&]&/&a&a&a&a&a&a&t&a&C&a&a&a&a&/&a&a&C&a&a&D&a&a&]&n&E&F& ",
+" G&H&I&t&J&K&t&t&K&K&t&t&J&L&M&K&J&s&L&J&t&M&L&L&t&t&t&N&O&P&Q& R&S&O&J&K&K&K&K&J&L&M&t&s&K&N&L&L&t&T&K&t&t&t&K&N&K&K&U&V&W& X&Y&Z&N&K&J&M&t&L&L&t&t&K&t&J&N&K&K&K&L&K&t&N&K&L&J&t&t&Z&`& * ",
+" .*+*@*#*K&#*K&#*J&$*%*J&#*$*#*J&#*$*#*%*$*$*$*J&K&#*J&$*&*** =*-*J&#*#*#*#*#*$*;*%*J&#*#*#*$*>*J&#*$*J&$*J&#*#*J&J&,*'*)* !*~*{*J&#*#*%*J&J&#*$*K&J&#*J&J&#*#*$*L&#*J&J&J&J&#*$*]*^*/* ",
+" (*_*:*$*<*[*[*}*[*$*$*}*<*$*$*<*$*}*$*$*$*[*}*#*<*#*[*:*|*1* 2*/*3*:*[*$*#*<*$*$*[*:*[*[*}*#*<*[*$*}*:*[*$*<*[*:*}*4*%*5*6* 7*8*:*$*<*$*}*$*<*[*[*}*[*#*:*<*$*$*[*<*$*[*}*#*}*$*9*%*|*0* ",
+" a*b*c*:*d*<*e*f*<*<*<*f*d*e*<*f*e*g*<*<*<*d*f*<*f*<*<*f*:*h*i* j*k*l*e*<*<*d*<*<*d*g*<*<*d*<*f*d*<*<*g*<*<*d*<*g*f*d*<*:*+*m* n*o*c*p*d*<*d*<*<*<*<*f*<*<*g*f*<*<*g*f*e*<*f*<*g*<*<*<*q*_*r* ",
+" s*t*u*f*v*v*w*x*x*x*w*x*v*w*w*v*x*f*y*y*x*v*w*y*v*v*y*w*z*A*B* C*D*E*x*w*x*v*x*f*x*x*y*x*w*w*x*y*y*v*F*w*w*x*v*w*x*v*w*G*t* H*I*J*f*x*x*w*w*x*w*w*F*v*v*w*x*v*d*w*v*w*K*w*w*x*x*w*L*M*D*N* ",
+" ). O*P*z*v*Q*R*v*F*w*x*S*v*x*Q*S*S*v*T*Q*v*x*v*Q*x*T*U*V*W*X*Y*Z* `* =g*x*U*x*x*.=Q*S*v*Q*x*S*F*F*S*v*S*v*Q*x*y*x*U*v*F*W*G*+= @=#=$=F*Q*v*S*U*x*Q*S*v*w*Q*.=x*x*U*S*v*Q*v*S*x*v*v*U*%=&=*=== ",
+" [.-= ;=>=,=S*'=S*Q*S*'=)=U*S*)=S*)=U*'=)=S*'=U*!=S*)='=S*S*v*~={= ]=^=/='=Q*S*U*S*'=S*'=S*)=Q*Q*)=U*)=S*'=Q*S*'=!=S*Q*)=v*(=_= :=<=[='=}=)='=S*!=S*Q*Q*)=Q*S*S*!=S*!=!=Q*!=U*!=S*Q*'=|=1=2= ",
+" '+3= 4=5=}=!=6=7=6=6=6=7=7=6='=7=!=6='=8=7='='=7=7=9='=6=6=0=a=b= c=d=e=6=f=7=!=!=6=!=7='=g=6=h=!='=!=6='=6=6=h=7=7=7=6=!=i=j=k= l=m=!=6='=6=7='=7=h=!=7=7=7='=6=!=n=6=o=n=6=6='=!=6=p=.=q=r= ",
+" C+s=l= t=u=v=w=x=y=6=7=x=z=7=x=x=A=p=z=B=w=A=x=z=C=D=x=x=A=x=7=E=F=G= H=I=J=w=x=6=x=A=7=A=z=K=w=w=x=p=A=x=7=x=x=6=x=w=L=7=x=M=N=O=P= Q=R=S=z=T=B=x=6=C=x=6=x=z=x=6=w=w=T=x=z=K=x=A=z=x=x=A=w=/=U=V= ",
+" ]@W=X=Y= Z=`= -M=.-A=A=+-A=A=+-@-.-M=+-#-$-.-.-+-$-$-@-+-.-A=+-M=%-&-*- =---E=A=A=.-.-A=.-.-+-$-.-.-M=.-+-;-+-y=A=+-+-A=M=.-.-w=>-,- '-)-!-M=+-+-+-~-y=M=+-+-A=A=+-@-+-+-.-+-+-@-.-+-+-{-.-]-^-&-/- ",
+" s@(-_-:-<- [-}-|-.-.-1-1-.-1-1-.-1-.-.-.-.-.-@-.-1-.-.-1-.-.-1-1-.-2-3- 4-5-6-.-7-1-.-@-.-.-.-.-.-7-.-1-.-1-.-1-1-.-.-8-9-1-.-+-0-a- b-c-d-.-1-1-1-.-@-1-.-1-.-7-.-7-.-@-.-.-.-.-1-.-7-.-1-@-2-e- ",
+" f-g-h-6-i-j-k- l-m-n-1-1-8-o-8-8-p-p-p-p-p-p-p-p-q-p-p-8-1-1-p-1-8-o-@-r-s- t-u-v-$-8-p-p-p-p-p-p-p-1-p-q-o-.-1-1-1-1-p-1-1-o-p-p-w-q-x-y- z-A-9-o-1-1-1-1-1-p-p-q-1-p-p-p-p-p-p-p-o-o-8-p-.-1-1-@-r-B- ",
+" 6.C-D-E-F-G-H- I-J-K-F-F-F-F-F-F-F-F-F-L-F-F-M-F-F-M-F-F-M-F-F-F-F-F-N-O-P- Q-R-S-w-F-F-F-M-F-F-M-F-F-M-M-F-M-F-F-F-F-F-F-F-F-F-F-M-N-T-U- V-W-w-F-F-F-F-F-F-F-F-F-F-F-F-M-F-F-F-M-F-M-M-F-F-M-F-K-X-Y- ",
+" Y.Z-`- ; ;.;+;@; #;$;%;&;*;M-=; ; ; ;=;=; ;-;=; ;=; ;M- ; ; ;M- ; ;M- ; ;E-;;>; ,;';); ; ; ; ; ;M- ; ;=; ;M- ; ;M- ;!; ;L- ; ; ; ;=; ;~;{;];C- ^;/;(;&;_; ;M-!;=;-; ; ; ; ; ; ; ;M-M- ; ; ;M- ; ; ;M-!;:;<;[; ",
+" B+};|;1;1;2;_;3;4; 5;6;7;!; ;1;!;!;!;!;=;!;8;=;!;1;!; ;!;1;!;!;1;!; ;!;1;_;9;0;a; };b;c;1; ;!;d;1; ;1;1;!;!;!;1;!;1;8; ;!;1;!;1;!; ;!;8; ;e;f; g;h;i;j;k;1;8;1;1;!;!;1;d; ;!;1;l;M-!;!;1;1;1;1;!;!;l;_;i;m;n; ",
+" q@o;p;8;q;r;s;t;u;v; w;x;y;z;A;z;s;8;r;r;8;8;s;r;l;s;r;l;r;s;B;l;8;r;8;A;r;C;D;E; F;G;_;s;B;8;l;s;l;r;s;s;8;H;B;A;8;r;s;l;s;l;s;s;B;8;I;J;K;L; M;N;O;P;P;8;s;l;z;r;s;8;s;B;8;l;s;8;s;r;r;8;A;s;s;l;s;l;Q;R; ",
+" N+S;T;U;V;W;W;W;X;Y;Z; `; >.>+>@>W;W;+>+>W;r;U;+>W;W;#>+>V;W;W;+>W;W;W;+>W;W;W;$>%> &>*>=>->W;W;q;U;W;W;#>#>W;W;W;@>W;W;+>@>W;W;W;U;W;W;q;W;J;;>>> ,>'>)>!>W;W;+>U;+>W;U;W;W;W;s;W;W;W;V;V;W;+>W;W;+>W;W;->~>*> ",
+" |@{>]>^>/>/>(>^>_>:><> [>}>|>1>/>_>/>(>^>2>#>^>1>/>/>2>(>/>/>^>/>/>3>^>/>/>/>4>5>6> 7>8>9>/>1>_>V;1>/>_>/>1>_>/>^>^>_>^>^>(>(>/>/>^>^>_>(>^>0>a>b> c>d>e>|>^>/>^>/>/>2>/>_>3>^>1>#>^>f>/>(>^>/>/>(>^>/>1>^>4>g>h> ",
+" i>j>k>1>1>^>^>1>^>l>m>n> o>p>q>r>^>^>^>^>1>1>1>1>^>1>^>^>1>1>^>1>^>^>1>1>^>1>^>3>s>t>u> v>w>x>1>^>1>^>1>1>^>^>^>1>^>1>^>^>1>^>^>1>^>1>^>^>^>^>(>y>z>A> B>C>:>r>^>1>^>^>(>^>2>^>^>2>1>^>1>^>^>1>^>1>^>1>^>^>1>^>D>E>*$ ",
+" F>G>H>I>J>J>I>J>K>J>/>L>M> N>O>P>^>3>^>K>^>I>I>1>I>K>I>J>J>I>K>^>I>J>^>K>K>^>3>I>3>Q>G>R> S>T>U>J>^>J>J>J>J>I>J>I>1>K>J>1>V>J>2>1>K>I>^>J>^>J>K>^>W>X> R>Y>D>J>^>^>I>^>(>I>^>^>K>I>^>I>J>K>J>K>I>^>Z>J>^>^>J>3>`> ,., ",
+" O.+,@,#,$,%,%,&,*,=,-,;,>,,,', ),!,>,%,%,*,*,*,$,~,*,%,$,$,%,;,*,*,&,%,%,$,*,*,%,%,-,J>{,], ^,/,(,-,*,;,%,;,*,%,~,-,$,=,;,%,%,;,%,-,*,$,*,~,~,%,*,J>_,:, <,,,[,-,%,~,*,%,*,~,*,%,~,%,*,%,%,*,%,%,},-,I>*,%,$,~,|,{,1, ",
+" 2,3,4,5,6,5,7,5,8,5,5,6,9,0,a,b, c,d,#,5,e,8,e,6,7,e,5,e,e,5,5,8,e,8,9,5,6,e,8,5,e,8,e,f,g,h, i,j,k,l,8,7,7,7,e,5,7,m,e,5,e,5,e,7,7,e,e,6,8,9,6,7,8,5,n,4,o, p,q,r,5,e,e,7,8,5,e,8,s,l,e,5,5,e,7,5,5,8,5,8,7,6,6,7,f,t,u, ",
+" v,w,x,y,z,y,z,z,A,z,9,z,z,B,C,D, E,F,G,H,I,z,J,z,7,z,y,K,L,z,z,A,z,z,B,L,z,y,z,A,L,z,y,I,f,M,N, O,P,Q,y,y,z,z,z,z,y,L,z,z,J,z,J,z,z,z,y,z,z,9,y,y,A,y,L,R,S,T, U,V,G,B,A,y,z,z,9,z,y,L,y,y,z,z,z,z,L,y,z,z,J,z,z,y,z,I,W,X,Y, ",
+" -#Z,`,A, 'z, ' ' ' '.' ' '+'z,@'#' $'%'&'*' 'z, 'z, 'A,='+' ' ' ' ' 'z, ' 'A, ' '+' 'A, 'z,-';'>' ,''')'z, ' ' ' ' ' ' ' 'z, 'z, ' ' 'A, ' 'z,A,A, 'A, '.'!'~' {']'^'A,A, ' '*' 'A, 'A,A, ' ' ' ' ' ' ' 'z, ' 'A, ' 'z,/'('_' ",
+" [@:'<'['}'|'|'}'}'|'1'}'}'|'2'3'4'5' 6'7'8'|'|'}'|'}'|'}'}'}'}'}'}'|'1'}'|'|'}'9'}'}'|'|'|'|'8'0'a' b'c'd'}'}'|'}'|'}'|'}'1'|'}'|'9'}'|'|'|'|'}'}'|'}'}'}'e'f'g' h'i'j'|'}'}'}'}'}'|'|'|'}'}'}'|'|'}'|'}'1'}'|'}'9'}'|'2'k'l' ",
+" m'n'8'1'1'1'1'}'1'}'|'1'1'1'1'1'o'p'q' r's't'|'1'|'1'1'1'1'1'1'}'1'1'|'1'1'1'1'1'1'u'v'w'}'1'x'y'z' A'B'9'1'1'w'}'1'w'}'}'u'u'1'1'u'1'1'C'}'1'1'1'1'1'1'}'D'E'F' G'H'I'w'1'}'1'|'1'}'w'1'1'1'1'1'['u'}'|'1'1'1'1'1'1'1'e'J'K'",
+" L'M'N'O'P'1'P'Q'O'P'1'R'O'u'Q'S'T'U'V'W' X'Y'Z'Q'P'Q'`'O'Q'R'O'P'Q'Q'u'P'Q'u'P'Q'P'1'P'P'P'Q'Q'x' ).) +)@)k'P'Q'O'`'P'Q'Q'P'O'`'P'Q'Q'1'P'#)u'Q'1'Q'P'Q'R'P'$)%)H'&) *)B'x'$)u'P'Q'O'P'=)u'Q'P'P'P'`'-)Q'u'O'Q'u'P'Q'w'P'P';)>)",
+" ,)')))!)~)~){)])^)/)(){)_)_)])/)~){):)<) [)})|){)1)~)/)1)2)~)_){)/)/)1){)3)/)/)~){)4){)3)1)~){)1)5)6)7) 8)9)N'{)_)1){)/)0){)1)~)/)a)/)$){)1)/)~){)!){)$)1)/)/)1)b)c)d) e)f):){)]){)3)1){){)1)g)~)1)3)1)1)0)1)1)/)]){){)a)1)/)!)h)",
+" i)j)k)l)m)0)n)_)o)p)q)1)r)p)g)m)m)n){)s)t) u)v)w)^)q)p)r)^)x)r)q)!)p)m)1)m)l)p)1)m)q)n)l)q)q)p)p)_)5)y)z) A)y)B)p)m)1)p)l)1)/)^)p)/)^)q)p)r)m)^)p)p)m)^)r)m)m)p)n)C)D) E)F)G)m)l)l)H)1)l)p)p)q)p)m)1)H)l)/){)!)o)^)^)q)p)p)p)/)",
+" I)J)K)n)L)M)p)M)p)M)N)!)O)N)N)p)M)M)N)M)P)Q)R) S)T)U)M)M)M)N)V)N)p)M)M)o)O)M)M)N)O)M)M)N)M)N)M)N)N)M)p)W)X)Y) Z)`)P)p)p)N)M)p)V)M)M)p)N)N)N)M)M)M)M)M)M)M) !O)N)N)M)^).!+! @!#!$!p)M)M)M)M)M)M)M)M)O)m)N)M)p)p)M)M)p)N)M)N)N)M)M)",
+" %!&!*!=!-!;!;!=!=!=!=!=!=!=!=!=!=!M)=!=!=!k)>!,! '!)!!!=!=!=!=!=!;!=!=!=!=!=!=!=!=!L)M)=!=!=!N)=!=!=!=!N)~!{! ]!^!/!=!=!;!=!=!N);!=!=!=!M);!;!M)=!=!=!=!=!=!=!=!=!=!(!_!:! <!Q)P)N)=!=!M)=!=!=!=!=!=!=!=!=!=!=!N);!=!;!M)=!=!;!",
+" [!}!|!-!-!=!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!1!2! 3!4!N)-!=!-!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!5!6!7! 8!9!0!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!=!-!-!-!a!b!)!c! d!6! !-!-!=!-!-!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!",
+" e!f!g!h!i!j!j!k!j!j!l!-!j!l!l!j!j!m!l!-!l!k!-!n!o! p!q!r!s!i!j!m!t!j!j!-!j!t!j!j!j!i!i!-!j!i!j!t!i!j!t!i!j!u!v!w! x!y!z!t!j!-!j!l!k!-!j!i!a!A!k!j!j!i!i!i!B!j!j!j!l!-!j!l!C!D!E! F!G!H!k!i!j!i!m!j!j!l!-!j!j!-!t!j!I!l!J!k!l!-!m!K!",
+" L!M!N!O!m!P!Q!P!s!R!R!R!Q!Q!R!Q!m!R!R!m!P!R!R!B!S!T! U!V!W!P!R!Q!s!R!X!m!Q!Q!P!R!P!Q!R!Y!P!Q!R!s!P!R!P!P!s!Q!Z!`! ~ .~+~I!m!i!R!@~#~Y!$~P!Q!k!R!Q!Q!P!s!R!R!Y!R!%~R!#~P!Q!s!&~*~ =~-~C!Y!Q!R!m!P!Q!P!m!O!Q!P!Q!Q!P!R!R!R!R!i!k!R!",
+" ;~>~,~'~'~)~!~~~'~'~O!'~)~)~)~{~%~{~'~'~Q!'~]~%~^~/~(~ _~:~<~{~%~{~)~)~R!~~)~'~[~'~)~{~{~O!'~}~O!)~'~'~O!{~~~'~|~1~ T!2~P!'~3~)~[~!~R!{~~~)~)~~~4~R!{~)~{~{~}~{~)~'~O!'~)~5~6~7~ 8~9~^~}~)~'~O!)~O!R!!~)~!~{~)~'~{~%~)~)~!~#~4~",
+" 0~1~a~b~c~d~c~e~f~e~e~g~e~e~c~c~f~c~e~e~c~e~[~b~e~h~i~j~ k~l~m~g~c~e~e~e~e~e~c~c~f~c~n~g~c~c~o~e~b~e~p~e~c~d~e~o~q~r~ s~t~u~{~p~n~c~f~c~c~e~b~c~v~f~e~f~d~c~c~d~w~d~e~e~b~f~x~y~z~A~ B~C~D~n~c~e~e~e~e~e~d~e~c~e~c~c~f~f~o~e~c~f~",
+" E~F~G~H~I~I~J~I~I~J~I~I~I~I~I~I~I~I~c~c~I~I~f~I~I~K~L~M~ N~O~P~I~I~I~J~I~J~J~I~J~I~c~f~I~I~Q~c~I~I~I~I~J~I~J~I~K~R~S~ T~U~,~J~J~I~I~I~I~c~Q~I~I~I~I~I~J~I~I~I~I~J~I~I~I~I~I~I~D~V~W~ t~X~K~I~I~I~I~I~J~I~I~I~J~I~I~I~I~Q~f~J~J~",
+" Y~Z~`~J~ { { { { { { {I~ { { { { { { { { {I~ { {I~ { {.{+{@{ #{${%{J~ { {I~ { { { { { { { {c~ { { {I~ { { { { { {H~ {d~&{*{ ={-{m~ { { {J~ { {J~H~ { {I~ { { { { { {I~ { { { { { { {;{>{ ,{'{){.{ { { { {!{~{ { { { { {I~ { { {c~ {",
+" {{]{^{/{!{/{/{!{/{!{/{/{!{!{!{!{!{/{!{!{/{/{!{!{!{!{/{({_{:{ <{[{}{/{/{!{!{/{/{/{!{!{/{/{/{!{!{!{!{!{!{!{!{!{/{/{!{|{1{2{3{ 4{5{^{/{!{!{/{!{/{!{/{!{/{!{/{/{!{!{/{!{/{!{!{!{!{/{!{|{6{7{ 8{9{0{|{!{!{!{!{!{/{/{!{!{/{!{!{/{/{!{!{",
+" a{b{c{d{e{f{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{({g{h{ i{j{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{l{m{ n{o{|{d{d{d{d{d{d{d{d{d{d{f{d{d{d{d{d{d{d{d{d{d{d{d{d{p{q{r{ s{t{({u{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{",
+" v{w{x{y{y{y{y{y{y{z{y{y{y{y{A{y{y{A{y{y{B{z{y{y{y{y{y{C{D{E{F{ G{H{I{y{y{y{y{y{J{y{J{A{y{K{y{y{y{y{y{y{y{y{y{z{y{y{y{z{L{M{ N{O{P{Q{y{y{y{z{C{y{y{y{y{y{y{y{y{y{z{y{y{y{y{A{y{y{y{z{R{S{T{ U{V{R{J{J{y{y{A{y{y{y{A{y{y{J{z{y{C{",
+" W{X{Y{Z{K{K{`{ ]Z{K{`{K{`{.]`{+]Z{`{Z{@].]K{Z{#]K{ ] ]@]$]%] &]*]=]C{`{K{-];]`{-]-]K{`{K{@]K{-]`{K{`{K{@]`{K{#]K{`{Z{C{>],] '])]x{@]-]`{;]K{.]K{#]@]K{ ]C{`{`{.]+]K{;]-]K{@].]`{`{K{!]~]{] ]]^]/]C{-]`{+]Z{`{K{-]@]K{-]`{-].]K{",
+" (]_]:]<]<][]<]<]+]<]<]}]|][]-]-]<]-]@]<]<]+]<]<]<][]<]Z{1]2] 3]4]5]6]<]Z{+]<]7]+]<][]K{<]<]-]}]<][]<]<][]-]<]<][]Z{8]C{9]0] a]b]c]@][]<]@]+]<]<]<]<][]<]<]<]<]+]<]+]-]<]<]|][]<]@]|]d]e] f]g]h]-][][]Z{[]<]-]}]<]@]<]<]+]K{",
+" i]j]k]l]m]m]m]m]m]n]m]n]m]n]n]n]n]n]n]m]m]m]m]m]n]m]m]m]l]o]p] q]r]s]n]n]m]m]m]m]n]m][]m]m]n]n]n]n]m]m]m]n]m]m]m]n]n]t]u]r]v] w]x]y]m]m]n]m]n]n]m]m]m]m]n]m]m]z]m]m]n]n]m]m]m]m]n]m]n]A]B] C]D]E]n]n][]n]m]n]n]n]F]n]m]m]n]",
+" G]H]I]J]K]K]K]L]K]K]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]K]M]N]O]P] Q]R]N]S]K]m]K]K]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]K]n]K]J]T]U] V]W]X]K]K]K]K]K]K]K]K]K]K]K]K]L]K]K]K]n]K]K]K]K]K]K]K]n]W]Y] Z]`] ^K]L]K]K]K]m]K]K]K]K]K]K]",
+" .^+^@^K]L]K]m]L]L]L]L]L]L]L]L]L]K]K]L]K]L]L]L]L]L]L]n]M]#^$^%^ &^*^=^L]L]L]L]K]L]m]L]L]K]L]L]L]K]L]L]m]-^L]L]L]L]L];^K]>^j] ,^'^)^!^-^-^L]L]L]L]L]K]L]L]K]K]L]L]L]L]L]L]L]L]K]~^L]L]{^]^^^ /^(^S]K]L]L]L]L]L]L]L]K]K]K]",
+" _^:^<^[^[^}^[^|^1^|^1^L]|^1^1^}^|^|^L]1^2^|^1^1^|^}^[^1^y]3^ 4^5^6^L]1^2^1^1^|^L]1^L][^1^2^|^1^[^|^7^[^|^1^|^1^L]1^1^M]8^9^ 0^a^b^c^1^2^|^2^1^c^1^[^|^[^}^[^1^|^1^1^;^|^1^1^7^2^|^c^b^d^e^ f^g^h^i^j^[^2^|^[^L]1^1^1^c^",
+" k^l^m^n^o^o^p^p^q^r^r^o^q^p^r^o^o^o^s^o^o^r^o^p^o^o^p^t^u^v^ w^x^y^[^r^p^r^o^o^r^o^o^[^o^o^o^o^p^o^o^p^p^p^q^r^p^r^p^i^z^A^ B^C^D^t^o^o^r^s^E^o^o^p^p^o^o^p^p^r^q^r^o^F^o^q^o^o^r^t^y^G^ H^I^J^t^o^o^r^o^o^t^p^p^o^",
+" K^L^M^p^F^o^p^p^p^p^n^N^o^N^p^p^p^o^O^p^P^o^p^p^o^o^p^p^F^Q^R^ S^T^U^p^N^o^N^o^p^p^N^O^p^N^p^o^p^t^o^p^p^p^p^p^V^o^O^t^W^X^Y^ Z^`^F^p^p^o^O^ /p^o^p^p^o^o^./p^o^p^O^N^./o^p^p^p^o^ /n^+/L^ @/#/$/p^./%/o^o^ /p^N^o^",
+" H^&/*/n^O^n^n^ /././=/ /=/ / /=/n^-/ /;/>/ /n^n^O^n^O^n^,/'/)/ !/~/{/-/ /=/ / / /;/=/./=/ /=/O^N^O^O^ /O^./ /=/./=/./ /]/^/ //(/p^-/ /-/_/./O^O^n^n^n^ /=/ / /_/=/=/./././=/ /:/</[/}/|/ 1/2/3/>/</./ /./>/=/ /",
+" 4/5/6/7/8/9/8/8/-/-/9/0/a/>/0/7/9/7/9/7/7/7/8/7/8/b/c/9/d/e/f/ g/h/_/8/0/-/./i/0/b/7/9/7/0/7/9/8/7/9/8/9/8/9/-/0/-/_/-/j/k/ l/m/n/>/7/9/8/7/7/7/8/9/0/-/7/9/8/-/-/7/7/ /b/0/7/o/c/9/p/q/r/ s/h/t/7/8/9/-/9/7/-/",
+" u/v/t/w/x/y/0/0/y/y/y/z/y/y/y/0/0/x/A/7/y/0/0/y/x/z/0/9/B/C/ D/E/F/z/x/0/z/x/y/G/7/y/x/0/y/z/0/y/y/y/0/0/H/y/y/0/H/I/J/K/L/ M/N/O/0/-/y/y/0/y/x/0/0/0/y/z/0/0/y/x/z/0/x/y/z/9/y/x/z/P/Q/R/ S/E/n/T/0/0/y/y/H/0/",
+" U/V/W/x/x/x/X/x/x/Y/X/x/X/Z/x/`/ (x/x/`/w/`/x/x/x/x/X/.(V/+( @(#($(%(Z/x/`/X/X/`/X/y/x/x/w/x/`/x/y/x/X/`/x/x/X/x/&(Z/*(5/=( -(;(>(`/X/x/x/x/y/w/`/x/`/`/`/X/x/X/Z/`/`/X/X/`/X/x/x/,('()( !(~(P/.(Z/x/x/Z/X/",
+" {(](^(Z//(((((_(((:(((_(((:(((_(:(<([(((Z/_(_(((<(((((}(I/|(1( 2(3(4(((((_(Z/((_(((X/_(_(Z/((_(((Z/((((_(((:(((((((:(((5(6( 7(8(%(_(X/_(9(((Z/[(((_(((((((((:(:(((_(((Z/[(_(X/_(0(%(a(b( c(d(e(((((((X/((",
+" f(g(h(i(j([(k([(_([(l(m(_(_(n(_(9(n([(_(n(o([(i([(n(p(o(q(r(s( t(u(v(l(n(_(w(w(_([(n([(_([([([(p([([(x(n(_([([(y((([(w(z(A( D/B(z(_(9([(i(_(_(k([(k(n([([([(_(_(_(k(_([(k([([(n(w([(C(D(E( F(G((([(l(<([(",
+" H(I(J(K(L(L(L(M(N(n(p(O(p(M(P(L(Q(L(i(N(i(i(L(L(L(L(L(N(R(S( T(U(n(L(O(K(V(N(O(W(i(i(W(p(L(L(L(L(L(L(L(V(p(w(X(K(L(Y(Z(`( _._+_@_P(k(i(i(L(i(L(L(L(L(L(L(V(L(L(L(V(K(M(O(N(p(p(M(#_$_%_ &_*_n(k(M(X(",
+" =_-_Y(;_;_>_,_,_P('_)_;_;_,_>_,_;_O(!_,_;_;_;_;_;_,_,_>_~_{_ ]_^_/_P((_;_,_,_O(;_,_O(__,_;_;_,_;_,_O('_;_'_@_,_;_,_,_k(:_<_ [_}_|_(_,_;_>_,_,_;_;_,_,_;_>_,_;_O(,_>_;_)_1_,_,_;_2_,_3_4_5_ 6_7_8_L(,_;_",
+" 9_0_a_b_!_1_)_c_1_,_b_)_,_!_c_1_,_b_d_(_!_,_)_b_,_1_e_(_f_g_ h_4_i_a_b_e_,_,_c_d_>_!_b_1_!_)_,_!_b_1_,_c_d_1_!_)_)_)_j_k_l_ m_n_o_p_1_e_b_e_!_)_1_e_c_1_1_p_b_>_)_p_,_)_b_e_1_e_c_q_r_s_ t_u_v_N(!_",
+" w_x_y_z_z_A_!_B_b_c_c_C_p_b_b_b_b_b_b_D_B_c_b_E_F_C_!_z_G_H_I_ J_K_L_M_B_b_b_b_b_p_b_p_b_E_C_c_b_F_B_b_c_A_N_c_B_b_p_p_O_P_ T(Q_R_S_b_b_b_N_C_C_c_F_B_C_c_C_b_E_B_B_p_b_b_b_b_b_p_p_T_U_ V_W_X_E_",
+" Y_Z_`_c_ :.:b_+:@:S_@:#:.:@:$:%:&:@:F_z_+:S_F_E_*:+:!_=:-:;:>: ,:':):!:~:.:$:%:.:E_.:+:+:z_F_#:c_@:@:c_E_ :S_@:.:.:%:#:{:{_ ]:^:/:(:_:_:+:+:#:F_z_c_F_@:=:+:@:.:$:::.:S_@:+:~:z_+:#:<:[:,: }:|:1:",
+" 2:3:4:5:6:7:8:9:0:a:b:c:d:e:8:c:f:0:g:0:h:d:e:i:6:7:j:k:l:m: n:o:e:p:q:r:s:t:u:j:0:6:v:w:x:r:9:9:e:r:5:v:y:z:q:r:b:A:B:C: D:E:F:G:g:v:d:f:b:v:H:v:5:I:7:g:d:J:p:K:r:r:7:8:u:v:x:u:L:M:N: O:P:Q:",
+" R:S:T:U:U:V:W:V:8:X:5:V:W:W:Y:5:5:V:V:Z:`:V:V:V:U:U:V: <.<+< @<#<$<X:Z:W:%<U:U:V:V:&<V:5:5:U:W:V:U:V:V:U:8:5:G:V:W:V:*<=<-< ;<><,<V:U:&<X:V:5:'<V:V:U:5:U:i:Z:Z:i:V:Z:V:V:V:V:W:W:)<!<~< {<]<",
+" ^</<(<_<:<Y:W:<<<<:<'<'<[<Y:V:'<U:W:Y:Z:U:'<W:9:'<'<W:<<}<|<1< 2<3<4<5<'<:<:<V:U:'<U:Y:W:W:'<Y:_<Y:Y:W:'<<<:<'<Y:[<'<G:6<7<8< 9<0<*<'<U:U:U:Z:Y:'<_<V::<'<U:a<<<'<'<'<[<V:V:'<U:U:U:b<c<d< e<",
+" f<g<h<i<j<j<k<k<l<m<m<k<n<j<n<k<j<k<n<n<o<n<n<m<j<n<k<k<p<q<r< s<t<u<v<n<m<j<j<k<n<m<m<j<k<j<m<n<m<j<m<o<j<j<m<m<n<j<j<w<x< y<z<A<m<n<k<j<m<m<n<o<o<j<n<k<o<n<k<n<k<j<j<k<m<n<k<j<B<C<D< ",
+" E<F<G<H<I<J<K<L<M<H<N<N<I<N<H<M<l<N<H<I<H<L<M<H<K<N<H<L<O<P<Q< R<S<T<N<U<M<J<N<J<l<L<U<I<J<I<K<H<M<J<K<N<I<H<N<H<K<N<V<W<X< Y<Z<`<H<j< [.[L<M<M<l<N<N<K<L<M<H<N<H<H<N<K<H<H< [I<.[+[@[#[$[ ",
+" %[&[*[l<H<N<L<L<.[M< [M<J<l< [H<J<N<I<l<K<M< [j<N<I<L<L<=[-[ ;[>[,[L<n<l<.[ [I<L<M<L<L<I<l<N<l<l<J<.[N<K<.[L<l<I<H< ['[)[![ ~[{[][K<N< [N<I<k<L<K<J<K<.[H<M<K<N<l<n<N<K< [K<N<I<N<^[/[([_[ ",
+" :[<[[[}[M<U<}[U<}[L<|[U<J<U<1[K<2[}[H<+[U<}[ [U<M<U<}[H<3[4[ 5[6[7[N<U<8[J<U<}[J<H<2[2[ [}[.[N<H<L<.[U<}[U<J<}[9[J<U<0[a[b[ c[d[e[U< [}[}[I<.[J<f[J<N<J<U<9[U<U<N<|[N<.[U<U<M<2[9[g[h[i[ ",
+" j[k[l[9[m[n[9[|[m[o[p[o[q[n[2[m[r[8[o[p[r[s[r[8[r[t[9[u[v[w[x[ y[z[A[n[B[C[t[}[u[C[8[r[n[p[D[r[8[n[r[9[8[o[C[p[r[C[o[1[E[F[G[ H[I[J[r[r[r[o[8[n[B[8[9[r[B[p[t[s[B[u[C[s[2[8[s[K[p[s[p[L[M[ ",
+" N[O[P[Q[R[D[S[S[n[C[T[C[B[S[U[V[q[Q[D[R[U[s[R[R[R[C[W[S[X[Y[Z[ `[ }.}T[R[q[o[V[T[D[V[C[S[V[S[D[R[T[C[R[R[r[B[T[q[r[S[V[+}@} #}$}%}R[S[S[S[W[V[C[R[V[s[o[Q[s[p[S[V[S[B[R[&}S[S[S[S[%}*}=} ",
+" -};}>},},},}&}s[&}'}V[T['})}'}&},}'},}'},})}&}&}'}&}&}C[!}~} {}]},}&}&}'})})}&}'}R[)}&},}'}U[,},}'}&}D[Q['}T[V['})},}^}/} (}_}:}<}[}R['}U['}&}'}'}}}&}&}Q[s[,},}&}&}[})},}'}W[,}&}|}1}2} ",
+" 3}4}5}6})}7}[}8}7})})}7}V[7}[}9}T[U[7}[}Q['}6})}7}0}[}a}b}c} d}e}f}g}9}9},}V['}0}&}}}9}8}}})}[}9})}8})}7}7})}9}9}&}&}h}i}j} k}l}m}6})}R[,}8}9}6})}9}7}8}9}[}7})}9})}9}}}'}6})}R['}8}n};}o} ",
+" p}q},}9}r}9}8}s}t}8}7}8}t}8}t}u}t}s}8},}8}v}U[&}s}9}9}w}x}y} z}A}B}C}8}D}t}t}s}u}t}s}r},}'}s}8},}v}u}7}t}s}u}7}7}t}0}E}F}G} H}I}J}t}7}s}r}8}T[t}s})}s}u})}u}s}s}7}8}u}s}s}t}t}s}r}a}K}L} ",
+" M}N}O}s}r}9}8}r}s}u}s}P}Q}t}R}R}s}Q}S}s}s}T}U}v}T}8}r}r}V}W}X} Y}Z}`}u}P} |t}P}S}r}v}S}.|t}Q}r}r}v}8}7}r}r}8}t}R}S}t}r}+|@|#| $|%|Q}v}r}P}R}U}v}s}s}r}u}U[s}r}r}u}v} |r}&| |v}r}.|S}s}*|=| ",
+" -|;|>|S}v} |S}.|S}Q}R} |Q}T}P},|v}P}S},|P}'|)|P}S}'|)|P}!|~|{| ]|^|/|T}.|S}&|P}S}P}T}P},|P}P}'| |v}S})|Q} |Q}P} |P}T}R}(|_| :|<|R}S}v}P} |.|R},|,|Q}R}'|Q}.|S}P}S}S}T}U}P}S}T}T} |[|}||| ",
+" 1|2|3| |4|5|4|6|)|7|8|4|,|7|8| |)|S}9|4|4|7|'| |9|9| |7|0|a| b|c|d|8|9|,|7|4|6|)|.|9|)|'|7|5|)|e|e|)|9|'|7|f|e|,|7|5|g|h| i|j|+|e|S}7|7|e|)|)|9|)|7|9|7|8|4|5|4|8|'|'|5|f|'|,|)|4|k|l|m| ",
+" n|o|p|6|4|6|9|4|6|e|'|q|4|R}4|r|5|9|r|4|5|9|9|9|5|4|4|7|s|t| u|v|w|4|'|6|q| |7|q|7|4|q|q|)|4|e|9|4|4|e|4|9|9|)|8|8|P}x|y|z| A|B|C|D|8|4|r|f|)|4|7|'|9|9|6|6|9|9|5|5|r| | |q|9|'|8|E|F|G|H| ",
+" I|J|K|L|M|M|M|M|M|r|N|O|9|r|O|M|M|M|r|M|M|E|P|M|q|O|Q|R|S|T| U|V|W|E|r|M|8|8|M|M|M|O|r|M|O|q|Q|O|O|M|M|O|M|r|M|M|8|9|X|Y|Z| `| 1.1q|O|Q|q|Q|O|q|r|+1O|M|M|M|M|M|r|O|r|8|O|M|M|M|L|N|@1#1 ",
+" $1%1&1L|O|O|r|r|+1q|8|O|+1e|q|O|M|q|M|Q|r|q|Q|+1E|Q|M|r|*1=1-1 ;1>1,1'|r|+1q|5|O|O|q|r|O|M|8|O|Q|M|O|r|r|O|M|6|r|Q|8|e|'1)1 !1~1{1O|M|q|Q|Q|r|M|Q|M|O|r|r|M|+19|9|O|O|7|M|Q|M|q|Q|*1]1^1 ",
+" /1(1_1+1:1+1+1P|P|:1+1+1:1:1Q|P|+1Q|M|Q|O|O|M|Q|P|+1Q|<1[1}1|1 112131P|Q|P|P|Q|P|+1:1Q|+1Q|Q|O|Q|:1P|Q|P|:1:1P|+1:1:1415161 71819141P|Q|Q|Q|+1O|Q|Q|P|:1:1+1P|:1:1Q|P|+1P|+1P|P|Q|Q|01a1b1 ",
+" c1d1[1P|:1:1+1P|e1P|M|P|f1:1:1f1e1f1:1f1f1f1f1f1f1:1+1g1h1i1 j1k1l1P|P|f1:1:1m1:1:1f1f1f1f1:1P|:1:1P|Q|f1:1O|+1f1<1<1n1o1 p1q1r1e1f1e1f1f1f1e1f1P|f1:1P|Q|:1e1:1Q|f1:1:1e1e1:1e1s1t1u1v1 ",
+" w1x1y1m1m1m1m1z1z1f1m1A1m1f1e1m1z1e1A1A1z1m1A1A1m1z1z1B1C1D1 E1F1G1H1m1z1m1m1e1m1m1m1z1A1A1m1A1m1m1m1e1m1A1e1e1A1z1e1I1J1K1 L1M1N1e1A1A1e1A1A1e1m1m1m1m1m1m1A1m1m1z1m1m1e1e1m1m1m1z1O1P1Q1 "};
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="Simulator WIP" uid="sample" id="net.mograsim.rcp.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+ <aboutInfo>
+ <text>
+ Example
+ </text>
+ </aboutInfo>
+
+ <configIni use="default">
+ </configIni>
+
+ <launcherArgs>
+ <programArgs>-clearPersistedState
+ </programArgs>
+ <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+ </vmArgsMac>
+ </launcherArgs>
+
+ <windowImages i16="/net.mograsim.rcp/icons/app/ico_16t.png" i32="/net.mograsim.rcp/icons/app/ico_32t.png" i48="/net.mograsim.rcp/icons/app/ico_48t.png" i64="/net.mograsim.rcp/icons/app/ico_64t.png" i128="/net.mograsim.rcp/icons/app/ico_128t.png" i256="/net.mograsim.rcp/icons/app/ico_256t.png"/>
+
+ <splash
+ handlerType="extensible" />
+ <launcher name="Sample">
+ <linux icon="/net.mograsim.rcp/icons/app/ico_256t.xpm"/>
+ <macosx icon="/net.mograsim.rcp/icons/app/ico_256t.icns"/>
+ <win useIco="true">
+ <ico path="/net.mograsim.rcp/icons/app/ico_all.ico"/>
+ <bmp/>
+ </win>
+ </launcher>
+
+
+ <vm>
+ <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</linux>
+ <macos include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</macos>
+ <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11</windows>
+ </vm>
+
+ <license>
+ <url>https://www.eclipse.org/legal/epl-2.0/</url>
+ <text>
+ Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler
+
+This program and the accompanying materials are made
+available under the terms of the Eclipse Public License 2.0
+which is available at https://www.eclipse.org/legal/epl-2.0/
+
+This Source Code may also be made available under the following Secondary
+Licenses when the conditions for such availability set forth in the Eclipse
+Public License, v. 2.0 are satisfied: GNU General Public License, version 2
+with the GNU Classpath Exception which is
+available at https://www.gnu.org/software/classpath/license.html.
+
+SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ </text>
+ </license>
+
+ <plugins>
+ <plugin id="SWTBufferedCanvas"/>
+ <plugin id="SWTObjectWrappers"/>
+ <plugin id="SWTZoomableCanvas"/>
+ <plugin id="com.ibm.icu"/>
+ <plugin id="javax.annotation"/>
+ <plugin id="javax.inject"/>
+ <plugin id="javax.xml"/>
+ <plugin id="net.mograsim.logic.core"/>
+ <plugin id="net.mograsim.logic.ui"/>
+ <plugin id="net.mograsim.rcp"/>
+ <plugin id="org.apache.batik.constants"/>
+ <plugin id="org.apache.batik.css"/>
+ <plugin id="org.apache.batik.i18n"/>
+ <plugin id="org.apache.batik.util"/>
+ <plugin id="org.apache.commons.io"/>
+ <plugin id="org.apache.commons.jxpath"/>
+ <plugin id="org.apache.commons.logging"/>
+ <plugin id="org.apache.xmlgraphics"/>
+ <plugin id="org.eclipse.core.commands"/>
+ <plugin id="org.eclipse.core.contenttype"/>
+ <plugin id="org.eclipse.core.databinding"/>
+ <plugin id="org.eclipse.core.databinding.observable"/>
+ <plugin id="org.eclipse.core.databinding.property"/>
+ <plugin id="org.eclipse.core.expressions"/>
+ <plugin id="org.eclipse.core.jobs"/>
+ <plugin id="org.eclipse.core.runtime"/>
+ <plugin id="org.eclipse.e4.core.commands"/>
+ <plugin id="org.eclipse.e4.core.contexts"/>
+ <plugin id="org.eclipse.e4.core.di"/>
+ <plugin id="org.eclipse.e4.core.di.annotations"/>
+ <plugin id="org.eclipse.e4.core.di.extensions"/>
+ <plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
+ <plugin id="org.eclipse.e4.core.services"/>
+ <plugin id="org.eclipse.e4.emf.xpath"/>
+ <plugin id="org.eclipse.e4.ui.bindings"/>
+ <plugin id="org.eclipse.e4.ui.css.core"/>
+ <plugin id="org.eclipse.e4.ui.css.swt"/>
+ <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+ <plugin id="org.eclipse.e4.ui.di"/>
+ <plugin id="org.eclipse.e4.ui.model.workbench"/>
+ <plugin id="org.eclipse.e4.ui.services"/>
+ <plugin id="org.eclipse.e4.ui.widgets"/>
+ <plugin id="org.eclipse.e4.ui.workbench"/>
+ <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench3"/>
+ <plugin id="org.eclipse.emf.common"/>
+ <plugin id="org.eclipse.emf.ecore"/>
+ <plugin id="org.eclipse.emf.ecore.change"/>
+ <plugin id="org.eclipse.emf.ecore.xmi"/>
+ <plugin id="org.eclipse.equinox.app"/>
+ <plugin id="org.eclipse.equinox.common"/>
+ <plugin id="org.eclipse.equinox.preferences"/>
+ <plugin id="org.eclipse.equinox.region" fragment="true"/>
+ <plugin id="org.eclipse.equinox.registry"/>
+ <plugin id="org.eclipse.equinox.supplement"/>
+ <plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
+ <plugin id="org.eclipse.equinox.weaving.hook" fragment="true"/>
+ <plugin id="org.eclipse.help"/>
+ <plugin id="org.eclipse.jface"/>
+ <plugin id="org.eclipse.jface.databinding"/>
+ <plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
+ <plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.osgi.util"/>
+ <plugin id="org.eclipse.swt"/>
+ <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.ui.workbench"/>
+ <plugin id="org.w3c.css.sac"/>
+ <plugin id="org.w3c.dom.events"/>
+ <plugin id="org.w3c.dom.smil"/>
+ <plugin id="org.w3c.dom.svg"/>
+ </plugins>
+
+ <configurations>
+ <plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
+ </configurations>
+
+ <preferencesInfo>
+ <targetfile overwrite="false"/>
+ </preferencesInfo>
+
+ <cssInfo>
+ <file path="/net.mograsim.rcp/css/default.css"/>
+ </cssInfo>
+
+</product>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension-point id="splashExtension" name="%extension-point.name" schema="schema/splashExtension.exsd"/>
+
+ <extension
+ id="product"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.e4.ui.workbench.swt.E4Application"
+ name="Simulator WIP">
+ <property
+ name="applicationCSS"
+ value="platform:/plugin/net.mograsim.rcp/css/default.css">
+ </property>
+ <property
+ name="appName"
+ value="Simulator WIP">
+ </property>
+ <property
+ name="windowImages"
+ value="icons/app/ico_16t.png,icons/app/ico_32t.png,icons/app/ico_48t.png,icons/app/ico_64t.png,icons/app/ico_128t.png,icons/app/ico_256t.png">
+ </property>
+ <property
+ name="aboutText"
+ value="Example">
+ </property>
+ </product>
+ </extension>
+ <extension
+ point="org.eclipse.ui.splashHandlers">
+ <splashHandler
+ class="net.mograsim.rcp.splashhandlers.ExtensibleSplashHandler"
+ id="net.mograsim.rcp.splashHandlers.extensible">
+ </splashHandler>
+ <splashHandlerProductBinding
+ productId="net.mograsim.rcp.product"
+ splashId="net.mograsim.rcp.splashHandlers.extensible">
+ </splashHandlerProductBinding>
+ </extension>
+ <extension
+ point="net.mograsim.rcp.splashExtension">
+ <splashExtension
+ icon="icons/af.png"
+ id="af"
+ tooltip="Application Framework">
+ </splashExtension>
+ <splashExtension
+ icon="icons/embedded.png"
+ id="embedded"
+ tooltip="Embedded">
+ </splashExtension>
+ <splashExtension
+ icon="icons/enterprise.png"
+ id="enterprise"
+ tooltip="Enterprise">
+ </splashExtension>
+ <splashExtension
+ icon="icons/languages.png"
+ id="languages"
+ tooltip="Languages">
+ </splashExtension>
+ <splashExtension
+ icon="icons/rcp.png"
+ id="rcp"
+ tooltip="RCP">
+ </splashExtension>
+ </extension>
+
+</plugin>
--- /dev/null
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="Sample">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="Sample" id="splashExtension" name="Splash Extensions"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="splashExtension"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="splashExtension">
+ <annotation>
+ <appInfo>
+ <meta.element labelAttribute="id" icon="icon"/>
+ </appInfo>
+ </annotation>
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string" use="required">
+ <annotation>
+ <documentation>
+ 50x50 icon
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="tooltip" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
--- /dev/null
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class AboutHandler
+{
+ @Execute
+ public void execute(Shell shell)
+ {
+ MessageDialog.openInformation(shell, "About", "Sample RCP4");
+ }
+}
--- /dev/null
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class OpenHandler
+{
+
+ @Execute
+ public void execute(Shell shell)
+ {
+ FileDialog dialog = new FileDialog(shell);
+ dialog.open();
+ }
+}
--- /dev/null
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.workbench.IWorkbench;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class QuitHandler
+{
+ @Execute
+ public void execute(IWorkbench workbench, Shell shell)
+ {
+ if (MessageDialog.openConfirm(shell, "Confirmation", "Do you want to exit?"))
+ {
+ workbench.close();
+ }
+ }
+}
--- /dev/null
+package net.mograsim.rcp.handlers;
+
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.workbench.modeling.EPartService;
+
+public class SaveHandler
+{
+
+ @CanExecute
+ public boolean canExecute(EPartService partService)
+ {
+ if (partService != null)
+ {
+ return !partService.getDirtyParts().isEmpty();
+ }
+ return false;
+ }
+
+ @Execute
+ public void execute(EPartService partService)
+ {
+ partService.saveAll(false);
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.rcp.parts;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+import net.mograsim.logic.ui.LogicExecuter;
+import net.mograsim.logic.ui.LogicUICanvas;
+import net.mograsim.logic.ui.examples.RSLatchExample;
+import net.mograsim.logic.ui.model.ViewModel;
+import net.mograsim.logic.ui.modeladapter.LogicModelParameters;
+import net.mograsim.logic.ui.modeladapter.ViewLogicModelAdapter;
+import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput;
+import net.mograsim.logic.core.timeline.Timeline;
+
+public class LogicUIPart
+{
+ @Inject
+ private MPart part;
+
+ @PostConstruct
+ public void create(Composite parent)
+ {
+ // setup view model
+ ViewModel viewModel = new ViewModel();
+ RSLatchExample.createRSLatchExample(viewModel);
+
+ // convert to logic model
+ LogicModelParameters params = new LogicModelParameters();
+ params.gateProcessTime = 50;
+ params.wireTravelTime = 10;
+ Timeline timeline = ViewLogicModelAdapter.convert(viewModel, params);
+
+ // initialize UI
+ LogicUICanvas ui = new LogicUICanvas(parent, SWT.NONE, viewModel);
+ ui.addTransformListener((x, y, z) -> part.setDirty(z < 1));
+ ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui);
+ userInput.buttonDrag = 3;
+ userInput.buttonZoom = 2;
+ userInput.enableUserInput();
+
+ // initialize executer
+ LogicExecuter exec = new LogicExecuter(timeline);
+
+ // run it
+ exec.startLiveExecution();
+
+ // TODO find a better condition when to stop
+ ui.addDisposeListener(e -> exec.stopLiveExecution());
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.rcp.parts;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.Persist;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+public class SamplePart
+{
+
+ private TableViewer tableViewer;
+
+ @Inject
+ private MPart part;
+
+ @PostConstruct
+ public void createComposite(Composite parent)
+ {
+ parent.setLayout(new GridLayout(1, false));
+
+ Text txtInput = new Text(parent, SWT.BORDER);
+ txtInput.setMessage("Enter text to mark part as dirty");
+ txtInput.addModifyListener(e -> part.setDirty(true));
+ txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ tableViewer = new TableViewer(parent);
+
+ tableViewer.setContentProvider(ArrayContentProvider.getInstance());
+ tableViewer.setInput(createInitialDataModel());
+ tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
+ }
+
+ @Focus
+ public void setFocus()
+ {
+ tableViewer.getTable().setFocus();
+ }
+
+ @Persist
+ public void save()
+ {
+ part.setDirty(false);
+ }
+
+ private static List<String> createInitialDataModel()
+ {
+ return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.mograsim.rcp.splashhandlers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.splash.AbstractSplashHandler;
+
+/**
+ * @since 3.3
+ *
+ */
+public class ExtensibleSplashHandler extends AbstractSplashHandler
+{
+
+ private ArrayList<Image> fImageList;
+
+ private ArrayList<String> fTooltipList;
+
+ private static final String F_SPLASH_EXTENSION_ID = "Sample.splashExtension"; // NON-NLS-1
+
+ private static final String F_ELEMENT_ICON = "icon"; // NON-NLS-1
+
+ private static final String F_ELEMENT_TOOLTIP = "tooltip"; // NON-NLS-1
+
+ private static final String F_DEFAULT_TOOLTIP = "Image"; // NON-NLS-1
+
+ private static final int F_IMAGE_WIDTH = 50;
+
+ private static final int F_IMAGE_HEIGHT = 50;
+
+ private static final int F_SPLASH_SCREEN_BEVEL = 5;
+
+ private Composite fIconPanel;
+
+ /**
+ *
+ */
+ public ExtensibleSplashHandler()
+ {
+ fImageList = new ArrayList<>();
+ fTooltipList = new ArrayList<>();
+ fIconPanel = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets. Shell)
+ */
+ @Override
+ public void init(Shell splash)
+ {
+ // Store the shell
+ super.init(splash);
+ // Configure the shell layout
+ configureUISplash();
+ // Load all splash extensions
+ loadSplashExtensions();
+ // If no splash extensions were loaded abort the splash handler
+ if (!hasSplashExtensions())
+ {
+ return;
+ }
+ // Create UI
+ createUI();
+ // Configure the image panel bounds
+ configureUICompositeIconPanelBounds();
+ // Enter event loop and prevent the RCP application from
+ // loading until all work is done
+ doEventLoop();
+ }
+
+ /**
+ * @return
+ */
+ private boolean hasSplashExtensions()
+ {
+ return !fImageList.isEmpty();
+ }
+
+ /**
+ *
+ */
+ private void createUI()
+ {
+ // Create the icon panel
+ createUICompositeIconPanel();
+ // Create the images
+ createUIImages();
+ }
+
+ /**
+ *
+ */
+ private void createUIImages()
+ {
+ Iterator<Image> imageIterator = fImageList.iterator();
+ Iterator<String> tooltipIterator = fTooltipList.iterator();
+ int i = 1;
+ int columnCount = ((GridLayout) fIconPanel.getLayout()).numColumns;
+ // Create all the images
+ // Abort if we run out of columns (left-over images will not fit within
+ // the usable splash screen width)
+ while (imageIterator.hasNext() && (i <= columnCount))
+ {
+ Image image = imageIterator.next();
+ String tooltip = tooltipIterator.next();
+ // Create the image using a label widget
+ createUILabel(image, tooltip);
+ i++;
+ }
+ }
+
+ /**
+ * @param image
+ * @param tooltip
+ */
+ private void createUILabel(Image image, String tooltip)
+ {
+ // Create the label (no text)
+ Label label = new Label(fIconPanel, SWT.NONE);
+ label.setImage(image);
+ label.setToolTipText(tooltip);
+ }
+
+ /**
+ *
+ */
+ private void createUICompositeIconPanel()
+ {
+ Shell splash = getSplash();
+ // Create the composite
+ fIconPanel = new Composite(splash, SWT.NONE);
+ // Determine the maximum number of columns that can fit on the splash
+ // screen. One 50x50 image per column.
+ int maxColumnCount = getUsableSplashScreenWidth() / F_IMAGE_WIDTH;
+ // Limit size to the maximum number of columns if the number of images
+ // exceed this amount; otherwise, use the exact number of columns
+ // required.
+ int actualColumnCount = Math.min(fImageList.size(), maxColumnCount);
+ // Configure the layout
+ GridLayout layout = new GridLayout(actualColumnCount, true);
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 0;
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ fIconPanel.setLayout(layout);
+ }
+
+ /**
+ *
+ */
+ private void configureUICompositeIconPanelBounds()
+ {
+ // Determine the size of the panel and position it at the bottom-right
+ // of the splash screen.
+ Point panelSize = fIconPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+
+ int xCoord = getSplash().getSize().x - F_SPLASH_SCREEN_BEVEL - panelSize.x;
+ int yCoord = getSplash().getSize().y - F_SPLASH_SCREEN_BEVEL - panelSize.y;
+ int xWidth = panelSize.x;
+ int yWidth = panelSize.y;
+
+ fIconPanel.setBounds(xCoord, yCoord, xWidth, yWidth);
+ }
+
+ /**
+ * @return
+ */
+ private int getUsableSplashScreenWidth()
+ {
+ // Splash screen width minus two graphic border bevel widths
+ return getSplash().getSize().x - (F_SPLASH_SCREEN_BEVEL * 2);
+ }
+
+ /**
+ *
+ */
+ private void loadSplashExtensions()
+ {
+ // Get all splash handler extensions
+ IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();
+ // Process all splash handler extensions
+ for (int i = 0; i < extensions.length; i++)
+ {
+ processSplashExtension(extensions[i]);
+ }
+ }
+
+ /**
+ * @param extension
+ */
+ private void processSplashExtension(IExtension extension)
+ {
+ // Get all splash handler configuration elements
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ // Process all splash handler configuration elements
+ for (int j = 0; j < elements.length; j++)
+ {
+ processSplashElements(elements[j]);
+ }
+ }
+
+ /**
+ * @param configurationElement
+ */
+ private void processSplashElements(IConfigurationElement configurationElement)
+ {
+ // Attribute: icon
+ processSplashElementIcon(configurationElement);
+ // Attribute: tooltip
+ processSplashElementTooltip(configurationElement);
+ }
+
+ /**
+ * @param configurationElement
+ */
+ private void processSplashElementTooltip(IConfigurationElement configurationElement)
+ {
+ // Get attribute tooltip
+ String tooltip = configurationElement.getAttribute(F_ELEMENT_TOOLTIP);
+ // If a tooltip is not defined, give it a default
+ if ((tooltip == null) || (tooltip.length() == 0))
+ {
+ fTooltipList.add(F_DEFAULT_TOOLTIP);
+ } else
+ {
+ fTooltipList.add(tooltip);
+ }
+ }
+
+ /**
+ * @param configurationElement
+ */
+ private void processSplashElementIcon(IConfigurationElement configurationElement)
+ {
+ // Get attribute icon
+ String iconImageFilePath = configurationElement.getAttribute(F_ELEMENT_ICON);
+ // Abort if an icon attribute was not specified
+ if ((iconImageFilePath == null) || (iconImageFilePath.length() == 0))
+ {
+ return;
+ }
+ // Create a corresponding image descriptor
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getNamespaceIdentifier(),
+ iconImageFilePath);
+ // Abort if no corresponding image was found
+ if (descriptor == null)
+ {
+ return;
+ }
+ // Create the image
+ Image image = descriptor.createImage();
+ // Abort if image creation failed
+ if (image == null)
+ {
+ return;
+ }
+ // Abort if the image does not have dimensions of 50x50
+ if ((image.getBounds().width != F_IMAGE_WIDTH) || (image.getBounds().height != F_IMAGE_HEIGHT))
+ {
+ // Dipose of the image
+ image.dispose();
+ return;
+ }
+ // Store the image and tooltip
+ fImageList.add(image);
+ }
+
+ /**
+ *
+ */
+ private void configureUISplash()
+ {
+ // Configure layout
+ GridLayout layout = new GridLayout(1, true);
+ getSplash().setLayout(layout);
+ // Force shell to inherit the splash background
+ getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT);
+ }
+
+ /**
+ *
+ */
+ private void doEventLoop()
+ {
+ Shell splash = getSplash();
+ if (!splash.getDisplay().readAndDispatch())
+ {
+ splash.getDisplay().sleep();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.splash.AbstractSplashHandler#dispose()
+ */
+ @Override
+ public void dispose()
+ {
+ super.dispose();
+ // Check to see if any images were defined
+ if ((fImageList == null) || fImageList.isEmpty())
+ {
+ return;
+ }
+ // Dispose of all the images
+ Iterator<Image> iterator = fImageList.iterator();
+ while (iterator.hasNext())
+ {
+ Image image = iterator.next();
+ image.dispose();
+ }
+ }
+}