chore: renamed solution

This commit is contained in:
2026-01-23 12:16:38 +01:00
parent e511610052
commit 640d9acbf6
27 changed files with 62 additions and 44 deletions

6
CarManagerV3/App.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

68
CarManagerV3/Car.cs Normal file
View File

@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarManagerV3
{
public class Car
{
int id;
string make;
string model;
int year;
string color;
int mileage;
decimal price;
int order;
public Car(int id, string make, string model, int year, string color, int mileage, decimal price, int order = 0)
{
this.id = id;
this.make = make;
this.model = model;
this.year = year;
this.color = color;
this.mileage = mileage;
this.price = price;
this.order = order;
}
public int Id { get { return id; } set { id = value; } }
public string Make { get { return make; } set { make = value; } }
public string Model { get { return model; } set { model = value; } }
public int Year { get { return year; } set { year = value; } }
public string Color { get { return color; } set { color = value; } }
public int Mileage { get { return mileage; } set { mileage = value; } }
public decimal Price { get { return price; } set { price = value; } }
public int Order { get { return order; } set { order = value; } }
public override string ToString()
{
return $"{make} {model} ({year})";
}
public string ToCsvString()
{
return $"{id};{make};{model};{year};{color};{mileage};{price}";
}
public static Car FromCsvString(string csv)
{
string[] parts = csv.Split(';');
return new Car(int.Parse(parts[0]), parts[1], parts[2], int.Parse(parts[3]), parts[4], int.Parse(parts[5]), decimal.Parse(parts[6]));
}
public bool IsChanged(Car other)
{
return make != other.make || model != other.model || year != other.year || color != other.color || mileage != other.mileage || price != other.price || other.color != color;
}
public Car Clone()
{
return new Car(id, make, model, year, color, mileage, price);
}
}
}

117
CarManagerV3/CarCard.Designer.cs generated Normal file
View File

@@ -0,0 +1,117 @@
namespace CarManagerV3
{
partial class CarCard
{
/// <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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CarCard));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.lblCarDetails = new System.Windows.Forms.Label();
this.lblCarName = new System.Windows.Forms.Label();
this.pbxCar = new System.Windows.Forms.PictureBox();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbxCar)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.AutoSize = true;
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.lblCarDetails, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.lblCarName, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.pbxCar, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.MaximumSize = new System.Drawing.Size(210, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 130F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(210, 200);
this.tableLayoutPanel1.TabIndex = 0;
//
// lblCarDetails
//
this.lblCarDetails.AutoSize = true;
this.lblCarDetails.Location = new System.Drawing.Point(3, 184);
this.lblCarDetails.Name = "lblCarDetails";
this.lblCarDetails.Size = new System.Drawing.Size(101, 16);
this.lblCarDetails.TabIndex = 5;
this.lblCarDetails.Text = "2009 - 13.000km";
//
// lblCarName
//
this.lblCarName.AutoSize = true;
this.lblCarName.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblCarName.Font = new System.Drawing.Font("Arial", 13.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCarName.Location = new System.Drawing.Point(3, 130);
this.lblCarName.Name = "lblCarName";
this.lblCarName.Size = new System.Drawing.Size(204, 54);
this.lblCarName.TabIndex = 4;
this.lblCarName.Text = "Skoda Fabia fdsdfsdfsdfsdf";
this.lblCarName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// pbxCar
//
this.pbxCar.Dock = System.Windows.Forms.DockStyle.Fill;
this.pbxCar.Image = ((System.Drawing.Image)(resources.GetObject("pbxCar.Image")));
this.pbxCar.ImageLocation = "";
this.pbxCar.InitialImage = ((System.Drawing.Image)(resources.GetObject("pbxCar.InitialImage")));
this.pbxCar.Location = new System.Drawing.Point(3, 3);
this.pbxCar.Name = "pbxCar";
this.pbxCar.Size = new System.Drawing.Size(204, 124);
this.pbxCar.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbxCar.TabIndex = 3;
this.pbxCar.TabStop = false;
//
// CarCard
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "CarCard";
this.Size = new System.Drawing.Size(210, 200);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbxCar)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label lblCarDetails;
private System.Windows.Forms.Label lblCarName;
private System.Windows.Forms.PictureBox pbxCar;
}
}

88
CarManagerV3/CarCard.cs Normal file
View File

@@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
public partial class CarCard : UserControl
{
public Car Car;
public string CarName
{
get { return lblCarName.Text; }
set { lblCarName.Text = value; }
}
public string CarDetails
{
get { return lblCarDetails.Text; }
set { lblCarDetails.Text = value; }
}
public Image CarImage
{
get { return pbxCar.Image; }
set { pbxCar.Image = value; }
}
public CarCard()
{
InitializeComponent();
this.Cursor = Cursors.Hand;
foreach (Control ctrl in this.Controls)
{
ctrl.Click += ForwardClick;
foreach (Control inner in ctrl.Controls) // In case you have nested controls
inner.Click += ForwardClick;
}
this.Click += (s, e) => this.OnCardClicked();
}
public async void LoadImage()
{
this.CarImage = pbxCar.InitialImage; // Set to loading image
await Task.Run(() =>
{
Image img = ImageManager.GetImage(this.Car);
if (img != null)
{
this.CarImage = img;
}
});
}
private void ForwardClick(object sender, EventArgs e)
{
// Raise your CardClicked event no matter what got clicked
CardClicked?.Invoke(this, EventArgs.Empty);
}
public event EventHandler CardClicked;
private void OnCardClicked()
{
if (this.CardClicked != null)
{
this.CardClicked(this, EventArgs.Empty);
}
}
public void ClearCardClickedHandlers()
{
if (this.CardClicked != null)
{
foreach (Delegate d in this.CardClicked.GetInvocationList())
{
this.CardClicked -= (EventHandler)d;
}
}
}
}
}

