Compare commits

..

34 Commits

Author SHA1 Message Date
6b40c72ffd
Added tree styles 2023-12-10 15:19:10 +01:00
9fbd72c148
Fixed tab styles 2023-12-10 14:51:01 +01:00
b8d66a13a0
Added hover style 2023-12-10 14:01:30 +01:00
9e46f3054c
Added tab styles 2023-12-10 13:41:54 +01:00
123b3bebe3
Added tab control background 2023-12-10 12:49:46 +01:00
0384026b84
Added more tabs 2023-12-10 12:44:07 +01:00
ffda46d8b1
Added margin container 2023-12-10 12:40:38 +01:00
5180254244
Extended test scene 2023-12-10 12:38:44 +01:00
b01d6842be
Added margin container 2023-12-10 12:18:35 +01:00
1e159efe4b
Added test scene 2023-12-10 12:18:20 +01:00
c4e27d2550
Moved theme determination 2023-12-08 22:56:37 +01:00
002c054e11
Added loading scene 2023-12-08 22:49:24 +01:00
e7c690ac1d
Added light btn styles 2023-12-08 22:47:37 +01:00
371d4e59cf
Renamed style 2023-12-08 22:37:51 +01:00
a638744b43
Added light theme 2023-12-08 22:37:08 +01:00
6fc441b65b
Added panel theme 2023-12-08 22:30:41 +01:00
0de99a095c
Rename theme 2023-12-08 22:30:29 +01:00
6a67e7aff4
Added check btn style 2023-12-08 22:26:31 +01:00
7157386bb7
Renamed btn styles 2023-12-08 22:22:15 +01:00
0d05658143
Added checkbox styles 2023-12-08 22:21:16 +01:00
f0b58de4b9
Moved btn styles into own folder 2023-12-08 22:14:57 +01:00
df997f6cc7
Increased font size 2023-12-08 22:14:06 +01:00
0e121e718d
Added theme for button 2023-12-08 22:03:05 +01:00
08b318b93b
Added behavior 2023-12-08 20:22:04 +01:00
9295b6f5ec
Added icon 2023-12-08 20:16:39 +01:00
c39be82a59
Specified assembly name 2023-12-08 20:16:03 +01:00
8f82bfbd86
Renamed scene 2023-12-08 20:11:23 +01:00
d0e6dd13cd
Renamed class 2023-12-08 20:09:50 +01:00
144267dc9e
Added icon button 2023-12-08 19:38:57 +01:00
9f910f5d49
Added run config 2023-12-08 19:38:24 +01:00
ed32764da8
Basis app settings 2023-12-08 19:04:05 +01:00
c9713cb615
Init 2023-12-08 18:48:05 +01:00
1ee1a268f9
Added GitLab 2023-12-08 18:46:32 +01:00
58b7c37295
Removed MAUI and WinForms 2023-12-08 18:46:14 +01:00
169 changed files with 735 additions and 11048 deletions

View File

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="TaskProjectConfiguration">
<server type="Gitlab" url="https://devops.tsommer.org" />
</component>
<component name="com.jetbrains.rider.android.RiderAndroidMiscFileCreationComponent">
<option name="ENSURE_MISC_FILE_EXISTS" value="true" />
</component>

View File

@ -7,7 +7,4 @@
<inspection_tool class="SubjectLimit" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Editor" type="RunExe" factoryName=".NET Executable">
<option name="EXE_PATH" value="/Applications/Godot.app/Contents/MacOS/Godot" />
<option name="PROGRAM_PARAMETERS" value="--path &quot;$PROJECT_DIR$/App&quot; --editor" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="RUNTIME_TYPE" value="coreclr" />
<method v="2">
<option name="Build Solution" enabled="true" />
</method>
</configuration>
</component>

View File

@ -0,0 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Player" type="RunExe" factoryName=".NET Executable">
<option name="EXE_PATH" value="/Applications/Godot.app/Contents/MacOS/Godot" />
<option name="PROGRAM_PARAMETERS" value="--path &quot;$PROJECT_DIR$/App&quot;" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="RUNTIME_TYPE" value="coreclr" />
<method v="2">
<option name="Build Solution" enabled="true" />
</method>
</configuration>
</component>

2
I18N Commander/App/.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

2
I18N Commander/App/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Godot 4+ specific ignores
.godot/

View File

