diff --git a/Assets/Resources/Prefabs/Facts/Angle.prefab b/Assets/Resources/Prefabs/Facts/Angle.prefab
index e4f4372ce241f0069cfb2380b3b40f485eef869b..b3179be4757731aa8cb9e01a576ea50beafa456e 100644
--- a/Assets/Resources/Prefabs/Facts/Angle.prefab
+++ b/Assets/Resources/Prefabs/Facts/Angle.prefab
@@ -267,7 +267,7 @@ MeshCollider:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3394522495515098197}
   m_Material: {fileID: 0}
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_Enabled: 1
   serializedVersion: 4
   m_Convex: 1
@@ -407,10 +407,10 @@ MeshCollider:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3394522496185282000}
   m_Material: {fileID: 0}
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_Enabled: 1
   serializedVersion: 4
-  m_Convex: 0
+  m_Convex: 1
   m_CookingOptions: 30
   m_Mesh: {fileID: 0}
 --- !u!114 &3394522496185282007
diff --git a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab b/Assets/Resources/Prefabs/Facts/Angle_Old.prefab
index 350822eead5a188664497a3ffb86d62475611e5c..8db326a77d14b2984d72395357287df4c6c590c4 100644
--- a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab
+++ b/Assets/Resources/Prefabs/Facts/Angle_Old.prefab
@@ -10,7 +10,6 @@ GameObject:
   m_Component:
   - component: {fileID: 776204628661091474}
   - component: {fileID: 1611341617565119760}
-  - component: {fileID: 5847986162312327669}
   - component: {fileID: 3727883962287805668}
   - component: {fileID: 8678993674720081185}
   m_Layer: 12
@@ -54,6 +53,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
   m_RenderingLayerMask: 1
   m_RendererPriority: 0
   m_Materials:
@@ -78,14 +78,7 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 1
---- !u!33 &5847986162312327669
-MeshFilter:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1047820262597827614}
-  m_Mesh: {fileID: 0}
+  m_AdditionalVertexStreams: {fileID: 0}
 --- !u!222 &3727883962287805668
 CanvasRenderer:
   m_ObjectHideFlags: 0
@@ -109,6 +102,7 @@ MonoBehaviour:
   m_Material: {fileID: 0}
   m_Color: {r: 1, g: 1, b: 1, a: 1}
   m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
     m_PersistentCalls:
@@ -134,13 +128,12 @@ MonoBehaviour:
   m_fontColorGradientPreset: {fileID: 0}
   m_spriteAsset: {fileID: 0}
   m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
   m_overrideHtmlColors: 0
   m_faceColor:
     serializedVersion: 2
     rgba: 4294967295
-  m_outlineColor:
-    serializedVersion: 2
-    rgba: 4278190080
   m_fontSize: 2
   m_fontSizeBase: 2
   m_fontWeight: 400
@@ -148,7 +141,9 @@ MonoBehaviour:
   m_fontSizeMin: 18
   m_fontSizeMax: 72
   m_fontStyle: 0
-  m_textAlignment: 514
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
   m_characterSpacing: 0
   m_wordSpacing: 0
   m_lineSpacing: 0
@@ -158,10 +153,8 @@ MonoBehaviour:
   m_enableWordWrapping: 1
   m_wordWrappingRatios: 0.4
   m_overflowMode: 0
-  m_firstOverflowCharacterIndex: -1
   m_linkedTextComponent: {fileID: 0}
-  m_isLinkedTextComponent: 0
-  m_isTextTruncated: 0
+  parentLinkedComponent: {fileID: 0}
   m_enableKerning: 1
   m_enableExtraPadding: 0
   checkPaddingRequired: 0
@@ -169,42 +162,23 @@ MonoBehaviour:
   m_parseCtrlCharacters: 1
   m_isOrthographic: 0
   m_isCullingEnabled: 0
-  m_ignoreRectMaskCulling: 0
-  m_ignoreCulling: 1
   m_horizontalMapping: 0
   m_verticalMapping: 0
   m_uvLineOffset: 0
   m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
   m_VertexBufferAutoSizeReduction: 1
-  m_firstVisibleCharacter: 0
   m_useMaxVisibleDescender: 1
   m_pageToDisplay: 1
   m_margin: {x: 0, y: 0, z: 0, w: 0}
-  m_textInfo:
-    textComponent: {fileID: 8678993674720081185}
-    characterCount: 4
-    spriteCount: 0
-    spaceCount: 0
-    wordCount: 1
-    linkCount: 0
-    lineCount: 1
-    pageCount: 1
-    materialCount: 1
   m_isUsingLegacyAnimationComponent: 0
   m_isVolumetricText: 0
-  m_spriteAnimator: {fileID: 0}
   m_hasFontAssetChanged: 0
   m_renderer: {fileID: 1611341617565119760}
-  m_subTextObjects:
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
   m_maskType: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
 --- !u!1 &4650993678488610235
 GameObject:
   m_ObjectHideFlags: 0
@@ -263,6 +237,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
   m_RenderingLayerMask: 1
   m_RendererPriority: 0
   m_Materials:
@@ -287,6 +262,7 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
 --- !u!114 &4650993678488610230
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -299,7 +275,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  Id: 0
+  URI: 
 --- !u!64 &4650993678488610231
 MeshCollider:
   m_ObjectHideFlags: 0
@@ -308,10 +284,10 @@ MeshCollider:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 4650993678488610235}
   m_Material: {fileID: 0}
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_Enabled: 1
   serializedVersion: 4
-  m_Convex: 0
+  m_Convex: 1
   m_CookingOptions: 30
   m_Mesh: {fileID: 4300000, guid: 4fe93ee2ed2d8c64389611c85232bf23, type: 2}
 --- !u!1 &4650993679089994827
@@ -403,6 +379,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
   m_RenderingLayerMask: 1
   m_RendererPriority: 0
   m_Materials:
@@ -427,6 +404,7 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
 --- !u!114 &7310199272454353937
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -439,10 +417,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: a6b9fc46f5bfe6b4eb4adf01e6b65bac, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  meshRendererToChange: {fileID: 4650993679319476102}
-  animationStartColor: {r: 0.98039216, g: 0.99215686, b: 0.03137255, a: 1}
-  animationEndColor: {r: 1, g: 0.52156866, b: 0.007843138, a: 1}
-  animateDuration: 5
 --- !u!1 &7003220517868882106
 GameObject:
   m_ObjectHideFlags: 0
@@ -453,7 +427,6 @@ GameObject:
   m_Component:
   - component: {fileID: 6834100498144429849}
   - component: {fileID: 2708246422010202965}
-  - component: {fileID: 9133314279872122108}
   - component: {fileID: 8080899974220995652}
   - component: {fileID: 3620593617881097249}
   m_Layer: 12
@@ -497,6 +470,7 @@ MeshRenderer:
   m_LightProbeUsage: 1
   m_ReflectionProbeUsage: 1
   m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
   m_RenderingLayerMask: 1
   m_RendererPriority: 0
   m_Materials:
@@ -521,14 +495,7 @@ MeshRenderer:
   m_SortingLayerID: 0
   m_SortingLayer: 0
   m_SortingOrder: 1
---- !u!33 &9133314279872122108
-MeshFilter:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7003220517868882106}
-  m_Mesh: {fileID: 0}
+  m_AdditionalVertexStreams: {fileID: 0}
 --- !u!222 &8080899974220995652
 CanvasRenderer:
   m_ObjectHideFlags: 0
@@ -552,6 +519,7 @@ MonoBehaviour:
   m_Material: {fileID: 0}
   m_Color: {r: 1, g: 1, b: 1, a: 1}
   m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
     m_PersistentCalls:
@@ -577,13 +545,12 @@ MonoBehaviour:
   m_fontColorGradientPreset: {fileID: 0}
   m_spriteAsset: {fileID: 0}
   m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
   m_overrideHtmlColors: 0
   m_faceColor:
     serializedVersion: 2
     rgba: 4294967295
-  m_outlineColor:
-    serializedVersion: 2
-    rgba: 4278190080
   m_fontSize: 2
   m_fontSizeBase: 2
   m_fontWeight: 400
@@ -591,7 +558,9 @@ MonoBehaviour:
   m_fontSizeMin: 18
   m_fontSizeMax: 72
   m_fontStyle: 0
-  m_textAlignment: 514
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
   m_characterSpacing: 0
   m_wordSpacing: 0
   m_lineSpacing: 0
@@ -601,10 +570,8 @@ MonoBehaviour:
   m_enableWordWrapping: 1
   m_wordWrappingRatios: 0.4
   m_overflowMode: 0
-  m_firstOverflowCharacterIndex: -1
   m_linkedTextComponent: {fileID: 0}
-  m_isLinkedTextComponent: 0
-  m_isTextTruncated: 0
+  parentLinkedComponent: {fileID: 0}
   m_enableKerning: 1
   m_enableExtraPadding: 0
   checkPaddingRequired: 0
@@ -612,39 +579,20 @@ MonoBehaviour:
   m_parseCtrlCharacters: 1
   m_isOrthographic: 0
   m_isCullingEnabled: 0
-  m_ignoreRectMaskCulling: 0
-  m_ignoreCulling: 1
   m_horizontalMapping: 0
   m_verticalMapping: 0
   m_uvLineOffset: 0
   m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
   m_VertexBufferAutoSizeReduction: 1
-  m_firstVisibleCharacter: 0
   m_useMaxVisibleDescender: 1
   m_pageToDisplay: 1
   m_margin: {x: 0, y: 0, z: 0, w: 0}
-  m_textInfo:
-    textComponent: {fileID: 3620593617881097249}
-    characterCount: 4
-    spriteCount: 0
-    spaceCount: 0
-    wordCount: 1
-    linkCount: 0
-    lineCount: 1
-    pageCount: 1
-    materialCount: 1
   m_isUsingLegacyAnimationComponent: 0
   m_isVolumetricText: 0
-  m_spriteAnimator: {fileID: 0}
   m_hasFontAssetChanged: 0
   m_renderer: {fileID: 2708246422010202965}
-  m_subTextObjects:
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
   m_maskType: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
diff --git a/Assets/Resources/Prefabs/Facts/Circle.prefab b/Assets/Resources/Prefabs/Facts/Circle.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..6a524bc9e88c952fcf712e6644a37b903f3e326c
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Circle.prefab
@@ -0,0 +1,258 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &5866155945383417828
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8554957501859850914}
+  - component: {fileID: 3164742056485930267}
+  - component: {fileID: 1460740696286669547}
+  - component: {fileID: 6716233798214228857}
+  m_Layer: 15
+  m_Name: CircleHighlight
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8554957501859850914
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.96, y: 0.51, z: 0.96}
+  m_Children: []
+  m_Father: {fileID: 142224692930156368}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3164742056485930267
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1460740696286669547
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &6716233798214228857
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5866155945383417828}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a6b9fc46f5bfe6b4eb4adf01e6b65bac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &6262947649539239553
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 142224692930156368}
+  - component: {fileID: 7167210412035754299}
+  - component: {fileID: 1078883255209641429}
+  - component: {fileID: 5602986836502461330}
+  - component: {fileID: 8419554499757686208}
+  - component: {fileID: 8526453253978894086}
+  m_Layer: 15
+  m_Name: Mesh
+  m_TagString: SnapZone
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &142224692930156368
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 0.01, z: 1}
+  m_Children:
+  - {fileID: 8554957501859850914}
+  m_Father: {fileID: 3390467403729316765}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &7167210412035754299
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1078883255209641429
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &5602986836502461330
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  URI: 
+--- !u!95 &8419554499757686208
+Animator:
+  serializedVersion: 3
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Enabled: 1
+  m_Avatar: {fileID: 0}
+  m_Controller: {fileID: 9100000, guid: 7f5a2c4324ecb83488857feb7887b5a7, type: 2}
+  m_CullingMode: 0
+  m_UpdateMode: 0
+  m_ApplyRootMotion: 0
+  m_LinearVelocityBlending: 0
+  m_WarningMessage: 
+  m_HasTransformHierarchy: 1
+  m_AllowConstantClipSamplingOptimization: 1
+  m_KeepAnimatorControllerStateOnDisable: 0
+--- !u!64 &8526453253978894086
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 1
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 1
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!1 &6839596689016440457
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3390467403729316765}
+  m_Layer: 15
+  m_Name: Circle
+  m_TagString: Selectable
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3390467403729316765
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6839596689016440457}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 142224692930156368}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
diff --git a/Assets/Resources/Prefabs/Facts/Circle.prefab.meta b/Assets/Resources/Prefabs/Facts/Circle.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4ae1824cae78e252d401e3e2ae1eafe5efcf9516
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Circle.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b26ea07a37e18df4ab12f8e4a9859820
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/Facts/Line.prefab b/Assets/Resources/Prefabs/Facts/Line.prefab
index 95f3833b6f17a58acdf489708930bd17f895081b..76c0c28bc6a7552bd99de452c201fc4f8d78b6fd 100644
--- a/Assets/Resources/Prefabs/Facts/Line.prefab
+++ b/Assets/Resources/Prefabs/Facts/Line.prefab
@@ -423,7 +423,7 @@ BoxCollider:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 6378548342073962023}
   m_Material: {fileID: 0}
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_Enabled: 1
   serializedVersion: 2
   m_Size: {x: 1, y: 1, z: 1}
diff --git a/Assets/Resources/Prefabs/Facts/Point.prefab b/Assets/Resources/Prefabs/Facts/Point.prefab
index faf981c3fab62d9b0ce8f8baa08a0fed31251796..2e66ce013b0318d2bcec5c37a159d992a299236e 100644
--- a/Assets/Resources/Prefabs/Facts/Point.prefab
+++ b/Assets/Resources/Prefabs/Facts/Point.prefab
@@ -13,6 +13,7 @@ GameObject:
   - component: {fileID: 1075046474335495899}
   - component: {fileID: 8087426936968725520}
   - component: {fileID: 114239372808020652}
+  - component: {fileID: 6183343481027254878}
   m_Layer: 10
   m_Name: Point
   m_TagString: Selectable
@@ -127,6 +128,19 @@ MonoBehaviour:
   Selected: {fileID: 2100000, guid: 34a95baef388bb8458c97a626b732f9f, type: 2}
   Hint: {fileID: 2100000, guid: 8621b710d7d1d5041bc6bfd0cc37cdff, type: 2}
   Solution: {fileID: 2100000, guid: 2a003f0807acc1142965bb21bdc824f6, type: 2}
+--- !u!114 &6183343481027254878
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 537518992981541273}
+  m_Enabled: 0
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ac85f04c60d42c147be42fd4d0420c21, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  ServerScriptGObj: {fileID: 0}
 --- !u!1 &942938646191423391
 GameObject:
   m_ObjectHideFlags: 0
diff --git a/Assets/Resources/Prefabs/Facts/Ray.prefab b/Assets/Resources/Prefabs/Facts/Ray.prefab
index fe50c539c2e97ec29223318b0795d3271f0103c4..09f96326bd251866bdbe1011a323be0604a645d1 100644
--- a/Assets/Resources/Prefabs/Facts/Ray.prefab
+++ b/Assets/Resources/Prefabs/Facts/Ray.prefab
@@ -425,7 +425,7 @@ BoxCollider:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 6378548342073962023}
   m_Material: {fileID: 0}
-  m_IsTrigger: 0
+  m_IsTrigger: 1
   m_Enabled: 1
   serializedVersion: 2
   m_Size: {x: 1, y: 1, z: 1}