10889
CarManagerV3/CarCard.resx Normal file

File diff suppressed because it is too large Load Diff

317
CarManagerV3/CarDetailsForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,317 @@
namespace CarManagerV3
{
partial class CarDetailsForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CarDetailsForm));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.pbxCarImage = new System.Windows.Forms.PictureBox();
this.label1 = new System.Windows.Forms.Label();
this.tbxMake = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.tbxModel = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnSave = new System.Windows.Forms.Button();
this.btnDelete = new System.Windows.Forms.Button();
this.lblID = new System.Windows.Forms.Label();
this.nudYear = new System.Windows.Forms.NumericUpDown();
this.tbxColor = new System.Windows.Forms.TextBox();
this.nudMileage = new System.Windows.Forms.NumericUpDown();
this.nudPrice = new System.Windows.Forms.NumericUpDown();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbxCarImage)).BeginInit();
this.flowLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudYear)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nudMileage)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nudPrice)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.AutoSize = true;
this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.pbxCarImage, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tbxMake, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.tbxModel, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.label4, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.label6, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.nudYear, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.tbxColor, 1, 4);
this.tableLayoutPanel1.Controls.Add(this.nudMileage, 1, 5);
this.tableLayoutPanel1.Controls.Add(this.nudPrice, 1, 6);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 8;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 200F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(536, 450);
this.tableLayoutPanel1.TabIndex = 0;
//
// pbxCarImage
//
this.tableLayoutPanel1.SetColumnSpan(this.pbxCarImage, 2);
this.pbxCarImage.Dock = System.Windows.Forms.DockStyle.Fill;
this.pbxCarImage.Image = ((System.Drawing.Image)(resources.GetObject("pbxCarImage.Image")));
this.pbxCarImage.Location = new System.Drawing.Point(3, 3);
this.pbxCarImage.Name = "pbxCarImage";
this.pbxCarImage.Size = new System.Drawing.Size(538, 194);
this.pbxCarImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbxCarImage.TabIndex = 0;
this.pbxCarImage.TabStop = false;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 200);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 16);
this.label1.TabIndex = 1;
this.label1.Text = "Make:";
//
// tbxMake
//
this.tbxMake.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbxMake.Location = new System.Drawing.Point(68, 203);
this.tbxMake.Name = "tbxMake";
this.tbxMake.Size = new System.Drawing.Size(473, 22);
this.tbxMake.TabIndex = 1;
this.tbxMake.TextChanged += new System.EventHandler(this.tbxMake_TextChanged);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 230);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(48, 16);
this.label2.TabIndex = 3;
this.label2.Text = "Model:";
//
// tbxModel
//
this.tbxModel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbxModel.Location = new System.Drawing.Point(68, 233);
this.tbxModel.Name = "tbxModel";
this.tbxModel.Size = new System.Drawing.Size(473, 22);
this.tbxModel.TabIndex = 2;
this.tbxModel.TextChanged += new System.EventHandler(this.tbxModel_TextChanged);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(3, 260);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(39, 16);
this.label3.TabIndex = 5;
this.label3.Text = "Year:";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(3, 290);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(42, 16);
this.label4.TabIndex = 6;
this.label4.Text = "Color:";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(3, 320);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(59, 16);
this.label5.TabIndex = 7;
this.label5.Text = "Mileage:";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(3, 350);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(41, 16);
this.label6.TabIndex = 8;
this.label6.Text = "Price:";
//
// flowLayoutPanel1
//
this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2);
this.flowLayoutPanel1.Controls.Add(this.btnSave);
this.flowLayoutPanel1.Controls.Add(this.btnDelete);
this.flowLayoutPanel1.Controls.Add(this.lblID);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 383);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(5);
this.flowLayoutPanel1.Size = new System.Drawing.Size(538, 64);
this.flowLayoutPanel1.TabIndex = 9;
//
// btnSave
//
this.btnSave.Location = new System.Drawing.Point(450, 8);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(75, 23);
this.btnSave.TabIndex = 7;
this.btnSave.Text = "Save";
this.btnSave.UseVisualStyleBackColor = true;
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
//
// btnDelete
//
this.btnDelete.Location = new System.Drawing.Point(369, 8);
this.btnDelete.Name = "btnDelete";
this.btnDelete.Size = new System.Drawing.Size(75, 23);
this.btnDelete.TabIndex = 8;
this.btnDelete.Text = "Delete";
this.btnDelete.UseVisualStyleBackColor = true;
this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
//
// lblID
//
this.lblID.AutoSize = true;
this.lblID.Location = new System.Drawing.Point(343, 5);
this.lblID.Name = "lblID";
this.lblID.Size = new System.Drawing.Size(20, 16);
this.lblID.TabIndex = 2;
this.lblID.Text = "ID";
//
// nudYear
//
this.nudYear.Location = new System.Drawing.Point(68, 263);
this.nudYear.Maximum = new decimal(new int[] {
3000,
0,
0,
0});
this.nudYear.Name = "nudYear";
this.nudYear.Size = new System.Drawing.Size(120, 22);
this.nudYear.TabIndex = 3;
this.nudYear.ValueChanged += new System.EventHandler(this.nudYear_ValueChanged);
//
// tbxColor
//
this.tbxColor.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbxColor.Location = new System.Drawing.Point(68, 293);
this.tbxColor.Name = "tbxColor";
this.tbxColor.Size = new System.Drawing.Size(473, 22);
this.tbxColor.TabIndex = 4;
this.tbxColor.TextChanged += new System.EventHandler(this.tbxColor_TextChanged);
//
// nudMileage
//
this.nudMileage.Location = new System.Drawing.Point(68, 323);
this.nudMileage.Maximum = new decimal(new int[] {
999999,
0,
0,
0});
this.nudMileage.Name = "nudMileage";
this.nudMileage.Size = new System.Drawing.Size(120, 22);
this.nudMileage.TabIndex = 5;
this.nudMileage.ThousandsSeparator = true;
this.nudMileage.ValueChanged += new System.EventHandler(this.nudMileage_ValueChanged);
//
// nudPrice
//
this.nudPrice.DecimalPlaces = 2;
this.nudPrice.Location = new System.Drawing.Point(68, 353);
this.nudPrice.Maximum = new decimal(new int[] {
999999,
0,
0,
0});
this.nudPrice.Name = "nudPrice";
this.nudPrice.Size = new System.Drawing.Size(120, 22);
this.nudPrice.TabIndex = 6;
this.nudPrice.ThousandsSeparator = true;
this.nudPrice.ValueChanged += new System.EventHandler(this.nudPrice_ValueChanged);
//
// CarDetailsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(536, 450);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.Name = "CarDetailsForm";
this.Text = "Details";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbxCarImage)).EndInit();
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.nudYear)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nudMileage)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nudPrice)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox tbxMake;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox tbxModel;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnSave;
private System.Windows.Forms.Button btnDelete;
private System.Windows.Forms.NumericUpDown nudYear;
private System.Windows.Forms.TextBox tbxColor;
private System.Windows.Forms.NumericUpDown nudMileage;
private System.Windows.Forms.NumericUpDown nudPrice;
private System.Windows.Forms.PictureBox pbxCarImage;
private System.Windows.Forms.Label lblID;
}
}