@ -0,0 +1,15 @@
<Project Sdk="Godot.NET.Sdk/4.2.0">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDynamicLoading>true</EnableDynamicLoading>
<AssemblyName>App</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Compile Remove="obj\**" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="obj\**" />
</ItemGroup>
</Project>

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csxeqym474oxu"
path="res://.godot/imported/icons8-language-512.png-f077a2b18c06d1aaad9f9dc30a3a6ad7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/icons8-language-512.png"
dest_files=["res://.godot/imported/icons8-language-512.png-f077a2b18c06d1aaad9f9dc30a3a6ad7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cp33pga3vuk5k"
path="res://.godot/imported/icons8-new-window-512.png-a618aa4884e2d1037cb64d9a2996cda7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/icons/icons8-new-window-512.png"
dest_files=["res://.godot/imported/icons8-new-window-512.png-a618aa4884e2d1037cb64d9a2996cda7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1 @@
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>

After

Width:  |  Height:  |  Size: 950 B

View File

@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nydkfoij0mbk"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@ -0,0 +1,33 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="I18N Commander"
run/main_scene="res://scenes/loading_screen.tscn"
config/features=PackedStringArray("4.2", "C#", "GL Compatibility")
run/low_processor_mode=true
config/icon="res://icon.svg"
[display]
window/size/initial_position_type=3
window/stretch/aspect="ignore"
window/ios/hide_home_indicator=false
window/ios/hide_status_bar=false
[dotnet]
project/assembly_name="App"
[rendering]
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"

View File

@ -0,0 +1,27 @@
using Godot;
namespace App.scenes;
public partial class BtnIcon : Control
{
[Export]
[ExportGroup("Data")]
public string Text { get; set; } = string.Empty;
[Export]
[ExportGroup("Data")]
public Texture2D Icon { get; set; }
#region Overrides of Node
public override void _Ready()
{
var button = this.GetNode<Button>("%btn");
button.Text = this.Text;
button.Icon = this.Icon;
base._Ready();
}
#endregion
}

View File

@ -0,0 +1,14 @@
[gd_scene load_steps=2 format=3 uid="uid://d0x0yv7nevod7"]
[ext_resource type="Script" path="res://scenes/BtnIcon.cs" id="1_b787p"]
[node name="btn_icon" type="MarginContainer"]
theme_override_constants/margin_left = 6
theme_override_constants/margin_top = 6
theme_override_constants/margin_right = 6
theme_override_constants/margin_bottom = 6
script = ExtResource("1_b787p")
[node name="btn" type="Button" parent="."]
unique_name_in_owner = true
layout_mode = 2

View File

@ -0,0 +1,68 @@
[gd_scene load_steps=5 format=3 uid="uid://qm7ovimcfc3h"]
[ext_resource type="Texture2D" uid="uid://csxeqym474oxu" path="res://assets/icons/icons8-language-512.png" id="1_1ya62"]
[ext_resource type="PackedScene" uid="uid://d0x0yv7nevod7" path="res://scenes/BtnIcon.tscn" id="2_gp72s"]
[ext_resource type="Texture2D" uid="uid://cp33pga3vuk5k" path="res://assets/icons/icons8-new-window-512.png" id="3_4v5hm"]
[ext_resource type="Theme" uid="uid://uqhultm05f5a" path="res://theme/ui_theme_dark.tres" id="3_7idnl"]
[node name="frame" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("3_7idnl")
[node name="center" type="CenterContainer" parent="."]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -152.0
offset_top = -51.5
offset_right = 152.0
offset_bottom = 51.5
grow_horizontal = 2
grow_vertical = 2
[node name="vbox" type="VBoxContainer" parent="center"]
layout_mode = 2
[node name="hboxHeader" type="HBoxContainer" parent="center/vbox"]
layout_mode = 2
[node name="iconMargin" type="MarginContainer" parent="center/vbox/hboxHeader"]
layout_mode = 2
theme_override_constants/margin_left = 6
theme_override_constants/margin_top = 6
theme_override_constants/margin_right = 6
theme_override_constants/margin_bottom = 6
[node name="icon" type="TextureRect" parent="center/vbox/hboxHeader/iconMargin"]
layout_mode = 2
texture = ExtResource("1_1ya62")
stretch_mode = 5
[node name="header" type="Label" parent="center/vbox/hboxHeader"]
custom_minimum_size = Vector2(300, 2.08165e-12)
layout_mode = 2
theme_override_font_sizes/font_size = 36
text = "I18N Commander"
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 2
[node name="hboxButtons" type="HBoxContainer" parent="center/vbox"]
layout_mode = 2
[node name="btn_icon" parent="center/vbox/hboxButtons" instance=ExtResource("2_gp72s")]
layout_mode = 2
Text = "Create Project"
Icon = ExtResource("3_4v5hm")
[node name="btnRecentProjects" type="OptionButton" parent="center/vbox/hboxButtons"]
unique_name_in_owner = true
layout_mode = 2

View File

@ -0,0 +1,141 @@
[gd_scene load_steps=2 format=3 uid="uid://q3mnarw6b66l"]
[ext_resource type="Theme" uid="uid://uqhultm05f5a" path="res://theme/ui_theme_dark.tres" id="1_x217b"]
[node name="Main" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("1_x217b")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/MarginContainer"]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Create Unit"
[node name="Button2" type="Button" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Delete"
[node name="CheckButton" type="CheckButton" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
[node name="CheckButton2" type="CheckButton" parent="VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
text = "Auto Save"
[node name="OptionButton" type="OptionButton" parent="VBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
item_count = 3
popup/item_0/text = "Option 1"
popup/item_0/id = 0
popup/item_1/text = "Option 2"
popup/item_1/id = 1
popup/item_1/disabled = true
popup/item_2/text = "Option 3"
popup/item_2/id = 2
[node name="MenuButton" type="MenuButton" parent="VBoxContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
toggle_mode = false
text = "Mein Menü"
alignment = 0
item_count = 5
popup/item_0/text = "Option 1"
popup/item_0/id = 0
popup/item_1/text = "Option 2"
popup/item_1/id = 1
popup/item_2/text = "Option 3"
popup/item_2/id = 2
popup/item_3/text = "Settings"
popup/item_3/id = 4
popup/item_3/separator = true
popup/item_4/text = "Auto Save"
popup/item_4/checkable = 1
popup/item_4/id = 3
[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="TabContainer" type="TabContainer" parent="VBoxContainer/MarginContainer2"]
layout_mode = 2
[node name="Tab1" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
layout_mode = 2
clip_tabs = false
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer2/TabContainer/Tab1"]
layout_mode = 0
offset_right = 132.0
offset_bottom = 101.0
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer2/TabContainer/Tab1/MarginContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="VBoxContainer/MarginContainer2/TabContainer/Tab1/MarginContainer/HBoxContainer"]
layout_mode = 2
text = "Load"
[node name="Button2" type="Button" parent="VBoxContainer/MarginContainer2/TabContainer/Tab1/MarginContainer/HBoxContainer"]
layout_mode = 2
text = "Store"
[node name="Tab2" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
visible = false
layout_mode = 2
clip_tabs = false
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer2/TabContainer/Tab2"]
layout_mode = 0
offset_right = 24.0
offset_bottom = 24.0
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer2/TabContainer/Tab2/MarginContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="VBoxContainer/MarginContainer2/TabContainer/Tab2/MarginContainer/HBoxContainer"]
layout_mode = 2
text = "STart"
[node name="Button2" type="Button" parent="VBoxContainer/MarginContainer2/TabContainer/Tab2/MarginContainer/HBoxContainer"]
layout_mode = 2
text = "Stop"
[node name="TabBar" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
visible = false
layout_mode = 2
clip_tabs = false
[node name="TabBar2" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
visible = false
layout_mode = 2
clip_tabs = false
[node name="TabBar3" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
visible = false
layout_mode = 2
clip_tabs = false
[node name="TabBar4" type="TabBar" parent="VBoxContainer/MarginContainer2/TabContainer"]
visible = false
layout_mode = 2
clip_tabs = false

View File

@ -0,0 +1,21 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://chaurklijlgu7"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.309804, 0.309804, 0.309804, 1)
skew = Vector2(2.08165e-12, 2.08165e-12)
border_width_left = 4
border_width_top = 4
border_width_right = 4
border_width_bottom = 4
border_color = Color(0.0509804, 0.0509804, 0.0509804, 1)
border_blend = true
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
shadow_size = 2
shadow_offset = Vector2(1, 1)

View File

@ -0,0 +1,21 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://l1tjpnljc6c1"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.309804, 0.309804, 0.309804, 1)
skew = Vector2(2.08165e-12, 2.08165e-12)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.0509804, 0.0509804, 0.0509804, 1)
border_blend = true
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
shadow_size = 2
shadow_offset = Vector2(1, 1)

View File

@ -0,0 +1,19 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://tj810ebe65el"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.239216, 0.239216, 0.239216, 1)
skew = Vector2(2.08165e-12, 2.08165e-12)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0, 0, 0, 1)
border_blend = true
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6

View File

@ -0,0 +1,21 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://he0mxms4j1q7"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.4, 0.4, 0.4, 1)
skew = Vector2(2.08165e-12, 2.08165e-12)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.380392, 0.380392, 0.380392, 1)
border_blend = true
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
shadow_size = 2
shadow_offset = Vector2(1, 1)

View File

@ -0,0 +1,17 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://d0s01k14o6kda"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.980392, 0.980392, 0.980392, 1)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.129412, 0.129412, 0.129412, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6

View File

@ -0,0 +1,17 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://cilpphe2p81om"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.980392, 0.980392, 0.980392, 1)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.129412, 0.129412, 0.129412, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6

View File

@ -0,0 +1,17 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://dv2hxit6cs1cx"]
[resource]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.878431, 0.878431, 0.878431, 1)
border_width_left = 5
border_width_top = 5
border_width_right = 5
border_width_bottom = 5
border_color = Color(0.129412, 0.129412, 0.129412, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6

View File

@ -0,0 +1,3 @@
[gd_resource type="StyleBoxEmpty" format=3 uid="uid://batay7mp6vfon"]
[resource]

View File

@ -0,0 +1,3 @@
[gd_resource type="StyleBoxEmpty" format=3 uid="uid://bgka0t482q0dh"]
[resource]

View File

@ -0,0 +1,4 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://cens6ndafk28w"]
[resource]
bg_color = Color(0.160784, 0.160784, 0.160784, 1)

View File

@ -0,0 +1,4 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://b2nkgvg40j6tc"]
[resource]
bg_color = Color(0.780392, 0.780392, 0.780392, 1)

View File

@ -0,0 +1,4 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://bumfybajbkybi"]
[resource]
bg_color = Color(0.2, 0.2, 0.2, 1)

View File

@ -0,0 +1,13 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://cv1sqjb5pjrov"]
[resource]
content_margin_left = 48.0
content_margin_top = 48.0
content_margin_right = 48.0
content_margin_bottom = 48.0
bg_color = Color(0.39, 0.39, 0.39, 1)
border_width_left = 6
border_width_top = 12
border_width_right = 6
border_width_bottom = 12
border_color = Color(0.2, 0.2, 0.2, 1)

View File

@ -0,0 +1,13 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://b8v8084ty86la"]
[resource]
content_margin_left = 48.0
content_margin_top = 48.0
content_margin_right = 48.0
content_margin_bottom = 48.0
bg_color = Color(0.239216, 0.239216, 0.239216, 1)
border_width_left = 6
border_width_top = 12
border_width_right = 6
border_width_bottom = 12
border_color = Color(0.2, 0.2, 0.2, 1)

View File

@ -0,0 +1,13 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://dp37edlumlbaj"]
[resource]
content_margin_left = 48.0
content_margin_top = 48.0
content_margin_right = 48.0
content_margin_bottom = 48.0
bg_color = Color(0.160784, 0.160784, 0.160784, 1)
border_width_left = 6
border_width_top = 12
border_width_right = 6
border_width_bottom = 12
border_color = Color(0.2, 0.2, 0.2, 1)

View File

@ -0,0 +1,63 @@
[gd_resource type="Theme" load_steps=12 format=3 uid="uid://uqhultm05f5a"]
[ext_resource type="StyleBox" uid="uid://chaurklijlgu7" path="res://theme/btn/d_style_box_flat_focus.tres" id="1_uspte"]
[ext_resource type="StyleBox" uid="uid://l1tjpnljc6c1" path="res://theme/btn/d_style_box_flat_hover.tres" id="2_pm5yo"]
[ext_resource type="StyleBox" uid="uid://tj810ebe65el" path="res://theme/btn/d_style_box_flat_norm.tres" id="3_p1mf5"]
[ext_resource type="StyleBox" uid="uid://he0mxms4j1q7" path="res://theme/btn/d_style_box_flat_press.tres" id="4_a7p74"]
[ext_resource type="StyleBox" uid="uid://bgka0t482q0dh" path="res://theme/checkbox/style_box_empty.tres" id="5_1ugrl"]
[ext_resource type="StyleBox" uid="uid://batay7mp6vfon" path="res://theme/checkBtn/style_box_empty.tres" id="6_i1h00"]
[ext_resource type="StyleBox" uid="uid://cens6ndafk28w" path="res://theme/panel/d_style_box_flat.tres" id="7_3s8mj"]
[ext_resource type="StyleBox" uid="uid://dp37edlumlbaj" path="res://theme/tabs/tab_selected_style_box_flat.tres" id="8_4hym3"]
[ext_resource type="StyleBox" uid="uid://b8v8084ty86la" path="res://theme/tabs/tab_not_used_style_box_flat.tres" id="8_5xc56"]
[ext_resource type="StyleBox" uid="uid://bumfybajbkybi" path="res://theme/tabs/background_style_box_flat.tres" id="8_l6mbx"]
[ext_resource type="StyleBox" uid="uid://cv1sqjb5pjrov" path="res://theme/tabs/tab_hover_style_box_flat.tres" id="9_5ci7o"]
[resource]
Button/constants/h_separation = 6
Button/font_sizes/font_size = 32
Button/styles/focus = ExtResource("1_uspte")
Button/styles/hover = ExtResource("2_pm5yo")
Button/styles/normal = ExtResource("3_p1mf5")
Button/styles/pressed = ExtResource("4_a7p74")
CheckBox/constants/h_separation = 16
CheckBox/font_sizes/font_size = 32
CheckBox/styles/disabled = ExtResource("5_1ugrl")
CheckBox/styles/focus = ExtResource("5_1ugrl")
CheckBox/styles/hover = ExtResource("5_1ugrl")
CheckBox/styles/hover_pressed = ExtResource("5_1ugrl")
CheckBox/styles/normal = ExtResource("5_1ugrl")
CheckBox/styles/pressed = ExtResource("5_1ugrl")
CheckButton/font_sizes/font_size = 32
CheckButton/styles/focus = ExtResource("6_i1h00")
CheckButton/styles/hover = ExtResource("6_i1h00")
CheckButton/styles/hover_pressed = ExtResource("6_i1h00")
CheckButton/styles/normal = ExtResource("6_i1h00")
CheckButton/styles/pressed = ExtResource("6_i1h00")
Label/font_sizes/font_size = 32
LineEdit/font_sizes/font_size = 32
MarginContainer/constants/margin_bottom = 12
MarginContainer/constants/margin_left = 12
MarginContainer/constants/margin_right = 12
MarginContainer/constants/margin_top = 12
Panel/styles/panel = ExtResource("7_3s8mj")
PopupMenu/font_sizes/font_separator_size = 32
PopupMenu/font_sizes/font_size = 32
TabBar/font_sizes/font_size = 32
TabContainer/font_sizes/font_size = 32
TabContainer/styles/tab_focus = ExtResource("8_4hym3")
TabContainer/styles/tab_hovered = ExtResource("9_5ci7o")
TabContainer/styles/tab_selected = ExtResource("8_4hym3")
TabContainer/styles/tab_unselected = ExtResource("8_5xc56")
TabContainer/styles/tabbar_background = ExtResource("8_l6mbx")
TextEdit/font_sizes/font_size = 32
Tree/constants/children_hl_line_width = 4
Tree/constants/draw_guides = 0
Tree/constants/draw_relationship_lines = 1
Tree/constants/h_separation = 12
Tree/constants/inner_item_margin_left = 12
Tree/constants/parent_hl_line_width = 4
Tree/constants/relationship_line_width = 4
Tree/constants/scrollbar_h_separation = 12
Tree/constants/v_separation = 8
Tree/font_sizes/font_size = 32
Tree/font_sizes/title_button_font_size = 32

View File

@ -0,0 +1,34 @@
[gd_resource type="Theme" load_steps=5 format=3 uid="uid://w3bmkb0q753m"]
[ext_resource type="StyleBox" uid="uid://cilpphe2p81om" path="res://theme/btn/l_style_box_flat_norm.tres" id="1_21txx"]
[ext_resource type="StyleBox" uid="uid://b2nkgvg40j6tc" path="res://theme/panel/l_style_box_flat.tres" id="1_87qhj"]
[ext_resource type="StyleBox" uid="uid://d0s01k14o6kda" path="res://theme/btn/l_style_box_flat_hover.tres" id="1_apys2"]
[ext_resource type="StyleBox" uid="uid://dv2hxit6cs1cx" path="res://theme/btn/l_style_box_flat_press.tres" id="3_cpdnc"]
[resource]
Button/colors/font_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/colors/font_focus_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/colors/font_hover_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/colors/font_hover_pressed_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/colors/font_pressed_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/colors/icon_disabled_color = Color(0.160784, 0.160784, 0.160784, 1)
Button/constants/h_separation = 6
Button/font_sizes/font_size = 32
Button/styles/hover = ExtResource("1_apys2")
Button/styles/normal = ExtResource("1_21txx")
Button/styles/pressed = ExtResource("3_cpdnc")
CheckBox/constants/h_separation = 16
CheckBox/font_sizes/font_size = 32
CheckButton/font_sizes/font_size = 32
Label/font_sizes/font_size = 32
LineEdit/font_sizes/font_size = 32
MarginContainer/constants/margin_bottom = 12
MarginContainer/constants/margin_left = 12
MarginContainer/constants/margin_right = 12
MarginContainer/constants/margin_top = 12
Panel/styles/panel = ExtResource("1_87qhj")
PopupMenu/font_sizes/font_separator_size = 32
PopupMenu/font_sizes/font_size = 32
TabBar/font_sizes/font_size = 32
TabContainer/font_sizes/font_size = 32
TextEdit/font_sizes/font_size = 32

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>default</LangVersion>

View File

@ -5,11 +5,9 @@ VisualStudioVersion = 17.3.32519.111
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Processor", "Processor\Processor.csproj", "{E24B7026-05BE-434D-9481-7CA5785BC7A8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UI WinForms", "UI WinForms\UI WinForms.csproj", "{5AE84E7C-3141-46CA-B390-4E42878B6195}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataModel", "DataModel\DataModel.csproj", "{D18DD193-3F93-4D21-92DC-BA0E26B0342A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UI MAUI", "UI MAUI\UI MAUI.csproj", "{BA8BE958-0DCC-4054-B731-DF911AECC429}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App", "App\App.csproj", "{CA2AB6BD-472A-4906-BF5A-84263EF345B6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -21,20 +19,14 @@ Global
{E24B7026-05BE-434D-9481-7CA5785BC7A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E24B7026-05BE-434D-9481-7CA5785BC7A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E24B7026-05BE-434D-9481-7CA5785BC7A8}.Release|Any CPU.Build.0 = Release|Any CPU
{5AE84E7C-3141-46CA-B390-4E42878B6195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5AE84E7C-3141-46CA-B390-4E42878B6195}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5AE84E7C-3141-46CA-B390-4E42878B6195}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5AE84E7C-3141-46CA-B390-4E42878B6195}.Release|Any CPU.Build.0 = Release|Any CPU
{D18DD193-3F93-4D21-92DC-BA0E26B0342A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D18DD193-3F93-4D21-92DC-BA0E26B0342A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D18DD193-3F93-4D21-92DC-BA0E26B0342A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D18DD193-3F93-4D21-92DC-BA0E26B0342A}.Release|Any CPU.Build.0 = Release|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Release|Any CPU.Build.0 = Release|Any CPU
{BA8BE958-0DCC-4054-B731-DF911AECC429}.Release|Any CPU.Deploy.0 = Release|Any CPU
{CA2AB6BD-472A-4906-BF5A-84263EF345B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CA2AB6BD-472A-4906-BF5A-84263EF345B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CA2AB6BD-472A-4906-BF5A-84263EF345B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA2AB6BD-472A-4906-BF5A-84263EF345B6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>default</LangVersion>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:UI_MAUI"
x:Class="UI_MAUI.App">
<Application.Resources>
<ResourceDictionary>
<Color x:Key="PageBackgroundColor">#512bdf</Color>
<Color x:Key="PrimaryTextColor">White</Color>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{DynamicResource PrimaryTextColor}" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{DynamicResource PrimaryTextColor}" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="BackgroundColor" Value="#2b0b98" />
<Setter Property="Padding" Value="14,10" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>

View File

@ -1,10 +0,0 @@
namespace UI_MAUI;
public partial class App : Application
{
public App()
{
this.InitializeComponent();
this.MainPage = new MainPage();
}
}

View File

@ -1,17 +0,0 @@
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="@this.Name" aria-labelledby="@this.Name-Header" style="@this.AssistantHeight">
<div class="offcanvas-header">
<h4 class="offcanvas-title d-flex align-items-center" id="@this.Name-Header">
@if (this.IsIconAvailable)
{
<Icon Filename="@this.IconName" Size="35" Classes="me-2" AltText="@this.HeaderIconAltText"/>
}
@this.HeaderText
</h4>
<button class="btn btn-secondary" type="button" data-bs-toggle="offcanvas" data-bs-target="#@this.Name">
Cancel
</button>
</div>
<div class="offcanvas-body">
@this.ChildContent
</div>
</div>

View File

@ -1,32 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace UI_MAUI.Components;
public partial class Assistant : ComponentBase
{
[Parameter]
public string HeaderText { get; set; } = string.Empty;
[Parameter]
public string Name { get; set; } = "Assistant";
[Parameter]
public string IconName { get; set; } = string.Empty;
[Parameter]
public Height BaseHeight { get; set; } = new(60, 40, 50);
public readonly record struct Height(int Phone, int Desktop, int Tablet);
[Parameter]
public RenderFragment ChildContent { get; set; }
private string AssistantHeight =>
DeviceInfo.Idiom == DeviceIdiom.Phone ? $"--bs-offcanvas-height: {this.BaseHeight.Phone}vh;" :
DeviceInfo.Idiom == DeviceIdiom.Tablet ? $"--bs-offcanvas-height: {this.BaseHeight.Tablet}vh;" :
$"--bs-offcanvas-height: {this.BaseHeight.Desktop}vh;";
private string HeaderIconAltText => $"Icon: {this.HeaderText}";
private bool IsIconAvailable => !string.IsNullOrWhiteSpace(this.IconName);
}

View File

@ -1 +0,0 @@
<img src="icons/@this.Filename" class="d-inline-block @this.Classes" width="@this.Size" height="@this.Size" alt="@this.AltText" />

View File

@ -1,18 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace UI_MAUI.Components;
public partial class Icon : ComponentBase
{
[Parameter]
public string Filename { get; set; } = string.Empty;
[Parameter]
public string AltText { get; set; } = string.Empty;
[Parameter]
public ushort Size { get; set; } = 35;
[Parameter]
public string Classes { get; set; } = string.Empty;
}

View File

@ -1,22 +0,0 @@
<li class="nav-item">
@if (DeviceInfo.Idiom == DeviceIdiom.Desktop || DeviceInfo.Idiom == DeviceIdiom.Tablet)
{
<a class="nav-link active" aria-current="page" href="@this.Route">
@if (this.ShowIcon)
{
<Icon Filename="@this.IconFilename" Size="25" AltText="@this.AltText" />
}
<span class="ms-1 align-middle">@this.Text</span>
</a>
}
else
{
<a class="nav-link active" aria-current="page" href="@this.Route" @onclick="@this.Navigate" data-bs-toggle="collapse" data-bs-target="#navbarContent">
@if (this.ShowIcon)
{
<Icon Filename="@this.IconFilename" Size="25" AltText="@this.AltText" />
}
<span class="ms-1 align-middle">@this.Text</span>
</a>
}
</li>

View File

@ -1,25 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace UI_MAUI.Components;
public partial class NavItem : ComponentBase
{
[Parameter]
public string Route { get; set; }
[Parameter]
public string Text { get; set; }
[Parameter]
public bool ShowIcon { get; set; } = false;
[Parameter]
public string IconFilename { get; set; } = string.Empty;
[Inject]
public NavigationManager NavigationManager { get; set; }
private string AltText => $"Navigation: {this.Text}";
private void Navigate() => this.NavigationManager.NavigateTo(this.Route);
}

View File

@ -1,11 +0,0 @@
<Router AppAssembly="@typeof(Main).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:UI_MAUI"
x:Class="UI_MAUI.MainPage"
BackgroundColor="{DynamicResource PageBackgroundColor}">
<BlazorWebView HostPage="wwwroot/index.html">
<BlazorWebView.RootComponents>
<RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
</BlazorWebView.RootComponents>
</BlazorWebView>
</ContentPage>

View File

@ -1,9 +0,0 @@
namespace UI_MAUI;
public partial class MainPage : ContentPage
{
public MainPage()
{
this.InitializeComponent();
}
}

View File

@ -1,51 +0,0 @@
using DataModel.Database.Common;
using Microsoft.Maui.LifecycleEvents;
#if WINDOWS
using Microsoft.UI;
using Microsoft.UI.Windowing;
using Windows.Graphics;
#endif
namespace UI_MAUI;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder.UseMauiApp<App>();
builder.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
#if WINDOWS
builder.ConfigureLifecycleEvents(events =>
{
events.AddWindows(wndLifeCycleBuilder =>
{
wndLifeCycleBuilder.OnWindowCreated(window =>
{
var nativeWindowHandle = WinRT.Interop.WindowNative.GetWindowHandle(window);
var win32WindowsId = Win32Interop.GetWindowIdFromWindow(nativeWindowHandle);
var appWindow = AppWindow.GetFromWindowId(win32WindowsId);
const int width = 1366;
const int height = 768;
appWindow.ResizeClient(new SizeInt32(width, height));
});
});
});
#endif
builder.Services.AddMauiBlazorWebView();
builder.Services.AddSingleton<DataContextFactory>();
#if DEBUG
builder.Services.AddBlazorWebViewDeveloperTools();
#endif
return builder.Build();
}
}

View File

@ -1,15 +0,0 @@
namespace UI_MAUI;
public readonly record struct NavigationTarget(string Text, string Route, string IconFilename)
{
private static readonly NavigationTarget SETTINGS = new("Project settings", "settings", "settings.svg");
private static readonly NavigationTarget TRANSLATION = new("Translation", "translation", "translation.svg");
private static readonly NavigationTarget LOAD_PROJECT = new("Load Project", "load", "load.svg");
public static IEnumerable<NavigationTarget> GetAll()
{
yield return LOAD_PROJECT;
yield return SETTINGS;
yield return TRANSLATION;
}
};

View File

@ -1,42 +0,0 @@
@page "/"
@page "/load"
<h1>Load a Project</h1>
<ul>
@foreach (var recentProject in this.recentProjects)
{
<li>@recentProject.Path</li>
}
</ul>
<div>
<button class="btn btn-secondary me-2 mb-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#Assistant">
<Icon Filename="add-project.svg" Size="25" AltText="Icon: Create new project"/>
Create new project
</button>
<button class="btn btn-secondary me-2 mb-2" type="button">
<Icon Filename="load.svg" Size="25" AltText="Icon: Open project"/>
Open project
</button>
</div>
<Assistant HeaderText="Create new project" IconName="add-project.svg" BaseHeight="new Assistant.Height(40, 55, 40)">
<div class="mb-3">
<label for="projectName" class="form-label fw-bold">Project Name:</label>
<input type="text" class="form-control" id="projectName" placeholder="Type a project name" @bind="this.newProjectName" @bind:event="oninput" @onkeydown="this.ReevaluateState">
</div>
@if (DeviceInfo.Idiom == DeviceIdiom.Desktop)
{
<div class="mb-3">
<label for="projectPath" class="form-label fw-bold">Project destination:</label>
<div class="input-group" id="projectPath">
<button class="btn btn-primary" type="button" @onclick="@this.ChooseProjectDestination">Choose destination</button>
<input type="text" class="form-control" value="@this.newProjectDestination" aria-label="The chosen project path" disabled readonly>
</div>
</div>
}
<button class="btn btn-secondary" type="button" @onclick="this.CreateProject" disabled="@this.CannotCreateProject()">Create project</button>
</Assistant>

View File

@ -1,88 +0,0 @@
using System.Text;
using System.Text.Json.Serialization;
using DataModel.Database.Common;
using Microsoft.AspNetCore.Components;
namespace UI_MAUI.Pages;
public partial class LoadProject
{
private readonly List<RecentProject> recentProjects = new();
[Inject]
public DataContextFactory DataContextFactory { get; set; }
private string newProjectName = string.Empty;
private string newProjectDestination = string.Empty;
#region Overrides of ComponentBase
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
await this.LoadRecentProjects();
}
#endregion
private readonly record struct RecentProject(string Path, string Name, bool Available);
private async Task LoadRecentProjects()
{
var appDataDirectory = FileSystem.Current.AppDataDirectory;
var recentProjectsFile = Path.Join(appDataDirectory, "recentProjects.json");
if (!File.Exists(recentProjectsFile))
await File.WriteAllTextAsync(recentProjectsFile, string.Empty, Encoding.UTF8);
// Read the JSON data from that file & decode it to an array of recent projects:
}
private async Task WriteRecentProjects()
{
}
private Task ChooseProjectDestination()
{
try
{
#if WINDOWS
return this.ChooseProjectDestinationWindows();
#elif MACCATALYST
return this.ChooseProjectDestinationMacOS();
#else
return Task.CompletedTask;
#endif
}
finally
{
this.StateHasChanged();
}
}
private Task CreateProject()
{
// TODO: Need to wait for the project to be created. Afterwards, we need to close the dialog. Meanwhile, we need to show a loading indicator.
#warning TODO: Create project
#if WINDOWS
return this.CreateProjectWindows();
#elif MACCATALYST
return Task.CompletedTask;
#else
return Task.CompletedTask;
#endif
}
private bool CannotCreateProject()
{
if (DeviceInfo.Idiom == DeviceIdiom.Desktop)
return string.IsNullOrWhiteSpace(this.newProjectName) || string.IsNullOrWhiteSpace(this.newProjectDestination);
else if (DeviceInfo.Idiom == DeviceIdiom.Phone || DeviceInfo.Idiom == DeviceIdiom.Tablet)
return string.IsNullOrWhiteSpace(this.newProjectName);
else
return true;
}
private void ReevaluateState() => this.StateHasChanged();
}

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/app" android:roundIcon="@mipmap/app_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

View File

@ -1,10 +0,0 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace UI_MAUI;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}

View File

@ -1,14 +0,0 @@
using Android.App;
using Android.Runtime;
namespace UI_MAUI;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@ -1,9 +0,0 @@
#if ANDROID
namespace UI_MAUI.Pages;
public partial class LoadProject
{
}
#endif

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>

View File

@ -1,9 +0,0 @@
using Foundation;
namespace UI_MAUI;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

View File

@ -1,13 +0,0 @@
#if MACCATALYST
namespace UI_MAUI.Pages;
public partial class LoadProject
{
private Task ChooseProjectDestinationMacOS()
{
return Task.CompletedTask;
}
}
#endif

View File

@ -1,15 +0,0 @@
using ObjCRuntime;
using UIKit;
namespace UI_MAUI;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

View File

@ -1,8 +0,0 @@
<maui:MauiWinUIApplication
x:Class="UI_MAUI.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:UI_MAUI.WinUI">
</maui:MauiWinUIApplication>

View File

@ -1,18 +0,0 @@
namespace UI_MAUI.WinUI;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="$placeholder$"
Description="$placeholder$"
Square150x150Logo="$placeholder$.png"
Square44x44Logo="$placeholder$.png"
BackgroundColor="transparent">
<uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
<uap:SplashScreen Image="$placeholder$.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

View File

@ -1,38 +0,0 @@
#if WINDOWS
namespace UI_MAUI.Pages;
using Windows.Storage.Pickers;
using WindowsSavePicker = Windows.Storage.Pickers.FileSavePicker;
public partial class LoadProject
{
private async Task ChooseProjectDestinationWindows()
{
var saveDialog = new WindowsSavePicker
{
CommitButtonText = "Create the project here",
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
FileTypeChoices =
{
new KeyValuePair<string, IList<string>>("I18N Commander Projects", new List<string> { ".i18nc" }),
}
};
var hwnd = ((MauiWinUIWindow)App.Current.Windows[0].Handler.PlatformView).WindowHandle;
WinRT.Interop.InitializeWithWindow.Initialize(saveDialog, hwnd);
var result = await saveDialog.PickSaveFileAsync();
if(result is null)
return;
this.newProjectDestination = result.Path;
}
private async Task CreateProjectWindows() => await Task.Run(() =>
{
this.DataContextFactory.CreateDataContext(this.newProjectDestination);
});
}
#endif

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="UI MAUI.WinUI.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
</windowsSettings>
</application>
</assembly>

View File

@ -1,9 +0,0 @@
using Foundation;
namespace UI_MAUI;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

View File

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

View File

@ -1,9 +0,0 @@
#if IOS
namespace UI_MAUI.Pages;
public partial class LoadProject
{
}
#endif

View File

@ -1,15 +0,0 @@
using ObjCRuntime;
using UIKit;
namespace UI_MAUI;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

View File

@ -1,8 +0,0 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 12 48 30" width="512px" height="512px"><linearGradient id="gCW9sGJUkBnBLRc40wQXGa" x1="25.447" x2="44.728" y1="4.921" y2="36.29" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#42a3f2"/><stop offset="1" stop-color="#42a4eb"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGa)" d="M42,8H19l11,30h12c1.105,0,2-0.895,2-2V10C44,8.895,43.105,8,42,8z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGb" x1="3.865" x2="23.412" y1="9.86" y2="41.663" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1d59b3"/><stop offset="1" stop-color="#195bbc"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGb)" d="M19,8H6c-1.105,0-2,0.895-2,2v26c0,1.105,0.895,2,2,2h8v7.998 c0,0.891,1.077,1.337,1.707,0.707L24.412,38H30L19,8z"/><path fill="#fff" d="M12,25h6v2h-6V25z"/><path fill="#fff" d="M12.109,29L15,20l2.906,9h2.11L16,17h-2l-4,12H12.109z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGc" x1="29.064" x2="38.79" y1="23.554" y2="23.554" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGc)" d="M29.064,27.223c0.061-0.031,4.994-3.219,7.936-9.115L38.79,19 c-3.082,6.25-7.457,9.292-8.509,10L29.064,27.223z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGd" x1="28" x2="40" y1="23.5" y2="23.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGd)" d="M38,29c0,0-5-2.583-7.769-6.998L32,21c2.333,3.833,6.981,6.26,6.981,6.26L38,29z M28,18h12v2 H28V18z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGe" x1="33" x2="35" y1="18" y2="18" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGe)" d="M33,16h2v4h-2V16z"/></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,15 +0,0 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="512px" height="512px"><linearGradient id="gCW9sGJUkBnBLRc40wQXGa" x1="25.447" x2="44.728" y1="4.921" y2="36.29" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#42a3f2"/><stop offset="1" stop-color="#42a4eb"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGa)" d="M42,8H19l11,30h12c1.105,0,2-0.895,2-2V10C44,8.895,43.105,8,42,8z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGb" x1="3.865" x2="23.412" y1="9.86" y2="41.663" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1d59b3"/><stop offset="1" stop-color="#195bbc"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGb)" d="M19,8H6c-1.105,0-2,0.895-2,2v26c0,1.105,0.895,2,2,2h8v7.998 c0,0.891,1.077,1.337,1.707,0.707L24.412,38H30L19,8z"/><path fill="#fff" d="M12,25h6v2h-6V25z"/><path fill="#fff" d="M12.109,29L15,20l2.906,9h2.11L16,17h-2l-4,12H12.109z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGc" x1="29.064" x2="38.79" y1="23.554" y2="23.554" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGc)" d="M29.064,27.223c0.061-0.031,4.994-3.219,7.936-9.115L38.79,19 c-3.082,6.25-7.457,9.292-8.509,10L29.064,27.223z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGd" x1="28" x2="40" y1="23.5" y2="23.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGd)" d="M38,29c0,0-5-2.583-7.769-6.998L32,21c2.333,3.833,6.981,6.26,6.981,6.26L38,29z M28,18h12v2 H28V18z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGe" x1="33" x2="35" y1="18" y2="18" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGe)" d="M33,16h2v4h-2V16z"/></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="Primary">#512BD4</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
<Color x:Key="Yellow100Accent">#F7B548</Color>
<Color x:Key="Yellow200Accent">#FFD590</Color>
<Color x:Key="Yellow300Accent">#FFE5B9</Color>
<Color x:Key="Cyan100Accent">#28C2D1</Color>
<Color x:Key="Cyan200Accent">#7BDDEF</Color>
<Color x:Key="Cyan300Accent">#C3F2F4</Color>
<Color x:Key="Blue100Accent">#3E8EED</Color>
<Color x:Key="Blue200Accent">#72ACF1</Color>
<Color x:Key="Blue300Accent">#A7CBF6</Color>
</ResourceDictionary>

View File

@ -1,384 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,10"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="Background" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>

View File

@ -1,25 +0,0 @@
@inherits LayoutComponentBase
<nav class="navbar navbar-dark bg-dark navbar-expand-sm p-0">
<div class="container-fluid ps-1">
<div class="navbar-brand p-0">
<Icon Filename="translation.svg" Size="35" AltText="App Icon" />
<span class="fw-bold">I18N</span> <span class="fs-6">Commander</span>
</div>
<button class="navbar-toggler p-0 my-1" type="button" data-bs-toggle="collapse" data-bs-target="#navbarContent" aria-controls="navbarContent" aria-expanded="false" aria-label="Toggle navigation">
<Icon Filename="nav-toggle.svg" AltText="Toggles menu" Size="35" />
</button>
<div class="collapse navbar-collapse" id="navbarContent">
<ul class="navbar-nav me-auto">
@foreach (var (text, route, iconFilename) in NavigationTarget.GetAll())
{
<NavItem Text="@text" Route="@route" ShowIcon="@(!string.IsNullOrWhiteSpace(iconFilename))" IconFilename="@iconFilename" />
}
</ul>
</div>
</div>
</nav>
<div class="container-fluid">
@Body
</div>

View File

@ -1,52 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<TargetFrameworks>net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net6.0-windows10.0.19041.0</TargetFrameworks>
<OutputType>Exe</OutputType>
<AssemblyName>I18N Commander</AssemblyName>
<RootNamespace>UI_MAUI</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<EnableDefaultCssItems>false</EnableDefaultCssItems>
<ValidateExecutableReferencesMatchSelfContained>false</ValidateExecutableReferencesMatchSelfContained>
<!-- Display name -->
<ApplicationTitle>I18N Commander</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>org.tsommer.i18n-commander</ApplicationId>
<ApplicationIdGuid>6D8A5F75-4C32-4807-AC75-CD934671D139</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">23.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\app.svg" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" BaseSize="128,128" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataModel\DataModel.csproj" />
<ProjectReference Include="..\Processor\Processor.csproj" />
</ItemGroup>
</Project>

View File

@ -1,9 +0,0 @@
@using System.Net.Http
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using UI_MAUI
@using UI_MAUI.Shared
@using UI_MAUI.Components;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="512px" height="512px"><linearGradient id="PJGLEK~gN3IlHg2NgKbnSa" x1="24" x2="24" y1="654.016" y2="645.747" gradientTransform="matrix(1 0 0 -1 0 660.724)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#eba600"/><stop offset="1" stop-color="#c28200"/></linearGradient><path fill="url(#PJGLEK~gN3IlHg2NgKbnSa)" d="M24.414,10.414l-2.536-2.536C21.316,7.316,20.553,7,19.757,7H5C3.895,7,3,7.895,3,9v30 c0,1.105,0.895,2,2,2h38c1.105,0,2-0.895,2-2V13c0-1.105-0.895-2-2-2H25.828C25.298,11,24.789,10.789,24.414,10.414z"/><linearGradient id="PJGLEK~gN3IlHg2NgKbnSb" x1="24" x2="24" y1="649.87" y2="619.741" gradientTransform="matrix(1 0 0 -1 0 660.724)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffd869"/><stop offset="1" stop-color="#fec52b"/></linearGradient><path fill="url(#PJGLEK~gN3IlHg2NgKbnSb)" d="M21.586,14.414l3.268-3.268C24.947,11.053,25.074,11,25.207,11H43c1.105,0,2,0.895,2,2v26 c0,1.105-0.895,2-2,2H5c-1.105,0-2-0.895-2-2V15.5C3,15.224,3.224,15,3.5,15h16.672C20.702,15,21.211,14.789,21.586,14.414z"/><linearGradient id="PJGLEK~gN3IlHg2NgKbnSc" x1="28" x2="48" y1="409.276" y2="409.276" gradientTransform="translate(0 -371.276)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#21ad64"/><stop offset="1" stop-color="#088242"/></linearGradient><circle cx="38" cy="38" r="10" fill="url(#PJGLEK~gN3IlHg2NgKbnSc)"/><path fill="#fff" d="M38.5,43h-1c-0.276,0-0.5-0.224-0.5-0.5v-9c0-0.276,0.224-0.5,0.5-0.5h1c0.276,0,0.5,0.224,0.5,0.5 v9C39,42.776,38.776,43,38.5,43z"/><path fill="#fff" d="M33,38.5v-1c0-0.276,0.224-0.5,0.5-0.5h9c0.276,0,0.5,0.224,0.5,0.5v1c0,0.276-0.224,0.5-0.5,0.5h-9 C33.224,39,33,38.776,33,38.5z"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="512px" height="512px"><path fill="#ffa000" d="M40,12H22l-4-4H8c-2.199,0-4,1.801-4,4v8h40v-4C44,13.801,42.199,12,40,12z"/><path fill="#ffca28" d="M40,12H8c-2.199,0-4,1.801-4,4v20c0,2.199,1.801,4,4,4h32c2.199,0,4-1.801,4-4V16 C44,13.801,42.199,12,40,12z"/><rect width="2" height="14.142" x="28" y="22.929" fill="#616161" transform="rotate(-45.001 29 30)"/><rect width="2" height="4.243" x="31.5" y="31.379" fill="#37474f" transform="rotate(-45.001 32.5 33.5)"/><path fill="#616161" d="M31,25c0,3.866-3.134,7-7,7s-7-3.134-7-7s3.134-7,7-7S31,21.134,31,25z"/><path fill="#64b5f6" d="M29,25c0,2.761-2.239,5-5,5s-5-2.239-5-5s2.239-5,5-5S29,22.239,29,25z"/></svg>

Before

Width:  |  Height:  |  Size: 723 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="512px" height="512px"><path fill="#546E7A" d="M6 14H42V18H6zM6 22H42V26H6zM6 30H42V34H6z"/><path fill="#2196F3" d="M24,45l-7-6.976h14L24,45z"/></svg>

Before

Width:  |  Height:  |  Size: 217 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="480px" height="480px"><path fill="#607D8B" d="M39.6,27.2c0.1-0.7,0.2-1.4,0.2-2.2s-0.1-1.5-0.2-2.2l4.5-3.2c0.4-0.3,0.6-0.9,0.3-1.4L40,10.8c-0.3-0.5-0.8-0.7-1.3-0.4l-5,2.3c-1.2-0.9-2.4-1.6-3.8-2.2l-0.5-5.5c-0.1-0.5-0.5-0.9-1-0.9h-8.6c-0.5,0-1,0.4-1,0.9l-0.5,5.5c-1.4,0.6-2.7,1.3-3.8,2.2l-5-2.3c-0.5-0.2-1.1,0-1.3,0.4l-4.3,7.4c-0.3,0.5-0.1,1.1,0.3,1.4l4.5,3.2c-0.1,0.7-0.2,1.4-0.2,2.2s0.1,1.5,0.2,2.2L4,30.4c-0.4,0.3-0.6,0.9-0.3,1.4L8,39.2c0.3,0.5,0.8,0.7,1.3,0.4l5-2.3c1.2,0.9,2.4,1.6,3.8,2.2l0.5,5.5c0.1,0.5,0.5,0.9,1,0.9h8.6c0.5,0,1-0.4,1-0.9l0.5-5.5c1.4-0.6,2.7-1.3,3.8-2.2l5,2.3c0.5,0.2,1.1,0,1.3-0.4l4.3-7.4c0.3-0.5,0.1-1.1-0.3-1.4L39.6,27.2z M24,35c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34,30.5,29.5,35,24,35z"/><path fill="#455A64" d="M24,13c-6.6,0-12,5.4-12,12c0,6.6,5.4,12,12,12s12-5.4,12-12C36,18.4,30.6,13,24,13z M24,30c-2.8,0-5-2.2-5-5c0-2.8,2.2-5,5-5s5,2.2,5,5C29,27.8,26.8,30,24,30z"/></svg>

Before

Width:  |  Height:  |  Size: 990 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="512px" height="512px"><linearGradient id="gCW9sGJUkBnBLRc40wQXGa" x1="25.447" x2="44.728" y1="4.921" y2="36.29" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#42a3f2"/><stop offset="1" stop-color="#42a4eb"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGa)" d="M42,8H19l11,30h12c1.105,0,2-0.895,2-2V10C44,8.895,43.105,8,42,8z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGb" x1="3.865" x2="23.412" y1="9.86" y2="41.663" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1d59b3"/><stop offset="1" stop-color="#195bbc"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGb)" d="M19,8H6c-1.105,0-2,0.895-2,2v26c0,1.105,0.895,2,2,2h8v7.998 c0,0.891,1.077,1.337,1.707,0.707L24.412,38H30L19,8z"/><path fill="#fff" d="M12,25h6v2h-6V25z"/><path fill="#fff" d="M12.109,29L15,20l2.906,9h2.11L16,17h-2l-4,12H12.109z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGc" x1="29.064" x2="38.79" y1="23.554" y2="23.554" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGc)" d="M29.064,27.223c0.061-0.031,4.994-3.219,7.936-9.115L38.79,19 c-3.082,6.25-7.457,9.292-8.509,10L29.064,27.223z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGd" x1="28" x2="40" y1="23.5" y2="23.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGd)" d="M38,29c0,0-5-2.583-7.769-6.998L32,21c2.333,3.833,6.981,6.26,6.981,6.26L38,29z M28,18h12v2 H28V18z"/><linearGradient id="gCW9sGJUkBnBLRc40wQXGe" x1="33" x2="35" y1="18" y2="18" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#11408a"/><stop offset="1" stop-color="#103f8f"/></linearGradient><path fill="url(#gCW9sGJUkBnBLRc40wQXGe)" d="M33,16h2v4h-2V16z"/></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,18 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
<title>I18N Commander</title>
<base href="/" />
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/app.css" />
</head>
<body>
<div id="app">Loading...</div>
<script src="js/bootstrap.bundle.min.js"></script>
<script src="_framework/blazor.webview.js" autostart="false"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,76 +0,0 @@
using DataModel.Database;
namespace UI_WinForms;
internal static class AppEvents
{
static AppEvents()
{
AppEvents.AddSomethingHandlers();
}
internal static void ResetAllSubscriptions()
{
WhenSettingsChanged = null;
WhenSectionChanged = null;
WhenTextElementChanged = null;
WhenTranslationChanged = null;
AppEvents.AddSomethingHandlers();
}
#region Event: Settings changed
internal static event EventHandler? WhenSettingsChanged;
internal static void SettingsChanged() => WhenSettingsChanged?.Invoke(null, EventArgs.Empty);
#endregion
#region Event: Section was changed
// Section changed event which can be subscribed:
internal static event EventHandler<Section>? WhenSectionChanged;
// Method to raise the section changed event:
internal static void SectionChanged(Section section) => WhenSectionChanged?.Invoke(null, section);
#endregion
#region Event: Text element was changed
// Text element changed event which can be subscribed:
internal static event EventHandler<TextElement?>? WhenTextElementChanged;
// Method to raise the text element changed event:
internal static void TextElementChanged(TextElement? textElement) => WhenTextElementChanged?.Invoke(null, textElement);
#endregion
#region Translation was changed
// Translation changed event which can be subscribed:
internal static event EventHandler<Translation?>? WhenTranslationChanged;
// Method to raise the translation changed event:
internal static void TranslationChanged(Translation? translation) => WhenTranslationChanged?.Invoke(null, translation);
#endregion
#region Event: Something was changed
internal static event EventHandler? WhenSomethingChanged;
internal static void SomethingChanged() => WhenSomethingChanged?.Invoke(null, EventArgs.Empty);
private static void AddSomethingHandlers()
{
// Raise the something event when any of the other change-events are raised:
WhenSectionChanged += (sender, args) => WhenSomethingChanged?.Invoke(sender, EventArgs.Empty);
WhenTextElementChanged += (sender, args) => WhenSomethingChanged?.Invoke(sender, EventArgs.Empty);
WhenTranslationChanged += (sender, args) => WhenSomethingChanged?.Invoke(sender, EventArgs.Empty);
WhenSettingsChanged += (sender, args) => WhenSomethingChanged?.Invoke(sender, EventArgs.Empty);
}
#endregion
}

View File

@ -1,185 +0,0 @@
namespace UI_WinForms.Components
{
partial class LoaderStart
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.tableLayout = new System.Windows.Forms.TableLayoutPanel();
this.pictureBox = new System.Windows.Forms.PictureBox();
this.labelTitle = new System.Windows.Forms.Label();
this.flowLayoutButtons = new System.Windows.Forms.FlowLayoutPanel();
this.buttonNew = new System.Windows.Forms.Button();
this.buttonOpen = new System.Windows.Forms.Button();
this.labelVersion = new System.Windows.Forms.Label();
this.contextMenuRecentProjects = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.tableLayout.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
this.flowLayoutButtons.SuspendLayout();
this.contextMenuRecentProjects.SuspendLayout();
this.SuspendLayout();
//
// tableLayout
//
this.tableLayout.ColumnCount = 4;
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F));
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 360F));
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayout.Controls.Add(this.pictureBox, 1, 1);
this.tableLayout.Controls.Add(this.labelTitle, 2, 1);
this.tableLayout.Controls.Add(this.flowLayoutButtons, 1, 2);
this.tableLayout.Controls.Add(this.labelVersion, 1, 3);
this.tableLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayout.Location = new System.Drawing.Point(0, 0);
this.tableLayout.Name = "tableLayout";
this.tableLayout.RowCount = 5;
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 128F));
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 66F));
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayout.Size = new System.Drawing.Size(937, 465);
this.tableLayout.TabIndex = 0;
//
// pictureBox
//
this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox.Image = global::UI_WinForms.Resources.Icons.icons8_language_512;
this.pictureBox.Location = new System.Drawing.Point(227, 118);
this.pictureBox.Name = "pictureBox";
this.pictureBox.Size = new System.Drawing.Size(122, 122);
this.pictureBox.TabIndex = 0;
this.pictureBox.TabStop = false;
//
// labelTitle
//
this.labelTitle.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelTitle.Font = new System.Drawing.Font("Segoe UI", 28F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.labelTitle.Location = new System.Drawing.Point(355, 115);
this.labelTitle.Name = "labelTitle";
this.labelTitle.Size = new System.Drawing.Size(354, 128);
this.labelTitle.TabIndex = 1;
this.labelTitle.Text = "I18N Commander";
this.labelTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// flowLayoutButtons
//
this.tableLayout.SetColumnSpan(this.flowLayoutButtons, 2);
this.flowLayoutButtons.Controls.Add(this.buttonNew);
this.flowLayoutButtons.Controls.Add(this.buttonOpen);
this.flowLayoutButtons.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutButtons.Location = new System.Drawing.Point(224, 243);
this.flowLayoutButtons.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutButtons.Name = "flowLayoutButtons";
this.flowLayoutButtons.Size = new System.Drawing.Size(488, 66);
this.flowLayoutButtons.TabIndex = 2;
//
// buttonNew
//
this.buttonNew.Image = global::UI_WinForms.Resources.Icons.icons8_new_window_512;
this.buttonNew.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonNew.Location = new System.Drawing.Point(3, 3);
this.buttonNew.Name = "buttonNew";
this.buttonNew.Size = new System.Drawing.Size(200, 60);
this.buttonNew.TabIndex = 0;
this.buttonNew.Text = "New Project";
this.buttonNew.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.buttonNew.UseVisualStyleBackColor = true;
this.buttonNew.Click += new System.EventHandler(this.buttonNew_Click);
//
// buttonOpen
//
this.buttonOpen.Image = global::UI_WinForms.Resources.Icons.icons8_open_file_under_cursor_512;
this.buttonOpen.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.buttonOpen.Location = new System.Drawing.Point(209, 3);
this.buttonOpen.Name = "buttonOpen";
this.buttonOpen.Size = new System.Drawing.Size(259, 60);
this.buttonOpen.TabIndex = 1;
this.buttonOpen.Text = "Open Recent Project";
this.buttonOpen.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.buttonOpen.UseVisualStyleBackColor = true;
this.buttonOpen.Click += new System.EventHandler(this.buttonOpen_Click);
//
// labelVersion
//
this.labelVersion.AutoSize = true;
this.labelVersion.BackColor = System.Drawing.Color.LightGray;
this.tableLayout.SetColumnSpan(this.labelVersion, 2);
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelVersion.Location = new System.Drawing.Point(227, 309);
this.labelVersion.Name = "labelVersion";
this.labelVersion.Size = new System.Drawing.Size(482, 40);
this.labelVersion.TabIndex = 3;
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// contextMenuRecentProjects
//
this.contextMenuRecentProjects.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.contextMenuRecentProjects.ImageScalingSize = new System.Drawing.Size(20, 20);
this.contextMenuRecentProjects.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItem1});
this.contextMenuRecentProjects.Name = "contextMenuRecentProjects";
this.contextMenuRecentProjects.Size = new System.Drawing.Size(73, 26);
this.contextMenuRecentProjects.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.contextMenuRecentProjects_Closing);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(72, 22);
//
// LoaderStart
//
this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tableLayout);
this.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.Name = "LoaderStart";
this.Size = new System.Drawing.Size(937, 465);
this.tableLayout.ResumeLayout(false);
this.tableLayout.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
this.flowLayoutButtons.ResumeLayout(false);
this.contextMenuRecentProjects.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private TableLayoutPanel tableLayout;
private PictureBox pictureBox;
private Label labelTitle;
private FlowLayoutPanel flowLayoutButtons;
private Button buttonNew;
private Button buttonOpen;
private ContextMenuStrip contextMenuRecentProjects;
private ToolStripMenuItem toolStripMenuItem1;
private Label labelVersion;
}
}

