+++ /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\r
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled\r
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore\r
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull\r
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault\r
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable\r
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled\r
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=10\r
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\r
-org.eclipse.jdt.core.compiler.compliance=10\r
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate\r
-org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
-org.eclipse.jdt.core.compiler.problem.APILeak=warning\r
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning\r
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore\r
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning\r
-org.eclipse.jdt.core.compiler.problem.deadCode=warning\r
-org.eclipse.jdt.core.compiler.problem.deprecation=warning\r
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled\r
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled\r
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning\r
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning\r
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning\r
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled\r
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore\r
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning\r
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning\r
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error\r
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning\r
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled\r
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning\r
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning\r
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore\r
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error\r
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning\r
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info\r
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled\r
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning\r
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled\r
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning\r
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning\r
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning\r
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore\r
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning\r
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning\r
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error\r
-org.eclipse.jdt.core.compiler.problem.nullReference=warning\r
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error\r
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning\r
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning\r
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning\r
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error\r
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning\r
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info\r
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning\r
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info\r
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning\r
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled\r
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning\r
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled\r
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled\r
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled\r
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning\r
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning\r
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning\r
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled\r
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning\r
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning\r
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning\r
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning\r
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled\r
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info\r
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning\r
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning\r
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore\r
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning\r
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning\r
-org.eclipse.jdt.core.compiler.release=enabled\r
-org.eclipse.jdt.core.compiler.source=10\r
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647\r
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_with_spaces=false\r
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0\r
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0\r
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0\r
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0\r
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80\r
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0\r
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0\r
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16\r
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0\r
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1\r
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1\r
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true\r
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false\r
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true\r
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_header=false\r
-org.eclipse.jdt.core.formatter.comment.format_html=true\r
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_source_code=true\r
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false\r
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false\r
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.comment.line_length=140\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false\r
-org.eclipse.jdt.core.formatter.compact_else_if=true\r
-org.eclipse.jdt.core.formatter.continuation_indentation=2\r
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2\r
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off\r
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on\r
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false\r
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true\r
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_empty_lines=false\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false\r
-org.eclipse.jdt.core.formatter.indentation.size=4\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true\r
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true\r
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.lineSplit=140\r
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0\r
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines\r
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true\r
-org.eclipse.jdt.core.formatter.tabulation.char=tab\r
-org.eclipse.jdt.core.formatter.tabulation.size=4\r
-org.eclipse.jdt.core.formatter.use_on_off_tags=true\r
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false\r
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false\r
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true\r
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true\r
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true\r
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter\r
+++ /dev/null
-eclipse.preferences.version=1\r
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true\r
-formatter_profile=_MoGraSim\r
-formatter_settings_version=16\r
-sp_cleanup.add_default_serial_version_id=true\r
-sp_cleanup.add_generated_serial_version_id=false\r
-sp_cleanup.add_missing_annotations=true\r
-sp_cleanup.add_missing_deprecated_annotations=true\r
-sp_cleanup.add_missing_methods=false\r
-sp_cleanup.add_missing_nls_tags=false\r
-sp_cleanup.add_missing_override_annotations=true\r
-sp_cleanup.add_missing_override_annotations_interface_methods=true\r
-sp_cleanup.add_serial_version_id=false\r
-sp_cleanup.always_use_blocks=true\r
-sp_cleanup.always_use_parentheses_in_expressions=false\r
-sp_cleanup.always_use_this_for_non_static_field_access=false\r
-sp_cleanup.always_use_this_for_non_static_method_access=false\r
-sp_cleanup.convert_functional_interfaces=false\r
-sp_cleanup.convert_to_enhanced_for_loop=false\r
-sp_cleanup.correct_indentation=false\r
-sp_cleanup.format_source_code=true\r
-sp_cleanup.format_source_code_changes_only=false\r
-sp_cleanup.insert_inferred_type_arguments=false\r
-sp_cleanup.make_local_variable_final=true\r
-sp_cleanup.make_parameters_final=false\r
-sp_cleanup.make_private_fields_final=true\r
-sp_cleanup.make_type_abstract_if_missing_method=false\r
-sp_cleanup.make_variable_declarations_final=false\r
-sp_cleanup.never_use_blocks=false\r
-sp_cleanup.never_use_parentheses_in_expressions=true\r
-sp_cleanup.on_save_use_additional_actions=false\r
-sp_cleanup.organize_imports=false\r
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false\r
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true\r
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true\r
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false\r
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false\r
-sp_cleanup.remove_private_constructors=true\r
-sp_cleanup.remove_redundant_modifiers=false\r
-sp_cleanup.remove_redundant_semicolons=false\r
-sp_cleanup.remove_redundant_type_arguments=false\r
-sp_cleanup.remove_trailing_whitespaces=false\r
-sp_cleanup.remove_trailing_whitespaces_all=true\r
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false\r
-sp_cleanup.remove_unnecessary_casts=true\r
-sp_cleanup.remove_unnecessary_nls_tags=false\r
-sp_cleanup.remove_unused_imports=false\r
-sp_cleanup.remove_unused_local_variables=false\r
-sp_cleanup.remove_unused_private_fields=true\r
-sp_cleanup.remove_unused_private_members=false\r
-sp_cleanup.remove_unused_private_methods=true\r
-sp_cleanup.remove_unused_private_types=true\r
-sp_cleanup.sort_members=false\r
-sp_cleanup.sort_members_all=false\r
-sp_cleanup.use_anonymous_class_creation=false\r
-sp_cleanup.use_blocks=false\r
-sp_cleanup.use_blocks_only_for_return_and_throw=false\r
-sp_cleanup.use_lambda=true\r
-sp_cleanup.use_parentheses_in_expressions=false\r
-sp_cleanup.use_this_for_non_static_field_access=false\r
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true\r
-sp_cleanup.use_this_for_non_static_method_access=false\r
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true\r
+++ /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"?>\r
-<classpath>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">\r
- <attributes>\r
- <attribute name="module" value="true"/>\r
- </attributes>\r
- </classpathentry>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="src" path="src"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-/bin/
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>net.mograsim.rcp</name>\r
- <comment></comment>\r
- <projects>\r
- <project>net.mograsim.rcp</project>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-eclipse.preferences.version=1\r
-org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled\r
-org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore\r
-org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull\r
-org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault\r
-org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable\r
-org.eclipse.jdt.core.compiler.annotation.nullable.secondary=\r
-org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled\r
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate\r
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8\r
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\r
-org.eclipse.jdt.core.compiler.compliance=1.8\r
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate\r
-org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
-org.eclipse.jdt.core.compiler.problem.APILeak=warning\r
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning\r
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore\r
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning\r
-org.eclipse.jdt.core.compiler.problem.deadCode=warning\r
-org.eclipse.jdt.core.compiler.problem.deprecation=warning\r
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled\r
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled\r
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning\r
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning\r
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled\r
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
-org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning\r
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled\r
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore\r
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning\r
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning\r
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error\r
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning\r
-org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled\r
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning\r
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning\r
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore\r
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error\r
-org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning\r
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info\r
-org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled\r
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning\r
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled\r
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning\r
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning\r
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning\r
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore\r
-org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning\r
-org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning\r
-org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error\r
-org.eclipse.jdt.core.compiler.problem.nullReference=warning\r
-org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error\r
-org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning\r
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning\r
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning\r
-org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning\r
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error\r
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning\r
-org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning\r
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info\r
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning\r
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info\r
-org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning\r
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning\r
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled\r
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning\r
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled\r
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled\r
-org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled\r
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning\r
-org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning\r
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning\r
-org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled\r
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning\r
-org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning\r
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning\r
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning\r
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning\r
-org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled\r
-org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info\r
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning\r
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning\r
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore\r
-org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled\r
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning\r
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning\r
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning\r
-org.eclipse.jdt.core.compiler.release=enabled\r
-org.eclipse.jdt.core.compiler.source=1.8\r
-org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647\r
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false\r
-org.eclipse.jdt.core.formatter.align_with_spaces=false\r
-org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16\r
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0\r
-org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16\r
-org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80\r
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0\r
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16\r
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0\r
-org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0\r
-org.eclipse.jdt.core.formatter.alignment_for_module_statements=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16\r
-org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80\r
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0\r
-org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\r
-org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0\r
-org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0\r
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16\r
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0\r
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1\r
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0\r
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1\r
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1\r
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line\r
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line\r
-org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true\r
-org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false\r
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false\r
-org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true\r
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_header=false\r
-org.eclipse.jdt.core.formatter.comment.format_html=true\r
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true\r
-org.eclipse.jdt.core.formatter.comment.format_source_code=true\r
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false\r
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=false\r
-org.eclipse.jdt.core.formatter.comment.indent_tag_description=false\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert\r
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.comment.line_length=140\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true\r
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false\r
-org.eclipse.jdt.core.formatter.compact_else_if=true\r
-org.eclipse.jdt.core.formatter.continuation_indentation=2\r
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2\r
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off\r
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on\r
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false\r
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true\r
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true\r
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_empty_lines=false\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true\r
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true\r
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false\r
-org.eclipse.jdt.core.formatter.indentation.size=4\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert\r
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\r
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\r
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true\r
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true\r
-org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false\r
-org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false\r
-org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never\r
-org.eclipse.jdt.core.formatter.lineSplit=140\r
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false\r
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0\r
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines\r
-org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines\r
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true\r
-org.eclipse.jdt.core.formatter.tabulation.char=tab\r
-org.eclipse.jdt.core.formatter.tabulation.size=4\r
-org.eclipse.jdt.core.formatter.use_on_off_tags=true\r
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false\r
-org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false\r
-org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true\r
-org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true\r
-org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true\r
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true\r
-org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter\r
+++ /dev/null
-eclipse.preferences.version=1\r
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true\r
-formatter_profile=_MoGraSim\r
-formatter_settings_version=16\r
-org.eclipse.jdt.ui.text.custom_code_templates=\r
-sp_cleanup.add_default_serial_version_id=true\r
-sp_cleanup.add_generated_serial_version_id=false\r
-sp_cleanup.add_missing_annotations=true\r
-sp_cleanup.add_missing_deprecated_annotations=true\r
-sp_cleanup.add_missing_methods=false\r
-sp_cleanup.add_missing_nls_tags=false\r
-sp_cleanup.add_missing_override_annotations=true\r
-sp_cleanup.add_missing_override_annotations_interface_methods=true\r
-sp_cleanup.add_serial_version_id=false\r
-sp_cleanup.always_use_blocks=true\r
-sp_cleanup.always_use_parentheses_in_expressions=false\r
-sp_cleanup.always_use_this_for_non_static_field_access=false\r
-sp_cleanup.always_use_this_for_non_static_method_access=false\r
-sp_cleanup.convert_functional_interfaces=false\r
-sp_cleanup.convert_to_enhanced_for_loop=false\r
-sp_cleanup.correct_indentation=false\r
-sp_cleanup.format_source_code=true\r
-sp_cleanup.format_source_code_changes_only=false\r
-sp_cleanup.insert_inferred_type_arguments=false\r
-sp_cleanup.make_local_variable_final=true\r
-sp_cleanup.make_parameters_final=false\r
-sp_cleanup.make_private_fields_final=true\r
-sp_cleanup.make_type_abstract_if_missing_method=false\r
-sp_cleanup.make_variable_declarations_final=false\r
-sp_cleanup.never_use_blocks=false\r
-sp_cleanup.never_use_parentheses_in_expressions=true\r
-sp_cleanup.on_save_use_additional_actions=false\r
-sp_cleanup.organize_imports=false\r
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false\r
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true\r
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true\r
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false\r
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false\r
-sp_cleanup.remove_private_constructors=true\r
-sp_cleanup.remove_redundant_modifiers=false\r
-sp_cleanup.remove_redundant_semicolons=false\r
-sp_cleanup.remove_redundant_type_arguments=false\r
-sp_cleanup.remove_trailing_whitespaces=false\r
-sp_cleanup.remove_trailing_whitespaces_all=true\r
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false\r
-sp_cleanup.remove_unnecessary_casts=true\r
-sp_cleanup.remove_unnecessary_nls_tags=false\r
-sp_cleanup.remove_unused_imports=false\r
-sp_cleanup.remove_unused_local_variables=false\r
-sp_cleanup.remove_unused_private_fields=true\r
-sp_cleanup.remove_unused_private_members=false\r
-sp_cleanup.remove_unused_private_methods=true\r
-sp_cleanup.remove_unused_private_types=true\r
-sp_cleanup.sort_members=false\r
-sp_cleanup.sort_members_all=false\r
-sp_cleanup.use_anonymous_class_creation=false\r
-sp_cleanup.use_blocks=false\r
-sp_cleanup.use_blocks_only_for_return_and_throw=false\r
-sp_cleanup.use_lambda=true\r
-sp_cleanup.use_parentheses_in_expressions=false\r
-sp_cleanup.use_this_for_non_static_field_access=false\r
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true\r
-sp_cleanup.use_this_for_non_static_method_access=false\r
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true\r
+++ /dev/null
-eclipse.preferences.version=1\r
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false\r
+++ /dev/null
-compilers.f.unresolved-features=1\r
-compilers.f.unresolved-plugins=1\r
-compilers.incompatible-environment=1\r
-compilers.p.build=1\r
-compilers.p.build.bin.includes=1\r
-compilers.p.build.encodings=1\r
-compilers.p.build.java.compiler=1\r
-compilers.p.build.java.compliance=1\r
-compilers.p.build.missing.output=2\r
-compilers.p.build.output.library=1\r
-compilers.p.build.source.library=1\r
-compilers.p.build.src.includes=1\r
-compilers.p.deprecated=1\r
-compilers.p.discouraged-class=1\r
-compilers.p.internal=1\r
-compilers.p.missing-packages=1\r
-compilers.p.missing-version-export-package=2\r
-compilers.p.missing-version-import-package=2\r
-compilers.p.missing-version-require-bundle=2\r
-compilers.p.no-required-att=0\r
-compilers.p.no.automatic.module=1\r
-compilers.p.not-externalized-att=1\r
-compilers.p.service.component.without.lazyactivation=1\r
-compilers.p.unknown-attribute=1\r
-compilers.p.unknown-class=1\r
-compilers.p.unknown-element=1\r
-compilers.p.unknown-identifier=1\r
-compilers.p.unknown-resource=1\r
-compilers.p.unresolved-ex-points=0\r
-compilers.p.unresolved-import=0\r
-compilers.s.create-docs=false\r
-compilers.s.doc-folder=doc\r
-compilers.s.open-tags=1\r
-eclipse.preferences.version=1\r
+++ /dev/null
-eclipse.preferences.version=1\r
-task-tags/use-project-settings=true\r
+++ /dev/null
-autoEnabled=true\r
-eclipse.preferences.version=1\r
-extraProperties=\r
-fileExclusions=\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<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">\r
- <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">\r
- <children xsi:type="basic:PartSashContainer" xmi:id="_6wlLksgZEeSyMNYR5xypkQ" elementId="Sample.partsashcontainer.sample">\r
- <children xsi:type="basic:PartStack" xmi:id="_6wlLk8gZEeSyMNYR5xypkQ" elementId="Sample.partstack.sample">\r
- <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"/>\r
- <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"/>\r
- </children>\r
- <children xsi:type="basic:PartStack" xmi:id="_l2EzYG6wEemo__tDmTCqCQ" elementId="sample.partstack.0">\r
- <children xsi:type="basic:Part" xmi:id="_mW1XEG6wEemo__tDmTCqCQ" elementId="sample.part.none" label="None" tooltip="Something"/>\r
- </children>\r
- </children>\r
- <mainMenu xmi:id="_6wlLicgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.menu">\r
- <children xsi:type="menu:Menu" xmi:id="_6wlLisgZEeSyMNYR5xypkQ" elementId="file" label="File">\r
- <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"/>\r
- <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"/>\r
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLjcgZEeSyMNYR5xypkQ" elementId="Sample.handleditem.quit" label="Quit" command="_6wlLfMgZEeSyMNYR5xypkQ"/>\r
- </children>\r
- <children xsi:type="menu:Menu" xmi:id="_6wlLjsgZEeSyMNYR5xypkQ" elementId="help" label="Help">\r
- <children xsi:type="menu:HandledMenuItem" xmi:id="_6wlLj8gZEeSyMNYR5xypkQ" elementId="Sample.handleditem.about" label="About" command="_6wlLhsgZEeSyMNYR5xypkQ"/>\r
- </children>\r
- </mainMenu>\r
- <trimBars xmi:id="_6wlLlcgZEeSyMNYR5xypkQ" elementId="Sample.trimbar.top">\r
- <children xsi:type="menu:ToolBar" xmi:id="_6wlLlsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.main.toolbar">\r
- <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"/>\r
- <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"/>\r
- </children>\r
- </trimBars>\r
- </children>\r
- <handlers xmi:id="_6wlLfcgZEeSyMNYR5xypkQ" elementId="sample.handler.quitCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.QuitHandler" command="_6wlLfMgZEeSyMNYR5xypkQ"/>\r
- <handlers xmi:id="_6wlLgcgZEeSyMNYR5xypkQ" elementId="sample.handler.openCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.OpenHandler" command="_6wlLgMgZEeSyMNYR5xypkQ"/>\r
- <handlers xmi:id="_6wlLhMgZEeSyMNYR5xypkQ" elementId="sample.handler.saveCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.SaveHandler" command="_6wlLg8gZEeSyMNYR5xypkQ"/>\r
- <handlers xmi:id="_6wlLh8gZEeSyMNYR5xypkQ" elementId="sample.handler.aboutCommand" contributionURI="bundleclass://net.mograsim.rcp/net.mograsim.rcp.handlers.AboutHandler" command="_6wlLhsgZEeSyMNYR5xypkQ"/>\r
- <bindingTables xmi:id="_6wlLfsgZEeSyMNYR5xypkQ" elementId="Sample.bindingtable" bindingContext="_6wlLecgZEeSyMNYR5xypkQ">\r
- <bindings xmi:id="_6wlLf8gZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1q" keySequence="M1+Q" command="_6wlLfMgZEeSyMNYR5xypkQ"/>\r
- <bindings xmi:id="_6wlLgsgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1o" keySequence="M1+O" command="_6wlLgMgZEeSyMNYR5xypkQ"/>\r
- <bindings xmi:id="_6wlLhcgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1s" keySequence="M1+S" command="_6wlLg8gZEeSyMNYR5xypkQ"/>\r
- <bindings xmi:id="_6wlLiMgZEeSyMNYR5xypkQ" elementId="Sample.keybinding.m1a" keySequence="M1+A" command="_6wlLhsgZEeSyMNYR5xypkQ"/>\r
- </bindingTables>\r
- <rootContext xmi:id="_6wlLecgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">\r
- <children xmi:id="_6wlLesgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>\r
- <children xmi:id="_6wlLe8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>\r
- </rootContext>\r
- <commands xmi:id="_6wlLfMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>\r
- <commands xmi:id="_6wlLgMgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.open" commandName="openCommand"/>\r
- <commands xmi:id="_6wlLg8gZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>\r
- <commands xmi:id="_6wlLhsgZEeSyMNYR5xypkQ" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>\r
- <addons xmi:id="_6wlLcsgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>\r
- <addons xmi:id="_6wlLc8gZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>\r
- <addons xmi:id="_6wlLdMgZEeSyMNYR5xypkQ" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>\r
- <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"/>\r
- <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"/>\r
- <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"/>\r
- <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"/>\r
-</application:Application>\r
+++ /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\r
-Bundle-Vendor = MYSELF\r
-Bundle-Name = Sample\r
-product.name = Sample\r
-extension-point.name = Splash Extensions\r
-product.name.0 = Simulator WIP
\ No newline at end of file
+++ /dev/null
-output.. = bin/\r
-bin.includes = plugin.xml,\\r
- META-INF/,\\r
- .,\\r
- icons/,\\r
- Application.e4xmi,\\r
- css/,\\r
- splash.bmp,\\r
- schema/,\\r
- OSGI-INF/l10n/bundle.properties,\\r
- OSGI-INF/\r
-source.. = src/\r
-src.includes = Application.e4xmi,\\r
- OSGI-INF/l10n/bundle.properties,\\r
- css/,\\r
- icons/,\\r
- schema/,\\r
- splash.bmp\r
+++ /dev/null
-/* XPM */\r
-static char * C:\Users\Christian\Documents\Informatik_Studium\ico_256t_xpm[] = {\r
-"256 256 2750 2",\r
-" c None",\r
-". c #000000",\r
-"+ c #00100E",\r
-"@ c #001312",\r
-"# c #001413",\r
-"$ c #001C1B",\r
-"% c #001A19",\r
-"& c #001515",\r
-"* c #002120",\r
-"= c #002221",\r
-"- c #001918",\r
-"; c #002525",\r
-"> c #002927",\r
-", c #002323",\r
-"' c #000F0E",\r
-") c #001C1A",\r
-"! c #002726",\r
-"~ c #002C2B",\r
-"{ c #002928",\r
-"] c #001110",\r
-"^ c #001E1C",\r
-"/ c #002727",\r
-"( c #002D2C",\r
-"_ c #002B2B",\r
-": c #002827",\r
-"< c #001E1D",\r
-"[ c #001211",\r
-"} c #001F1C",\r
-"| c #002E2E",\r
-"1 c #002625",\r
-"2 c #001D1D",\r
-"3 c #002121",\r
-"4 c #002C2C",\r
-"5 c #001514",\r
-"6 c #002F2E",\r
-"7 c #002B2C",\r
-"8 c #002424",\r
-"9 c #001816",\r
-"0 c #002F2D",\r
-"a c #00302F",\r
-"b c #001A18",\r
-"c c #002725",\r
-"d c #002A29",\r
-"e c #001B1A",\r
-"f c #003130",\r
-"g c #003131",\r
-"h c #002F2F",\r
-"i c #001F1D",\r
-"j c #000D0B",\r
-"k c #001615",\r
-"l c #00110F",\r
-"m c #001010",\r
-"n c #001F1E",\r
-"o c #002B2A",\r
-"p c #002220",\r
-"q c #002321",\r
-"r c #002021",\r
-"s c #00201E",\r
-"t c #001D1C",\r
-"u c #001D1B",\r
-"v c #001917",\r
-"w c #001716",\r
-"x c #001313",\r
-"y c #001111",\r
-"z c #001F1F",\r
-"A c #003333",\r
-"B c #003231",\r
-"C c #003332",\r
-"D c #003232",\r
-"E c #002020",\r
-"F c #002E2C",\r
-"G c #002929",\r
-"H c #002524",\r
-"I c #001E1E",\r
-"J c #001818",\r
-"K c #001717",\r
-"L c #001414",\r
-"M c #002E2F",\r
-"N c #003233",\r
-"O c #002E2D",\r
-"P c #002423",\r
-"Q c #00201F",\r
-"R c #001A1A",\r
-"S c #002F30",\r
-"T c #003434",\r
-"U c #002322",\r
-"V c #003334",\r
-"W c #002D2D",\r
-"X c #002828",\r
-"Y c #002324",\r
-"Z c #002222",\r
-"` c #001817",\r
-" . c #003635",\r
-".. c #003535",\r
-"+. c #003534",\r
-"@. c #003636",\r
-"#. c #003433",\r
-"$. c #002D2E",\r
-"%. c #003533",\r
-"&. c #003837",\r
-"*. c #003736",\r
-"=. c #003836",\r
-"-. c #003735",\r
-";. c #003432",\r
-">. c #002C2A",\r
-",. c #002422",\r
-"'. c #002320",\r
-"). c #001C1C",\r
-"!. c #003331",\r
-"~. c #002A28",\r
-"{. c #002624",\r
-"]. c #003737",\r
-"^. c #002D2B",\r
-"/. c #003839",\r
-"(. c #003838",\r
-"_. c #003939",\r
-":. c #003230",\r
-"<. c #002B29",\r
-"[. c #003637",\r
-"}. c #000C0B",\r
-"|. c #001412",\r
-"1. c #00393A",\r
-"2. c #003A3A",\r
-"3. c #002626",\r
-"4. c #001715",\r
-"5. c #002523",\r
-"6. c #003A3B",\r
-"7. c #003536",\r
-"8. c #003A39",\r
-"9. c #00302E",\r
-"0. c #003C3C",\r
-"a. c #003B3C",\r
-"b. c #003B3B",\r
-"c. c #003B3A",\r
-"d. c #003A3C",\r
-"e. c #003738",\r
-"f. c #003030",\r
-"g. c #00292A",\r
-"h. c #001919",\r
-"i. c #001614",\r
-"j. c #002A2A",\r
-"k. c #003C3D",\r
-"l. c #003B3D",\r
-"m. c #003D3D",\r
-"n. c #003132",\r
-"o. c #003537",\r
-"p. c #003C3E",\r
-"q. c #003D3C",\r
-"r. c #003E3E",\r
-"s. c #003E3D",\r
-"t. c #003F3F",\r
-"u. c #003F3E",\r
-"v. c #003E3F",\r
-"w. c #003C3B",\r
-"x. c #003938",\r
-"y. c #003D3F",\r
-"z. c #004041",\r
-"A. c #004040",\r
-"B. c #003F40",\r
-"C. c #003F41",\r
-"D. c #003E40",\r
-"E. c #004042",\r
-"F. c #00403F",\r
-"G. c #004141",\r
-"H. c #004142",\r
-"I. c #004241",\r
-"J. c #003031",\r
-"K. c #004242",\r
-"L. c #003634",\r
-"M. c #004140",\r
-"N. c #004243",\r
-"O. c #004344",\r
-"P. c #004345",\r
-"Q. c #004445",\r
-"R. c #004244",\r
-"S. c #004343",\r
-"T. c #004444",\r
-"U. c #002C2D",\r
-"V. c #00383A",\r
-"W. c #004546",\r
-"X. c #004446",\r
-"Y. c #004245",\r
-"Z. c #004646",\r
-"`. c #004143",\r
-" + c #004545",\r
-".+ c #004647",\r
-"++ c #004747",\r
-"@+ c #004447",\r
-"#+ c #004547",\r
-"$+ c #004746",\r
-"%+ c #004748",\r
-"&+ c #00484A",\r
-"*+ c #004849",\r
-"=+ c #00474A",\r
-"-+ c #00484B",\r
-";+ c #004749",\r
-">+ c #004848",\r
-",+ c #004A4C",\r
-"'+ c #00494C",\r
-")+ c #004B4C",\r
-"!+ c #00494B",\r
-"~+ c #00494A",\r
-"{+ c #004A4B",\r
-"]+ c #004C4C",\r
-"^+ c #004949",\r
-"/+ c #004B4B",\r
-"(+ c #004C4D",\r
-"_+ c #004C4B",\r
-":+ c #004D4D",\r
-"<+ c #004D4E",\r
-"[+ c #004E4F",\r
-"}+ c #004D4F",\r
-"|+ c #004E4E",\r
-"1+ c #004C4E",\r
-"2+ c #004645",\r
-"3+ c #004E50",\r
-"4+ c #004F4F",\r
-"5+ c #004F50",\r
-"6+ c #004649",\r
-"7+ c #005052",\r
-"8+ c #005051",\r
-"9+ c #004F51",\r
-"0+ c #005053",\r
-"a+ c #005153",\r
-"b+ c #003D3E",\r
-"c+ c #005254",\r
-"d+ c #004B4D",\r
-"e+ c #005253",\r
-"f+ c #005152",\r
-"g+ c #005355",\r
-"h+ c #005255",\r
-"i+ c #005154",\r
-"j+ c #005356",\r
-"k+ c #005354",\r
-"l+ c #005456",\r
-"m+ c #005050",\r
-"n+ c #005455",\r
-"o+ c #005457",\r
-"p+ c #005557",\r
-"q+ c #005556",\r
-"r+ c #005658",\r
-"s+ c #005659",\r
-"t+ c #004A4A",\r
-"u+ c #005759",\r
-"v+ c #005558",\r
-"w+ c #004648",\r
-"x+ c #00575A",\r
-"y+ c #00585A",\r
-"z+ c #005859",\r
-"A+ c #00585B",\r
-"B+ c #004C4F",\r
-"C+ c #00595C",\r
-"D+ c #005A5D",\r
-"E+ c #005A5C",\r
-"F+ c #00595B",\r
-"G+ c #00595D",\r
-"H+ c #005B5D",\r
-"I+ c #00585C",\r
-"J+ c #005A5B",\r
-"K+ c #004D50",\r
-"L+ c #005B5E",\r
-"M+ c #005C5E",\r
-"N+ c #005C5F",\r
-"O+ c #005C5D",\r
-"P+ c #005B5F",\r
-"Q+ c #005D5E",\r
-"R+ c #005E60",\r
-"S+ c #005D5F",\r
-"T+ c #005E5F",\r
-"U+ c #005B5C",\r
-"V+ c #005151",\r
-"W+ c #005F60",\r
-"X+ c #004342",\r
-"Y+ c #005657",\r
-"Z+ c #005F62",\r
-"`+ c #005F63",\r
-" @ c #005E61",\r
-".@ c #005758",\r
-"+@ c #005D62",\r
-"@@ c #005D60",\r
-"#@ c #005C60",\r
-"$@ c #005E62",\r
-"%@ c #006063",\r
-"&@ c #005F61",\r
-"*@ c #006164",\r
-"=@ c #006364",\r
-"-@ c #006264",\r
-";@ c #006265",\r
-">@ c #006163",\r
-",@ c #006365",\r
-"'@ c #006465",\r
-")@ c #006466",\r
-"!@ c #006162",\r
-"~@ c #006064",\r
-"{@ c #006366",\r
-"]@ c #006367",\r
-"^@ c #006062",\r
-"/@ c #006567",\r
-"(@ c #00595A",\r
-"_@ c #006568",\r
-":@ c #006467",\r
-"<@ c #006566",\r
-"[@ c #006267",\r
-"}@ c #006165",\r
-"|@ c #006569",\r
-"1@ c #006469",\r
-"2@ c #004346",\r
-"3@ c #004A4D",\r
-"4@ c #006468",\r
-"5@ c #006769",\r
-"6@ c #006669",\r
-"7@ c #00676A",\r
-"8@ c #006668",\r
-"9@ c #005E63",\r
-"0@ c #00666A",\r
-"a@ c #003A38",\r
-"b@ c #006667",\r
-"c@ c #005D61",\r
-"d@ c #00686B",\r
-"e@ c #00676B",\r
-"f@ c #00686A",\r
-"g@ c #2A5B5C",\r
-"h@ c #00686C",\r
-"i@ c #00696C",\r
-"j@ c #00676C",\r
-"k@ c #004548",\r
-"l@ c #00696B",\r
-"m@ c #00666B",\r
-"n@ c #006B6D",\r
-"o@ c #006A6D",\r
-"p@ c #006A6C",\r
-"q@ c #005458",\r
-"r@ c #00696A",\r
-"s@ c #00696D",\r
-"t@ c #006A6E",\r
-"u@ c #006C6D",\r
-"v@ c #006B6E",\r
-"w@ c #005252",\r
-"x@ c #006C6E",\r
-"y@ c #006B6F",\r
-"z@ c #006C6F",\r
-"A@ c #006E71",\r
-"B@ c #006D6F",\r
-"C@ c #006E70",\r
-"D@ c #006D70",\r
-"E@ c #006C70",\r
-"F@ c #006D6E",\r
-"G@ c #006E6F",\r
-"H@ c #007072",\r
-"I@ c #006F71",\r
-"J@ c #007071",\r
-"K@ c #006D71",\r
-"L@ c #006F72",\r
-"M@ c #007073",\r
-"N@ c #007173",\r
-"O@ c #006F73",\r
-"P@ c #007074",\r
-"Q@ c #006A6B",\r
-"R@ c #00575B",\r
-"S@ c #007172",\r
-"T@ c #007174",\r
-"U@ c #006266",\r
-"V@ c #007175",\r
-"W@ c #00656A",\r
-"X@ c #007274",\r
-"Y@ c #006E72",\r
-"Z@ c #006368",\r
-"`@ c #004F52",\r
-" # c #004E51",\r
-".# c #007376",\r
-"+# c #007275",\r
-"@# c #007276",\r
-"## c #007375",\r
-"$# c #007477",\r
-"%# c #007476",\r
-"&# c #005353",\r
-"*# c #007377",\r
-"=# c #007578",\r
-"-# c #005A5E",\r
-";# c #007577",\r
-"># c #005155",\r
-",# c #007679",\r
-"'# c #007678",\r
-")# c #00777A",\r
-"!# c #007779",\r
-"~# c #00787A",\r
-"{# c #00767A",\r
-"]# c #00787B",\r
-"^# c #007478",\r
-"/# c #00797C",\r
-"(# c #00797B",\r
-"_# c #007A7C",\r
-":# c #007576",\r
-"<# c #007879",\r
-"[# c #007A7B",\r
-"}# c #006263",\r
-"|# c #005C5C",\r
-"1# c #007A7D",\r
-"2# c #007B7E",\r
-"3# c #007B7D",\r
-"4# c #00797D",\r
-"5# c #007273",\r
-"6# c #007C7E",\r
-"7# c #007A7E",\r
-"8# c #007D7F",\r
-"9# c #007D80",\r
-"0# c #007D81",\r
-"a# c #007E80",\r
-"b# c #007B7C",\r
-"c# c #007F81",\r
-"d# c #007D7E",\r
-"e# c #007C7F",\r
-"f# c #007E7F",\r
-"g# c #007E83",\r
-"h# c #007F82",\r
-"i# c #007E81",\r
-"j# c #007E82",\r
-"k# c #007F83",\r
-"l# c #007D82",\r
-"m# c #007C80",\r
-"n# c #008084",\r
-"o# c #004C50",\r
-"p# c #008184",\r
-"q# c #008083",\r
-"r# c #008183",\r
-"s# c #008082",\r
-"t# c #008286",\r
-"u# c #008487",\r
-"v# c #008387",\r
-"w# c #008386",\r
-"x# c #008185",\r
-"y# c #006B6C",\r
-"z# c #008284",\r
-"A# c #008588",\r
-"B# c #008488",\r
-"C# c #008388",\r
-"D# c #008287",\r
-"E# c #008285",\r
-"F# c #008589",\r
-"G# c #00868B",\r
-"H# c #00858A",\r
-"I# c #00858B",\r
-"J# c #00868A",\r
-"K# c #00868C",\r
-"L# c #008489",\r
-"M# c #00797E",\r
-"N# c #004A4E",\r
-"O# c #00878B",\r
-"P# c #00878D",\r
-"Q# c #00878C",\r
-"R# c #00888D",\r
-"S# c #00888C",\r
-"T# c #00888B",\r
-"U# c #00898C",\r
-"V# c #00878E",\r
-"W# c #00898D",\r
-"X# c #008A8E",\r
-"Y# c #00898E",\r
-"Z# c #008A8F",\r
-"`# c #008A8D",\r
-" $ c #00898F",\r
-".$ c #008389",\r
-"+$ c #008990",\r
-"@$ c #00777B",\r
-"#$ c #008C91",\r
-"$$ c #008D91",\r
-"%$ c #008C90",\r
-"&$ c #008D92",\r
-"*$ c #008B90",\r
-"=$ c #006D72",\r
-"-$ c #008B91",\r
-";$ c #008186",\r
-">$ c #008E92",\r
-",$ c #008F93",\r
-"'$ c #008E93",\r
-")$ c #009094",\r
-"!$ c #008F92",\r
-"~$ c #008B8F",\r
-"{$ c #008F94",\r
-"]$ c #009195",\r
-"^$ c #009095",\r
-"/$ c #009194",\r
-"($ c #007F84",\r
-"_$ c #009093",\r
-":$ c #006869",\r
-"<$ c #009296",\r
-"[$ c #009297",\r
-"}$ c #009196",\r
-"|$ c #009397",\r
-"1$ c #009197",\r
-"2$ c #009096",\r
-"3$ c #009498",\r
-"4$ c #009598",\r
-"5$ c #009398",\r
-"6$ c #009497",\r
-"7$ c #008C8F",\r
-"8$ c #009295",\r
-"9$ c #009499",\r
-"0$ c #009599",\r
-"a$ c #00959A",\r
-"b$ c #00969A",\r
-"c$ c #009399",\r
-"d$ c #00969B",\r
-"e$ c #00959B",\r
-"f$ c #00949A",\r
-"g$ c #006061",\r
-"h$ c #009298",\r
-"i$ c #00989F",\r
-"j$ c #00979D",\r
-"k$ c #00989D",\r
-"l$ c #00989E",\r
-"m$ c #00979C",\r
-"n$ c #00979B",\r
-"o$ c #00979E",\r
-"p$ c #00999F",\r
-"q$ c #009A9F",\r
-"r$ c #0099A0",\r
-"s$ c #009AA0",\r
-"t$ c #008C92",\r
-"u$ c #009AA1",\r
-"v$ c #00999E",\r
-"w$ c #008689",\r
-"x$ c #009BA0",\r
-"y$ c #009CA0",\r
-"z$ c #009CA1",\r
-"A$ c #009BA1",\r
-"B$ c #00787C",\r
-"C$ c #009DA2",\r
-"D$ c #009EA3",\r
-"E$ c #009CA2",\r
-"F$ c #009DA3",\r
-"G$ c #009EA2",\r
-"H$ c #009CA3",\r
-"I$ c #009EA5",\r
-"J$ c #009FA5",\r
-"K$ c #009EA4",\r
-"L$ c #009DA4",\r
-"M$ c #00A0A6",\r
-"N$ c #009EA6",\r
-"O$ c #009FA6",\r
-"P$ c #008F95",\r
-"Q$ c #009BA2",\r
-"R$ c #00A1A7",\r
-"S$ c #00A0A7",\r
-"T$ c #007A7F",\r
-"U$ c #00959C",\r
-"V$ c #00A3A9",\r
-"W$ c #00A2A9",\r
-"X$ c #00A1A8",\r
-"Y$ c #00A2A8",\r
-"Z$ c #00A3AA",\r
-"`$ c #009B9F",\r
-" % c #00A4AA",\r
-".% c #00A5AA",\r
-"+% c #00A3A8",\r
-"@% c #008D90",\r
-"#% c #009FA4",\r
-"$% c #00A5AB",\r
-"%% c #00A4A9",\r
-"&% c #00787D",\r
-"*% c #008385",\r
-"=% c #00A4AB",\r
-"-% c #00A5AC",\r
-";% c #00A6AC",\r
-">% c #00A6AD",\r
-",% c #00A6AB",\r
-"'% c #00A7AC",\r
-")% c #00A8AE",\r
-"!% c #00A7AE",\r
-"~% c #00A8B0",\r
-"{% c #00A7AF",\r
-"]% c #00A9AF",\r
-"^% c #00A8AF",\r
-"/% c #007B80",\r
-"(% c #00A7AD",\r
-"_% c #00A6AE",\r
-":% c #00A9B0",\r
-"<% c #00777C",\r
-"[% c #00A9B1",\r
-"}% c #00A4AC",\r
-"|% c #007B7F",\r
-"1% c #00AAB1",\r
-"2% c #00AAB2",\r
-"3% c #00A9B2",\r
-"4% c #01A3AA",\r
-"5% c #01AAB2",\r
-"6% c #01ABB3",\r
-"7% c #01AAB1",\r
-"8% c #01949A",\r
-"9% c #01A5AC",\r
-"0% c #01A8B0",\r
-"a% c #018D91",\r
-"b% c #01A1A6",\r
-"c% c #019498",\r
-"d% c #01A6AC",\r
-"e% c #01ADB4",\r
-"f% c #01ACB3",\r
-"g% c #01ACB4",\r
-"h% c #02ACB5",\r
-"i% c #02ACB4",\r
-"j% c #01ACB5",\r
-"k% c #02A9B2",\r
-"l% c #019DA2",\r
-"m% c #018286",\r
-"n% c #019AA0",\r
-"o% c #02A8B0",\r
-"p% c #00ABB3",\r
-"q% c #01ADB5",\r
-"r% c #01A7AF",\r
-"s% c #02999F",\r
-"t% c #019399",\r
-"u% c #01A6AD",\r
-"v% c #02ADB4",\r
-"w% c #01A9B1",\r
-"x% c #019CA2",\r
-"y% c #018183",\r
-"z% c #02787A",\r
-"A% c #01989D",\r
-"B% c #02A8AF",\r
-"C% c #02AEB5",\r
-"D% c #02ADB5",\r
-"E% c #01AEB4",\r
-"F% c #02AEB4",\r
-"G% c #01ADB3",\r
-"H% c #02A9B1",\r
-"I% c #029BA1",\r
-"J% c #017B7F",\r
-"K% c #018387",\r
-"L% c #019FA5",\r
-"M% c #02AAB2",\r
-"N% c #03AEB6",\r
-"O% c #02A6AD",\r
-"P% c #01787B",\r
-"Q% c #03AEB4",\r
-"R% c #02ACB3",\r
-"S% c #02A8B1",\r
-"T% c #029A9F",\r
-"U% c #017A7C",\r
-"V% c #028084",\r
-"W% c #039EA4",\r
-"X% c #03AAB3",\r
-"Y% c #03AEB5",\r
-"Z% c #03AFB6",\r
-"`% c #03AFB5",\r
-" & c #03B0B6",\r
-".& c #03A8AF",\r
-"+& c #02989D",\r
-"@& c #028B8F",\r
-"#& c #03A3AB",\r
-"$& c #03ACB5",\r
-"%& c #02AFB6",\r
-"&& c #02AEB6",\r
-"*& c #03ADB4",\r
-"=& c #03A5AC",\r
-"-& c #028F93",\r
-";& c #039FA6",\r
-">& c #03ABB3",\r
-",& c #02AFB5",\r
-"'& c #02969A",\r
-")& c #048B8F",\r
-"!& c #03A3AA",\r
-"~& c #04ADB5",\r
-"{& c #04B1B7",\r
-"]& c #05B1B8",\r
-"^& c #04B0B7",\r
-"/& c #04B1B8",\r
-"(& c #05B0B7",\r
-"_& c #05A8AF",\r
-":& c #049399",\r
-"<& c #026C70",\r
-"[& c #039399",\r
-"}& c #03A7AF",\r
-"|& c #05AFB7",\r
-"1& c #04ADB6",\r
-"2& c #04A3AA",\r
-"3& c #048A8D",\r
-"4& c #038C90",\r
-"5& c #03A4AA",\r
-"6& c #04AEB5",\r
-"7& c #049297",\r
-"8& c #036B6D",\r
-"9& c #049296",\r
-"0& c #05B0B6",\r
-"a& c #05B2B9",\r
-"b& c #05A7AD",\r
-"c& c #048D92",\r
-"d& c #03787B",\r
-"e& c #039AA0",\r
-"f& c #05ABB3",\r
-"g& c #05AEB5",\r
-"h& c #049FA5",\r
-"i& c #048185",\r
-"j& c #036C6F",\r
-"k& c #049397",\r
-"l& c #05A9B0",\r
-"m& c #04AFB7",\r
-"n& c #05AFB6",\r
-"o& c #04A5AD",\r
-"p& c #038B8F",\r
-"q& c #037477",\r
-"r& c #04979E",\r
-"s& c #06B3B9",\r
-"t& c #06B3BA",\r
-"u& c #05A3AA",\r
-"v& c #04878B",\r
-"w& c #05A1A6",\r
-"x& c #05B2B8",\r
-"y& c #05ADB4",\r
-"z& c #049CA1",\r
-"A& c #03767A",\r
-"B& c #059BA0",\r
-"C& c #06B2B9",\r
-"D& c #04B2B9",\r
-"E& c #04A2A8",\r
-"F& c #048589",\r
-"G& c #047E82",\r
-"H& c #05A0A6",\r
-"I& c #06AFB7",\r
-"J& c #08B4BB",\r
-"K& c #07B4BB",\r
-"L& c #06B4BB",\r
-"M& c #06B4BA",\r
-"N& c #07B3BA",\r
-"O& c #06B0B7",\r
-"P& c #069FA5",\r
-"Q& c #047F81",\r
-"R& c #058B90",\r
-"S& c #05A6AD",\r
-"T& c #07B4BA",\r
-"U& c #07B2B9",\r
-"V& c #06ABB3",\r
-"W& c #05989C",\r
-"X& c #058084",\r
-"Y& c #059FA6",\r
-"Z& c #07AFB6",\r
-"`& c #059EA4",\r
-" * c #047D81",\r
-".* c #05878C",\r
-"+* c #08A6AC",\r
-"@* c #09B3B9",\r
-"#* c #08B5BC",\r
-"$* c #09B5BC",\r
-"%* c #09B4BB",\r
-"&* c #09AFB6",\r
-"** c #069CA1",\r
-"=* c #069399",\r
-"-* c #07ABB2",\r
-";* c #09B5BB",\r
-">* c #08B6BD",\r
-",* c #09B4BA",\r
-"'* c #07AAB1",\r
-")* c #049298",\r
-"!* c #058A8E",\r
-"~* c #07A5AC",\r
-"{* c #08B2B9",\r
-"]* c #08B4BC",\r
-"^* c #07AEB5",\r
-"/* c #079AA0",\r
-"(* c #079195",\r
-"_* c #09AAB2",\r
-":* c #0AB5BC",\r
-"<* c #0AB7BE",\r
-"[* c #09B6BD",\r
-"}* c #0AB6BD",\r
-"|* c #09ADB5",\r
-"1* c #07979C",\r
-"2* c #057578",\r
-"3* c #08AEB5",\r
-"4* c #0AB7BD",\r
-"5* c #08A9AF",\r
-"6* c #078D91",\r
-"7* c #069296",\r
-"8* c #09ACB3",\r
-"9* c #0AB6BC",\r
-"0* c #06969A",\r
-"a* c #057174",\r
-"b* c #08999F",\r
-"c* c #0AB0B6",\r
-"d* c #0AB8BF",\r
-"e* c #09B7BE",\r
-"f* c #0BB8BF",\r
-"g* c #0BB7BE",\r
-"h* c #09AAB1",\r
-"i* c #089196",\r
-"j* c #067F83",\r
-"k* c #09A1A8",\r
-"l* c #0AB2BA",\r
-"m* c #06868A",\r
-"n* c #067276",\r
-"o* c #099BA0",\r
-"p* c #0AB6BE",\r
-"q* c #0AB5BD",\r
-"r* c #078F93",\r
-"s* c #077C80",\r
-"t* c #0AA1A8",\r
-"u* c #0BB3BA",\r
-"v* c #0DBAC1",\r
-"w* c #0CB9C0",\r
-"x* c #0CBAC1",\r
-"y* c #0BB9C0",\r
-"z* c #0CB6BD",\r
-"A* c #0AA9AF",\r
-"B* c #098B90",\r
-"C* c #07888C",\r
-"D* c #0AA7AF",\r
-"E* c #0DB7BE",\r
-"F* c #0CBAC0",\r
-"G* c #0CB2BA",\r
-"H* c #077E82",\r
-"I* c #0BA2A8",\r
-"J* c #0AB4BB",\r
-"K* c #0BBAC1",\r
-"L* c #0CB9C1",\r
-"M* c #0BB6BE",\r
-"N* c #07888E",\r
-"O* c #08868B",\r
-"P* c #0BA6AE",\r
-"Q* c #0DBBC2",\r
-"R* c #0CBBC2",\r
-"S* c #0EBBC2",\r
-"T* c #0CBBC1",\r
-"U* c #0DBBC1",\r
-"V* c #0DBAC2",\r
-"W* c #0DB9C0",\r
-"X* c #0BB5BB",\r
-"Y* c #0BA4AB",\r
-"Z* c #088488",\r
-"`* c #0A9297",\r
-" = c #0BACB3",\r
-".= c #0EBAC1",\r
-"+= c #0A9CA2",\r
-"@= c #08888D",\r
-"#= c #0BA7AE",\r
-"$= c #0EB7BD",\r
-"%= c #0EBAC2",\r
-"&= c #0CB4BB",\r
-"*= c #0AA3AA",\r
-"== c #088085",\r
-"-= c #05585C",\r
-";= c #098F94",\r
-">= c #0DABB3",\r
-",= c #0CB8BF",\r
-"'= c #0EBCC2",\r
-")= c #0EBCC3",\r
-"!= c #0FBCC3",\r
-"~= c #0EB5BC",\r
-"{= c #0AA0A6",\r
-"]= c #0A999F",\r
-"^= c #0CB1B8",\r
-"/= c #0FBBC1",\r
-"(= c #0DB0B7",\r
-"_= c #0A959B",\r
-":= c #0A9196",\r
-"<= c #0DADB4",\r
-"[= c #0EB9C0",\r
-"}= c #0FBBC2",\r
-"|= c #0EBAC0",\r
-"1= c #0EB3BB",\r
-"2= c #0B9FA4",\r
-"3= c #097B80",\r
-"4= c #0A969C",\r
-"5= c #0DB1B7",\r
-"6= c #0FBDC3",\r
-"7= c #10BDC4",\r
-"8= c #0EBDC3",\r
-"9= c #0FBCC4",\r
-"0= c #10BCC2",\r
-"a= c #0EB4BA",\r
-"b= c #0B9BA0",\r
-"c= c #087C80",\r
-"d= c #0CA3A9",\r
-"e= c #0FB7BD",\r
-"f= c #0FBEC3",\r
-"g= c #0FBDC2",\r
-"h= c #0FBDC4",\r
-"i= c #10BAC1",\r
-"j= c #0DACB3",\r
-"k= c #0A9095",\r
-"l= c #0B999F",\r
-"m= c #0EB2BA",\r
-"n= c #0EBDC2",\r
-"o= c #0FBCC2",\r
-"p= c #10BDC3",\r
-"q= c #0EB2B9",\r
-"r= c #0B989F",\r
-"s= c #0C959A",\r
-"t= c #09787B",\r
-"u= c #0C9FA5",\r
-"v= c #10B6BE",\r
-"w= c #11BEC4",\r
-"x= c #10BEC4",\r
-"y= c #12BFC6",\r
-"z= c #11BEC5",\r
-"A= c #11BFC5",\r
-"B= c #10BFC4",\r
-"C= c #12BEC5",\r
-"D= c #11BFC6",\r
-"E= c #11BDC3",\r
-"F= c #0DB0B8",\r
-"G= c #0B9498",\r
-"H= c #0A868A",\r
-"I= c #0CA7AE",\r
-"J= c #10BBC0",\r
-"K= c #10BFC5",\r
-"L= c #11BDC5",\r
-"M= c #12BFC5",\r
-"N= c #10B9C0",\r
-"O= c #0DAAB0",\r
-"P= c #0A898E",\r
-"Q= c #0A7B7F",\r
-"R= c #0CA2A8",\r
-"S= c #10B7BE",\r
-"T= c #10BEC5",\r
-"U= c #0EB0B7",\r
-"V= c #0A9197",\r
-"W= c #0DA2A9",\r
-"X= c #11B0B8",\r
-"Y= c #0D9DA3",\r
-"Z= c #0B8487",\r
-"`= c #0EA7AF",\r
-" - c #11BBC1",\r
-".- c #13C1C7",\r
-"+- c #12C0C6",\r
-"@- c #14C1C7",\r
-"#- c #12C1C7",\r
-"$- c #13C0C6",\r
-"%- c #11BCC2",\r
-"&- c #0EACB3",\r
-"*- c #0B8D91",\r
-"=- c #0A8E94",\r
-"-- c #10AFB6",\r
-";- c #12C1C6",\r
-">- c #11B9C0",\r
-",- c #0EA7AD",\r
-"'- c #0A8689",\r
-")- c #10A9B0",\r
-"!- c #12BCC2",\r
-"~- c #13C0C5",\r
-"{- c #11C0C6",\r
-"]- c #12C0C5",\r
-"^- c #12BDC4",\r
-"/- c #0B8C90",\r
-"(- c #0FA8B0",\r
-"_- c #12BBC2",\r
-":- c #11B3BB",\r
-"<- c #0D969B",\r
-"[- c #0C8D91",\r
-"}- c #10AEB5",\r
-"|- c #13BEC4",\r
-"1- c #14C2C8",\r
-"2- c #13BCC3",\r
-"3- c #10A9B1",\r
-"4- c #0E999F",\r
-"5- c #10B3BA",\r
-"6- c #13BFC5",\r
-"7- c #13C2C8",\r
-"8- c #15C2C8",\r
-"9- c #15C1C7",\r
-"0- c #12B8BE",\r
-"a- c #0EA0A6",\r
-"b- c #0D8E93",\r
-"c- c #11AEB5",\r
-"d- c #13BDC4",\r
-"e- c #10A9AF",\r
-"f- c #104547",\r
-"g- c #0A8085",\r
-"h- c #11AFB5",\r
-"i- c #14BEC5",\r
-"j- c #11AFB6",\r
-"k- c #0D8F94",\r
-"l- c #0D959B",\r
-"m- c #11B3BA",\r
-"n- c #14BFC6",\r
-"o- c #15C3C9",\r
-"p- c #16C3C9",\r
-"q- c #16C2C8",\r
-"r- c #13B9C0",\r
-"s- c #10A5AB",\r
-"t- c #0A787C",\r
-"u- c #10A2A8",\r
-"v- c #13B9BF",\r
-"w- c #17C3C9",\r
-"x- c #13B6BD",\r
-"y- c #0F9BA1",\r
-"z- c #0D989E",\r
-"A- c #13B4BC",\r
-"B- c #10A3A9",\r
-"C- c #0E8B90",\r
-"D- c #14B4BB",\r
-"E- c #18C3C9",\r
-"F- c #17C4CA",\r
-"G- c #16BFC6",\r
-"H- c #11ABB2",\r
-"I- c #10A0A6",\r
-"J- c #16BAC1",\r
-"K- c #17C2C8",\r
-"L- c #18C5CA",\r
-"M- c #18C5CB",\r
-"N- c #16C1C7",\r
-"O- c #16B9BF",\r
-"P- c #109FA5",\r
-"Q- c #0C8286",\r
-"R- c #12A9AF",\r
-"S- c #15BDC3",\r
-"T- c #13B3B9",\r
-"U- c #0F949A",\r
-"V- c #10A1A7",\r
-"W- c #15BAC2",\r
-"X- c #15B8BF",\r
-"Y- c #0F9DA3",\r
-"Z- c #0F9297",\r
-"`- c #15B7BD",\r
-" ; c #19C6CC",\r
-".; c #19C5CA",\r
-"+; c #17BCC3",\r
-"@; c #12A6AD",\r
-"#; c #0C8185",\r
-"$; c #12A8AF",\r
-"%; c #17BDC4",\r
-"&; c #19C5CB",\r
-"*; c #19C6CD",\r
-"=; c #19C6CB",\r
-"-; c #18C5CC",\r
-";; c #17B6BD",\r
-">; c #10999F",\r
-",; c #0F8D92",\r
-"'; c #15B0B8",\r
-"); c #18C1C8",\r
-"!; c #1AC7CC",\r
-"~; c #18C6CB",\r
-"{; c #17C0C6",\r
-"]; c #14AFB6",\r
-"^; c #0D8388",\r
-"/; c #14AAAF",\r
-"(; c #17BFC5",\r
-"_; c #1AC6CC",\r
-":; c #19C2C9",\r
-"<; c #15B4BA",\r
-"[; c #11979C",\r
-"}; c #11989D",\r
-"|; c #17BAC0",\r
-"1; c #1AC7CD",\r
-"2; c #19C7CC",\r
-"3; c #18BBC2",\r
-"4; c #139FA6",\r
-"5; c #0E8A90",\r
-"6; c #16AFB5",\r
-"7; c #19C1C8",\r
-"8; c #1BC8CD",\r
-"9; c #1AC2C9",\r
-"0; c #15B2B8",\r
-"a; c #109196",\r
-"b; c #16B6BD",\r
-"c; c #1AC5CB",\r
-"d; c #1AC7CE",\r
-"e; c #18BFC5",\r
-"f; c #14AAB1",\r
-"g; c #0F8C92",\r
-"h; c #15B0B7",\r
-"i; c #19C2C8",\r
-"j; c #1BC7CD",\r
-"k; c #1AC7CB",\r
-"l; c #1BC8CE",\r
-"m; c #16B1B9",\r
-"n; c #108F94",\r
-"o; c #139FA4",\r
-"p; c #1ABFC5",\r
-"q; c #1CCACF",\r
-"r; c #1CC9CF",\r
-"s; c #1CC9CE",\r
-"t; c #1BC6CB",\r
-"u; c #19B8BF",\r
-"v; c #1299A0",\r
-"w; c #12949A",\r
-"x; c #18B5BC",\r
-"y; c #1AC4C9",\r
-"z; c #1CC8CE",\r
-"A; c #1BC8CF",\r
-"B; c #1CC9CD",\r
-"C; c #1BC7CE",\r
-"D; c #1AC2C8",\r
-"E; c #17B0B6",\r
-"F; c #13A1A7",\r
-"G; c #19BCC2",\r
-"H; c #1CC8CD",\r
-"I; c #1BC9CE",\r
-"J; c #1CC7CD",\r
-"K; c #1ABEC4",\r
-"L; c #14A5AB",\r
-"M; c #11979D",\r
-"N; c #18B7BD",\r
-"O; c #1AC4CA",\r
-"P; c #1CC8CF",\r
-"Q; c #1AC1C8",\r
-"R; c #16AEB4",\r
-"S; c #15A5AB",\r
-"T; c #1DC3C9",\r
-"U; c #1DCBCF",\r
-"V; c #1ECBD0",\r
-"W; c #1DCACF",\r
-"X; c #1CC6CC",\r
-"Y; c #19B5BB",\r
-"Z; c #129398",\r
-"`; c #159EA4",\r
-" > c #1ABBC1",\r
-".> c #1DC8CD",\r
-"+> c #1DCAD0",\r
-"@> c #1DCBD0",\r
-"#> c #1ECCD0",\r
-"$> c #1CC2C7",\r
-"%> c #17AAB0",\r
-"&> c #0F8084",\r
-"*> c #16A9AF",\r
-"=> c #1CC2C6",\r
-"-> c #1DC9CE",\r
-";> c #1ABCC2",\r
-">> c #14A0A5",\r
-",> c #14A1A7",\r
-"'> c #1ABDC3",\r
-")> c #1DC7CE",\r
-"!> c #1DCBD1",\r
-"~> c #1BC1C7",\r
-"{> c #17ABB1",\r
-"]> c #1DC6CC",\r
-"^> c #20CED2",\r
-"/> c #1FCCD1",\r
-"(> c #1FCDD1",\r
-"_> c #1ECCD1",\r
-":> c #1EC6CB",\r
-"<> c #1AB2B8",\r
-"[> c #17A7AD",\r
-"}> c #1DC1C7",\r
-"|> c #20CCD1",\r
-"1> c #1FCDD2",\r
-"2> c #20CDD2",\r
-"3> c #1FCED2",\r
-"4> c #1FCBD0",\r
-"5> c #1DC0C7",\r
-"6> c #18A5AB",\r
-"7> c #128B90",\r
-"8> c #19B1B8",\r
-"9> c #1DC5CA",\r
-"0> c #1EC8CD",\r
-"a> c #1BBAC0",\r
-"b> c #15999D",\r
-"c> c #107F83",\r
-"d> c #18A9AF",\r
-"e> c #1CC0C7",\r
-"f> c #1FCCD2",\r
-"g> c #1CBEC5",\r
-"h> c #12A0A5",\r
-"i> c #016E73",\r
-"j> c #1AB1B8",\r
-"k> c #1FCACF",\r
-"l> c #20CDD0",\r
-"m> c #1EC3C9",\r
-"n> c #19ABB2",\r
-"o> c #12888B",\r
-"p> c #1AB0B6",\r
-"q> c #1EC5CB",\r
-"r> c #20CDD1",\r
-"s> c #20CBCF",\r
-"t> c #1CBBC1",\r
-"u> c #159CA1",\r
-"v> c #15959B",\r
-"w> c #1CB8BE",\r
-"x> c #1FC7CC",\r
-"y> c #1FC8CD",\r
-"z> c #1BB5BC",\r
-"A> c #138F94",\r
-"B> c #12898F",\r
-"C> c #19B0B7",\r
-"D> c #20CACF",\r
-"E> c #1DBCC2",\r
-"F> c #12888C",\r
-"G> c #1CB8BD",\r
-"H> c #20CCD0",\r
-"I> c #20CFD3",\r
-"J> c #21CFD3",\r
-"K> c #20CED3",\r
-"L> c #1EC1C6",\r
-"M> c #18A4A9",\r
-"N> c #149197",\r
-"O> c #1BB7BD",\r
-"P> c #20C9CF",\r
-"Q> c #1FC9CE",\r
-"R> c #149499",\r
-"S> c #17A0A5",\r
-"T> c #1CBDC3",\r
-"U> c #20CAD0",\r
-"V> c #21CFD2",\r
-"W> c #1FC6CB",\r
-"X> c #1BAFB6",\r
-"Y> c #1CB7BD",\r
-"Z> c #1FCED3",\r
-"`> c #1FC7CD",\r
-" , c #1CB6BD",\r
-"., c #0F8D93",\r
-"+, c #158F94",\r
-"@, c #1EBCC3",\r
-"#, c #22CFD3",\r
-"$, c #21D1D4",\r
-"%, c #21D0D4",\r
-"&, c #21D0D5",\r
-"*, c #21D1D5",\r
-"=, c #20CFD4",\r
-"-, c #22D1D5",\r
-";, c #22D0D4",\r
-">, c #21CDD1",\r
-",, c #1EBFC4",\r
-"', c #179DA2",\r
-"), c #189EA2",\r
-"!, c #1FBEC4",\r
-"~, c #22D1D4",\r
-"{, c #20C8CD",\r
-"], c #1CB4B9",\r
-"^, c #1AA8AE",\r
-"/, c #1FC4C9",\r
-"(, c #21CED2",\r
-"_, c #1FC5CA",\r
-":, c #19A9AF",\r
-"<, c #189FA4",\r
-"[, c #21CDD2",\r
-"}, c #22D0D5",\r
-"|, c #21CFD4",\r
-"1, c #1BB1B7",\r
-"2, c #004B4E",\r
-"3, c #17979D",\r
-"4, c #20C1C7",\r
-"5, c #23D2D6",\r
-"6, c #24D3D5",\r
-"7, c #23D2D5",\r
-"8, c #24D3D7",\r
-"9, c #24D2D6",\r
-"0, c #23CED2",\r
-"a, c #1FBAC1",\r
-"b, c #17969A",\r
-"c, c #1BA8AD",\r
-"d, c #21C4C9",\r
-"e, c #24D3D6",\r
-"f, c #23D0D4",\r
-"g, c #21C8CC",\r
-"h, c #1DAEB5",\r
-"i, c #15888C",\r
-"j, c #1DB1B7",\r
-"k, c #22C9CF",\r
-"l, c #23D1D5",\r
-"m, c #23D3D6",\r
-"n, c #23D0D3",\r
-"o, c #19A3A8",\r
-"p, c #1BA9AF",\r
-"q, c #22C6CB",\r
-"r, c #23D0D5",\r
-"s, c #23D3D5",\r
-"t, c #22C7CC",\r
-"u, c #13A7AD",\r
-"v, c #005256",\r
-"w, c #189EA3",\r
-"x, c #22C5CA",\r
-"y, c #25D3D7",\r
-"z, c #26D4D7",\r
-"A, c #26D4D8",\r
-"B, c #25D2D6",\r
-"C, c #23CCD0",\r
-"D, c #1EB6BC",\r
-"E, c #148588",\r
-"F, c #1DAFB4",\r
-"G, c #22C8CD",\r
-"H, c #25D2D5",\r
-"I, c #26D3D7",\r
-"J, c #25D3D6",\r
-"K, c #26D4D6",\r
-"L, c #25D4D7",\r
-"M, c #21C6CA",\r
-"N, c #1BA8AE",\r
-"O, c #179297",\r
-"P, c #20B9BE",\r
-"Q, c #23CDD0",\r
-"R, c #24CFD3",\r
-"S, c #20BEC3",\r
-"T, c #189AA0",\r
-"U, c #14868B",\r
-"V, c #1DB2B7",\r
-"W, c #24D1D5",\r
-"X, c #1FC2C8",\r
-"Y, c #21A7AD",\r
-"Z, c #1CA6AB",\r
-"`, c #23C9CD",\r
-" ' c #27D5D8",\r
-".' c #27D4D8",\r
-"+' c #26D5D8",\r
-"@' c #23CBCF",\r
-"#' c #1EAFB4",\r
-"$' c #178E93",\r
-"%' c #1FB7BC",\r
-"&' c #24CCD0",\r
-"*' c #27D4D7",\r
-"=' c #27D5D7",\r
-"-' c #25D1D5",\r
-";' c #21C2C7",\r
-">' c #1BA2A6",\r
-",' c #1A9DA2",\r
-"'' c #21BFC4",\r
-")' c #25D0D5",\r
-"!' c #25CED1",\r
-"~' c #20B9BF",\r
-"{' c #179196",\r
-"]' c #20B8BD",\r
-"^' c #24CDD1",\r
-"/' c #25D0D4",\r
-"(' c #19BCC1",\r
-"_' c #10979C",\r
-":' c #1EACB2",\r
-"<' c #27CED2",\r
-"[' c #29D8DA",\r
-"}' c #29D7DA",\r
-"|' c #28D7DA",\r
-"1' c #29D8DB",\r
-"2' c #29D6D9",\r
-"3' c #28D4D7",\r
-"4' c #24C6CB",\r
-"5' c #1DA9AE",\r
-"6' c #1A999E",\r
-"7' c #22BEC3",\r
-"8' c #27D2D5",\r
-"9' c #28D6D9",\r
-"0' c #23BEC4",\r
-"a' c #1A999D",\r
-"b' c #1DA7AC",\r
-"c' c #25C7CA",\r
-"d' c #28D4D8",\r
-"e' c #29D7D9",\r
-"f' c #26CDD0",\r
-"g' c #1FB5B9",\r
-"h' c #1B9DA2",\r
-"i' c #21BFC5",\r
-"j' c #27D2D6",\r
-"k' c #28D1D4",\r
-"l' c #1AB9BE",\r
-"m' c #026D72",\r
-"n' c #20B4B9",\r
-"o' c #28D4D6",\r
-"p' c #23C3C8",\r
-"q' c #1CA1A6",\r
-"r' c #1DA4A8",\r
-"s' c #25C5CA",\r
-"t' c #29D4D8",\r
-"u' c #2AD9DB",\r
-"v' c #28D8DA",\r
-"w' c #2AD8DB",\r
-"x' c #2AD8DA",\r
-"y' c #26CFD3",\r
-"z' c #21B7BD",\r
-"A' c #1FB0B5",\r
-"B' c #27CCD0",\r
-"C' c #28D8DB",\r
-"D' c #28D6D8",\r
-"E' c #26CACF",\r
-"F' c #1EADB3",\r
-"G' c #1EA6AA",\r
-"H' c #26C6CB",\r
-"I' c #29D5D8",\r
-"J' c #27CFD3",\r
-"K' c #1CAFB4",\r
-"L' c #168488",\r
-"M' c #23BABF",\r
-"N' c #2AD5D8",\r
-"O' c #2ADADD",\r
-"P' c #2AD9DC",\r
-"Q' c #2ADADC",\r
-"R' c #2ADADB",\r
-"S' c #2ADBDC",\r
-"T' c #29D9DA",\r
-"U' c #29D2D6",\r
-"V' c #23BFC4",\r
-"W' c #1B999E",\r
-"X' c #1FAEB2",\r
-"Y' c #26CBCF",\r
-"Z' c #2AD7DB",\r
-"`' c #29D9DB",\r
-" ) c #28CDD1",\r
-".) c #20B1B6",\r
-"+) c #198F95",\r
-"@) c #22B9BF",\r
-"#) c #2AD9DD",\r
-"$) c #2BDADC",\r
-"%) c #2AD6D9",\r
-"&) c #1EA5AB",\r
-"*) c #20AFB5",\r
-"=) c #29D8DC",\r
-"-) c #2ADBDD",\r
-";) c #2BD8DA",\r
-">) c #26C8CD",\r
-",) c #178A8F",\r
-"') c #25C0C5",\r
-")) c #2CD9DC",\r
-"!) c #2CDDDF",\r
-"~) c #2BDBDD",\r
-"{) c #2CDBDD",\r
-"]) c #2BDCDD",\r
-"^) c #2DDCDE",\r
-"/) c #2CDCDD",\r
-"() c #2CDBDE",\r
-"_) c #2CDDDE",\r
-":) c #29D2D5",\r
-"<) c #24BAC0",\r
-"[) c #188B90",\r
-"}) c #23B7BD",\r
-"|) c #2AD0D4",\r
-"1) c #2CDCDE",\r
-"2) c #2BDBDC",\r
-"3) c #2DDCDD",\r
-"4) c #2CDBDC",\r
-"5) c #2BD8DB",\r
-"6) c #28CACF",\r
-"7) c #21ADB1",\r
-"8) c #1C9AA0",\r
-"9) c #26C1C6",\r
-"0) c #2DDDDD",\r
-"a) c #2BDADD",\r
-"b) c #2BD7D9",\r
-"c) c #26C3C8",\r
-"d) c #1D9FA4",\r
-"e) c #198D92",\r
-"f) c #23B9BD",\r
-"g) c #2CDDDD",\r
-"h) c #2BD7D8",\r
-"i) c #1A9397",\r
-"j) c #27C6CA",\r
-"k) c #2EDBDD",\r
-"l) c #2DDEDF",\r
-"m) c #2DDDDF",\r
-"n) c #2EDDDF",\r
-"o) c #2DDEDE",\r
-"p) c #2EDEDF",\r
-"q) c #2DDDDE",\r
-"r) c #2EDEDE",\r
-"s) c #2BD1D4",\r
-"t) c #22B5BA",\r
-"u) c #1C969B",\r
-"v) c #27C0C5",\r
-"w) c #2CD6D8",\r
-"x) c #2DDBDD",\r
-"y) c #28C8CC",\r
-"z) c #1FA4AA",\r
-"A) c #1FA5AA",\r
-"B) c #2CD9DB",\r
-"C) c #2AD4D7",\r
-"D) c #26C0C4",\r
-"E) c #1D999D",\r
-"F) c #26C0C5",\r
-"G) c #2BD6D9",\r
-"H) c #2EDDDE",\r
-"I) c #07575A",\r
-"J) c #1E9DA0",\r
-"K) c #29CACE",\r
-"L) c #2EE0E1",\r
-"M) c #2EDFE0",\r
-"N) c #2FDFE0",\r
-"O) c #2EDEE0",\r
-"P) c #2EDCDE",\r
-"Q) c #2ACED2",\r
-"R) c #22AEB2",\r
-"S) c #1FA2A6",\r
-"T) c #29C6CA",\r
-"U) c #2DD9DC",\r
-"V) c #2EDFDF",\r
-"W) c #2CD8DA",\r
-"X) c #27C3C8",\r
-"Y) c #1D9CA1",\r
-"Z) c #23AFB3",\r
-"`) c #2ACED1",\r
-" ! c #2FDFDF",\r
-".! c #2CD4D7",\r
-"+! c #25B9BD",\r
-"@! c #1FA3A8",\r
-"#! c #29C9CC",\r
-"$! c #2DDADC",\r
-"%! c #085E62",\r
-"&! c #21A3A9",\r
-"*! c #2CCFD2",\r
-"=! c #2FE0E1",\r
-"-! c #30E1E1",\r
-";! c #30E0E1",\r
-">! c #2AC9CC",\r
-",! c #22A5AA",\r
-"'! c #22ABB1",\r
-")! c #2BCCD0",\r
-"!! c #2DDBDC",\r
-"~! c #2DD6D9",\r
-"{! c #27BEC4",\r
-"]! c #24B8BD",\r
-"^! c #2CD3D7",\r
-"/! c #2FDEE0",\r
-"(! c #2FDEDF",\r
-"_! c #2CD1D4",\r
-":! c #23B2B7",\r
-"<! c #23AEB2",\r
-"[! c #0A666B",\r
-"}! c #23ABB1",\r
-"|! c #2DD3D5",\r
-"1! c #2EDADD",\r
-"2! c #2AC3C8",\r
-"3! c #25B5BA",\r
-"4! c #2DD3D4",\r
-"5! c #30DFE0",\r
-"6! c #2DD4D6",\r
-"7! c #26B7BC",\r
-"8! c #1C959A",\r
-"9! c #28C1C6",\r
-"0! c #2ED9DB",\r
-"a! c #30E1E2",\r
-"b! c #2FDDDF",\r
-"c! c #23AAB0",\r
-"d! c #26B8BD",\r
-"e! c #0C6E72",\r
-"f! c #25B4B9",\r
-"g! c #2ED7D8",\r
-"h! c #31E3E3",\r
-"i! c #32E2E3",\r
-"j! c #31E1E2",\r
-"k! c #32E2E2",\r
-"l! c #31E2E2",\r
-"m! c #32E3E3",\r
-"n! c #2ED8DA",\r
-"o! c #29BFC3",\r
-"p! c #1E9498",\r
-"q! c #28BFC2",\r
-"r! c #2FD8DA",\r
-"s! c #32E3E2",\r
-"t! c #31E1E1",\r
-"u! c #31DFE1",\r
-"v! c #2ED2D4",\r
-"w! c #24AEB4",\r
-"x! c #22A3A7",\r
-"y! c #2BC8CD",\r
-"z! c #2FDDDE",\r
-"A! c #31E2E1",\r
-"B! c #32E1E2",\r
-"C! c #30DDDE",\r
-"D! c #2BC8CA",\r
-"E! c #21A1A6",\r
-"F! c #1E969A",\r
-"G! c #29C0C3",\r
-"H! c #2FD7DA",\r
-"I! c #32E1E1",\r
-"J! c #30E2E2",\r
-"K! c #32E1E3",\r
-"L! c #12787C",\r
-"M! c #29BCC0",\r
-"N! c #31DDDD",\r
-"O! c #33E5E4",\r
-"P! c #33E3E3",\r
-"Q! c #33E4E3",\r
-"R! c #33E4E4",\r
-"S! c #2FD6D8",\r
-"T! c #28B7BC",\r
-"U! c #219EA2",\r
-"V! c #2CC7CB",\r
-"W! c #31DDDE",\r
-"X! c #34E4E3",\r
-"Y! c #32E4E3",\r
-"Z! c #32E0E0",\r
-"`! c #2CCCCF",\r
-" ~ c #24A7AC",\r
-".~ c #24ADB2",\r
-"+~ c #2ED1D3",\r
-"@~ c #32E4E4",\r
-"#~ c #33E3E4",\r
-"$~ c #33E2E3",\r
-"%~ c #34E4E4",\r
-"&~ c #30DBDC",\r
-"*~ c #2BC2C6",\r
-"=~ c #22A1A6",\r
-"-~ c #2CC8CB",\r
-";~ c #1C868A",\r
-">~ c #2BC3C6",\r
-",~ c #34E0E0",\r
-"'~ c #34E5E5",\r
-")~ c #34E5E4",\r
-"!~ c #34E6E5",\r
-"~~ c #34E6E4",\r
-"{~ c #35E6E5",\r
-"]~ c #34E6E6",\r
-"^~ c #33E2E2",\r
-"/~ c #2FD4D6",\r
-"(~ c #26B1B6",\r
-"_~ c #24A9AE",\r
-":~ c #2ED0D1",\r
-"<~ c #34E2E2",\r
-"[~ c #35E6E6",\r
-"}~ c #35E5E4",\r
-"|~ c #32DEDF",\r
-"1~ c #2DC8CB",\r
-"2~ c #31D8D9",\r
-"3~ c #34E5E6",\r
-"4~ c #35E5E5",\r
-"5~ c #35E4E3",\r
-"6~ c #31DADB",\r
-"7~ c #2ABFC2",\r
-"8~ c #26ACB0",\r
-"9~ c #2ECFD2",\r
-"0~ c #1F8F93",\r
-"a~ c #34E3E3",\r
-"b~ c #36E8E7",\r
-"c~ c #37E8E7",\r
-"d~ c #37E7E6",\r
-"e~ c #36E7E6",\r
-"f~ c #37E7E7",\r
-"g~ c #36E6E6",\r
-"h~ c #35E2E3",\r
-"i~ c #2FD0D2",\r
-"j~ c #25A9AD",\r
-"k~ c #28B4B8",\r
-"l~ c #31D7D9",\r
-"m~ c #37E5E5",\r
-"n~ c #36E8E6",\r
-"o~ c #36E7E5",\r
-"p~ c #36E7E7",\r
-"q~ c #33DEDE",\r
-"r~ c #2CC3C7",\r
-"s~ c #209397",\r
-"t~ c #2CC1C4",\r
-"u~ c #32DDDD",\r
-"v~ c #35E7E5",\r
-"w~ c #35E7E6",\r
-"x~ c #37E8E6",\r
-"y~ c #36E6E5",\r
-"z~ c #31D9DB",\r
-"A~ c #29B7BB",\r
-"B~ c #29B6BB",\r
-"C~ c #32D7D9",\r
-"D~ c #36E5E4",\r
-"E~ c #21979C",\r
-"F~ c #2FCDD0",\r
-"G~ c #36E5E6",\r
-"H~ c #38E9E8",\r
-"I~ c #38E8E8",\r
-"J~ c #38E8E7",\r
-"K~ c #38E7E7",\r
-"L~ c #35E1E2",\r
-"M~ c #2ECBCD",\r
-"N~ c #2BBFC2",\r
-"O~ c #33DCDE",\r
-"P~ c #37E6E6",\r
-"Q~ c #37E8E8",\r
-"R~ c #33DBDB",\r
-"S~ c #2BBCC0",\r
-"T~ c #239DA2",\r
-"U~ c #2FC9CC",\r
-"V~ c #31D4D6",\r
-"W~ c #27AEB3",\r
-"X~ c #34DDDE",\r
-"Y~ c #186467",\r
-"Z~ c #239EA2",\r
-"`~ c #32D2D5",\r
-" { c #39E9E8",\r
-".{ c #39E8E8",\r
-"+{ c #35E0E0",\r
-"@{ c #2EC5C7",\r
-"#{ c #239B9E",\r
-"${ c #2EC7CA",\r
-"%{ c #35E1E1",\r
-"&{ c #32D7D8",\r
-"*{ c #2AB5B8",\r
-"={ c #25A8AC",\r
-"-{ c #32D0D2",\r
-";{ c #37E4E4",\r
-">{ c #2FCFD0",\r
-",{ c #239CA0",\r
-"'{ c #2EC9CC",\r
-"){ c #36E1E1",\r
-"!{ c #3AEAE8",\r
-"~{ c #39E9E7",\r
-"{{ c #239EA1",\r
-"]{ c #32D2D3",\r
-"^{ c #39E7E7",\r
-"/{ c #3AEAE9",\r
-"({ c #3AE8E7",\r
-"_{ c #35DDDD",\r
-":{ c #2CBDC0",\r
-"<{ c #26A6AA",\r
-"[{ c #31D0D1",\r
-"}{ c #37E4E3",\r
-"|{ c #3AE9E8",\r
-"1{ c #38E5E4",\r
-"2{ c #31D3D4",\r
-"3{ c #27ADB0",\r
-"4{ c #2AB4B9",\r
-"5{ c #33D8D9",\r
-"6{ c #36E2E1",\r
-"7{ c #2FC8CC",\r
-"8{ c #27A8AC",\r
-"9{ c #31D2D4",\r
-"0{ c #37E5E4",\r
-"a{ c #0A8084",\r
-"b{ c #30C7CA",\r
-"c{ c #38E3E3",\r
-"d{ c #3BEBE9",\r
-"e{ c #3BECEA",\r
-"f{ c #3CECEA",\r
-"g{ c #34D8D9",\r
-"h{ c #2AB3B6",\r
-"i{ c #2AB2B5",\r
-"j{ c #33D8D8",\r
-"k{ c #39E7E6",\r
-"l{ c #37E3E3",\r
-"m{ c #31CDCF",\r
-"n{ c #2CBFC2",\r
-"o{ c #37E0E0",\r
-"p{ c #3BEAE9",\r
-"q{ c #36DFDF",\r
-"r{ c #2DC1C4",\r
-"s{ c #2AB4B8",\r
-"t{ c #35D9DA",\r
-"u{ c #3BEAE8",\r
-"v{ c #149BA0",\r
-"w{ c #36D7D7",\r
-"x{ c #3CE9E7",\r
-"y{ c #3DEDEB",\r
-"z{ c #3DECEB",\r
-"A{ c #3DEDEC",\r
-"B{ c #3EEEEB",\r
-"C{ c #3EEDEB",\r
-"D{ c #3BE9E8",\r
-"E{ c #34D4D5",\r
-"F{ c #28ACB0",\r
-"G{ c #2DBDC0",\r
-"H{ c #37DEDE",\r
-"I{ c #3DEAE9",\r
-"J{ c #3DEEEB",\r
-"K{ c #3EEDEC",\r
-"L{ c #39E5E3",\r
-"M{ c #31C9CA",\r
-"N{ c #249B9E",\r
-"O{ c #31CBCD",\r
-"P{ c #3AE5E4",\r
-"Q{ c #3DEDEA",\r
-"R{ c #3CEBE9",\r
-"S{ c #37DCDC",\r
-"T{ c #2CBBBD",\r
-"U{ c #2FBFC2",\r
-"V{ c #37DFDF",\r
-"W{ c #14A7AA",\r
-"X{ c #39DDDC",\r
-"Y{ c #3DEBEA",\r
-"Z{ c #3FEEEC",\r
-"`{ c #3EEEED",\r
-" ] c #3EEFED",\r
-".] c #3FEDEC",\r
-"+] c #3FEFED",\r
-"@] c #3EEEEC",\r
-"#] c #3EEDED",\r
-"$] c #3CE7E6",\r
-"%] c #33CFD0",\r
-"&] c #249599",\r
-"*] c #31C6C8",\r
-"=] c #3AE4E2",\r
-"-] c #3FEEED",\r
-";] c #3FEDED",\r
-">] c #38E1E0",\r
-",] c #2FC2C3",\r
-"'] c #28A6AA",\r
-")] c #34D2D4",\r
-"!] c #3DEAE8",\r
-"~] c #36DADA",\r
-"{] c #2CB3B6",\r
-"]] c #23999D",\r
-"^] c #30C9CA",\r
-"/] c #3AE4E3",\r
-"(] c #23B9BB",\r
-"_] c #39E1E1",\r
-":] c #3FEEEB",\r
-"<] c #40EFED",\r
-"[] c #40F0ED",\r
-"}] c #40EEED",\r
-"|] c #3FEFEC",\r
-"1] c #3BE5E3",\r
-"2] c #32C9CB",\r
-"3] c #26A1A5",\r
-"4] c #33D0D0",\r
-"5] c #3DE8E7",\r
-"6] c #40EFEE",\r
-"7] c #3FF0ED",\r
-"8] c #40F0EE",\r
-"9] c #38DDDD",\r
-"0] c #2CB7BB",\r
-"a] c #2BB2B6",\r
-"b] c #37DADA",\r
-"c] c #3EEBE9",\r
-"d] c #3DEAE7",\r
-"e] c #35D5D6",\r
-"f] c #28A4A7",\r
-"g] c #35D1D3",\r
-"h] c #3DE9E7",\r
-"i] c #0C868C",\r
-"j] c #33CACB",\r
-"k] c #3DE7E4",\r
-"l] c #40EFEC",\r
-"m] c #41F1ED",\r
-"n] c #41F0ED",\r
-"o] c #3AE2E1",\r
-"p] c #30C1C4",\r
-"q] c #2BADB0",\r
-"r] c #37D8D8",\r
-"s] c #3FECEA",\r
-"t] c #41F1EE",\r
-"u] c #3EECEA",\r
-"v] c #2BAEB3",\r
-"w] c #2FBDC0",\r
-"x] c #3AE0E0",\r
-"y] c #40EDEA",\r
-"z] c #40F1ED",\r
-"A] c #3DE8E6",\r
-"B] c #34CED0",\r
-"C] c #2BB0B4",\r
-"D] c #38D9D9",\r
-"E] c #3FEBE9",\r
-"F] c #40F0EC",\r
-"G] c #1E9DA2",\r
-"H] c #36D2D3",\r
-"I] c #3FEAE8",\r
-"J] c #42F0EE",\r
-"K] c #42F1EE",\r
-"L] c #43F2EF",\r
-"M] c #43F1EE",\r
-"N] c #41EEEC",\r
-"O] c #3ADEDE",\r
-"P] c #2FB9BC",\r
-"Q] c #2FBABD",\r
-"R] c #3AE0DF",\r
-"S] c #42F1ED",\r
-"T] c #3FEBE8",\r
-"U] c #35D2D2",\r
-"V] c #32C7C9",\r
-"W] c #3DE5E4",\r
-"X] c #41EFEC",\r
-"Y] c #32C8CA",\r
-"Z] c #2EBABE",\r
-"`] c #3BE0DF",\r
-" ^ c #40EEEC",\r
-".^ c #25ACAF",\r
-"+^ c #39DBDA",\r
-"@^ c #41EEEA",\r
-"#^ c #40EDEB",\r
-"$^ c #39D9DA",\r
-"%^ c #2BAEB1",\r
-"&^ c #31C4C6",\r
-"*^ c #3EE5E3",\r
-"=^ c #42F0ED",\r
-"-^ c #42F2EE",\r
-";^ c #43F2EE",\r
-">^ c #3EE8E6",\r
-",^ c #28A1A6",\r
-"'^ c #35CFD1",\r
-")^ c #3FE9E7",\r
-"!^ c #43F1EF",\r
-"~^ c #42F2EF",\r
-"{^ c #41EFED",\r
-"]^ c #3CE3E0",\r
-"^^ c #30BDC0",\r
-"/^ c #32C6C8",\r
-"(^ c #3EE7E4",\r
-"_^ c #30BCBF",\r
-":^ c #3DE3E1",\r
-"<^ c #44F1EE",\r
-"[^ c #45F4F0",\r
-"}^ c #43F3EF",\r
-"|^ c #44F4F0",\r
-"1^ c #44F3F0",\r
-"2^ c #43F2F0",\r
-"3^ c #37D4D4",\r
-"4^ c #279DA1",\r
-"5^ c #35CECF",\r
-"6^ c #40EBE7",\r
-"7^ c #43F3F0",\r
-"8^ c #3DE5E2",\r
-"9^ c #32C3C5",\r
-"0^ c #2BADB1",\r
-"a^ c #3AD9D9",\r
-"b^ c #42EFEC",\r
-"c^ c #44F3EF",\r
-"d^ c #3ADDDC",\r
-"e^ c #2EB4B7",\r
-"f^ c #27A0A4",\r
-"g^ c #36D2D1",\r
-"h^ c #41ECE9",\r
-"i^ c #44F2EF",\r
-"j^ c #45F3F0",\r
-"k^ c #34C8CA",\r
-"l^ c #40E8E6",\r
-"m^ c #46F5F0",\r
-"n^ c #47F6F1",\r
-"o^ c #46F5F1",\r
-"p^ c #47F5F1",\r
-"q^ c #45F5F0",\r
-"r^ c #45F5F1",\r
-"s^ c #45F4F1",\r
-"t^ c #46F4F1",\r
-"u^ c #41EBE8",\r
-"v^ c #36CCCD",\r
-"w^ c #2BAAAD",\r
-"x^ c #3BD9D8",\r
-"y^ c #44EFEC",\r
-"z^ c #3EE3E1",\r
-"A^ c #30BBBD",\r
-"B^ c #30BABD",\r
-"C^ c #3EE3E2",\r
-"D^ c #46F3F0",\r
-"E^ c #47F5F0",\r
-"F^ c #46F4F0",\r
-"G^ c #39D8D8",\r
-"H^ c #2CADB0",\r
-"I^ c #3AD9DA",\r
-"J^ c #43F0EC",\r
-"K^ c #2AA1A4",\r
-"L^ c #38D1D2",\r
-"M^ c #42EDE9",\r
-"N^ c #47F5F2",\r
-"O^ c #47F6F2",\r
-"P^ c #48F5F1",\r
-"Q^ c #40E7E5",\r
-"R^ c #34C4C6",\r
-"S^ c #30B6B9",\r
-"T^ c #3DDFDD",\r
-"U^ c #44F1ED",\r
-"V^ c #48F5F2",\r
-"W^ c #45F2EE",\r
-"X^ c #3CDEDC",\r
-"Y^ c #2EB1B5",\r
-"Z^ c #34C4C7",\r
-"`^ c #40E8E5",\r
-" / c #48F6F2",\r
-"./ c #48F6F1",\r
-"+/ c #43EDEA",\r
-"@/ c #30B8BC",\r
-"#/ c #3EE1E0",\r
-"$/ c #44F2EE",\r
-"%/ c #46F5F2",\r
-"&/ c #3BDBDA",\r
-"*/ c #45F1ED",\r
-"=/ c #49F7F2",\r
-"-/ c #4AF7F2",\r
-";/ c #49F7F1",\r
-">/ c #49F6F2",\r
-",/ c #46F3EF",\r
-"'/ c #3FE2E0",\r
-")/ c #31BBBD",\r
-"!/ c #33C1C3",\r
-"~/ c #3FE5E2",\r
-"{/ c #47F3EF",\r
-"]/ c #45F2EC",\r
-"^/ c #3AD6D7",\r
-"// c #38CECF",\r
-"(/ c #43EDE9",\r
-"_/ c #49F6F1",\r
-":/ c #49F7F3",\r
-"</ c #48F7F2",\r
-"[/ c #47F4F1",\r
-"}/ c #42EAE6",\r
-"|/ c #36C9CA",\r
-"1/ c #33C2C4",\r
-"2/ c #40E7E3",\r
-"3/ c #47F3F0",\r
-"4/ c #32B9BD",\r
-"5/ c #40E3E1",\r
-"6/ c #47F4EF",\r
-"7/ c #4CF8F3",\r
-"8/ c #4BF8F3",\r
-"9/ c #4BF7F2",\r
-"0/ c #4DF8F3",\r
-"a/ c #49F6F3",\r
-"b/ c #4BF7F3",\r
-"c/ c #4BF8F2",\r
-"d/ c #46F1ED",\r
-"e/ c #3EDDDC",\r
-"f/ c #2FB1B3",\r
-"g/ c #36CACC",\r
-"h/ c #44EDE9",\r
-"i/ c #4CF7F2",\r
-"j/ c #45EEEB",\r
-"k/ c #38CFCF",\r
-"l/ c #2CA9AB",\r
-"m/ c #3AD9D7",\r
-"n/ c #46F1EC",\r
-"o/ c #4CF7F3",\r
-"p/ c #49F6F0",\r
-"q/ c #42E7E4",\r
-"r/ c #34C2C3",\r
-"s/ c #38CCCD",\r
-"t/ c #4AF6F1",\r
-"u/ c #36C5C6",\r
-"v/ c #42E9E5",\r
-"w/ c #4FF8F3",\r
-"x/ c #50F8F4",\r
-"y/ c #4FF8F4",\r
-"z/ c #4EF8F3",\r
-"A/ c #4DF7F4",\r
-"B/ c #47F1ED",\r
-"C/ c #3AD7D6",\r
-"D/ c #2CA3A6",\r
-"E/ c #3BD6D5",\r
-"F/ c #45F1EC",\r
-"G/ c #4DF7F3",\r
-"H/ c #4EF8F4",\r
-"I/ c #50F9F4",\r
-"J/ c #4CF6F2",\r
-"K/ c #43E9E5",\r
-"L/ c #35C5C7",\r
-"M/ c #30B5B7",\r
-"N/ c #3FE0DF",\r
-"O/ c #49F4F0",\r
-"P/ c #4BF5F0",\r
-"Q/ c #40E2DF",\r
-"R/ c #30B7B9",\r
-"S/ c #2CA6A9",\r
-"T/ c #4DF8F2",\r
-"U/ c #39CFCF",\r
-"V/ c #46EFEA",\r
-"W/ c #4EF7F2",\r
-"X/ c #52F9F5",\r
-"Y/ c #52F8F4",\r
-"Z/ c #53F9F5",\r
-"`/ c #51F8F4",\r
-" ( c #51F9F5",\r
-".( c #50F8F3",\r
-"+( c #3AD0D0",\r
-"@( c #2FB2B3",\r
-"#( c #3FDFDD",\r
-"$( c #49F4EF",\r
-"%( c #52F9F4",\r
-"&( c #51F8F5",\r
-"*( c #4CF6F1",\r
-"=( c #33BEBF",\r
-"-( c #34C0C2",\r
-";( c #42E8E4",\r
-">( c #4DF6F2",\r
-",( c #50F9F3",\r
-"'( c #49F3EF",\r
-")( c #3CDBDA",\r
-"!( c #30B3B6",\r
-"~( c #40E1E0",\r
-"{( c #2DA9AC",\r
-"]( c #3EDAD8",\r
-"^( c #4BF3EE",\r
-"/( c #54FBF5",\r
-"(( c #54FAF5",\r
-"_( c #55FAF5",\r
-":( c #53FAF5",\r
-"<( c #54F9F5",\r
-"[( c #56FAF5",\r
-"}( c #55F9F5",\r
-"|( c #45ECE8",\r
-"1( c #37C8C9",\r
-"2( c #33BDC0",\r
-"3( c #43E7E3",\r
-"4( c #4EF6F2",\r
-"5( c #4CF5F1",\r
-"6( c #40E1DD",\r
-"7( c #38CBCC",\r
-"8( c #46EEE9",\r
-"9( c #56FBF5",\r
-"0( c #55FAF6",\r
-"a( c #47F1EE",\r
-"b( c #3BD5D5",\r
-"c( c #35C0C2",\r
-"d( c #44E8E6",\r
-"e( c #4FF7F2",\r
-"f( c #32B4B6",\r
-"g( c #41E2DF",\r
-"h( c #50F7F2",\r
-"i( c #58FBF6",\r
-"j( c #56FBF6",\r
-"k( c #58FAF5",\r
-"l( c #57FBF6",\r
-"m( c #56F9F5",\r
-"n( c #57FAF5",\r
-"o( c #56FAF6",\r
-"p( c #58FBF5",\r
-"q( c #52F7F3",\r
-"r( c #44E7E4",\r
-"s( c #34BEBF",\r
-"t( c #38C9CA",\r
-"u( c #45EDE8",\r
-"v( c #53F9F3",\r
-"w( c #57FAF6",\r
-"x( c #58FAF6",\r
-"y( c #57FBF5",\r
-"z( c #4CF3EE",\r
-"A( c #3EDAD9",\r
-"B( c #3CD6D4",\r
-"C( c #53F9F4",\r
-"D( c #48EFEA",\r
-"E( c #39CECE",\r
-"F( c #39CCCD",\r
-"G( c #47EFEA",\r
-"H( c #35C0C1",\r
-"I( c #46E9E5",\r
-"J( c #53F8F3",\r
-"K( c #59FBF5",\r
-"L( c #59FBF6",\r
-"M( c #5AFBF6",\r
-"N( c #5AFBF7",\r
-"O( c #5BFCF7",\r
-"P( c #5BFBF6",\r
-"Q( c #58FBF7",\r
-"R( c #52F8F2",\r
-"S( c #40E1DF",\r
-"T( c #3CD4D2",\r
-"U( c #4DF1ED",\r
-"V( c #5AFCF7",\r
-"W( c #59FBF7",\r
-"X( c #59FCF7",\r
-"Y( c #59FAF5",\r
-"Z( c #4DF2ED",\r
-"`( c #3BD3D2",\r
-" _ c #30AFB2",\r
-"._ c #40DFDD",\r
-"+_ c #51F6F1",\r
-"@_ c #5BFBF7",\r
-"#_ c #55F9F4",\r
-"$_ c #46EBE7",\r
-"%_ c #36C3C5",\r
-"&_ c #3CD5D4",\r
-"*_ c #4EF3EF",\r
-"=_ c #39CDCC",\r
-"-_ c #4AEFEB",\r
-";_ c #5DFCF8",\r
-">_ c #5CFCF7",\r
-",_ c #5EFCF8",\r
-"'_ c #5CFCF8",\r
-")_ c #5FFCF8",\r
-"!_ c #60FDF8",\r
-"~_ c #4FF4F0",\r
-"{_ c #3FDBD9",\r
-"]_ c #2FAAAE",\r
-"^_ c #3FDCDA",\r
-"/_ c #4FF4EF",\r
-"(_ c #5EFCF7",\r
-"__ c #5EFDF8",\r
-":_ c #4BEFEA",\r
-"<_ c #39CBCC",\r
-"[_ c #34BCBE",\r
-"}_ c #45E8E4",\r
-"|_ c #56F9F4",\r
-"1_ c #5DFCF7",\r
-"2_ c #5DFDF7",\r
-"3_ c #54F9F3",\r
-"4_ c #45E5E1",\r
-"5_ c #34BABB",\r
-"6_ c #30AEB0",\r
-"7_ c #41DFDD",\r
-"8_ c #51F5F1",\r
-"9_ c #3ED7D6",\r
-"0_ c #50F4EF",\r
-"a_ c #5CFBF7",\r
-"b_ c #61FDF8",\r
-"c_ c #62FDF8",\r
-"d_ c #5FFDF8",\r
-"e_ c #60FCF8",\r
-"f_ c #4CF1EC",\r
-"g_ c #3BD2D1",\r
-"h_ c #33B7B9",\r
-"i_ c #56F8F4",\r
-"j_ c #5BFAF5",\r
-"k_ c #48EAE6",\r
-"l_ c #35BFC1",\r
-"m_ c #39C9C9",\r
-"n_ c #49EDEA",\r
-"o_ c #5CFAF5",\r
-"p_ c #61FCF8",\r
-"q_ c #5CFBF6",\r
-"r_ c #54F7F2",\r
-"s_ c #42DFDD",\r
-"t_ c #32B9BA",\r
-"u_ c #45E5E2",\r
-"v_ c #58F9F4",\r
-"w_ c #31AFB1",\r
-"x_ c #43E1DF",\r
-"y_ c #55F8F3",\r
-"z_ c #64FDF8",\r
-"A_ c #62FEF8",\r
-"B_ c #63FEF9",\r
-"C_ c #63FEF8",\r
-"D_ c #63FDF9",\r
-"E_ c #63FDF8",\r
-"F_ c #64FEF9",\r
-"G_ c #5CFBF5",\r
-"H_ c #4CEFEA",\r
-"I_ c #3ACAC9",\r
-"J_ c #37C3C4",\r
-"K_ c #48EBE7",\r
-"L_ c #5BFAF6",\r
-"M_ c #62FDF9",\r
-"N_ c #62FEF9",\r
-"O_ c #57F9F4",\r
-"P_ c #44E3E1",\r
-"Q_ c #4FF3EE",\r
-"R_ c #5EFBF6",\r
-"S_ c #64FEF8",\r
-"T_ c #53F5F0",\r
-"U_ c #3FD8D6",\r
-"V_ c #34C3C3",\r
-"W_ c #4AEEE9",\r
-"X_ c #5FFCF6",\r
-"Y_ c #35BCBD",\r
-"Z_ c #47E8E5",\r
-"`_ c #5DFAF4",\r
-" : c #68FEF9",\r
-".: c #66FEF9",\r
-"+: c #65FEF9",\r
-"@: c #67FEF9",\r
-"#: c #65FDF9",\r
-"$: c #65FEF8",\r
-"%: c #66FEF8",\r
-"&: c #63FCF8",\r
-"*: c #69FEF9",\r
-"=: c #64FDF9",\r
-"-: c #5FFBF5",\r
-";: c #48EAE5",\r
-">: c #36C0C0",\r
-",: c #3BD0CF",\r
-"': c #51F2EE",\r
-"): c #62FCF7",\r
-"!: c #68FEF8",\r
-"~: c #65FDF8",\r
-"{: c #57F7F2",\r
-"]: c #30A9AD",\r
-"^: c #41DEDB",\r
-"/: c #59F7F1",\r
-"(: c #62FCF8",\r
-"_: c #66FDF9",\r
-":: c #66FDF8",\r
-"<: c #62FBF6",\r
-"[: c #4EF1ED",\r
-"}: c #38CECE",\r
-"|: c #53F3ED",\r
-"1: c #64FCF7",\r
-"2: c #3BC9C8",\r
-"3: c #55EFEA",\r
-"4: c #6BFCF7",\r
-"5: c #76FFFA",\r
-"6: c #72FFFA",\r
-"7: c #6BFEF9",\r
-"8: c #72FEF9",\r
-"9: c #74FFFA",\r
-"0: c #6EFEF9",\r
-"a: c #6BFFFA",\r
-"b: c #6DFEFA",\r
-"c: c #70FFF9",\r
-"d: c #70FFFA",\r
-"e: c #6CFEF9",\r
-"f: c #71FEFA",\r
-"g: c #74FEFA",\r
-"h: c #6EFFFA",\r
-"i: c #75FEF9",\r
-"j: c #73FFFA",\r
-"k: c #74FFF9",\r
-"l: c #63FAF5",\r
-"m: c #48E5E2",\r
-"n: c #46DCDA",\r
-"o: c #5FF7F2",\r
-"p: c #6AFEF9",\r
-"q: c #71FFFA",\r
-"r: c #6FFEF9",\r
-"s: c #6CFFF9",\r
-"t: c #6EFFF9",\r
-"u: c #71FEF9",\r
-"v: c #70FEF9",\r
-"w: c #6DFFF9",\r
-"x: c #70FEFA",\r
-"y: c #6CFFFA",\r
-"z: c #6AFEFA",\r
-"A: c #6EFDF8",\r
-"B: c #5DF5EF",\r
-"C: c #42D6D3",\r
-"D: c #35B7B9",\r
-"E: c #4EE7E2",\r
-"F: c #60F9F4",\r
-"G: c #76FEFA",\r
-"H: c #72FEFA",\r
-"I: c #6FFEFA",\r
-"J: c #6DFEF9",\r
-"K: c #6FFFFA",\r
-"L: c #68FDF6",\r
-"M: c #53EEEA",\r
-"N: c #39C6C6",\r
-"O: c #1D9A9D",\r
-"P: c #48DFDB",\r
-"Q: c #64F9F3",\r
-"R: c #41D4D1",\r
-"S: c #66F3EE",\r
-"T: c #77FEF8",\r
-"U: c #79FFFA",\r
-"V: c #78FFFA",\r
-"W: c #77FFFA",\r
-"X: c #77FFF9",\r
-"Y: c #7AFFFA",\r
-"Z: c #75FFFA",\r
-"`: c #76FEF9",\r
-" < c #78FEF9",\r
-".< c #6AF8F2",\r
-"+< c #4BDEDB",\r
-"@< c #35B3B4",\r
-"#< c #50E4E0",\r
-"$< c #6CFAF4",\r
-"%< c #75FEFA",\r
-"&< c #77FEF9",\r
-"*< c #76FEF8",\r
-"=< c #5FF1EB",\r
-"-< c #3DCDCB",\r
-";< c #3CC5C4",\r
-">< c #5AEDE8",\r
-",< c #75FCF6",\r
-"'< c #7BFFFA",\r
-")< c #78FFF9",\r
-"!< c #6FFCF6",\r
-"~< c #56EAE5",\r
-"{< c #20A6A7",\r
-"]< c #57E9E4",\r
-"^< c #33AAAB",\r
-"/< c #4CDDD9",\r
-"(< c #6BF7F1",\r
-"_< c #73FEF9",\r
-":< c #7CFFFA",\r
-"<< c #7EFFFA",\r
-"[< c #7DFFFA",\r
-"}< c #7DFEF8",\r
-"|< c #6BF5EF",\r
-"1< c #47D6D3",\r
-"2< c #3ABFBE",\r
-"3< c #5EEBE5",\r
-"4< c #78FCF5",\r
-"5< c #7AFEF9",\r
-"6< c #74FCF5",\r
-"7< c #5BECE7",\r
-"8< c #39C2C1",\r
-"9< c #45CFCC",\r
-"0< c #5EF1EC",\r
-"a< c #7FFFFA",\r
-"b< c #76FFF9",\r
-"c< c #72FAF4",\r
-"d< c #52E4DE",\r
-"e< c #28B9B8",\r
-"f< c #3AB6B4",\r
-"g< c #5EE6E0",\r
-"h< c #7CFAF4",\r
-"i< c #82FEF9",\r
-"j< c #84FFFA",\r
-"k< c #81FFFA",\r
-"l< c #85FFFA",\r
-"m< c #82FFFA",\r
-"n< c #83FFFA",\r
-"o< c #80FFFA",\r
-"p< c #83FEF9",\r
-"q< c #6BF1EB",\r
-"r< c #44CCCA",\r
-"s< c #42CCC9",\r
-"t< c #68EFEA",\r
-"u< c #80FDF7",\r
-"v< c #82FFF9",\r
-"w< c #7AFAF4",\r
-"x< c #61E7E2",\r
-"y< c #50DAD6",\r
-"z< c #78F7F1",\r
-"A< c #81FEF9",\r
-"B< c #81FFF9",\r
-"C< c #76F7F2",\r
-"D< c #53DCD8",\r
-"E< c #45C4C2",\r
-"F< c #6AEDE8",\r
-"G< c #86FCF7",\r
-"H< c #8DFFFA",\r
-"I< c #87FFFA",\r
-"J< c #8BFFFA",\r
-"K< c #88FFFA",\r
-"L< c #8AFFFA",\r
-"M< c #89FFFA",\r
-"N< c #8CFFFA",\r
-"O< c #83FCF6",\r
-"P< c #70ECE6",\r
-"Q< c #44C2C0",\r
-"R< c #55D6D2",\r
-"S< c #7CF4EF",\r
-"T< c #8AFDF9",\r
-"U< c #8FFFFA",\r
-"V< c #8CFEF9",\r
-"W< c #80F9F4",\r
-"X< c #59E0DC",\r
-"Y< c #3BB1B1",\r
-"Z< c #5FE3DE",\r
-"`< c #84FAF5",\r
-" [ c #86FFFA",\r
-".[ c #8EFFFA",\r
-"+[ c #8AFFFB",\r
-"@[ c #87FEF8",\r
-"#[ c #76F3ED",\r
-"$[ c #4BD1CE",\r
-"%[ c #4FD0CD",\r
-"&[ c #75F3ED",\r
-"*[ c #84FEF9",\r
-"=[ c #86FAF4",\r
-"-[ c #61E5DF",\r
-";[ c #3AACAB",\r
-">[ c #59E0DB",\r
-",[ c #7FF8F2",\r
-"'[ c #85FEF9",\r
-")[ c #7CF6F0",\r
-"![ c #56D8D4",\r
-"~[ c #44BEBD",\r
-"{[ c #69EBE5",\r
-"][ c #85FCF6",\r
-"^[ c #87FFFB",\r
-"/[ c #7FFCF8",\r
-"([ c #74EEE8",\r
-"_[ c #44C6C5",\r
-":[ c #57DAD6",\r
-"<[ c #83F6F1",\r
-"[[ c #88FEF9",\r
-"}[ c #90FFFA",\r
-"|[ c #94FFFA",\r
-"1[ c #92FFFB",\r
-"2[ c #91FFFA",\r
-"3[ c #83F7F1",\r
-"4[ c #59DED9",\r
-"5[ c #41B9B8",\r
-"6[ c #70E8E2",\r
-"7[ c #88FBF5",\r
-"8[ c #93FFFA",\r
-"9[ c #92FFFA",\r
-"0[ c #8EFEF8",\r
-"a[ c #74F1EC",\r
-"b[ c #4CCEC9",\r
-"c[ c #47CCC8",\r
-"d[ c #79F1EB",\r
-"e[ c #8DFDF8",\r
-"f[ c #90FFFB",\r
-"g[ c #86FFF9",\r
-"h[ c #87FBF5",\r
-"i[ c #6BE9E4",\r
-"j[ c #40B1AF",\r
-"k[ c #71E4DE",\r
-"l[ c #8EFAF4",\r
-"m[ c #98FFFA",\r
-"n[ c #96FFFA",\r
-"o[ c #98FFFB",\r
-"p[ c #95FFFA",\r
-"q[ c #9AFFFA",\r
-"r[ c #97FFFA",\r
-"s[ c #99FFFB",\r
-"t[ c #96FFFB",\r
-"u[ c #95FFFB",\r
-"v[ c #96FEF8",\r
-"w[ c #8AF5EF",\r
-"x[ c #5DD7D2",\r
-"y[ c #4EC6C2",\r
-"z[ c #80EFE8",\r
-"A[ c #95FEF8",\r
-"B[ c #97FFFB",\r
-"C[ c #99FFFA",\r
-"D[ c #9AFFFB",\r
-"E[ c #92FDF8",\r
-"F[ c #7EEDE7",\r
-"G[ c #4BC2C0",\r
-"H[ c #61D7D1",\r
-"I[ c #83F6EF",\r
-"J[ c #91FEF8",\r
-"K[ c #94FFFB",\r
-"L[ c #91FAF4",\r
-"M[ c #72E5DF",\r
-"N[ c #4CBEBC",\r
-"O[ c #7BEAE3",\r
-"P[ c #94FCF6",\r
-"Q[ c #9CFFFA",\r
-"R[ c #9CFFFB",\r
-"S[ c #9BFFFB",\r
-"T[ c #9EFFFB",\r
-"U[ c #9EFFFA",\r
-"V[ c #9DFFFB",\r
-"W[ c #9BFFFA",\r
-"X[ c #93FDF7",\r
-"Y[ c #86F2EB",\r
-"Z[ c #5BCFCB",\r
-"`[ c #60D3CE",\r
-" } c #86F4ED",\r
-".} c #94FFF9",\r
-"+} c #98FBF5",\r
-"@} c #75E7E1",\r
-"#} c #6BDFD9",\r
-"$} c #90F7F2",\r
-"%} c #9BFEFA",\r
-"&} c #9FFFFB",\r
-"*} c #90F7F1",\r
-"=} c #68DDD7",\r
-"-} c #57C9C4",\r
-";} c #88F0E9",\r
-">} c #9AFDF7",\r
-",} c #9FFFFA",\r
-"'} c #A0FFFB",\r
-")} c #A1FFFB",\r
-"!} c #9BFDF8",\r
-"~} c #85EEE8",\r
-"{} c #66DCD7",\r
-"]} c #90F8F1",\r
-"^} c #95F9F2",\r
-"/} c #73E1DC",\r
-"(} c #48B8B5",\r
-"_} c #7EE6E0",\r
-":} c #97FBF5",\r
-"<} c #9FFEFA",\r
-"[} c #A0FFFA",\r
-"}} c #9DFFFA",\r
-"|} c #9DFEF9",\r
-"1} c #8FF5EF",\r
-"2} c #63D4CE",\r
-"3} c #61D3CE",\r
-"4} c #91F3ED",\r
-"5} c #9EFDF8",\r
-"6} c #A1FFFA",\r
-"7} c #A3FFFB",\r
-"8} c #A4FFFB",\r
-"9} c #A2FFFB",\r
-"0} c #A3FFFA",\r
-"a} c #A2FFFA",\r
-"b} c #9BFBF6",\r
-"c} c #80E8E2",\r
-"d} c #46B2B0",\r
-"e} c #79E5DE",\r
-"f} c #99FAF4",\r
-"g} c #A0FEFA",\r
-"h} c #9FFEF9",\r
-"i} c #93F6EF",\r
-"j} c #69D9D3",\r
-"k} c #55C5C0",\r
-"l} c #85EDE6",\r
-"m} c #9AFCF6",\r
-"n} c #9CFEF8",\r
-"o} c #57C9C5",\r
-"p} c #76DDD7",\r
-"q} c #9CF8F3",\r
-"r} c #A8FFFB",\r
-"s} c #A7FFFB",\r
-"t} c #A6FFFB",\r
-"u} c #A5FFFB",\r
-"v} c #A9FFFB",\r
-"w} c #A7FFFA",\r
-"x} c #9BF9F3",\r
-"y} c #77DFD9",\r
-"z} c #55C0BB",\r
-"A} c #8AEBE4",\r
-"B} c #A1FCF6",\r
-"C} c #A6FFFA",\r
-"D} c #A4FFFA",\r
-"E} c #A2FDF8",\r
-"F} c #91F2EB",\r
-"G} c #67D0C9",\r
-"H} c #63CFC9",\r
-"I} c #94F2EB",\r
-"J} c #A4FEF9",\r
-"K} c #97FCF6",\r
-"L} c #88EAE2",\r
-"M} c #4AB6B2",\r
-"N} c #87E7E1",\r
-"O} c #A1FCF5",\r
-"P} c #ABFFFC",\r
-"Q} c #ABFFFB",\r
-"R} c #AAFFFB",\r
-"S} c #ACFFFC",\r
-"T} c #AAFFFC",\r
-"U} c #A9FFFC",\r
-"V} c #A4FFF9",\r
-"W} c #94F5EF",\r
-"X} c #6FD6D0",\r
-"Y} c #64CDC7",\r
-"Z} c #93F1EA",\r
-"`} c #A2FEF8",\r
-" | c #ADFFFC",\r
-".| c #ACFFFB",\r
-"+| c #A7FDF7",\r
-"@| c #8EEDE7",\r
-"#| c #5FC5BF",\r
-"$| c #74DAD4",\r
-"%| c #9EF8F1",\r
-"&| c #A8FFFC",\r
-"*| c #9FFAF4",\r
-"=| c #84E2DC",\r
-"-| c #5EC3BF",\r
-";| c #94EEE8",\r
-">| c #A9FEF7",\r
-",| c #ADFFFB",\r
-"'| c #AEFFFB",\r
-")| c #AEFFFC",\r
-"!| c #A9FDF9",\r
-"~| c #9AF1EA",\r
-"{| c #67CEC8",\r
-"]| c #73D6D0",\r
-"^| c #9DF5EF",\r
-"/| c #A9FFFA",\r
-"(| c #A6FCF6",\r
-"_| c #89E8E1",\r
-":| c #80E4DD",\r
-"<| c #A0FAF3",\r
-"[| c #AAFFFA",\r
-"}| c #9DF7F1",\r
-"|| c #7FDCD5",\r
-"1| c #6DCFCA",\r
-"2| c #9DF3EC",\r
-"3| c #ABFDF8",\r
-"4| c #B0FFFC",\r
-"5| c #AFFFFB",\r
-"6| c #B1FFFB",\r
-"7| c #AFFFFC",\r
-"8| c #B2FFFC",\r
-"9| c #B1FFFC",\r
-"0| c #AAFCF7",\r
-"a| c #95ECE6",\r
-"b| c #88DFD8",\r
-"c| c #A4F9F2",\r
-"d| c #AEFFFA",\r
-"e| c #B0FFFB",\r
-"f| c #B2FFFB",\r
-"g| c #A6F9F3",\r
-"h| c #80E1DA",\r
-"i| c #58BEB8",\r
-"j| c #91EBE3",\r
-"k| c #ACFFFA",\r
-"l| c #9CF4ED",\r
-"m| c #75D3CD",\r
-"n| c #77D9D3",\r
-"o| c #A1F6EF",\r
-"p| c #ACFEF9",\r
-"q| c #B3FFFC",\r
-"r| c #B4FFFC",\r
-"s| c #A8FBF5",\r
-"t| c #8EE7E1",\r
-"u| c #59B7B3",\r
-"v| c #90E6E0",\r
-"w| c #A9FCF6",\r
-"x| c #ABFFFA",\r
-"y| c #A7F7F0",\r
-"z| c #78D8D1",\r
-"A| c #6FC9C3",\r
-"B| c #97F1EA",\r
-"C| c #A9FDF7",\r
-"D| c #B3FEFC",\r
-"E| c #B3FFFB",\r
-"F| c #A9FEF8",\r
-"G| c #98F0E9",\r
-"H| c #66CAC5",\r
-"I| c #8BE1DB",\r
-"J| c #A8FAF3",\r
-"K| c #B6FEFA",\r
-"L| c #B4FFFB",\r
-"M| c #B5FFFC",\r
-"N| c #B5FFFB",\r
-"O| c #B6FFFC",\r
-"P| c #B9FFFC",\r
-"Q| c #B7FFFC",\r
-"R| c #B2FEFA",\r
-"S| c #AAF9F3",\r
-"T| c #8AE0DA",\r
-"U| c #65C5BF",\r
-"V| c #9CEFE6",\r
-"W| c #B0FDF7",\r
-"X| c #B3FEFA",\r
-"Y| c #A2F2EB",\r
-"Z| c #74CEC7",\r
-"`| c #79D4CD",\r
-" 1 c #A0F4ED",\r
-".1 c #B2FDF9",\r
-"+1 c #B8FFFC",\r
-"@1 c #AFFCF6",\r
-"#1 c #96EBE4",\r
-"$1 c #60BAB6",\r
-"%1 c #93E8E1",\r
-"&1 c #AEFBF5",\r
-"*1 c #B5FEFA",\r
-"=1 c #A3F6EF",\r
-"-1 c #7AD7D1",\r
-";1 c #73CFC9",\r
-">1 c #A2F3EC",\r
-",1 c #B4FEF8",\r
-"'1 c #AFFCF7",\r
-")1 c #9BECE5",\r
-"!1 c #88DED5",\r
-"~1 c #A3F7F0",\r
-"{1 c #B2FEF9",\r
-"]1 c #A9FAF4",\r
-"^1 c #8FE4DD",\r
-"/1 c #6DC6C0",\r
-"(1 c #9FEEE7",\r
-"_1 c #B2FDF7",\r
-":1 c #BAFFFC",\r
-"<1 c #B9FFFB",\r
-"[1 c #B6FEF9",\r
-"}1 c #A6F1E9",\r
-"|1 c #74CDC7",\r
-"11 c #85DAD3",\r
-"21 c #ACF7F0",\r
-"31 c #B7FEFA",\r
-"41 c #B6FFFB",\r
-"51 c #B1FAF4",\r
-"61 c #95E6DF",\r
-"71 c #61B6B2",\r
-"81 c #94E5DE",\r
-"91 c #AFFBF4",\r
-"01 c #B4FEFA",\r
-"a1 c #A8F8F1",\r
-"b1 c #86DCD4",\r
-"c1 c #7FD3CC",\r
-"d1 c #A9F2EC",\r
-"e1 c #BCFFFC",\r
-"f1 c #BBFFFC",\r
-"g1 c #B8FFFB",\r
-"h1 c #B6FCF6",\r
-"i1 c #9FEBE4",\r
-"j1 c #8FE3DB",\r
-"k1 c #B1FAF3",\r
-"l1 c #BAFEFA",\r
-"m1 c #BDFFFC",\r
-"n1 c #AFF8F2",\r
-"o1 c #91E0D8",\r
-"p1 c #6FC3BB",\r
-"q1 c #A0ECE5",\r
-"r1 c #B7FDF7",\r
-"s1 c #BAFFFB",\r
-"t1 c #B8FFF9",\r
-"u1 c #AAF4EC",\r
-"v1 c #80D2CB",\r
-"w1 c #89D6CF",\r
-"x1 c #ACF4ED",\r
-"y1 c #BCFEFA",\r
-"z1 c #BEFFFC",\r
-"A1 c #BFFFFC",\r
-"B1 c #BEFFFB",\r
-"C1 c #B8FBF6",\r
-"D1 c #9EE7E0",\r
-"E1 c #64B7B1",\r
-"F1 c #9AE5DE",\r
-"G1 c #B5FAF3",\r
-"H1 c #BBFFFA",\r
-"I1 c #B9FEFA",\r
-"J1 c #AFF7F0",\r
-"K1 c #8DDAD3",\r
-"L1 c #77C8C1",\r
-"M1 c #A6EFE8",\r
-"N1 c #B6FCF7",\r
-"O1 c #BBFDF9",\r
-"P1 c #A8F0E9",\r
-"Q1 c #7CCDC5",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" ",\r
-" . ",\r
-" + @ ",\r
-" # $ % ",\r
-" & * = ",\r
-" - ; > , ",\r
-" ' ) ! ~ { * ",\r
-" ] ^ / ( _ : < ",\r
-" [ } > | | ~ 1 2 ",\r
-" @ 3 _ | | | 4 ; ",\r
-" 5 , 4 | | | 6 7 8 ",\r
-" 9 ; 0 a a a a a ( , ",\r
-" b c 6 a a a a a 6 d * ",\r
-" e { a f f f f f g h { i j [ k 5 5 @ l ",\r
-" m n o a g g g f f f f 6 : 5 < p q r s t u % v w k x [ ",\r
-" 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 ",\r
-" @ = | 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 @ ",\r
-" 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 ",\r
-" ` 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 ",\r
-" % > %.&.@. .*. . .@.=. . .*.-.;.>. ,.0 +.*.*.*.*...*.@. . .*.*.@.*.*. .*. .*.&.&.@.*. .@...#.( '. ",\r
-" ).>.+.*.*.*.*.*.*.*.*.*.*.*.*.-.!.~. {.6 +.*.*.*.*.&.].*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.C ^. ",\r
-" < O @././././.(.(._./.(./.(.(./.].:./ { D ].(./.(./.(./.(.(./.(./.(.(.(.(./.(._.(.(.(.(.(./.].C <. ",\r
-" Q 6 [./././.(./.(././.(.(./.(./.(.[.h 1 z ~ T ]././.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(.(.(.(.(.(.].B : }. ",\r
-" |.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 ",\r
-" 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 & ",\r
-" ` : @.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. ",\r
-" - 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 ",\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. ",\r
-" 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 ",\r
-" 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. .{ ",\r
-" 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.#. ",\r
-" 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. ",\r
-" ` 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. ",\r
-" - >.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 ",\r
-" 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.^. ",\r
-" , 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.]. ",\r
-" 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... ",\r
-" ( 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 ",\r
-" 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. ",\r
-" +.A..+++.+++++++Z.++++.+Z..+++.+++++$+++++W.++++++$+++Z.M.+. a r. +++++++++Z.++++.+Z.++.+.+++++$+++++++Z.++++++++++Z.S._. _ b.Q.$+++++.+Z.++++Z.++++++++++W.$+++++Z.++++++++++++.+T.q.W ",\r
-" / /.Y.%+&+*+&+*+&+&+%+&+*+$+*+=+++%+-+*+$+*+*+*+*+&+*+&+%+G.D #.A..+-+%+++&+&+*+%+&+&+;+=+*+*+&+*+%+*+&+.+%+&+%+++&+=+H.[. f.v..+&+*+=+*+>+%+&+%+++&+*+$+*+*+*+%+&+&+&+&+&+&+*+*+%+O.d. ",\r
-" ~ l.W.;+-+&+-+&+-+&+&+-+&+-+-+&+-+-+&+&+-+&+-+-+&+&+-+-+.+r.h : e.O.&+-+-+-+-+&+-+-+&+-+&+-+-+&+-+&+&+-+&+-+&+-+&+&+-+%+N.V +.`.;+-+-+&+-+-+&+&+&+-+-+&+-+&+&+-+&+-+&+-+&+-+-+&+-+&+O.e. ",\r
-" f B.#+-+,+'+&+)+)+,+!+!+,+)+&+~+)+)+)+)+)+)+&+&+,+!+&+)+++q. o a.;+!+,+)+)+)+)+)+)+~+-+!+{+&+,+)+)+!+{+!+]+!+-+)+)+)+^+G.B ].O.,+!+~+)+)+)+!+-+)+,+!+)+)+)+)+)+)+{+-+&+)+&+!+)+]+*+S.T ",\r
-" +.K.~+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+{+#+2. h B.^+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+>+m. >.0.%+/+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+^+G.B ",\r
-" /. +/+)+)+)+)+)+)+)+)+]+)+)+]+)+)+)+)+)+)+)+)+)+)+)+)+)+ +&. T K./+(+)+)+)+)+)+)+)+)+)+)+)+)+]+)+)+)+)+)+)+)+)+)+)+_+.+b. h t.>+)+)+)+)+)+)+]+)+)+]+)+)+)+)+]+]+)+)+)+)+)+)+)+)+)+*+v.6 ",\r
-" d w.>+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+(+(+(+(+(+(+(+(+(+)+O.T (.W.)+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+:+(+W.x. A K.{+<+(+(+(+(+(+(+(+(+(+(+(+(+:+(+(+(+(+(+(+(+(+(+:+(+*+k. ",\r
-" 6 G.)+[+(+[+[+[+[+[+[+}+[+<+<+<+|+1+[+}+}+[+}+[+:+[+[+|+)+N.g o 0.>+(+<+<+<+<+[+[+[+[+[+<+<+[+}+[+<+[+[+[+[+<+<+<+<+<+:+2+*. (. +)+3+[+[+[+}+4+}+[+<+<+<+<+1+[+[+[+[+[+<+<+[+<+[+[+}+;+6. ",\r
-" 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+++(. ",\r
-" (.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+[+ +%. ",\r
-" 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. ",\r
-" 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. ",\r
-" #.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. ",\r
-" (.^+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. ",\r
-" 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+~+]. ",\r
-" 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. ",\r
-" 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. ",\r
-" ].~+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. ",\r
-" 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. ",\r
-" 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+&. ",\r
-" 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+*+ ",\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+ ",\r
-" 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. ",\r
-" 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. ",\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+_. ",\r
-" 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+,+ ",\r
-" 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+>+ ",\r
-" 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. ",\r
-" T.p++@`+`+`+`+`+`+`+`+`+`+`+`+`+Z+ @`+`+ @`+`+`+`+`+`+`+G+)+ b+e+@@`+`+`+ @`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+ @`+#@9+ e.}+L+`+`+`+`+`+`+`+`+`+`+`+`+$@Z+`+`+`+`+`+`+`+`+`+`+`+@@g+B. ",\r
-" ^+A+$@`+`+`+`+`+`+`+`+`+%@`+%@`+`+`+`+`+`+`+`+%@%@`+%@&@x+w+ N.v+@@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@`+`+`+`+`+`+Z+E+)+ 0.c+#@`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+`+%@%@`+`+`+`+M+0+w. ",\r
-" (.[+N+*@*@*@=@*@*@-@*@*@-@*@;@-@*@*@*@;@*@;@-@;@;@*@=@=@%@r+X+ *+J+>@*@;@*@*@*@*@*@=@*@*@*@*@*@-@*@-@;@=@,@*@*@*@*@*@>@J+^+ S.Y+&@*@-@,@=@,@*@=@-@=@-@;@,@*@-@;@-@-@*@;@-@*@*@-@-@%@N+3+ ",\r
-" 0.k+W+;@'@,@;@'@,@-@,@;@'@;@,@,@;@'@;@;@,@,@;@;@'@,@,@,@&@g+r. *.[+N+*@;@,@;@;@-@;@,@;@;@-@,@,@,@'@;@;@,@,@'@;@'@-@'@)@!@u+ + >+F+~@-@,@,@,@;@=@,@-@{@,@,@;@,@-@)@,@;@;@;@-@'@,@;@;@;@D+{+ ",\r
-" K.r+*@)@)@)@)@,@'@)@)@)@)@)@)@'@)@)@)@)@)@)@)@)@)@)@)@]@ @7+ q.h+&@)@)@,@{@)@)@)@)@)@)@'@)@,@)@,@)@)@)@)@)@)@,@)@)@,@^@q+A. .<+N+,@/@)@)@)@)@)@)@'@)@)@)@)@)@)@)@'@)@)@'@)@)@)@'@)@-@(@w. ",\r
-" ;+C+;@_@)@/@/@)@)@'@/@,@'@/@:@/@'@)@/@/@'@'@/@/@)@/@/@=@S+1+ G.r+^@/@:@)@)@)@/@/@'@/@:@)@/@/@)@)@)@/@)@,@)@:@/@:@)@:@%@e+ b.a+&@:@/@/@'@)@<@:@)@:@/@/@:@,@)@/@:@)@)@/@:@/@/@/@)@)@~@A+3 ",\r
-" ..1+S+;@)@_@/@)@_@/@_@)@_@_@_@_@/@_@_@_@_@)@_@:@_@_@/@,@[@H+&+ .+C+]@_@_@_@,@_@_@/@<@:@)@_@_@)@:@_@_@)@/@_@_@_@_@_@_@_@Z+[+ z.n+}@|@:@)@_@_@:@/@_@_@_@_@/@:@/@_@_@)@_@)@/@_@:@)@_@1@%@8+ ",\r
-" 6.e+S+:@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@:@/@_@{@A+2@ 3@N+]@_@_@_@_@_@_@_@:@/@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@]@#@'+ W.C+{@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@/@)@_@_@_@_@_@_@4@$@w+ ",\r
-" 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. ",\r
-" %+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+(. ",\r
-" 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@ ",\r
-" 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@ ",\r
-" 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@,@;+",\r
-" .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@&@",\r
-" 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@",\r
-" 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@",\r
-" ! 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@",\r
-" { 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@",\r
-" ~ ]+)@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@",\r
-" 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@",\r
-" 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@",\r
-" [.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@",\r
-" 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@",\r
-" 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@",\r
-" ! 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@",\r
-" { *+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@",\r
-" 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@",\r
-" | `@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@",\r
-" 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@",\r
-" &.y+B@.#.#.#.#.#.#.#.#####.#.#+#L@Z+ q+d@X@.#.#+#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#+#+#.#.#+#$###v@A+ :+)@M@.#.#.#.#.#.#.#@#+#.#.#+#.#.###.###.#.#.#.#.#.#.#.#G@R+ #+Z+L@%#.#####.###.#.#.#####.#.#.#",\r
-" b.H+A@.#.###.#.#.#.#.###.#.#.#.#.#B@U+ r.F+x@##.#.###.#.#.#.#.#####.#.#.###.#.#.###.#.#.#.#.#.#N@7@g+ &#e@T@.###.#.#.#.#.#####.#.#.#.#.###.#.#.#.###.###.#.#+#x@E+ )+{@P@.#.#.###.#.#.#.#.#.###.#.#",\r
-" v.c@M@$#.#%#.#.#$#.#X@.#$#@#.#%#$###v@s+ T.&@A@.#$#%#.#$#$#.#$#.#.#$#$#+###$#$#.#$#$#.#.#$#$#.#$#T@_@3+ x+x@%###+#$#$#.#.#%#.###$#$###.#$#.#$#.#.#.#$#+#+#$#$#+#s@r+ 7+e@##.###$#.#*#%###.#$#.#+#$#",\r
-" 1 T.;@+#$#$#$#$#$#$#$#.#$#$#*#$#.#$#$###f@a+ {+-@M@.#.#$#$#$#$#$#$#$#$#$#.#$#$#$#$#.#$#.#$#$#$#$#$#$#H@;@~+ S.@@Y@*#.#$#$#$#$#.#.#%#$#.#%#$#$#$#$#$#$#$#$#.#.#$#$#$#V@6@7+ u+n@+#$#$#$#$#$#$#$#$#$#.#$#",\r
-" : *+6@.#$#$#$#$#$#.#.#$#$###%#$#$#$#$#$#T@{@]+ 7+f@X@$#$#$#$#$#$#$#$#.#.#$#$#.#.#$#$#$#$#$#$#$#$#$#$#$#I@&@ *+~@M@$#.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%###$#$#.#.#$#$#N@,@~+ H.#@A@$#$#$#$#$#$#$#.#.#$#%#",\r
-" j.(+d@$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#Y@&@ r+o@.#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$###v@x+ 3+8@+#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#L@@@ &+*@M@$#$#$#$#$#$#$#$#$#$#",\r
-" 6 8+p@$#$#$#=#$#$#=#=#$#$#$#$#$#$#$#$#$#$#$#D@-# A.D+G@%#$#$#$#=#=#$#$#=###$#$#;#$#$#=#$#$#$#$#$#$#$#$#=#X@f@># o+p@%#=#$#$#$#$#$#$#$#=#$#$#$#=#=#$#$#=#$#$#$#=#$#$#;#$#x@C+ }+_@X@$#$#=#$#$#$#$#.#$#",\r
-" D p+z@=#=#=#,#,#=#'#)#=#=#=#=#=#=#,#=#=#=#!#%#v@u+ W.;@+#=#=#=#,#,#=#,#,#=#=#'#'#=#=#,#=#=#=#,#=#=#=#=#'#!#+#|@K+ D.H+C@,#=#=#'#=#=#=#=#!#=#=#=#,#)#=#=#)#,#=#=#,#=#=#'#!#.#s@Y+ j+x@.#=#,#,#=#=#=#=#=#",\r
-" &.A+T@~#)#{#,#)#{#,#)#]#]#{#)#)#~#]#)#)#~#,#)#;#n@k+ 3+7@=#)#)#=#)#{#]#)#{#~#~#{#)#)#)#)#)#{#)#{#~#~#{#'#~#]#+#{@ ++*@##,#)#!#)#)#)#)#,#)#~#)#)#)#)#]#)#,#)#)#{#~#)#,#)#]#^#Q@8+ L+I@=#,#]#~#)#{#)#]#",\r
-" k.@@$#/#(#_#]#]#(#]#)#/#/#(#(#]#(#]#)#/#/#{#(#(#:#7@1+ q+D@~#_#)#(#(#/#/#(#(#/#]#]#/#]#]#]#(#<#]#[#/#(#/#]#_#]#N@>@ [+|@.#~#]#]#/#_#_#)#/#/#(#]#)#/#/#(#(#_#_#~#(#]#]#]#~#(#.#8@(+ W.}#@#)#/#/#]#(#(#/#",\r
-" G.,@'#/#_#/#_#_#_#_#/#_#_#_#_#_#_#_#/#_#_#_#_#_#_#%#;@ |#N@~#/#_#/#/#_#_#_#_#/#_#/#_#_#_#/#/#_#/#/#/#_#_#/#_#)#N@O+ g+x@!#_#_#/#_#_#_#/#_#/#_#/#_#_#_#/#_#_#_#_#_#_#_#/#_#/#.#;@ ]+5@'#/#/#_#_#_#_#",\r
-" 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#",\r
-" { )+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#",\r
-" <.[+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#",\r
-" %+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#",\r
-" 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#",\r
-" %@!#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#",\r
-" %+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#",\r
-" 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#",\r
-" 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.##",\r
-" *@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#",\r
-" 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@ ",\r
-" 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#*@ ",\r
-" 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#@$-# ",\r
-" %@6#R##$$$%$%$&$%$%$&$#$$$#$%$&$%$%$%$%$%$%$%$#$$$%$%$#$G#{# p@v#*$&$&$&$&$%$%$&$%$%$%$%$%$%$%$%$&$%$%$$$#$%$&$&$#$*$w#=$ -@9#Y#*$%$%$%$$$#$%$&$$$#$&$&$&$%$%$#$$$%$%$%$%$%$%$%$#$G#$# ",\r
-" d@x#*$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$$J#@# a+@#G##$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$-$;$i@ o@x#*$>$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$#$A#M@ ",\r
-" T@F#,$,$'$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$>$,$,$&$L#D@ E+/#X#>$,$,$,$,$,$,$,$,$,$,$,$,$>$,$,$,$>$,$,$,$,$,$,$,$*$h#{@ 8+@#O#,$)$,$'$,$,$>$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$'$!$$$v#B@ ",\r
-" s+]#~${$]$^$]$^$^$]$^$^$^$)$]$)$)$)$]$)$)$]$)$)$]$^$]$/$>$w#f@ ;@($>$]$]$^$]$)$^$]$)$)$]$)$)$]$^$/$/$]$]$]$]$]$^$]$]$)$~$9#S+ z+_#X#_$^$]$]$]$]$]$^$]$]$]$]$^$)$)$]$)$)$^$/$)$]$]$]$)$>$w#:$ ",\r
-" ^@g#>$<$[$<$[$<$[$[$}$[$^$[$<$<$]$<$<$^$|$<$]$1$[$}$}$}$'$p#;@ v@F#)$<$[$[$}$[$}$}$}$<$<$]$|$1$}$<$|$<$|$}$|$<$[$|$]$]$*$]# >@j#&$]$[$<$<$[$|$<$}$[$<$|$<$2$}$<$<$<$<$<$}$<$[$<$]$|$,$q#%@ ",\r
-" 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# ",\r
-" 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$&$@$ ",\r
-" 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@ ",\r
-" 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@ ",\r
-" 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$/@ ",\r
-" +#%$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# ",\r
-" (#}$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# ",\r
-" 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$ ",\r
-" 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@ ",\r
-" +#)$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$~$ ",\r
-" 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# ",\r
-" 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$*% ",\r
-" |@U#K$=%-%=%$%;%>%-%>%>%>%>%>%>%-%;%;%-%>%.%;%-%$%=%-%>% %v$k# V@3$+%,%;%;%-%>%;%>% %>%,%;%;%$%$%-%;%$%-%;%>%$%;%>%-%>%+%5$+# f@%$J$=%=%=%$%;%$%$%$%>%;%>%>%;%;%;%>%-%;%-%>%-%-%$%;%'%Z$k$a# ",\r
-" I@5$W$>%)%!%!%~%!%{%!%]%{%!%!%^%{%^%^%!%!%~%^%!%^%^%!%^%Z$m$/# /%q$ %(%!%{%^%!%!%^%!%(%]%^%!%^%^%!%^%!%!%^%!%!%!%{%!%;%R$)$ +#9$Z$>%_%]%^%^%(%(%^%^%!%!%(%~%!%!%^%{%!%:%^%!%!%^%{%^% %d$<% ",\r
-" _#k$-%:%:%:%[%:%[%~%[%[%[%:%[%:%[%~%:%~%~%:%:%~%:%:%[%~%}%a$ J#K${%[%:%[%[%:%[%~%[%~%~%:%~%:%~%[%:%[%[%[%:%[%~%[%:%!%R$~$ |%k$-%~%~%[%[%[%1%[%[%:%[%~%[%:%1%[%~%[%:%~%~%:%~%:%[%^% %5$ ",\r
-" 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$>$ ",\r
-" *$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# ",\r
-" 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% ",\r
-" 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% ",\r
-" 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%'& ",\r
-" )&!&~&{&]&{&^&]&]&^&^&]&^&^&]&/&]&^&]&/&]&^&^&^&/&]&^&(&_&:& <&[&}&|&^&^&^&]&^&/&/&]&^&]&^&]&^&^&^&/&]&^&/&]&^&^&^&]&1&2&3& 4&5&6&(&/&^&^&]&]&]&^&^&/&^&^&]&^&^&]&]&^&/&^&]&]&^&^&(&_&7& ",\r
-" 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& ",\r
-" 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& ",\r
-" 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&`& * ",\r
-" .*+*@*#*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&#*$*]*^*/* ",\r
-" (*_*:*$*<*[*[*}*[*$*$*}*<*$*$*<*$*}*$*$*$*[*}*#*<*#*[*:*|*1* 2*/*3*:*[*$*#*<*$*$*[*:*[*[*}*#*<*[*$*}*:*[*$*<*[*:*}*4*%*5*6* 7*8*:*$*<*$*}*$*<*[*[*}*[*#*:*<*$*$*[*<*$*[*}*#*}*$*9*%*|*0* ",\r
-" 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* ",\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* ",\r
-" ). 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*%=&=*=== ",\r
-" [.-= ;=>=,=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= ",\r
-" '+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= ",\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= ",\r
-" ]@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=+-@-+-+-.-+-+-@-.-+-+-{-.-]-^-&-/- ",\r
-" 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- ",\r
-" 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- ",\r
-" 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- ",\r
-" Y.Z-`- ; ;.;+;@; #;$;%;&;*;M-=; ; ; ;=;=; ;-;=; ;=; ;M- ; ; ;M- ; ;M- ; ;E-;;>; ,;';); ; ; ; ; ;M- ; ;=; ;M- ; ;M- ;!; ;L- ; ; ; ;=; ;~;{;];C- ^;/;(;&;_; ;M-!;=;-; ; ; ; ; ; ; ;M-M- ; ; ;M- ; ; ;M-!;:;<;[; ",\r
-" 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; ",\r
-" 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; ",\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;->~>*> ",\r
-" |@{>]>^>/>/>(>^>_>:><> [>}>|>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> ",\r
-" 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>*$ ",\r
-" 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>`> ,., ",\r
-" O.+,@,#,$,%,%,&,*,=,-,;,>,,,', ),!,>,%,%,*,*,*,$,~,*,%,$,$,%,;,*,*,&,%,%,$,*,*,%,%,-,J>{,], ^,/,(,-,*,;,%,;,*,%,~,-,$,=,;,%,%,;,%,-,*,$,*,~,~,%,*,J>_,:, <,,,[,-,%,~,*,%,*,~,*,%,~,%,*,%,%,*,%,%,},-,I>*,%,$,~,|,{,1, ",\r
-" 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, ",\r
-" 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, ",\r
-" -#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,/'('_' ",\r
-" [@:'<'['}'|'|'}'}'|'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' ",\r
-" 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'",\r
-" 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';)>)",\r
-" ,)')))!)~)~){)])^)/)(){)_)_)])/)~){):)<) [)})|){)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)",\r
-" 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)/)",\r
-" 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)",\r
-" %!&!*!=!-!;!;!=!=!=!=!=!=!=!=!=!=!M)=!=!=!k)>!,! '!)!!!=!=!=!=!=!;!=!=!=!=!=!=!=!=!L)M)=!=!=!N)=!=!=!=!N)~!{! ]!^!/!=!=!;!=!=!N);!=!=!=!M);!;!M)=!=!=!=!=!=!=!=!=!=!(!_!:! <!Q)P)N)=!=!M)=!=!=!=!=!=!=!=!=!=!=!N);!=!;!M)=!=!;!",\r
-" [!}!|!-!-!=!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!1!2! 3!4!N)-!=!-!-!-!=!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!5!6!7! 8!9!0!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!=!-!-!=!-!-!-!a!b!)!c! d!6! !-!-!=!-!-!;!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!",\r
-" 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!",\r
-" 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!",\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~",\r
-" 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~",\r
-" 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~",\r
-" Y~Z~`~J~ { { { { { { {I~ { { { { { { { { {I~ { {I~ { {.{+{@{ #{${%{J~ { {I~ { { { { { { { {c~ { { {I~ { { { { { {H~ {d~&{*{ ={-{m~ { { {J~ { {J~H~ { {I~ { { { { { {I~ { { { { { { {;{>{ ,{'{){.{ { { { {!{~{ { { { { {I~ { { {c~ {",\r
-" {{]{^{/{!{/{/{!{/{!{/{/{!{!{!{!{!{/{!{!{/{/{!{!{!{!{/{({_{:{ <{[{}{/{/{!{!{/{/{/{!{!{/{/{/{!{!{!{!{!{!{!{!{!{/{/{!{|{1{2{3{ 4{5{^{/{!{!{/{!{/{!{/{!{/{!{/{/{!{!{/{!{/{!{!{!{!{/{!{|{6{7{ 8{9{0{|{!{!{!{!{!{/{/{!{!{/{!{!{/{/{!{!{",\r
-" 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{",\r
-" 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{",\r
-" 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{",\r
-" (]_]:]<]<][]<]<]+]<]<]}]|][]-]-]<]-]@]<]<]+]<]<]<][]<]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{",\r
-" 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]",\r
-" 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]",\r
-" .^+^@^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]",\r
-" _^:^<^[^[^}^[^|^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^",\r
-" 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^",\r
-" 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^",\r
-" 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/>/</./ /./>/=/ /",\r
-" 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/-/",\r
-" 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/",\r
-" 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/",\r
-" {(](^(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/((",\r
-" 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(<([(",\r
-" 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(",\r
-" =_-_Y(;_;_>_,_,_P('_)_;_;_,_>_,_;_O(!_,_;_;_;_;_;_,_,_>_~_{_ ]_^_/_P((_;_,_,_O(;_,_O(__,_;_;_,_;_,_O('_;_'_@_,_;_,_,_k(:_<_ [_}_|_(_,_;_>_,_,_;_;_,_,_;_>_,_;_O(,_>_;_)_1_,_,_;_2_,_3_4_5_ 6_7_8_L(,_;_",\r
-" 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(!_",\r
-" 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_",\r
-" Y_Z_`_c_ :.:b_+:@:S_@:#:.:@:$:%:&:@:F_z_+:S_F_E_*:+:!_=:-:;:>: ,:':):!:~:.:$:%:.:E_.:+:+:z_F_#:c_@:@:c_E_ :S_@:.:.:%:#:{:{_ ]:^:/:(:_:_:+:+:#:F_z_c_F_@:=:+:@:.:$:::.:S_@:+:~:z_+:#:<:[:,: }:|:1:",\r
-" 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
-" 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:)<!<~< {<]<",\r
-" ^</<(<_<:<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<",\r
-" 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< ",\r
-" 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<.[+[@[#[$[ ",\r
-" %[&[*[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<^[/[([_[ ",\r
-" :[<[[[}[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[ ",\r
-" 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[ ",\r
-" 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[%}*}=} ",\r
-" -};}>},},},}&}s[&}'}V[T['})}'}&},}'},}'},})}&}&}'}&}&}C[!}~} {}]},}&}&}'})})}&}'}R[)}&},}'}U[,},}'}&}D[Q['}T[V['})},}^}/} (}_}:}<}[}R['}U['}&}'}'}}}&}&}Q[s[,},}&}&}[})},}'}W[,}&}|}1}2} ",\r
-" 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} ",\r
-" 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} ",\r
-" 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}*|=| ",\r
-" -|;|>|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} |[|}||| ",\r
-" 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| ",\r
-" 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| ",\r
-" 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 ",\r
-" $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 ",\r
-" /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 ",\r
-" 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 ",\r
-" w1x1y1m1m1m1m1z1z1f1m1A1m1f1e1m1z1e1A1A1z1m1A1A1m1z1z1B1C1D1 E1F1G1H1m1z1m1m1e1m1m1m1z1A1A1m1A1m1m1m1e1m1A1e1e1A1z1e1I1J1K1 L1M1N1e1A1A1e1A1A1e1m1m1m1m1m1m1A1m1m1z1m1m1e1e1m1m1m1z1O1P1Q1 "};\r
+++ /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"?>\r
-<?eclipse version="3.4"?>\r
-<plugin>\r
- <extension-point id="splashExtension" name="%extension-point.name" schema="schema/splashExtension.exsd"/>\r
-\r
- <extension\r
- id="product"\r
- point="org.eclipse.core.runtime.products">\r
- <product\r
- application="org.eclipse.e4.ui.workbench.swt.E4Application"\r
- name="Simulator WIP">\r
- <property\r
- name="applicationCSS"\r
- value="platform:/plugin/net.mograsim.rcp/css/default.css">\r
- </property>\r
- <property\r
- name="appName"\r
- value="Simulator WIP">\r
- </property>\r
- <property\r
- name="windowImages"\r
- 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">\r
- </property>\r
- <property\r
- name="aboutText"\r
- value="Example">\r
- </property>\r
- </product>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.splashHandlers">\r
- <splashHandler\r
- class="net.mograsim.rcp.splashhandlers.ExtensibleSplashHandler"\r
- id="net.mograsim.rcp.splashHandlers.extensible">\r
- </splashHandler>\r
- <splashHandlerProductBinding\r
- productId="net.mograsim.rcp.product"\r
- splashId="net.mograsim.rcp.splashHandlers.extensible">\r
- </splashHandlerProductBinding>\r
- </extension>\r
- <extension\r
- point="net.mograsim.rcp.splashExtension">\r
- <splashExtension\r
- icon="icons/af.png"\r
- id="af"\r
- tooltip="Application Framework">\r
- </splashExtension>\r
- <splashExtension\r
- icon="icons/embedded.png"\r
- id="embedded"\r
- tooltip="Embedded">\r
- </splashExtension>\r
- <splashExtension\r
- icon="icons/enterprise.png"\r
- id="enterprise"\r
- tooltip="Enterprise">\r
- </splashExtension>\r
- <splashExtension\r
- icon="icons/languages.png"\r
- id="languages"\r
- tooltip="Languages">\r
- </splashExtension>\r
- <splashExtension\r
- icon="icons/rcp.png"\r
- id="rcp"\r
- tooltip="RCP">\r
- </splashExtension>\r
- </extension>\r
-\r
-</plugin>\r
+++ /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;\r
-\r
-import org.eclipse.e4.core.di.annotations.Execute;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.swt.widgets.Shell;\r
-\r
-public class AboutHandler\r
-{\r
- @Execute\r
- public void execute(Shell shell)\r
- {\r
- MessageDialog.openInformation(shell, "About", "Sample RCP4");\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.rcp.handlers;\r
-\r
-import org.eclipse.e4.core.di.annotations.Execute;\r
-import org.eclipse.swt.widgets.FileDialog;\r
-import org.eclipse.swt.widgets.Shell;\r
-\r
-public class OpenHandler\r
-{\r
-\r
- @Execute\r
- public void execute(Shell shell)\r
- {\r
- FileDialog dialog = new FileDialog(shell);\r
- dialog.open();\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.rcp.handlers;\r
-\r
-import org.eclipse.e4.core.di.annotations.Execute;\r
-import org.eclipse.e4.ui.workbench.IWorkbench;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.swt.widgets.Shell;\r
-\r
-public class QuitHandler\r
-{\r
- @Execute\r
- public void execute(IWorkbench workbench, Shell shell)\r
- {\r
- if (MessageDialog.openConfirm(shell, "Confirmation", "Do you want to exit?"))\r
- {\r
- workbench.close();\r
- }\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.rcp.handlers;\r
-\r
-import org.eclipse.e4.core.di.annotations.CanExecute;\r
-import org.eclipse.e4.core.di.annotations.Execute;\r
-import org.eclipse.e4.ui.workbench.modeling.EPartService;\r
-\r
-public class SaveHandler\r
-{\r
-\r
- @CanExecute\r
- public boolean canExecute(EPartService partService)\r
- {\r
- if (partService != null)\r
- {\r
- return !partService.getDirtyParts().isEmpty();\r
- }\r
- return false;\r
- }\r
-\r
- @Execute\r
- public void execute(EPartService partService)\r
- {\r
- partService.saveAll(false);\r
- }\r
-}
\ 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;\r
-\r
-import java.util.Arrays;\r
-import java.util.List;\r
-\r
-import javax.annotation.PostConstruct;\r
-import javax.inject.Inject;\r
-\r
-import org.eclipse.e4.ui.di.Focus;\r
-import org.eclipse.e4.ui.di.Persist;\r
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;\r
-import org.eclipse.jface.viewers.ArrayContentProvider;\r
-import org.eclipse.jface.viewers.TableViewer;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Text;\r
-\r
-public class SamplePart\r
-{\r
-\r
- private TableViewer tableViewer;\r
-\r
- @Inject\r
- private MPart part;\r
-\r
- @PostConstruct\r
- public void createComposite(Composite parent)\r
- {\r
- parent.setLayout(new GridLayout(1, false));\r
-\r
- Text txtInput = new Text(parent, SWT.BORDER);\r
- txtInput.setMessage("Enter text to mark part as dirty");\r
- txtInput.addModifyListener(e -> part.setDirty(true));\r
- txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));\r
-\r
- tableViewer = new TableViewer(parent);\r
-\r
- tableViewer.setContentProvider(ArrayContentProvider.getInstance());\r
- tableViewer.setInput(createInitialDataModel());\r
- tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));\r
- }\r
-\r
- @Focus\r
- public void setFocus()\r
- {\r
- tableViewer.getTable().setFocus();\r
- }\r
-\r
- @Persist\r
- public void save()\r
- {\r
- part.setDirty(false);\r
- }\r
-\r
- private static List<String> createInitialDataModel()\r
- {\r
- return Arrays.asList("Sample item 1", "Sample item 2", "Sample item 3", "Sample item 4", "Sample item 5");\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.rcp.splashhandlers;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-\r
-import org.eclipse.core.runtime.IConfigurationElement;\r
-import org.eclipse.core.runtime.IExtension;\r
-import org.eclipse.core.runtime.Platform;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.eclipse.ui.splash.AbstractSplashHandler;\r
-\r
-/**\r
- * @since 3.3\r
- *\r
- */\r
-public class ExtensibleSplashHandler extends AbstractSplashHandler\r
-{\r
-\r
- private ArrayList<Image> fImageList;\r
-\r
- private ArrayList<String> fTooltipList;\r
-\r
- private static final String F_SPLASH_EXTENSION_ID = "Sample.splashExtension"; // NON-NLS-1\r
-\r
- private static final String F_ELEMENT_ICON = "icon"; // NON-NLS-1\r
-\r
- private static final String F_ELEMENT_TOOLTIP = "tooltip"; // NON-NLS-1\r
-\r
- private static final String F_DEFAULT_TOOLTIP = "Image"; // NON-NLS-1\r
-\r
- private static final int F_IMAGE_WIDTH = 50;\r
-\r
- private static final int F_IMAGE_HEIGHT = 50;\r
-\r
- private static final int F_SPLASH_SCREEN_BEVEL = 5;\r
-\r
- private Composite fIconPanel;\r
-\r
- /**\r
- * \r
- */\r
- public ExtensibleSplashHandler()\r
- {\r
- fImageList = new ArrayList<>();\r
- fTooltipList = new ArrayList<>();\r
- fIconPanel = null;\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.ui.splash.AbstractSplashHandler#init(org.eclipse.swt.widgets. Shell)\r
- */\r
- @Override\r
- public void init(Shell splash)\r
- {\r
- // Store the shell\r
- super.init(splash);\r
- // Configure the shell layout\r
- configureUISplash();\r
- // Load all splash extensions\r
- loadSplashExtensions();\r
- // If no splash extensions were loaded abort the splash handler\r
- if (!hasSplashExtensions())\r
- {\r
- return;\r
- }\r
- // Create UI\r
- createUI();\r
- // Configure the image panel bounds\r
- configureUICompositeIconPanelBounds();\r
- // Enter event loop and prevent the RCP application from\r
- // loading until all work is done\r
- doEventLoop();\r
- }\r
-\r
- /**\r
- * @return\r
- */\r
- private boolean hasSplashExtensions()\r
- {\r
- return !fImageList.isEmpty();\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void createUI()\r
- {\r
- // Create the icon panel\r
- createUICompositeIconPanel();\r
- // Create the images\r
- createUIImages();\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void createUIImages()\r
- {\r
- Iterator<Image> imageIterator = fImageList.iterator();\r
- Iterator<String> tooltipIterator = fTooltipList.iterator();\r
- int i = 1;\r
- int columnCount = ((GridLayout) fIconPanel.getLayout()).numColumns;\r
- // Create all the images\r
- // Abort if we run out of columns (left-over images will not fit within\r
- // the usable splash screen width)\r
- while (imageIterator.hasNext() && (i <= columnCount))\r
- {\r
- Image image = imageIterator.next();\r
- String tooltip = tooltipIterator.next();\r
- // Create the image using a label widget\r
- createUILabel(image, tooltip);\r
- i++;\r
- }\r
- }\r
-\r
- /**\r
- * @param image\r
- * @param tooltip\r
- */\r
- private void createUILabel(Image image, String tooltip)\r
- {\r
- // Create the label (no text)\r
- Label label = new Label(fIconPanel, SWT.NONE);\r
- label.setImage(image);\r
- label.setToolTipText(tooltip);\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void createUICompositeIconPanel()\r
- {\r
- Shell splash = getSplash();\r
- // Create the composite\r
- fIconPanel = new Composite(splash, SWT.NONE);\r
- // Determine the maximum number of columns that can fit on the splash\r
- // screen. One 50x50 image per column.\r
- int maxColumnCount = getUsableSplashScreenWidth() / F_IMAGE_WIDTH;\r
- // Limit size to the maximum number of columns if the number of images\r
- // exceed this amount; otherwise, use the exact number of columns\r
- // required.\r
- int actualColumnCount = Math.min(fImageList.size(), maxColumnCount);\r
- // Configure the layout\r
- GridLayout layout = new GridLayout(actualColumnCount, true);\r
- layout.horizontalSpacing = 0;\r
- layout.verticalSpacing = 0;\r
- layout.marginHeight = 0;\r
- layout.marginWidth = 0;\r
- fIconPanel.setLayout(layout);\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void configureUICompositeIconPanelBounds()\r
- {\r
- // Determine the size of the panel and position it at the bottom-right\r
- // of the splash screen.\r
- Point panelSize = fIconPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
-\r
- int xCoord = getSplash().getSize().x - F_SPLASH_SCREEN_BEVEL - panelSize.x;\r
- int yCoord = getSplash().getSize().y - F_SPLASH_SCREEN_BEVEL - panelSize.y;\r
- int xWidth = panelSize.x;\r
- int yWidth = panelSize.y;\r
-\r
- fIconPanel.setBounds(xCoord, yCoord, xWidth, yWidth);\r
- }\r
-\r
- /**\r
- * @return\r
- */\r
- private int getUsableSplashScreenWidth()\r
- {\r
- // Splash screen width minus two graphic border bevel widths\r
- return getSplash().getSize().x - (F_SPLASH_SCREEN_BEVEL * 2);\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void loadSplashExtensions()\r
- {\r
- // Get all splash handler extensions\r
- IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint(F_SPLASH_EXTENSION_ID).getExtensions();\r
- // Process all splash handler extensions\r
- for (int i = 0; i < extensions.length; i++)\r
- {\r
- processSplashExtension(extensions[i]);\r
- }\r
- }\r
-\r
- /**\r
- * @param extension\r
- */\r
- private void processSplashExtension(IExtension extension)\r
- {\r
- // Get all splash handler configuration elements\r
- IConfigurationElement[] elements = extension.getConfigurationElements();\r
- // Process all splash handler configuration elements\r
- for (int j = 0; j < elements.length; j++)\r
- {\r
- processSplashElements(elements[j]);\r
- }\r
- }\r
-\r
- /**\r
- * @param configurationElement\r
- */\r
- private void processSplashElements(IConfigurationElement configurationElement)\r
- {\r
- // Attribute: icon\r
- processSplashElementIcon(configurationElement);\r
- // Attribute: tooltip\r
- processSplashElementTooltip(configurationElement);\r
- }\r
-\r
- /**\r
- * @param configurationElement\r
- */\r
- private void processSplashElementTooltip(IConfigurationElement configurationElement)\r
- {\r
- // Get attribute tooltip\r
- String tooltip = configurationElement.getAttribute(F_ELEMENT_TOOLTIP);\r
- // If a tooltip is not defined, give it a default\r
- if ((tooltip == null) || (tooltip.length() == 0))\r
- {\r
- fTooltipList.add(F_DEFAULT_TOOLTIP);\r
- } else\r
- {\r
- fTooltipList.add(tooltip);\r
- }\r
- }\r
-\r
- /**\r
- * @param configurationElement\r
- */\r
- private void processSplashElementIcon(IConfigurationElement configurationElement)\r
- {\r
- // Get attribute icon\r
- String iconImageFilePath = configurationElement.getAttribute(F_ELEMENT_ICON);\r
- // Abort if an icon attribute was not specified\r
- if ((iconImageFilePath == null) || (iconImageFilePath.length() == 0))\r
- {\r
- return;\r
- }\r
- // Create a corresponding image descriptor\r
- ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getNamespaceIdentifier(),\r
- iconImageFilePath);\r
- // Abort if no corresponding image was found\r
- if (descriptor == null)\r
- {\r
- return;\r
- }\r
- // Create the image\r
- Image image = descriptor.createImage();\r
- // Abort if image creation failed\r
- if (image == null)\r
- {\r
- return;\r
- }\r
- // Abort if the image does not have dimensions of 50x50\r
- if ((image.getBounds().width != F_IMAGE_WIDTH) || (image.getBounds().height != F_IMAGE_HEIGHT))\r
- {\r
- // Dipose of the image\r
- image.dispose();\r
- return;\r
- }\r
- // Store the image and tooltip\r
- fImageList.add(image);\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void configureUISplash()\r
- {\r
- // Configure layout\r
- GridLayout layout = new GridLayout(1, true);\r
- getSplash().setLayout(layout);\r
- // Force shell to inherit the splash background\r
- getSplash().setBackgroundMode(SWT.INHERIT_DEFAULT);\r
- }\r
-\r
- /**\r
- * \r
- */\r
- private void doEventLoop()\r
- {\r
- Shell splash = getSplash();\r
- if (!splash.getDisplay().readAndDispatch())\r
- {\r
- splash.getDisplay().sleep();\r
- }\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.ui.splash.AbstractSplashHandler#dispose()\r
- */\r
- @Override\r
- public void dispose()\r
- {\r
- super.dispose();\r
- // Check to see if any images were defined\r
- if ((fImageList == null) || fImageList.isEmpty())\r
- {\r
- return;\r
- }\r
- // Dispose of all the images\r
- Iterator<Image> iterator = fImageList.iterator();\r
- while (iterator.hasNext())\r
- {\r
- Image image = iterator.next();\r
- image.dispose();\r
- }\r
- }\r
-}\r
+++ /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;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.WireObserver;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-\r
-/**\r
- * A basic component that recomputes all outputs (with a delay), when it is updated.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
-public abstract class BasicComponent extends Component implements WireObserver\r
-{\r
- private int processTime;\r
-\r
- /**\r
- * \r
- * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public BasicComponent(Timeline timeline, int processTime)\r
- {\r
- super(timeline);\r
- this.processTime = processTime > 0 ? processTime : 1;\r
- }\r
-\r
- @Override\r
- public void update(ReadEnd initiator, BitVector oldValues)\r
- {\r
- timeline.addEvent(e -> compute(), processTime);\r
- }\r
-\r
- protected abstract void compute();\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class BitDisplay extends BasicComponent\r
-{\r
- private final ReadEnd in;\r
- private BitVector displayedValue;\r
-\r
- public BitDisplay(Timeline timeline, ReadEnd in)\r
- {\r
- super(timeline, 1);\r
- this.in = in;\r
- in.addObserver(this);\r
- compute();\r
- }\r
-\r
- @Override\r
- protected void compute()\r
- {\r
- displayedValue = in.getValues();\r
- }\r
-\r
- public BitVector getDisplayedValue()\r
- {\r
- return displayedValue;\r
- }\r
-\r
- public boolean isDisplaying(Bit... values)\r
- {\r
- return displayedValue.equals(BitVector.of(values));\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(in);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of();\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.timeline.TimelineEvent;\r
-import net.mograsim.logic.core.timeline.TimelineEventHandler;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.wires.Wire;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class Clock extends Component implements TimelineEventHandler\r
-{\r
- private boolean toggle = false;\r
- private ReadWriteEnd out;\r
- private int delta;\r
-\r
- /**\r
- * \r
- * @param out {@link Wire} the clock's impulses are fed into\r
- * @param delta ticks between rising and falling edge\r
- */\r
- public Clock(Timeline timeline, ReadWriteEnd out, int delta)\r
- {\r
- super(timeline);\r
- this.delta = delta;\r
- this.out = out;\r
- addToTimeline();\r
- }\r
-\r
- @Override\r
- public void handle(TimelineEvent e)\r
- {\r
- addToTimeline();\r
- out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);\r
- toggle = !toggle;\r
- }\r
-\r
- public ReadWriteEnd getOut()\r
- {\r
- return out;\r
- }\r
-\r
- private void addToTimeline()\r
- {\r
- timeline.addEvent(this, delta);\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of();\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public abstract class Component\r
-{\r
- protected Timeline timeline;\r
-\r
- public Component(Timeline timeline)\r
- {\r
- this.timeline = timeline;\r
- }\r
-\r
- /**\r
- * Returns immutable list of all inputs to the {@link Component} (including e.g. the select bits to a MUX). Intended for visualization\r
- * in the UI.\r
- */\r
- public abstract List<ReadEnd> getAllInputs();\r
-\r
- /**\r
- * Returns immutable list of all outputs to the {@link Component}. Intended for visualization in the UI.\r
- */\r
- public abstract List<ReadWriteEnd> getAllOutputs();\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.WireObserver;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class Connector extends Component implements WireObserver\r
-{\r
- private boolean connected;\r
- private final ReadWriteEnd a;\r
- private final ReadWriteEnd b;\r
-\r
- public Connector(Timeline timeline, ReadWriteEnd a, ReadWriteEnd b)\r
- {\r
- super(timeline);\r
- if (a.length() != b.length())\r
- throw new IllegalArgumentException(String.format("WireArray width does not match: %d, %d", a.length(), b.length()));\r
- this.a = a;\r
- this.b = b;\r
- a.addObserver(this);\r
- b.addObserver(this);\r
- }\r
-\r
- public void connect()\r
- {\r
- connected = true;\r
- update(a);\r
- update(b);\r
- }\r
-\r
- public void disconnect()\r
- {\r
- connected = false;\r
- a.clearSignals();\r
- b.clearSignals();\r
- }\r
-\r
- public void setConnection(boolean connected)\r
- {\r
- if (connected)\r
- connect();\r
- else\r
- disconnect();\r
- }\r
-\r
- @Override\r
- public void update(ReadEnd initiator, BitVector oldValues)\r
- {\r
- if (connected)\r
- timeline.addEvent(e -> update(initiator), 1);\r
- }\r
-\r
- private void update(ReadEnd initiator)\r
- {\r
- if (initiator == a)\r
- b.feedSignals(a.wireValuesExcludingMe());\r
- else\r
- a.feedSignals(b.wireValuesExcludingMe());\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(a, b);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(a, b);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.wires.Wire;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-/**\r
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the\r
- * output.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class Demux extends BasicComponent\r
-{\r
- private final ReadEnd select, in;\r
- private final ReadWriteEnd[] outputs;\r
- private final int outputSize;\r
- private int selected = -1;\r
-\r
- /**\r
- * Output {@link Wire}s and in must be of uniform length\r
- * \r
- * @param in Must be of uniform length with all outputs.\r
- * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs.\r
- * @param outputs One of these outputs receives the input signal, depending on the select bits\r
- */\r
- public Demux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs)\r
- {\r
- super(timeline, processTime);\r
- outputSize = in.length();\r
-\r
- this.in = in;\r
- this.outputs = outputs;\r
- for (int i = 0; i < this.outputs.length; i++)\r
- {\r
- if (outputs[i].length() != outputSize)\r
- throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform length!");\r
- this.outputs[i] = outputs[i];\r
- }\r
-\r
- this.select = select;\r
- select.addObserver(this);\r
-\r
- int maxInputs = 1 << select.length();\r
- if (this.outputs.length > maxInputs)\r
- throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by "\r
- + select.length() + " select bits (" + maxInputs + ").");\r
- in.addObserver(this);\r
- }\r
-\r
- @Override\r
- public void compute()\r
- {\r
- int selectValue = select.hasNumericValue() ? (int) select.getUnsignedValue() : -1;\r
- if (selectValue >= outputs.length)\r
- selectValue = -1;\r
-\r
- if (selected != selectValue && selected != -1)\r
- outputs[selected].clearSignals();\r
-\r
- selected = selectValue;\r
-\r
- if (selectValue != -1)\r
- outputs[selectValue].feedSignals(in.getValues());\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(in, select);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(outputs);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-/**\r
- * This class models a simple on/off (ONE/ZERO) switch for user interaction.\r
- *\r
- * @author Christian Femers\r
- *\r
- */\r
-public class ManualSwitch extends Component\r
-{\r
- private ReadWriteEnd output;\r
- private boolean isOn;\r
-\r
- public ManualSwitch(Timeline timeline, ReadWriteEnd output)\r
- {\r
- super(timeline);\r
- if (output.length() != 1)\r
- throw new IllegalArgumentException("Switch output can be only a single wire");\r
- this.output = output;\r
- }\r
-\r
- public void switchOn()\r
- {\r
- setState(true);\r
- }\r
-\r
- public void switchOff()\r
- {\r
- setState(false);\r
- }\r
-\r
- public void toggle()\r
- {\r
- setState(!isOn);\r
- }\r
-\r
- public void setState(boolean isOn)\r
- {\r
- if (this.isOn == isOn)\r
- return;\r
- this.isOn = isOn;\r
- output.feedSignals(getValue());\r
- }\r
-\r
- public boolean isOn()\r
- {\r
- return isOn;\r
- }\r
-\r
- public Bit getValue()\r
- {\r
- return isOn ? Bit.ONE : Bit.ZERO;\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of();\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(output);\r
- }\r
-\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.Wire;\r
-import net.mograsim.logic.core.wires.WireObserver;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class Merger extends Component implements WireObserver\r
-{\r
- private ReadWriteEnd out;\r
- private ReadEnd[] inputs;\r
- private int[] beginningIndex;\r
-\r
- /**\r
- * \r
- * @param union The output of merging n {@link Wire}s into one. Must have length = a1.length() + a2.length() + ... + an.length().\r
- * @param inputs The inputs to be merged into the union\r
- */\r
- public Merger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs)\r
- {\r
- super(timeline);\r
- this.inputs = inputs;\r
- this.out = union;\r
- this.beginningIndex = new int[inputs.length];\r
-\r
- int length = 0;\r
- for (int i = 0; i < inputs.length; i++)\r
- {\r
- beginningIndex[i] = length;\r
- length += inputs[i].length();\r
- inputs[i].addObserver(this);\r
- }\r
-\r
- if (length != union.length())\r
- throw new IllegalArgumentException(\r
- "The output of merging n WireArrays into one must have length = a1.length() + a2.length() + ... + an.length().");\r
- }\r
-\r
- public ReadEnd getInput(int index)\r
- {\r
- return inputs[index];\r
- }\r
-\r
- public ReadEnd getUnion()\r
- {\r
- return out;\r
- }\r
-\r
- @Override\r
- public void update(ReadEnd initiator, BitVector oldValues)\r
- {\r
- int index = find(initiator);\r
- int beginning = beginningIndex[index];\r
- out.feedSignals(beginning, inputs[index].getValues());\r
- }\r
-\r
- private int find(ReadEnd r)\r
- {\r
- for (int i = 0; i < inputs.length; i++)\r
- if (inputs[i] == r)\r
- return i;\r
- return -1;\r
- }\r
-\r
- public ReadEnd[] getInputs()\r
- {\r
- return inputs.clone();\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(inputs);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.wires.Wire;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-/**\r
- * Models a multiplexer. Takes an arbitrary amount of input {@link Wire}s, one of which, as determined by select, is put through to the\r
- * output.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class Mux extends BasicComponent\r
-{\r
- private ReadEnd select;\r
- private ReadWriteEnd out;\r
- private ReadEnd[] inputs;\r
- private final int outputSize;\r
-\r
- /**\r
- * Input {@link Wire}s and out must be of uniform length\r
- * \r
- * @param out Must be of uniform length with all inputs.\r
- * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs.\r
- * @param inputs One of these inputs is mapped to the output, depending on the select bits\r
- */\r
- public Mux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)\r
- {\r
- super(timeline, processTime);\r
- outputSize = out.length();\r
-\r
- this.inputs = inputs.clone();\r
- for (int i = 0; i < this.inputs.length; i++)\r
- {\r
- if (inputs[i].length() != outputSize)\r
- throw new IllegalArgumentException("All MUX wire arrays must be of uniform length!");\r
- inputs[i].addObserver(this);\r
- }\r
-\r
- this.select = select;\r
- select.addObserver(this);\r
-\r
- int maxInputs = 1 << select.length();\r
- if (this.inputs.length > maxInputs)\r
- throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by "\r
- + select.length() + " select bits (" + maxInputs + ").");\r
-\r
- this.out = out;\r
- }\r
-\r
- public ReadEnd getOut()\r
- {\r
- return out;\r
- }\r
-\r
- public ReadEnd getSelect()\r
- {\r
- return select;\r
- }\r
-\r
- @Override\r
- public void compute()\r
- {\r
- int selectValue;\r
- if (!select.hasNumericValue() || (selectValue = (int) select.getUnsignedValue()) >= inputs.length)\r
- {\r
- out.clearSignals();\r
- return;\r
- }\r
-\r
- ReadEnd active = inputs[selectValue];\r
- out.feedSignals(active.getValues());\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- ArrayList<ReadEnd> wires = new ArrayList<ReadEnd>(Arrays.asList(inputs));\r
- wires.add(select);\r
- return Collections.unmodifiableList(wires);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.WireObserver;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class Splitter extends Component implements WireObserver\r
-{\r
- private ReadEnd input;\r
- private ReadWriteEnd[] outputs;\r
-\r
- public Splitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs)\r
- {\r
- super(timeline);\r
- this.input = input;\r
- this.outputs = outputs;\r
- input.addObserver(this);\r
- int length = 0;\r
- for (ReadEnd out : outputs)\r
- length += out.length();\r
-\r
- if (input.length() != length)\r
- throw new IllegalArgumentException(\r
- "The input of splitting one into n WireArrays must have length = a1.length() + a2.length() + ... + an.length().");\r
- }\r
-\r
- protected void compute()\r
- {\r
- BitVector inputBits = input.getValues();\r
- int startIndex = 0;\r
- for (int i = 0; i < outputs.length; i++)\r
- {\r
- outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].length()));\r
- startIndex += outputs[i].length();\r
- }\r
- }\r
-\r
- @Override\r
- public void update(ReadEnd initiator, BitVector oldValues)\r
- {\r
- compute();\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(input);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(outputs);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class TriStateBuffer extends BasicComponent\r
-{\r
- ReadEnd in, enable;\r
- ReadWriteEnd out;\r
-\r
- public TriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable)\r
- {\r
- super(timeline, processTime);\r
- if (in.length() != out.length())\r
- throw new IllegalArgumentException(\r
- "Tri-state output must have the same amount of bits as the input. Input: " + in.length() + " Output: " + out.length());\r
- if (enable.length() != 1)\r
- throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.length() + ".");\r
- this.in = in;\r
- in.addObserver(this);\r
- this.enable = enable;\r
- enable.addObserver(this);\r
- this.out = out;\r
- }\r
-\r
- @Override\r
- protected void compute()\r
- {\r
- if (enable.getValue() == Bit.ONE)\r
- out.feedSignals(in.getValues());\r
- else\r
- out.clearSignals();\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(in, enable);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components.gates;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class AndGate extends MultiInputGate\r
-{\r
- public AndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)\r
- {\r
- super(timeline, processTime, BitVectorMutator::and, out, in);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components.gates;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.components.BasicComponent;\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.MutationOperation;\r
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public abstract class MultiInputGate extends BasicComponent\r
-{\r
- protected ReadEnd[] in;\r
- protected ReadWriteEnd out;\r
- protected final int length;\r
- protected MutationOperation op;\r
-\r
- protected MultiInputGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in)\r
- {\r
- super(timeline, processTime);\r
- this.op = op;\r
- length = out.length();\r
- this.in = in.clone();\r
- if (in.length < 1)\r
- throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length));\r
- for (ReadEnd w : in)\r
- {\r
- if (w.length() != length)\r
- throw new IllegalArgumentException("All wires connected to the gate must be of uniform length.");\r
- w.addObserver(this);\r
- }\r
- this.out = out;\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(in);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-\r
- @Override\r
- protected void compute()\r
- {\r
- BitVectorMutator mutator = BitVectorMutator.empty();\r
- for (ReadEnd w : in)\r
- op.apply(mutator, w.getValues());\r
- out.feedSignals(mutator.get());\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components.gates;\r
-\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.components.BasicComponent;\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class NotGate extends BasicComponent\r
-{\r
- private ReadEnd in;\r
- private ReadWriteEnd out;\r
-\r
- public NotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out)\r
- {\r
- super(timeline, processTime);\r
- this.in = in;\r
- in.addObserver(this);\r
- this.out = out;\r
- }\r
-\r
- @Override\r
- protected void compute()\r
- {\r
- out.feedSignals(in.getValues().not());\r
- }\r
-\r
- public ReadEnd getIn()\r
- {\r
- return in;\r
- }\r
-\r
- public ReadEnd getOut()\r
- {\r
- return out;\r
- }\r
-\r
- @Override\r
- public List<ReadEnd> getAllInputs()\r
- {\r
- return List.of(in);\r
- }\r
-\r
- @Override\r
- public List<ReadWriteEnd> getAllOutputs()\r
- {\r
- return List.of(out);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components.gates;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-public class OrGate extends MultiInputGate\r
-{\r
- public OrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)\r
- {\r
- super(timeline, processTime, BitVectorMutator::or, out, in);\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.components.gates;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-/**\r
- * Outputs 1 when the number of 1 inputs is odd.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
-public class XorGate extends MultiInputGate\r
-{\r
- public XorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in)\r
- {\r
- super(timeline, processTime, BitVectorMutator::xor, out, in);\r
- }\r
-\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.tests;\r
-\r
-import static org.junit.Assert.assertTrue;\r
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;\r
-import static org.junit.jupiter.api.Assertions.assertEquals;\r
-import static org.junit.jupiter.api.Assertions.fail;\r
-\r
-import java.util.function.LongConsumer;\r
-\r
-import org.junit.jupiter.api.Test;\r
-\r
-import net.mograsim.logic.core.components.Connector;\r
-import net.mograsim.logic.core.components.Demux;\r
-import net.mograsim.logic.core.components.Merger;\r
-import net.mograsim.logic.core.components.Mux;\r
-import net.mograsim.logic.core.components.Splitter;\r
-import net.mograsim.logic.core.components.TriStateBuffer;\r
-import net.mograsim.logic.core.components.gates.AndGate;\r
-import net.mograsim.logic.core.components.gates.NotGate;\r
-import net.mograsim.logic.core.components.gates.OrGate;\r
-import net.mograsim.logic.core.components.gates.XorGate;\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.Wire;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
-\r
-class ComponentTest\r
-{\r
- private Timeline t = new Timeline(11);\r
-\r
- @Test\r
- void circuitExampleTest()\r
- {\r
- 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),\r
- 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),\r
- k = new Wire(t, 1, 1);\r
- new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
- new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());\r
- new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());\r
- new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());\r
- new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());\r
-\r
- a.createReadWriteEnd().feedSignals(Bit.ZERO);\r
- b.createReadWriteEnd().feedSignals(Bit.ONE);\r
- c.createReadWriteEnd().feedSignals(Bit.ZERO);\r
- d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);\r
- e.createReadWriteEnd().feedSignals(Bit.ZERO);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.ONE, j.getValue());\r
- assertEquals(Bit.ZERO, k.getValue());\r
- }\r
-\r
- @Test\r
- void splitterTest()\r
- {\r
- t.reset();\r
- 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);\r
- in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
- new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);\r
- assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);\r
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);\r
- }\r
-\r
- @Test\r
- void mergerTest()\r
- {\r
- t.reset();\r
- 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);\r
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);\r
- b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);\r
- c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
- }\r
-\r
- @Test\r
- void triStateBufferTest()\r
- {\r
- 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);\r
- new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());\r
- new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());\r
- new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());\r
-\r
- ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();\r
- enI.feedSignals(Bit.ONE);\r
- aI.feedSignals(Bit.ONE);\r
- bI.feedSignals(Bit.Z);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.ONE, b.getValue());\r
-\r
- bI.feedSignals(Bit.ZERO);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.X, b.getValue());\r
- assertEquals(Bit.ONE, a.getValue());\r
-\r
- aI.clearSignals();\r
- enI.feedSignals(Bit.ZERO);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.ZERO, a.getValue());\r
-\r
- }\r
-\r
- @Test\r
- void muxTest()\r
- {\r
- t.reset();\r
- 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);\r
- ReadWriteEnd selectIn = select.createReadWriteEnd();\r
-\r
- selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
- c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),\r
- c.createReadOnlyEnd());\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
- selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-\r
- }\r
-\r
- @Test\r
- void demuxTest()\r
- {\r
- t.reset();\r
- 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);\r
- ReadWriteEnd selectIn = select.createReadWriteEnd();\r
-\r
- selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
- in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-\r
- new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),\r
- c.createReadWriteEnd());\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
- assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
- selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
-\r
- selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
- assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
- assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
-\r
- }\r
-\r
- @Test\r
- void andTest()\r
- {\r
- t.reset();\r
- Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
- new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
- b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
- }\r
-\r
- @Test\r
- void orTest()\r
- {\r
- t.reset();\r
- Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
- new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
- b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);\r
- }\r
-\r
- @Test\r
- void xorTest()\r
- {\r
- t.reset();\r
- 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);\r
- new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
- b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
- c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);\r
- }\r
-\r
- @Test\r
- void notTest()\r
- {\r
- t.reset();\r
- Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);\r
- new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());\r
- a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);\r
- }\r
-\r
- @Test\r
- void rsLatchCircuitTest()\r
- {\r
- t.reset();\r
- 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),\r
- nq = new Wire(t, 1, 1);\r
-\r
- new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());\r
- new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());\r
- new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());\r
- new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());\r
-\r
- ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();\r
-\r
- sIn.feedSignals(Bit.ONE);\r
- rIn.feedSignals(Bit.ZERO);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.ONE, q.getValue());\r
- assertEquals(Bit.ZERO, nq.getValue());\r
-\r
- sIn.feedSignals(Bit.ZERO);\r
-\r
- t.executeAll();\r
- assertEquals(Bit.ONE, q.getValue());\r
- assertEquals(Bit.ZERO, nq.getValue());\r
-\r
- rIn.feedSignals(Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(Bit.ZERO, q.getValue());\r
- assertEquals(Bit.ONE, nq.getValue());\r
- }\r
-\r
- @Test\r
- void numericValueTest()\r
- {\r
- t.reset();\r
-\r
- Wire a = new Wire(t, 4, 1);\r
- a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);\r
-\r
- t.executeAll();\r
-\r
- assertEquals(15, a.getUnsignedValue());\r
- assertEquals(-1, a.getSignedValue());\r
- }\r
-\r
- boolean flag = false;\r
-\r
- @Test\r
- void simpleTimelineTest()\r
- {\r
- Timeline t = new Timeline(3);\r
- flag = false;\r
- t.addEvent((e) ->\r
- {\r
- if (!flag)\r
- fail();\r
- flag = false;\r
- }, 15);\r
- t.addEvent((e) ->\r
- {\r
- if (flag)\r
- fail();\r
- flag = true;\r
- }, 10);\r
- t.addEvent((e) ->\r
- {\r
- if (flag)\r
- fail();\r
- flag = true;\r
- }, 20);\r
- t.addEvent((e) ->\r
- {\r
- fail("Only supposed to execute until timestamp 20, not 25");\r
- }, 25);\r
-\r
- t.executeUntil(t.laterThan(20), 100);\r
-\r
- if (!flag)\r
- fail();\r
- }\r
-\r
- @Test\r
- void multipleInputs()\r
- {\r
- t.reset();\r
- Wire w = new Wire(t, 2, 1);\r
- ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();\r
- wI1.feedSignals(Bit.ONE, Bit.Z);\r
- wI2.feedSignals(Bit.Z, Bit.X);\r
- t.executeAll();\r
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);\r
-\r
- wI2.feedSignals(Bit.ZERO, Bit.Z);\r
- t.executeAll();\r
- assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);\r
-\r
- wI2.feedSignals(Bit.Z, Bit.Z);\r
- t.executeAll();\r
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
-\r
- wI2.feedSignals(Bit.ONE, Bit.Z);\r
- ReadEnd rE = w.createReadOnlyEnd();\r
- rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));\r
- t.executeAll();\r
- rE.close();\r
- wI1.feedSignals(Bit.X, Bit.X);\r
- t.executeAll();\r
- wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));\r
- wI1.close();\r
- assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
- }\r
-\r
- @Test\r
- void wireConnections()\r
- {\r
- // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde\r
-\r
- t.reset();\r
-\r
- Wire a = new Wire(t, 1, 2);\r
- Wire b = new Wire(t, 1, 2);\r
- Wire c = new Wire(t, 1, 2);\r
- ReadWriteEnd aI = a.createReadWriteEnd();\r
- ReadWriteEnd bI = b.createReadWriteEnd();\r
- ReadWriteEnd cI = c.createReadWriteEnd();\r
-\r
- TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());\r
- TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());\r
- LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);\r
-\r
- cI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
-\r
- cI.feedSignals(Bit.X);\r
- test.assertAfterSimulationIs(print, Bit.X);\r
-\r
- cI.feedSignals(Bit.X);\r
- cI.feedSignals(Bit.Z);\r
- test.assertAfterSimulationIs(print, Bit.Z);\r
-\r
- new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();\r
- test.assertAfterSimulationIs(print, Bit.Z);\r
- System.err.println("ONE");\r
- bI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
- System.err.println("ZERO");\r
- bI.feedSignals(Bit.ZERO);\r
- test.assertAfterSimulationIs(print, Bit.ZERO);\r
- System.err.println("Z");\r
- bI.feedSignals(Bit.Z);\r
- test.assertAfterSimulationIs(print, Bit.Z);\r
-\r
- new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();\r
- System.err.println("Z 2");\r
- aI.feedSignals(Bit.Z);\r
- test.assertAfterSimulationIs(print, Bit.Z);\r
- test2.assertAfterSimulationIs(Bit.Z);\r
- System.err.println("ONE 2");\r
- aI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
- test2.assertAfterSimulationIs(Bit.ONE);\r
- System.err.println("ZERO 2");\r
- aI.feedSignals(Bit.ZERO);\r
- test.assertAfterSimulationIs(print, Bit.ZERO);\r
- test2.assertAfterSimulationIs(Bit.ZERO);\r
- System.err.println("Z 2 II");\r
- aI.feedSignals(Bit.Z);\r
- test.assertAfterSimulationIs(print, Bit.Z);\r
- test2.assertAfterSimulationIs(Bit.Z);\r
-\r
- System.err.println("No Conflict yet");\r
- bI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
- test2.assertAfterSimulationIs(Bit.ONE);\r
- aI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
- test2.assertAfterSimulationIs(Bit.ONE);\r
- System.err.println("Conflict");\r
- aI.feedSignals(Bit.ZERO);\r
- test.assertAfterSimulationIs(print, Bit.X);\r
- test2.assertAfterSimulationIs(Bit.X);\r
- aI.feedSignals(Bit.ONE);\r
- test.assertAfterSimulationIs(print, Bit.ONE);\r
- test2.assertAfterSimulationIs(Bit.ONE);\r
- }\r
-\r
- private static void assertBitArrayEquals(BitVector actual, Bit... expected)\r
- {\r
- assertArrayEquals(expected, actual.getBits());\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.tests;\r
-\r
-import java.awt.Color;\r
-import java.awt.Graphics;\r
-import java.awt.Graphics2D;\r
-import java.awt.Rectangle;\r
-import java.awt.RenderingHints;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseListener;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.Map.Entry;\r
-\r
-import javax.swing.JFrame;\r
-import javax.swing.JPanel;\r
-import javax.swing.WindowConstants;\r
-\r
-import net.mograsim.logic.core.components.ManualSwitch;\r
-import net.mograsim.logic.core.components.gates.NotGate;\r
-import net.mograsim.logic.core.components.gates.OrGate;\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;\r
-import net.mograsim.logic.core.wires.Wire;\r
-\r
-public class GUITest extends JPanel\r
-{\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- private static final int WIRE_DELAY = 40;\r
- private static final int OR_DELAY = 100;\r
- private static final int NOT_DELAY = 100;\r
-\r
- private Timeline t = new Timeline(11);\r
-\r
- Wire r = new Wire(t, 1, WIRE_DELAY);\r
- Wire s = new Wire(t, 1, WIRE_DELAY);\r
- Wire t1 = new Wire(t, 1, WIRE_DELAY);\r
- Wire t2 = new Wire(t, 1, WIRE_DELAY);\r
- Wire q = new Wire(t, 1, WIRE_DELAY);\r
- Wire nq = new Wire(t, 1, WIRE_DELAY);\r
-\r
- ManualSwitch rIn = new ManualSwitch(t, r.createReadWriteEnd());\r
- ManualSwitch sIn = new ManualSwitch(t, s.createReadWriteEnd());\r
-\r
- OrGate or1 = new OrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());\r
- OrGate or2 = new OrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());\r
- NotGate not1 = new NotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd());\r
- NotGate not2 = new NotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd());\r
-\r
- Map<ManualSwitch, Rectangle> switchMap = new HashMap<>();\r
-\r
- int height;\r
- int width;\r
- boolean sizeChanged;\r
-\r
- public GUITest()\r
- {\r
- addMouseListener(new MouseListener()\r
- {\r
-\r
- @Override\r
- public void mouseReleased(MouseEvent e)\r
- {\r
- for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())\r
- {\r
- if (dim.getValue().contains(e.getPoint()))\r
- {\r
- dim.getKey().switchOff();\r
- repaint();\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- public void mousePressed(MouseEvent e)\r
- {\r
- for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet())\r
- {\r
- if (dim.getValue().contains(e.getPoint()))\r
- {\r
- dim.getKey().switchOn();\r
- repaint();\r
- }\r
- }\r
- }\r
-\r
- @Override\r
- public void mouseExited(MouseEvent e)\r
- {\r
- // none\r
- }\r
-\r
- @Override\r
- public void mouseEntered(MouseEvent e)\r
- {\r
- // none\r
- }\r
-\r
- @Override\r
- public void mouseClicked(MouseEvent e)\r
- {\r
- // If you want toggle buttons, use this code instead\r
-// for (Entry<ManualSwitch, Rectangle> dim : switchMap.entrySet()) {\r
-// if (dim.getValue().contains(e.getPoint())) {\r
-// dim.getKey().toggle();\r
-// repaint();\r
-// }\r
-// }\r
- }\r
- });\r
- }\r
-\r
- public Timeline getTimeline()\r
- {\r
- return t;\r
- };\r
-\r
- @Override\r
- public void paint(Graphics some_g)\r
- {\r
- super.paint(some_g);\r
- Graphics2D g = ((Graphics2D) some_g);\r
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);\r
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
- g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);\r
-\r
- checkSizeChange();\r
- adaptFont(g);\r
-\r
- drawWire(g, r, "r", 2, 9, 4, 9);\r
-\r
- drawWire(g, s, "s", 2, 3, 4, 3);\r
-\r
- drawWire(g, t2, "t2", 5, 8.5, 6, 8.5);\r
-\r
- drawWire(g, t1, "t1", 5, 3.5, 6, 3.5);\r
-\r
- drawWire(g, q, "q", 7, 8.5, 9, 8.5);\r
-\r
- drawWire(g, nq, "nq", 7, 3.5, 9, 3.5);\r
-\r
- drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5);\r
- drawWire(g, q, "", 7.5, 7.5, 3, 4.5);\r
- drawWire(g, q, "", 3, 4.5, 3, 4);\r
- drawWire(g, q, "q", 3, 4, 4, 4);\r
-\r
- drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5);\r
- drawWire(g, nq, "", 7.5, 4.5, 3, 7.5);\r
- drawWire(g, nq, "", 3, 7.5, 3, 8);\r
- drawWire(g, nq, "nq", 3, 8, 4, 8);\r
-\r
- drawSquare(g, 4, 8, "OR");\r
- drawSquare(g, 4, 3, "OR");\r
-\r
- drawSquare(g, 6, 8, "NOT");\r
- drawSquare(g, 6, 3, "NOT");\r
-\r
- drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75);\r
- drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75);\r
-\r
- drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0);\r
- }\r
-\r
- private void checkSizeChange()\r
- {\r
- sizeChanged = height != getHeight() || width != getWidth();\r
- if (sizeChanged)\r
- {\r
- height = getHeight();\r
- width = getWidth();\r
- }\r
- }\r
-\r
- private void adaptFont(Graphics g)\r
- {\r
- g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f));\r
- }\r
-\r
- private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY)\r
- {\r
- int h = g.getFontMetrics().getAscent();\r
- int w = g.getFontMetrics().stringWidth(s);\r
- g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY));\r
- }\r
-\r
- private void drawWire(Graphics g, Wire wa, String name, double x1, double y1, double x2, double y2)\r
- {\r
- setTo(g, wa);\r
- g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2));\r
- drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0);\r
- }\r
-\r
- private void drawSquare(Graphics g, int posX, int posY, String text)\r
- {\r
- int x1 = gX(posX) - 5;\r
- int x2 = gX(posX + 1) + 5;\r
- int y1 = gY(posY) - 5;\r
- int y2 = gY(posY + 1) + 5;\r
-\r
- g.setColor(Color.WHITE);\r
- g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
- setBlack(g);\r
- g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
- drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
-\r
- }\r
-\r
- private void drawSwitch(Graphics g, ManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2)\r
- {\r
- int x1 = gX(posX1) - 5;\r
- int x2 = gX(posX2) + 5;\r
- int y1 = gY(posY1) - 5;\r
- int y2 = gY(posY2) + 5;\r
-\r
- if (sizeChanged)\r
- {\r
- Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1);\r
- switchMap.put(ms, r);\r
- }\r
-\r
- g.setColor(ms.isOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE);\r
- g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
- setBlack(g);\r
- g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1);\r
- drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5);\r
- }\r
-\r
- private static void setBlack(Graphics g)\r
- {\r
- g.setColor(Color.BLACK);\r
- }\r
-\r
- private static void setTo(Graphics g, Wire wa)\r
- {\r
- switch (wa.getValue())\r
- {\r
- case ONE:\r
- g.setColor(Color.GREEN);\r
- break;\r
- case X:\r
- g.setColor(Color.RED);\r
- break;\r
- case Z:\r
- g.setColor(Color.DARK_GRAY);\r
- break;\r
- case ZERO:\r
- g.setColor(Color.BLACK);\r
- break;\r
- case U:\r
- g.setColor(Color.MAGENTA);\r
- break;\r
- default:\r
- throw new IllegalArgumentException();\r
- }\r
- }\r
-\r
- private int gY(double pos)\r
- {\r
- return (int) (pos * height / 11);\r
- }\r
-\r
- private int gX(double pos)\r
- {\r
- return (int) (pos * width / 11) + 50;\r
- }\r
-\r
- public static void main(String[] args)\r
- {\r
- JFrame f = new JFrame("Test circuit 1.0.0");\r
- GUITest gt = new GUITest();\r
- f.add(gt);\r
- f.setSize(800, 600);\r
- f.setLocation(500, 400);\r
- f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
- f.setVisible(true);\r
-\r
- long begin = System.currentTimeMillis();\r
-\r
- long lastFrame = begin;\r
- long updateT = 16;\r
-\r
- while (f.isVisible())\r
- {\r
- ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14);\r
-// if (t.hasNext()) \r
-// t.executeNext();\r
- if (er != ExecutionResult.NOTHING_DONE)\r
- gt.repaint(12);\r
- try\r
- {\r
- Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0));\r
- }\r
- catch (Exception e)\r
- {\r
- e.printStackTrace();\r
- }\r
- lastFrame = System.currentTimeMillis();\r
- }\r
- }\r
-}\r
+++ /dev/null
-package net.mograsim.logic.core.tests;\r
-\r
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;\r
-\r
-import java.util.function.LongConsumer;\r
-\r
-import net.mograsim.logic.core.components.BitDisplay;\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-\r
-public final class TestBitDisplay extends BitDisplay\r
-{\r
-\r
- public TestBitDisplay(Timeline timeline, ReadEnd in)\r
- {\r
- super(timeline, in);\r
- }\r
-\r
- public void assertDisplays(Bit... expected)\r
- {\r
- assertArrayEquals(expected, getDisplayedValue().getBits());\r
- }\r
-\r
- public void assertAfterSimulationIs(Bit... expected)\r
- {\r
- timeline.executeAll();\r
- assertDisplays(expected);\r
- }\r
-\r
- public void assertAfterSimulationIs(LongConsumer r, Bit... expected)\r
- {\r
- while (timeline.hasNext())\r
- {\r
- timeline.executeNext();\r
- r.accept(timeline.getSimulationTime());\r
- }\r
- assertDisplays(expected);\r
- }\r
-\r
- @Override\r
- protected void compute()\r
- {\r
- super.compute();\r
- System.out.println("update: value is " + getDisplayedValue());\r
- }\r
-}\r
+++ /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;\r
-\r
-import static net.mograsim.logic.core.types.Bit.U;\r
-import static net.mograsim.logic.core.types.Bit.Z;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import net.mograsim.logic.core.timeline.Timeline;\r
-import net.mograsim.logic.core.types.Bit;\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
-\r
-/**\r
- * Represents an array of wires that can store n bits of information.\r
- * \r
- * @author Fabian Stemmler\r
- *\r
- */\r
-public class Wire\r
-{\r
- private BitVector values;\r
- public final int travelTime;\r
- private List<ReadEnd> attached = new ArrayList<ReadEnd>();\r
- public final int length;\r
- private List<ReadWriteEnd> inputs = new ArrayList<ReadWriteEnd>();\r
- private Timeline timeline;\r
-\r
- public Wire(Timeline timeline, int length, int travelTime)\r
- {\r
- if (length < 1)\r
- throw new IllegalArgumentException(\r
- String.format("Tried to create an array of wires with length %d, but a length of less than 1 makes no sense.", length));\r
- this.timeline = timeline;\r
- this.length = length;\r
- this.travelTime = travelTime;\r
- initValues();\r
- }\r
-\r
- private void initValues()\r
- {\r
- values = U.toVector(length);\r
- }\r
-\r
- private void recalculateSingleInput()\r
- {\r
- setNewValues(inputs.get(0).getInputValues());\r
- }\r
-\r
- private void recalculateMultipleInputs()\r
- {\r
- BitVectorMutator mutator = BitVectorMutator.empty();\r
- for (ReadWriteEnd wireArrayEnd : inputs)\r
- mutator.join(wireArrayEnd.getInputValues());\r
- setNewValues(mutator.get());\r
- }\r
-\r
- private void setNewValues(BitVector newValues)\r
- {\r
- if (values.equals(newValues))\r
- return;\r
- BitVector oldValues = values;\r
- values = newValues;\r
- notifyObservers(oldValues);\r
- }\r
-\r
- private void recalculate()\r
- {\r
- switch (inputs.size())\r
- {\r
- case 0:\r
- return;\r
- case 1:\r
- recalculateSingleInput();\r
- break;\r
- default:\r
- recalculateMultipleInputs();\r
- }\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as an unsigned integer with n bits.\r
- * \r
- * @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\r
- * value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public boolean hasNumericValue()\r
- {\r
- for (Bit b : values)\r
- {\r
- if (b != Bit.ZERO && b != Bit.ONE)\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as an unsigned integer with n bits.\r
- * \r
- * @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.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public long getUnsignedValue()\r
- {\r
- long val = 0;\r
- long mask = 1;\r
- for (Bit bit : values)\r
- {\r
- switch (bit)\r
- {\r
- default:\r
- case Z:\r
- case X:\r
- return 0; // TODO: Proper handling for getUnsignedValue(), if not all bits are 1 or 0;\r
- case ONE:\r
- val |= mask;\r
- break;\r
- case ZERO:\r
- }\r
- mask = mask << 1;\r
- }\r
- return val;\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as a signed integer with n bits.\r
- * \r
- * @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.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public long getSignedValue()\r
- {\r
- long val = getUnsignedValue();\r
- long mask = 1 << (length - 1);\r
- if ((mask & val) != 0)\r
- {\r
- int shifts = 64 - length;\r
- return (val << shifts) >> shifts;\r
- }\r
- return val;\r
- }\r
-\r
- public Bit getValue()\r
- {\r
- return getValue(0);\r
- }\r
-\r
- public Bit getValue(int index)\r
- {\r
- return values.getBit(index);\r
- }\r
-\r
- public BitVector getValues(int start, int end)\r
- {\r
- return values.subVector(start, end);\r
- }\r
-\r
- public BitVector getValues()\r
- {\r
- return values;\r
- }\r
-\r
- /**\r
- * Adds an {@link WireObserver}, who will be notified when the value of the {@link Wire} is updated.\r
- * \r
- * @param ob The {@link WireObserver} to be notified of changes.\r
- * @return true if the given {@link WireObserver} was not already registered, false otherwise\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- private void attachEnd(ReadEnd end)\r
- {\r
- attached.add(end);\r
- }\r
-\r
- private void detachEnd(ReadEnd end)\r
- {\r
- attached.remove(end);\r
- }\r
-\r
- private void notifyObservers(BitVector oldValues)\r
- {\r
- for (ReadEnd o : attached)\r
- o.update(oldValues);\r
- }\r
-\r
- /**\r
- * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link Wire}. This {@link ReadWriteEnd} can be written to.\r
- */\r
- public ReadWriteEnd createReadWriteEnd()\r
- {\r
- return new ReadWriteEnd();\r
- }\r
-\r
- /**\r
- * Create a {@link ReadEnd} object, which is tied to this {@link Wire}. This {@link ReadEnd} cannot be written to.\r
- */\r
- public ReadEnd createReadOnlyEnd()\r
- {\r
- return new ReadEnd();\r
- }\r
-\r
- private void registerInput(ReadWriteEnd toRegister)\r
- {\r
- inputs.add(toRegister);\r
- }\r
-\r
- /**\r
- * A {@link ReadEnd} feeds a constant signal into the {@link Wire} it is tied to. The combination of all inputs determines the\r
- * {@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\r
- * and 1 turn into X when they are mixed\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public class ReadEnd\r
- {\r
- private List<WireObserver> observers = new ArrayList<WireObserver>();\r
-\r
- private ReadEnd()\r
- {\r
- super();\r
- Wire.this.attachEnd(this);\r
- }\r
-\r
- public void update(BitVector oldValues)\r
- {\r
- for (WireObserver ob : observers)\r
- ob.update(this, oldValues);\r
- }\r
-\r
- /**\r
- * Included for convenient use on {@link Wire}s of length 1.\r
- * \r
- * @return The value of bit 0.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public Bit getValue()\r
- {\r
- return Wire.this.getValue();\r
- }\r
-\r
- /**\r
- * @param index Index of the requested bit.\r
- * @return The value of the indexed bit.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public Bit getValue(int index)\r
- {\r
- return Wire.this.getValue(index);\r
- }\r
-\r
- /**\r
- * @param index Index of the requested bit.\r
- * @return The value of the indexed bit.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public BitVector getValues()\r
- {\r
- return Wire.this.getValues();\r
- }\r
-\r
- /**\r
- * @param start Start of the wanted segment. (inclusive)\r
- * @param end End of the wanted segment. (exclusive)\r
- * @return The values of the segment of {@link Bit}s indexed.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public BitVector getValues(int start, int end)\r
- {\r
- return Wire.this.getValues(start, end);\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as an unsigned integer with n bits.\r
- * \r
- * @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\r
- * same value), not <code>Bit.X</code> or <code>Bit.Z</code>. <code>false</code> is returned otherwise.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public boolean hasNumericValue()\r
- {\r
- return Wire.this.hasNumericValue();\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as an unsigned integer with n bits.\r
- * \r
- * @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.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public long getUnsignedValue()\r
- {\r
- return Wire.this.getUnsignedValue();\r
- }\r
-\r
- /**\r
- * The {@link Wire} is interpreted as a signed integer with n bits.\r
- * \r
- * @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.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public long getSignedValue()\r
- {\r
- return Wire.this.getSignedValue();\r
- }\r
-\r
- @Override\r
- public String toString()\r
- {\r
- return Wire.this.toString();\r
- }\r
-\r
- public void close()\r
- {\r
- inputs.remove(this);\r
- detachEnd(this);\r
- recalculate();\r
- }\r
-\r
- public int length()\r
- {\r
- return length;\r
- }\r
-\r
- public boolean addObserver(WireObserver ob)\r
- {\r
- return observers.add(ob);\r
- }\r
-\r
- public Wire getWire()\r
- {\r
- return Wire.this;\r
- }\r
- }\r
-\r
- public class ReadWriteEnd extends ReadEnd\r
- {\r
- private boolean open;\r
- private BitVector inputValues;\r
-\r
- private ReadWriteEnd()\r
- {\r
- super();\r
- open = true;\r
- initValues();\r
- registerInput(this);\r
- }\r
-\r
- private void initValues()\r
- {\r
- inputValues = U.toVector(length);\r
- }\r
-\r
- /**\r
- * Sets the wires values. This takes up time, as specified by the {@link Wire}s travel time.\r
- * \r
- * @param newValues The new values the wires should take on.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public void feedSignals(Bit... newValues)\r
- {\r
- feedSignals(BitVector.of(newValues));\r
- }\r
-\r
- public void feedSignals(BitVector newValues)\r
- {\r
- if (newValues.length() != length)\r
- throw new IllegalArgumentException(\r
- String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), length));\r
- if (!open)\r
- throw new RuntimeException("Attempted to write to closed WireArrayEnd.");\r
- timeline.addEvent(e -> setValues(newValues), travelTime);\r
- }\r
-\r
- /**\r
- * Sets values of a subarray of wires. This takes up time, as specified by the {@link Wire}s travel time.\r
- * \r
- * @param bitVector The new values the wires should take on.\r
- * @param startingBit The first index of the subarray of wires.\r
- * \r
- * @author Fabian Stemmler\r
- */\r
- public void feedSignals(int startingBit, BitVector bitVector)\r
- {\r
- if (!open)\r
- throw new RuntimeException("Attempted to write to closed WireArrayEnd.");\r
- timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime);\r
- }\r
-\r
- private void setValues(int startingBit, BitVector newValues)\r
- {\r
- // index check covered in equals\r
- if (!inputValues.equalsWithOffset(newValues, startingBit))\r
- {\r
- Bit[] vals = inputValues.getBits();\r
- System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length());\r
- inputValues = BitVector.of(vals);\r
- Wire.this.recalculate();\r
- }\r
- }\r
-\r
- private void setValues(BitVector newValues)\r
- {\r
- if (inputValues.equals(newValues))\r
- return;\r
- inputValues = newValues;\r
- Wire.this.recalculate();\r
- }\r
-\r
- /**\r
- * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link Wire}.\r
- */\r
- public Bit getInputValue()\r
- {\r
- return getInputValue(0);\r
- }\r
-\r
- /**\r
- * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link Wire} at the indexed {@link Bit}.\r
- */\r
- public Bit getInputValue(int index)\r
- {\r
- return inputValues.getBit(index);\r
- }\r
-\r
- /**\r
- * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link Wire}.\r
- */\r
- public BitVector getInputValues()\r
- {\r
- return getInputValues(0, length);\r
- }\r
-\r
- public BitVector getInputValues(int start, int end)\r
- {\r
- return inputValues.subVector(start, end);\r
- }\r
-\r
- /**\r
- * {@link ReadEnd} now feeds Z into the associated {@link Wire}.\r
- */\r
- public void clearSignals()\r
- {\r
- feedSignals(Z.toVector(length));\r
- }\r
-\r
- public BitVector wireValuesExcludingMe()\r
- {\r
- BitVectorMutator mutator = BitVectorMutator.empty();\r
- for (ReadWriteEnd wireEnd : inputs)\r
- {\r
- if (wireEnd == this)\r
- continue;\r
- mutator.join(wireEnd.inputValues);\r
- }\r
- return mutator.get();\r
- }\r
-\r
- @Override\r
- public String toString()\r
- {\r
- return inputValues.toString();\r
- }\r
- }\r
-\r
- @Override\r
- public String toString()\r
- {\r
- return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), values, inputs);\r
- // Arrays.toString(values), inputs.stream().map(i -> Arrays.toString(i.inputValues)).reduce((s1, s2) -> s1 + s2)\r
- }\r
-\r
- public static ReadEnd[] extractEnds(Wire[] w)\r
- {\r
- ReadEnd[] inputs = new ReadEnd[w.length];\r
- for (int i = 0; i < w.length; i++)\r
- inputs[i] = w[i].createReadWriteEnd();\r
- return inputs;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.logic.core.wires;\r
-\r
-import net.mograsim.logic.core.types.BitVector;\r
-import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
-\r
-public interface WireObserver\r
-{\r
- public void update(ReadEnd initiator, BitVector oldValues);\r
-}\r
--- /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();
+ }
+ }
+}