View File

@@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
public partial class CarDetailsForm : Form
{
Car car;
public CarDetailsForm(Car car)
{
InitializeComponent();
this.car = car;
tbxMake.Text = car.Make;
tbxModel.Text = car.Model;
nudYear.Value = car.Year;
tbxColor.Text = car.Color;
nudMileage.Value = car.Mileage;
nudPrice.Value = car.Price;
pbxCarImage.Image = ImageManager.GetImage(car);
lblID.Text = $"ID: {car.Id}";
}
private void tbxMake_TextChanged(object sender, EventArgs e)
{
car.Make = tbxMake.Text;
}
private void tbxModel_TextChanged(object sender, EventArgs e)
{
car.Model = tbxModel.Text;
}
private void nudYear_ValueChanged(object sender, EventArgs e)
{
car.Year = (int)nudYear.Value;
}
private void tbxColor_TextChanged(object sender, EventArgs e)
{
car.Color = tbxColor.Text;
}
private void nudMileage_ValueChanged(object sender, EventArgs e)
{
car.Mileage = (int)nudMileage.Value;
}
private void nudPrice_ValueChanged(object sender, EventArgs e)
{
car.Price = nudPrice.Value;
}
private async void btnSave_Click(object sender, EventArgs e)
{
// save car to cars.csv and close form
//saving car... popuo
btnSave.Enabled = false;
btnDelete.Enabled = false;
var msgbox = new PleaseWait();
msgbox.Show();
await Task.Run(() =>
{
StateManager.UpdateCar(car);
Console.WriteLine("Saved car: " + car.Id);
});
Console.WriteLine("Car saved. " + car.Id);
btnSave.Enabled = true;
btnDelete.Enabled = true;
this.Close();
msgbox.Close();
}
private void btnDelete_Click(object sender, EventArgs e)
{
//are you sure?
var result = MessageBox.Show("Are you sure you want to delete this car?", "Delete Car", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
Console.WriteLine("Deleting car: " + car.Id);
StateManager.RemoveCar(car);
this.Close();
}
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
btnSave.PerformClick();
return true; // Indicate that the key has been handled
}
if (keyData == Keys.Escape)
{
this.Close();
return true; // Indicate that the key has been handled
}
if (keyData == Keys.Delete)
{
btnDelete.PerformClick();
return true; // Indicate that the key has been handled
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{93CA258B-A645-41A8-A24F-59036ABC173F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>CarManagerV3</RootNamespace>
<AssemblyName>CarManagerV3</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Car.cs" />
<Compile Include="CarCard.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="CarCard.Designer.cs">
<DependentUpon>CarCard.cs</DependentUpon>
</Compile>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="CarDetailsForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="CarDetailsForm.Designer.cs">
<DependentUpon>CarDetailsForm.cs</DependentUpon>
</Compile>
<Compile Include="ImageManager.cs" />
<Compile Include="PleaseWait.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PleaseWait.Designer.cs">
<DependentUpon>PleaseWait.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SafeManager.cs" />
<Compile Include="StateManager.cs" />
<EmbeddedResource Include="CarCard.resx">
<DependentUpon>CarCard.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CarDetailsForm.resx">
<DependentUpon>CarDetailsForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PleaseWait.resx">
<DependentUpon>PleaseWait.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.7.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.7.2 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarManagerV3
{
internal class ImageManager
{
public static void InitializeImageFolder()
{
string path = "images";
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
}
public static string GetImagePath(Car car)
{
string basePath = "images/";
string fileName = $"{car.Make}_{car.Model}_{car.Year}_{car.Color}.png";
return basePath + fileName;
}
public static Image GetImage(Car car)
{
InitializeImageFolder();
FetchImage(car);
string path = GetImagePath(car);
// does image exist?
if (System.IO.File.Exists(path))
{
return Image.FromFile(path);
}
else
{
return Image.FromFile("images/no_image_available.png");
}
}
public static void FetchImage(Car car)
{
// Fetch the image from https://cdn.imagin.studio/getimage and save it to images/Make_Model_Year.webp
// use params like this: ?customer=hrjavascript-mastery&zoomType=fullscreen&make={make}&modelFamily={model}&modelYear={year}&angle=front&paintDescription={color}&fileType=png
// check if the image already exists
string path = GetImagePath(car);
if (System.IO.File.Exists(path))
{
return;
}
string url = $"https://cdn.imagin.studio/getimage?customer=hrjavascript-mastery&zoomType=fullscreen&make={car.Make}&modelFamily={car.Model}&modelYear={car.Year}&angle=front&paintDescription={car.Color}&fileType=png";
//add Referer header
using (var client = new System.Net.WebClient())
{
client.Headers.Add("Referer", "http://localhost");
try
{
client.DownloadFile(url, path);
}
catch
{
// if error, use no_image_available.png
System.IO.File.Copy("images/no_image_available.png", path);
}
}
}
}
}

215
CarManagerV3/MainForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,215 @@
namespace CarManagerV3
{
partial class MainForm
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.flpCars = new System.Windows.Forms.FlowLayoutPanel();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tbxSearch = new System.Windows.Forms.TextBox();
this.btnNewCar = new System.Windows.Forms.Button();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.recentFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.revealInFileExplorerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.menuStrip1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.flpCars, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.menuStrip1, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(802, 458);
this.tableLayoutPanel1.TabIndex = 0;
this.tableLayoutPanel1.Paint += new System.Windows.Forms.PaintEventHandler(this.tableLayoutPanel1_Paint);
//
// flpCars
//
this.flpCars.AutoScroll = true;
this.flpCars.AutoScrollMargin = new System.Drawing.Size(0, 200);
this.flpCars.Dock = System.Windows.Forms.DockStyle.Fill;
this.flpCars.Location = new System.Drawing.Point(3, 67);
this.flpCars.Name = "flpCars";
this.flpCars.Size = new System.Drawing.Size(796, 412);
this.flpCars.TabIndex = 1;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 2;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.Controls.Add(this.tbxSearch, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.btnNewCar, 1, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 27);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(796, 34);
this.tableLayoutPanel2.TabIndex = 2;
//
// tbxSearch
//
this.tbxSearch.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbxSearch.Location = new System.Drawing.Point(3, 3);
this.tbxSearch.Name = "tbxSearch";
this.tbxSearch.Size = new System.Drawing.Size(392, 22);
this.tbxSearch.TabIndex = 3;
this.tbxSearch.TextChanged += new System.EventHandler(this.tbxSearch_TextChanged);
//
// btnNewCar
//
this.btnNewCar.Location = new System.Drawing.Point(401, 3);
this.btnNewCar.Name = "btnNewCar";
this.btnNewCar.Size = new System.Drawing.Size(75, 23);
this.btnNewCar.TabIndex = 4;
this.btnNewCar.Text = "Add Car";
this.btnNewCar.UseVisualStyleBackColor = true;
this.btnNewCar.Click += new System.EventHandler(this.btnNewCar_Click);
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(802, 24);
this.menuStrip1.TabIndex = 3;
this.menuStrip1.Text = "menuStrip1";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.openToolStripMenuItem,
this.saveToolStripMenuItem,
this.saveAsToolStripMenuItem,
this.importToolStripMenuItem,
this.recentFilesToolStripMenuItem,
this.revealInFileExplorerToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// openToolStripMenuItem
//
this.openToolStripMenuItem.Name = "openToolStripMenuItem";
this.openToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.openToolStripMenuItem.Text = "Open";
this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
//
// saveToolStripMenuItem
//
this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
this.saveToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.saveToolStripMenuItem.Text = "Save";
this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
//
// saveAsToolStripMenuItem
//
this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.saveAsToolStripMenuItem.Text = "Save as";
this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
//
// importToolStripMenuItem
//
this.importToolStripMenuItem.Name = "importToolStripMenuItem";
this.importToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.importToolStripMenuItem.Text = "Import";
this.importToolStripMenuItem.Click += new System.EventHandler(this.importToolStripMenuItem_Click);
//
// recentFilesToolStripMenuItem
//
this.recentFilesToolStripMenuItem.Name = "recentFilesToolStripMenuItem";
this.recentFilesToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.recentFilesToolStripMenuItem.Text = "Recent Files";
this.recentFilesToolStripMenuItem.Click += new System.EventHandler(this.recentFilesToolStripMenuItem_Click);
//
// revealInFileExplorerToolStripMenuItem
//
this.revealInFileExplorerToolStripMenuItem.Name = "revealInFileExplorerToolStripMenuItem";
this.revealInFileExplorerToolStripMenuItem.Size = new System.Drawing.Size(187, 22);
this.revealInFileExplorerToolStripMenuItem.Text = "Reveal in File Explorer";
this.revealInFileExplorerToolStripMenuItem.Click += new System.EventHandler(this.revealInFileExplorerToolStripMenuItem_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(802, 458);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1;
this.MinimumSize = new System.Drawing.Size(818, 497);
this.Name = "MainForm";
this.Text = "Carmanager 3";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.FlowLayoutPanel flpCars;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.TextBox tbxSearch;
private System.Windows.Forms.Button btnNewCar;
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem recentFilesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem revealInFileExplorerToolStripMenuItem;
}
}

383
CarManagerV3/MainForm.cs Normal file
View File

@@ -0,0 +1,383 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
public partial class MainForm : Form
{
List<Car> cars = new List<Car>();
string filepath = "cars.csv";
public MainForm()
{
InitializeComponent();
List<string> recentFiles = SafeManager.GetRecentPaths();
if(recentFiles.Count > 0)
{
filepath = recentFiles[0];
}
SafeManager.InitializeFile(filepath);
List<Car> _cars = SafeManager.ReadCars(filepath);
refreshCars(_cars);
refreshRecents();
}
private async void refreshCars(List<Car> _cars, bool updateGlobal = true)
{
this.Text = "Car Manager - " + System.IO.Path.GetFileName(filepath);
// Sort by Car.Order. If equal, sort by ID
_cars = _cars.Count > 0 ? _cars.OrderBy(c => c.Order).ThenBy(c => c.Id).ToList() : _cars;
if (updateGlobal)
{
cars = _cars;
}
foreach (Car car in _cars)
{
// not in list? add it
bool isNew = flpCars.Controls.OfType<CarCard>().All(c => c.Car.Id != car.Id);
// existing but changed? update it
CarCard card = new CarCard();
if (!isNew)
{
CarCard existing = flpCars.Controls.OfType<CarCard>().First(c => c.Car.Id == car.Id);
Car existingCar = existing.Car;
if (existing == null)
{
Console.Error.WriteLine($"[L] Error: Existing car card not found for car ID: {car.Id}");
continue;
}
// compare details
Console.WriteLine($"[L] Checking car: {car.Id} | Car Color: {car.Color} | Ex Color: {existingCar.Color}");
if (existingCar.IsChanged(car))
{
Console.WriteLine($"[L] Updating car: {car.Id}");
// changes
card = existing;
}
else
{
// no changes
Console.WriteLine($"[L] No changes for car: {car.Id}");
flpCars.Controls.SetChildIndex(existing, _cars.IndexOf(car));
continue;
}
}
card.CarName = $"{car.Make} {car.Model}";
card.CarDetails = $"{car.Year}, {car.Mileage} km, ${car.Price}";
card.Car = car.Clone();
card.LoadImage();
// clear existing event handlers to prevent multiple subscriptions
card.ClearCardClickedHandlers();
card.CardClicked += (s, e) =>
{
Console.WriteLine($"Card clicked: {car.Id}");
CarDetailsForm detailsForm = new CarDetailsForm(car);
detailsForm.FormClosed += async (s2, e2) =>
{
Console.WriteLine("Car details form closed.");
// refresh cars
Console.WriteLine("Refreshing cars...");
List<Car> __cars = await Task.Run(() => SafeManager.ReadCars(filepath));
if (tbxSearch.Text.Length > 0)
{
Console.WriteLine("Search box has text, applying search filter.");
cars = __cars;
searchList(tbxSearch.Text);
return;
}
refreshCars(__cars);
};
detailsForm.ShowDialog();
};
if (isNew)
{
flpCars.Controls.Add(card);
}
flpCars.Controls.SetChildIndex(card, _cars.IndexOf(car));
}
// Remove cards that are no longer in _cars
var carIds = _cars.Select(c => c.Id).ToList();
var cardsToRemove = flpCars.Controls.OfType<CarCard>().Where(c => !carIds.Contains(c.Car.Id)).ToList();
foreach (var card in cardsToRemove)
{
flpCars.Controls.Remove(card);
}
flpCars.Refresh();
flpCars.Invalidate();
flpCars.Update();
}
private void btnNewCar_Click(object sender, EventArgs e)
{
Car foocar = StateManager.CreateCar("New", "Car", 2020, "White", 0, 20000);
CarDetailsForm detailsForm = new CarDetailsForm(foocar);
detailsForm.FormClosed += (s2, e2) =>
{
// refresh cars
Console.WriteLine("Refreshing cars...");
List<Car> cars_ = SafeManager.ReadCars(filepath);
refreshCars(cars_, false);
};
detailsForm.ShowDialog();
}
List<Car> filterCarsByQuery(string query)
{
List<Car> results = new List<Car>();
foreach (Car car in cars)
{
if (car.Make.ToLower().Contains(query.ToLower()) || car.Model.ToLower().Contains(query.ToLower()) || car.Year.ToString().Contains(query) || car.Mileage.ToString().Contains(query) || car.Price.ToString().Contains(query))
{
results.Add(car);
}
}
return results;
}
void searchList(string query)
{
List<Car> results = filterCarsByQuery(query);
refreshCars(results, false);
}
private async void tbxSearch_TextChanged(object sender, EventArgs e)
{
string query = tbxSearch.Text;
await Task.Delay(100); // debounce
if (query != tbxSearch.Text) return; // text changed during delay
//flpCars.Controls.Clear();
if (string.IsNullOrWhiteSpace(query))
{
refreshCars(cars);
}
else
{
searchList(query);
}
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
dlgOpen.Title = "Open Car Data File";
// Default to users documents
dlgOpen.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DialogResult result = dlgOpen.ShowDialog();
if (result == DialogResult.OK)
{
try
{
List<Car> importedCars = SafeManager.ReadCars(dlgOpen.FileName);
if(importedCars.Count == 0)
{
throw new Exception("File doesn't contain valid Cars.");
}
filepath = dlgOpen.FileName;
cars = importedCars;
StateManager.setFilePath(filepath);
// Refresh display
refreshCars(cars);
MessageBox.Show("File loaded successfully.", "Load File", MessageBoxButtons.OK, MessageBoxIcon.Information);
SafeManager.AddRecentPath(filepath);
refreshRecents();
}
catch (Exception ex)
{
MessageBox.Show("Error loading file: " + ex.Message);
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
refreshCars(cars);
SafeManager.SaveCars(filepath, cars);
MessageBox.Show("File saved successfully.", "Save File", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog dlgSave = new SaveFileDialog();
dlgSave.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
dlgSave.Title = "Save Car Data File As";
// Default to users documents
dlgSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DialogResult result = dlgSave.ShowDialog();
if (result == DialogResult.OK)
{
// does file already exist?
/*if (System.IO.File.Exists(dlgSave.FileName))
{
var overwriteResult = MessageBox.Show("File already exists. Overwrite?", "Overwrite File", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (overwriteResult != DialogResult.Yes)
{
return;
}
}*/
// Windows already handles this lmao
filepath = dlgSave.FileName;
this.Text = "Car Manager - " + System.IO.Path.GetFileName(filepath);
StateManager.setFilePath(filepath);
SafeManager.SaveCars(filepath, cars);
SafeManager.AddRecentPath(filepath);
}
refreshRecents();
}
private void importToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Importing will add cars from another file to this file. This action cannot be undone. Continue?", "Import Cars", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
dlgOpen.Title = "Import Car Data File";
// Default to users documents
dlgOpen.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DialogResult dlgResult = dlgOpen.ShowDialog();
if (dlgResult == DialogResult.OK)
{
try
{
Console.WriteLine("Starting merge...");
List<Car> importedCars = SafeManager.ReadCars(dlgOpen.FileName);
if(importedCars.Count == 0)
{
throw new Exception("File doesn't contain valid Cars.");
}
// merge cars
foreach (Car car in importedCars)
{
// check if car with same ID exists
if (cars.Any(c => c.Id == car.Id))
{
// assign new ID
int newId = cars.Count > 0 ? cars.Max(c => c.Id) + 1 : 1;
car.Id = newId;
}
cars.Add(car);
}
DialogResult mergeAsNewFileResult = MessageBox.Show("Do you want to save the merged cars as a new file?", "Save As New File", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (mergeAsNewFileResult == DialogResult.Yes)
{
SaveFileDialog dlgSave = new SaveFileDialog();
dlgSave.Filter = "CSV Files (*.csv)|*.csv|All Files (*.*)|*.*";
dlgSave.Title = "Save Merged Car Data File As";
// Default to users documents
dlgSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DialogResult saveResult = dlgSave.ShowDialog();
if (saveResult == DialogResult.OK)
{
filepath = dlgSave.FileName;
StateManager.setFilePath(filepath);
SafeManager.SaveCars(filepath, cars);
SafeManager.AddRecentPath(filepath);
refreshRecents();
}
}
else
{
// save to current file
SafeManager.SaveCars(filepath, cars);
}
// Refresh display
refreshCars(cars);
MessageBox.Show("File imported successfully.", "Import File", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Error importing file: " + ex.Message);
}
}
else
{
Console.WriteLine("Import cancelled.");
}
}
}
private void recentFilesToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void refreshRecents()
{
recentFilesToolStripMenuItem.DropDownItems.Clear();
List<string> recentFiles = SafeManager.GetRecentPaths();
recentFilesToolStripMenuItem.Enabled = recentFiles.Count > 0;
recentFilesToolStripMenuItem.ToolTipText = recentFiles.Count > 0 ? "" : "No recent files.";
foreach (string path in recentFiles)
{
ToolStripMenuItem item = new ToolStripMenuItem(path);
item.Click += (s, e2) =>
{
try
{
List<Car> importedCars = SafeManager.ReadCars(path);
if(importedCars.Count == 0)
{
throw new Exception("File doesn't contain valid Cars.");
}
filepath = path;
cars = importedCars;
StateManager.setFilePath(filepath);
// Refresh display
refreshCars(cars);
MessageBox.Show("File loaded successfully.", "Load File", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Error loading file: " + ex.Message);
}
};
recentFilesToolStripMenuItem.DropDownItems.Add(item);
}
}
private void revealInFileExplorerToolStripMenuItem_Click(object sender, EventArgs e)
{
// Open File Explorer at the location of the current filepath
if (System.IO.File.Exists(filepath))
{
System.Diagnostics.Process.Start("explorer.exe", "/select,\"" + filepath + "\"");
}
else
{
MessageBox.Show("File does not exist.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

823
CarManagerV3/MainForm.resx Normal file
View File

@@ -0,0 +1,823 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<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="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAZGQAAAEAIACoogAAFgAAACgAAABkAAAAyAAAAAEAIAAAAAAAQJwAABMLAAATCwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//nxCS/6I/kf+hb5D/
oI+Q/6C/kP+gz5H/oO+R/6D/kf+g/5H/oP+R/6D/kP+g35D/oN+Q/6CvkP+gn5H/oW+S/6I/j/+fEAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACS/6I/kP+gj5D/oM+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+Q/6C/kP+gj5L/oj8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fIJD/oJ+R/6Dfkf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g75H/oX+P/58gAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACS/6I/kP+gr5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5D/oL+S/6I/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//nyCQ/6C/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5D/oL+S/6I/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAj/+fIJD/oJ+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5D/
oI+P/58QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fYJH/
oN+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g74//n1AAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/58QkP+gj5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kP+gj4//nxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACP/58gkf+g35H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6Dfj/+fIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/58wkf+g35H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oN+P/58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACP/58wkf+g75H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g74//nzAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/58wkf+g75H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6Dvj/+fMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/58wkf+g75H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oO+P/58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACP/58gkf+g35H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g34//
nyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/58Qkf+g35H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6Dfj/+fEAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAkP+gj5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5D/oI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fUJH/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+hXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fEJH/oO+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oN+P/58gAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJD/oI+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kP+gnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//n0CR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+P/58gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6C/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kP+gvwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACP/59Akf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+S/6I/AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+gv5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kP+grwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAj/+fIJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+P/58gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJH/
oX+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kP+gnwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6Dvkf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oN8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACP/59Akf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kv+iPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkP+gj5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5D/oI8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJH/oL+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6DPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI//nxCR/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/4//nxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP/59Akf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+S/6I/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+hb5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+hbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJD/oJ+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5D/oI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACS/6Cvkf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+Q/6C/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g35H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+gzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oN+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oO8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g3wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oN8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+Q/6CvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kP+gnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+P/59AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/j/+fEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+gvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5D/oI8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+P/59AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6DvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+hfwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/4//nyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oL8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+P/59AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6C/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/j/+fQAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kv+gjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g74//nxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/4//n1AAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5L/oI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oN+P/58QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oN+P/58gAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oO+P/58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkf+g35H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oO+P/58wAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJH/oL+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oO+P/58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/6Fvkf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oN+P/58wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fIJH/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oN+P/58gAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACS/6Cfkf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5L/oI+P/58QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/+fIJH/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g35H/oV8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/5+Akf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kv+gn4//nyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJL/oK+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6C/j/+fIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACP/58Qkf+gv5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5L/oK+P/59AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACR/5+Qkf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6Dfkv+gn4//
nyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//n0CR/6C/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+gz5L/oI+P/59AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI//nyCR/5+Akv+gr5H/oN+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/
oP+R/6D/kf+g/5H/oP+R/6D/kf+g/5H/oP+R/6D/kf+g75H/oM+R/6C/kv+gj5H/oW+P/59Aj/+fEAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////8AAAAP//
//////////////AAAAD////////////////wAAAA////////////////8AAAAP////////////////AA
AAD////////////////wAAAA////////////////8AAAAP////////////////AAAAD/////////////
///wAAAA////////////////8AAAAP////////////////AAAAD////////////////wAAAA//////+A
AB//////8AAAAP/////8AAAD//////AAAAD/////4AAAAH/////wAAAA/////4AAAAAf////8AAAAP//
//4AAAAAB/////AAAAD////4AAAAAAH////wAAAA////8AAAAAAA////8AAAAP///8AAAAAAAD////AA
AAD///+AAAAAAAAf///wAAAA////AAAAAAAAD///8AAAAP///gAAAAAAAAf///AAAAD///wAAAAAAAAD
///wAAAA///4AAAAAAAAAf//8AAAAP//8AAAAAAAAAD///AAAAD//+AAAAAAAAAAf//wAAAA///gAAAA
AAAAAH//8AAAAP//wAAAAAAAAAA///AAAAD//4AAAAAAAAAAH//wAAAA//+AAAAAAAAAAB//8AAAAP//
AAAAAAAAAAAP//AAAAD//wAAAAAAAAAAD//wAAAA//4AAAAAAAAAAAf/8AAAAP/+AAAAAAAAAAAH//AA
AAD//AAAAAAAAAAAA//wAAAA//wAAAAAAAAAAAP/8AAAAP/8AAAAAAAAAAAD//AAAAD/+AAAAAAAAAAA
Af/wAAAA//gAAAAAAAAAAAH/8AAAAP/4AAAAAAAAAAAB//AAAAD/8AAAAAAAAAAAAP/wAAAA//AAAAAA
AAAAAAD/8AAAAP/wAAAAAAAAAAAA//AAAAD/8AAAAAAAAAAAAP/wAAAA//AAAAAAAAAAAAD/8AAAAP/w
AAAAAAAAAAAA//AAAAD/8AAAAAAAAAAAAP/wAAAA//AAAAAAAAAAAAD/8AAAAP/wAAAAAAAAAAAA//AA
AAD/8AAAAAAAAAAAAP/wAAAA//AAAAAAAAAAAAD/8AAAAP/wAAAAAAAAAAAA//AAAAD/8AAAAAAAAAAA
AP/wAAAA//AAAAAAAAAAAAD/8AAAAP/wAAAAAAAAAAAA//AAAAD/8AAAAAAAAAAAAP/wAAAA//AAAAAA
AAAAAAD/8AAAAP/wAAAAAAAAAAAA//AAAAD/8AAAAAAAAAAAAf/wAAAA//AAAAAAAAAAAAH/8AAAAP/w
AAAAAAAAAAAB//AAAAD/8AAAAAAAAAAAA//wAAAA//AAAAAAAAAAAAP/8AAAAP/wAAAAAAAAAAAD//AA
AAD/8AAAAAAAAAAAB//wAAAA//AAAAAAAAAAAAf/8AAAAP/wAAAAAAAAAAAP//AAAAD/8AAAAAAAAAAA
D//wAAAA//AAAAAAAAAAAB//8AAAAP/wAAAAAAAAAAAf//AAAAD/8AAAAAAAAAAAP//wAAAA//AAAAAA
AAAAAH//8AAAAP/wAAAAAAAAAAB///AAAAD/8AAAAAAAAAAA///wAAAA//AAAAAAAAAAAf//8AAAAP/w
AAAAAAAAAAP///AAAAD/8AAAAAAAAAAH///wAAAA//AAAAAAAAAAD///8AAAAP/wAAAAAAAAAB////AA
AAD/+AAAAAAAAAA////wAAAA//gAAAAAAAAA////8AAAAP/8AAAAAAAAAf////AAAAD//gAAAAAAAAf/
///wAAAA//4AAAAAAAAf////8AAAAP//gAAAAAAAf/////AAAAD//8AAAAAAA//////wAAAA///wAAAA
AB//////8AAAAP////////////////AAAAD////////////////wAAAA////////////////8AAAAP//
//////////////AAAAD////////////////wAAAA////////////////8AAAAP////////////////AA
AAD////////////////wAAAA////////////////8AAAAP////////////////AAAAD/////////////
///wAAAA////////////////8AAAAA==
</value>
</data>
</root>

92
CarManagerV3/PleaseWait.Designer.cs generated Normal file
View File

@@ -0,0 +1,92 @@
namespace CarManagerV3
{
partial class PleaseWait
{
/// <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 Windows Form 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.progressBar1 = new System.Windows.Forms.ProgressBar();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// progressBar1
//
this.progressBar1.Location = new System.Drawing.Point(12, 62);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(422, 23);
this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
this.progressBar1.TabIndex = 0;
this.progressBar1.Click += new System.EventHandler(this.progressBar1_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(12, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(121, 20);
this.label1.TabIndex = 1;
this.label1.Text = "Please wait...";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(13, 33);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(133, 16);
this.label2.TabIndex = 2;
this.label2.Text = "Saving your changes";
//
// PleaseWait
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.ClientSize = new System.Drawing.Size(446, 97);
this.ControlBox = false;
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.progressBar1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "PleaseWait";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "Please Wait";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ProgressBar progressBar1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
}
}

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
public partial class PleaseWait : Form
{
public PleaseWait()
{
InitializeComponent();
// loading animation
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;
}
private void progressBar1_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<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>
</root>

22
CarManagerV3/Program.cs Normal file
View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarManagerV3
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("CarManagerV3")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CarManagerV3")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("93ca258b-a645-41a8-a24f-59036abc173f")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CarManagerV3.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CarManagerV3.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CarManagerV3.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

103
CarManagerV3/SafeManager.cs Normal file
View File

@@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarManagerV3
{
internal class SafeManager
{
private static readonly string recentPathsFile = "recent_paths.txt";
public static void InitializeFile(string path)
{
if (!File.Exists(@path))
{
using (StreamWriter writer = new StreamWriter(@path))
{
// Create the file, empty
writer.WriteLine();
}
}
}
public static List<Car> ReadCars(string path)
{
List<Car> cars = new List<Car>();
using (StreamReader reader = new StreamReader(@path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// Process the line
if (line == "") continue;
cars.Add(Car.FromCsvString(line));
}
}
return cars;
}
public static void SaveCars(string path, List<Car> cars)
{
using (StreamWriter writer = new StreamWriter(@path))
{
foreach (Car car in cars)
{
writer.WriteLine(car.ToCsvString());
}
}
}
public static void AddRecentPath(string path)
{
// Read the file, if the path is not already in the file, add it to the top.
// If it is already in the file, move it to the top.
// Keep only the 5 most recent paths.
List<string> paths = new List<string>();
if (File.Exists(recentPathsFile))
{
using (StreamReader reader = new StreamReader(recentPathsFile))
{
string line;
while ((line = reader.ReadLine()) != null)
{
paths.Add(line);
}
}
}
paths.Remove(path);
paths.Insert(0, path);
if (paths.Count > 5)
{
paths = paths.Take(5).ToList();
}
using (StreamWriter writer = new StreamWriter(recentPathsFile))
{
foreach (string p in paths)
{
writer.WriteLine(p);
}
}
}
public static List<string> GetRecentPaths()
{
List<string> paths = new List<string>();
if (File.Exists(recentPathsFile))
{
using (StreamReader reader = new StreamReader(recentPathsFile))
{
string line;
while ((line = reader.ReadLine()) != null)
{
paths.Add(line);
}
}
}
return paths;
}
}
}

View File

@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarManagerV3
{
internal class StateManager
{
static List<Car> cars = new List<Car>();
static string filePath = "cars.csv";
public static Car GetCarById(int id)
{
cars = SafeManager.ReadCars(filePath);
return cars.FirstOrDefault(c => c.Id == id);
}
public static List<Car> Cars { get { return cars; } set { cars = value; } }
public static void AddCar(Car car)
{
cars = SafeManager.ReadCars(filePath);
cars.Add(car);
SafeManager.SaveCars(filePath, cars);
}
public static void RemoveCar(Car car)
{
cars = SafeManager.ReadCars(filePath);
Car existingCar = GetCarById(car.Id);
if (existingCar == null) return;
cars.Remove(existingCar);
SafeManager.SaveCars(filePath, cars);
}
public static void UpdateCar(Car car)
{
Car existingCar = GetCarById(car.Id);
if (existingCar != null)
{
int index = cars.IndexOf(existingCar);
cars[index] = car;
Console.WriteLine("Updated car: " + existingCar.Id);
SafeManager.SaveCars(filePath, cars);
}
}
public static Car CreateCar(string make, string model, int year, string color, int mileage, decimal price)
{
cars = SafeManager.ReadCars(filePath);
int newId = cars.Count > 0 ? cars.Max(c => c.Id) + 1 : 1;
Car newCar = new Car(newId, make, model, year, color, mileage, price);
AddCar(newCar);
return newCar;
}
public static void setFilePath(string path)
{
filePath = path;
}
}
}