View File

@ -1,206 +0,0 @@
using System.ComponentModel;
using Microsoft.Win32;
using Version = Processor.Version;
namespace UI_WinForms.Components;
[DefaultEvent(nameof(LoadProject))]
public partial class LoaderStart : UserControl
{
private bool areRecentProjectsVisible = false;
public LoaderStart()
{
this.InitializeComponent();
this.labelVersion.Text = Version.Text;
}
#region Recent Projects
private static RegistryKey I18NCommanderKey => Registry.CurrentUser.OpenSubKey("Software", RegistryKeyPermissionCheck.ReadWriteSubTree)!.CreateSubKey("I18N Commander", RegistryKeyPermissionCheck.ReadWriteSubTree);
/// <summary>
/// Gets or sets the list of recent projects without any extras e.g. it does not prune the list of projects.
/// </summary>
private static List<string> RecentProjects
{
get
{
using var regKey = LoaderStart.I18NCommanderKey;
var recentProjectsValue = regKey.GetValue("recentProjects");
return recentProjectsValue switch
{
string[] list => new List<string>(list),
_ => new List<string>(),
};
}
set
{
using var regKey = LoaderStart.I18NCommanderKey;
regKey.SetValue("recentProjects", value.ToArray(), RegistryValueKind.MultiString);
}
}
private static void UpdateRecentProjectsWithPruning(string latestUsedProjectPath)
{
var previousRecentList = LoaderStart.RecentProjects;
// Check, if the latest project is identical to the next project we open. In that case, we don't add it to the list.
if (previousRecentList.Any() && previousRecentList[0] == latestUsedProjectPath)
return;
// Add the next project to the list:
previousRecentList.Insert(0, latestUsedProjectPath);
// Prune the list:
if (previousRecentList.Count > 6)
previousRecentList = previousRecentList.Take(6).ToList();
LoaderStart.RecentProjects = previousRecentList;
}
#endregion
// Opens the recent projects dropdown menu.
private void buttonOpen_Click(object sender, EventArgs e)
{
if(this.DesignMode)
return;
if(this.areRecentProjectsVisible)
{
this.areRecentProjectsVisible = false;
this.contextMenuRecentProjects.Close();
return;
}
var recentProjects = LoaderStart.RecentProjects;
this.contextMenuRecentProjects.Items.Clear();
this.contextMenuRecentProjects.Items.Add("Browse for project...", Resources.Icons.icons8_browse_folder_512, (innerSender, args) => this.BrowseForProject());
foreach (var recentProject in recentProjects)
{
var fileInfo = new FileInfo(recentProject);
// Split the file's path into each folder's name:
var folderNames = fileInfo.DirectoryName!.Split(Path.DirectorySeparatorChar);
// Distinguish between I18N Commander projects and JSON imports:
if (fileInfo.Extension == ".i18nc")
{
// Render this entry:
var item = this.contextMenuRecentProjects.Items.Add($"{folderNames.Last()}: {fileInfo.Name}", Resources.Icons.icons8_document_512, (innerSender, args) => this.OpenRecentProject(innerSender, LoaderAction.LOAD_PROJECT));
item.Tag = recentProject;
}
else if (fileInfo.Extension == ".json")
{
// Render this entry:
var item = this.contextMenuRecentProjects.Items.Add($"{folderNames.Last()}: {fileInfo.Name}", Resources.Icons.icons8_git, (innerSender, args) => this.OpenRecentProject(innerSender, LoaderAction.IMPORT_JSON));
item.Tag = recentProject;
}
}
var button = (sender as Button)!;
this.contextMenuRecentProjects.Show(button, 0, button.Height);
this.areRecentProjectsVisible = true;
}
private void buttonNew_Click(object sender, EventArgs e)
{
if(this.DesignMode)
return;
var saveDialog = new SaveFileDialog
{
AddExtension = true,
CheckPathExists = true,
CheckFileExists = false,
CreatePrompt = false,
OverwritePrompt = true,
DereferenceLinks = true,
DefaultExt = ".i18nc",
Filter = "I18N Commander Files (*.i18nc)|*.i18nc",
RestoreDirectory = true,
Title = "Create a new I18N Commander file",
};
var dialogResult = saveDialog.ShowDialog(this);
if (dialogResult != DialogResult.OK)
return;
var destinationFilePath = saveDialog.FileName;
// When the user chose an existing file, we delete it:
// (note: the user already accepts overwriting the file)
if (File.Exists(destinationFilePath))
File.Delete(destinationFilePath);
LoaderStart.UpdateRecentProjectsWithPruning(destinationFilePath);
this.OpenProject(LoaderAction.CREATE_NEW_PROJECT, destinationFilePath);
}
private void BrowseForProject()
{
var openDialog = new OpenFileDialog
{
AddExtension = true,
CheckPathExists = true,
CheckFileExists = true,
DereferenceLinks = true,
DefaultExt = ".i18nc",
// I18N Commander files (*.i18nc) or JSON files (*.json):
Filter = "I18N Commander Files (*.i18nc)|*.i18nc|JSON Files (*.json)|*.json",
Multiselect = false,
RestoreDirectory = true,
Title = "Open an I18N Commander file or Import a JSON file",
};
var dialogResult = openDialog.ShowDialog(this);
if (dialogResult != DialogResult.OK)
return;
var projectFilePath = openDialog.FileName;
LoaderStart.UpdateRecentProjectsWithPruning(projectFilePath);
// Check, if the user chose an I18N Commander file or a JSON file:
if (projectFilePath.ToLowerInvariant().EndsWith(".i18nc", StringComparison.InvariantCulture))
this.OpenProject(LoaderAction.LOAD_PROJECT, projectFilePath);
else if (projectFilePath.ToLowerInvariant().EndsWith(".json", StringComparison.InvariantCulture))
this.OpenProject(LoaderAction.IMPORT_JSON, projectFilePath);
}
private void OpenRecentProject(object? sender, LoaderAction action)
{
if (sender is not ToolStripItem item)
return;
var path = (item.Tag as string)!;
LoaderStart.UpdateRecentProjectsWithPruning(path);
this.OpenProject(action, path);
}
private void OpenProject(LoaderAction action, string path)
{
// Hint: the project file might or might not exist (new project vs. recent project)
this.LoadProject?.Invoke(this, new LoaderResult(action, path));
}
private void contextMenuRecentProjects_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
this.areRecentProjectsVisible = false;
}
[Category("Settings"), Description("When the user chooses a project to load.")]
public event EventHandler<LoaderResult>? LoadProject;
public readonly record struct LoaderResult(LoaderAction Action, string DataFile);
public enum LoaderAction
{
NONE,
LOAD_PROJECT,
CREATE_NEW_PROJECT,
IMPORT_JSON,
}
}