diff --git a/Assets/Resources/Prefabs/Facts/Ring.prefab b/Assets/Resources/Prefabs/Facts/Ring.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..9d550071c805579389564cd9d8c2fc9ba58a2e66
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Ring.prefab
@@ -0,0 +1,579 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1001283044610252316
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8698932133077106484}
+  - component: {fileID: 154494299464322201}
+  - component: {fileID: 1254072669719294581}
+  - component: {fileID: 5033072517473897711}
+  m_Layer: 14
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8698932133077106484
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2014127074789226423}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 1.5}
+  m_SizeDelta: {x: 2, y: 0.5}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &154494299464322201
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 1
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &1254072669719294581
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Test
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967293
+  m_fontColor: {r: 0.993, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 4
+  m_fontSizeBase: 4
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 0
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_renderer: {fileID: 154494299464322201}
+  m_maskType: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
+--- !u!114 &5033072517473897711
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8cf5a358dacd3b54ab093ee289dd9ba2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Cam: {fileID: 0}
+--- !u!1 &7067472111420977835
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3821173845951859578}
+  - component: {fileID: 6307794999199274257}
+  - component: {fileID: 4181090182545414655}
+  - component: {fileID: 8736718377918556088}
+  - component: {fileID: 3274869260965504490}
+  - component: {fileID: 4622529340520030698}
+  m_Layer: 14
+  m_Name: Mesh
+  m_TagString: SnapZone
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3821173845951859578
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 5121703917865025706}
+  - {fileID: 4775945639457863304}
+  m_Father: {fileID: 2014127074789226423}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &6307794999199274257
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Mesh: {fileID: 0}
+--- !u!23 &4181090182545414655
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &8736718377918556088
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  URI: 
+--- !u!64 &3274869260965504490
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 0
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 0}
+--- !u!95 &4622529340520030698
+Animator:
+  serializedVersion: 3
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Enabled: 1
+  m_Avatar: {fileID: 0}
+  m_Controller: {fileID: 9100000, guid: 7f5a2c4324ecb83488857feb7887b5a7, type: 2}
+  m_CullingMode: 0
+  m_UpdateMode: 0
+  m_ApplyRootMotion: 0
+  m_LinearVelocityBlending: 0
+  m_WarningMessage: 
+  m_HasTransformHierarchy: 1
+  m_AllowConstantClipSamplingOptimization: 1
+  m_KeepAnimatorControllerStateOnDisable: 0
+--- !u!1 &7320042660989930446
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4775945639457863304}
+  - component: {fileID: 2239887596765845809}
+  - component: {fileID: 2358573561192576705}
+  - component: {fileID: 7622934778317457235}
+  - component: {fileID: 7100019936063167720}
+  m_Layer: 14
+  m_Name: LineHighlight
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4775945639457863304
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3821173845951859578}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &2239887596765845809
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Mesh: {fileID: 0}
+--- !u!23 &2358573561192576705
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &7622934778317457235
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a6b9fc46f5bfe6b4eb4adf01e6b65bac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!114 &7100019936063167720
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 35327f6b479454149a20587eb03337f8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  torusRadius: 1
+  ringRadius: 0.026
+  ringSegmentCount: 50
+  segmentSideCount: 30
+  torusMesh: {fileID: 2239887596765845809}
+--- !u!1 &7644263571880024739
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2014127074789226423}
+  - component: {fileID: 2449733549921447938}
+  m_Layer: 14
+  m_Name: Ring
+  m_TagString: Selectable
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2014127074789226423
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7644263571880024739}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3821173845951859578}
+  - {fileID: 8698932133077106484}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2449733549921447938
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7644263571880024739}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 35327f6b479454149a20587eb03337f8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  torusRadius: 1
+  ringRadius: 0.05
+  ringSegmentCount: 50
+  segmentSideCount: 30
+  torusMesh: {fileID: 6307794999199274257}
+--- !u!1 &8117705180640636930
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5121703917865025706}
+  - component: {fileID: 213008266423099231}
+  - component: {fileID: 2162055944849665559}
+  - component: {fileID: 8620085494464208677}
+  m_Layer: 14
+  m_Name: LineInner
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5121703917865025706
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3821173845951859578}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &213008266423099231
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  m_Mesh: {fileID: 0}
+--- !u!23 &2162055944849665559
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: a8a7bf60a30970f469a9c9d3ae2de6ef, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &8620085494464208677
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 35327f6b479454149a20587eb03337f8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  torusRadius: 1
+  ringRadius: 0.025
+  ringSegmentCount: 50
+  segmentSideCount: 30
+  torusMesh: {fileID: 213008266423099231}
diff --git a/Assets/Resources/Prefabs/Facts/Ring.prefab.meta b/Assets/Resources/Prefabs/Facts/Ring.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1b40fa4116a7d339fd3b3bf488a26bdb9c868429
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Ring.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0ed2a320a46601c4bab6c097b0b09add
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab b/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..b95c492474d8201a9b3c96800315a19a161ce9d6
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab
@@ -0,0 +1,400 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1062040214225536323
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1617200358099008032}
+  - component: {fileID: 3243997153339448071}
+  - component: {fileID: 2655091029813954744}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1617200358099008032
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1062040214225536323}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3869010688581027450}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 25.8, y: -5.2}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3243997153339448071
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1062040214225536323}
+  m_CullTransparentMesh: 0
+--- !u!114 &2655091029813954744
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1062040214225536323}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 30
+  m_fontSizeBase: 30
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 24.50824, y: 0, z: 28.978638, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &4902928549420802332
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3869010688581027450}
+  - component: {fileID: 4197087563868549049}
+  - component: {fileID: 2609551024752603468}
+  - component: {fileID: 4177212962186602924}
+  - component: {fileID: 7571158064837864710}
+  - component: {fileID: 5331562473041691776}
+  - component: {fileID: 5437783688132341522}
+  m_Layer: 0
+  m_Name: AngleCircleLine
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3869010688581027450
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1617200358099008032}
+  - {fileID: 1321826948182935295}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4197087563868549049
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_CullTransparentMesh: 1
+--- !u!114 &2609551024752603468
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: e31f435cefe277041b681d289c465224, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &4177212962186602924
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &7571158064837864710
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &5331562473041691776
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &5437783688132341522
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4902928549420802332}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &7854085605173747270
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1321826948182935295}
+  - component: {fileID: 3646602881007070212}
+  - component: {fileID: 4452291738773295751}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1321826948182935295
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7854085605173747270}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -0.4}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3869010688581027450}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -5.6, y: 30.3}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3646602881007070212
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7854085605173747270}
+  m_CullTransparentMesh: 0
+--- !u!114 &4452291738773295751
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7854085605173747270}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 30
+  m_fontSizeBase: 30
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 10.387543, y: 8.45816, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..aeeaf945813d89a5068937ba24c3e0f4b3f611f6
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/AngleCircleLine.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 62cec72d28de59d4c8ae782957cc10a1
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab b/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..807e63f91fe8a7f4b25e50d3f1c4c0dd393c007d
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &697269004072719307
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4555626192197843171}
+  - component: {fileID: 8301363864908542101}
+  - component: {fileID: 2759995560716152988}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4555626192197843171
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 697269004072719307}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 17.8}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 7235558123707866364}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0.2, y: -32.2}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8301363864908542101
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 697269004072719307}
+  m_CullTransparentMesh: 0
+--- !u!114 &2759995560716152988
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 697269004072719307}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 12.983246}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7016901710118546043
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7235558123707866364}
+  - component: {fileID: 7075624231482420700}
+  - component: {fileID: 4086712909713098893}
+  - component: {fileID: 4474082756159207727}
+  - component: {fileID: 6928182635216917115}
+  - component: {fileID: 8310254113192487485}
+  - component: {fileID: 6811931286641226162}
+  m_Layer: 0
+  m_Name: AreaCircle_perfab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7235558123707866364
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 4555626192197843171}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7075624231482420700
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_CullTransparentMesh: 1
+--- !u!114 &4086712909713098893
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: d03f90cb79e6fba4fb25edaf74ffeadd, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &4474082756159207727
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &6928182635216917115
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &8310254113192487485
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &6811931286641226162
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7016901710118546043}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..23f88a20db3c09956885387f736ad9db00bfb1c3
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/AreaCircle_perfab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 210f1e1acf16abf40a39587074c4d25a
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab b/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..a1c024a4d683e1ab20c22465a7397451174ca59c
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &6228575905544016151
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8695166600416321831}
+  - component: {fileID: 1460661521238322908}
+  - component: {fileID: 363367878266426999}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8695166600416321831
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6228575905544016151}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8780569031657450116}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 2, y: -22.5}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1460661521238322908
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6228575905544016151}
+  m_CullTransparentMesh: 1
+--- !u!114 &363367878266426999
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6228575905544016151}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278255884
+  m_fontColor: {r: 0.047169805, g: 0.00244749, b: 0.00244749, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 23.59851, y: 9.75061, z: 19.35138, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &6636443472981757786
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8780569031657450116}
+  - component: {fileID: 6436200217209768079}
+  - component: {fileID: 1894013120851118185}
+  - component: {fileID: 5132214578572184594}
+  - component: {fileID: 3896398116007953758}
+  - component: {fileID: 6482343618895123747}
+  - component: {fileID: 1602337205070616824}
+  m_Layer: 5
+  m_Name: CircleFact
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8780569031657450116
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 8695166600416321831}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 4.4, y: 4.6}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6436200217209768079
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_CullTransparentMesh: 1
+--- !u!114 &1894013120851118185
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 65d7b0853e3ee4845afbb16904fd7e11, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5132214578572184594
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 1894013120851118185}
+--- !u!114 &3896398116007953758
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &6482343618895123747
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &1602337205070616824
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6636443472981757786}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..2e7c977d40d98901c3a74d3df70324c8a9880482
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/CircleFact.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9d08fd45bc83c7c42a9be42f5309c6c2
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab b/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..9ec0e4efc010015a1c41ea8e03f4e02657d0ac1f
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1900852530105271237
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4986007063741953014}
+  - component: {fileID: 8855531360084136872}
+  - component: {fileID: 4325610265215697195}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4986007063741953014
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1900852530105271237}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 17.8}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1359998811365411408}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -4.9, y: -42.4}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8855531360084136872
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1900852530105271237}
+  m_CullTransparentMesh: 0
+--- !u!114 &4325610265215697195
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1900852530105271237}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: AAAAA
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 28
+  m_fontSizeBase: 28
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 2.195282, y: 0, z: -7.272583, w: 14.724426}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &2523593828849809055
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1359998811365411408}
+  - component: {fileID: 7028084461172378176}
+  - component: {fileID: 3047192119255630295}
+  - component: {fileID: 4076526528120032799}
+  - component: {fileID: 4263320076605886561}
+  - component: {fileID: 3829202662460982349}
+  - component: {fileID: 2650353447837694094}
+  m_Layer: 0
+  m_Name: ConeVolume_prefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1359998811365411408
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 4986007063741953014}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7028084461172378176
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_CullTransparentMesh: 1
+--- !u!114 &3047192119255630295
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: f580ba9d4e3825d49a5a7907d2a3f0c1, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &4076526528120032799
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &4263320076605886561
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &3829202662460982349
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &2650353447837694094
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2523593828849809055}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..a7b4a656ae54b879d7cbcb2c42ff515190025b00
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/ConeVolume_prefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 992edeb4264d0fa49b0f9b35b9ab85ce
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab b/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..bf194d69b45ee0a2871b6acb5813535509c05bd2
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3705838077157398664
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3254540930359715604}
+  - component: {fileID: 4683551907175501866}
+  - component: {fileID: 6630856054862537504}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3254540930359715604
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3705838077157398664}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 7509137162853395042}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.66}
+  m_AnchoredPosition: {x: -0.3, y: -38.2}
+  m_SizeDelta: {x: 100, y: 34}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4683551907175501866
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3705838077157398664}
+  m_CullTransparentMesh: 0
+--- !u!114 &6630856054862537504
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3705838077157398664}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: AAAAB
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 25
+  m_fontSizeBase: 25
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5.0387573, y: 9.987152, z: 5.7023926, w: 12.278198}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5287418535931939099
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7509137162853395042}
+  - component: {fileID: 4650902899377139768}
+  - component: {fileID: 8448132399530171869}
+  - component: {fileID: 4549857745383475350}
+  - component: {fileID: -7338472263132780475}
+  - component: {fileID: 7240967210820331247}
+  - component: {fileID: 2130710490396271644}
+  m_Layer: 0
+  m_Name: CylinderVolume
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7509137162853395042
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3254540930359715604}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4650902899377139768
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_CullTransparentMesh: 1
+--- !u!114 &8448132399530171869
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 352d7dd2edb65f542aba25be27d20d98, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &4549857745383475350
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &-7338472263132780475
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &7240967210820331247
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &2130710490396271644
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5287418535931939099}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..717226743f1d784c161bbc401e2961eecb173656
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/CylinderVolume.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 30d09e8685950994893b3b6388a8906c
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..053fe1f2e24bf110865cf3b7b7a9e2b3a1574135
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab
@@ -0,0 +1,400 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &999269623253825707
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3366796833421112245}
+  - component: {fileID: 4263202893165916959}
+  - component: {fileID: 4670384714962435475}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3366796833421112245
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999269623253825707}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2057578581648752616}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -1.2, y: -33.4}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4263202893165916959
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999269623253825707}
+  m_CullTransparentMesh: 0
+--- !u!114 &4670384714962435475
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 999269623253825707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 6.2644043, y: 0, z: 3.7074585, w: 10.496887}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &2206246547044702491
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1916022202853548340}
+  - component: {fileID: 5865187638587084515}
+  - component: {fileID: 2948658129975585178}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1916022202853548340
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2206246547044702491}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2057578581648752616}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.66}
+  m_AnchoredPosition: {x: 0.6, y: 19.6}
+  m_SizeDelta: {x: 100, y: 34}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5865187638587084515
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2206246547044702491}
+  m_CullTransparentMesh: 0
+--- !u!114 &2948658129975585178
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2206246547044702491}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5.0387573, y: 9.987152, z: 5.7023926, w: 12.278198}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7523305359074541435
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2057578581648752616}
+  - component: {fileID: 7719973282818826063}
+  - component: {fileID: 2180110340788369784}
+  - component: {fileID: 1285080900581311433}
+  - component: {fileID: 6805943141472748426}
+  - component: {fileID: 3549802384644774303}
+  - component: {fileID: 4430445033801091530}
+  m_Layer: 0
+  m_Name: EqualCirclesPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2057578581648752616
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1916022202853548340}
+  - {fileID: 3366796833421112245}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7719973282818826063
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_CullTransparentMesh: 1
+--- !u!114 &2180110340788369784
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: ad920a8c90fd4c74ba95809d3e14e6b7, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &1285080900581311433
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &6805943141472748426
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &3549802384644774303
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &4430445033801091530
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7523305359074541435}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..5a6cc969820ae322dace2d96e95eb54941bfcf58
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/EqualCirclesPrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5f461930be2eb074193dc12eb60e10b2
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab b/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..7eadc8e56a03027f296920261db1134e5f73075b
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab
@@ -0,0 +1,266 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2115817999818309900
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8464853153116416756}
+  - component: {fileID: 6773971219611625873}
+  - component: {fileID: 2122753052771730408}
+  - component: {fileID: 639140626255626101}
+  - component: {fileID: 6441113378387087702}
+  - component: {fileID: -8964638906401905625}
+  - component: {fileID: 9073127243885313005}
+  m_Layer: 5
+  m_Name: OnCirclePreFab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8464853153116416756
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 7483112472360205916}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6773971219611625873
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_CullTransparentMesh: 1
+--- !u!114 &2122753052771730408
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 7482667652216324306, guid: 6c88ce550ca6bd043a12bf7604475ded,
+    type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &639140626255626101
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &6441113378387087702
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &-8964638906401905625
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &9073127243885313005
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2115817999818309900}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &5265014618439724607
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7483112472360205916}
+  - component: {fileID: 2620712827728531809}
+  - component: {fileID: 7373443337760040373}
+  m_Layer: 5
+  m_Name: circle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7483112472360205916
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5265014618439724607}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -0.1}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8464853153116416756}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -28, y: -26.7}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2620712827728531809
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5265014618439724607}
+  m_CullTransparentMesh: 1
+--- !u!114 &7373443337760040373
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5265014618439724607}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 2e498d1c8094910479dc3e1b768306a4, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 2e498d1c8094910479dc3e1b768306a4, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4280295456
+  m_fontColor: {r: 0.1254902, g: 0.1254902, b: 0.1254902, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 28
+  m_fontSizeBase: 28
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 31.891449, y: 8.577667, z: -24.34491, w: 8.552277}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c1a9e1146939a72a3f1871be40b3c07bcf90334f
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/OnCirclePreFab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: df93bd4d977e4ab42a626f7bd06596d6
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..1c49b3ea90ae025a96fb8325e1ec12f3fcfebc5d
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab
@@ -0,0 +1,400 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4084476391434520799
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5933166921333861473}
+  - component: {fileID: 8980010830454435193}
+  - component: {fileID: 5217577174673142595}
+  m_Layer: 5
+  m_Name: circle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5933166921333861473
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4084476391434520799}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 313608976654385155}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -26.42, y: -27.53}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8980010830454435193
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4084476391434520799}
+  m_CullTransparentMesh: 1
+--- !u!114 &5217577174673142595
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4084476391434520799}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 2e498d1c8094910479dc3e1b768306a4, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 2e498d1c8094910479dc3e1b768306a4, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 25
+  m_fontSizeBase: 25
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 36.103638, y: 6.4127502, z: 17.970886, w: 10.720169}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7129171914078018932
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7894779467777820317}
+  - component: {fileID: 7044533986850300775}
+  - component: {fileID: 8384968683200090543}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7894779467777820317
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7129171914078018932}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 2.1}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 313608976654385155}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 45.8, y: -37}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7044533986850300775
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7129171914078018932}
+  m_CullTransparentMesh: 0
+--- !u!114 &8384968683200090543
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7129171914078018932}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 25
+  m_fontSizeBase: 25
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 4
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 1.8765259, y: -2.8108215, z: 54.22931, w: 17.942413}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &8554350198830106250
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 313608976654385155}
+  - component: {fileID: 7453695026461963725}
+  - component: {fileID: 3070659305120604608}
+  - component: {fileID: 7705752672375263960}
+  - component: {fileID: 8593937097866258120}
+  - component: {fileID: 8996773866579933820}
+  - component: {fileID: 930378118197085978}
+  m_Layer: 0
+  m_Name: OrthogonalCircleAnglePrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &313608976654385155
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 5933166921333861473}
+  - {fileID: 7894779467777820317}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7453695026461963725
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_CullTransparentMesh: 1
+--- !u!114 &3070659305120604608
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 66ba1c16426bcaf49baab37f47c67b47, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &7705752672375263960
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &8593937097866258120
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &8996773866579933820
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &930378118197085978
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8554350198830106250}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..747b264f86cdd1c997efaed56ddbb41cc379de47
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/OrthogonalCircleAnglePrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9ce7444f588cd054989126eaff75c5f3
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..8b9fe1f0e8d0ea58b7f98af0700015d3e45e54dc
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab
@@ -0,0 +1,400 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1684854595504432256
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3165017659102780400}
+  - component: {fileID: 2819967087338812576}
+  - component: {fileID: 5696377050731032053}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3165017659102780400
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1684854595504432256}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8643015897288315615}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 30}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2819967087338812576
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1684854595504432256}
+  m_CullTransparentMesh: 0
+--- !u!114 &5696377050731032053
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1684854595504432256}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7510387096843212865
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8643015897288315615}
+  - component: {fileID: 4856785638153472691}
+  - component: {fileID: 6811289727063397518}
+  - component: {fileID: 6586968856821406842}
+  - component: {fileID: 3914868910838030883}
+  - component: {fileID: 4479822174921760807}
+  - component: {fileID: 7215917396402112958}
+  m_Layer: 5
+  m_Name: ParallelLinePrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8643015897288315615
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3165017659102780400}
+  - {fileID: 3726921479501637083}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4856785638153472691
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_CullTransparentMesh: 0
+--- !u!114 &6811289727063397518
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: bd545eec2c7bdde42957def5c75b4de8, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &6586968856821406842
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 6811289727063397518}
+--- !u!114 &3914868910838030883
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &4479822174921760807
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &7215917396402112958
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7510387096843212865}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &7693994637337906468
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3726921479501637083}
+  - component: {fileID: 3824985147331139666}
+  - component: {fileID: 2874878903173316411}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3726921479501637083
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7693994637337906468}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 8643015897288315615}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: -30}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3824985147331139666
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7693994637337906468}
+  m_CullTransparentMesh: 0
+--- !u!114 &2874878903173316411
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7693994637337906468}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c5dcf14f4a1cf568854d569e6c96d8c8c71badca
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/ParallelLinePrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9f086cfbfeb0dfd46af67395aa17aafa
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..3e64a454c956f94d834121f880cc94beaf2a7b11
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2513701074329712390
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5635985299619511840}
+  - component: {fileID: 9014721336959090042}
+  - component: {fileID: 6545787433352254111}
+  - component: {fileID: 7450556920702625537}
+  - component: {fileID: 173279308733449335}
+  - component: {fileID: 6544775749910269078}
+  - component: {fileID: 3955180868949107883}
+  m_Layer: 0
+  m_Name: RadiusPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5635985299619511840
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 7905377173249376416}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &9014721336959090042
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_CullTransparentMesh: 1
+--- !u!114 &6545787433352254111
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: b85e914ced337ad4bbc40ad74c37da14, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &7450556920702625537
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &173279308733449335
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &6544775749910269078
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &3955180868949107883
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2513701074329712390}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &8185219527703794732
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7905377173249376416}
+  - component: {fileID: 6861039344835354704}
+  - component: {fileID: 811399006990138641}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7905377173249376416
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8185219527703794732}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 8.6}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 5635985299619511840}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.47000003}
+  m_AnchorMax: {x: 0.5, y: 0.47000003}
+  m_AnchoredPosition: {x: 4.1, y: -30.5}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6861039344835354704
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8185219527703794732}
+  m_CullTransparentMesh: 0
+--- !u!114 &811399006990138641
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8185219527703794732}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 34
+  m_fontSizeBase: 34
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 10.375732, w: 11.709564}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..ca8943c0612d519be5304fd949e9c06be14998cd
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RadiusPrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5b54aca5b2f2bfa48968656ed3bea181
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..ea9b3af77454a62dadd7e6c43ddf7101cb2613d8
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab
@@ -0,0 +1,670 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1335140282060877905
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4437548300139704302}
+  - component: {fileID: 6854488822927795657}
+  - component: {fileID: 1785697637619353122}
+  m_Layer: 5
+  m_Name: pointB
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4437548300139704302
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1335140282060877905}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2351056462585403637}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 4.9, y: -29.7}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6854488822927795657
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1335140282060877905}
+  m_CullTransparentMesh: 0
+--- !u!114 &1785697637619353122
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1335140282060877905}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &4752193981666013658
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6853670326260023163}
+  - component: {fileID: 3174875115698218274}
+  - component: {fileID: 236017584527233354}
+  m_Layer: 5
+  m_Name: pointA
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6853670326260023163
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4752193981666013658}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2351056462585403637}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 29.1, y: -29.5}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3174875115698218274
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4752193981666013658}
+  m_CullTransparentMesh: 0
+--- !u!114 &236017584527233354
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4752193981666013658}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &6409746124577929724
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1606008956936540319}
+  - component: {fileID: 8001121185252052439}
+  - component: {fileID: 6402563570144907913}
+  m_Layer: 5
+  m_Name: pointD
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1606008956936540319
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6409746124577929724}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2351056462585403637}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -34.9, y: -29.5}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8001121185252052439
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6409746124577929724}
+  m_CullTransparentMesh: 0
+--- !u!114 &6402563570144907913
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6409746124577929724}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7529334057180175337
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5911247904431387585}
+  - component: {fileID: 7355970363717505514}
+  - component: {fileID: 7959791220384863301}
+  m_Layer: 5
+  m_Name: pointC
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5911247904431387585
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7529334057180175337}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 2351056462585403637}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -12.1, y: -29.8}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7355970363717505514
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7529334057180175337}
+  m_CullTransparentMesh: 0
+--- !u!114 &7959791220384863301
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7529334057180175337}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &8156936215466465834
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2351056462585403637}
+  - component: {fileID: 7822135884913080422}
+  - component: {fileID: 3266031038391391049}
+  - component: {fileID: 7956205528156386179}
+  - component: {fileID: 2163234623969663275}
+  - component: {fileID: 8026609014010234375}
+  - component: {fileID: 4558040300745642744}
+  m_Layer: 5
+  m_Name: RectangleFactPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2351056462585403637
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 6853670326260023163}
+  - {fileID: 4437548300139704302}
+  - {fileID: 5911247904431387585}
+  - {fileID: 1606008956936540319}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7822135884913080422
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_CullTransparentMesh: 1
+--- !u!114 &3266031038391391049
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: f4c84b8f318e3cb469eb72c734ccbf39, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &7956205528156386179
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &2163234623969663275
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &8026609014010234375
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &4558040300745642744
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8156936215466465834}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1bb49e3f92ac59ccc140f59196ca8de4342b1f5e
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RectangleFactPrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b6f35afcaff5d8a40bf8f792eb3299e6
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..dd99580a47cab66ec6e90e4d122d2f4e008e04b3
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab
@@ -0,0 +1,535 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &921520135362224320
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2051347607227540852}
+  - component: {fileID: 8935779083928885339}
+  - component: {fileID: 786183127531855823}
+  m_Layer: 5
+  m_Name: point (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2051347607227540852
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 921520135362224320}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3558427588790173337}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 15.7, y: -28.6}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8935779083928885339
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 921520135362224320}
+  m_CullTransparentMesh: 0
+--- !u!114 &786183127531855823
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 921520135362224320}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 40.342957, y: 0, z: 32.524048, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &3080888058940174091
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3558427588790173337}
+  - component: {fileID: 661520793940439990}
+  - component: {fileID: 5767345106027831726}
+  - component: {fileID: 5822687220706391381}
+  - component: {fileID: 3794236076833855767}
+  - component: {fileID: 8245241791380942728}
+  - component: {fileID: 8661743446683420805}
+  m_Layer: 0
+  m_Name: RightAnglePrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3558427588790173337
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 8820573273228334392}
+  - {fileID: 6929334133930288485}
+  - {fileID: 2051347607227540852}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &661520793940439990
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_CullTransparentMesh: 1
+--- !u!114 &5767345106027831726
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 2f972a9b017f79a43a7e95eeddebd66b, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5822687220706391381
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &3794236076833855767
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &8245241791380942728
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &8661743446683420805
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3080888058940174091}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &7613847065484003782
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8820573273228334392}
+  - component: {fileID: 4437790263001420278}
+  - component: {fileID: 7526375183334386681}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8820573273228334392
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7613847065484003782}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0.3}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3558427588790173337}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -27.2, y: 30.2}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4437790263001420278
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7613847065484003782}
+  m_CullTransparentMesh: 0
+--- !u!114 &7526375183334386681
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7613847065484003782}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 20.395447, y: 0, z: 29.55957, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7831850345969621479
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6929334133930288485}
+  - component: {fileID: 1200829040008779125}
+  - component: {fileID: 7111589452609809811}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6929334133930288485
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7831850345969621479}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3558427588790173337}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -28.6, y: -25.1}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1200829040008779125
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7831850345969621479}
+  m_CullTransparentMesh: 0
+--- !u!114 &7111589452609809811
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7831850345969621479}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 27.442444, y: 7.325897, z: 29.48285, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..116797872f5accd95b63ec1c7e58eb6a7bc62ece
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/RightAnglePrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 389563c758e86d848b3341576b90b7e4
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/ScrollDisplay.prefab b/Assets/Resources/Prefabs/UI/Icons/ScrollDisplay.prefab
index 53e43ab695bb9981b04154e251ea63a8bc6b98f6..d83591a380658b6e74a310645ebd4db4d5c722cf 100644
--- a/Assets/Resources/Prefabs/UI/Icons/ScrollDisplay.prefab
+++ b/Assets/Resources/Prefabs/UI/Icons/ScrollDisplay.prefab
@@ -12,7 +12,6 @@ GameObject:
   - component: {fileID: 3213819025273557502}
   - component: {fileID: 2305338954152611092}
   - component: {fileID: 114452647229146242}
-  - component: {fileID: 114809707957640338}
   m_Layer: 5
   m_Name: ScrollDisplay
   m_TagString: Untagged
@@ -57,12 +56,14 @@ MonoBehaviour:
   m_GameObject: {fileID: 3173330253721512196}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 1, g: 1, b: 1, a: 1}
   m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
@@ -75,6 +76,7 @@ MonoBehaviour:
   m_FillClockwise: 1
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
 --- !u!114 &114452647229146242
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -87,53 +89,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 67d16c96068129c4c8631966f2166bd8, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  scroll:
-    problemTheory: 
-    solutionTheory: 
-    label: 
-    description: 
-    declarations: []
   DetailScreen: {fileID: 0}
---- !u!114 &114809707957640338
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 3173330253721512196}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: -1862395651, guid: f70555f144d8491a825f0804e09c671c, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Delegates:
-  - eventID: 4
-    callback:
-      m_PersistentCalls:
-        m_Calls:
-        - m_Target: {fileID: 114452647229146242}
-          m_MethodName: onClick
-          m_Mode: 1
-          m_Arguments:
-            m_ObjectArgument: {fileID: 0}
-            m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
-            m_IntArgument: 0
-            m_FloatArgument: 0
-            m_StringArgument: 
-            m_BoolArgument: 0
-          m_CallState: 2
-        - m_Target: {fileID: 0}
-          m_MethodName: 
-          m_Mode: 1
-          m_Arguments:
-            m_ObjectArgument: {fileID: 0}
-            m_ObjectArgumentAssemblyTypeName: 
-            m_IntArgument: 0
-            m_FloatArgument: 0
-            m_StringArgument: 
-            m_BoolArgument: 0
-          m_CallState: 2
-  delegates: []
 --- !u!1 &5809183911047187526
 GameObject:
   m_ObjectHideFlags: 0
@@ -194,6 +150,8 @@ MonoBehaviour:
   m_Material: {fileID: 0}
   m_Color: {r: 1, g: 1, b: 1, a: 1}
   m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
@@ -218,13 +176,12 @@ MonoBehaviour:
   m_fontColorGradientPreset: {fileID: 0}
   m_spriteAsset: {fileID: 0}
   m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
   m_overrideHtmlColors: 0
   m_faceColor:
     serializedVersion: 2
     rgba: 4294967295
-  m_outlineColor:
-    serializedVersion: 2
-    rgba: 4278190080
   m_fontSize: 41.05
   m_fontSizeBase: 36
   m_fontWeight: 400
@@ -232,7 +189,9 @@ MonoBehaviour:
   m_fontSizeMin: 18
   m_fontSizeMax: 72
   m_fontStyle: 0
-  m_textAlignment: 514
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
   m_characterSpacing: 0
   m_wordSpacing: 0
   m_lineSpacing: 0
@@ -242,10 +201,8 @@ MonoBehaviour:
   m_enableWordWrapping: 1
   m_wordWrappingRatios: 0.4
   m_overflowMode: 0
-  m_firstOverflowCharacterIndex: -1
   m_linkedTextComponent: {fileID: 0}
-  m_isLinkedTextComponent: 0
-  m_isTextTruncated: 0
+  parentLinkedComponent: {fileID: 0}
   m_enableKerning: 1
   m_enableExtraPadding: 0
   checkPaddingRequired: 0
@@ -253,39 +210,17 @@ MonoBehaviour:
   m_parseCtrlCharacters: 1
   m_isOrthographic: 1
   m_isCullingEnabled: 0
-  m_ignoreRectMaskCulling: 0
-  m_ignoreCulling: 1
   m_horizontalMapping: 0
   m_verticalMapping: 0
   m_uvLineOffset: 0
   m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
   m_VertexBufferAutoSizeReduction: 1
-  m_firstVisibleCharacter: 0
   m_useMaxVisibleDescender: 1
   m_pageToDisplay: 1
   m_margin: {x: 3.2196655, y: 3.2196655, z: 3.6221313, w: 3.6221313}
-  m_textInfo:
-    textComponent: {fileID: 5867570113647991285}
-    characterCount: 8
-    spriteCount: 0
-    spaceCount: 1
-    wordCount: 2
-    linkCount: 0
-    lineCount: 2
-    pageCount: 1
-    materialCount: 1
   m_isUsingLegacyAnimationComponent: 0
   m_isVolumetricText: 0
-  m_spriteAnimator: {fileID: 0}
   m_hasFontAssetChanged: 0