View File

@ -1,63 +0,0 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuRecentProjects.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -1,251 +0,0 @@
namespace UI_WinForms.Components
{
partial class Main
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
this.tableLayout = new System.Windows.Forms.TableLayoutPanel();
this.splitContainerLR = new System.Windows.Forms.SplitContainer();
this.sectionTree = new UI_WinForms.Components.SectionTree();
this.splitContainerRTB = new System.Windows.Forms.SplitContainer();
this.textElements = new UI_WinForms.Components.TextElements();
this.translations = new UI_WinForms.Components.Translations();
this.translationProgress = new UI_WinForms.Components.TranslationProgress();
this.tabControl = new System.Windows.Forms.TabControl();
this.tabTranslation = new System.Windows.Forms.TabPage();
this.tabSettings = new System.Windows.Forms.TabPage();
this.settings = new UI_WinForms.Components.Settings();
this.imageList = new System.Windows.Forms.ImageList(this.components);
this.tableLayout.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainerLR)).BeginInit();
this.splitContainerLR.Panel1.SuspendLayout();
this.splitContainerLR.Panel2.SuspendLayout();
this.splitContainerLR.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainerRTB)).BeginInit();
this.splitContainerRTB.Panel1.SuspendLayout();
this.splitContainerRTB.Panel2.SuspendLayout();
this.splitContainerRTB.SuspendLayout();
this.tabControl.SuspendLayout();
this.tabTranslation.SuspendLayout();
this.tabSettings.SuspendLayout();
this.SuspendLayout();
//
// tableLayout
//
this.tableLayout.ColumnCount = 1;
this.tableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayout.Controls.Add(this.splitContainerLR, 0, 1);
this.tableLayout.Controls.Add(this.translationProgress, 0, 0);
this.tableLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayout.Location = new System.Drawing.Point(3, 3);
this.tableLayout.Name = "tableLayout";
this.tableLayout.RowCount = 2;
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayout.Size = new System.Drawing.Size(1237, 709);
this.tableLayout.TabIndex = 0;
//
// splitContainerLR
//
this.splitContainerLR.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.splitContainerLR.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainerLR.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainerLR.Location = new System.Drawing.Point(3, 23);
this.splitContainerLR.Name = "splitContainerLR";
//
// splitContainerLR.Panel1
//
this.splitContainerLR.Panel1.Controls.Add(this.sectionTree);
this.splitContainerLR.Panel1MinSize = 300;
//
// splitContainerLR.Panel2
//
this.splitContainerLR.Panel2.Controls.Add(this.splitContainerRTB);
this.splitContainerLR.Size = new System.Drawing.Size(1231, 683);
this.splitContainerLR.SplitterDistance = 319;
this.splitContainerLR.TabIndex = 1;
//
// sectionTree
//
this.sectionTree.Dock = System.Windows.Forms.DockStyle.Fill;
this.sectionTree.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.sectionTree.Location = new System.Drawing.Point(0, 0);
this.sectionTree.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.sectionTree.Name = "sectionTree";
this.sectionTree.Size = new System.Drawing.Size(317, 681);
this.sectionTree.TabIndex = 0;
//
// splitContainerRTB
//
this.splitContainerRTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.splitContainerRTB.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainerRTB.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainerRTB.Location = new System.Drawing.Point(0, 0);
this.splitContainerRTB.Name = "splitContainerRTB";
this.splitContainerRTB.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainerRTB.Panel1
//
this.splitContainerRTB.Panel1.Controls.Add(this.textElements);
this.splitContainerRTB.Panel1MinSize = 376;
//
// splitContainerRTB.Panel2
//
this.splitContainerRTB.Panel2.Controls.Add(this.translations);
this.splitContainerRTB.Size = new System.Drawing.Size(908, 683);
this.splitContainerRTB.SplitterDistance = 376;
this.splitContainerRTB.TabIndex = 0;
//
// textElements
//
this.textElements.Dock = System.Windows.Forms.DockStyle.Fill;
this.textElements.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.textElements.Location = new System.Drawing.Point(0, 0);
this.textElements.Name = "textElements";
this.textElements.Size = new System.Drawing.Size(906, 374);
this.textElements.TabIndex = 0;
//
// translations
//
this.translations.Dock = System.Windows.Forms.DockStyle.Fill;
this.translations.Enabled = false;
this.translations.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.translations.Location = new System.Drawing.Point(0, 0);
this.translations.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.translations.Name = "translations";
this.translations.Size = new System.Drawing.Size(906, 301);
this.translations.TabIndex = 0;
//
// translationProgress
//
this.translationProgress.Dock = System.Windows.Forms.DockStyle.Fill;
this.translationProgress.Location = new System.Drawing.Point(0, 0);
this.translationProgress.Margin = new System.Windows.Forms.Padding(0);
this.translationProgress.Name = "translationProgress";
this.translationProgress.Size = new System.Drawing.Size(1237, 20);
this.translationProgress.TabIndex = 2;
//
// tabControl
//
this.tabControl.Alignment = System.Windows.Forms.TabAlignment.Left;
this.tabControl.Controls.Add(this.tabTranslation);
this.tabControl.Controls.Add(this.tabSettings);
this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl.ImageList = this.imageList;
this.tabControl.Location = new System.Drawing.Point(0, 0);
this.tabControl.Multiline = true;
this.tabControl.Name = "tabControl";
this.tabControl.Padding = new System.Drawing.Point(12, 12);
this.tabControl.SelectedIndex = 0;
this.tabControl.Size = new System.Drawing.Size(1317, 723);
this.tabControl.TabIndex = 1;
this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
//
// tabTranslation
//
this.tabTranslation.Controls.Add(this.tableLayout);
this.tabTranslation.ImageIndex = 1;
this.tabTranslation.Location = new System.Drawing.Point(70, 4);
this.tabTranslation.Name = "tabTranslation";
this.tabTranslation.Padding = new System.Windows.Forms.Padding(3);
this.tabTranslation.Size = new System.Drawing.Size(1243, 715);
this.tabTranslation.TabIndex = 0;
this.tabTranslation.Text = "Translation";
this.tabTranslation.UseVisualStyleBackColor = true;
//
// tabSettings
//
this.tabSettings.Controls.Add(this.settings);
this.tabSettings.ImageIndex = 0;
this.tabSettings.Location = new System.Drawing.Point(70, 4);
this.tabSettings.Name = "tabSettings";
this.tabSettings.Padding = new System.Windows.Forms.Padding(3);
this.tabSettings.Size = new System.Drawing.Size(1243, 715);
this.tabSettings.TabIndex = 1;
this.tabSettings.Text = "Settings";
this.tabSettings.UseVisualStyleBackColor = true;
//
// settings
//
this.settings.Dock = System.Windows.Forms.DockStyle.Fill;
this.settings.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.settings.Location = new System.Drawing.Point(3, 3);
this.settings.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.settings.Name = "settings";
this.settings.Size = new System.Drawing.Size(1237, 709);
this.settings.TabIndex = 0;
//
// imageList
//
this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
this.imageList.TransparentColor = System.Drawing.Color.Transparent;
this.imageList.Images.SetKeyName(0, "icons8-settings.svg.png");
this.imageList.Images.SetKeyName(1, "icons8-language-45.png");
//
// Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tabControl);
this.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.Name = "Main";
this.Size = new System.Drawing.Size(1317, 723);
this.tableLayout.ResumeLayout(false);
this.splitContainerLR.Panel1.ResumeLayout(false);
this.splitContainerLR.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainerLR)).EndInit();
this.splitContainerLR.ResumeLayout(false);
this.splitContainerRTB.Panel1.ResumeLayout(false);
this.splitContainerRTB.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainerRTB)).EndInit();
this.splitContainerRTB.ResumeLayout(false);
this.tabControl.ResumeLayout(false);
this.tabTranslation.ResumeLayout(false);
this.tabSettings.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private TableLayoutPanel tableLayout;
private SplitContainer splitContainerLR;
private SplitContainer splitContainerRTB;
private SectionTree sectionTree;
private TextElements textElements;
private TabControl tabControl;
private TabPage tabTranslation;
private TabPage tabSettings;
private ImageList imageList;
private Settings settings;
private Translations translations;
private TranslationProgress translationProgress;
}
}