-  m_subTextObjects:
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
-  - {fileID: 0}
   m_baseMaterial: {fileID: 0}
   m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..3a43cec84139fba4bf648e2e8060af2170ba2246
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab
@@ -0,0 +1,130 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2846439484187545958
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6755804354927699367}
+  - component: {fileID: 3779590155575851460}
+  - component: {fileID: 5078315713010028456}
+  - component: {fileID: 2785454548719711828}
+  - component: {fileID: 156028697059819196}
+  - component: {fileID: 1224931104090066081}
+  - component: {fileID: -5313503588223420466}
+  m_Layer: 0
+  m_Name: TestFactPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6755804354927699367
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3779590155575851460
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_CullTransparentMesh: 1
+--- !u!114 &5078315713010028456
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: e706f1d2fb068e342b1c80c357d84b40, type: 3}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &2785454548719711828
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &156028697059819196
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &1224931104090066081
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!114 &-5313503588223420466
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2846439484187545958}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..cf49f39988829d99fa80692e11f23dca2e5ea7b8
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/TestFactPrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5dc76e187eae4214697491bfb42773e8
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..e8d5b381b9578cdec396da23f1770554a8061ada
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab
@@ -0,0 +1,265 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4123133807278660472
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4304353889690954113}
+  - component: {fileID: 1286697532791835095}
+  - component: {fileID: 2999154800373574638}
+  - component: {fileID: 5477813449890952819}
+  - component: {fileID: 6431159876548220859}
+  - component: {fileID: 5268227492380838391}
+  - component: {fileID: 4468595272332714251}
+  m_Layer: 0
+  m_Name: TruncatedConeVolumePrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4304353889690954113
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 7937755305675264209}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1286697532791835095
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_CullTransparentMesh: 1
+--- !u!114 &2999154800373574638
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: fde0a14086151274a9d464a3d51c5e0f, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &5477813449890952819
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &6431159876548220859
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &5268227492380838391
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &4468595272332714251
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4123133807278660472}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &6234169056530260467
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7937755305675264209}
+  - component: {fileID: 860698918242124271}
+  - component: {fileID: 789128519229516834}
+  m_Layer: 5
+  m_Name: circle1
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7937755305675264209
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6234169056530260467}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 16.5}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 4304353889690954113}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -5.3, y: -47.5}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &860698918242124271
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6234169056530260467}
+  m_CullTransparentMesh: 0
+--- !u!114 &789128519229516834
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6234169056530260467}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: AAAAA
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 28
+  m_fontSizeBase: 28
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 3.288086, y: -4.9126587, z: -6.52417, w: 17.942413}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..918ff76fae7e5ed46d8f121d5fbee8171641f562
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/TruncatedConeVolumePrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 9d0019fa4b5725a49bdfc78c4d67661e
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab b/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..99761cdd546673a6f5774bb5c31faf6a91c793f2
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab
@@ -0,0 +1,400 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3217755535904919554
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6656328133969465038}
+  - component: {fileID: 6852736761944882406}
+  - component: {fileID: 5654613262439864818}
+  m_Layer: 5
+  m_Name: point
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6656328133969465038
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3217755535904919554}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1329885387404967602}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -1.2000732, y: -33.399963}
+  m_SizeDelta: {x: 100, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6852736761944882406
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3217755535904919554}
+  m_CullTransparentMesh: 0
+--- !u!114 &5654613262439864818
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3217755535904919554}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 6.2644043, y: 0, z: 3.7074585, w: 10.496887}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5769925203401971992
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1329885387404967602}
+  - component: {fileID: 8848431339215720241}
+  - component: {fileID: 7403282225673375912}
+  - component: {fileID: 3225367128346546047}
+  - component: {fileID: 4056140006323214235}
+  - component: {fileID: 8957209247582476496}
+  - component: {fileID: -6417425987847613228}
+  m_Layer: 0
+  m_Name: UnequalCirclesPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1329885387404967602
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 5090358772929881988}
+  - {fileID: 6656328133969465038}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8848431339215720241
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_CullTransparentMesh: 1
+--- !u!114 &7403282225673375912
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 269651011d5ec79458964edbef59ae70, type: 3}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &3225367128346546047
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 77b75bbb0b640664db62cf8acb69994e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  imageToChange: {fileID: 0}
+--- !u!114 &4056140006323214235
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a091cb23127eb7347955cb7f747af431, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!225 &8957209247582476496
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
+--- !u!114 &-6417425987847613228
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5769925203401971992}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ed0bcd3d8d9996d4f86c0a2b8b71c6bf, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &5984757243279669606
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5090358772929881988}
+  - component: {fileID: 2730122920114417607}
+  - component: {fileID: 6694126399850149665}
+  m_Layer: 5
+  m_Name: point (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5090358772929881988
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5984757243279669606}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1329885387404967602}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.66}
+  m_AnchoredPosition: {x: 0.5999756, y: 19.600037}
+  m_SizeDelta: {x: 100, y: 34}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2730122920114417607
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5984757243279669606}
+  m_CullTransparentMesh: 0
+--- !u!114 &6694126399850149665
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5984757243279669606}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: A
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4278190080
+  m_fontColor: {r: 0, g: 0, b: 0, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 5.0387573, y: 9.987152, z: 5.7023926, w: 12.278198}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
diff --git a/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab.meta b/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..9b97b2f143e0cfd346271761641b5330421f5320
--- /dev/null
+++ b/Assets/Resources/Prefabs/UI/Icons/UnequalCirclesPrefab.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 047cd3a517f781846a1f983394b4bb7b
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
index 0e3326a1017336ac3007af4bf09fb69371ad8f48..7bbdd7cfdc760ec24c12d39a0d5739dd8c2284b6 100644
--- a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
+++ b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
@@ -7,7 +7,9 @@
 
 public static class CommunicationEvents
 {
-    public static UnityEvent<RaycastHit> TriggerEvent = new();
+    public static UnityEvent<RaycastHit[]> TriggerEvent = new();
+    //TODO check if this needs further adjustments
+  //  public class HitEvent : UnityEvent<RaycastHit[]> { }
 
     public static UnityEvent<int> ToolModeChangedEvent = new();
     public static UnityEvent<Fact> AddFactEvent = new();
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
index 347c8c6c269303f143551ba2776ce48497590e9a..44382138309730b4e673b608ccf25b5341f35f3a 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
@@ -11,15 +11,79 @@
 public class ParsingDictionary {
     //TODO? get rid of this, use reflection? instead, if possible
     //TODO: docu
+
+    //public static Dictionary<string, Func<Scroll.ScrollFact, Fact>> parseFactDictionary = new Dictionary<string, Func<Scroll.ScrollFact, Fact>>() {
     public static Dictionary<string, Func<Scroll.ScrollFact, Fact>> parseFactDictionary = new() {
-        { JSONManager.MMTURIs.Point, PointFact.parseFact},
-        { JSONManager.MMTURIs.Metric, LineFact.parseFact},
-        { JSONManager.MMTURIs.Angle, AngleFact.parseFact},
-        { JSONManager.MMTURIs.LineType, RayFact.parseFact},
-        { JSONManager.MMTURIs.OnLine, OnLineFact.parseFact},
+        {JSONManager.MMTURIs.Point, PointFact.parseFact},
+        {JSONManager.MMTURIs.Metric, LineFact.parseFact},
+        {JSONManager.MMTURIs.Angle, AngleFact.parseFact},
+        {JSONManager.MMTURIs.LineType, RayFact.parseFact},
+        {JSONManager.MMTURIs.LineOf, RayFact.parseFact},
+
+        {JSONManager.MMTURIs.OnLine, OnLineFact.parseFact},
         //90Degree-Angle
-        { JSONManager.MMTURIs.Eq, AngleFact.parseFact}
+        {JSONManager.MMTURIs.Eq, AngleFact.parseFact},
+        //Parallel-LineFact
+        {JSONManager.MMTURIs.ParallelLine, ParallelLineFact.parseFact},
+        //CircleFact
+        {JSONManager.MMTURIs.CircleType3d, CircleFact.parseFact},
+        {JSONManager.MMTURIs.OnCircle, OnCircleFact.parseFact },
+        {JSONManager.MMTURIs.AnglePlaneLine, AngleCircleLineFact.parseFact },
+        {JSONManager.MMTURIs.RadiusCircleMetric, RadiusFact.parseFact },
+        {JSONManager.MMTURIs.AreaCircle, AreaCircleFact.parseFact },
+        {JSONManager.MMTURIs.OrthoCircleLine, OrthogonalCircleLineFact.parseFact },
+        {JSONManager.MMTURIs.VolumeCone ,ConeVolumeFact.parseFact  },
+        {JSONManager.MMTURIs.TruncatedVolumeCone ,TruncatedConeVolumeFact.parseFact  },
+        {JSONManager.MMTURIs.RightAngle, RightAngleFact.parseFact },
+        {JSONManager.MMTURIs.CylinderVolume, CylinderVolumeFact.parseFact },
+        {JSONManager.MMTURIs.TestType, TestFact.parseFact },
+        {JSONManager.MMTURIs.EqualityCircles, EqualCirclesFact.parseFact },
+        {JSONManager.MMTURIs.UnEqualityCircles, UnEqualCirclesFact.parseFact }
+
+
+
+
     };
+    /// Current solution to retrieve the fact ID from 
+    
+    public static string MMTermToString (MMTTerm term){
+        if(term == null)
+            return null;
+        // case for OMA 
+        if( term is OMA){
+            OMA term_casted = (OMA) term;
+            string applicant = ((OMS)term_casted.applicant).uri;
+            string argument = "";
+            for (int i = 0; i < term_casted.arguments.Count; i++) {
+                argument = argument+ " " + MMTermToString(term_casted.arguments[i]);
+            }
+            return " " + applicant + " "+ argument;
+
+        }
+        // case for OMS 
+        if (term is OMS)
+        {
+            OMS term_casted = (OMS)term;  
+            return term_casted.uri;
+
+        }
+
+        // case for OMF
+        if (term is OMF) {
+            OMF term_casted = (OMF)term;
+            return term_casted.f.ToString();
+
+        }
+        
+
+
+        return "couldn't understand the type";
+
+
+    }
+
+    public static Dictionary<string, string> parseTermsToId = new Dictionary<string, string>();
+
 
 }
 
@@ -89,6 +153,23 @@ public static bool sendAdd(string path, string body, out string uri)
 [JsonSubtypes.KnownSubType(typeof(RayFact), "RayFact")]
 [JsonSubtypes.KnownSubType(typeof(OnLineFact), "OnLineFact")]
 [JsonSubtypes.KnownSubType(typeof(AngleFact), "AngleFact")]
+[JsonSubtypes.KnownSubType(typeof(CircleFact), "CircleFact")]
+[JsonSubtypes.KnownSubType(typeof(ParallelLineFact), "ParallelLine")]
+[JsonSubtypes.KnownSubType(typeof(OnCircleFact), "OnCircleFact")]
+[JsonSubtypes.KnownSubType(typeof(AngleCircleLineFact), "AnglePlaneLineFact")]
+[JsonSubtypes.KnownSubType(typeof(AreaCircleFact), "AreaCircle")]
+[JsonSubtypes.KnownSubType(typeof(RadiusFact), "RadiusCircleMetric")]
+[JsonSubtypes.KnownSubType(typeof(OrthogonalCircleLineFact), "OrthogonalCircleLineFact")]
+[JsonSubtypes.KnownSubType(typeof(ConeVolumeFact), "ConeVolumeFact")]
+[JsonSubtypes.KnownSubType(typeof(TruncatedConeVolumeFact), "TruncatedConeVolumeFact")]
+[JsonSubtypes.KnownSubType(typeof(RightAngleFact), "RightAngleFact")]
+[JsonSubtypes.KnownSubType(typeof(CylinderVolumeFact), "CylinderVolumeFact")]
+[JsonSubtypes.KnownSubType(typeof(TestFact), "TestFact")]
+[JsonSubtypes.KnownSubType(typeof(EqualCirclesFact), "EqualCirclesFact")]
+[JsonSubtypes.KnownSubType(typeof(UnEqualCirclesFact), "UnEqualCirclesFact")]
+
+
+
 public abstract class Fact
 {
     /// <summary>
@@ -545,8 +626,13 @@ private void init(Vector3 P, Vector3 N)
         MMTTerm tp = new OMS(JSONManager.MMTURIs.Point);
         MMTTerm df = new OMA(new OMS(JSONManager.MMTURIs.Tuple), arguments);
 
+
         MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
+        string parse_id = ParsingDictionary.MMTermToString(df);
+        ParsingDictionary.parseTermsToId[parse_id] = this._URI;
+
+
     }
 
     /// <summary>
@@ -570,16 +656,25 @@ public PointFact(float a, float b, float c, string uri, FactOrganizer organizer)
     public new static PointFact parseFact(Scroll.ScrollFact fact) {
         String uri = fact.@ref.uri;
         OMA df = (OMA)((Scroll.ScrollSymbolFact)fact).df;
-        if (df != null)
-        {
-            float a = (float)((OMF)df.arguments[0]).f;
-            float b = (float)((OMF)df.arguments[1]).f;
-            float c = (float)((OMF)df.arguments[2]).f;
-            return new PointFact(a, b, c, uri, StageStatic.stage.factState);
-        }
-        else {
+
+
+
+        if (df == null)
             return null;
-        }
+
+       
+        float a = (float)((OMF)df.arguments[0]).f;
+        float b = (float)((OMF)df.arguments[1]).f;
+        float c = (float)((OMF)df.arguments[2]).f;
+
+        string parse_id = ParsingDictionary.MMTermToString(df);
+     
+        if(!ParsingDictionary.parseTermsToId.ContainsKey(parse_id))
+                ParsingDictionary.parseTermsToId[parse_id] = uri;
+
+
+         return new PointFact(a, b, c, uri, StageStatic.stage.factState);
+        
     }
 
     /// \copydoc Fact.hasDependentFacts
@@ -612,6 +707,7 @@ protected override bool EquivalentWrapped(PointFact f1, PointFact f2)
         return Math3d.IsApproximatelyEqual(f1.Point, f2.Point);
     }
 
+
 }
 
 /// <summary>
@@ -795,30 +891,40 @@ private void init(string pid1, string pid2)
 
         MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
+        string parse_id = ParsingDictionary.MMTermToString(df);
+        ParsingDictionary.parseTermsToId[parse_id] = this._URI;
+
+
     }
 
     /// \copydoc Fact.parseFact(Scroll.ScrollFact)
     public new static RayFact parseFact(Scroll.ScrollFact fact)
     {
         string uri = fact.@ref.uri;
-        if ((OMA)((Scroll.ScrollSymbolFact)fact).df != null)
-        {
-            string pointAUri = ((OMS)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[0]).uri;
-            string pointBUri = ((OMS)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[1]).uri;
 
-            if (StageStatic.stage.factState.ContainsKey(pointAUri)
+
+      
+        if ((OMA)((Scroll.ScrollSymbolFact)fact).df == null)
+            return null;
+       
+        string pointAUri = ((OMS)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[0]).uri;
+        string pointBUri = ((OMS)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[1]).uri;
+
+         if (StageStatic.stage.factState.ContainsKey(pointAUri)
              && StageStatic.stage.factState.ContainsKey(pointBUri))
-                return new RayFact(pointAUri, pointBUri, uri, StageStatic.stage.factState);
+             return new RayFact(pointAUri, pointBUri, uri, StageStatic.stage.factState);
 
-            //If dependent facts do not exist return null
-        }
+       //If dependent facts do not exist return null
+        
         return null;
     }
 
     /// \copydoc Fact.generateLabel
     protected override string generateLabel()
     {
-        return "]" + _Facts[Pid1].Label + _Facts[Pid2].Label + "[";
+        // TODO this string is too large to properly depict on scrolls. 
+       // return "]" + _Facts[Pid1].Label + _Facts[Pid2].Label + "[";
+        return  _Facts[Pid1].Label + _Facts[Pid2].Label ;
     }
 
     /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
@@ -941,9 +1047,23 @@ public OnLineFact(string pid, string rid, string uri, FactOrganizer organizer) :
     public new static OnLineFact parseFact(Scroll.ScrollFact fact)
     {
         string uri = fact.@ref.uri;
-        string lineUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
-        string pointUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
 
+        string lineUri = "";
+        string pointUri = "";
+        
+        if (((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0] is OMS)
+        {
+            // standard case
+            lineUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+            pointUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+        }
+        else {
+            // case when line Uri has a projl on the line Argument 
+            lineUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).arguments[0]).uri;
+            pointUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+
+
+        }
         if (StageStatic.stage.factState.ContainsKey(pointUri)
          && StageStatic.stage.factState.ContainsKey(lineUri))
             return new OnLineFact(pointUri, lineUri, uri, StageStatic.stage.factState);
@@ -1075,10 +1195,8 @@ private void init(string pid1, string pid2, string pid3)
         string p1URI = pf1.Id;
         string p2URI = pf2.Id;
         string p3URI = pf3.Id;
-        if (is_right_angle)
-            mmtDecl = generate90DegreeAngleDeclaration(v, p1URI, p2URI, p3URI);
-        else
-            mmtDecl = generateNot90DegreeAngleDeclaration(v, p1URI, p2URI, p3URI);
+
+        mmtDecl = generateNot90DegreeAngleDeclaration(v, p1URI, p2URI, p3URI);
 
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -1097,12 +1215,23 @@ public AngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactO
         this.Pid2 = Pid2;
         this.Pid3 = Pid3;
 
-        GetAngle();
+        float v = GetAngle();
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    public AngleFact(string Pid1, string Pid2, string Pid3,float angle, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Pid1 = Pid1;
+        this.Pid2 = Pid2;
+        this.Pid3 = Pid3;
 
         this._URI = backendURI;
         _ = this.Label;
     }
 
+
+
     /// \copydoc Fact.parseFact(Scroll.ScrollFact)
     public new static AngleFact parseFact(Scroll.ScrollFact fact)
     {
@@ -1112,15 +1241,31 @@ public AngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactO
             pointBUri,
             pointCUri;
 
+        float angle = 0.0f;
         //If angle is not a 90Degree-Angle
         if (fact.GetType().Equals(typeof(Scroll.ScrollValueFact)))
         {
+            OMA df = (OMA)((Scroll.ScrollValueFact)fact).lhs;
+
+            if (df == null)
+                return null;
+
+      
+
+            if (((Scroll.ScrollValueFact)fact).value != null)
+                angle = ((OMF)(((Scroll.ScrollValueFact)fact).value)).f;
+
+
             pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
             pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
             pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri;
+
         }
+        // this should never happen anymore
         //If angle is a 90Degree-Angle
         else {
+            Debug.Log("Angle 90 degrees parsed. This shouldn't happen anymore");
+            
             pointAUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[0]).uri;
             pointBUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[1]).uri;
             pointCUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[2]).uri;
@@ -1129,11 +1274,14 @@ public AngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactO
         if (StageStatic.stage.factState.ContainsKey(pointAUri)
          && StageStatic.stage.factState.ContainsKey(pointBUri)
          && StageStatic.stage.factState.ContainsKey(pointCUri))
-
-            return new AngleFact(pointAUri, pointBUri, pointCUri, uri, StageStatic.stage.factState);
-
-        else    //If dependent facts do not exist return null
+        {
+//                return new AngleFact(pointAUri, pointBUri, pointCUri, uri, StageStatic.stage.factState);
+                return new AngleFact(pointAUri, pointBUri, pointCUri,angle, uri, StageStatic.stage.factState);
+        }
+        else
+        {   //If dependent facts do not exist return null
             return null;
+        }
     }
 
     /// \copydoc Fact.generateLabel
@@ -1258,7 +1406,2778 @@ protected override bool EquivalentWrapped(AngleFact f1, AngleFact f2)
         PointFact p2f2 = (PointFact)_Facts[f2.Pid2];
         PointFact p3f2 = (PointFact)_Facts[f2.Pid3];
 