View File

@ -1,56 +0,0 @@
using DataModel.Database;
using Processor;
using UI_WinForms.Dialogs;
namespace UI_WinForms.Components;
public partial class Main : UserControl
{
public Main()
{
this.InitializeComponent();
Program.RestartMainApp = false;
// Register the something changed event to trigger the export:
AppEvents.WhenSomethingChanged += async (_, _) => await ExportProcessor.TriggerExport();
// Check, if the DeepL integration is enabled, but no API key is set:
this.Load += async (sender, args) =>
{
var deepLAPIKey = await AppSettings.GetDeepLAPIKey();
var deepLMode = await AppSettings.GetDeepLMode();
if (deepLMode is not SettingDeepLMode.DISABLED && string.IsNullOrWhiteSpace(deepLAPIKey))
{
// Show the input dialog to ask the user for the DeepL API key:
var inputDialog = InputDialog.Show(new InputDialog.Options
{
Title = "I18NCommander - DeepL API Key",
Message = "The DeepL integration is enabled, but there is no API key set. Do you want to set one now?",
OkButtonText = "Set API key",
CancelButtonText = "No, thanks",
ShowQuestionCheckbox = false,
});
if (inputDialog.DialogResult == DialogResult.OK)
{
await AppSettings.SetDeepLAPIKey(inputDialog.Text);
AppEvents.SettingsChanged();
}
}
};
}
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.settings.NeedRestart())
{
var result = MessageBox.Show("You need to restart the app for the changes to take effect. Do you want to restart?", "Restart required", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if(result == DialogResult.Yes)
{
Program.RestartMainApp = true;
AppEvents.ResetAllSubscriptions();
this.ParentForm!.Close();
}
}
}
}

View File