-        return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2) && p3f1.Equivalent(p3f2))
-            ;//|| (p1f1.Equivalent(p3f2) && p2f1.Equivalent(p2f2) && p1f1.Equivalent(p3f2));
+        return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2) && p3f1.Equivalent(p3f2));
+        //|| (p1f1.Equivalent(p3f2) && p2f1.Equivalent(p2f2) && p1f1.Equivalent(p3f2));
+    }
+}
+
+
+
+/// <summary>
+/// Two parallel Lines comprised of two <see cref="LineFact">LineFacts</see> 
+/// </summary>
+public class ParallelLineFact : FactWrappedCRTP<ParallelLineFact>
+{
+    /// @{ <summary>
+    /// One <see cref="Fact.Id">Id</see> of thwo <see cref="LineFact">PointFacts</see> defining Angle [<see cref="Lid1"/>, <see cref="Lid2"/>].
+    /// </summary>
+    public string Lid1, Lid2;
+    /// @}
+
+
+
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public ParallelLineFact() : base()
+    {
+        this.Lid1 = null;
+        this.Lid2 = null;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public ParallelLineFact(ParallelLineFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Lid1], old_to_new[fact.Lid2]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="lid1">sets <see cref="Lid1"/></param>
+    /// <param name="lid2">sets <see cref="Lid2"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public ParallelLineFact(string lid1, string lid2, FactOrganizer organizer) : base(organizer)
+    {
+        init(lid1, lid2);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Lid1"/>, <see cref="Lid2"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="lid1">sets <see cref="Lid1"/></param>
+    /// <param name="lid2">sets <see cref="Lid2"/></param>
+    private void init(string lid1, string lid2)
+    {
+        
+        this.Lid1 = lid1;
+        this.Lid2 = lid2;
+
+        RayFact lf1 = _Facts[lid1] as RayFact;
+        RayFact lf2 = _Facts[lid2] as RayFact;
+
+        MMTDeclaration mmtDecl;
+        string l1URI = lf1.Id;
+        string l2URI = lf2.Id;
+        mmtDecl = generateParallelLineDeclaration( l1URI, l2URI);
+    
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Lid1">sets <see cref="Lid1"/></param>
+    /// <param name="Lid2">sets <see cref="Lid2"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public ParallelLineFact(string Lid1, string Lid2, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Lid1 = Lid1;
+        this.Lid2 = Lid2;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static ParallelLineFact parseFact(Scroll.ScrollFact fact)
+    {
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string lineAUri = "";
+        string lineBUri = "";
+
+        string uri = fact.@ref.uri;
+        OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED
+   
+
+        OMA parallel_lines_OMA = (OMA) proof_OMA.arguments[0]; // parallel
+
+        if (parallel_lines_OMA.arguments[0] is OMS) {
+            // Normaler Fall 
+            lineAUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+            lineBUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+
+        }
+        // Second case might be redundant by now
+        else {
+            OMA Projl_line_A_OMA = (OMA)parallel_lines_OMA.arguments[0]; // ProjectL
+            lineAUri = ((OMS)Projl_line_A_OMA.arguments[0]).uri;
+            OMA Projl_line_B_OMA = (OMA)parallel_lines_OMA.arguments[1]; // ProjectL
+            lineBUri = ((OMS)Projl_line_B_OMA.arguments[0]).uri;
+
+
+        }
+
+
+        if (StageStatic.stage.factState.ContainsKey(lineAUri)
+         && StageStatic.stage.factState.ContainsKey(lineBUri))
+
+            return new ParallelLineFact(lineAUri,lineBUri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "||" + _Facts[Lid1].Label + _Facts[Lid2].Label;
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="l1URI"><see cref="Lid1"/></param>
+    /// <param name="l2URI"><see cref="Lid2"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateParallelLineDeclaration(string l1URI, string l2URI)
+    {
+        
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(l1URI),
+            new OMS(l2URI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.ParallelLine), innerArguments)
+        };
+
+        //OMS constructor generates full URI
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+
+
+        return mmtDecl;
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Lid1, Lid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Lid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Lid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Lid1.GetHashCode() ^ this.Lid2.GetHashCode() ;
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(ParallelLineFact f1, ParallelLineFact f2)
+    {
+        if ((f1.Lid1 == f2.Lid1 && f1.Lid2 == f2.Lid2))
+            return true;
+
+        RayFact r1f1 = (RayFact)_Facts[f1.Lid1];
+        RayFact r2f1 = (RayFact)_Facts[f1.Lid2];
+        RayFact r1f2 = (RayFact)_Facts[f2.Lid1];
+        RayFact r2f2 = (RayFact)_Facts[f2.Lid2];
+
+        return (r1f1.Equivalent(r1f2) && r2f1.Equivalent(r2f2)) ;
+    }
+}
+
+
+
+
+
+
+
+/// <summary>
+/// A Circle that is made out of a middle point, a plane and a radius  
+/// </summary>
+public class CircleFact : FactWrappedCRTP<CircleFact>
+{
+   
+    /// <summary> defining the middle point of the circle  </summary>
+    public string Pid1;
+    /// <summary>  defining the base point of the circle plane </summary>
+    public string Pid2;
+    /// <summary>  radius of the circle </summary>
+    public float radius;
+    /// <summary> normal vector of the plane </summary>
+    public Vector3 normal;
+   
+    /// <summary> \copydoc Fact.Fact </summary>
+    public CircleFact() : base()
+    {
+        this.normal = Vector3.zero;
+        this.Pid1 = null;
+        this.Pid2 = null;
+        this.radius = 0;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public CircleFact(CircleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Pid1], old_to_new[fact.Pid2], fact.radius, fact.normal);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public CircleFact(string pid1, string pid2, float radius, Vector3 normal, FactOrganizer organizer) : base(organizer)
+    {
+        init(pid1, pid2, radius, normal);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="radius"/>,<see cref="dir1"/>,<see cref="dir2"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    private void init(string pid1, string pid2, float radius, Vector3 normal)
+    {
+        this.Pid1 = pid1;
+        this.Pid2 = pid2;
+
+        PointFact pf1 = _Facts[pid1] as PointFact;
+        PointFact pf2 = _Facts[pid2] as PointFact;
+
+
+        this.radius = radius;
+        this.normal = normal;
+
+        MMTDeclaration mmtDecl;
+        string p1URI = pf1.Id;
+        string p2URI = pf2.Id;
+
+        mmtDecl = generateCircleFactDeclaration(p1URI, p2URI, radius, normal);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Pid1">sets <see cref="Pid1"/></param>
+    /// <param name="Pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public CircleFact(string Pid1, string Pid2, float radius, Vector3 normal, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Pid1 = Pid1;
+        this.Pid2 = Pid2;
+
+        this.radius = radius;
+        this.normal = normal;
+ 
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// <summary>
+    /// parses the Circlefact response of the MMT-Server
+    /// </summary>
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact) 
+    public new static CircleFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+        string M_uri = "";
+        string A_uri = "";
+        float radius = 0.0f;
+        Vector3 normal = Vector3.zero;
+        OMA df = (OMA)((Scroll.ScrollSymbolFact)fact).df;
+
+        if (df == null)
+            return null;
+
+        Scroll.ScrollSymbolFact casted_fact = (Scroll.ScrollSymbolFact)fact;
+        
+
+
+        // get the mid point uri
+        string parse_id_M = ParsingDictionary.MMTermToString(((OMA)casted_fact.df).arguments[1]);
+
+        M_uri = ParsingDictionary.parseTermsToId[parse_id_M];
+        
+
+        // get the radius
+        radius = ((OMF)((OMA)casted_fact.df).arguments[2]).f;
+
+        OMA planeOMA = (OMA)((OMA)casted_fact.df).arguments[0];
+        string planeApplicant = ((OMS)planeOMA.applicant).uri;
+
+
+        // Getting the plane
+        // IN case of a normale plane
+        if (planeApplicant.Equals(MMTURIs.pointNormalPlane))
+        {
+            
+
+            OMA pointAOMA = (OMA)planeOMA.arguments[0];
+
+            string parse_id_A = ParsingDictionary.MMTermToString(planeOMA.arguments[0]);
+            A_uri = ParsingDictionary.parseTermsToId[parse_id_A];
+
+            OMA n = (OMA)planeOMA.arguments[1];
+            normal = new Vector3(((OMF)n.arguments[0]).f, ((OMF)n.arguments[1]).f, ((OMF)n.arguments[2]).f);
+            
+
+
+        }
+        // In case of parametrized plane
+        else if(planeApplicant.Equals(MMTURIs.ParametrizedPlane))
+        {
+            
+
+            OMA pointAOMA = (OMA)planeOMA.arguments[0];
+            string parse_id_A = ParsingDictionary.MMTermToString(planeOMA.arguments[0]);
+            A_uri = ParsingDictionary.parseTermsToId[parse_id_A];
+
+
+            OMA vOMA = (OMA)planeOMA.arguments[1];
+            OMA wOMA = (OMA)planeOMA.arguments[2];
+
+            Vector3 v = new Vector3(((OMF)vOMA.arguments[0]).f, ((OMF)vOMA.arguments[1]).f, ((OMF)vOMA.arguments[2]).f);
+            Vector3 w = new Vector3(((OMF)wOMA.arguments[0]).f, ((OMF)wOMA.arguments[1]).f, ((OMF)wOMA.arguments[2]).f);
+
+            normal = Vector3.Cross(v, w).normalized;
+
+            
+
+        }
+        // incase of smth else. Shouldn't hapepen unless there is an error
+        else {
+            Debug.Log("planeApplicant" + planeApplicant);
+            Debug.Log("?? " + MMTURIs.pointNormalPlane);
+
+            return null;
+        }
+
+
+
+        if (StageStatic.stage.factState.ContainsKey(M_uri)
+         && StageStatic.stage.factState.ContainsKey(A_uri))
+              return new CircleFact(M_uri,A_uri,radius,normal, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+
+        return  "â—‹"+_Facts[Pid1].Label;
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="p1URI"> <see cref="Pid1"/></param>
+    /// <param name="p2URI"> <see cref="Pid2"/></param>
+    /// <param name="radius"> <see cref="radius"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateCircleFactDeclaration( string p1URI, string p2URI, float radius, Vector3 normal)
+    {
+        PointFact p1 = _Facts[p1URI] as PointFact;
+        PointFact p2 = _Facts[p2URI] as PointFact;
+
+
+        List<MMTTerm> normalArgs = new List<MMTTerm>
+        {
+            new OMF(normal.x),
+            new OMF(normal.y),
+            new OMF(normal.z)
+        };
+        OMA NormalVector = new OMA(new OMS(MMTURIs.Tuple), normalArgs);
+
+
+
+        List<MMTTerm> planeArgs = new List<MMTTerm>
+        {
+            new OMS(p2URI),
+            NormalVector //n
+        };
+
+        OMA CirclePlane = new OMA(new OMS(MMTURIs.pointNormalPlane), planeArgs);
+        OMS middlePoint = new OMS(p1URI);
+        OMF Radius = new OMF(radius);
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+           CirclePlane,
+           middlePoint,
+           Radius
+        };
+
+        //OMS constructor generates full URI
+        // Do i need this here? doubt 
+        MMTTerm tp = new OMS(MMTURIs.CircleType3d);
+        MMTTerm df = new OMA(new OMS(MMTURIs.MkCircle3d), outerArguments);
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+
+
+        return mmtDecl;
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public Vector3 getNormal() 
+    {
+        return normal;
+    }
+
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Pid1,Pid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid1].Label;
+ 
+        // obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Lid2].Label;
+
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return  this.Pid1.GetHashCode() ^ this.Pid2.GetHashCode() ;
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(CircleFact f1, CircleFact f2)
+    {
+        if ( f1.Pid1 == f2.Pid1 && f1.normal == f2.normal && f1.radius == f2.radius)
+            return true;
+
+        PointFact p1f1 = (PointFact)_Facts[f1.Pid1];
+        PointFact p1f2 = (PointFact)_Facts[f2.Pid1];
+
+        return (p1f1.Equivalent(p1f2) && f1.normal == f2.normal && f1.radius == f2.radius);
+    }
+}
+
+
+/// <summary>
+/// A <see cref="PointFact"/> on a <see cref="CircleFact"/>
+/// </summary>
+public class OnCircleFact : FactWrappedCRTP<OnCircleFact>
+{
+    /// <summary> the point on the circle  </summary>
+    public string Pid;
+    /// <summary> the circle, which the point is on  </summary>
+    public string Cid;
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public OnCircleFact() : base()
+    {
+        this.Pid = null;
+        this.Cid = null;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public OnCircleFact(OnCircleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Pid], old_to_new[fact.Cid]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="pid">sets <see cref="Pid"/></param>
+    /// <param name="cid">sets <see cref="Cid"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public OnCircleFact(string pid, string cid, FactOrganizer organizer) : base(organizer)
+    {
+        init(pid, cid);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Pid"/>, <see cref="Rid"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="pid">sets <see cref="Pid"/></param>
+    /// <param name="cid">sets <see cref="Cid"/></param>
+    private void init(string pid, string cid)
+    {
+        this.Pid = pid;
+        this.Cid = cid;
+
+        PointFact pf = _Facts[pid] as PointFact;
+        CircleFact cf = _Facts[cid] as CircleFact;
+        string pURI = pf.Id;
+        string cURI = cf.Id;
+
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(cURI),
+            new OMS(pURI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.OnCircle), innerArguments)
+        };
+
+        //OMS constructor generates full URI
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="pid">sets <see cref="Pid"/></param>
+    /// <param name="cid">sets <see cref="Cid"/></param>
+    /// <param name="uri">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public OnCircleFact(string pid, string cid, string uri, FactOrganizer organizer) : base(organizer)
+    {
+        this.Pid = pid;
+        this.Cid = cid;
+        this._URI = uri;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static OnCircleFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string circleUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+        string pointUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+       
+        if (StageStatic.stage.factState.ContainsKey(pointUri)
+         && StageStatic.stage.factState.ContainsKey(circleUri))
+            return new OnCircleFact(pointUri, circleUri, uri, StageStatic.stage.factState);
+
+        //If dependent facts do not exist return null
+        else
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return _Facts[Pid].Label + "∈" + _Facts[Cid].Label;
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Pid, Cid };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid].Label + "∈" + _Facts[this.Cid].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Pid.GetHashCode() ^ this.Cid.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(OnCircleFact c1, OnCircleFact c2)
+    {
+        if (c1.Pid == c2.Pid && c1.Cid == c2.Pid)
+            return true;
+
+        PointFact pc1 = (PointFact)_Facts[c1.Pid];
+        CircleFact cc1 = (CircleFact)_Facts[c1.Cid];
+
+        PointFact pc2 = (PointFact)_Facts[c2.Pid];
+        CircleFact cc2 = (CircleFact)_Facts[c2.Cid];
+
+        return pc1.Equivalent(pc2) && cc1.Equivalent(cc2);
+    }
+}
+
+
+
+/// <summary>
+/// Angle comprised of a line and a circle 
+/// </summary>
+public class AngleCircleLineFact : FactWrappedCRTP<AngleCircleLineFact>
+{
+    /// @{ <summary>
+    /// One <see cref="Fact.Id">Id</see> of a <see cref="RayFact">RayFact</see> and a <see cref="CircleFact">CircleFact</see>  defining Angle [<see cref="Cid1"/>, <see cref="Rid2"/>].
+    /// </summary>
+    public string Cid1, Rid2;
+    /// @}
+    public float angle;
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public AngleCircleLineFact() : base()
+    {
+        this.Cid1 = null;
+        this.Rid2 = null;
+        this.angle = 0.0f;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public AngleCircleLineFact(AngleCircleLineFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Rid2], fact.angle);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="rid2">sets <see cref="Rid2"/></param>
+    /// <param name="angle"> sets the angle </param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public AngleCircleLineFact(string cid1, string rid2, float angle, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, rid2, angle);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/>, <see cref="Rid2"/>, <see cref="angle"/> <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="rid2">sets <see cref="Rid2"/></param>
+    /// <param name="angle"> sets the angle </param>
+    private void init(string cid1, string rid2, float angle)
+    {
+        this.Cid1 = cid1;
+        this.Rid2 = rid2;
+        this.angle = angle;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        RayFact rf2 = _Facts[rid2] as RayFact;
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string r2URI = rf2.Id;
+  
+        mmtDecl = generateMMTDeclaration(angle, c1URI, r2URI);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="´Rid2">sets <see cref="Rid2"/></param>
+    /// <param name="angle"> sets the angle </param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public AngleCircleLineFact(string Cid1, string Rid2, float angle, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Rid2 = Rid2;
+        this.angle = angle;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static AngleCircleLineFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+        string
+            CircleUri,
+            RayUri;
+
+        OMA df = (OMA)((Scroll.ScrollValueFact)fact).lhs;
+
+        if (df == null)
+            return null;
+
+        // init it with 0 degrees, so we don't accidentally generate orthogonalfacts 
+        // and the parsing works correctly if smb ever adds a scroll for this
+        float angle = 0.0f;
+
+        if((((Scroll.ScrollValueFact)fact).value)!=null)
+            angle = ((OMF)(((Scroll.ScrollValueFact)fact).value)).f;
+
+
+        CircleUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
+        RayUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
+
+        if (StageStatic.stage.factState.ContainsKey(CircleUri)
+         && StageStatic.stage.factState.ContainsKey(RayUri))
+        {
+            return new AngleCircleLineFact(CircleUri, RayUri, angle, uri, StageStatic.stage.factState);
+        }
+        else
+        {
+            //If dependent facts do not exist return null
+            return null;
+        }
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return  "∠" + _Facts[Cid1].Label + _Facts[Rid2].Label;
+    }
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="val">Angle != 90f, _not checked_</param>
+    /// <param name="c1URI"><see cref="Cid1"/></param>
+    /// <param name="R2URI"><see cref="Rid2"/></param>
+    /// <param name="val"><see cref="angle"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(float val, string c1URI, string r2URI)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.AnglePlaneLine),
+                new List<MMTTerm> {
+                    new OMS(c1URI),
+                    new OMS(r2URI),
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(val);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Rid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Rid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Rid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(AngleCircleLineFact f1, AngleCircleLineFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1 && f1.Rid2 == f2.Rid2 )
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        RayFact r2f1 = (RayFact)_Facts[f1.Rid2];
+
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+        RayFact r2f2 = (RayFact)_Facts[f2.Rid2];
+
+        return (c1f1.Equivalent(c1f2) && r2f1.Equivalent(r2f2));
+    }
+}
+
+
+/// <summary>
+/// A RadiusFact that corresponds to a <see cref="CircleFact">PointFacts</see> and has a float value (the actual radius).
+/// </summary>
+public class RadiusFact : FactWrappedCRTP<RadiusFact>
+{
+    ///  <summary> The circle corresponding to the radius </summary>
+    public string Cid1;
+    ///  <summary> The radius as a float </summary>
+    public float rad;
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public RadiusFact() : base()
+    {
+        this.Cid1 = null;
+        this.rad = 0.0f;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public RadiusFact(RadiusFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public RadiusFact(string cid1, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/> and <see cref="rad"/>
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    private void init(string cid1)
+    {
+        this.Cid1 = cid1;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        this.rad = cf1.radius;
+
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+
+
+        mmtDecl = generateMMTDeclaration(c1URI,this.rad);
+
+        AddFactResponse.sendAdd(mmtDecl,  out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public RadiusFact(string Cid1, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static RadiusFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+        string CircleUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
+
+        if (StageStatic.stage.factState.ContainsKey(CircleUri))
+
+            return new RadiusFact(CircleUri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "r "+ _Facts[Cid1].Label;
+    }
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="rad"> see <see cref="rad"/></param>
+    /// <param name="c1URI"> see <see cref="Cid1"/></param>
+
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration( string c1URI, float rad)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.RadiusCircleMetric),
+                new List<MMTTerm> {
+                    new OMS(c1URI),
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(rad);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1};
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = "r: "+_Facts[this.Cid1].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(RadiusFact f1, RadiusFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1)
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+        // if they correspond to the same circle, then automatically the radius has to be the same
+
+        return (c1f1.Equivalent(c1f2));
+    }
+}
+
+
+/// <summary>
+/// Area of a <see cref="CircleFact">CircleFact</see> 
+/// </summary>
+public class AreaCircleFact : FactWrappedCRTP<AreaCircleFact>
+{
+   /// <summary> the circle <see cref="CircleFact">CircleFact</see>  </summary>
+    public string Cid1;
+    /// <summary> the area which is contained by the circle </summary>
+    public float A;
+
+
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public AreaCircleFact() : base()
+    {
+        this.Cid1 = null;
+        this.A = 0.0f;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public AreaCircleFact(AreaCircleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public AreaCircleFact(string cid1, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+
+    private void init(string cid1)
+    {
+        this.Cid1 = cid1;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        this.A = cf1.radius * cf1.radius * ( (float) Math.PI );
+
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+
+
+        mmtDecl = generateMMTDeclaration(c1URI, this.A);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public AreaCircleFact(string Cid1, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static AreaCircleFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+        string CircleUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
+
+        if (StageStatic.stage.factState.ContainsKey(CircleUri))
+            return new AreaCircleFact(CircleUri, uri, StageStatic.stage.factState);
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "A(" + _Facts[Cid1].Label+")";
+    }
+
+
+    /// <summary>
+    /// Constructs a response, that is sent to the MMT-Server
+    /// </summary>
+    /// <param name="area"> area of the circle </param>
+    /// <param name="c1URI">  <see cref="Cid1"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string c1URI, float area)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.AreaCircle),
+                new List<MMTTerm> {
+                    new OMS(c1URI),
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(area);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(AreaCircleFact f1, AreaCircleFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1)
+            return true;
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+
+        return (c1f1.Equivalent(c1f2) && f1.A == f2.A);
+    }
+}
+
+
+/// <summary>
+/// The volume of a cone A  defined by a base area  <see cref="CircleFact">CircleFact</see>, an apex <see cref="PointFact">PointFact</see> and the volume as float
+/// </summary>
+public class ConeVolumeFact : FactWrappedCRTP<ConeVolumeFact>
+{
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary>
+    public string Cid1;
+    ///  <summary> a <see cref="PointFact">PointFact</see> describing the apex point  </summary>
+    public string Pid1;
+    ///  <summary> the volume of the cone as a float </summary>
+    public float vol;
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public ConeVolumeFact() : base()
+    {
+        this.Cid1 = null;
+        this.Pid1 = null;
+        this.vol = 0.0f;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public ConeVolumeFact(ConeVolumeFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Pid1], fact.vol);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public ConeVolumeFact(string cid1,string pid1, float vol, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1,pid1,vol);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/>, <see cref="Pid1"/>, <see cref="vol"/>,  <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    private void init(string cid1,string pid1, float vol)
+    {
+        this.Cid1 = cid1;
+        this.Pid1 = pid1;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        PointFact pf1 = _Facts[pid1] as PointFact;
+        this.vol = vol;
+
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string p1URI = pf1.Id;
+
+
+        mmtDecl = generateMMTDeclaration(c1URI, p1URI, vol);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Pid1">sets <see cref="Pid1"/></param>
+    /// <param name="volume">sets <see cref="vol"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public ConeVolumeFact(string Cid1,string Pid1, float volume,  string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Pid1 = Pid1;
+        this.vol = volume;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static ConeVolumeFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+
+        if (((Scroll.ScrollValueFact)fact).lhs == null)
+            return null;
+
+        string CircleUri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[0]).uri;
+        string PointUri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[1]).uri;
+        float volume = 0.0f;
+        if( (((Scroll.ScrollValueFact)fact).value) !=null   )
+            volume =  ((OMF) ((Scroll.ScrollValueFact)fact).value).f ;
+
+        if (StageStatic.stage.factState.ContainsKey(CircleUri)&& StageStatic.stage.factState.ContainsKey(PointUri))
+
+            return new ConeVolumeFact(CircleUri,PointUri,volume, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "V(" + _Facts[Cid1].Label +"," + _Facts[Pid1].Label+")";
+    }
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"> Uri for <see cref="Cid1"/></param>
+    /// <param name="p1URI"> Uri for <see cref="Pid1"/></param>
+    /// <param name="val"> <see cref="vol"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string c1URI, string p1URI, float val)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.VolumeCone),
+
+                new List<MMTTerm> {
+                    new OMA(new OMS(MMTURIs.ConeOfCircleApex),
+                        new List<MMTTerm> {
+                            new OMS(c1URI),
+                            new OMS(p1URI),
+                         }
+                    ),
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(val);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Pid1 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text =  _Facts[this.Cid1].Label+ _Facts[this.Pid1].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// uhhh is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode()^this.Pid1.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(ConeVolumeFact f1, ConeVolumeFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1 && f1.Pid1 == f2.Pid1)
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+
+        PointFact p1f1 = (PointFact)_Facts[f1.Pid1];
+        PointFact p1f2 = (PointFact)_Facts[f2.Pid1];
+
+        return (c1f1.Equivalent(c1f2)&& p1f1.Equivalent(p1f2) && (Mathf.Abs(f1.vol - f2.vol) < 0.001) );
+        
+    }
+}
+
+
+/// <summary>
+/// The fact that the plane of a <see cref="CircleFact">CircleFact</see> and the line <see cref="RayFact>RayFact</see> are orthogonal
+/// </summary>
+public class OrthogonalCircleLineFact : FactWrappedCRTP<OrthogonalCircleLineFact>
+{
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary>
+    public string Cid1;
+    ///  <summary> a <see cref="RayFact">Rayfact</see> describing the line </summary>
+    public string Lid1;
+  
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public OrthogonalCircleLineFact() : base()
+    {
+        this.Cid1 = null;
+        this.Lid1 = null;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public OrthogonalCircleLineFact(OrthogonalCircleLineFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Lid1]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="lid1">sets <see cref="Lid1"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public OrthogonalCircleLineFact(string cid1, string lid1, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, lid1);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="Pid3"/>, <see cref="is_right_angle"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="lid1">sets <see cref="Lid1"/></param>
+    private void init(string cid1, string lid1)
+    {
+        this.Cid1 = cid1;
+        this.Lid1 = lid1;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        RayFact lf1 = _Facts[lid1] as RayFact;
+
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string l1URI = lf1.Id;
+
+
+        mmtDecl = generateMMTDeclaration(c1URI, l1URI);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Lid1">sets <see cref="Lid1"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public OrthogonalCircleLineFact(string Cid1, string Lid1,  string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Lid1 = Lid1;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static OrthogonalCircleLineFact parseFact(Scroll.ScrollFact fact)
+    {
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string uri = fact.@ref.uri;
+
+        string CircleUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+        string LineUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+
+        if (StageStatic.stage.factState.ContainsKey(CircleUri)
+         && StageStatic.stage.factState.ContainsKey(LineUri))
+
+            return new OrthogonalCircleLineFact(CircleUri, LineUri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return   _Facts[Cid1].Label + "⊥" + _Facts[Lid1].Label;
+    }
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"> Uri for <see cref="Cid1"/></param>
+    /// <param name="l1URI"> Uri for <see cref="Lid1"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string c1URI, string l1URI)
+    {
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(c1URI),
+            new OMS(l1URI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.OrthoCircleLine), innerArguments)
+        };
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        return new MMTSymbolDeclaration(this.Label, tp, df);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Lid1 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Lid1].Label;
+
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// uhhh is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Lid1.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(OrthogonalCircleLineFact f1, OrthogonalCircleLineFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1 && f1.Lid1 == f2.Lid1)
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+
+        RayFact l1f1 = (RayFact)_Facts[f1.Lid1];
+        RayFact l1f2 = (RayFact)_Facts[f2.Lid1];
+
+        return (c1f1.Equivalent(c1f2) && l1f1.Equivalent(l1f2));
+
+    }
+}
+
+/// <summary>
+/// The volume of a cone A  defined by a base area  <see cref="CircleFact">CircleFact</see>, a top area <see cref="CircleFact">CircleFact</see> and the volume as float
+/// </summary>
+public class TruncatedConeVolumeFact : FactWrappedCRTP<TruncatedConeVolumeFact>
+{
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary>
+    public string Cid1;
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the top area  </summary>
+    public string Cid2;
+    ///  <summary> the volume of Truncated the cone as a float </summary>
+    public float vol;
+    /// <summary> a proof that both circles have not the same size </summary>
+    public string unequalCirclesProof;
+    ///  <summary> OMA proof that the two circles are parallel  </summary>
+    public OMA proof;
+    
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public TruncatedConeVolumeFact() : base()
+    {
+        this.Cid1 = null;
+        this.Cid2 = null;
+        this.vol = 0.0f;
+        this.unequalCirclesProof = null;
+        this.proof = null;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public TruncatedConeVolumeFact(TruncatedConeVolumeFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Cid2], fact.vol, old_to_new[fact.unequalCirclesProof], fact.proof);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public TruncatedConeVolumeFact(string cid1, string cid2, float vol, string unequalproof, OMA proof, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, cid2, vol,unequalproof, proof);
+    }
+
+    /// <summary>
+    /// sets variables and generates MMT Declaration
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    private void init(string cid1, string cid2, float vol, string unequalproof, OMA proof)
+    {
+        this.Cid1 = cid1;
+        this.Cid2 = cid2;
+        this.proof = proof;
+        this.unequalCirclesProof = unequalproof;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        CircleFact cf2 = _Facts[cid2] as CircleFact;
+        this.vol = vol;
+        UnEqualCirclesFact unEqualProof = _Facts[unequalproof] as UnEqualCirclesFact;
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string c2URI = cf2.Id;
+        string pURI = unEqualProof.Id;
+
+        mmtDecl = generateMMTDeclaration(c1URI, c2URI, vol, pURI, proof);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Cid2">sets <see cref="Cid2"/></param>
+    /// <param name="volume">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public TruncatedConeVolumeFact(string Cid1, string Cid2, float volume, string unequalproof, OMA proof, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Cid2 = Cid2;
+        this.vol = volume;
+        this.proof = proof;
+        this.unequalCirclesProof = unequalproof;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static TruncatedConeVolumeFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+
+        string Circle1Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[0]).uri;
+        string Circle2Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[1]).uri;
+        float volume = ((OMF)((Scroll.ScrollValueFact)fact).value).f;
+
+        string UnEqualCirclesProof = ((OMS)(((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[2])).uri;
+        OMA proof = (OMA)(((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[3]);
+
+
+        if (StageStatic.stage.factState.ContainsKey(Circle1Uri) && StageStatic.stage.factState.ContainsKey(Circle2Uri))
+
+            return new TruncatedConeVolumeFact(Circle1Uri, Circle2Uri, volume, UnEqualCirclesProof , proof, uri,  StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "V(" + _Facts[Cid1].Label +"," + _Facts[Cid2].Label+")";
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"> Uri for <see cref="Cid1"/></param>
+    /// <param name="c2URI"> Uri for <see cref="Cid2"/></param>
+    /// <param name="val"> <see cref="vol"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string c1URI, string c2URI, float val, string unequalproof, OMA proof)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.TruncatedVolumeCone),
+
+                new List<MMTTerm> {
+                    new OMS(c1URI),
+                    new OMS(c2URI),
+                    new OMS(unequalproof),
+                    proof,
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(val);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Cid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label + _Facts[this.Cid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// uhhh is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Cid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(TruncatedConeVolumeFact f1, TruncatedConeVolumeFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1 && f1.Cid2 == f2.Cid2)
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+
+        CircleFact c2f1 = (CircleFact)_Facts[f1.Cid2];
+        CircleFact c2f2 = (CircleFact)_Facts[f2.Cid2];
+
+        return (c1f1.Equivalent(c1f2) && c2f1.Equivalent(c2f2) && (Mathf.Abs(f1.vol - f2.vol) < 0.001) );
+
+    }
+}
+
+
+/// <summary>
+/// A RightAngleFact defined by 3  <see cref="PointFact">Pointfact</see> 
+/// </summary>
+public class RightAngleFact : FactWrappedCRTP<RightAngleFact>
+{
+    ///  <summary> three <see cref="PointFact">Pointfacts</see> defining the right angle </summary>
+    public string Pid1, Pid2, Pid3;
+
+
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public RightAngleFact() : base()
+    {
+        this.Pid1 = null;
+        this.Pid2 = null;
+        this.Pid3 = null;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public RightAngleFact(RightAngleFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Pid1], old_to_new[fact.Pid2],old_to_new[fact.Pid3]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="pid3">sets <see cref="Pid3"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public RightAngleFact(string pid1, string pid2, string pid3, FactOrganizer organizer) : base(organizer)
+    {
+        init(pid1, pid2, pid3);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="Pid3"/>, <see cref="is_right_angle"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="pid3">sets <see cref="Pid3"/></param>
+    private void init(string pid1, string pid2, string pid3)
+    {
+        this.Pid1 = pid1;
+        this.Pid2 = pid2;
+        this.Pid3 = pid3;
+
+        PointFact pf1 = _Facts[pid1] as PointFact;
+        PointFact pf2 = _Facts[pid2] as PointFact;
+        PointFact pf3 = _Facts[pid3] as PointFact;
+
+
+        MMTDeclaration mmtDecl;
+        string p1URI = pf1.Id;
+        string p2URI = pf2.Id;
+        string p3URI = pf3.Id;
+
+
+        mmtDecl = generateMMTDeclaration(p1URI, p2URI, p3URI);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Pid1">sets <see cref="Pid1"/></param>
+    /// <param name="Pid2">sets <see cref="Pid2"/></param>
+    /// <param name="Pid3">sets <see cref="Pid3"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public RightAngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Pid1 = Pid1;
+        this.Pid2 = Pid2;
+        this.Pid3 = Pid3;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static RightAngleFact parseFact(Scroll.ScrollFact fact)
+    {
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string Point1Uri = "";
+        string Point2Uri = "";
+        string Point3Uri = "";
+
+        string uri = fact.@ref.uri;
+        OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED
+        OMA rightAngleOMA = (OMA)proof_OMA.arguments[0]; // rightAngle OMA
+
+        if (rightAngleOMA.arguments[0] is OMS)
+        {
+            Point1Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+            Point2Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+            Point3Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[2]).uri;
+        }
+
+        if (StageStatic.stage.factState.ContainsKey(Point1Uri)
+         && StageStatic.stage.factState.ContainsKey(Point2Uri)
+         && StageStatic.stage.factState.ContainsKey(Point3Uri))
+
+            return new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return _Facts[Pid1].Label + _Facts[Pid2].Label + _Facts[Pid3].Label + "⊥";
+    }
+
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="p1URI"> Uri for <see cref="Pid1"/></param>
+    /// <param name="p2URI"> Uri for <see cref="Pid2"/></param>
+    /// <param name="p3URI"> Uri for <see cref="Pid3"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string p1URI, string p2URI, string p3URI)
+    {
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(p1URI),
+            new OMS(p2URI),
+            new OMS(p3URI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.RightAngle), innerArguments)
+        };
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        return new MMTSymbolDeclaration(this.Label, tp, df);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Pid1, Pid2, Pid3 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid2].Label;
+        obj.transform.GetChild(2).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Pid3].Label;
+
+
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// uhhh is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Pid1.GetHashCode() ^ this.Pid2.GetHashCode() ^ this.Pid3.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(RightAngleFact f1, RightAngleFact f2)
+    {
+        if (f1.Pid1 == f2.Pid1 && f1.Pid2 == f2.Pid2 && f1.Pid3 == f2.Pid3)
+            return true;
+
+        PointFact p1f1 = (PointFact)_Facts[f1.Pid1];
+        PointFact p2f1 = (PointFact)_Facts[f1.Pid2];
+        PointFact p3f1 = (PointFact)_Facts[f1.Pid3];
+
+        PointFact p1f2 = (PointFact)_Facts[f2.Pid1];
+        PointFact p2f2 = (PointFact)_Facts[f2.Pid2];
+        PointFact p3f2 = (PointFact)_Facts[f2.Pid3];
+
+      
+
+
+        return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2) && p3f1.Equivalent(p3f2) );
+
+    }
+}
+
+
+
+
+/// <summary>
+/// The volume of a cylinder defined by a base area  <see cref="CircleFact">CircleFact</see>, a top area <see cref="CircleFact">CircleFact</see> and the volume as float
+/// </summary>
+public class CylinderVolumeFact : FactWrappedCRTP<CylinderVolumeFact>
+{
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the base area </summary>
+    public string Cid1;
+    ///  <summary> a <see cref="CircleFact">CircleFact</see> describing the top area  </summary>
+    public string Cid2;
+    ///  <summary> the volume of the cylinder as a float </summary>
+    public float vol;
+    /// <summary> a proof that both circles have the same size </summary>
+    public string equalCirclesProof;
+    ///  <summary> OMA proof that the two circles are parallel  </summary>
+    public OMA proof;
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public CylinderVolumeFact() : base()
+    {
+        this.Cid1 = null;
+        this.Cid2 = null;
+        this.vol = 0.0f;
+        this.proof = null;
+        this.equalCirclesProof = null;
+
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public CylinderVolumeFact(CylinderVolumeFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Cid2], fact.vol, old_to_new[fact.equalCirclesProof], fact.proof);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public CylinderVolumeFact(string cid1, string cid2, float vol, string eqProof, OMA proof, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, cid2, vol, eqProof, proof);
+    }
+
+    /// <summary>
+    /// sets variables and generates MMT Declaration
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="vol">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    private void init(string cid1, string cid2, float vol, string eqProof, OMA proof)
+    {
+        this.Cid1 = cid1;
+        this.Cid2 = cid2;
+        this.proof = proof;
+        this.equalCirclesProof = eqProof;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        CircleFact cf2 = _Facts[cid2] as CircleFact;
+        EqualCirclesFact pf1 = _Facts[eqProof] as EqualCirclesFact;
+        this.vol = vol;
+
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string c2URI = cf2.Id;
+        string p1Uri = pf1.Id;
+
+
+        mmtDecl = generateMMTDeclaration(c1URI, c2URI, vol,p1Uri, proof);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Cid2">sets <see cref="Cid2"/></param>
+    /// <param name="volume">sets <see cref="vol"/></param>
+    /// <param name="proof">sets <see cref="proof"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public CylinderVolumeFact(string Cid1, string Cid2, float volume, string eqProof, OMA proof, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Cid2 = Cid2;
+        this.vol = volume;
+        this.proof = proof;
+        this.equalCirclesProof = eqProof;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static CylinderVolumeFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+
+        string Circle1Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[0]).uri;
+        string Circle2Uri = ((OMS)((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[1]).uri;
+        float volume = ((OMF)((Scroll.ScrollValueFact)fact).value).f;
+        string EqualCirclesProof = ((OMS)(((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[2])).uri;
+
+
+
+        OMA proof = (OMA)(((OMA)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).arguments[3]);
+
+        if (StageStatic.stage.factState.ContainsKey(Circle1Uri) && StageStatic.stage.factState.ContainsKey(Circle2Uri))
+
+            return new CylinderVolumeFact(Circle1Uri, Circle2Uri, volume, EqualCirclesProof, proof, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return "V(" + _Facts[Cid1].Label + "," + _Facts[Cid2].Label + ")";
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for not-right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"> Uri for <see cref="Cid1"/></param>
+    /// <param name="c2URI"> Uri for <see cref="Cid2"/></param>
+    /// <param name="val"> <see cref="vol"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateMMTDeclaration(string c1URI, string c2URI, float val, string p1URI, OMA proof)
+    {
+        MMTTerm lhs =
+            new OMA(
+                new OMS(MMTURIs.CylinderVolume),
+
+                new List<MMTTerm> {
+                    new OMS(c1URI),
+                    new OMS(c2URI),
+                    new OMS(p1URI),
+                    proof,
+                }
+            );
+
+        MMTTerm valueTp = new OMS(MMTURIs.RealLit);
+        MMTTerm value = new OMF(val);
+
+        return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
+    }
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Cid2, equalCirclesProof };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label + _Facts[this.Cid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    /// uhhh is this a problem?
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Cid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(CylinderVolumeFact f1, CylinderVolumeFact f2)
+    {
+        if (f1.Cid1 == f2.Cid1 && f1.Cid2 == f2.Cid2)
+            return true;
+
+        CircleFact c1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact c1f2 = (CircleFact)_Facts[f2.Cid1];
+
+        CircleFact c2f1 = (CircleFact)_Facts[f1.Cid2];
+        CircleFact c2f2 = (CircleFact)_Facts[f2.Cid2];
+
+        return (c1f1.Equivalent(c1f2) && c2f1.Equivalent(c2f2) && (Mathf.Abs(f1.vol - f2.vol) < 0.001) );
+
+    }
+}
+
+
+
+
+/// <summary>
+/// A fact that describes, that two circles have the same size and is comprised of two <see cref="CircleFact">CircleFacts</see> 
+/// </summary>
+public class EqualCirclesFact : FactWrappedCRTP<EqualCirclesFact>
+{
+    /// @{ <summary>
+    /// two circles that are meant to be equal in area
+    /// </summary>
+    public string Cid1, Cid2;
+    /// @}
+
+
+
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public EqualCirclesFact() : base()
+    {
+        this.Cid1 = null;
+        this.Cid2 = null;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public EqualCirclesFact(EqualCirclesFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Cid2]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public EqualCirclesFact(string cid1, string cid2, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, cid2);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/>, <see cref="Cid2"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    private void init(string cid1, string cid2)
+    {
+        this.Cid1 = cid1;
+        this.Cid2 = cid2;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        CircleFact cf2 = _Facts[cid2] as CircleFact;
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string c2URI = cf2.Id;
+        mmtDecl = generateEqualCirclesFactDeclaration(c1URI, c2URI);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Cid2">sets <see cref="Cid2"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public EqualCirclesFact(string Cid1, string Cid2, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Cid2 = Cid2;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static EqualCirclesFact parseFact(Scroll.ScrollFact fact)
+    {
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string circleAUri = "";
+        string circleBUri = "";
+
+        string uri = fact.@ref.uri;
+        OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED
+
+
+        OMA parallel_circles_OMA = (OMA)proof_OMA.arguments[0]; // parallel
+
+        if (parallel_circles_OMA.arguments[0] is OMS)
+        {
+            // Normaler Fall 
+            circleAUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+            circleBUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+
+        }
+        
+
+
+        if (StageStatic.stage.factState.ContainsKey(circleAUri)
+         && StageStatic.stage.factState.ContainsKey(circleBUri))
+
+            return new EqualCirclesFact(circleAUri, circleBUri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return   _Facts[Cid1].Label + " ≠ " + _Facts[Cid2].Label;
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for equalCirclesFact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"><see cref="Cid1"/></param>
+    /// <param name="c2URI"><see cref="Cid2"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateEqualCirclesFactDeclaration(string c1URI, string c2URI)
+    {
+
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(c1URI),
+            new OMS(c2URI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.EqualityCircles), innerArguments)
+        };
+
+        //OMS constructor generates full URI
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+
+
+        return mmtDecl;
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Cid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Cid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(EqualCirclesFact f1, EqualCirclesFact f2)
+    {
+        if ((f1.Cid1 == f2.Cid1 && f1.Cid2 == f2.Cid2))
+            return true;
+
+        CircleFact e1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact e2f1 = (CircleFact)_Facts[f1.Cid2];
+        CircleFact e1f2 = (CircleFact)_Facts[f2.Cid1];
+        CircleFact e2f2 = (CircleFact)_Facts[f2.Cid2];
+
+        return (e1f1.Equivalent(e1f2) && e2f1.Equivalent(e2f2));
+    }
+}
+
+
+/// <summary>
+/// A fact that describes, that two circles have not the same size and is comprised of two <see cref="CircleFact">CircleFacts</see> 
+/// </summary>
+public class UnEqualCirclesFact : FactWrappedCRTP<UnEqualCirclesFact>
+{
+    /// @{ <summary>
+    /// two circles that are meant to be unequal in area
+    /// </summary>
+    public string Cid1, Cid2;
+    /// @}
+
+
+
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public UnEqualCirclesFact() : base()
+    {
+        this.Cid1 = null;
+        this.Cid2 = null;
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public UnEqualCirclesFact(UnEqualCirclesFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init(old_to_new[fact.Cid1], old_to_new[fact.Cid2]);
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public UnEqualCirclesFact(string cid1, string cid2, FactOrganizer organizer) : base(organizer)
+    {
+        init(cid1, cid2);
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Cid1"/>, <see cref="Cid2"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="cid1">sets <see cref="Cid1"/></param>
+    /// <param name="cid2">sets <see cref="Cid2"/></param>
+    private void init(string cid1, string cid2)
+    {
+        
+        this.Cid1 = cid1;
+        this.Cid2 = cid2;
+
+        CircleFact cf1 = _Facts[cid1] as CircleFact;
+        CircleFact cf2 = _Facts[cid2] as CircleFact;
+
+        MMTDeclaration mmtDecl;
+        string c1URI = cf1.Id;
+        string c2URI = cf2.Id;
+        mmtDecl = generateUnEqualCirclesFactDeclaration(c1URI, c2URI);
+
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Cid1">sets <see cref="Cid1"/></param>
+    /// <param name="Cid2">sets <see cref="Cid2"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public UnEqualCirclesFact(string Cid1, string Cid2, string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+        this.Cid1 = Cid1;
+        this.Cid2 = Cid2;
+
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact)
+    public new static UnEqualCirclesFact parseFact(Scroll.ScrollFact fact)
+    {
+        OMA tp = (OMA)((Scroll.ScrollSymbolFact)fact).tp;
+        if (tp == null)
+            return null;
+
+        string circleAUri = "";
+        string circleBUri = "";
+
+        string uri = fact.@ref.uri;
+        OMA proof_OMA = (OMA)((Scroll.ScrollSymbolFact)fact).tp; // proof DED
+
+
+        OMA unequal_circles_OMA = (OMA)proof_OMA.arguments[0]; // unequal
+
+        if (unequal_circles_OMA.arguments[0] is OMS)
+        {
+            // Normaler Fall 
+            circleAUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[0]).uri;
+            circleBUri = ((OMS)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).uri;
+
+        }
+
+
+
+        if (StageStatic.stage.factState.ContainsKey(circleAUri)
+         && StageStatic.stage.factState.ContainsKey(circleBUri))
+
+            return new UnEqualCirclesFact(circleAUri, circleBUri, uri, StageStatic.stage.factState);
+
+        else    //If dependent facts do not exist return null
+            return null;
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+        return _Facts[Cid1].Label + " = " + _Facts[Cid2].Label;
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for equalCirclesFact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="c1URI"><see cref="Cid1"/></param>
+    /// <param name="c2URI"><see cref="Cid2"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateUnEqualCirclesFactDeclaration(string c1URI, string c2URI)
+    {
+
+        List<MMTTerm> innerArguments = new List<MMTTerm>
+        {
+            new OMS(c1URI),
+            new OMS(c2URI)
+        };
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+            new OMA(new OMS(MMTURIs.UnEqualityCircles), innerArguments)
+        };
+
+        //OMS constructor generates full URI
+        MMTTerm tp = new OMA(new OMS(MMTURIs.Ded), outerArguments);
+        MMTTerm df = null;
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+
+
+        return mmtDecl;
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { Cid1, Cid2 };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+        obj.transform.GetChild(0).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid1].Label;
+        obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Cid2].Label;
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return this.Cid1.GetHashCode() ^ this.Cid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(UnEqualCirclesFact f1, UnEqualCirclesFact f2)
+    {
+        if ((f1.Cid1 == f2.Cid1 && f1.Cid2 == f2.Cid2))
+            return true;
+
+        CircleFact e1f1 = (CircleFact)_Facts[f1.Cid1];
+        CircleFact e2f1 = (CircleFact)_Facts[f1.Cid2];
+        CircleFact e1f2 = (CircleFact)_Facts[f2.Cid1];
+        CircleFact e2f2 = (CircleFact)_Facts[f2.Cid2];
+
+        return (e1f1.Equivalent(e1f2) && e2f1.Equivalent(e2f2));
+    }
+}
+
+
+
+
+
+
+/// TEST FACT
+/// use this if you need to test certain implementations of facts.
+
+/// <summary>
+/// just for testing purposes  
+/// </summary>
+public class TestFact : FactWrappedCRTP<TestFact>
+{
+
+   
+
+    /// <summary> \copydoc Fact.Fact </summary>
+    public TestFact() : base()
+    {
+        
+    }
+
+    /// <summary>
+    /// Copies <paramref name="fact"/> by initiating new MMT %Fact.
+    /// </summary>
+    /// <param name="fact">Fact to be copied</param>
+    /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
+    /// <param name="organizer">sets <see cref="_Facts"/></param>
+    public TestFact(TestFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
+    {
+        init();
+    }
+
+    /// <summary>
+    /// Standard Constructor
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public TestFact( FactOrganizer organizer) : base(organizer)
+    {
+        init();
+    }
+
+    /// <summary>
+    /// Initiates <see cref="Pid1"/>, <see cref="Pid2"/>, <see cref="radius"/>,<see cref="dir1"/>,<see cref="dir2"/>, <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
+    /// </summary>
+    /// <param name="pid1">sets <see cref="Pid1"/></param>
+    /// <param name="pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    private void init()
+    {
+        
+
+       // mmtDecl = generateCircleFactDeclaration(p1URI, p2URI, radius, normal);
+
+      //  AddFactResponse.sendAdd(mmtDecl, out this._URI);
+    }
+
+    /// <summary>
+    /// Bypasses initialization of new MMT %Fact by using existend URI, _which is not checked for existence_.
+    /// </summary>
+    /// <param name="Pid1">sets <see cref="Pid1"/></param>
+    /// <param name="Pid2">sets <see cref="Pid2"/></param>
+    /// <param name="radius">sets <see cref="radius"/></param>
+    /// <param name="normal">sets <see cref="normal"/></param>
+    /// <param name="backendURI">MMT URI</param>
+    /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
+    public TestFact( string backendURI, FactOrganizer organizer) : base(organizer)
+    {
+      
+        this._URI = backendURI;
+        _ = this.Label;
+    }
+
+    /// <summary>
+    /// parses the Circlefact response of the MMT-Server
+    /// </summary>
+    /// \copydoc Fact.parseFact(Scroll.ScrollFact) 
+    public new static TestFact parseFact(Scroll.ScrollFact fact)
+    {
+        string uri = fact.@ref.uri;
+        Debug.Log("TestFact Uri:" + uri);
+        return new TestFact(uri, StageStatic.stage.factState);
+      
+    }
+
+    /// \copydoc Fact.generateLabel
+    protected override string generateLabel()
+    {
+
+        return "test" ;
+    }
+
+
+
+    /// <summary>
+    /// Constructs struct for right-angled MMT %Fact <see cref="AddFactResponse"/>
+    /// </summary>
+    /// <param name="p1URI"> <see cref="Pid1"/></param>
+    /// <param name="p2URI"> <see cref="Pid2"/></param>
+    /// <param name="radius"> <see cref="radius"/></param>
+    /// <returns>struct for <see cref="AddFactResponse"/></returns>
+    private MMTDeclaration generateCircleFactDeclaration(string p1URI, string p2URI, float radius, Vector3 normal)
+    {
+        PointFact p1 = _Facts[p1URI] as PointFact;
+        PointFact p2 = _Facts[p2URI] as PointFact;
+
+
+        List<MMTTerm> normalArgs = new List<MMTTerm>
+        {
+            new OMF(normal.x),
+            new OMF(normal.y),
+            new OMF(normal.z)
+        };
+        OMA NormalVector = new OMA(new OMS(MMTURIs.Tuple), normalArgs);
+
+
+
+        List<MMTTerm> planeArgs = new List<MMTTerm>
+        {
+            new OMS(p2URI),
+            NormalVector //n
+        };
+
+        OMA CirclePlane = new OMA(new OMS(MMTURIs.pointNormalPlane), planeArgs);
+        OMS middlePoint = new OMS(p1URI);
+        OMF Radius = new OMF(radius);
+
+        List<MMTTerm> outerArguments = new List<MMTTerm>
+        {
+           CirclePlane,
+           middlePoint,
+           Radius
+        };
+
+        //OMS constructor generates full URI
+        // Do i need this here? doubt 
+        MMTTerm tp = new OMS(MMTURIs.CircleType3d);
+        MMTTerm df = new OMA(new OMS(MMTURIs.MkCircle3d), outerArguments);
+
+        MMTSymbolDeclaration mmtDecl = new MMTSymbolDeclaration(this.Label, tp, df);
+        AddFactResponse.sendAdd(mmtDecl, out this._URI);
+
+
+        return mmtDecl;
+    }
+
+
+    /// \copydoc Fact.hasDependentFacts
+    public override Boolean hasDependentFacts()
+    {
+        return false;
+    }
+
+ 
+
+    /// \copydoc Fact.getDependentFactIds
+    public override string[] getDependentFactIds()
+    {
+        return new string[] { };
+    }
+
+    /// \copydoc Fact.instantiateDisplay(GameObject, Transform)
+    public override GameObject instantiateDisplay(GameObject prefab, Transform transform)
+    {
+        var obj = GameObject.Instantiate(prefab, Vector3.zero, Quaternion.identity, transform);
+
+        // obj.transform.GetChild(1).gameObject.GetComponent<TextMeshProUGUI>().text = _Facts[this.Lid2].Label;
+
+        obj.GetComponent<FactWrapper>().fact = this;
+        return obj;
+    }
+
+    /// \copydoc Fact.GetHashCode
+    public override int GetHashCode()
+    {
+        return 112315414;// this.Pid1.GetHashCode() ^ this.Pid2.GetHashCode();
+    }
+
+    /// \copydoc Fact.Equivalent(Fact, Fact)
+    protected override bool EquivalentWrapped(TestFact f1, TestFact f2)
+    {
+        return false;
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
index 45c260ccfa78105e108a55797d7a58df864e97d5..aaa31a2ea0f3a73ba8c3852158418ea2f0c48df7 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
@@ -136,4 +136,12 @@ public static AngleFact AddAngleFact(string pid1, string pid2, string pid3, bool
             , out _, samestep, gadget, scroll_label);
     }
 
+    public static EqualCirclesFact AddEqualCirclesFact(string cid1, string cid2, bool samestep = false)
+    {
+        return (EqualCirclesFact)AddFactIfNotFound(new EqualCirclesFact(cid1, cid2, StageStatic.stage.factState), out _, samestep);
+    }
+    public static UnEqualCirclesFact AddUnEqualCirclesFact(string cid1, string cid2, bool samestep = false)
+    {
+        return (UnEqualCirclesFact)AddFactIfNotFound(new UnEqualCirclesFact(cid1, cid2, StageStatic.stage.factState), out _, samestep);
+    }
 }
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
index 780cb4a902976c6898238ff88549dad026e7875f..632bfe42e79187d67f7ec61eeb98a1b59bb65d30 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
@@ -11,7 +11,9 @@ public GameObject
         Sphere,
         Line,
         Ray,
-        Angle;
+        Angle,
+        Ring,
+        Circle;
 
     void Start()
     {
@@ -31,10 +33,23 @@ public Fact SpawnFactRepresentation(Fact fact)
             LineFact    => SpawnLine,
             AngleFact   => SpawnAngle,
             RayFact     => SpawnRay,
+            CircleFact  => SpawnRingAndCircle,
             _ => null,
         };
 
         return func?.Invoke(fact);
+
+        //TODO check if the above breaks anything
+        //return fact switch
+        //{
+        //    PointFact pointFact => SpawnPoint,
+        //    LineFact lineFact => SpawnLine,
+        //    AngleFact angleFact => SpawnAngle,
+        //    RayFact rayFact => SpawnRay,
+        //    CircleFact circleFact => SpawnRingAndCircle,
+        //    _ => null,
+        //};
+
     }
   
 
@@ -175,9 +190,106 @@ public Fact SpawnAngle(Fact fact)
         return angleFact;
     }
 
+    public Fact SpawnRingAndCircle(Fact fact)
+    {
+        var ringAndCircleGO = new GameObject("RingAndCircle");
+        _ = SpawnRing(fact, ringAndCircleGO.transform);
+        var circleFact = SpawnCircle(fact, ringAndCircleGO.transform);
+
+        //TODO check whether this is necessary?
+       // this.FactRepresentation = ringAndCircleGO;
+        circleFact.Representation = ringAndCircleGO;
+
+        return circleFact;
+    }
+
+    public Fact SpawnRing(Fact fact, Transform parent = null)
+    {
+        CircleFact circleFact = (CircleFact)fact;
+
+        PointFact middlePointFact = StageStatic.stage.factState[circleFact.Pid1] as PointFact;
+        PointFact basePointFact = StageStatic.stage.factState[circleFact.Pid2] as PointFact;
+
+        Vector3 middlePoint = middlePointFact.Point;
+        Vector3 normal = circleFact.normal;
+        float radius = circleFact.radius;
+
+        //Change FactRepresentation to Ring
+        //TODO check whether this is necessary?
+
+        //this.FactRepresentation = Ring;
+        //GameObject ring = Instantiate(FactRepresentation, parent);
+        GameObject ring = GameObject.Instantiate(Ring,parent);
+
+        var tori = ring.GetComponentsInChildren<TorusGenerator>();
+        var tmpText = ring.GetComponentInChildren<TextMeshPro>();
+        var FactObj = ring.GetComponentInChildren<FactObject>();
+
+        //Move Ring to middlePoint
+        ring.transform.position = middlePoint;
+
+        //Rotate Ring according to normal
+        if (normal.y < 0) // if normal faces downwards use inverted normal instead
+            ring.transform.up = -normal;
+        else
+            ring.transform.up = normal;
+
+        //Set radii
+        foreach (var torus in tori)
+            torus.torusRadius = radius;
+
+        string text = $"â—‹{middlePointFact.Label}";
+        tmpText.text = text;
+        ////move TMP Text so it is on the edge of the circle
+        //tmpText.rectTransform.position = tmpText.rectTransform.position - new Vector3(0, 0, -radius);
+
+        FactObj.URI = circleFact.Id;
+        circleFact.Representation = ring;
+
+        return circleFact;
+    }
+
+    public Fact SpawnCircle(Fact fact, Transform parent = null)
+    {
+        CircleFact circleFact = (CircleFact)fact;
+
+        PointFact middlePointFact = StageStatic.stage.factState[circleFact.Pid1] as PointFact;
+        PointFact basePointFact = StageStatic.stage.factState[circleFact.Pid2] as PointFact;
+
+        Vector3 middlePoint = middlePointFact.Point;
+        Vector3 normal = circleFact.normal;
+        float radius = circleFact.radius;
+
+        //TODO check whether this is necessary
+        //Change FactRepresentation to Ring
+       // this.FactRepresentation = Circle;
+        GameObject circle = Instantiate(Circle, parent);
+
+        var FactObj = circle.GetComponentInChildren<FactObject>();
+
+        //Move Circle to middlePoint
+        circle.transform.position = middlePoint;
+
+        //Rotate Circle according to normal
+        if (normal.y < 0) // if normal faces downwards use inverted normal instead
+            circle.transform.up = -normal;
+        else
+            circle.transform.up = normal;
+
+        //Set radius
+        circle.transform.localScale = new Vector3(radius * 2, circle.transform.localScale.y, radius * 2);
+
+        FactObj.URI = circleFact.Id;
+        circleFact.Representation = circle;
+
+        return circleFact;
+    }
+
+
     public void DeleteObject(Fact fact)
     {
         GameObject factRepresentation = fact.Representation;
+        print("Deleting: " + fact.Representation?.name);
         GameObject.Destroy(factRepresentation);
     }
 
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/AngleTool.cs b/Assets/Scripts/InteractionEngine/Gadgets/AngleTool.cs
index 49966cb40dda4747b324478aa8599ac6e13a4608..26dab0b3bbecafc69b712bfe7edb2bd1479c910b 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/AngleTool.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/AngleTool.cs
@@ -14,29 +14,31 @@ public class AngleTool : Gadget
     private const int curveDrawingVertexCount = 36;
     private float curveRadius;
 
-    public override void _Hit(RaycastHit hit)
+    public override void _Hit(RaycastHit[] hit)
     {
-        if (hit.transform.gameObject.layer != LayerMask.NameToLayer("Point"))
+        if (hit[0].transform.gameObject.layer != LayerMask.NameToLayer("Point"))
             return;
 
-        string tempFactId = hit.transform.GetComponent<FactObject>().URI;
+        string tempFactId = hit[0].transform.GetComponent<FactObject>().URI;
         if (!Workflow.Contains(tempFactId))
             Workflow.Add(tempFactId);
 
+
         switch (Workflow.Count)
         {
             case 1:
-                AnglePoints[0] = hit.transform.position;
+                AnglePoints[0] = hit[0].transform.position;
                 break;
 
             case 2:
-                AnglePoints[1] = hit.transform.position;
+                AnglePoints[1] = hit[0].transform.position;
                 AnglePoints[2] = AnglePoints[0] - AnglePoints[1]; // cache for _UpdateLineDrawing()
                 ActivateLineDrawing();
                 break;
 
             case 3:
                 FactManager.AddAngleFact(Workflow[0], Workflow[1], Workflow[2], gadget: this);
+
                 ResetGadget();
                 return;
         }
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ca737b7532db87783dc72ad97e14f052b8e2a33b
--- /dev/null
+++ b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs
@@ -0,0 +1,111 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using static CommunicationEvents;
+
+/// <summary>
+/// a Gadget that checks whether two given circles have equal size and if yes it returns an EqualCirclesFact
+/// </summary>
+public class EqualCircleGadget : Gadget
+{
+
+    //Variables to safe if one circle has already been selected
+    private bool FirstCircleSelected = false;
+    private CircleFact FirstCircle = null;
+
+
+
+
+    new void Awake()
+    {
+        base.Awake();
+        UiName = "EqualCircles Mode";
+        if (MaxRange == 0)
+            MaxRange = GlobalBehaviour.GadgetLaserDistance;
+    }
+
+    //Initialize Gadget when enabled AND activated
+    new void OnEnable()
+    {
+        base.OnEnable();
+        this.ResetGadget();
+    }
+
+    void OnDisable()
+    {
+        this.ResetGadget();
+    }
+
+    public override void OnHit(RaycastHit[] hit)
+    {
+        if (!this.isActiveAndEnabled) return;
+        if (hit[0].transform.gameObject.layer == LayerMask.NameToLayer("Circle"))
+        {
+            CircleFact tempFact = (CircleFact)StageStatic.stage.factState[hit[0].transform.GetComponent<FactObject>().URI];
+
+            //If the first circle got already selected
+            if (this.FirstCircleSelected)
+            {
+                // Debug.Log("hit it");
+               //  Debug.Log("data: radius dif" + Mathf.Abs(this.FirstCircle.radius - tempFact.radius) +" ids: 1. "+ this.FirstCircle.Id+", 2."+ tempFact.Id);
+                //Create EqualCirclesFact
+                //Check if new Point is equal to one of the previous points -> if true -> cancel
+                if ((Mathf.Abs(this.FirstCircle.radius - tempFact.radius) < 0.01) && !(this.FirstCircle.Id == tempFact.Id))
+                {
+                    FactManager.AddEqualCirclesFact(((CircleFact)this.FirstCircle).Id, ((CircleFact)tempFact).Id);
+                }
+                else {
+                    if(!(this.FirstCircle.Id == tempFact.Id)) 
+                        FactManager.AddUnEqualCirclesFact(((CircleFact)this.FirstCircle).Id, ((CircleFact)tempFact).Id);
+
+                }
+
+                ResetGadget();
+            }
+            //If no circle was selected before
+            else
+            {
+                //Save the first point selected
+                this.FirstCircleSelected = true;
+                this.FirstCircle= tempFact;
+            }
+        }
+        //No Circles were hit
+        else
+        {
+            ResetGadget();
+
+        }
+    }
+
+    void Update()
+    {
+        if (!this.isActiveAndEnabled) return;
+       
+            UpdateCurveDrawing(this.Cursor.transform.position);
+    }
+
+    private void ResetGadget()
+    {
+        this.FirstCircleSelected= false;
+        this.FirstCircle = null;
+
+        DeactivateCurveDrawing();
+    }
+
+    public void ActivateCurveDrawing()
+    {
+        
+    }
+
+    public void UpdateCurveDrawing(Vector3 currentPosition)
+    {
+
+    }
+
+    public void DeactivateCurveDrawing()
+    {
+   
+    }
+
+}
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs.meta b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..7c8763a640783de01544c2050ec50f5ef2011d2e
--- /dev/null
+++ b/Assets/Scripts/InteractionEngine/Gadgets/EqualCircleGadget.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3d26ac5cd1e235148b7c35538c429335
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/Gadget.cs b/Assets/Scripts/InteractionEngine/Gadgets/Gadget.cs
index ba704d48f91dd3ade60cd784238e46ec54f375fe..3a50271c82a89f39079713655867f8f156b5e2d7 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/Gadget.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/Gadget.cs
@@ -19,6 +19,7 @@
 [JsonSubtypes.KnownSubType(typeof(Pendulum), "Pendulum")]
 [JsonSubtypes.KnownSubType(typeof(PoleTool), "PoleTool")]
 [JsonSubtypes.KnownSubType(typeof(Remover), "Remover")]
+[JsonSubtypes.KnownSubType(typeof(EqualCircleGadget), "EqualCircles")]
 [JsonSubtypes.FallBackSubType(typeof(UndefinedGadget))]
 public abstract class Gadget
 {
@@ -43,6 +44,7 @@ public enum GadgetIDs
         Pendulum = 5,
         PoleTool = 6,
         Remover = 7,
+        EqualCircles = 8,
     }
 
     public static Dictionary<Type, GadgetIDs> GadgetTypeToIDs = new(){
@@ -55,6 +57,7 @@ public enum GadgetIDs
         {typeof(Pendulum)           , GadgetIDs.Pendulum },
         {typeof(PoleTool)           , GadgetIDs.PoleTool },
         {typeof(Remover)            , GadgetIDs.Remover },
+        {typeof(EqualCircleGadget)  , GadgetIDs.EqualCircles },
         };
 
     /// <summary> Position in tool belt. </summary>
@@ -117,7 +120,7 @@ public void Init(bool overrite)
             return;
         }
         var GadgetID = GadgetTypeToIDs[this_type];
-
+        
         if (!GadgetBehaviour.DataContainerGadgetDict.ContainsKey(GadgetID))
         {
             Debug.LogError("No " + GadgetID.ToString() + "in assigned " + typeof(DataContainerGadgetCollection).Name + "!");
@@ -183,10 +186,11 @@ public void Update()
         _Update();
     }
 
-    public void Hit(RaycastHit hit)
-    {
+    public void Hit(RaycastHit[] hit)
+    {    
         if (!CommunicationEvents.GadgetCanBeUsed
-            || hit.transform.position.y > MaxHeight)
+            //TODO: We should probably check all hits and sort out the "bad" ones
+            || hit[0].transform.position.y > MaxHeight)
             return;
 
         _Hit(hit);
@@ -201,7 +205,7 @@ public virtual void _Update() { }
     /// Called when <see cref="CommunicationEvents.TriggerEvent"/> is invoked, a.k.a. when Player clicks in GameWorld.
     /// </summary>
     /// <param name="hit">the position where it was clicked</param>
-    public virtual void _Hit(RaycastHit hit) { }
+    public virtual void _Hit(RaycastHit[] hit) { }
 
     protected void ActivateLineDrawing()
     {
@@ -245,4 +249,4 @@ public void ResetGadget()
     protected virtual void _ResetGadget() { }
 
     public class UndefinedGadget : Gadget { }
-}
\ No newline at end of file
+}
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/LineTool.cs b/Assets/Scripts/InteractionEngine/Gadgets/LineTool.cs
index 0cc4d828b4d51b4c1a443e621fc0bf5890e7a30a..2682c8ccdb30d5035ef5ea9e7e7112a7a2ae48ad 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/LineTool.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/LineTool.cs
@@ -13,19 +13,22 @@ public class LineTool : Gadget
     //Cache for drawing Line
     private readonly Vector3[] LineOrigin = new Vector3[1];
 
-    public override void _Hit(RaycastHit hit)
+  
+ 
+    public override void _Hit(RaycastHit[] hit)
     {
-        if (hit.transform.gameObject.layer != LayerMask.NameToLayer("Point"))
+       
+        if (hit[0].transform.gameObject.layer != LayerMask.NameToLayer("Point"))
             return;
 
-        string tempFactId = hit.transform.GetComponent<FactObject>().URI;
+        string tempFactId = hit[0].transform.GetComponent<FactObject>().URI;
         if (!Workflow.Contains(tempFactId))
             Workflow.Add(tempFactId);
 
         switch (Workflow.Count)
         {
             case 1:
-                LineOrigin[0] = hit.transform.position;
+                LineOrigin[0] = hit[0].transform.position;
                 ActivateLineDrawing();
                 break;
 
@@ -36,6 +39,7 @@ public override void _Hit(RaycastHit hit)
         }
     }
 
+
     protected override void _ActivateLineDrawing()
     {
         GadgetBehaviour.LineRenderer.enabled = true;
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/LotTool.cs b/Assets/Scripts/InteractionEngine/Gadgets/LotTool.cs
index 3bbe9476aa4a2653fa451ee101754c95f953595c..f643e57e9fca55146e685a6ccaf17e4147b1896c 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/LotTool.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/LotTool.cs
@@ -18,7 +18,8 @@ public class LotTool : Gadget
     private Vector3 BaseLineHit;
 
 
-    public override void _Hit(RaycastHit hit)
+
+    public override void _Hit(RaycastHit[] hit)
     {
         void CreateRayAndAngles(string IntersectionId, string LotPointId, bool samestep)
         {
@@ -30,9 +31,10 @@ void CreateRayAndAngles(string IntersectionId, string LotPointId, bool samestep)
                 , IntersectionId, LotPointId, samestep: true, gadget: this);
         }
 
+
         string tempFactId = null;
-        if (!((LayerMask) hit.transform.gameObject.layer).IsAnyByName(new string[] { "Default", "Tree" })
-         && (!hit.transform.TryGetComponent(out FactObject obj)
+        if (!((LayerMask) hit[0].transform.gameObject.layer).IsAnyByName(new string[] { "Default", "Tree" })
+         && (!hit[0].transform.TryGetComponent(out FactObject obj)
            || Workflow.Contains(tempFactId = obj.URI)))
             return;
 
@@ -47,7 +49,7 @@ void CreateRayAndAngles(string IntersectionId, string LotPointId, bool samestep)
                 BaseLine = (AbstractLineFact) tempFact;
                 BaseLineRoot = ((PointFact) StageStatic.stage.factState[BaseLine.Pid1]).Point;
 
-                BaseLineHit = hit.point;
+                BaseLineHit = hit[0].point;
                 ActivateLineDrawing();
                 return;
 
@@ -55,15 +57,15 @@ void CreateRayAndAngles(string IntersectionId, string LotPointId, bool samestep)
                 if (tempFact is not PointFact)
                     return;
 
-                IntersectionPoint = Math3d.ProjectPointOnLine(BaseLineRoot, BaseLine.Dir, hit.transform.position);
-                if (Math3d.IsApproximatelyEqual(IntersectionPoint, hit.transform.position))
+                IntersectionPoint = Math3d.ProjectPointOnLine(BaseLineRoot, BaseLine.Dir, hit[0].transform.position);
+                if (Math3d.IsApproximatelyEqual(IntersectionPoint, hit[0].transform.position))
                 {   // TempFact is on baseLine
                     Workflow.Add(tempFactId);
                     return;
                 }
                 else
                 {   // create perpendicular through existing Point off Line
-                    Vector3 normal = Vector3.Cross(BaseLine.Dir, hit.transform.position - IntersectionPoint).normalized;
+                    Vector3 normal = Vector3.Cross(BaseLine.Dir, hit[0].transform.position - IntersectionPoint).normalized;
                     normal *= Mathf.Sign(Vector3.Dot(normal, Vector3.up)); // point up
                     var intersectionId = FactManager.AddPointFact(IntersectionPoint, normal, gadget: this).Id;
 
@@ -76,13 +78,14 @@ void CreateRayAndAngles(string IntersectionId, string LotPointId, bool samestep)
                 break;
 
             case 2: // create perpendicular through new Point off Line
-                if (!((LayerMask) hit.transform.gameObject.layer).IsAnyByName(new string[] { "Default", "Tree" }))
+                if (!((LayerMask) hit[0].transform.gameObject.layer).IsAnyByName(new string[] { "Default", "Tree" }))
                     return;
 
-                Vector3 LotPoint = Math3d.ProjectPointOnLine(hit.point, BaseLine.Dir, IntersectionPoint);
-                CreateRayAndAngles(Workflow[1], FactManager.AddPointFact(LotPoint, hit.normal, gadget: this).Id, true);
+                Vector3 LotPoint = Math3d.ProjectPointOnLine(hit[0].point, BaseLine.Dir, IntersectionPoint);
+                CreateRayAndAngles(Workflow[1], FactManager.AddPointFact(LotPoint, hit[0].normal, gadget: this).Id, true);
                 ResetGadget();
                 return;
+
         }
     }
 
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/Pendulum.cs b/Assets/Scripts/InteractionEngine/Gadgets/Pendulum.cs
index a890d00aa66bebded17532c536ab8b9e51c71e72..8980cc4e9a17dd52acf0c761b054287472fd523e 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/Pendulum.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/Pendulum.cs
@@ -15,18 +15,21 @@ public override void _Enable()
         ActivateLineDrawing();
     }
 
-    public override void _Hit(RaycastHit hit)
+
+
+    public override void _Hit(RaycastHit[] hit)
     {
-        if (hit.transform.gameObject.layer != LayerMask.NameToLayer("Point"))
+        if (hit[0].transform.gameObject.layer != LayerMask.NameToLayer("Point"))
             return;
 
         //Raycast downwoard
-        if (Physics.Raycast(hit.transform.position, Vector3.down, out RaycastHit ground, Mathf.Infinity, this.SecondaryLayerMask.value))
+        if (Physics.Raycast(hit[0].transform.position, Vector3.down, out RaycastHit ground, Mathf.Infinity, this.SecondaryLayerMask.value))
         {
-            string tempFactId = hit.transform.GetComponent<FactObject>().URI;
+            string tempFactId = hit[0].transform.GetComponent<FactObject>().URI;
             Workflow.Add(tempFactId);
             FactManager.AddPointFact(ground, gadget: this);
             ResetGadget();
+
         }
     }
 
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/Pointer.cs b/Assets/Scripts/InteractionEngine/Gadgets/Pointer.cs
index 8e84f00dade73a1cc6e6c462ddaba076d241dc2d..3b4fc008cc6a1fe37973e05fde68ababb125b7c3 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/Pointer.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/Pointer.cs
@@ -9,21 +9,29 @@ public class Pointer : Gadget
     [Newtonsoft.Json.JsonProperty]
     protected static new string s_type = "Pointer";
 
-    public override void _Hit(RaycastHit hit)
-    {
-        string pid = FactManager.AddPointFact(hit, gadget: this).Id;
 
-        if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Ray"))
+    public override void _Hit(RaycastHit[] hit)
+    {
+        string pid = FactManager.AddPointFact(hit[0], gadget: this).Id;
+        for (int i = 0; i < hit.Length; i++)
         {
-            Workflow.Add(hit.transform.GetComponent<FactObject>().URI);
-            FactManager.AddOnLineFact
-                (pid
-                , Workflow[0]
-                , samestep: true
-                , gadget: this
-                , is_certain: false);
+            if (Mathf.Abs(hit[i].distance - hit[0].distance) > 0.03)
+                break;
+
+            if (hit[i].transform.gameObject.layer == LayerMask.NameToLayer("Ray"))
+            {
+                Workflow.Add(hit[i].transform.GetComponent<FactObject>().URI);
+                FactManager.AddOnLineFact
+                    (pid
+                    , Workflow[0]
+                    , samestep: true
+                    , gadget: this
+                    , is_certain: false);
+            }
         }
 
+        
+
         ResetGadget();
     }
 }
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/PoleTool.cs b/Assets/Scripts/InteractionEngine/Gadgets/PoleTool.cs
index 13fcd4bbc5dbdd8f86dac776785e035d82c95040..a208558eea00f82cfb2150ef20ff3558d3ba5476 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/PoleTool.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/PoleTool.cs
@@ -17,7 +17,8 @@ public override void _Enable()
         ActivateLineDrawing();
     }
 
-    public override void _Hit(RaycastHit hit)
+
+    public override void _Hit(RaycastHit[] hit)
     {
         if (!Physics.Raycast(
                 GadgetBehaviour.Cursor.transform.position + Vector3.up * (float)Math3d.vectorPrecission
@@ -27,15 +28,23 @@ public override void _Hit(RaycastHit hit)
 
         UpdateLineDrawing();
 
-        if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point"))
+
+
+        if (hit[0].transform.gameObject.layer == LayerMask.NameToLayer("Point"))
         {
-            Workflow.Add(hit.transform.gameObject.GetComponent<FactObject>().URI);
+
+            Workflow.Add(hit[0].transform.gameObject.GetComponent<FactObject>().URI);
+            //TODO check if below works else fix with the commented stuff
+            // var pid2 = FactManager.AddPointFact(linePositions[1], Vector3.up).Id;
+           // FactManager.AddLineFact(hit[0].transform.gameObject.GetComponent<FactObject>().URI, pid2, true);
+            
             var pid2 = FactManager.AddPointFact(GetPosition(1), Vector3.up, gadget: this).Id;
             FactManager.AddLineFact(Workflow[0], pid2, true, gadget: this);
         }
         else
         {
-            FactManager.AddPointFact(hit, gadget: this);
+            FactManager.AddPointFact(hit[0], gadget: this);
+
         }
 
         ResetGadget();
@@ -53,6 +62,9 @@ protected override void _ActivateLineDrawing()
     //Updates the points of the Lines when baseLine was selected in LineMode
     protected override void _UpdateLineDrawing()
     {
+
+        //TODO check whether this works else
+        // this.linePositions[0] = this.Cursor.transform.position;
         SetPosition(0, GadgetBehaviour.Cursor.transform.position);
 
         //Raycast upwoard
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/Remover.cs b/Assets/Scripts/InteractionEngine/Gadgets/Remover.cs
index 355bedead12e5053d22275d3bf1cb6419632f83b..fe28c6689066565c9b9952459f3997db9edb1092 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/Remover.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/Remover.cs
@@ -9,14 +9,18 @@ public class Remover : Gadget
     [Newtonsoft.Json.JsonProperty]
     protected static new string s_type = "Remover";
 
-    public override void _Hit(RaycastHit hit)
+
+    public override void _Hit(RaycastHit[] hit)
     {
-        string hid = hit.transform.GetComponent<FactObject>()?.URI;
+        // It's probably better to keep this only on the first hit and not multiple hits
+        string hid = hit[0].transform.GetComponent<FactObject>()?.URI;
         if (hid == null) return;
 
         Workflow.Add(hid);
         StageStatic.stage.factState.Remove(Workflow[0], samestep: false, gadget: this);
 
+
         ResetGadget();
+
     }
 }
diff --git a/Assets/Scripts/InteractionEngine/Gadgets/Tape.cs b/Assets/Scripts/InteractionEngine/Gadgets/Tape.cs
index c7d40a617c63d902dc7d5ac7aa67a2290e81e152..9e3495458eaf6b8e9dc5f4df463d172cdfe01860 100644
--- a/Assets/Scripts/InteractionEngine/Gadgets/Tape.cs
+++ b/Assets/Scripts/InteractionEngine/Gadgets/Tape.cs
@@ -13,19 +13,19 @@ public class Tape : Gadget
     private readonly Vector3[] LineOrigin = new Vector3[1];
 
 
-    public override void _Hit(RaycastHit hit)
+    public override void _Hit(RaycastHit[] hit)
     {
-        if (hit.transform.gameObject.layer != LayerMask.NameToLayer("Point"))
+        if (hit[0].transform.gameObject.layer != LayerMask.NameToLayer("Point"))
             return;
 
-        string tempFactId = hit.transform.GetComponent<FactObject>().URI;
+        string tempFactId = hit[0].transform.GetComponent<FactObject>().URI;
         if (!Workflow.Contains(tempFactId))
             Workflow.Add(tempFactId);
 
         switch (Workflow.Count)
         {
             case 1:
-                LineOrigin[0] = hit.transform.position;
+                LineOrigin[0] = hit[0].transform.position;
                 ActivateLineDrawing();
                 break;
 
@@ -33,6 +33,7 @@ public override void _Hit(RaycastHit hit)
                 FactManager.AddLineFact(Workflow[0], Workflow[1], gadget: this);
                 ResetGadget();
                 return;
+
         }
     }
 
diff --git a/Assets/Scripts/InteractionEngine/WorldCursor.cs b/Assets/Scripts/InteractionEngine/WorldCursor.cs
index ab79abbd80a6cea41ecb8f5ed9eb643aaf42283f..0a2e1c9d4b55a6f6e03d5b4b14a84e70eb4fb5f2 100644
--- a/Assets/Scripts/InteractionEngine/WorldCursor.cs
+++ b/Assets/Scripts/InteractionEngine/WorldCursor.cs
@@ -7,10 +7,16 @@
 using UnityEngine.EventSystems;
 using static GadgetBehaviour;
 using UnityEngine.InputSystem;
+//TODO check whether this can be deleted 
+//using System.Linq;
+//using static GadgetManager;
 
 public class WorldCursor : MonoBehaviour
 {
     public RaycastHit Hit;
+    // TODO experimentell for multiple hits
+    public RaycastHit[] MultipleHits;
+
     public string deactivateSnapKey;
     private Camera Cam;
     private int layerMask;
@@ -40,6 +46,11 @@ public void setLayerMask(int layerMask)
         this.layerMask = layerMask;
     }
 
+
+
+    // working currently to include multiple hits 
+    // TODO 
+
     void Update()
     {
         updateMaxRange();
@@ -64,37 +75,189 @@ void Update()
             && UIconfig.InputManagerVersion <= 3;
         //************************************************
 
-        if (Physics.Raycast(ray, out Hit, MaxRange_, layerMask)
-            || (MaxRange_ <= GlobalBehaviour.GadgetPhysicalDistance
-            && Physics.Raycast(transform.position, Vector3.down, out Hit, GlobalBehaviour.GadgetPhysicalDistance, layerMask)))
+
+        // in case we dont hit anything, just return
+        if (!(Physics.Raycast(ray, out Hit, MaxRange, layerMask)
+            || (MaxRange <= GlobalBehaviour.GadgetPhysicalDistance
+            && Physics.Raycast(transform.position, Vector3.down, out Hit, GlobalBehaviour.GadgetPhysicalDistance, layerMask))))
+            return;
+
+        if (UIconfig.InputManagerVersion == 1)
+            Input.GetButton(this.deactivateSnapKey);
+
+        RaycastHit[] multipleHits = Physics.RaycastAll(ray, MaxRange, layerMask);
+        if (multipleHits.Length == 0)
+            multipleHits = Physics.RaycastAll(transform.position, Vector3.down, GlobalBehaviour.GadgetPhysicalDistance, layerMask);
+
+
+
+        // sort multipleHits, so the first hit is still the closest 
+        for (int i = 0; i < multipleHits.Length; i++)
         {
-            if (UIconfig.InputManagerVersion == 1)
-                Input.GetButton(this.deactivateSnapKey);
+            int minIdx = i;
+            float minValue = multipleHits[i].distance;
 
-            if ((Hit.collider.transform.CompareTag("SnapZone") || Hit.collider.transform.CompareTag("Selectable"))
-              && !deactSnapKey)
-                if (Hit.transform.TryGetComponent<FactObject>(out var obj)
-                    && StageStatic.stage.factState[obj.URI] is AbstractLineFact lineFact)
+            for (int j = i; j < multipleHits.Length; j++)
+            {
+                if (multipleHits[j].distance < minValue)
                 {
-                    PointFact p1 = StageStatic.stage.factState[lineFact.Pid1] as PointFact;
-                    Hit.point = Math3d.ProjectPointOnLine(p1.Point, lineFact.Dir, Hit.point);
+                    minIdx = j;
+                    minValue = multipleHits[j].distance;
+                }
+
+            }
+
+            RaycastHit buffer = multipleHits[minIdx];
+            multipleHits[minIdx] = multipleHits[i];
+            multipleHits[i] = buffer;
+
+        }
+
+
+        for (int i = 0; i < multipleHits.Length; i++)
+        {
+
+            // check whether we actually hit something 
+            if (!((multipleHits[i].collider.transform.CompareTag("SnapZone") || multipleHits[i].collider.transform.CompareTag("Selectable"))
+                && (!deactSnapKey)))
+                continue;
+    
+            //TODO see whether the conditions needs to be adjusted
+            //if (Hit.transform.TryGetComponent<FactObject>(out var obj)
+            //        && StageStatic.stage.factState[obj.URI] is AbstractLineFact lineFact)
+
+            if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Ray")
+                || multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Line"))
+            {
+                var id = multipleHits[i].collider.gameObject.GetComponent<FactObject>().URI;
+                AbstractLineFact lineFact = StageStatic.stage.factState[id] as AbstractLineFact;
+                PointFact p1 = StageStatic.stage.factState[lineFact.Pid1] as PointFact;
+
+                multipleHits[i].point = Math3d.ProjectPointOnLine(p1.Point, lineFact.Dir, multipleHits[i].point);
+            }
+            else if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Ring"))
+            {
+                #region Ring
+                var id = multipleHits[i].transform.GetComponent<FactObject>().URI;
+                CircleFact circleFact = StageStatic.stage.factState[id] as CircleFact;
+                Vector3 middlePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid1]).Point;
+                Vector3 edgePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid2]).Point;
+                var normal = circleFact.normal;
+                var radius = circleFact.radius;
+
+                // project p on circlePlane
+                var q = multipleHits[i].point - middlePoint;
+                var dist = Vector3.Dot(q, normal);
+                var pPlane = multipleHits[i].point - (normal * dist); // p on circlePlane
+
+                // check if projectedPoint and circleCenter are identical
+                // should never happen in practice due to floating point precision
+                if (pPlane == middlePoint)
+                {
+                    // can be set to any point on the ring -> set to edgePoint
+                    multipleHits[i].point = edgePoint;
+                    return;
+
                 }
                 else
                 {
-                    Hit.point = Hit.collider.transform.position;
-                    Hit.normal = Vector3.up;
+                    var direction = (pPlane - middlePoint).normalized;
+                    multipleHits[i].point = middlePoint + direction * radius;
                 }
 
-            transform.up = Hit.normal;
-            transform.position = Hit.point + .01f * Hit.normal;
 
-            //Link to CheckMouseButtonHandler
-            if (whichCheckMouseButton == 0) { CheckMouseButtons(); }
-            if (whichCheckMouseButton == 1) { CheckMouseButtons1(); }
+                // cursor orientation should match circle orientation; dont face downwards
+                if (normal.y < 0) // if normal faces downwards use inverted normal instead
+                    multipleHits[i].normal = -normal;
+                else
+                    multipleHits[i].normal = normal;
+                #endregion Ring
+            }
+            else if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Circle"))
+            {
+                #region Circle
+                var id = multipleHits[i].transform.GetComponent<FactObject>().URI;
+                CircleFact circleFact = StageStatic.stage.factState[id] as CircleFact;
+                Vector3 middlePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid1]).Point;
+                Vector3 edgePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid2]).Point;
+                var normal = circleFact.normal;
+                var radius = circleFact.radius;
+
+                // project p on circlePlane
+                var q = multipleHits[i].point - middlePoint;
+                var dist = Vector3.Dot(q, normal);
+                var pPlane = multipleHits[i].point - (normal * dist); // p on circlePlane
+                multipleHits[i].point = pPlane;
+
+                // cursor orientation should match circle orientation; dont face downwards
+                if (normal.y < 0) // if normal faces downwards use inverted normal instead
+                    multipleHits[i].normal = -normal;
+                else
+                    multipleHits[i].normal = normal;
+                #endregion Circle
+            }
+            else
+            {
+                multipleHits[i].point = multipleHits[i].collider.transform.position;
+                multipleHits[i].normal = Vector3.up;
+            }
+
+            // checking for 2 lines intersection point
+            if (!((Mathf.Abs(multipleHits[i].distance - multipleHits[0].distance) < 0.03)
+                && (multipleHits.Length > 1)
+                && (Mathf.Abs(multipleHits[1].distance - multipleHits[0].distance) < 0.03)))
+                continue;
+            // we probably have two objects intersecting 
+
+            
+            // check for line x line intersection and if they actually intersect adjust the points coordinates :)
+            if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Ray")
+                && multipleHits[0].collider.gameObject.layer == LayerMask.NameToLayer("Ray"))
+            {
+
+                // case for two intersecting rays 
+                var idLine0 = multipleHits[0].collider.gameObject.GetComponent<FactObject>().URI;
+                var id = multipleHits[i].collider.gameObject.GetComponent<FactObject>().URI;
+
+                // get the two corresponding line facts
+                AbstractLineFact lineFactLine0 = StageStatic.stage.factState[idLine0] as AbstractLineFact;
+                AbstractLineFact lineFact = StageStatic.stage.factState[id] as AbstractLineFact;
+
+                // get a point on the line 
+                PointFact p1Line0 = StageStatic.stage.factState[lineFactLine0.Pid1] as PointFact;
+                PointFact p1 = StageStatic.stage.factState[lineFact.Pid1] as PointFact;
+
+                // get the intersection point and if it actually intersects set it
+                Vector3 intersectionPoint = Vector3.zero;
+ 
+                if (Math3d.LineLineIntersection(out intersectionPoint, p1Line0.Point, lineFactLine0.Dir, p1.Point, lineFact.Dir))
+                    multipleHits[i].point = intersectionPoint;
+
+
+            }
+            //check for other types of intersection. Future Work
+
+            
 
         }
+
+        transform.up = multipleHits[0].normal ;
+        //TODO check whether this is needed
+        //if (!((multipleHits[0].collider.transform.CompareTag("SnapZone") || multipleHits[0].collider.transform.CompareTag("Selectable"))
+        //      && !Input.GetButton(this.deactivateSnapKey)))
+        //    transform.position += .01f * multipleHits[0].normal;
+
+        transform.position = multipleHits[0].point + .01f * multipleHits[0].normal;
+        this.MultipleHits = multipleHits;
+
+
+        //Link to CheckMouseButtonHandler
+        if (whichCheckMouseButton == 0) { CheckMouseButtons(); }
+        if (whichCheckMouseButton == 1) { CheckMouseButtons1(); }
+            
     }
 
+
     void updateMaxRange()
     {
         switch (UIconfig.GameplayMode)
@@ -111,6 +274,7 @@ void updateMaxRange()
                 break;
         }
 
+
         MaxRange_ = UIconfig.interactingRangeMode switch
         {
             UIconfig.InteractingRangeMode.fromObserverView =>
@@ -118,29 +282,38 @@ void updateMaxRange()
             UIconfig.InteractingRangeMode.fromCharacterView or _ =>
                 MaxRange,
         };
+
     }
 
+
+
+
+
     //Check if left Mouse-Button was pressed and handle it
     void CheckMouseButtons()
     {
         if (Input.GetMouseButtonDown(0)
          && !EventSystem.current.IsPointerOverGameObject() //this prevents rays from shooting through ui
          && Hit.transform.gameObject.layer != LayerMask.NameToLayer("Water")) // not allowed to meassure on water
-            CommunicationEvents.TriggerEvent.Invoke(Hit);
+            CommunicationEvents.TriggerEvent.Invoke(MultipleHits);
     }
 
     //Check if left Mouse-Button was pressed and handle it
     //Alternative Version
     void CheckMouseButtons1(bool OnSnap = false, bool onLine = false)
     {
+        //TODO edit for the multiple hits. Right now it only checks the first hit
+
         if (Input.GetMouseButtonDown(0) && checkClickPermission())
-        {
+        { 
+
             //other Things todo first?
             if (Hit.collider.transform.CompareTag("NPC1_text") && UIconfig.nextDialogPlease < 2)
             {
                 UIconfig.nextDialogPlease++;
             }
 
+
             //if (EventSystem.current.IsPointerOverGameObject()) return; //this prevents rays from shooting through ui
 
             if (IsPointerOverUIObject()) return; //Needed for Android
@@ -148,14 +321,15 @@ void CheckMouseButtons1(bool OnSnap = false, bool onLine = false)
             //if (Hit.transform.gameObject.layer == LayerMask.NameToLayer("TransparentFX")) return; // not allowed to meassure on TransparentFX
             if (!OnSnap)
             {
-                CommunicationEvents.TriggerEvent.Invoke(Hit);
+                CommunicationEvents.TriggerEvent.Invoke(MultipleHits);
             }
             else if (GadgetBehaviour.ActiveGadget is Pointer)
             {
                 if (!onLine) Hit.collider.enabled = false;
-                CommunicationEvents.TriggerEvent.Invoke(Hit);
+                CommunicationEvents.TriggerEvent.Invoke(MultipleHits);
                 //    CommunicationEvents.SnapEvent.Invoke(Hit);
             }
+
         }
     }
 
diff --git a/Assets/Scripts/InventoryStuff/DisplayFacts.cs b/Assets/Scripts/InventoryStuff/DisplayFacts.cs
index d1bedf7667c2d8be6f0b66dd7fbf4608ce04c4a5..ebd985102ffd8b0fa2cd7b4b1fec075313c235c3 100644
--- a/Assets/Scripts/InventoryStuff/DisplayFacts.cs
+++ b/Assets/Scripts/InventoryStuff/DisplayFacts.cs
@@ -10,13 +10,38 @@ public class DisplayFacts : MonoBehaviour
 
     public Dictionary<string, GameObject> displayedFacts = new();
 
+    public Transform factscreenContent;
+
+    [Header("FactPrefabs")]
     public GameObject prefab_Point;
     public GameObject prefab_Distance;
     public GameObject prefab_Angle;
     public GameObject prefab_Default;
     public GameObject prefab_OnLine;
     public GameObject prefab_Line;
+    public GameObject prefab_ParallelLineFact;
+    public GameObject prefab_RectangleFact;
+    public GameObject prefab_RadiusFact;
+    public GameObject prefab_AreaCircle;
+    public GameObject prefab_ConeVolume;
+    public GameObject prefab_OrthogonalCircleLine;
+    public GameObject prefab_TruncatedConeVolume;
+    public GameObject prefab_RightAngle;
+    public GameObject prefab_CylinderVolume;
+    public GameObject prefab_EqualFact;
+    public GameObject prefab_UnEqualFact;
+
+    public GameObject prefab_TestFact;
+
+
+
+
+
+    public GameObject prefab_CircleFact;
+    public GameObject prefab_OnCircleFact;
+    public GameObject prefab_AngleCircleLineFact;
 
+    [Header("Visualisation")]
     public int x_Start;
     public int y_Start;
     public int X_Pacece_Between_Items;
@@ -31,12 +56,31 @@ void Start()
             {typeof(LineFact), prefab_Distance},
             {typeof(RayFact), prefab_Line},
             {typeof(AngleFact), prefab_Angle},
-            {typeof(OnLineFact), prefab_OnLine}
+            {typeof(OnLineFact), prefab_OnLine},
+            {typeof(ParallelLineFact), prefab_ParallelLineFact},
+
+            {typeof(CircleFact), prefab_CircleFact},
+            {typeof(OnCircleFact), prefab_OnCircleFact},
+            {typeof(AngleCircleLineFact), prefab_AngleCircleLineFact},
+            {typeof(RadiusFact), prefab_RadiusFact},
+            {typeof(AreaCircleFact), prefab_AreaCircle},
+            {typeof(ConeVolumeFact), prefab_ConeVolume},
+            {typeof(OrthogonalCircleLineFact), prefab_OrthogonalCircleLine },
+            {typeof(TruncatedConeVolumeFact), prefab_TruncatedConeVolume },
+            {typeof(RightAngleFact), prefab_RightAngle },
+            {typeof(CylinderVolumeFact), prefab_CylinderVolume},
+            {typeof(EqualCirclesFact), prefab_EqualFact },
+            {typeof(UnEqualCirclesFact), prefab_UnEqualFact },
+
+            {typeof(TestFact), prefab_TestFact },
+
+
+
         };
 
         var rect = GetComponent<RectTransform>();
         x_Start = (int)(rect.rect.x + X_Pacece_Between_Items * .5f);
-        y_Start = (int)(-rect.rect.y - y_Pacece_Between_Items * .5f);//);
+        y_Start = (int)(-y_Pacece_Between_Items * .5f);
         number_of_Column = Mathf.Max(1, (int)(rect.rect.width / prefab_Point.GetComponent<RectTransform>().rect.width) - 1);
 
         AddFactEvent.AddListener(AddFact);
@@ -46,8 +90,12 @@ void Start()
 
     public void AddFact(Fact fact) {
         var obj = CreateDisplay(transform, fact);
-        obj.GetComponent<RectTransform>().localPosition = GetPosition(displayedFacts.Count);
+        var rect = obj.GetComponent<RectTransform>();
+        rect.anchorMin = new Vector2(0.5f, 1);
+        rect.anchorMax = new Vector2(0.5f, 1);
+        rect.localPosition = GetPosition(displayedFacts.Count);
         displayedFacts.Add(fact.Id, obj);
+        AdjustFactscreenContentHeight();
     }
 
     public void RemoveFact(Fact fact)
@@ -55,6 +103,7 @@ public void RemoveFact(Fact fact)
         GameObject.Destroy(displayedFacts[fact.Id]);
         displayedFacts.Remove(fact.Id);
         UpdatePositions();
+        AdjustFactscreenContentHeight();
     }
 
     public void UpdatePositions()
@@ -71,7 +120,7 @@ public void AnimateFact(Fact fact) {
 
     private GameObject CreateDisplay(Transform transform, Fact fact)
     {
-        return fact.instantiateDisplay(prefabDictionary[fact.GetType()], transform);
+        return fact.instantiateDisplay(prefabDictionary[fact.GetType()], factscreenContent);
     }
 
     public Vector3 GetPosition(int i)
@@ -79,4 +128,10 @@ public Vector3 GetPosition(int i)
         return new Vector3(x_Start + (X_Pacece_Between_Items * (i % number_of_Column)), y_Start + (-y_Pacece_Between_Items * (i / number_of_Column)), 0f);
     }
 
+    private void AdjustFactscreenContentHeight()
+    {
+        var rect = factscreenContent.GetComponent<RectTransform>();
+        var height = (float)(y_Pacece_Between_Items * Math.Ceiling(((float)displayedFacts.Count / number_of_Column)));
+        rect.sizeDelta = new Vector2(rect.sizeDelta.x, height);
+    }
 }
diff --git a/Assets/Scripts/InventoryStuff/DisplayScrolls.cs b/Assets/Scripts/InventoryStuff/DisplayScrolls.cs
index dce0623d38197a3227a8269923d2592512f75de3..06dd4383778fa70370f6329073dcfdb3b2056bd5 100644
--- a/Assets/Scripts/InventoryStuff/DisplayScrolls.cs
+++ b/Assets/Scripts/InventoryStuff/DisplayScrolls.cs
@@ -18,6 +18,11 @@ public class DisplayScrolls : MonoBehaviour
     public GameObject ScrollPrefab;
     public GameObject DetailScreen;
 
+
+    public Transform scrollscreenContent;
+
+
+
     public int x_Start;
     public int y_Start;
     public int X_Pacece_Between_Items;
@@ -27,7 +32,8 @@ public class DisplayScrolls : MonoBehaviour
 
     public Vector3 GetPosition(int i)
     {
-        return new Vector3(x_Start + (X_Pacece_Between_Items * (i % number_of_Column)), y_Start + (-y_Pacece_Between_Items * (i / number_of_Column)), 0f);
+        //return new Vector3(x_Start + (X_Pacece_Between_Items * (i % number_of_Column)), y_Start + (-y_Pacece_Between_Items * (i / number_of_Column)), 0f);
+        return Vector3.zero;
     }
 
     // Start is called before the first frame update
@@ -102,9 +108,10 @@ void BuildScrolls(string jsonString)
 
         ScrollButtons = new GameObject[AllowedScrolls.Count()];
         //Build Selection-GUI of Scrolls
+
         for (int i = 0; i < AllowedScrolls.Count; i++)
-        {
-            var obj = Instantiate(ScrollPrefab, Vector3.zero, Quaternion.identity, transform);
+        {          
+            var obj = Instantiate(ScrollPrefab, Vector3.zero, Quaternion.identity, scrollscreenContent);
             obj.GetComponent<RectTransform>().localPosition = GetPosition(i);
             obj.GetComponent<ScrollClickedScript>().scroll = AllowedScrolls[i];
             obj.GetComponent<ScrollClickedScript>().DetailScreen = this.DetailScreen;
diff --git a/Assets/Scripts/InventoryStuff/DragHandling.cs b/Assets/Scripts/InventoryStuff/DragHandling.cs
index 878cc591d30553d33a2737d37226339bf4411900..8b51c3751be844dceefc13090ebd7cdd47b7dab6 100644
--- a/Assets/Scripts/InventoryStuff/DragHandling.cs
+++ b/Assets/Scripts/InventoryStuff/DragHandling.cs
@@ -4,34 +4,30 @@
 public class DragHandling : MonoBehaviour, IDragHandler, IEndDragHandler
 {
     private Vector3 StartingPosition;
+    private Transform StartingParent;
     private bool dragged = false;
     public void OnDrag(PointerEventData eventData)
     {
         if (!dragged)
         {
             StartingPosition = transform.localPosition;
+            StartingParent = transform.parent;
             GetComponent<CanvasGroup>().blocksRaycasts = false;
             dragged = true;
         }
         transform.position = Input.mousePosition;
+
+        // display dragged object in front of all other ui
+        transform.SetParent(GetComponentInParent<Canvas>().transform, false);
+        transform.SetAsLastSibling();
     }
 
     public void OnEndDrag(PointerEventData eventData)
     {
+        transform.SetParent(StartingParent, false);
         transform.localPosition = StartingPosition;
         GetComponent<CanvasGroup>().blocksRaycasts = true;
         dragged = false;
 
-    }
-    // Start is called before the first frame update
-    void Start()
-    {
-
-    }
-
-    // Update is called once per frame
-    void Update()
-    {
-
     }
 }
diff --git a/Assets/Scripts/InventoryStuff/DropHandling.cs b/Assets/Scripts/InventoryStuff/DropHandling.cs
index ca5985ed1c3efe05528c4dd1b55886c8d06cf001..e912243aa183b6682d4353fe2dfa49bb3482e737 100644
--- a/Assets/Scripts/InventoryStuff/DropHandling.cs
+++ b/Assets/Scripts/InventoryStuff/DropHandling.cs
@@ -24,10 +24,16 @@ public void OnDrop(PointerEventData eventData)
 
         current.transform.SetParent(gameObject.transform, false);
 
+        var rect = current.GetComponent<RectTransform>();
+        rect.anchorMin = new Vector2(0.5f, 0.5f);
+        rect.anchorMax = new Vector2(0.5f, 0.5f);
+
         currentFact = eventData.pointerDrag.GetComponent<FactWrapper>().fact;
         Debug.Log("recieved Fact: " + currentFact.Id);
 
         CommunicationEvents.NewAssignmentEvent.Invoke();
+      
+
     }
 
     public void OnPointerClick(PointerEventData eventData)
diff --git a/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png b/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e3e4deaf1c17adc153f1dc196cffe1361057353
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e85ea7a99252d5223b9c74eac532fd64716199578d5eaec3977915ba89f3d595
+size 9080
diff --git a/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png.meta b/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..4381388c8a780fd6ef58796a6ea0fda5a2d07e0a
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/AreaCircle.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: d03f90cb79e6fba4fb25edaf74ffeadd
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Circle.png b/Assets/Scripts/InventoryStuff/Items/images/Circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..aae726f0f85bda8c999c466bbd4af2751a34e72e
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Circle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69791f0db2f6778048742adfd02de9d1e894b06ddcfe8fd35948155531d8f89d
+size 4780
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Circle.png.meta b/Assets/Scripts/InventoryStuff/Items/images/Circle.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..63ba70f33b10d6dd528aab8a2276cee3ee3b4a29
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Circle.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 65d7b0853e3ee4845afbb16904fd7e11
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png b/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf50bf040408f881dac1de7382c5f5e84fcfc7dd
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4af053404a9ea5d779c7609289aa90e853ed0c21b31d7e06ec935be67c877332
+size 9099
diff --git a/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png.meta b/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..6b2fafcdb0be03998bb23f00b1c66556127379bf
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/ConeVolume.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: f580ba9d4e3825d49a5a7907d2a3f0c1
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png b/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9e8a3bed314715a92181a994eb1ba54a4edfb12
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d87a4e68d06f0b893cac704db6dae0028e96f580973a64c51c7391be4060e348
+size 9110
diff --git a/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png.meta b/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..968784df09d3e23fed88191f5a968216b38747b3
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/CylinderVolume.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 352d7dd2edb65f542aba25be27d20d98
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png b/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c7447ff8c20b06f4275c30cbfd4162fa23be354
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png	
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:343b28be0e1236cd895db0cb649cdabc190184380c8d533ac8ed7b2e972547d9
+size 4195
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png.meta b/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..5d644fd95fb514899322b12933ae8cde679ffc14
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Equal circles.png.meta	
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: ad920a8c90fd4c74ba95809d3e14e6b7
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png b/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png
new file mode 100644
index 0000000000000000000000000000000000000000..81f9e621388f46adac2e3c9ae62ca44cceb34717
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b070fe424d90287456de9336e3a0e24d0bcf641979ffd6461716ec33ef4a121
+size 5597
diff --git a/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png.meta b/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..851ff575ff9508e6505069c1d41d800a2740af54
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/EqualCircles.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: e35797aede3d7bd449ca9195a409b0cc
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/On Circle.png b/Assets/Scripts/InventoryStuff/Items/images/On Circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e18d6b82486f3e89fd580789e1ce8da0a686111
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/On Circle.png	
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:919d2f4899174eef5894ae5fbf4829a0e5d586bace0e91fd72d740be6d080151
+size 4889
diff --git a/Assets/Scripts/InventoryStuff/Items/images/On Circle.png.meta b/Assets/Scripts/InventoryStuff/Items/images/On Circle.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..911305b050211ac015e57944168adc30c92e14ba
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/On Circle.png.meta	
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 6c88ce550ca6bd043a12bf7604475ded
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 2
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 200
+        height: 200
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/OnLine.png.meta b/Assets/Scripts/InventoryStuff/Items/images/OnLine.png.meta
index 87866e9850843eb42cd01230430fd75f0c0d93d7..3af22541626da43d6a87021f0b05a9b6308caf63 100644
--- a/Assets/Scripts/InventoryStuff/Items/images/OnLine.png.meta
+++ b/Assets/Scripts/InventoryStuff/Items/images/OnLine.png.meta
@@ -1,9 +1,9 @@
 fileFormatVersion: 2
 guid: 0b5fd1ea5a3b1a74588f605621176b6a
 TextureImporter:
-  fileIDToRecycleName: {}
+  internalIDToNameTable: []
   externalObjects: {}
-  serializedVersion: 9
+  serializedVersion: 11
   mipmaps:
     mipMapMode: 0
     enableMipMap: 0
@@ -23,6 +23,7 @@ TextureImporter:
   isReadable: 0
   streamingMipmaps: 0
   streamingMipmapsPriority: 0
+  vTOnly: 0
   grayScaleToAlpha: 0
   generateCubemap: 6
   cubemapConvolution: 0
@@ -31,12 +32,12 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: -1
-    aniso: -1
-    mipBias: -100
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
     wrapU: 1
     wrapV: 1
-    wrapW: -1
+    wrapW: 0
   nPOTScale: 0
   lightmap: 0
   compressionQuality: 50
@@ -54,11 +55,15 @@ TextureImporter:
   textureType: 8
   textureShape: 1
   singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
   maxTextureSizeSet: 0
   compressionQualitySet: 0
   textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 1
   platformSettings:
-  - serializedVersion: 2
+  - serializedVersion: 3
     buildTarget: DefaultTexturePlatform
     maxTextureSize: 2048
     resizeAlgorithm: 0
@@ -69,7 +74,8 @@ TextureImporter:
     allowsAlphaSplitting: 0
     overridden: 0
     androidETC2FallbackOverride: 0
-  - serializedVersion: 2
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
     buildTarget: Standalone
     maxTextureSize: 2048
     resizeAlgorithm: 0
@@ -80,6 +86,7 @@ TextureImporter:
     allowsAlphaSplitting: 0
     overridden: 0
     androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
   spriteSheet:
     serializedVersion: 2
     sprites: []
@@ -87,10 +94,12 @@ TextureImporter:
     physicsShape: []
     bones: []
     spriteID: 70ef2cb5a2d7bb147968b109ffa4e6bf
+    internalID: 0
     vertices: []
     indices: 
     edges: []
     weights: []
+    secondaryTextures: []
   spritePackingTag: 
   pSDRemoveMatte: 0
   pSDShowRemoveMatteOption: 0
diff --git a/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png b/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png
new file mode 100644
index 0000000000000000000000000000000000000000..57367c5d2bfa6e873feed5bae1b852d51be25e4b
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d44ef6d2acf45c4f4da99f4ef4a6523b19b6b51ce3f8393d7a6378492287cff9
+size 3922
diff --git a/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png.meta b/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..cacba56f161b4f1196fa4dbc8b8bb78e6f0d0a83
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/OrthogonalCircleLineAngle.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 66ba1c16426bcaf49baab37f47c67b47
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 200
+        height: 200
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 1}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png b/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png
new file mode 100644
index 0000000000000000000000000000000000000000..948d2d376f42e0a63b718b0ef67d8f15fe63369d
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cc4b1052ed71a0d5dfce97e5d38a15ee6fbfcc0efa9f23d26450e54fce87569
+size 2777
diff --git a/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png.meta b/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..3b652cd520d3b5fcde7e726436194519e5a3b89f
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/ParallelLineFact.png.meta
@@ -0,0 +1,108 @@
+fileFormatVersion: 2
+guid: bd545eec2c7bdde42957def5c75b4de8
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 0
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png b/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png
new file mode 100644
index 0000000000000000000000000000000000000000..194b33d7a2b45170425f4ce361f190ab7acdc1e7
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1d35fc05096e4a16ed6f1b6937509f9016862cbd0c16dade9630a97f92af0d1
+size 4896
diff --git a/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png.meta b/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..c1ac6ee7573d50bd3b39893cbaac24363323ad89
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/RadiusFactpic.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: b85e914ced337ad4bbc40ad74c37da14
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png b/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png
new file mode 100644
index 0000000000000000000000000000000000000000..32499d04bc04533dbe25164c16a7dbc428ccffc4
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17da7178bb5414afc5524d7ae48c3f897c6ddffe167e8805b11c02eb261e0715
+size 4990
diff --git a/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png.meta b/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..8924249376195c4871fb4dfe857c836fcaa40de9
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/RightAngle.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 2f972a9b017f79a43a7e95eeddebd66b
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Square 1.png b/Assets/Scripts/InventoryStuff/Items/images/Square 1.png
new file mode 100644
index 0000000000000000000000000000000000000000..de8b287e5cdd1960d00e9ff29a3b04240b3096c2
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Square 1.png	
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44f9592db7d11d11ed58c7cad12e35925d9974d6576fb0951b4fa0cd7c6eaf10
+size 2097
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Square 1.png.meta b/Assets/Scripts/InventoryStuff/Items/images/Square 1.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..bb617e1c47083117972bb9d5a7a601a7a608250d
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Square 1.png.meta	
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 38e2fa15ef15b6443a43f2b04c6475e1
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 2
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Square.png b/Assets/Scripts/InventoryStuff/Items/images/Square.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e18d6b82486f3e89fd580789e1ce8da0a686111
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Square.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:919d2f4899174eef5894ae5fbf4829a0e5d586bace0e91fd72d740be6d080151
+size 4889
diff --git a/Assets/Scripts/InventoryStuff/Items/images/Square.png.meta b/Assets/Scripts/InventoryStuff/Items/images/Square.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..e461df4f5ab762b50a67ca4414144142caf3e98c
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/Square.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 95d8fa087e815214dbf6e4d75891106f
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 2
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png b/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c9f437f21a4542bdca09cf0b6729794571bb7d9
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c21b505f16efe44a3ee171d3f386caf739609c3d289cb877879c16543abdeb18
+size 10296
diff --git a/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png.meta b/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1be7c88768c705ba2118c77b87b2d4d598f9c62c
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/TruncatedConeVolume.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: fde0a14086151274a9d464a3d51c5e0f
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png b/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png
new file mode 100644
index 0000000000000000000000000000000000000000..e02ce064b42778cfbd2723ed74948444ae74559a
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:52c24e7bc4c60fe36a9ee12a15014f727118c73878924eb476910a510afcdbdf
+size 4418
diff --git a/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png.meta b/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png.meta
new file mode 100644
index 0000000000000000000000000000000000000000..e2d5580e947f42d0ca4c8d1363f5d3fd6674a6de
--- /dev/null
+++ b/Assets/Scripts/InventoryStuff/Items/images/UnEqualCircles.png.meta
@@ -0,0 +1,160 @@
+fileFormatVersion: 2
+guid: 269651011d5ec79458964edbef59ae70
+TextureImporter:
+  internalIDToNameTable:
+  - first:
+      213: 7482667652216324306
+    second: Square
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 256
+  spriteBorder: {x: 4, y: 4, z: 4, w: 4}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: 0
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: iPhone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites:
+    - serializedVersion: 2
+      name: Square
+      rect:
+        serializedVersion: 2
+        x: 0
+        y: 0
+        width: 256
+        height: 256
+      alignment: 0
+      pivot: {x: 0.5, y: 0.5}
+      border: {x: 0, y: 0, z: 0, w: 0}
+      outline: []
+      physicsShape: []
+      tessellationDetail: 0
+      bones: []
+      spriteID: 2d009a6b596c7d760800000000000000
+      internalID: 7482667652216324306
+      vertices: []
+      indices: 
+      edges: []
+      weights: []
+    outline: []
+    physicsShape:
+    - - {x: -128, y: 128}
+      - {x: -128, y: -128}
+      - {x: 128, y: -128}
+      - {x: 128, y: 128}
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/InventoryStuff/Scroll.cs b/Assets/Scripts/InventoryStuff/Scroll.cs
index 903564e8e1390442be7ce7f4d289079973c1e360..4b351ebd16a7778a9f73b2eb688015064db9b1cb 100644
--- a/Assets/Scripts/InventoryStuff/Scroll.cs
+++ b/Assets/Scripts/InventoryStuff/Scroll.cs
@@ -4,6 +4,7 @@
 using System.Collections.Generic;
 using static JSONManager;
 
+
 public class Scroll
 {
     public string @ref;
@@ -40,6 +41,8 @@ public abstract class ScrollFact
         public string label;
 
         public abstract String getType();
+
+        public abstract String getApplicant();
     }
 
     public class UriReference
@@ -69,6 +72,18 @@ public override String getType()
             else
                 return null;
         }
+
+        public override String getApplicant()
+        {
+            //Debug.Log(" Check " + this.tp is OMS + " and " + this.tp is OMA + " and " + this.tp is OMSTR + " or " + this.tp is OMF);
+            // return ((OMS)((OMA)((OMA)this.tp).arguments[0]).arguments[0]).uri;
+            if (this.df is OMA && ((OMA)this.df).applicant is OMS)
+                return ((OMS)((OMA)this.df).applicant).uri;
+            
+
+            return null ;// ((OMS)((OMA)((OMA)this.df).arguments[0]).applicant).uri;
+
+        }
     }
 
     /**
@@ -88,6 +103,14 @@ public override String getType()
             else
                 return null;
         }
+        public override String getApplicant()
+        {
+            // TODO Test this 
+            if (this.lhs is OMA & (((OMA)this.lhs).applicant is OMS))
+                return ((OMS)((OMA)this.lhs).applicant).uri;
+            return null; 
+        }
+
     }
 
     public class ScrollAssignment
diff --git a/Assets/Scripts/InventoryStuff/ScrollClickedScript.cs b/Assets/Scripts/InventoryStuff/ScrollClickedScript.cs
index 2dbf5d8de8db58dd33ef908163df295d4329e08c..a4316586ebf78d736b22feede12b933375a9982e 100644
--- a/Assets/Scripts/InventoryStuff/ScrollClickedScript.cs
+++ b/Assets/Scripts/InventoryStuff/ScrollClickedScript.cs
@@ -1,11 +1,12 @@
 using UnityEngine;
+using UnityEngine.EventSystems;
 
-public class ScrollClickedScript : MonoBehaviour
+public class ScrollClickedScript : MonoBehaviour, IPointerDownHandler
 {
     public Scroll scroll;
     public GameObject DetailScreen;
 
-    public void onClick()
+    public void OnPointerDown(PointerEventData eventData)
     {
         this.DetailScreen.GetComponent<ScrollDetails>().setScroll(this.scroll);
     }
diff --git a/Assets/Scripts/InventoryStuff/ScrollDetails.cs b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
index 8b99675fb6d120cdcee714dd48c7ada5eda6bdf4..4017be6b644d75c0d9265a8e55216095aac39d71 100644
--- a/Assets/Scripts/InventoryStuff/ScrollDetails.cs
+++ b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
@@ -75,6 +75,7 @@ IEnumerator magicButton()
         }
         else
         {
+            Debug.Log(currentMmtAnswer);
             Scroll.ScrollApplicationInfo pushout = JsonConvert.DeserializeObject<Scroll.ScrollApplicationInfo>(currentMmtAnswer);
             readPushout(pushout.acquiredFacts);
         }
@@ -93,9 +94,12 @@ IEnumerator newAssignment()
         if (currentMmtAnswer == null)
         {
             Debug.Log("DAS HAT NICHT GEKLAPPT");
+            
         }
         else
         {
+            // Todo delte maybe
+            Debug.Log("Current mmt answer:  "+currentMmtAnswer);
             Scroll.ScrollDynamicInfo scrollDynamicInfo = JsonConvert.DeserializeObject<Scroll.ScrollDynamicInfo>(currentMmtAnswer);
             processScrollDynamicInfo(scrollDynamicInfo);
         }
@@ -104,11 +108,22 @@ IEnumerator newAssignment()
     IEnumerator sendView(string endpoint)
     {
         string body = prepareScrollAssignments();
+        System.DateTime startTime = System.DateTime.UtcNow;
 
         using UnityWebRequest www = UnityWebRequest.Put(ServerAdress + endpoint, body);
         www.method = UnityWebRequest.kHttpVerbPOST;
         www.SetRequestHeader("Content-Type", "application/json");
         yield return www.SendWebRequest();
+        //TODO delete below if above works fine
+      //  UnityWebRequest www = UnityWebRequest.Put(ServerAdress + endpoint, body);
+      //  www.method = UnityWebRequest.kHttpVerbPOST;
+     //   www.SetRequestHeader("Content-Type", "application/json");
+     //   var async = www.SendWebRequest();
+     //   while (!async.isDone) {
+            //Non blocking wait for one frame, for letting the game do other things
+     //       yield return null;
+      //  }
+        System.DateTime twoTime = System.DateTime.UtcNow;
 
         if (www.result == UnityWebRequest.Result.ConnectionError 
          || www.result == UnityWebRequest.Result.ProtocolError)
@@ -119,9 +134,14 @@ IEnumerator sendView(string endpoint)
         else
         {
             string answer = www.downloadHandler.text;
-            Debug.Log(answer);
             currentMmtAnswer = answer;
         }
+        System.DateTime endTime = System.DateTime.UtcNow;
+
+        string diffInSeconds = (endTime -startTime).TotalMilliseconds.ToString();
+        string diff = (twoTime - startTime).TotalMilliseconds.ToString();
+
+
     }
 
     private string prepareScrollAssignments()
@@ -155,6 +175,11 @@ private void readPushout(List<Scroll.ScrollFact> pushoutFacts)
         bool samestep = false;
         for (int i = 0; i < pushoutFacts.Count; i++, samestep = true)
         {
+            //TODO Delete
+            //Debug.Log(pushoutFacts.Count);
+            //Debug.Log("StartUri " +pushoutFacts[i].getType()+ " over");
+            //Debug.Log("Applicant" + pushoutFacts[i].getApplicant() + " over");
+            string type = pushoutFacts[i].getType();
             Fact newFact = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()].Invoke(pushoutFacts[i]);
             if (newFact != null)
             {
@@ -214,6 +239,8 @@ public List<string> processRenderedScroll(Scroll rendered, List<string> hintUris
             //Check Hint Informations
             //If ScrollFact is assigned -> No Hint
             if (obj.transform.GetChild(0).GetComponent<DropHandling>().currentFact == null) {
+
+              //  Debug.Log(" print out " + rendered.requiredFacts[i].getType());
                 Fact currentFact = ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()].Invoke(rendered.requiredFacts[i]);
                 //If currentFact could be parsed: this fact maybe not yet exists in the global fact-list but there must be a fact
                 // of the same type and the same dependent facts in the fact-list, otherwise currentFact could not have been parsed
diff --git a/Assets/Scripts/JSONManager.cs b/Assets/Scripts/JSONManager.cs
index 5c75e5ded434533311ccb5c95f347eb55a2b8def..1d9b3f3cfbf65a563a3fc505f874f83de8e81bf9 100644
--- a/Assets/Scripts/JSONManager.cs
+++ b/Assets/Scripts/JSONManager.cs
@@ -4,23 +4,58 @@
 
 
 
+
 public static class JSONManager
 {
+   
+
     public static class MMTURIs
     {
-        public const string Tuple = "http://gl.mathhub.info/MMT/LFX/Sigma?Symbols?Tuple";
         public const string Point = "http://mathhub.info/MitM/core/geometry?3DGeometry?point";
+        public const string Tuple = "http://gl.mathhub.info/MMT/LFX/Sigma?Symbols?Tuple";
         public const string LineType = "http://mathhub.info/MitM/core/geometry?Geometry/Common?line_type";
         public const string LineOf = "http://mathhub.info/MitM/core/geometry?Geometry/Common?lineOf";
+
         public const string OnLine = "http://mathhub.info/MitM/core/geometry?Geometry/Common?onLine";
-        public const string Metric = "http://mathhub.info/MitM/core/geometry?Geometry/Common?metric";
-        public const string Angle = "http://mathhub.info/MitM/core/geometry?Geometry/Common?angle_between";
         public const string Ded = "http://mathhub.info/MitM/Foundation?Logic?ded";
         public const string Eq = "http://mathhub.info/MitM/Foundation?Logic?eq";
+        public const string Metric = "http://mathhub.info/MitM/core/geometry?Geometry/Common?metric";
+        public const string Angle = "http://mathhub.info/MitM/core/geometry?Geometry/Common?angle_between";
         public const string Sketch = "http://mathhub.info/MitM/Foundation?InformalProofs?proofsketch";
         public const string RealLit = "http://mathhub.info/MitM/Foundation?RealLiterals?real_lit";
+
+        public const string ParallelLine = "http://mathhub.info/MitM/core/geometry?Geometry/Common?parallelLine";
+        // public string RectangleFact = "http://mathhub.info/FrameIT/frameworld?FrameITRectangles?rectangleType";
+        //  public string RectangleFactmk = "http://mathhub.info/FrameIT/frameworld?FrameITRectangles?mkRectangle";
+
+        public const string CircleType3d = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?circleType3D";
+        public const string MkCircle3d = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?circle3D";
+        public const string TriangleMiddlePoint = "http://mathhub.info/FrameIT/frameworld?FrameITTriangles?triangleMidPointWrapper";
+        public const string RadiusCircleMetric = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?circleRadius";
+
+        public const string AreaCircle = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?areaCircle";
+        public const string VolumeCone = "http://mathhub.info/FrameIT/frameworld?FrameITCone?volumeCone";
+        public const string ConeOfCircleApex = "http://mathhub.info/FrameIT/frameworld?FrameITCone?circleConeOf";
+
+        public const string ParametrizedPlane = "http://mathhub.info/MitM/core/geometry?Planes?ParametrizedPlane";
+        public const string pointNormalPlane = "http://mathhub.info/MitM/core/geometry?Planes?pointNormalPlane";
+        public const string OnCircle = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?pointOnCircle";
+        public const string AnglePlaneLine = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?angleCircleLine";
+        public const string OrthoCircleLine = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?orthogonalCircleLine";
+
+        public const string TruncatedVolumeCone = "http://mathhub.info/FrameIT/frameworld?FrameITCone?truncatedConeVolume";
+        public const string CylinderVolume = "http://mathhub.info/FrameIT/frameworld?FrameITCylinder?cylinderVolume";
+        public const string EqualityCircles = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?equalityCircles";
+        public const string UnEqualityCircles = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?unequalityCircles";
+
+        public const string ParallelCircles = "http://mathhub.info/FrameIT/frameworld?FrameITCone?parallelCircles";
+        public const string RightAngle = "http://mathhub.info/FrameIT/frameworld?FrameITBasics?rightAngle";
+
+        public const string TestType = "http://mathhub.info/FrameIT/frameworld?FrameITCircle?xcircleType3D";
+
     }
 
+
     public class URI
     {
         public string uri;
@@ -47,6 +82,8 @@ public OMA(MMTTerm applicant, List<MMTTerm> arguments)
             this.applicant = applicant;
             this.arguments = arguments;
         }
+
+        
     }
 
     public class OMS : MMTTerm
diff --git a/Assets/Scripts/MeshGenerator.meta b/Assets/Scripts/MeshGenerator.meta
new file mode 100644
index 0000000000000000000000000000000000000000..89bb05c3cc8024bb76ff0c3f3adbd5e610971d52
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5b58b5e5719ff2c42b415975c4c578f6
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..34dd152c59c69f8486739673340754355b2f41de
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+
+public class CircleGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Circle values")]
+    [Range(0,100)] public Vector3 midPoint = Vector3.zero;
+    [Range(0,100)] public float radius = 1f;
+
+    [Header("Technical")]
+    [Range(3,1000)] public int sideCount = 500;
+
+    [Header("Parts")]
+    public MeshFilter circleMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        var circle = CreateCircle(radius, sideCount);
+
+        if (circleMesh.sharedMesh != null)
+            circleMesh.sharedMesh.Clear();
+        circleMesh.mesh = CreateMesh(circle);
+
+        if (circleMesh.transform.TryGetComponent(out MeshCollider meshCol))
+            meshCol.sharedMesh = circleMesh.sharedMesh;
+    }
+
+    /// <summary>
+    /// Creates circle vertecies and triangles around the midPoint at (0,0,0)
+    /// </summary>
+    /// <param name="points"></param>
+    /// <param name="invert"></param>
+    /// <returns></returns>
+    static (Vector3[], int[]) CreateCircle(float radius, int sideCount, bool invert = false)
+    {
+        Vector3[] vertices = GetCirclePoints(radius, sideCount).Union(new Vector3[] { Vector3.zero }).ToArray();
+        int[] triangles = new int[(vertices.Length - 1) * 3];
+        int vertLen = vertices.Length;
+        for (int i = 0; i < vertLen-1; i++)
+        {
+            triangles[i * 3 + 0] = vertLen-1; // midPoint
+            triangles[i * 3 + 1] = i;
+            triangles[i * 3 + 2] = (i + 1) % (vertLen-1);
+        }
+        return (vertices, invert ? triangles.Reverse().ToArray() : triangles);
+    }
+    #endregion Implementation
+}
diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta b/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..541b038577a6b0b8128bdf423ee60d7ebe14a7f1
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 405087c38b8537e43bcc99727c5325ec
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/CircleSegmentGenerator.cs b/Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs
similarity index 100%
rename from Assets/Scripts/CircleSegmentGenerator.cs
rename to Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs
diff --git a/Assets/Scripts/CircleSegmentGenerator.cs.meta b/Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs.meta
similarity index 100%
rename from Assets/Scripts/CircleSegmentGenerator.cs.meta
rename to Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs.meta
diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..717cd56f47be2883e74198b4da2007083e828bdf
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+
+public class ConeGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Cone values")]
+    [Range(0,100)] public float bottomRadius = 1f;
+    [Range(0,100)] public float topRadius = 0f;
+    public Vector3 topPosition = new Vector3(0, 1f, 0);
+
+    [Header("Technical")]
+    [Range(3,1000)] public int sideCount = 500;
+    public bool generateTop = true;
+    public bool generateBottom = false;
+
+    [Header("Parts")]
+    public MeshFilter topMesh;
+    public MeshFilter sideMesh;
+    public MeshFilter bottomMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        Vector3[] bottomCircle = GetCirclePoints(bottomRadius, sideCount);
+        Vector3[] topCircle = GetCirclePoints(topRadius, sideCount, topPosition);
+
+        //side
+        if (sideMesh.sharedMesh != null)
+            sideMesh.sharedMesh.Clear();
+        sideMesh.mesh = CreateMesh(CreateConeSide(sideCount, bottomCircle, topCircle));
+
+        //top
+        if (topMesh.sharedMesh != null)
+            topMesh.sharedMesh.Clear();
+        if (generateTop)
+            topMesh.mesh = CreateMesh(CreatePlane(topCircle, false));
+
+        //bottom
+        if (bottomMesh.sharedMesh != null)
+            bottomMesh.sharedMesh.Clear();
+        if (generateBottom)
+            bottomMesh.mesh = CreateMesh(CreatePlane(bottomCircle, true));
+    }
+
+    private static (Vector3[], int[]) CreateConeSide(int sideCount, Vector3[] bottomCircle, Vector3[] topCircle)
+    {
+        Vector3[] vertices = new Vector3[sideCount * 4];
+        int[] triangles = new int[sideCount * 6];
+
+        //generate vertices
+        for (int i = 0; i < sideCount; i++)
+        {
+            vertices[i * 4] = bottomCircle[i];
+            vertices[i * 4 + 1] = bottomCircle[(i + 1) % sideCount];
+            vertices[i * 4 + 2] = topCircle[i];
+            vertices[i * 4 + 3] = topCircle[(i + 1) % sideCount];
+        }
+
+        //generate triangles
+        for (int t = 0, i = 0; t < triangles.Length; t += 6, i += 4)
+        {
+            triangles[t]     = i;
+            triangles[t + 1] = i + 1;
+            triangles[t + 2] = i + 2;
+
+            triangles[t + 3] = i + 1;
+            triangles[t + 4] = i + 3;
+            triangles[t + 5] = i + 2;
+        }
+
+        return (vertices, triangles);
+    }
+    #endregion Implementation
+}
diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta b/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..051f14ed236df585c4974baea7529a8e48ec2114
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 171f36100fbf6384591cca35fc917317
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7bcddfc85be4f0d415d98016f6bc46114129cb28
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
@@ -0,0 +1,55 @@
+using System.Linq;
+using UnityEngine;
+
+public abstract class ShapeGenerator : MonoBehaviour
+{
+    #region UnityMethods
+    void Start() => GenerateShape();
+
+    void OnValidate() => GenerateShape();
+    #endregion UnityMethods
+
+    protected abstract void GenerateShape();
+
+    #region Helper
+    protected static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues)
+    {
+        Mesh mesh = new Mesh();
+        (mesh.vertices, mesh.triangles) = (meshValues.vertices, meshValues.triangles);
+        mesh.RecalculateNormals(); //fix lighting
+        return mesh;
+    }
+
+    protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount) => GetCirclePoints(circleRadius, pointCount, Vector3.zero);
+    protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount, Vector3 offset)
+    {
+        Vector3[] circle = new Vector3[pointCount];
+        float slice = (2f * Mathf.PI) / pointCount;
+        for (int i = 0; i < pointCount; i++)
+        {
+            float angle = i * slice;
+            circle[i] = new Vector3(circleRadius * Mathf.Sin(angle), 0, circleRadius * Mathf.Cos(angle)) + offset;
+        }
+        return circle;
+    }
+
+    /// <summary>
+    /// Creates triangles for a set of vertecies of a flat, convex shape
+    /// </summary>
+    /// <param name="points"></param>
+    /// <param name="invert"></param>
+    /// <returns></returns>
+    protected static (Vector3[], int[]) CreatePlane(Vector3[] points, bool invert = false)
+    {
+        Vector3[] vertices = points;
+        int[] triangles = new int[(vertices.Length - 2) * 3];
+        for (int i = 1; i < vertices.Length - 1; i++)
+        {
+            triangles[(i - 1) * 3 + 0] = 0;
+            triangles[(i - 1) * 3 + 1] = i;
+            triangles[(i - 1) * 3 + 2] = (i + 1);
+        }
+        return (vertices, invert ? triangles.Reverse().ToArray() : triangles);
+    }
+    #endregion Helper
+}
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..801bbbe10d583d40817cf8fd256a9ae0e50875cf
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 931a85887ddf84f42879941013774a43
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..95ef7746d9b72022d148fa987423136440778261
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
@@ -0,0 +1,73 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+using System;
+
+public class TorusGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Torus values")]
+    [Range(0, 100)] public float torusRadius = 1f;
+    [Range(0, 10)]  public float ringRadius = 0.1f;
+
+    [Header("Technical")]
+    [Range(8, 150)] public int ringSegmentCount = 50;
+    [Range(3, 100)] public int segmentSideCount = 30;
+
+    [Header("Parts")]
+    public MeshFilter torusMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        if (torusMesh.sharedMesh != null)
+            torusMesh.sharedMesh.Clear();
+        torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
+
+        if (torusMesh.transform.TryGetComponent(out MeshCollider meshCol))
+            meshCol.sharedMesh = torusMesh.sharedMesh;
+    }
+
+    private static (Vector3[] vertices, int[] triangles) CreateTorus(float torusRadius, float ringRadius, int ringSegmentCount, int segmentSideCount)
+    {
+        Vector3[] vertices = new Vector3[ringSegmentCount * segmentSideCount * 4];
+        int[] triangles = new int[ringSegmentCount * segmentSideCount * 6];
+
+        //generate vertices
+        float iStep = (2f * Mathf.PI) / ringSegmentCount;
+        float jStep = (2f * Mathf.PI) / segmentSideCount;
+        for (int i = 0; i < ringSegmentCount; i++)
+        {
+            for (int j = 0; j < segmentSideCount; j++)
+            {
+                vertices[(i * segmentSideCount + j) * 4]     = GetPointOnTorus(torusRadius, ringRadius, i * iStep, j * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 1] = GetPointOnTorus(torusRadius, ringRadius, i * iStep, (j + 1) * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 2] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, j * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 3] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, (j + 1) * jStep);
+            }
+        }
+
+        //generate triangles
+        for (int t = 0, i = 0; t < triangles.Length; t += 6, i += 4)
+        {
+            triangles[t]   = i;
+            triangles[t+1] = i + 1;
+            triangles[t+2] = i + 2;
+
+            triangles[t+3] = i + 1;
+            triangles[t+4] = i + 3;
+            triangles[t+5] = i + 2;
+        }
+
+        return (vertices, triangles);
+    }
+
+    private static Vector3 GetPointOnTorus(float torusRadius, float ringRadius, float u, float v)
+    {
+        float r = (torusRadius + ringRadius * Mathf.Sin(v));
+        return new Vector3(r * Mathf.Sin(u), ringRadius * Mathf.Cos(v), r * Mathf.Cos(u));
+    }
+    #endregion Implementation
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta b/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..18b11716a25ffa239097fb1fb32c93fe67fdb3a8
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35327f6b479454149a20587eb03337f8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset
index c2c6328bf43ece96e5b08c363498dff89eb46237..2ce9d8ad1a63821b29b5ff6151cec16a44428113 100644
--- a/ProjectSettings/DynamicsManager.asset
+++ b/ProjectSettings/DynamicsManager.asset
@@ -18,7 +18,7 @@ PhysicsManager:
   m_ClothInterCollisionDistance: 0
   m_ClothInterCollisionStiffness: 0
   m_ContactsGeneration: 1
-  m_LayerCollisionMatrix: fffffffffffdfffffffffffffffffffffffffffffffdfffffffffffffffffffffffdffffdd82fefffffdfffffffdfffffffdfffffffdfffffffdfffffffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+  m_LayerCollisionMatrix: fffffffffffdfffffffffffffffffffffffffffffffdfffffffffffffffffffffffdffffdd02fefffffdfffffffdfffffffdfffffffdfffffffdfffffffdfffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
   m_AutoSimulation: 1
   m_AutoSyncTransforms: 0
   m_ReuseCollisionCallbacks: 1
diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json
index a56b77880be1d3e77d5f693b25baa78b00a118d0..67d846e6efd8edc004a72e952269f029598016b8 100644
--- a/ProjectSettings/Packages/com.unity.probuilder/Settings.json
+++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json
@@ -33,80 +33,10 @@
                 "key": "lightmapping.autoUnwrapLightmapUV",
                 "value": "{\"m_Value\":true}"
             },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "editor.stripProBuilderScriptsOnBuild",
-                "value": "{\"m_Value\":true}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "editor.autoRecalculateCollisions",
-                "value": "{\"m_Value\":false}"
-            },
             {
                 "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
                 "key": "experimental.enabled",
                 "value": "{\"m_Value\":false}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "editor.toolbarIconGUI",
-                "value": "{\"m_Value\":false}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "editor.showEditorNotifications",
-                "value": "{\"m_Value\":false}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "editor.showSceneInfo",
-                "value": "{\"m_Value\":false}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "mesh.meshColliderIsConvex",
-                "value": "{\"m_Value\":false}"
-            },
-            {
-                "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "mesh.newShapesSnapToGrid",
-                "value": "{\"m_Value\":true}"
-            },
-            {
-                "type": "UnityEngine.ProBuilder.UnwrapParameters, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "lightmapping.defaultLightmapUnwrapParameters",
-                "value": "{\"m_Value\":{\"m_HardAngle\":88.0,\"m_PackMargin\":20.0,\"m_AngleError\":8.0,\"m_AreaError\":15.0}}"
-            },
-            {
-                "type": "System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
-                "key": "uv.uvEditorGridSnapIncrement",
-                "value": "{\"m_Value\":0.125}"
-            },
-            {
-                "type": "UnityEngine.Material, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "mesh.userMaterial",
-                "value": "{\"m_Value\":{\"instanceID\":0}}"
-            },
-            {
-                "type": "UnityEditor.StaticEditorFlags, UnityEditor.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "mesh.defaultStaticEditorFlags",
-                "value": "{\"m_Value\":0}"
-            },
-            {
-                "type": "UnityEngine.ProBuilder.PivotLocation, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "mesh.newShapePivotLocation",
-                "value": "{\"m_Value\":1}"
-            },
-            {
-                "type": "UnityEngine.Rendering.ShadowCastingMode, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "mesh.shadowCastingMode",
-                "value": "{\"m_Value\":1}"
-            },
-            {
-                "type": "UnityEngine.ProBuilder.ColliderType, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
-                "key": "mesh.newShapeColliderType",
-                "value": "{\"m_Value\":2}"
             }
         ]
     }
diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt
index bdb3ba5f31d16bb415d08ed6decc3ac3f8e50cd9..4627c1babee4e2a52dfba5b95007b08ab7b25197 100644
--- a/ProjectSettings/ProjectVersion.txt
+++ b/ProjectSettings/ProjectVersion.txt
@@ -1,2 +1,3 @@
 m_EditorVersion: 2021.3.5f1
 m_EditorVersionWithRevision: 2021.3.5f1 (40eb3a945986)
+
diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset
index b8f2d4b3f3f3f864be8bab244615a00d245eddf2..408e5aa981a3d2e4738e6a4b162f9d15d919ff8d 100644
--- a/ProjectSettings/TagManager.asset
+++ b/ProjectSettings/TagManager.asset
@@ -26,6 +26,10 @@ TagManager:
   - Line
   - Angle
   - Ray
+  - Ring
+  - Circle
+  - 
+  - 
   - TalkingZone
   - Tree
   - SnapZone
@@ -40,10 +44,6 @@ TagManager:
   - 
   - 
   - 
-  - 
-  - 
-  - 
-  - 
   m_SortingLayers:
   - name: Default
     uniqueID: 0
diff --git a/UpgradeLog.htm b/UpgradeLog.htm
new file mode 100644
index 0000000000000000000000000000000000000000..7090219fb91f706de6a3ab63064490e1cd4a3e76
Binary files /dev/null and b/UpgradeLog.htm differ
diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset
new file mode 100644
index 0000000000000000000000000000000000000000..8938eb318bb43ddcedec33549da5fbd3497d84f9
--- /dev/null
+++ b/UserSettings/EditorUserSettings.asset
@@ -0,0 +1,39 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!162 &1
+EditorUserSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 4
+  m_ConfigSettings:
+    RecentlyUsedScenePath-0:
+      value: 22424703114646680e0b0227036c681f041b1c39631c3435281e1221eee47a2decee22f0
+      flags: 0
+    RecentlyUsedScenePath-1:
+      value: 22424703114646680e0b0227036c721518021d396304293129201334d1e33136e7a923e7ee2e26
+      flags: 0
+    RecentlyUsedScenePath-2:
+      value: 22424703114646680e0b0227036c681f041b1c39631c232339662f3af4e5260be1e238eca92f31352d1b
+      flags: 0
+    RecentlyUsedScenePath-3:
+      value: 22424703114646680e0b0227036c721518021d39631b32313f3d2e30f0e53136acf238e0f323
+      flags: 0
+    RecentlyUsedScenePath-4:
+      value: 22424703114646680e0b0227036c681f041b1c39631a2f26283b2a3cf0ec3076f7e93ffdfe
+      flags: 0
+    RecentlyUsedScenePath-5:
+      value: 22424703114646680e0b0227036c721518021d39630527392304183df7e57a2decee22f0
+      flags: 0
+    vcSharedLogLevel:
+      value: 0d5e400f0650
+      flags: 0
+  m_VCAutomaticAdd: 1
+  m_VCDebugCom: 0
+  m_VCDebugCmd: 0
+  m_VCDebugOut: 0
+  m_SemanticMergeMode: 2
+  m_VCShowFailedCheckout: 1
+  m_VCOverwriteFailedCheckoutAssets: 1
+  m_VCProjectOverlayIcons: 1
+  m_VCHierarchyOverlayIcons: 1
+  m_VCOtherOverlayIcons: 1
+  m_VCAllowAsyncUpdate: 1