@ -1,386 +0,0 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAHEoAAAJNU0Z0AUkBTAIBAQIB
AAFgAQABYAEAAS0BAAEtAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABtAMAAS0DAAEBAQABIAUAAZAB
fvoAAw8BFAMTARkEAf8A/wAqAAMnATkDTgGWA1EBoQNRAaEDUQGhA04BlgMnATp8AAMLAQ4CUwFRAaIB
XQFbAVoBxwMlATb/AP8AJgADEQEWA1EB8wE6AjkB/wE9ATwBOwH/AT0BPAE7Af8BPQE8ATsB/wE6AjkB
/wNSAfQDEQEWeAADEgEYA10BzAG8AVsBGQH/AWICXgHXAxABFf8A/wAiAAM/AW4BRgFDAUIB/wHEAa8B
pgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AcQBrgGmAf8BRgFDAUIB/wNAAXB4AAMSARgDXQHMAbwB
WwEZAf8BvAFbARkB/wFhAV8BWwHYAyUBNwQB/wD/ABoAA1gBtwFXAVIBUAH/Ad4BxQG7Af8B5wHNAcIB
/wHnAc0BwgH/AecBzQHCAf8B3gHFAbsB/wFXAVIBTwH/A1gBugQBdAADEgEYA10BzAG7AVsBGQH/AbwB
WwEZAf8BvAFbARkB/wFjAl8B1QIaARkBI/8A8QADAwEEAyIBMQMpAT4DEgEYFAADEgEYA2AB2wF7AXAB
bAH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wF6AXABawH/A2AB2wMTARoU
AAMSARcDKQE+AyIBMQMDAQRQAAMSARgDXQHMAbsBWwEZAf8BuwFbARkB/wG7AVsBGQH/AbwBWwEZAf8B
YQJdAdQDIQEvBAH/AOUAAwIBAwM9AWkDWwHkA1cB7wNbAdADNgFZAwQBBQwAAygBOwNdAewBqwGaAZMB
/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8BqgGZAZIB/wNcAe0DKQE9DAAD
AwEEAzYBVwNdAc8DVwHvA18B5QM+AWoDAgEDTAADEgEYA10BzAG7AVsBGgH/AbsBWwEZAf8BuwFbARkB
/wG7AVsBGQH/AbsBWwEZAf8BXwFcAVsB0wMiATH/AOEAAwIBAwM0AVMDWAHxAW8BaQFmAf8BtwGrAaQB
/wFdAVkBVwH/AzoB+wNRAaQDGQEiAwQBBQMJAQwDPwFuATgCNwH7AdwByAG+Af8B5wHOAcMB/wHnAc0B
wgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AdgBwAG2Af8DKwH8A0ABcQMKAQ0DAwEEAxgBIANRAaIB
OwE6ATkB+wFeAVcBVAH/AbYBowGbAf8BcAFnAWMB/wNZAfIDNQFVAwIBA0gAAxIBGANdAcwBuwFbARoB
/wG7AVsBGgH/AbsBWwEZAf8BuwFbARkB/wG7AVsBGQH/AbsBWwEZAf8BYQJdAdQDGAEg/wDZAAMDAQQD
PQFoA1gB8QF/AXQBbwH/AeMBzAHBAf8B7AHaAdAB/wHkAdUBywH/AacBnQGXAf8BUwFQAU8B/wNbAeQD
TgGYA1UBtANdAewBeAFyAW4B/wHtAdwB0gH/AeoB1QHLAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AXUBawFnAf8DXAHtA1YBtQNOAZcDXgHiAVMBTgFMAf8BpAGUAY0B/wHfAcYB
uwH/AecBzQHCAf8B4wHJAb4B/wGAAXUBcAH/A1kB8gM+AWoDAwEERAADEgEYA10BzAG6AVsBGgH/AbsB
WwEaAf8BuwFbARoB/wG7AVsBGgH/AbsBWwEZAf8BuwFbARkB/wG7AVsBGQH/AWECXAHWAyUBN/8A1QAD
IQEvA14B4wFvAWoBZgH/AeMBzAHCAf8B5wHNAcIB/wHoAdABxQH/Ae0B3AHSAf8B7QHdAdMB/wHoAdkB
zwH/AYQBfgF5Af8DNwH/AU4BTAFLAf8BtwGrAaUB/wHqAdsB0QH/Ae0B3QHTAf8B7QHdAdMB/wHrAdUB
ywH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5QHLAcAB/wGzAaABmAH/AU0BSgFIAf8B
NwI2Af8BgQF1AXEB/wHjAckBvwH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B4wHJAb4B
/wFwAWcBYwH/A18B5QMiATEkAAMhATADUgGgAlYBVAGrAlYBVAGrAlYBVAGrAlYBVAGrAlYBVAGrAlYB
VAGrAlgBVgGzAXQBYgFVAe4BugFbARoB/wG6AVsBGgH/AbsBWwEaAf8BuwFbARoB/wG7AVsBGgH/AbsB
WwEaAf8BuwFbARkB/wG7AVsBGQH/AWwCXwHlA1UBrQJWAVQBqwJWAVQBqwJWAVQBqwJUAVMBqQJWAVQB
qwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQBqwJWAVQB
qwNSAaADIQEw/wCNAAMoATwDXAHtAbcBqwGkAf8B7AHbAdAB/wHpAdEBxgH/AecBzQHCAf8B6AHRAcYB
/wHsAdoB0AH/Ae0B3QHTAf8B7AHcAdIB/wHeAc8BxgH/AewB3AHSAf8B7QHdAdMB/wHtAd0B0wH/Ae0B
3QHTAf8B7QHdAdMB/wHtAd0B0wH/AeoB1QHLAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB
/wHnAc0BwgH/AeYBzAHBAf8B2AHAAbYB/wHmAcwBwQH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AbEBngGXAf8DVwHvAykBPSAAAyABLgFxAV0BWgHsAbkBWgEaAf8B
uQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG6AVoBGgH/AboBWgEaAf8BugFbARoB/wG6AVsB
GgH/AboBWwEaAf8BugFbARoB/wG6AVsBGgH/AboBWwEaAf8BuwFbARoB/wG7AVsBGgH/AbsBWwEaAf8B
uwFbARkB/wG7AVsBGQH/AbsBWwEZAf8BuwFbARkB/wG7AVsBGQH/AbwBWwEZAf8BtQF1ASsB/AHsAaQB
QgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B
6wGkAUIB/wHrAaQBQgH/AesBpAFCAf8B6wGkAUIB/wF3AW8BYQHrAyABLf8AiQADEAEVA1sBzQFcAVkB
VgH/AeMB1AHLAf8B7QHcAdIB/wHpAdEBxgH/AecBzQHCAf8B6AHQAcUB/wHsAdsB0QH/Ae0B3QHTAf8B
7QHdAdMB/wHtAd0B0wH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/Ae0B3QHTAf8B7QHdAdMB/wHtAdwB
0gH/AesB1QHKAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B3QHFAboB/wFaAVUB
UgH/A10BzgMRARYgAAMzAVABgwFgAT8B9gG5AVoBGwH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AbkB
WgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BugFaARoB/wG6AVsBGgH/AboBWwEaAf8BugFbARoB
/wG6AVsBGgH/AboBWwEaAf8BugFbARoB/wG7AVsBGgH/AbsBWwEaAf8BuwFbARoB/wG7AVsBGQH/AbsB
WwEZAf8BuwFbARkB/wGlAWkBJgH+Ab4BigFAAf0B7QGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB
/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AesB
pAFCAf8BlwF6AUgB9gMzAVD/AI0AAzMBUgNNAfoBpgGbAZUB/wHtAd0B0wH/AewB2wHQAf8B6QHRAcYB
/wHrAdcB0AH/AewB2gHTAf8B7AHbAdEB/wHtAd0B0wH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/Ae0B
3QHTAf8B7QHdAdMB/wHqAdoB0AH/AcYBuQGxAf8B6gHaAdAB/wHqAdUBygH/AecBzgHDAf8B5wHNAcIB
/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wGhAZEBiwH/AToCOQH7AzUBViQAAzMBUQGMAVsBQAH3AbgBWgEbAf8BuQFaARsB
/wG5AVoBGwH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG6AVoBGgH/AboB
WgEaAf8BugFaARoB/wG6AVsBGgH/AboBWwEaAf8BugFbARoB/wG6AVsBGgH/AboBWwEaAf8BuwFbARoB
/wG7AVsBGgH/AbsBWwEaAf8BuwFbARkB/wG7AVsBGQH/AaoBbwEqAf4BwwGZAUAB/QHtAaQBQgH/Ae0B
pAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB
/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wGXAXoBSAH2AzMBUf8AjQADAwEEA1ABnQFSAU8BTQH/AecB
1wHNAf8B7QHdAdMB/wHwAeQB3wH/AfYB8gH3Af8B9QHxAfUB/wHtAdsB1QH/AewB2gHQAf8B7QHdAdMB
/wHYAcoBwQH/AcYBuQGxAf8B6AHWAcwB/wHfAcsBwQH/Ac8BuwGxAf8BQQI/Af8BzwG6AbEB/wHfAcoB
wAH/AaQBlgGPAf8BjwGCAXwB/wHmAcwBwQH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B4QHIAb4B/wFQAUwBSgH/A1EBogMDAQQkAAMzAVEBjAFbAUAB
9wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG5AVoBGwH/AbkBWgEbAf8BuQFaARoB/wG5AVoBGgH/AbkB
WgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BugFaARoB/wG6AVsBGgH/AboBWwEaAf8BugFbARoB
/wG6AVsBGgH/AboBWwEaAf8BugFbARoB/wG7AVsBGgH/AbsBWwEaAf8BuwFbARoB/wGzAXMBKwH8AewB
owFBAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB
/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8BlwF6AUgB9gMzAVH/AJEAAxcB
HwNdAd8BfwF5AXQB/wHsAdwB0gH/Ae0B3QHUAf8B9ALtAf8B8AHkAeIB/wHnAc0BwgH/AeUBzgHDAf8B
uwGvAagB/wFGAUQBQwH/AU8BSwFJAf8B0AG3AawB/wHQAbcBrAH/AcQBrQGjAf8BOAI3Af8BxAGtAaMB
/wHDAawBogH/AU8BSwFJAf8BZAFcAVkB/wHiAcgBvQH/AeYBzAHBAf8B5gHMAcEB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AeYBzAHBAf8BfgF0AW4B/wNeAeIDGAEgKAADMwFRAYwBWwFAAfcB
uAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG4AVoBGwH/AbkBWgEbAf8BuQFaARoB/wG5AVoB
GgH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BugFaARoB/wG6AVoBGgH/AboBWwEaAf8B
ugFbARoB/wG6AVsBGgH/AboBWwEaAf8BugFbARoB/wG6AVsBGgH/AbsBWwEaAf8BugGEATgB+wHtAaQB
QgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/AewBpAFCAf8B
7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AZcBegFIAfYDMwFR/wCRAAMDAQQD
TQGTAzYB/wHaAcoBwQH/Ae0B3QHTAf8B7gHfAdYB/wHtAd0B1AH/AeUBzgHDAf8BlgGIAYIB/wE4AjcB
/wFsAWMBXwH/AbYBoQGYAf8B0AG3AawB/wHQAbcBrAH/AcwBtAGpAf8BnAGLAYQB/wHMAbQBqQH/AbYB
ogGYAf8BVAFPAUwB/wGqAZcBjwH/Ac8BtgGsAf8BlAGFAYAB/wGvAZ4BlgH/AeYBzAHBAf8B5wHNAcIB
/wHnAc0BwgH/AecBzQHCAf8B2QHAAbYB/wE3AjYB/wNOAZYDAwEEKAADMwFRAYwBWwFAAfcBuAFaARsB
/wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG5AVoBGwH/AbkB
WgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AboBWgEaAf8BugFaARoB
/wG6AVsBGgH/AboBWwEaAf8BugFbARoB/wG6AVsBGgH/AaoBZgErAfwB1gGMAU0B/gHtAaQBQgH/Ae0B
pAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB
/wHsAaQBQgH/AewBpAFCAf8B7AGkAUIB/wHsAaQBQgH/AZcBegFIAfYDMwFR/wCRAAMJAQwDVgGyAUkB
RgFFAf8B5gHPAcQB/wHtAdwB0gH/Ae0B3QHTAf8B7QHdAdMB/wG8AbABqAH/AjgBNwH/AXsBcAFrAf8B
zgG1AaoB/wHQAbcBrAH/AdABtwGsAf8B0AG3AawB/wHQAbcBrAH/AdABtwGsAf8B0AG3AawB/wHPAbYB
qwH/AcwBtAGpAf8BzwG2AasB/wGEAXcBcgH/AzUB/wGTAYUBfwH/AeYBzAHBAf8B5wHNAcIB/wHnAc0B
wgH/AecBzQHCAf8B5gHMAcEB/wFQAUsBSgH/A1UBtAMJAQwoAAMzAVEBiwFbAUAB9wG3AVoBGwH/AbgB
WgEbAf8BuAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BuQFaARsB
/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG6AVoBGgH/AboB
WgEaAf8BugFbARoB/wG6AVsBGgH/AboBWwEaAf8BrgFtATEB+wHuAaQBQgH/Ae0BpAFCAf8B7QGkAUIB
/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0B
pAFCAf8B7AGkAUIB/wHsAaQBQgH/AewBpAFCAf8BlwF6AUgB9gMzAVH/AIkAAxMBGgMpAT0DQAFwA14B
6wGvAZ8BmAH/AecBzQHCAf8B6QHRAcYB/wHsAdsB0AH/AdYByAG/Af8BRgFEAUMB/wFrAWIBXgH/Ac4B
tQGqAf8B0AG3AawB/wHOAbYBqwH/AaIBkQGJAf8BaAFgAVwB/wFBAT8BPgH/AzUB/wFBAT4BPQH/AWgB
XwFbAf8BogGQAYgB/wHNAbQBqgH/AZQBhQF+Af8BhAF3AXEB/wHPAbYBrAH/AeMByQG+Af8B5wHNAcIB
/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wG0AaIBmgH/A14B6wM/AW4DKAE8AxMBGSAAAzMBUQGLAVsB
QAH3AbcBWgEbAf8BtwFaARsB/wG4AVoBGwH/AbgBWgEbAf8BwwFyATwB/wHLAYUBVgH/Ab8BaQEwAf8B
uAFaARsB/wG4AVoBGwH/AbkBWgEbAf8BuQFaARsB/wG9AWQBKAH/AcsBhQFWAf8BxQF2AUEB/wG5AVoB
GgH/AbkBWgEaAf8BuQFaARoB/wG6AVoBGgH/AboBWwEaAf8BvgFVATUB/QHCAZcBQAH9Ae4BpAFCAf8B
7gGkAUIB/wHeAZQBOgH/Ae0BowFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wHrAaIB
QQH/Ad0BkwE6Af8B7QGkAUIB/wHtAaQBQgH/AewBpAFCAf8B7AGkAUIB/wGXAXoBSAH2AzMBUf8AfQAD
EQEWA0ABcANYAboDYAHbA1wB7QMrAfwBdgFwAW0B/wHpAdkBzwH/AekB0QHHAf8B5wHNAcIB/wHoAdAB
xQH/AYUBfQF3Af8BPgE8ATsB/wGxAZ0BlAH/AdABtwGsAf8BzgG2AasB/wGCAXUBcAH/AT0CPAH/AUsB
YAFnAf8BcgGnAboB/wF9AbsB0gH/AXIBqAG8Af8BTAFhAWgB/wE9AjwB/wGBAXQBbwH/Ac0BtQGqAf8B
zwG2AasB/wHAAakBnwH/AYUBeAFzAf8BoAGQAYkB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHlAcsB
wAH/AXkBbwFqAf8COAE3AfsDXQHsA2AB2wNYAbgDQAFvAxEBFhQAAzMBUQGLAVsBQAH3AbcBWgEbAf8B
twFaARsB/wG3AVoBGwH/AbcBWgEbAf8BzgGMAWEB/wH7AfUB8QH/Ad0BsQGTAf8BuAFaARsB/wG4AVoB
GwH/AbgBWgEbAf8BuAFaARsB/wHWAaABfAH/AfsB9QHxAf8B1wGhAX4B/wG5AVoBGgH/AbkBWgEaAf8B
uQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BvgFiATwB/QHUAYkBTAH+Ae4BpAFCAf8B2QGPATgB/wGWAUwB
FwH/AcUBegEuAf8B7AGjAUEB/wHtAaQBQgH/Ae0BpAFCAf8B6QGgAUAB/wG5AW0BJwH/AZgBSgEVAf8B
3gGUAToB/wHtAaQBQgH/Ae0BpAFCAf8B7QGkAUIB/wGXAXoBSAH2AzMBUf8AeQADJgE4A1EB8wFGAUMB
QgH/AVcBUgFPAf8BeQFvAWoB/wGqAZkBkgH/AdoBxgG9Af8B7QHcAdIB/wHtAd0B0wH/AewB2wHRAf8B
6AHQAcYB/wHWAb4BtAH/AVcBUQFPAf8BZAFcAVgB/wHQAbcBrAH/AdABtwGsAf8BowGRAYkB/wE9AjwB
/wFaAXsBiAH/AYsB1gHwAf8BjwHdAfkB/wGPAd0B+QH/AY8B3QH5Af8BiwHWAfEB/wFbAXwBiQH/AT0C
PAH/AaIBkAGJAf8BzAG0AakB/wFNAUkBRwH/AUcBRAFCAf8BiwF/AXoB/wHmAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B3QHEAboB/wGvAZ0BlgH/AX4BcwFvAf8BWQFUAVEB/wFHAUQB
QwH/A1EB8wMnATkQAAMzAVEBiwFbAUAB9wG3AVoBGwH/AbcBWgEbAf8BtwFaARsB/wG3AVoBGwH/AbgB
XgEgAf8B+QHxAewB/wH4Ae4B5wH/AckBgQFQAf8ByQGBAVAB/wHJAYEBUAH/AckBgQFQAf8B9AHlAdwB
/wH7AfYB8wH/AcYBeAFEAf8BuQFaARoB/wG5AVoBGgH/AbkBWgEaAf8BuQFaARoB/wG5AVoBGgH/AasB
awEwAfsB7gGkAUIB/wHtAaMBQgH/AbwBcgEqAf8BjQFCARIB/wGOAUIBEgH/Ab8BdAErAf8B6AGeAT8B
/wHbAZEBOQH/AaMBVQEbAf8BjgE/ARAB/wGYAUoBFgH/AcwBggExAf8B7QGkAUIB/wHtAaQBQgH/Ae0B
pAFCAf8BlwF6AUgB9gMzAVH/AHkAA04BlAE6AjkB/wHCAa0BpAH/Ad4BxQG7Af8B5wHNAcIB/wHnAc0B
wgH/AecBzQHCAf8B6gHUAcoB/wHtAd0B0wH/Ae0B3QHTAf8B7AHbAdEB/wHFAbMBqgH/AUMBQAE/Af8B
oAGOAYcB/wHQAbcBrAH/AdABtwGsAf8BagFhAV0B/wFKAV4BZQH/AYsB1gHwAf8BjwHdAfkB/wGPAd0B
+QH/AY8B3QH5Af8BjwHdAfkB/wGPAd0B+QH/AYsB1gHxAf8BSwFgAWgB/wFoAWABXAH/Ac8BtgGrAf8B
qAGWAY0B/wG4AaMBmQH/Ad0ByQG/Af8B6gHVAcoB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0B
wgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AeABxwG9Af8BxgGxAacB/wE7AjkB/wNOAZYQAAMzAVEB
iwFbAUAB9wG3AVoBGwH/AbcBWgEbAf8BtwFaARsB/wG3AVoBGwH/AbcBWwEcAf8B5gHGAbEZ/wHvAdkB
ywH/Ab4BZwEtAf8BuAFaARsB/wG5AVoBGwH/AbkBWgEaAf8BuQFaARoB/wGiAWcBJgH+AcQBfgExAfwB
7gGkAUIB/wHuAaQBQgH/AekBnwE/Af8BxwF9AS8B/wGTAUcBFQH/AY0BQQESAf8BpwFbAR4B/wGZAUwB
FgH/AY4BQAERAf8BrwFhASEB/wHbAZEBOQH/AewBowFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B
lwF6AUgB9gMzAVH/AHkAA1EBogE9ATwBOwH/AeYBzAHBAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AeoB1AHJAf8B7QHdAdMB/wHtAd0B0wH/Ab0BsQGpAf8BNwI2Af8BxAGtAaMB
/wHQAbcBrAH/AdABtwGsAf8BQwFAAT8B/wFwAaUBtwH/AY8B3QH5Af8BjwHdAfkB/wFsAZwBrQH/AToB
QQFEAf8BagGaAasB/wGPAd0B+QH/AY8B3QH5Af8BcgGnAboB/wFBAT8BPgH/AdABtwGsAf8BzAGzAakB
/wHEAa0BowH/Ac8BuwGxAf8B6gHaAdAB/wHrAdUBygH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wE9ATwBOwH/A1EBoRAAAzMBUQGLAVsB
QQH3AbYBWgEcAf8BtwFaARsB/wG3AVoBGwH/AbcBWgEbAf8BtwFaARsB/wHUAZwBdgH/Af4B/QH8Af8B
9gHqAeMB/wHjAcABqAH/AeQBwAGnAf8B8gHgAdQF/wHhAbgBnAH/AbgBWwEcAf8BuAFaARsB/wG4AVoB
GwH/AbkBWgEbAf8BuQFaARsB/wGiAW4BMgH6Ae8BowFCAf8B7wGjAUIB/wHuAaQBQgH/Ae4BpAFCAf8B
7gGkAUIB/wHNAYMBMgH/AZABRAETAf8BjAFAAREB/wGNAT8BEAH/AbgBbAEmAf8B7AGiAUEB/wHuAaQB
QgH/Ae0BpAFCAf8B7QGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8BlwF6AUgB9gMzAVH/AHkAA1EBogE9ATwB
OwH/AeYBzAHBAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
6gHUAcoB/wHtAdwB0gH/AbgBrAGlAf8DMwH/Ac4BtQGqAf8B0AG3AawB/wHQAbcBrAH/ATgCNwH/AXwB
uQHQAf8BjwHdAfkB/wGPAd0B+QH/AT0BRgFJAf8DMwH/ATsBQwFFAf8BjwHdAfkB/wGPAd0B+QH/AXwB
uwHRAf8BNgI1Af8B0AG3AawB/wGcAYsBgwH/ATgCNwH/AUEBQAE/Af8BxwG6AbIB/wHtAdwB0gH/AeoB
1QHKAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB
/wE9ATwBOwH/A1EBoRAAAzMBUQGLAVsBQQH3AbYBWgEcAf8BtgFaARwB/wG3AVoBGwH/AbcBWgEbAf8B
twFaARsB/wHFAXoBRwH/AfkB8gHtAf8B8QHeAdIB/wG9AWgBLwH/AboBYAEjAf8B6AHJAbQF/wHMAYgB
WwH/AbgBWgEbAf8BuAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BogFnAScB/gG6AYUBOQH7Ae8BowFCAf8B
7wGjAUIB/wHvAaMBQgH/Ae8BpAFCAf8B7gGkAUIB/wHOAYMBMgH/AZEBRQETAf8BjAFAAREB/wGOAUAB
EQH/AcUBeQEtAf8B7QGjAUIB/wHuAaQBQgH/Ae4BpAFCAf8B7gGkAUIB/wHtAaQBQgH/Ae0BpAFCAf8B
lwF6AUgB9gMzAVH/AHkAA1EBogE9ATwBOwH/AeYBzAHBAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHqAdQBygH/Ab0BsQGqAf8CNwE2Af8BwwGsAaIB
/wHQAbcBrAH/AdABtwGsAf8BQwFBAUAB/wFvAaMBtgH/AY8B3QH5Af8BjwHdAfkB/wFuAaABsQH/AT4B
SAFLAf8BbQGeAa8B/wGPAd0B+QH/AY8B3QH5Af8BcQGmAbgB/wFCAUABPgH/AdABtwGsAf8BzAG0AakB
/wHEAa0BowH/Ac8BuwGxAf8B6gHaAdAB/wHtAd0B0wH/Ae0B3QHTAf8B6wHVAcoB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wE9ATwBOwH/A1EBoRAAAzMBUQGLAVsB
QQH3AbYBWgEcAf8BtgFaARwB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARsB/wG4AV0BHwH/AfEB3wHSAf8B
+gHzAe8B/wHHAX8BTgH/Ab4BaQEwAf8B9gHrAeQB/wH7AfUB8gH/AboBXwEhAf8BuAFaARsB/wG4AVoB
GwH/AbgBWgEbAf8BuAFaARsB/wG+AVwBOgH9AdUBiAFMAf4B7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8B
7wGjAUIB/wHpAZ0BPwH/AZcBSwEWAf8BjAFAAREB/wGsAWABIAH/AZEBQwESAf8BlQFGARQB/wHWAYsB
NgH/Ae4BpAFCAf8B7gGkAUIB/wHuAaQBQgH/Ae4BpAFCAf8B7QGkAUIB/wGXAXoBSAH2AzMBUf8AeQAD
TQGSAToCOQH/AcIBrQGkAf8B3QHFAboB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AcYBtAGrAf8BRAFCAUEB/wGeAY0BhQH/AdABtwGsAf8B0AG3AawB
/wFrAWIBXgH/AUkBXAFkAf8BiwHVAe8B/wGPAd0B+QH/AY8B3QH5Af8BjwHdAfkB/wGPAd0B+QH/AY8B
3QH5Af8BiwHVAfAB/wFKAV4BZQH/AWkBYQFdAf8BzwG2AasB/wG2AaEBmAH/AcIBqwGhAf8B4AHMAcEB
/wHtAd0B0wH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/AeoB1QHKAf8B5wHOAcMB/wHnAc0BwgH/AecB
zQHCAf8B2wHDAbkB/wHBAawBpAH/AToCOQH/A04BlRAAAzMBUQGLAVsBQQH3AbYBWgEcAf8BtgFaARwB
/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB/wG2AVoBGwH/AdYBoAF8Bf8B1wGjAYAB/wHNAYwBXwP/Af4B
/wHdAbABkwH/AbcBWgEbAf8BuAFaARsB/wG4AVoBGwH/AbgBWgEbAf8BuAFaARsB/wG4AXoBKwH8Ae4B
ogFBAf8B7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHRAYUBMwH/AZsBUAEZAf8BuQFtASgB
/wHrAaABQQH/AbgBbAEmAf8BjgE/ARAB/wGoAVsBHgH/AewBoQFBAf8B7gGkAUIB/wHuAaQBQgH/Ae4B
pAFCAf8B7gGkAUIB/wGXAXoBSAH2AzMBUf8AeQADIwEzA1gB7gFFAUMBQQH/AVYBUQFPAf8BeAFuAWoB
/wGpAZgBkQH/AdgBwAG2Af8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHXAb8BtQH/AVgB
UgFQAf8BYgFbAVcB/wHPAbcBrAH/AdABtwGsAf8BpAGSAYoB/wE+AjwB/wFZAXgBhAH/AYoB1QHvAf8B
jwHdAfkB/wGPAd0B+QH/AY8B3QH5Af8BiwHVAfAB/wFZAXoBhgH/AT0CPAH/AaMBkQGKAf8BzQG0AakB
/wFWAVEBTgH/AU4BSgFIAf8BqAGdAZYB/wHtAd0B0wH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/Ae0B
3AHSAf8B1wHDAboB/wGlAZUBjgH/AXUBawFnAf8BVQFQAU4B/wFEAUIBQQH/AlgBVwHxAyUBNhAAAzMB
UQGLAVsBQQH3AbUBWgEcAf8BtgFaARwB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB/wG2AVoBHAH/AbwB
ZQErAf8B/AH4AfYB/wHuAdgByAH/AekBzQG6Af8B/QH6AfgB/wG/AW0BNQH/AbcBWgEbAf8BtwFaARsB
/wG3AVoBGwH/AbgBWgEbAf8BugFcARwB/wHAAX4BKwH8AfABowFCAf8B7wGjAUIB/wHvAaMBQgH/Ae8B
owFCAf8B7wGjAUIB/wHvAaMBQgH/AeMBlwE8Af8B6wGfAUAB/wHvAaMBQgH/AekBngE/Af8BpQFXARwB
/wGPAUABEQH/AcQBeAEsAf8B7gGkAUIB/wHuAaQBQgH/Ae4BpAFCAf8B7gGkAUIB/wGYAXoBSAH2AzMB
Uf8AfQADDAEQAzwBZgNWAbADXAHZA1oB6gNMAfoBcgFpAWUB/wHkAcoBvwH/AecBzQHCAf8B5wHNAcIB
/wHnAc0BwgH/AYUBeQF1Af8BPgE8ATsB/wGvAZsBkgH/AdABtwGsAf8BzwG2AasB/wGFAXgBcgH/AT4B
PQE8Af8BSQFcAWMB/wFvAaIBtQH/AXsBuQHPAf8BbwGjAbUB/wFKAV0BZAH/AT4CPAH/AYQBdwFxAf8B
zAG0AakB/wHOAbYBqwH/Aa0BmgGRAf8BZwFgAV0B/wGgAZYBkQH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B
0wH/AeoB2gHQAf8BcwFtAWoB/wE3AjYB+wNeAesDXwHaA1UBtAM9AWkDDgESFAADMwFRAYsBWgFBAfcB
tQFaARwB/wG1AVoBHAH/AbYBWgEcAf8BtgFaARwB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB/wHoAckB
tQH/Af4C/QH/Af4B/QH8Af8B7gHXAcgB/wG4AV0BHwH/AbcBWgEbAf8BtwFaARsB/wG3AVoBGwH/AbcB
WgEbAf8BpgFuASsB/gHKAZ8BQAH9AfABowFCAf8B8AGjAUIB/wHvAaMBQgH/AboBbgEpAf8BpgFbAR8B
/wGnAVsBHwH/AacBWwEfAf8BpwFbAR8B/wGlAVgBHQH/AacBWQEdAf8BoAFSARkB/wGOAT8BEAH/AZAB
QQERAf8BqAFbAR0B/wHPAYQBMgH/Ae4BpAFCAf8B7gGkAUIB/wGYAXoBSAH2AzMBUf8AiQADDwEUAyUB
NwM9AWkDWgHpAa0BnAGUAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B0wG8AbIB/wFIAUUBRAH/AWgB
YAFcAf8BzgG1AaoB/wHQAbcBrAH/Ac8BtgGrAf8BpQGTAYsB/wFrAWIBXgH/AUQBQgFAAf8COQE4Af8B
RAFBAUAB/wFrAWIBXgH/AaQBkgGKAf8BzQG0AaoB/wGNAX8BeAH/AYABcwFuAf8BzgG3Aa0B/wHoAdYB
zAH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/Ae0B3QHTAf8BtAGpAaIB/wNeAesDPwFtAycBOgMRARYg
AAMzAVEBiwFaAUEB9wG1AVkBHAH/AbUBWQEcAf8BtQFaARwB/wG1AVoBHAH/AbYBWgEcAf8BtgFaARwB
/wG2AVoBHAH/AdABlAFsAf8B/gH9AfwC/wL+Af8B2wGtAY4B/wG3AVsBHAH/AbcBWgEbAf8BtwFaARsB
/wG3AVoBGwH/AbcBWgEbAf8BpwF9AUIB+gHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AaYB
WwEfAf8BiwFAAREB/wGLAUABEQH/AYsBQAERAf8BjAFAAREB/wGNAUABEQH/AY8BPwEQAf8BjQE/ARAB
/wGOAT8BEAH/AY4BPwEQAf8BjwE/ARAB/wHEAXgBLAH/Ae4BpAFCAf8B7gGkAUIB/wGYAXoBSAH2AzMB
Uf8AkQADCAEKA1UBrwFJAUYBRAH/AeUBywHAAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8BuwGnAZ8B
/wE5AjgB/wF0AWoBZQH/Ac4BtQGqAf8B0AG3AawB/wHQAbcBrAH/AdABtwGsAf8B0AG3AawB/wHQAbcB
rAH/AdABtwGsAf8B0AG3AawB/wHQAbcBrAH/Ac8BtgGrAf8BhQF4AXMB/wM1Af8BkgGGAYEB/wHsAdsB
0QH/Ae0B3QHTAf8B7QHdAdMB/wHtAd0B0wH/AesB2wHRAf8BSwFJAUgB/wNWAbMDCQEMKAADMwFRAYsB
WgFBAfcBtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFaARwB/wG1AVoBHAH/AbYBWgEcAf8BtgFaARwB
/wHCAXUBQgH/AfUB6AHgAf8B+gH0Ae8B/wHKAYcBWgH/AbYBWgEcAf8BtgFaARsB/wG3AVoBGwH/AbcB
WgEbAf8BoQFnASgB/gHBAZIBSwH7AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB
/wHwAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHvAaMBQgH/AY0BQAERAf8BpgFYARwB/wHvAaMBQgH/Ae8B
owFCAf8B7wGjAUIB/wHvAaMBQgH/Ae8BpAFCAf8B7gGkAUIB/wHuAaQBQgH/AZgBegFIAfYDMwFR/wCR
AAMDAQQDTgGUAzYB/wHWAb4BtAH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AeQBygG/Af8BmwGMAYUB
/wE6AjkB/wFoAWABXAH/Aa8BmwGSAf8BzwG2AawB/wHQAbcBrAH/AdABtwGsAf8B0AG3AawB/wHQAbcB
rAH/AdABtwGsAf8B0AG3AawB/wHQAbcBrAH/AdABuQGuAf8BmQGMAYYB/wGyAaABmAH/AegB0AHFAf8B
7AHbAdEB/wHxAeUB4QH/Ae0B3QHUAf8B3QHOAcUB/wM3Af8DTgGXAwMBBCgAAzMBUQGLAVoBQQH3AbUB
WQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFaARwB/wG1AVoBHAH/AbUBWgEcAf8BtwFdASEB
/wHBAXMBPgH/AcMBdgFCAf8BuAFfASMB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB/wG3AVoBGwH/AZ0B
XwEoAfsB8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB
/wHwAaMBQgH/AfABowFCAf8B7wGjAUIB/wGbAU8BGQH/AbEBYwEiAf8B7wGjAUIB/wHvAaMBQgH/Ae8B
owFCAf8B7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8B7gGkAUIB/wGYAXoBSAH2AzMBUf8AkQADGAEgA14B
4gF/AXQBbwH/AeYBzAHBAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHkAcoBvwH/Ab4B
qQGhAf8BSgFHAUUB/wE+ATwBOwH/AWIBWgFXAf8BpgGUAYwB/wHQAbcBrAH/AdABtwGsAf8BxQGuAaQB
/wGeAY0BhgH/AZMBhAF9Af8B2QHDAbgB/wHoAdYBzAH/AewB3AHRAf8B6QHRAcYB/wHnAc0BwgH/AewB
2AHSAf8B9wH0AfkB/wHyAegB5AH/AewB3AHSAf8BhgF+AXoB/wNeAeMDGAEhKAADMwFRAYsBWgFBAfcB
tAFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVoB
HAH/AbYBWgEcAf8BtgFaARwB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB/wG2AVoBHAH/AaABZwEoAf4B
vwF+ASsB/AHxAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMB
QgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AegBmwE+Af8B6QGdAT8B/wHvAaMBQgH/Ae8BowFCAf8B
7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHvAaMBQgH/AZoBegFIAfYDMwFR/wCNAAMDAQQD
UQGiAVEBTAFKAf8B4QHIAb4B/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B
5wHNAcIB/wHnAc0BwgH/AdUBvgG0Af8BiwF+AXgB/wFaAVUBUgH/AV8BWgFXAf8B2wHGAbsB/wHRAbwB
sgH/AU8BTAFKAf8BRgFDAUIB/wFiAVsBWAH/AewB2wHRAf8B7QHdAdMB/wHtAd0B0wH/AewB2wHQAf8B
6QHRAcYB/wHnAc0BwgH/AewB2gHUAf8B7AHbAdEB/wHtAd0B0wH/AekB2QHQAf8BVAFSAVAB/wNRAaQD
BAEFJAADMwFRAYsBWgFBAfcBtAFZARwB/wG0AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVkBHAH/AbUB
WQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWgEcAf8BtQFaARwB/wG2AVoBHAH/AbYBWgEcAf8BtgFaARwB
/wG2AVoBHAH/AaYBbwEtAf4BxAGXAUAB/QHxAaMBQgH/AfEBowFCAf8B8AGjAUIB/wHwAaMBQgH/AfAB
owFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB
/wHvAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHvAaMBQgH/AZoB
egFIAfYDMwFR/wCNAAM1AVYBOgI5AfsBoQGRAYsB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0B
wgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AdkBwgG3Af8B
1gHCAbkB/wHtAd0B0wH/AesB3AHSAf8ByQG9AbQB/wHJAbYBrQH/AdoBwgG4Af8B6AHRAcYB/wHsAdsB
0AH/Ae0B3QHTAf8B7QHdAdMB/wHtAdsB0QH/AekB0gHHAf8B5wHNAcIB/wHoAdABxQH/AewB2gHQAf8B
7QHdAdMB/wGpAZ4BmAH/ATsCOgH7AzYBWCQAAzMBUQGLAVoBQQH3AbQBWQEdAf8BtAFZAR0B/wG0AVkB
HAH/AbQBWQEcAf8BtAFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8B
tQFaARwB/wG1AVoBHAH/AbYBWgEcAf8BtgFaARwB/wGvAXABKwH8AfABogFBAf8B8QGjAUIB/wHxAaMB
QgH/AfEBowFCAf8B8QGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B
8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/Ae8BowFCAf8B7wGjAUIB/wHvAaMB
QgH/Ae8BowFCAf8B7wGjAUIB/wGaAXoBSAH2AzMBUf8AiQADEQEWA10BzgFaAVUBUgH/Ad0BxQG6Af8B
5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0B
wgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B6gHUAcoB/wHtAd4B1AH/Ae0B3QHTAf8B
7AHbAdEB/wHoAdABxQH/AecBzQHCAf8B6QHRAcYB/wHtAdwB0gH/Ae0B3QHTAf8B7QHdAdMB/wHsAdsB
0QH/AekB0QHGAf8B5wHNAcIB/wHoAdEBxgH/Ae0B3AHSAf8B5QHWAcwB/wFgAVwBWQH/A1sB0AMSARcg
AAMzAVEBiwFaAUEB9wG0AVkBHQH/AbQBWQEdAf8BtAFZAR0B/wG0AVkBHAH/AbQBWQEcAf8BtAFZARwB
/wG1AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFaARwB/wG1AVoBHAH/AbYB
WgEcAf8BuQF/ATcB+wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB
/wHxAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfAB
owFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B7wGjAUIB/wHvAaMBQgH/Ae8BowFCAf8BmgF6AUgB
9gMzAVH/AIkAAygBPANcAe0BrgGcAZUB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AecB
zQHCAf8B5wHNAcIB/wHmAcwBwQH/AdUBvQGzAf8B5AHKAcAB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB
/wHnAc0BwgH/AecBzgHDAf8B8QHmAeQB/wHwAeQB3gH/Ae0B3QHTAf8B7AHbAdAB/wHpAdEBxgH/AecB
zQHCAf8B5wHPAcQB/wHbAcsBwgH/AewB3AHSAf8B7QHdAdMB/wHsAdsB0AH/AekB0QHGAf8B5wHNAcIB
/wHoAdABxQH/AewB2gHQAf8BugGuAaYB/wNXAe8DKQE+IAADMwFRAYsBWgFBAfcBtAFZAR0B/wG0AVkB
HQH/AbQBWQEdAf8BtAFZAR0B/wG0AVkBHQH/AbQBWQEcAf8BtAFZARwB/wG0AVkBHAH/AbUBWQEcAf8B
tQFZARwB/wG1AVkBHAH/AbUBWQEcAf8BtQFZARwB/wGhAWIBKwH8AdgBiQFNAf4B8QGjAUIB/wHxAaMB
QgH/AfEBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B
8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMB
QgH/AfABowFCAf8B7wGjAUIB/wHvAaMBQgH/AZoBegFIAfYDMwFR/wCJAAMgAS4DXgHiAWkBYgFeAf8B
4QHIAb0B/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wHnAc0BwgH/AeEByAG9Af8BfgFzAW4B/wM2Af8B
RwFEAUMB/wGrAZoBkwH/AeMBygG/Af8B5wHNAcIB/wHnAc0BwgH/Ae4B3gHZAf8B9wH2AfwB/wH3AfYB
+wH/AfAB4wHdAf8B7QHdAdMB/wHqAdkBzwH/AbEBoQGaAf8BSwFIAUYB/wE3AjYB/wF+AXcBcwH/AeYB
1wHNAf8B7QHdAdMB/wHtAdwB0gH/AekB0QHGAf8B5wHNAcIB/wHjAcsBwQH/AW0BZwFjAf8DWwHkAyEB
MCAAAzMBUQF/AWABQAH2AbMBWQEdAf8BswFZAR0B/wG0AVkBHQH/AbQBWQEdAf8BtAFZAR0B/wG0AVkB
HQH/AbQBWQEdAf8BtAFZARwB/wG0AVkBHAH/AbUBWQEcAf8BtQFZARwB/wG1AVkBHAH/AbUBWQEcAf8B
qgFnAS8B+wHyAaMBQgH/AfIBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB/wHxAaMB
QgH/AfEBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B
8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B7wGjAUIB/wGaAXoB
SAH2AzMBUf8AiQADAgEDAzsBZANZAe8BewFxAW0B/wHhAcgBvQH/AecBzQHCAf8B3gHFAbsB/wGiAZIB
iwH/AVEBTAFLAf8DYAHgA00BkwNWAbADWgHpAW8BZgFiAf8B5wHNAcIB/wHqAdYBzwH/AfMB7AHuAf8B
+AH3Af4B/wH3AfYB/QH/AfIB6QHoAf8B7gHeAdYB/wF8AXUBcQH/A1wB6gNWAbADTQGSA10B3wFQAU0B
TAH/AaMBmQGTAf8B4QHSAckB/wHsAdsB0AH/AeMBzAHBAf8BfQFyAW0B/wNYAfEDPQFoAwMBBCAAAx0B
KAFlAl4B3QGzAVkBHQH/AbMBWQEdAf8BswFZAR0B/wG0AVkBHQH/AbQBWQEdAf8BtAFZAR0B/wG0AVkB
HQH/AbQBWQEdAf8BtAFZARwB/wG0AVkBHAH/AbQBWQEcAf8BtQFZARwB/wGiAWoBKgH+AcQBlQFAAf0B
8gGjAUIB/wHyAaMBQgH/AfIBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB/wHxAaMB
QgH/AfEBowFCAf8B8QGjAUIB/wHxAaMBQgH/AfEBowFCAf8B8QGjAUIB/wHwAaMBQgH/AfABowFCAf8B
8AGjAUIB/wHwAaMBQgH/AfABowFCAf8B8AGjAUIB/wHwAaMBQgH/AfABowFCAf8CZQFeAd0DHQEo/wCN
AAQCAzIBTwNZAe8BaQFiAV4B/wGxAZ4BlgH/AVsBVQFTAf8DTQH6A1EBngMYASADAwEEAwkBCwM/AWwD
NgH7AdQBvQGzAf8B5wHNAcIB/wHoAdABxwH/AfMB6wHtAf8B7wHhAd8B/wHoAc8BxQH/AeABzAHCAf8D
LQH8Az8BbgMJAQsDAwEEAxYBHgNQAZoDQQH5AVkBVgFUAf8BsAGlAZ4B/wFsAWcBYwH/A1QB8AMzAVID
AgEDJAAEAQMaASQDPQFoAkEBQAFxAkEBQAFxAkEBQAFxAkEBQAFxAkEBQAFxAkEBQAFxAkEBQAFxAkEB
QAFxAkEBQAFxAkEBQAFxAkEBQAFxAkEBQAFwAkEBQAFxA0EBcQNBAXEDQQFxA0EBcQNBAXEDQQFxA0EB
cQNBAXEDQQFxA0EBcQNBAXEDQQFxA0EBcQNBAXEDQQFxA0EBcQNBAXEDQQFxA0EBcQNBAXEDPQFoAxoB
JAQB/wCRAAQCAzsBZANeAeIDXAHtA1sBzQM0AVQDAwEEDAADJwE6A14B6wGlAZQBjgH/AecBzQHCAf8B
5wHNAcIB/wHqAdYBzgH/AegBzgHEAf8B5wHNAcIB/wGxAZ8BlwH/A10B7AMpAT0MAAMCAQMDMwFRA1wB
ywNcAe0DXgHjAz0BZwMCAQP/AP8AWgADAgEDAyABLQMoATsDEAEVFAADEgEXA18B2gF0AWsBZwH/AecB
zQHCAf8B5wHNAcIB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB/wGAAXUBcAH/A2AB2wMTARkUAAMPARQD
KAE7AyABLgMCAQP/AP8AhgADVgGzAVUBUAFOAf8B3AHDAbkB/wHnAc0BwgH/AecBzQHCAf8B5wHNAcIB
/wHhAcgBvQH/AVoBVAFSAf8DWAG6/wD/AK4AAz0BaQFEAUIBQQH/AcABqwGjAf8B5QHMAcEB/wHlAcwB
wQH/AeUBzAHBAf8BxQGwAacB/wFIAUUBQwH/A0ABcf8A/wCuAAMNAREDUwHwAToCOQH/AT0COwH/AT0C
OwH/AT0COwH/AToCOQH/A1EB8wMRARb/AP8AsgADJAE0A00BkgNRAaIDUQGiA1EBogNNAZMDJQE3/wD/
AP8A/wD/AD0AAUIBTQE+BwABPgMAASgDAAG0AwABLQMAAQEBAAEBBQABOAEEFgAD/wEAB/8BxwP/AcAM
AAL/AeABPwP/AYcD/wHADAAC/wHAAR8D/wGDA/8BwAwAAv8BwAEfA/8BgAP/AcAMAAL/AcABDwP/AYAD
/wHADAAB/wEPAYABDwGHAv8BgAE/Av8BwAwAAf4BAwGAAQ4BAwL/AYABPwL/AcAMAAH8AwABAQL/AYAB
HwL/AcAMAAH4BAAC/wGAAQ8C/wHADAAB+AQAAf8BgAMAAQMBwAwAAfgEAAH/BAABAQHADAAB+AQAAf8E
AAEBAcAMAAH8AwABAQH/BAABAQHADAAB/AMAAQEB/wQAAQEBwAwAAf4DAAEDAf8EAAEBAcAMAAH+AwAB
AwH/BAABAQHADAAB/gMAAQMB/wQAAQEBwAwAAfgEAAH/BAABAQHADAABwAQAAR8EAAEBAcAMAAGABAAB
DwQAAQEBwAwAAYAEAAEPBAABAQHADAABgAQAAQ8EAAEBAcAMAAGABAABDwQAAQEBwAwAAYAEAAEPBAAB
AQHADAABgAQAAQ8EAAEBAcAMAAGABAABDwQAAQEBwAwAAcAEAAEfBAABAQHADAAB+AQAAf8EAAEBAcAM
AAH+AwABAwH/BAABAQHADAAB/gMAAQMB/wQAAQEBwAwAAf4DAAEDAf8EAAEBAcAMAAH8AwABAQH/BAAB
AQHADAAB/AMAAQEB/wQAAQEBwAwAAfgEAAH/BAABAQHADAAB+AQAAf8EAAEBAcAMAAH4BAAB/wQAAQEB
wAwAAfgEAAH/BAABAQHADAAB/AMAAQEB/wQAAQEBwAwAAf4BAwGAAQ4BAwb/AcAMAAH/AQ8BgAEPAYcG
/wHADAAC/wHAAR8H/wHADAAC/wHAAR8H/wHADAAC/wHAAR8H/wHADAAC/wHgAT8H/wHADAAL/wHADAAL
</value>
</data>
</root>

Some files were not shown because too many files have changed in this diff Show More