From a3075f756070abcbf646aeaec0a8c23fd9f7bdf7 Mon Sep 17 00:00:00 2001 From: AsvalGTA Date: Thu, 28 Mar 2019 00:46:22 +0100 Subject: [PATCH] added featured image option to the icon creator --- FModel/App.config | 3 + FModel/FModel.csproj | 2 + FModel/Options.Designer.cs | 14 + FModel/Options.cs | 172 ++- FModel/PAKWindow.cs | 1569 ++++++++++++++++------- FModel/Parser/FeaturedParser.cs | 100 ++ FModel/Parser/ItemsIDParser.cs | 12 + FModel/Properties/Resources.Designer.cs | 10 + FModel/Properties/Resources.resx | 27 +- FModel/Properties/Settings.Designer.cs | 12 + FModel/Properties/Settings.settings | 3 + FModel/Resources/wTemplateF.png | Bin 0 -> 35367 bytes 12 files changed, 1433 insertions(+), 491 deletions(-) create mode 100644 FModel/Parser/FeaturedParser.cs create mode 100644 FModel/Resources/wTemplateF.png diff --git a/FModel/App.config b/FModel/App.config index 037ed097..747661a3 100644 --- a/FModel/App.config +++ b/FModel/App.config @@ -52,6 +52,9 @@ False + + False + \ No newline at end of file diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 277507ad..b0c1dd5a 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -108,6 +108,7 @@ PAKWindow.cs + @@ -147,6 +148,7 @@ + diff --git a/FModel/Options.Designer.cs b/FModel/Options.Designer.cs index 3f5db04c..3bf76ed1 100644 --- a/FModel/Options.Designer.cs +++ b/FModel/Options.Designer.cs @@ -44,6 +44,7 @@ this.textBox2 = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); this.checkBox7 = new System.Windows.Forms.CheckBox(); this.filenameLabel = new System.Windows.Forms.Label(); this.trackBar1 = new System.Windows.Forms.TrackBar(); @@ -214,6 +215,7 @@ // // groupBox4 // + this.groupBox4.Controls.Add(this.checkBox8); this.groupBox4.Controls.Add(this.checkBox7); this.groupBox4.Controls.Add(this.filenameLabel); this.groupBox4.Controls.Add(this.trackBar1); @@ -237,6 +239,17 @@ this.groupBox4.TabStop = false; this.groupBox4.Text = "Icon Creation"; // + // checkBox8 + // + this.checkBox8.AutoSize = true; + this.checkBox8.Location = new System.Drawing.Point(6, 79); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.Size = new System.Drawing.Size(177, 17); + this.checkBox8.TabIndex = 26; + this.checkBox8.Text = "Use Featured Image If Available"; + this.checkBox8.UseVisualStyleBackColor = true; + this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox8_CheckedChanged); + // // checkBox7 // this.checkBox7.AutoSize = true; @@ -461,5 +474,6 @@ private System.Windows.Forms.TrackBar trackBar2; private System.Windows.Forms.Label filenameLabel; private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.CheckBox checkBox8; } } \ No newline at end of file diff --git a/FModel/Options.cs b/FModel/Options.cs index b95a7164..9b90605a 100644 --- a/FModel/Options.cs +++ b/FModel/Options.cs @@ -96,23 +96,43 @@ namespace FModel comboBox1.SelectedItem = Properties.Settings.Default.IconName; trackBar2.Value = Properties.Settings.Default.wSize; trackBar1.Value = Properties.Settings.Default.wOpacity; + checkBox8.Checked = Properties.Settings.Default.loadFeaturedImage; button1.Enabled = Properties.Settings.Default.isWatermark; trackBar1.Enabled = Properties.Settings.Default.isWatermark; trackBar2.Enabled = Properties.Settings.Default.isWatermark; - if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + if (Properties.Settings.Default.loadFeaturedImage == false) { - filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename); - Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); - Graphics g = Graphics.FromImage(bmp); - - Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); - var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.wOpacity / 100); - g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize), (522 - Properties.Settings.Default.wSize) / 2, (522 - Properties.Settings.Default.wSize) / 2, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize); + Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); + Graphics g = Graphics.FromImage(bmp); - wPictureBox.Image = bmp; + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.wOpacity / 100); + g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize), (522 - Properties.Settings.Default.wSize) / 2, (522 - Properties.Settings.Default.wSize) / 2, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize); + + wPictureBox.Image = bmp; + } + } + if (Properties.Settings.Default.loadFeaturedImage == true) + { + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename); + + Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF); + Graphics g = Graphics.FromImage(bmp); + + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.wOpacity / 100); + g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize), (522 - Properties.Settings.Default.wSize) / 2, (522 - Properties.Settings.Default.wSize) / 2, Properties.Settings.Default.wSize, Properties.Settings.Default.wSize); + + wPictureBox.Image = bmp; + } } PAKBefore = Properties.Settings.Default.FortnitePAKs; @@ -177,6 +197,14 @@ namespace FModel { Properties.Settings.Default.isWatermark = false; } + if (checkBox8.Checked == true) + { + Properties.Settings.Default.loadFeaturedImage = true; + } + if (checkBox8.Checked == false) + { + Properties.Settings.Default.loadFeaturedImage = false; + } if (comboBox1.SelectedItem == null) { Properties.Settings.Default.IconName = "Selected Item Name (i.e. CID_001_Athena_Commando_F_Default)"; @@ -225,48 +253,102 @@ namespace FModel Properties.Settings.Default.Save(); filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.wFilename); - if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + if (checkBox8.Checked == false) { - Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); - Graphics g = Graphics.FromImage(bmp); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); + Graphics g = Graphics.FromImage(bmp); - Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); - g.DrawImage(ResizeImage(watermark, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); - wPictureBox.Image = bmp; + wPictureBox.Image = bmp; + } + } + if (checkBox8.Checked == true) + { + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF); + Graphics g = Graphics.FromImage(bmp); + + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + + wPictureBox.Image = bmp; + } } } } private void trackBar2_ValueChanged(object sender, EventArgs e) { - if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + if (checkBox8.Checked == false) { - Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); - Graphics g = Graphics.FromImage(bmp); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); + Graphics g = Graphics.FromImage(bmp); - Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); - var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); - g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); - wPictureBox.Image = bmp; - wPictureBox.Refresh(); + wPictureBox.Image = bmp; + wPictureBox.Refresh(); + } + } + if (checkBox8.Checked == true) + { + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF); + Graphics g = Graphics.FromImage(bmp); + + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + + wPictureBox.Image = bmp; + wPictureBox.Refresh(); + } } } private void trackBar1_ValueChanged(object sender, EventArgs e) { - if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + if (checkBox8.Checked == false) { - Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); - Graphics g = Graphics.FromImage(bmp); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); + Graphics g = Graphics.FromImage(bmp); - Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); - var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); - g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); - wPictureBox.Image = bmp; - wPictureBox.Refresh(); + wPictureBox.Image = bmp; + wPictureBox.Refresh(); + } + } + if (checkBox8.Checked == true) + { + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF); + Graphics g = Graphics.FromImage(bmp); + + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + + wPictureBox.Image = bmp; + wPictureBox.Refresh(); + } } } @@ -285,5 +367,33 @@ namespace FModel trackBar2.Enabled = true; } } + + private void checkBox8_CheckedChanged(object sender, EventArgs e) + { + if (checkBox8.Checked == false) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplate); + Graphics g = Graphics.FromImage(bmp); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + } + wPictureBox.Image = bmp; + } + if (checkBox8.Checked == true) + { + Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF); + Graphics g = Graphics.FromImage(bmp); + if (!string.IsNullOrEmpty(Properties.Settings.Default.wFilename)) + { + Image watermark = Image.FromFile(Properties.Settings.Default.wFilename); + var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100); + g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value); + } + wPictureBox.Image = bmp; + } + } } } diff --git a/FModel/PAKWindow.cs b/FModel/PAKWindow.cs index ff0f5525..635b109d 100644 --- a/FModel/PAKWindow.cs +++ b/FModel/PAKWindow.cs @@ -1,4 +1,5 @@ using FModel.Items; +using FModel.Parser.Featured; using FModel.Challenges; using FModel.Quest; using Newtonsoft.Json; @@ -1181,6 +1182,7 @@ namespace FModel } public static string currentItem; + public static bool wasFeatured; private async void ExtractAssetButton_Click(object sender, EventArgs e) { Stopwatch stopWatch = new Stopwatch(); @@ -1299,508 +1301,1178 @@ namespace FModel getItemRarity(IDParser[iii], g); string itemIconPath = string.Empty; + string catalogName = string.Empty; - if (IDParser[iii].HeroDefinition != null) + if (Properties.Settings.Default.loadFeaturedImage == false) { - var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath)) + wasFeatured = false; + if (IDParser[iii].HeroDefinition != null) { - AppendText("✔ ", Color.Green); - AppendText("Extracting ", Color.Black); - AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true); - - if (isAllPAKs == false) - { - await Task.Run(() => - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { - try - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); - } - catch (KeyNotFoundException ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); - } - }); - } - filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - try - { - if (filesPath != null) + var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) { AppendText("✔ ", Color.Green); - AppendText(IDParser[iii].HeroDefinition, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); - try + AppendText("Extracting ", Color.Black); + AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true); + + if (isAllPAKs == false) { await Task.Run(() => { - jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); }); - var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); - var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); - File.Delete(filesJSON2); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + try + { + if (filesPath != null) + { AppendText("✔ ", Color.Green); AppendText(IDParser[iii].HeroDefinition, Color.DarkRed); - AppendText(" successfully serialized", Color.Black, true); - - var IDParser2 = ItemsIdParser.FromJson(json2); - for (int i1 = 0; i1 < IDParser2.Length; i1++) - { - if (IDParser2[i1].LargePreviewImage != null) - { - string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.')); - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" detected as a ", Color.Black); - AppendText("Texture2D file", Color.SteelBlue, true); - - var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath2)) - { - if (currentGUID != "0-0-0-0") - { - await Task.Run(() => - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - else - { - if (isAllPAKs == false) - { - await Task.Run(() => - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { - try - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - catch (KeyNotFoundException ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); - } - }); - } - filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - } - try - { - if (filesPath2 != null) - { - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); - - itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; - if (!File.Exists(itemIconPath)) - { - await Task.Run(() => - { - jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); - }); - itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; - } - - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully converted to a PNG image with path ", Color.Black); - AppendText(itemIconPath, Color.SteelBlue, true); - } - } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(textureFile, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); - } - } - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } - } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); - } - } - else if (IDParser[iii].WeaponDefinition != null) - { - var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath)) - { - AppendText("✔ ", Color.Green); - AppendText("Extracting ", Color.Black); - AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true); - - if (isAllPAKs == false) - { - await Task.Run(() => - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); try { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); + await Task.Run(() => + { + jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); + var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); + File.Delete(filesJSON2); + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].HeroDefinition, Color.DarkRed); + AppendText(" successfully serialized", Color.Black, true); + + var IDParser2 = ItemsIdParser.FromJson(json2); + for (int i1 = 0; i1 < IDParser2.Length; i1++) + { + if (IDParser2[i1].LargePreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath2)) + { + if (currentGUID != "0-0-0-0") + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath2 != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } } - catch (KeyNotFoundException ex) + catch (Exception ex) { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); + Console.WriteLine(ex.Message); } - }); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); } - filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); } - try + else if (IDParser[iii].WeaponDefinition != null) { - if (filesPath != null) + var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) { AppendText("✔ ", Color.Green); - AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); - try + AppendText("Extracting ", Color.Black); + AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true); + + if (isAllPAKs == false) { await Task.Run(() => { - jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); }); - var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); - var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); - File.Delete(filesJSON2); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + try + { + if (filesPath != null) + { AppendText("✔ ", Color.Green); AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed); - AppendText(" successfully serialized", Color.Black, true); - - var IDParser2 = ItemsIdParser.FromJson(json2); - for (int i2 = 0; i2 < IDParser2.Length; i2++) + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + try { - if (IDParser2[i2].LargePreviewImage != null) + await Task.Run(() => { - string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.')); - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" detected as a ", Color.Black); - AppendText("Texture2D file", Color.SteelBlue, true); + jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); + var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); + File.Delete(filesJSON2); + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed); + AppendText(" successfully serialized", Color.Black, true); - var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath2)) + var IDParser2 = ItemsIdParser.FromJson(json2); + for (int i2 = 0; i2 < IDParser2.Length; i2++) + { + if (IDParser2[i2].LargePreviewImage != null) { - if (currentGUID != "0-0-0-0") + string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath2)) { - await Task.Run(() => + if (currentGUID != "0-0-0-0") { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath2 != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); + } + } + else if (IDParser[iii].LargePreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + if (currentGUID != "0-0-0-0") //DYNAMIC PAK + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else //NORMAL PAK + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/2dAssets/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + else if (IDParser[iii].SmallPreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + if (currentGUID != "0-0-0-0") + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/2dAssets/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } + if (Properties.Settings.Default.loadFeaturedImage == true) + { + try + { + if (IDParser[iii].DisplayAssetPath.AssetPathName.Contains("/Game/Catalog/DisplayAssets/")) + { + wasFeatured = true; + catalogName = IDParser[iii].DisplayAssetPath.AssetPathName; + var filesPath = Directory.GetFiles(docPath + "\\Extracted", catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + AppendText("✔ ", Color.Green); + AppendText("Extracting ", Color.Black); + AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed, true); + + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + catalogName.Substring(catalogName.LastIndexOf('.') + 1) + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => + { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[catalogName.Substring(catalogName.LastIndexOf('.') + 1)] + "\" \"" + catalogName.Substring(catalogName.LastIndexOf('.') + 1) + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + try + { + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + try + { + await Task.Run(() => + { + jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + var filesJSON2 = Directory.GetFiles(docPath, catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".json", SearchOption.AllDirectories).FirstOrDefault(); + var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); + File.Delete(filesJSON2); + AppendText("✔ ", Color.Green); + AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed); + AppendText(" successfully serialized", Color.Black, true); + + var IDParser2 = FeaturedParser.FromJson(json2); + for (int i1 = 0; i1 < IDParser2.Length; i1++) + { + if (IDParser2[i1].DetailsImage != null) + { + string textureFile = IDParser2[i1].DetailsImage.ResourceObject; + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath2)) + { + if (currentGUID != "0-0-0-0") + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath2 != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); + } + } + } + catch (NullReferenceException) + { + wasFeatured = false; + if (IDParser[iii].HeroDefinition != null) + { + var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + AppendText("✔ ", Color.Green); + AppendText("Extracting ", Color.Black); + AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true); + + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + try + { + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].HeroDefinition, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + try + { + await Task.Run(() => + { + jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); + var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); + File.Delete(filesJSON2); + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].HeroDefinition, Color.DarkRed); + AppendText(" successfully serialized", Color.Black, true); + + var IDParser2 = ItemsIdParser.FromJson(json2); + for (int i1 = 0; i1 < IDParser2.Length; i1++) + { + if (IDParser2[i1].LargePreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath2)) + { + if (currentGUID != "0-0-0-0") + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath2 != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); + } + } + else if (IDParser[iii].WeaponDefinition != null) + { + var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + AppendText("✔ ", Color.Green); + AppendText("Extracting ", Color.Black); + AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true); + + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + try + { + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + try + { + await Task.Run(() => + { + jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault(); + var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString(); + File.Delete(filesJSON2); + AppendText("✔ ", Color.Green); + AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed); + AppendText(" successfully serialized", Color.Black, true); + + var IDParser2 = ItemsIdParser.FromJson(json2); + for (int i2 = 0; i2 < IDParser2.Length; i2++) + { + if (IDParser2[i2].LargePreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath2)) + { + if (currentGUID != "0-0-0-0") + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + } + try + { + if (filesPath2 != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); + } + } + else if (IDParser[iii].LargePreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); + + var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) + { + if (currentGUID != "0-0-0-0") //DYNAMIC PAK + { + await Task.Run(() => + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + }); + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else //NORMAL PAK + { + if (isAllPAKs == false) + { + await Task.Run(() => + { + if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/2dAssets/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); } else { - if (isAllPAKs == false) - { - await Task.Run(() => - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { - try - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - catch (KeyNotFoundException ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); - } - }); - } - filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); } - } - try - { - if (filesPath2 != null) - { - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true); - - itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; - if (!File.Exists(itemIconPath)) - { - await Task.Run(() => - { - jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\""); - }); - itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png"; - } - - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully converted to a PNG image with path ", Color.Black); - AppendText(itemIconPath, Color.SteelBlue, true); - } - } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(textureFile, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); - } + }); } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); } } - catch (Exception ex) + try { - Console.WriteLine(ex.Message); + if (filesPath != null) + { + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + } + + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); } } - } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true); - } - } - else if (IDParser[iii].LargePreviewImage != null) - { - string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.')); - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" detected as a ", Color.Black); - AppendText("Texture2D file", Color.SteelBlue, true); + else if (IDParser[iii].SmallPreviewImage != null) + { + string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.')); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" detected as a ", Color.Black); + AppendText("Texture2D file", Color.SteelBlue, true); - var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath)) - { - if (currentGUID != "0-0-0-0") //DYNAMIC PAK - { - await Task.Run(() => + var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + if (!File.Exists(filesPath)) { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - else //NORMAL PAK - { - if (isAllPAKs == false) - { - await Task.Run(() => + if (currentGUID != "0-0-0-0") { - if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/2dAssets/")) - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - else if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) + await Task.Run(() => { jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - else - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { - try - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - catch (KeyNotFoundException ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); - } - }); - } - filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - } - try - { - if (filesPath != null) - { - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); - - itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; - if (!File.Exists(itemIconPath)) - { - await Task.Run(() => + }); + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } + else { - jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); - }); - itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + if (isAllPAKs == false) + { + await Task.Run(() => + { + if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/2dAssets/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + else + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + }); + } + if (isAllPAKs == true) + { + await Task.Run(() => { + try + { + jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); + } + catch (KeyNotFoundException ex) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Write("[ERROR] "); + Console.ForegroundColor = ConsoleColor.White; + Console.Write(ex.Message); + } + }); + } + filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); + } } - - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully converted to a PNG image with path ", Color.Black); - AppendText(itemIconPath, Color.SteelBlue, true); - } - } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(textureFile, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); - } - } - else if (IDParser[iii].SmallPreviewImage != null) - { - string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.')); - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" detected as a ", Color.Black); - AppendText("Texture2D file", Color.SteelBlue, true); - - var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - if (!File.Exists(filesPath)) - { - if (currentGUID != "0-0-0-0") - { - await Task.Run(() => + try { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - }); - filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - else - { - if (isAllPAKs == false) - { - await Task.Run(() => + if (filesPath != null) { - if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/2dAssets/")) - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - else if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/")) - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - else - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - }); - } - if (isAllPAKs == true) - { - await Task.Run(() => { - try - { - jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\""); - } - catch (KeyNotFoundException ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.Write("[ERROR] "); - Console.ForegroundColor = ConsoleColor.White; - Console.Write(ex.Message); - } - }); - } - filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault(); - } - } - try - { - if (filesPath != null) - { - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully extracted to ", Color.Black); - AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully extracted to ", Color.Black); + AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true); - itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; - if (!File.Exists(itemIconPath)) - { - await Task.Run(() => - { - jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); - }); - itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; - } + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + if (!File.Exists(itemIconPath)) + { + await Task.Run(() => + { + jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\""); + }); + itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png"; + } - AppendText("✔ ", Color.Green); - AppendText(textureFile, Color.DarkRed); - AppendText(" successfully converted to a PNG image with path ", Color.Black); - AppendText(itemIconPath, Color.SteelBlue, true); + AppendText("✔ ", Color.Green); + AppendText(textureFile, Color.DarkRed); + AppendText(" successfully converted to a PNG image with path ", Color.Black); + AppendText(itemIconPath, Color.SteelBlue, true); + } + } + catch (IndexOutOfRangeException) + { + AppendText("[IndexOutOfRangeException] ", Color.Red); + AppendText("Can't extract ", Color.Black); + AppendText(textureFile, Color.SteelBlue); + AppendText(" in ", Color.Black); + AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); + } } } - catch (IndexOutOfRangeException) - { - AppendText("[IndexOutOfRangeException] ", Color.Red); - AppendText("Can't extract ", Color.Black); - AppendText(textureFile, Color.SteelBlue); - AppendText(" in ", Color.Black); - AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true); - } } if (File.Exists(itemIconPath)) { Image ItemIcon = Image.FromFile(itemIconPath); - g.DrawImage(ItemIcon, new Point(5, 5)); + g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5)); } else { @@ -1876,17 +2548,18 @@ namespace FModel if (((ToolStripMenuItem)ExtractAsset.Items[1]).Checked == true) { string nameToSave; - if (Properties.Settings.Default.IconName == null || Properties.Settings.Default.IconName == "Selected Item Name (i.e. CID_001_Athena_Commando_F_Default)") + if (wasFeatured == true) { - nameToSave = currentItem; - } - else if (Properties.Settings.Default.IconName == "displayName (i.e. Recruit)") - { - nameToSave = ItemName; + nameToSave = catalogName.Substring(catalogName.LastIndexOf('.') + 1); } else { - nameToSave = currentItem; + if (Properties.Settings.Default.IconName == null || Properties.Settings.Default.IconName == "Selected Item Name (i.e. CID_001_Athena_Commando_F_Default)") + nameToSave = currentItem; + else if (Properties.Settings.Default.IconName == "displayName (i.e. Recruit)") + nameToSave = ItemName; + else + nameToSave = currentItem; } AppendText("Auto saving icons set to ", Color.Black); diff --git a/FModel/Parser/FeaturedParser.cs b/FModel/Parser/FeaturedParser.cs new file mode 100644 index 00000000..f0e3ea3c --- /dev/null +++ b/FModel/Parser/FeaturedParser.cs @@ -0,0 +1,100 @@ +// +// +// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do: +// +// using FModel.Parser; +// +// var featuredParser = FeaturedParser.FromJson(jsonString); + +namespace FModel.Parser.Featured +{ + using System; + using System.Collections.Generic; + + using System.Globalization; + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + + public partial class FeaturedParser + { + [JsonProperty("export_type")] + public string ExportType { get; set; } + + [JsonProperty("TileImage")] + public ImageLol TileImage { get; set; } + + [JsonProperty("DetailsImage")] + public ImageLol DetailsImage { get; set; } + + [JsonProperty("Gradient")] + public Gradient Gradient { get; set; } + + [JsonProperty("Background")] + public Background Background { get; set; } + } + + public partial class Background + { + [JsonProperty("r")] + public double R { get; set; } + + [JsonProperty("g")] + public double G { get; set; } + + [JsonProperty("b")] + public double B { get; set; } + + [JsonProperty("a")] + public long A { get; set; } + } + + public partial class ImageLol + { + [JsonProperty("ImageSize")] + public ImageSize ImageSize { get; set; } + + [JsonProperty("ResourceObject")] + public string ResourceObject { get; set; } + } + + public partial class ImageSize + { + [JsonProperty("x")] + public long X { get; set; } + + [JsonProperty("y")] + public long Y { get; set; } + } + + public partial class Gradient + { + [JsonProperty("Start")] + public Background Start { get; set; } + + [JsonProperty("Stop")] + public Background Stop { get; set; } + } + + public partial class FeaturedParser + { + public static FeaturedParser[] FromJson(string json) => JsonConvert.DeserializeObject(json, FModel.Parser.Featured.Converter.Settings); + } + + public static class Serialize + { + public static string ToJson(this FeaturedParser[] self) => JsonConvert.SerializeObject(self, FModel.Parser.Featured.Converter.Settings); + } + + internal static class Converter + { + public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings + { + MetadataPropertyHandling = MetadataPropertyHandling.Ignore, + DateParseHandling = DateParseHandling.None, + Converters = + { + new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } + }, + }; + } +} diff --git a/FModel/Parser/ItemsIDParser.cs b/FModel/Parser/ItemsIDParser.cs index b9f73ddc..1f383c02 100644 --- a/FModel/Parser/ItemsIDParser.cs +++ b/FModel/Parser/ItemsIDParser.cs @@ -52,6 +52,9 @@ namespace FModel.Items [JsonProperty("LargePreviewImage")] public PreviewImage LargePreviewImage { get; set; } + + [JsonProperty("DisplayAssetPath")] + public DisplayAssetPath DisplayAssetPath { get; set; } } public partial class GameplayTags @@ -69,6 +72,15 @@ namespace FModel.Items public string SubPathString { get; set; } } + public partial class DisplayAssetPath + { + [JsonProperty("asset_path_name")] + public string AssetPathName { get; set; } + + [JsonProperty("sub_path_string")] + public string SubPathString { get; set; } + } + public partial class ItemsIdParser { public static ItemsIdParser[] FromJson(string json) => JsonConvert.DeserializeObject(json, FModel.Items.Converter.Settings); diff --git a/FModel/Properties/Resources.Designer.cs b/FModel/Properties/Resources.Designer.cs index 23f3d847..68ffce48 100644 --- a/FModel/Properties/Resources.Designer.cs +++ b/FModel/Properties/Resources.Designer.cs @@ -219,5 +219,15 @@ namespace FModel.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Recherche une ressource localisée de type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap wTemplateF { + get { + object obj = ResourceManager.GetObject("wTemplateF", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/FModel/Properties/Resources.resx b/FModel/Properties/Resources.resx index c8c2f391..2af4bcfb 100644 --- a/FModel/Properties/Resources.resx +++ b/FModel/Properties/Resources.resx @@ -127,6 +127,9 @@ ..\Resources\L512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\U512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\R512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -136,9 +139,6 @@ ..\FNTools_Logo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\BurbankBigCondensed-Black.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\Resources\FNTools_Logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -148,22 +148,25 @@ ..\Resources\M512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\unknown512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\BurbankBigCondensed-Bold.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\E512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\T512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\U512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\wTemplate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\BurbankBigCondensed-Black.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\T512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\unknown512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\wTemplateF.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/FModel/Properties/Settings.Designer.cs b/FModel/Properties/Settings.Designer.cs index 2d4a698d..37a258bc 100644 --- a/FModel/Properties/Settings.Designer.cs +++ b/FModel/Properties/Settings.Designer.cs @@ -201,5 +201,17 @@ namespace FModel.Properties { this["isWatermark"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool loadFeaturedImage { + get { + return ((bool)(this["loadFeaturedImage"])); + } + set { + this["loadFeaturedImage"] = value; + } + } } } diff --git a/FModel/Properties/Settings.settings b/FModel/Properties/Settings.settings index abbcabf7..bbe110dd 100644 --- a/FModel/Properties/Settings.settings +++ b/FModel/Properties/Settings.settings @@ -47,5 +47,8 @@ False + + False + \ No newline at end of file diff --git a/FModel/Resources/wTemplateF.png b/FModel/Resources/wTemplateF.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7a35ac6875592fb541bee6d3d540b78d8afb98 GIT binary patch literal 35367 zcmXt9by!pH+ow}Tr=v#+14L?+j2@#)T2dL!C_zEGbEGt5lmZSMsWeJSjYcG-QA9}r zA|d=uLPJGC_(Y@su_X}^ z9}!FoYVoAxC?dIqM;jR|7^i+Ci4(YpUd9gJbJbm9jAXl?#=H5PN%t4yH|*oPZ~AV% zB}z8bphc-OQT@s0^)y`Xaj@)MSO^pFjp~^k8*6HMsgl>Kdhze?`oE{rR6mzoGhvo0 zF*Qv^KGTy`2}s(?oomxB`$aQjTkpVyaIh1?%W%hJOJUSKM_Wxxxi3$kA9qea{BpZ0r?DcEr6hNWb)ze_SS z%i3Vq#!%zY0z9kd(^Rc~SWFp@7);bAp-?t|vK<83_Zjz-qROj|Q`bw<1mO85Gza+; z@ixlq)@r~PCTg}Bos=!uIBm50-L%s*G<>#mUWduE?2#y>+r(x2;b4%Ck)C&Bz~qA* zb^qj8S+l#K63$)7f*KuVx&9#kE&M)-u#}g`)XY5#j_Se~LzeIofoXisy_9JhXk9uG zXLQSUQdwkXI%v&;n``rriS4+kCTxH&T{5>YWm;m;c9bMl^h{B^qPjLgH0GkNOD86) z7`PquvD?_vX>BUSKw_uVH9dv`flZU~P!u(cfS_rM+C2A@M+<~$-O$rpEYS&NJXKUy z8FICQk`Pu?vwutyCm#={8&7hzxIviyJ7X0v4p7?#gG1fuXyDl`eX;~CmT)2J1#>#v zs>4<$vPM5dc2nG1kpRHnPL`e5b3g5%-L}e!)x9oW+GDv;yvs?I)ig%J<3NKszBQYS zZm%@FY}QEJp)hD+maH|4lrBOpn+Wc-W-jw(_fYSkHAP;1^Ve~p(3-$=+&gZ6Kin5##plQSS{xL{+mMIEX6GoCEr}A7ls?2BiKNiJI0;nA+$tV#ASHaa@9m^|JY7m1GdCunHi;e>9dYU}#Tk2!|A z9T=!M+7u;?V{p(r=-ZyTZ9_FW3F)7lj_s6@@C=9)LQ`4)x!cL)-dGRM;lmjLaA)m6 zMBj=e-2wc}oq^yZi$66g{KNw zr(J-#J3`0?1)h(eHEN0@oeX)fGZbQoY0xd}+qjb73;}8ul)}xr8d1_Ao>?!1Zaf8O z1>3-nN@$c}S@&mK49yc;!N3S`HtAQrMAC=8xquf%0MfL3yIB-Rq7=cnx1d+7^>spB zSuKK;gqv8l_ymUT20*hm2T(KJZf(kU0sGvY6;;9*Am! z2cevSnC64d+=-!&OwC-0dRT(lMb7IXVJKFWg zcO#J5)RF;NONld8J5R)9=Jp3r-jgHh`nsdRw6NOSy~hMao8#-Nt@Xw1hu3S*mD5I;cS` zC99avT9@9FpR(xMD@E4dXEVsE@|^?~nS4qGqfZh<{^eh$xXPd)sD`4M`?1?5Wma;` z{D{#?C7jzR9pv0d#!m^s2DNpL7>?_83%1_N#nc`y+Iy+PUT><1$>e5Vq3n~Xv?qgU zmt^wuQ>`r2(Xm=A4La|@Ib`CL4qXOf;kNu#R)E4+p>%Okw1_jJud9$g29m?NB26v zz||=DpcLC>Crk@NV}((C&7;>5vUp|a^ysjFv81hlFk33XwIYky=S#(ozZk+x=vH+N zlgj}djP%Zv&`Kusux=cGCl{K^7GTX)y@?q&1R#}m*U-#`m(3t%`!9UWV!FBf+j@7E zNlOSxv|8@|Ifu>5| zN}eo7g^t~I`6kKAowO4xq~s+)3+MZMz5$BPH!4~X@N38bf+62z|?q>c({bc^o(N-X|K04B;xorP)55WuN3AhStD z$glX5fgZZtSW_ZjH94jP+bUW-F7QTL{&luQ-DjR<5|{@#CCbo`Q+ou;5H3X734^AC zhFloGP=QZO#1To=6NVf}Ep}N!-i7RBYnwKGHWw$K%%KqotWF^%YpYZm(LfcGFo-$C zhTt1@1f)akB=v^&%WJcZxZ{HSOP=0oly}ZD(ABG=WqPZDTtL(xcnZ_rg`8aIH35Yh z+eq!1VbdJWUXT!<7$A!T&*;;qXqXX6=#VZ-=-qlM!xm|2SWd2lNl=1!aV$<1<-+pd5g1hYK~y7^jGrAc z4Wh7jP`?ELDoU3q2DmKsK7Wn^rFDcJule6x9BqzE^#XlAceU~Z8u=`&Y-h>E9L(^9 z2|O)ui%FF!ad-yIe^+Qk;|_T5#Sj~{mKO^M!1l@*CD}gs9h_o<;ycp-fRsXxR^))n zA>N8ler)Xa8mpeO*wO#yR(tm3^jJCc`z-~(HDHrtw~~D)(*4(NvEP!sWIxhjAgP)# zNo6X=0`P&sdwjRRI_&xkbVqtoA!Jarp9pB~a0JXPG*5l5#e~#l31$v~$n3KpWxsNSvNOnRyAGyIPkU0%B5?#r^G*x~$G`O0ZN`X!H8HpFy_j5SjN z7n-*9wW{8zKTIn*^dZSBb|gyOxE&-C?8sF6a&y&7glb`1J(a^C;QH)fGw*>TC(rZW z0l}Z)OUQfBji*w)*5F<9}7=38E|-a%!So;8D3;4JeCQrhmMdVu1_>yN3@#Gshe>t82q zND?FzVOe{Luti&zO7a*J6mTd=eVeF;bFx%fWKx$D%kzc3_t*O$%a6Y7uUoA|gO@MwTR z%zR9=FvkeBMu3gl9I|I|K%YCR3SC)VpJPCuS1Gph_Rc+*rWc(c{6Yk7LX$d&P++-v|^$b~o2=oFulV!zQ zxJ4_Yvtu-QKts`RE*$z+eq5znP_!mUW2*VMGB3l`^^T!YOP0QF&)4X$(n5$5&`1zc zkbmyXR!RC~fvjKupVafK@m;-vqz4Zpg5Uf)`SLzBbxLf<$?#5{R@A+L@*1yFX}wxO zS>2_(0;Z{3+cmSow5zff%6g%y{Op)1LIbHp@+1Pjl;ihdvBC44pLe- zb_yQyTzvnm{O)|gP9W9A-2*BhIuxzRC5kX>5u(yGNVE)!W`_E=L_N>fNaLGq7R-h0 zDx~AOv&nvi9+r9vP{S`UYsAI(Ep@;B5ju{|9?rdMdCBs+`(nj^dxX(yWyOE@PjIxjltU4GZUr#l5M{2h7G;#rIEMpeHJuY@P-O)9$e2Wtpv26iHC@oO}e~aUYiI3_x>vp z)MsgMMBVf^UoU7eNpSWAho^Ach8dQ_OQ=3@_D^K`Z<dh+{vg(1W>n4Z7Bddf7@J|@ovW*o3*fTFZ z3tXUYkZdv-Z8Hqh)$ggltR4wGp&y+yVgs#*Ql}1bzoIvSj)S0Ep}v3dK`0e-r2Sj) zN%KeEAHPqh-uQSh`fJPE3y|-eTzvAQfAHE-sGxX<-(dEc`OS6b1?GgK+;z$(3z+zE zg0eUy7aVp$v=?gl7L0caa@pxT?j*Cax5xqcm*5EtUraUy){?{OO8Goi6jW4d!oV|e zVj;(C-B;|PT|yQgR>(-;RMOi5dAf)Jr-L7wSFYTma-WMvNzNTQx-|HVRTW`<N7=z?W=c7K`UYUvo7u(83X8yiGW`}oSQT9 zqmxC4#$E(^%Ls8>J(l27pP+wLaGNk=obVY))V@YWebV&3!(*o6<}f(kW4VTy$rKw@ zv2siN0T&#_=X_ccgvS-02~lYPkkTXo>lnuKqGqo}$(c`yJ(N2D@-&tA09w40AxFn7 zBm7!S%T=r~qzms>`9U^6&V#_;(yWE53=wO#hz@|x;My9Rs+ExpjFes^RVG@%3dvBs zBCW~q;k-cB=1K_prKgsdA!MmE4QI%G%f$BDF*#rL_PRXzX{}Yo98m8RyjbcCRL|@V zUwjZ%7J8kRP^^0davuGV^?6C98pK~i>h;Oq5zZ@@x!{*LMQ)+UvT>oa)S?N3~UBds?<{>_7c-z?qBB92WXzj6^Xeb`mWFsXD zB((xe8e1!G@K7baG#CdjzB~MF=NuwCw2cizXmPrnh&dF#(-728OJAMYM@4!o>1)Nv z3>fY7<|;fc5~1+qG7QV;whK|k>~4ZY7?vyxMA{SKpjaH|fg zVrNw>9I5nF@@5#bqvjXQhbcS$)b97|y;P*Ll8i4Mwl2_-2mhl-%UHi1gek{AERyyB zQy5h5DC!s}c{24bWvtbTuWt-#R`xN%JqH&Q?(y|Kp{eH*NiK? zYpG)~3^Poee^C^(qr>S^Dib0CHJ~r}HUvy)%b`732&wDNA#Z3Db69%DX8Z{E?F^?J z(Il9+WN{Dn#K8ZhpboqC>s-*#iSaTUJO>Y(zxf=xp1r+DG|4tPT=%wGRl;*yjh4i5 zZ6-|o3N1`@c|+sMwd_6Kj5@|**uwEmEd4=mz}5%!u>#lM^v@Cy0RFGNmU+&JX(DbmO z)DM2tU74Kft8Rse)}O7AMU$qPUlE{VqF?Wy{OaDvefg%}LT7~;I$@;eoZ4mj9CZiv zN4M>oN@ThI2wTZtymepCh)#Gor`2b@E;wMl4kQzpB6y|)?4x(bBjDjf_ zbO!DLAmwZPok0B@6{mCS`4_8k(VA zsTzvvGtL=HovokKVyMefVzRE?Sfa81NcEKkr=w}R&CibL`|Desm}6BeAu+0GvoTs* zu``&jUKBnJqVA*(YXtER9l9P5i;2I=pcQ}pxqhm=Ht2?J^oR&8o&O1yQ=oXmXy(9z z@0$nDKi2+OkIMW-L8@ggBdU-L*slq|YfUTErI$b2$->j{A% z9MW<e(xiGro@_ky%SeGRHOp1~ zEd{VnqE(`5#D{rmW!|2@*Is5TYy6)D#DwT=5w24ZrRpw_lKv$v5N#eKVd5TmbGPw0 zrqwQJ12sqOf3mBnmts%rZFY}t?*&E^{j9u%EV|0CY;sY|d-%z_)**zk^TBWPgSx4@ zYupN@Fj&a%@C}fZ*QeOmF8(dcm1T-pT5neBI0`cPCWV!EI=34Sggt0HW)7be0-3-R(fJrtOb=U@GHt3}OF-zE?vQuPE&FpuDRjH*h z*KGWt(u?Mu0Xt<_MTr0EOtOy11N2tDBByng|K)cF+=Lg=9E&K^VI1|jnH?kvk;r!j+>cDtVh8^wvNLg+xzV`r{YI9+}Y2m!0jK${^# zPybv8Tda8ze+%cBGPk~-CCO8?9tG$J2PWa*zPAT4^B`LAS%J09n4k62j<$g9`obJ? z{AgOMvQ-MO)#>T0v#n!@60^ZdNh!AaUT4IO{8)k^=j<7qUSZ{IvUAe^31FrNKQ-lzTrJqE0i;Pz^i z=r3|pJK}advkF5V(XKjV?(f!My-z&C+`H|$V2ih27u=QWc0aib*K0UNHGX~)EO45j z5esX(u51;*)&6F4mwjB};;Eid)zET1vWr@lnY0pVn zwibu#LAZZ$hp0aL_vaGS-A&4N@B8Psi|>wHdNQ})29~=94Y_q3!8A_9PMT%GS>%^@ z1Fi(j=~c1at9ki{CiUD2Zdw|nB0{x0zvZ~eEkzi}%OjUE1{3N1B8!!SGPXWcBy=(4 zz;*^S@rdQZOFIb#M#sc0SrO4iJvaJq`J9(_g7y3A1ez!@26N6}v!_ zpSl{&@Hibd(H5^$W%!8Fxs#2wm<{ct2h1=m5A_h z-;;q7?2R!B>y5;EC$n0}TXdlPM5 zV?F%niY{>Oo@92LcMi)9K^8|^Dk^>+)oo3)z{$El1i-hc1 zKI*x55QOxB;tmGJpr{Ao7ol_R3z#h0iRA~_Vu){)wTJn>i7Wc}!gQ3=DF{0SyWTBv zBQDO&lc>El%191i-Z@;DuCGr$Y2u=*V}Wg?DQaAq=xQxJ=I~%9OSu>R`{(fJ^^P_JX^$Hx>*gXwbvSrkP_S7dds^wiGFwW`Dk_+0r|ToQ`2dWGyu38a4-sbz3~`@Zk|(r?Hv#|G4t! z?W1)`Vlgz|U5VO;_qx;J3I?_*fAT^7=$!tbm0a1PgZhvULD$jnfWGgEOP}fgS3`E6Qt#)ZNZ^He#q>aAXxA$p4N`buh@+u#XZ2?wxR)c?mCzUFS z+o{T3`qk|MR2<)y-z4T9ul(4~G4}l{>i!Z2^aR}kDvMqCe+r@wGg!Cw;w{5Nv-=MR z#*m-ribVC&8l$TbpIrGr(GVt*M#&^#w%?O6uJCkIsm9@L2mv}$@zKC{3<8?W@D+cK zgo5$tQj^hVqK4F0RwE>ARuO863})`3PECUo&PfRpHPi5=vRA(q!(cn+Vg6+S%NpU+$e102RCByQi0>)K0C3=F&u6d*^Zpc=5;eR?dvkp(nh*!0+F<3Fwf}VbV zmRd0Qu5jo;V$_T)fdbaolOxP8M!@*G4y_DibdOuvo}JC;4wfp1F6|V*4CPwS{!f)? z+~fG}-bUREfk;JWkIEI^aD%k}KMTP1^#kvC;wKw3CC|pm$TG=% zwn-X)?_q*UoH%v=-!nL;XIdmOo8sHC1@}sr7yTX42%U_-xjF2M!u5Z+NPz&^mHDL7 zQ{EaksF_n|N#h)`IUXT1VtsADGg-fFk5a!<%{Quwwvl`H6XJa{>y1&}czfLQ$w0yW zZ3vx1+iLW<#e+L$`V)e=8E8KkTMmy~ewq36hx*JpJDBFI_e&n`_Z2dij!XR1TkYWT z<4u$q4VbDOC56V&Ignzt-T=N1nhJ8#ab^QW-zzdm*C;6CRe3TUs`~NAs7N^(OoJ*@ zOp9A_Jrf;z5Sjw;4EOArQ;S}a47@Zh3|-{FOu7fs@yY$JjFUuzq z^2?M_Q{|gno(9Pz;a|8xtG;e_tPU}$WEht3_DXP4PT6b-h0Dz?)mNnw9yRmGF5578 zQo^GyMi|=Z{Acq96D6JeXhb4V!rI*GrSgUHV+)Xv6GZt^EDH3WjEs@>BFYEFWfjXh zJ>T2!uc@tZ5VXlsGWT7VIuAs35oC>n^7fM8>e_MGh|T;sNO14FJF)os z;lpS0QkqLv;lF?VoLE;_fA(fs?C1I7L)~-pq^N|dy~9n#4xvtqH5M0!SxZ`*J|goT zE&|0BxwIR`+cK9xVzi)Dr`3nB>KrZL?v$)|eim6%?DupKPK&{%#UH;xkm`ppScSf8 zG6Rv2jlSqjLf6WaObP#zEF$0ApFj5M!E0YMlb92XRBo&S%Hf$TsW<5?3T5j+0&nU= z;IQ~Ob)?USeH#+5L+Dd7DSo1r$?{^OFaF5w{?dX<@8Bmp(Iv zZ%}1Oi+UJugMEeyHVZ`~S&40d5K5g;0APqlzAWGe{^#5;imL2JTdKsq2xz0AphQe}{c>iy}|{a*fCuDQ`I zIWBcs(*9MnbM;9mHz=IVHFoGg-@6~ph94k?piRtWiN&k9gZmV1MW}JVargjl%$Qj) zl$3kczAFgvpHBF}w27R-l9Tu!z1G1&ZTX{aRR)S*%E5-!-Gj6p|Fiv>&G`op-E-o^oIEK<1~Mbhs_1^|=Uo9;)@|>p%7a5UvQY(R z5tVzkS`Oo{^(dN9L3kyh8RM{aNHQN|JX5?V7}x-;HS@|a(?qhx3FNbVI&fC9ec6aQ zmO5x?E&1R&^5^FA`{&zhVSA;R9!Da^r~=1ugktFT)qH~M?(}nuU@Iw>+{SiZ=g1#li%pK@c5$$O%ob}6b5js*^ ziw7$yC$ePM*6STd2hf+-FHDcl;%6Cc%#2g>$^j4jzF;e)l! zhU>3djo2`l7`wkKAx=9W8LMrIkpaMA3M`#ut7hw2hdr+~{J9iCp8zyd?NmeY(o;*(?OP@SMD(ptEpZY*miKt3Y_w8eVx=@8 zD>O>N)_6X}r1uQNY7;JduD*OZK1x*#FemCPboj1cH=!jKW*$j9TKf&9`1GS+{X6L? zGlXVK{X4Vk4M)<^XweKsCvl+$2fh9xY5&6$)Gd+M1mx#c@IGp|rMzkM(y3zS4Phu# zmCDw*121>rqX_lEkRu)I6oP^^A;eZP$&r(<$sij9eWa8NNE836+4r;I)r=Wo|yGTX>) z#GQU1x`*CwqvWH(`rw@@tzQ$l@dve&wK~o*IZUIbwApYsa%mB^rsSSI_MN~;)?!`% zMa}VAXjQGpI#LuTxnxY!{0GO z<;m`g$MSZfawA`|_HkYaaqBCy2z>w~{jURQ>n|gN@EHgCl3Sffu3G@X+6g2?-hanM z>8?Q+h=7+|)LDzf8dCjyXGDf+4s}UO@4JA z!#Y}ZCdX$#-%p$`1zKydOP?nR+&9iCme4zy#v2<-%{Ll)iiTK^eB@WttxWKUk)5*O z0x#H@ZxK8`Y>0_>$=^vK?%dmb2E5vle^*fw zPVV|wxfVsMf0TtId`!vbkFr@jn$5jxQ=0FwZw-wgmWx}+y^IaocSllhxLc`7$O($Y z$x#-otNj}y48M+yYsCWlovXTN36r&|1U1teWf#KP#JI(!ZeNTn-2*3Twni8A#FehF zCXH`*9$TYHQ&jiz>Dpt5_w`ia2WPF+=dL|{*_w)AL2?TMY2RMzJ9?8}WKiz~Qvpzyi|Z zX=k`OqQ3Ms;c_UccGsdB?$V4ZI->g9#{OyZjJ`KBNfsV+$JKj9;ejKq_&wK?X`lfz zm|jSLrdx|ywu%g&ttM=o{$ViP#KgU`H?u4MBwvS7k<8f$P}8^OxL-%SuNX{9B;KQctqNIa#lAWGp!YE&L5s4ysfV}!ED|vhrSOX*lsp(u1<2O^#DOp zNetYZ^r_(i9uXV)Kf73dY*$#abs5y91#qI@k@%PZD-2 z+j}(9P0%vD?>s~-doslh^EAPul*u=IiFMyb9aDw|I`#DGJdBx{zhg7aW8is<Wa@+Dw3t2XLAGuhMNJ{7zJn51gxG<3c+J#?N%g(QlUZjP8on7&4D#gsL@W#r=vd-)+||8fc2W73&ma^MJvZ>lKX){~)3; zzs1^4C>)CrTL)+|=nzKxnz7TjTX1s*L5z_jJTqP*l%Yl}c0$wTl@3>$vx3upFpNF8;3F2xAm zIBQ=03wI&ay_*8Bz-0S?P{U+|Mo3U`R+zW&cBS z5E-yNl0EV8mRuHjLj;$PLsf)6ENYj?xQL?aRgeXLKE;RztFB@@gW-c8l|NfYLS5v#n}c%IuLrv7yqjW zF|iLd2>tG%ad6pZWosnc?*h`ud-EMseIR{-Ig29w`4+f9te6H<;@JEv$z5UM4k5kg z`&_s=I+pDjsil-vsDaKokled#m3+cIo~2vJx=IcqtIO zOi&rkyycNtW`5xJ{hb_F91dlhDd5r~mmOEVE_x6RR5|^4FVb-!C4hiKb=za|1!$Mv z$>Ia91I3vtl2;<)zlnY}Gwt^WhP!f{`>#qo=T3)@odTiEOYzR@P@907C9L zcOE1Db_$SLciMxXv3%;=P6VTTuu?No{$H@7j{0XJ{FAGb9dNL)Jf9tky1IWKjmbPH zR?8WyK6&56zG#$@ZadZbZA-nXq;supj*r}v)$pZ^H&htwUw!jh z)8FYQfkOC!Ai)H;%IRcu{;~gcd&wU^zzbAlPR{*9AbB$MbiIMLZrFo_0=SUr^TRr# zGDrwUqHrx;pzOa9_3-;PpL4jY2co5dk#*y2tMle951NJpvt~Z~oL*?slq#B_qv;Ui zDmV=*#!UDE&Z-FkiwV(td9i?hX9u&RK>*!`rg?of>ay|gz|eI2{1Wr zhFsBPbTi9|pvfY-=Yi*5I$}Z*I)tB1X#{eDZ@|$4G%Nh|s~+H$3T+o`c<1p{y1={v zlTP2vM?fOk7A`M1VsFlm2C2(y`!&<((LoKE0!wVK3r~BpX`;_lb-PLvPEo9z@f+vtOkZPAxAQ38 zO{?+(L7B=JR__t>$i_>D8Mp0n4bO_Zn?fWaIbcI=!~`sgs+)Ufgjn$MeeNt)%V}Am zb2m_j)#U&(6&Pz9I%H0t&nuOeX;IUbnHX(JXvky4;^rwJb&<%wzppk4Hp0vqfRd5` zW>*Yc`_VeDt|xq+mWU+*{}@ixEkCv~zHbq+YM+7avUok8_$EVmy9AkKa350^2qUro zPFC9C7ae3R5adzt=*F+J+uUbFPI{-p>Uni^%~W+YTLatEH&NtohR_xxW_QMqEGElT zl?lX+?2VBOW)UNAz|T9&YM3KAA=l4-h`m8*eSf_+OYzCk+wKFMu^2Bw zh}EW?Z&glDfm_h~(NGYzzXNX2l*Av@fs-^}VR@i~YC8XG%4O;c@nq0^qgA=fkWaP{ zf~=9!&jBDFQ}>ptgyCT^RiaJ-f^(Yb`y3RjAznLLU~efpFq64*j8zvfSqIb zF46}bS1@lIRAP2<4jCcb)&*&LfK3?+z&8rLtcbRa$YNznj(HSMT{(x-6nm>*)#edn zRTq44^~-Mwwd+4ewG?)*Y_s2o)+_0bb(Fq~;>g`U7366~R$5Tk$U5O|Z0bFQIa^t% zmnNqM2MVn-MeFE%F^UO8)m*?8jw1k@BAi=> zOj14dh^Y$clT7;g>xY>+gQ^ZIlFoKf_KykJbVTmRL=%LW_aKo^f1j(_@UepQg7DAe z2GlhT$$08&&|zgCYxji$BR28%k2`$>BVBqOa9*WjXM)8;s*1}8`jJ` zQuOKA-grd45aB2JZ~9JjJxX-@P9Koh@bC%PMuRi_idb<5vVY~qK(WYJYXxde_|7BHiEdh#dU|kb=K4xWLEsfeIiK-} zLQA#QgYjr?dLEU!F+L;yU47>9_L^YU>MH6=+1$r>x%oqG(QV;tR zLZ7MNfc=WtrF33Ye=fbZ-A8Mb#GG}Z&@NtILmZj=>fY_yDP3oP?kh$A4WhTD9@?y) z-!p9|6Jxl%xvruPni8#+tMX6r_yTQ{51M-GUhk*=8Cs`n=XWtmaa?E`F;3rd zsaE*gf4i7hVq+5IS@GKF3QK;RY517BW};5~Modm9EurRPzY`vusx#ucvaK%0z1-r4 zsAY~NL6+CItS(8T@l<>vq!IE>8#?MSurUkB01#j1c|gWn&!k%SW?Oh0cl)XxcZWPn zL-dxb<&0m5A4>oEZ0s6zmQekfKK3pIyRWby|ED6|_S*=4FuzU$GVo|+#L@_;=QEpI zJdW$I8{X7&Mwo5^i{jq0c((ZfQXY!k)x*Vbn%23iLiNfM0O{w{LR_(yWh0Wry zuKw$Iu5Y3`EVlOL*n9-#SE{HQ$zMkVyT*KcaI=njDRmOrzAR^af3Cx*pKDjE|Ijse zq2M;8mRouXvV&-q-y~4Jo{E_nAtznqWcj+E?}pAaedoT^HW2hAQQY@!IW8yKQ+L~u z8R}mvWW!ugh+aeRWAB;Ao+vSK+=kSsR^?)Rnvl3|)4RLrBV&>WTogyL0A1Rs`b6tL zZJt#eE{^DR&(Fzr2bf)WE5AMq@|{VlpdaCJt%Pg?1H9zzzd!S+HyYm*C7uY$uX-q2 z`nu+s?@dFH-ic^S;mk>OpoH7UXe%r6#J=W-CuKc4{WF42scwff=W-XUY++tC;s;w2 zSw|NmzysNDb?y-{@^yljwrE(P$3Xjfr1EO-^M~{DiB)WAAjQz)?Y1fWNVkzQ9WB>< zvPLQ`r(GJGUM+XS$&SX$uY?S~XPY8Wjz4%umTlz^;36#J?<5oWn$IV~8$CU%p)>w_ zQ86?FF}LEy{C%}^5IeV7$2(g}UwDDLP#e~8yxn*;#hu&v*-G;eynR>ufSVBbcPW7Tu?xqLKNN(6NJ*NA$RL;{U z^<(F!Xr&|RFRxzrn7tV%luY5*nr5uWap(0N!@1SVK*C!nO!Q0g=Y0IM3-LBzT+i9e zTIT#(6Npob75uKxVyoaE+x7C-{!H6FT(9!W-Y>tbYLKI8or;FL+ciH1o8Mk~Z|?v3 ztkJGr#%9NVn^eNXyWYp{+|cXzR4%I3RiAB|fTdVVyprV4@@qpLlOXtCZup;3D1P9S zOlpa`bUoUBVYjZw#+IxhRfR`+8y}JdMvyjkj^Jkjf<0Hex632_gQzDCC>vYhD_IxW zLfnC`Y3D2NPjsouT=vYilHP84%{dnu^_jk>Ze~U>gIn2Z-tK(5cP_2yw|n*{!MoO5 zzwt#}MelKgNw*bz^$Y?PUy^xetAwBJd#YvJM1?zPuq-GBXWx$0(d6*g7nJZ0QVbvb zxiwt8_Hxm-d__QFO*38etV0eJ1N=CL{A=jdGmDHMv7#Kg5;D!;Ar_G}s^vqreX?cS zJ;(W0u=d&<&BY2!s8LwfW?pP%rK#m_{}))Zi{;MHh&o7IW!Iih;kw?GJ3E?KXk!vb z2KKw0Ihb?qVBZVUWH=Ioh->&fqqOhO20mXqe4CxDAti!TJCNV zG>z5X9bCp5VOxImi=sC&rg$1Bt6`Il6`0NaALd-#s#`$e->1#JB_aYvA*(Xyed%4#c<63G+(prYq&JsOY<@rqhU^a zsj@(q8Q4v_(r0e0x)WhA=+XZ;+;}X?{k?ZRei3*7Nzr}#(YJoUiE+RUD>{)!`x~XV2eh>s> zS@>)Elw?m@^y^ICpy}<4Z_8Wj7^buR=T^L?9>iV(YFx)%3*9>z=ja`!W74=0|!vJ_zl7>{Ext9{G8S_WzB%v{z(CWQN8Maa8zFvnSPa)me z=s`gm&Y3Y*40y2D&DY`ovjDId*K{J3iTUTto+c?pQ-79NZOu^hhPC*!>;B5<>Z2VP zdZS^YInH*f<;VPbMymi0+%Zg=2ka_bOoiC|NE#sdEkDv**?M_8m=E-dcT11CbX8d{ zyL$vL6;*8Ed$4swh%6-BTpr)(1~&jABa<|53)=XjHy6T}}h-6HtDuY1%tk)oj|0H3~%@#L5)TmK9{3ZPQZ z$RHNL`t0VYeUR{4%siRtkHHT>E5h~n0fgVY%sez9HgF~8(+ED@op?#hN+p{`o~U`- z@fFZvlMohI{S5({J-gZ|uw(l`kR}?hWmNq))XA+B!(*Arbss1``-OdOlF0ENATod$ z{2x_s85ULhMt#o^5<`P@=gP`U3#VE(^e;&!Uw0PaG32o&y!_1h1YYpP2_M<%c>%Kf)7# zzB?vy^)Bah1^hL%d|%7~{Fmy-O>d|at|c)@|7MtFdUEK2ojdqv;`tgLASG6JCMN-B zO4!rHyoLd-CeL#a<;%WH7;poq@45GH2OcB+fdrc8ReUz~fGXrE+T8FSDr)SmK4Tpu z`u3*+@KH^kC=fGdC8He%SKOUzEisQr-JlQACY8~D_7LT$b_IW&(lq`P1?;167kD5fmQ zT>!>?kq}@4*CrJ6jWFvD?AZ5!4|a9;E*640aH&!vCh8r&oSe^U{bw0f>%LiWgw9NTIAC`)gqC~kUdd0aj%b*LU?M_a-|Fo<+D08yM< zQwQIlII`m( zcj#i#a8Ad%=ZVZ0st2~w72kfk+ZSKTXNKAi{8S`Ry%gxW_``O`M)6&V%;Xj-%=q8n z*ZpYC$#Pm+^65@|k|NxeH6A};tatgu=>H;lkbQ-|pDh23pB#ms{XP?FcuF!HK2V4+ zDi2;Dw?8U|J5_DezwV_YlB~UW`(Rl=8?Z(&GaEz)LpxQ=r!{Q%+)3=*UQY6%r*{=t z5RVx-#@c5vAc@M;aywU480d?@lFV9%4WM={mK8V5qL;OtBSpM{lMI(D*i>eZ|R-ycfrAzqQ&UypJ1rf6tzhMFwf4S+xJeprYCZwEyv;RYc_=HRH?wPE@#xh!+eyxjn*BvI6r&6 zf~wI+N~$`jwtxK-qy9yUN0*3!(no;&q$d&VFJhk4SA;$}fKbwt)<<)Jv#Uueo#8K zP6JffBugaIrFOGWv`~8N#JhN=APJcLl1@n#fyWwScJk4zZ{ZVLw9aNGkT-C}tT+#`AJEZF_0s9Zu8-IdgUgM)x`-mLCb z=S6vLI=hK@7zKK{_`3;@%zejFmR$M*QZ7i(cojZ~a~@Qt(cIkYO+8b5$z(RS+H<)( z1?{X_q5p;=?;!KwY2CwVu^5whVJ0CUE%RnC8Z!>?+=*Qr?JVy|*yqK&W0#Bq?T!YPnoXAX!Y~G%%_qq7=KMc45 zFPIf|jpj`HWp_8m6FC`wuKOA^hg}uvSCN)9rz3}16s|0--X7m+)!mx>%{|OA-5*q=5EXt9 zu2aeEeipBKdA!!cnlHDegPRqnskg#nrHb3CEPg&?(zBZNpl?x}93Wnp{-Ufm z@}yL}rpyZ3iZ1qUBZ@*KS0H|M-QGs@l2Uy9ZBpwofqUAQb4#W%`~DO6Mpte)Us$c0 z6PKu6QI}L73&GXJhf5UoB(#l=8bWPqRGy5O@rS2i%Pc)zVCh{uXv=($a(E#cMV=(w=81djhr(z9X7IVe1rQk+7p>5G^8w!#gpTs89E{JgwL$K z!T9!h5JhGWyk}Xf*5#qsbJ6KY(zN_|c$Y$(A`Gf-CAI}CN`FOo zW}iRr3OB#mTD`6rYc$ewG43^lXs{O2B$Bp)*tNzu;hc`$OeD(j`E^VDj3z>_=JTCK z3)7)bU&HlX?avFTXDP`ZP-CHOv3U*ThMX<(K*Yw^2?ruQu^!P89o%1H^ysNCJd1D! z29kpz#k;F|gyeS?Bll*c!b>TvxTS_oWz+pd#b(YZ>ucFFnl^It$P;(Sb7S#;q4GTd zCKtKqcBZUY+iO;u7_?&+Q9!;BHQ$*mV3%R6AbV3huZy!FcxPEjv1z$n_|?T)hD7S_ zT(9S@(KCK>*)dBH*^Nm;o$X_K)*SJ_mCSohWF?#=9@UB7ATu#bsJpW5AxzJRIr*zN zNoqOg&pLNFs_f*3zO|^-VUc=~V-s5LXy|m&sad$NhZUc@Ot(k&$@jR< zv60d12Sdp1pY5KZB!>E4W;h#6!N7CW>e^Io)&vz?Jl7miuQiQXRbJa{lO#QdNmZz@4|7<(f395_PFQKpIpx`KlxrS;` zt8AhOgM`m`F%EYhsu>;5YPo_!9XH%vrfNw!l=bqG3$&8iAvf#O-CWgOexROx#npEz z8Ii>)uW|TjC)H6vWl*v4&NkB{wAxGQaHXxjLNd`~nh{681B>uD%ihY$W@31LYC+Sy z{i@{p5uwnYIXaZXx5~h(d73) z&1t2E1pyEZGl)jcr#cRv7r&d9(`RD;&v6+{`z3Ic>71Yi9zhq#^9tJ_9B@AGp-Nvb z3T*9v1U8|`yA9_Fz)nfeHVJB!@?JNgMnO~qg4Br;E9+EsNr>dcI&2lSSY6`ZRtS?P z5rXB1gPOES9TV9twdL2Gfv~q8t#m!Y+DVJj)86e_8~s8d*R}30oMUU6JklsB@S30h zGiU~@y}H;qfDVt0xidTUJ+{Ye{ z8i~vmfuVmAtMoV_iT5zc^hN+tMDvmD75{*$;LVyIYnHDj-euKkFe=wp6MYHE@|5jx zDc&#G9~EAt9H6iWY;+lAGQ`?|L3=2xw0fJ-706UmBFSXvTlZT-bv3odIOYk)u<_?P z3}|%L1I-+=bTPgn0^go4^4;t`qpUn$Zi%bOhq&Vvo)OE5WW>A^Jq39Veq>YWZ6>Yw z$hOFBPvFdxlOEM@$lIol8fWNMupJ?rp znQ@WC=sX|j>3?9pJy_sv{=I77)iZmEDXAraXI4}ofL4bicKEXf)1Ij+bRr}W>De5- zHJZ+w2-b@xIy$+)xwH0n{!5$1Dl5pvV7GBnj|zJ2G80KM+g^Lc8;3o?tTX&az!CTF zW<#}5O%W~`)w?H<7LT03b}#j_(0|>+tB!jO=okKbw5&|$w9dJF{k51*yO7#jWrt7g z;@Q$48q1QC(&#+BtnFaaF78E4c6Z$em9Vt3w4UECIx^wCOA6$3zKnbWNEY7qRmd|>wIfTP+GxGUnQ9V zDW*f8Nf0H(M=7YzA^*#h$(sQaP+TRJ(TQ+R5TWU%QWCvE+mH@LnVv2uiFOt%k0ksR z&1^QmS}&Jvl7OcubOvpN?8~|Dl5v6G#Cf0u>%~gA zv|5WBPjU3_L&2q~g_&bfRbz zjBUO&xUEUGCbGqU;t)+|K=of^C_QAlCVWvBo>L}?h7)7P-RQ^-3t;bwWre29G_8?1 z7ct_zG%fI57)t+ez$J+Z-g#_TI5@=_4wGi0BTP*yPb zWXD0z>OXu_`5xINuVA@6jD~|S8%R!nd&onuumtUqoM#m{Rg*es-dUQ-@&>zBN~Nk= z(f(z*2OfzYqlRROl=Bfor;kt7Mu{+W`&VVgXuWdH##v3U(sJQImNF?1tt86} zM=e=xnty<&MB85=v=*6pES3?LOW+<+Y9mQGa3R3VSb5f=+)pG%+E1Mm{K7Y+d>(7( zgoR`?MpH{R5t^3g+7QE)7O!cq_*7M0wgjaS5}_RadiVkGq|oH19b?5Y2#>@T}1&w)??_c3jIgv1WFZo(fb5|X&H~>8uswqIjQDu600U&(W3o4pn4_}p|fX1 zuTxY&)jd2>P~o?e$hAp8=P;r&96o3;DMK=uFU>$FV6w7qPq+l_FHk3GM$N(Q3Yg$C zZo(w>lFRX7rN^1~*}^&y+-Cbj0-~Rk^acwZ&%)_?UrC4$->Xe0E*f6x0j6C7I;<@_)kr=<&u<=0Y4BQ&m zU4R<4-ip^YY*OALm6dSSE}p0f$~g$^!5r5A(w4tR!}*{!kEP^*ws7|u z0Me6&!!Od%pZw+?Rs2tT2Wk|(%DS7v=IAY|PsLXm(XG*!Xh@Ks*O1nwWdw%vT}ced)s@qM_b3HIN!d6wO!4yLPD?{#OxuiQAa^b*!+brc;|JjNu*pc ziFSc3dGFhu!=-3AoHI(UxA0dU-JOjCt~yI>?}xGib)E5$9=|j8Q4#zXj67djY1KQE z8ZKHWA91lka)E2p*KtT<+9P|gq2Z0H174Yu!jwz6DL4PC&gOS1X~k~p<@DAVOul4H zNY}l;b7ZmXmXNY-=qu02xR*&Y7#jJp8XQteVWw0tBT}0$n@Lw1**w}VIYo0HFlR9> zJZXA>+w?}R?~f55gZg6nFEOFbKXw>#LIGK*$azl2`IFFmuxki;e^$`{VNGAd%ifYT z_fl8-v$2A*%?|>sM$k%E%N__N@I3fzbI=m)^YU+CE%@ZZ-G6@s3~=NJBD^EFD+uSH z{kmA=blN&M;D24`lex5aTB?ev>Ls=&2_jB5N?e{}$)X1Txo!`uq!xRWdpRX#iSAA2 zh(%}?;~U9z2ptK8Bt421KthKP^5%}tJ4}w~$>59|*Q=T%#~+`oz$!va>2(XT|0T>s z(r$I3bH_|1XV*nlps~>{D%NSxHZdMS<)?a8cJNa8z~b|4<8&B@k)f5?qVs=%mC#EU zpQQ-Elc9sbi-0NYd-1tn8@WC_4QKz5yga8WBpb2nY+P))MaH?O+v%9VWn@4Ap{l7} z)%*>3t~8h366WMauReivPF@k;$we^Y$?dQ*;S4w*X}H?seG#&2@UvI=kIezrsj5T@ zTWZam@zU({f*y8Dy_jqm;9Pf?pBwv!k1Z%SXW5z(~vCS}pGuK#|RP}veWFRoZlPQJoD8A+g@g~y4yC- z0*pAF#`-^tn%_mflFBG#43|A3IS0=;ON5n1%{1Z{9Ysi~_${F7*fx*qps5Y{IuS>f z`p7bU&s^KE9a(M5?;oi;d2YKK;GtkC(CMGV?k+1H^U$}cJcSkZOLC_NzA4(tdz7{< zKaua0)Ji*V9&e6)lVSEwxWy)xZN=)x;v)Mw;lHoNvk~4xzyADe2z~1FsW*-4R>!B? zJqLGiBe5qe_fb2#bQ98CQyF7z%X!U8Rb8BJkG41&`213x@hvJVlG%>*@_FL#rDIO9 zy4uFuc3UeIpFQ#+5+jpa;iEt>;OrRof16&6$LQEhCYGhxUEmt37s=9nyxQ?m%mV$M z;a;N4FYQ-M#Z=kFxsvp?PUFCswNpa79zhO~pSq^gb#F0_70+d|F1$a1%hIKwjNhu< zhZVC}OO+gYHF#LZ1T4coW7})uDfS-2tkH_r-Q&G6e0uOcK7;fc_uHvw@LSM7hCtTV zwChApf82AMlKg8nb4JQY^3jWtDuY$qwx*1>p@F`%&GyZQI}y1{~p~GafjF*6b=;|}1&h)`ixy3;Ad-L2iRXY)G zqG*r*#eVA>62PsLKm12h7p-XPqpAXFG^I|mxFvoE^%B+AbKU@thBw?zpu*L+eCKf<#M9>_yP5%-Wjj*_Nhy@)Zu zK*{K9q7B=0R^UaH(&10zAb-cuxuBO}ZkvYc>0qeepd+-c;RCb{?>xF&9SDBAb(GOI zAEq<@or_GT4M>m!95FRHUj)j6$F4To?bJBkCZWBK8&7#E{Ldzy!=L|n7vaS*aJ16a zcK2lC*W8~;0wvsr*H-aHZR%P`M|E8Hu=n*XMIRSR1hNWsx`E{fq$(^Uzfp&UY zl;iU{Gh1+fdX@s%&>WpJGyg4N!0KASvE*D3$?QR0pKB7ks1SJb-AJF_GIMeyp!v3R z3O^&-0Fs54Q}oAnVGG^nML3n`RRcY`I+z+_aicDF2dIw-Td=qWZ?6eP3^R|*6xyQ^ z-8&zn<^$#XFn|mo4{gEyMUbUUW`*5MC3;w`h=B1lzu`s{eCMz}OBit=xODX6z|mGH zL<0VfIJMK6W`k@yJultaGFxHa7q?sdA>W)QV!xro*GoXGU>{M?dQBkkIe9>FH1ZeH ziu9Jb^0lAbESXN;IXcuyvB7f`AL_z@mHT$U`zf8?GAEakye3&E+;D^&LBHa}n`^gG z<^f8}POHukiMbi;Tq*VUp*4U~)qs&xB&t-w+eaM=h-MwTm2sTCVRk^uqRB~k8!bU> z(MKdFe3_YnED}{|_N;cW*O9t%(P$6agy6)k)0nG`Q)~Cw8r{~?ZS@2)W>T{A`*#~K zWaLSX|8Eu`a-XRQ##)385^Wyw;BF+hl>Idoa)0K+q2L(3&Dm6o|C`lA?3U{?$Y4@u z{k6HHCi{Q(?-3c~#N5D~jlQaL%^O|4qLF-b!`L{I?SXX+dHJvR0 z&n)P7sJFSOs>t!sZBZG*MI8T_F3d#k^{B*A@fP9cWGq_d)50AmbX$yt+1y6mnEcvd zSRYB5A^{jH+jg=26$${1W^+Y6d&Q$azL^sF+r`)f3Zb48Hmxb=#jzmuv#dZnWCU^&}u!CiwBOGwJ zE1(3b@^6$0oZ!)2!rd9j8WH1lP!Umn&?QxzLchpJ*6$4WbHa*hmdae8hK2wuhulf1 zCjd7Leo`{&({0w4BWY%-AlD?}E~oQeUs6(0n(shQ9nQiu87(=Ty>>_Wq6mg`Y+K5h zdc!=i(M4}`p105z&R*_eDQWgnM_@q?-fXj4aiM>rVSF_f`iki6Z`_@!ydk%jrbf97 zmSJ71eSZv{k=2phuQKkz{u+5RBZ&%ePXy*JR7`?ldxy!A26Ed6-8tPF+k8Psz-QTp z#(pY{dFWwJH~TV6Oc|{-(CLFm#rLF%e5(t$4_-x-Y{Ck0Vq4Z_Mq(4A->8j22$-}h z6?%KS!-%4@pM;M4CWgAemr3%>MN>v{N%f?JV{KDuJK~MOQHSfIRjCxTmRE$-dnW(Z za{}4KTckSEcr59zUcC5#Hh$6X`rhaVC0$xv5iJ4d*IB9Z3nBdwQ&D~}`qJz1gyb?? zUgmnUZzfoox)Q8=t;Cqsgh}a@l3uA16CORXT)9Gr(SD0dKyKk+I#*SX+I5mH#}Z$Aj9!JUP=^ezhbwzK&Th+m ztOo~yWIx2$iz<-HXfG85WJWaJ94(4kzIygbPrq<5$*Ir1vWeUlybaqRgd_)TrT;g~ zJ!~_B3D7g*a*G?&AoY)ZPzgf@&Z9z1kWP&3$0Xd5tzmh2>95aQh%_jhU6aPQ3Y=`> zNswdSbGi$)R_M=r*klv{>C9YtG^z-4wzjTK182bsU8k1{6wR6qoUu6ok$sPk{5zgT>q1 zZ+GdJA($BPHn*P)8KjS^i_rGeH=$N3Um^)8GmI0CuXVv?ejYIAXl7{3bneVbe1i3f zQZ%#z&8upu$*k#Wu2Qe&Gw?lRWG0u;18dS9;h$lSvE4M9>AZHyHR(>Qj)(=8x7WKy z&AMVR56RT1KfZvqyKz*%7iyO?wUzeFSynA7jE(>@p7c78Z;iV)(t*)APPzUM`qP7klMHd4*ka zaZ2kTCl?}Z0oqhK7t3AzDt8xtEV}y+7 zf1}Oa=o``4@(wbQ?$^O*msE0Ntl(7smxPOO-jVH-DZK)UXWJs`BwUrXsAg62k{L`! zh*59M7O-|0mPwoJfRAo?nfE8z~^e9DaTs9#yr!H3ay3=JVb z>XL3ljJWpcTtha?r*j&IfD(h!JBaio*-UZ*{TOXqG8G)=25-f(+cVQpoyK5 zzUKx*pc})Bg~~p;LRY+)PA?zl{~Pq*uFSl>*M-z7XqbkP;Z72Z`J2$cSI_1(y2&T0 zSjO;gBJ;MG#Ylp3K7W04h8y;t&)qq!1viJgpis|$uQa3RDxv2Jtd?j3(uw?o1|4Po zGB<}d=WV2H)S<(WwV6GK4$ zAF4=wF<*WeN?(7{E#2UTqSZxqQOExFiWHKq@CzI!^@G5Xs05i%OA7dWLHKnxYyGN} zIzo$pA$r8(ZV3h{i}d5fFOscP*Ccnp1gZSHI}YhFu6WsDOagKuM|vgt0i04+$<#)} zlf&+?VKh6Z6VzUU+84?qTmfAx{K;IN$DBLF=jLng_@lx#-Xca4<9I$YorYL0`!Q=N zL!1@QbOw%kT3awSngaQH1G!OKD5h6?A&dLQUxzP!8x`P&0IaeJsDc%J5OxcPy^@+~ zj3;>61{*cgGH7p9MZwKYck8espFUVJ(R9GH6O(PjFhmbA#=p!_%QMkD!QyVS`m_iH zcZV&D`yDLQZrmLASOh-NBh49Tp(SwYCBRnwPD?1Ls<8vEGwaYjycs00h`Y8 z0Xhw;rltgl?6f4^74vkB_q{0qGeU9A*P)=odjoz>q6A!D*V+qC-RU zQWF*0aOG6exA~HnW71B7K*{Cb$p9h4yqhXbD2*YnQW8^dVxk}G6oOTItET_N$XIjj zKRKjcG_a4h6r8%!@kos_JEp$Q&0>JRw?=8t4(4g)_mT68{u=~bCBS{=MJtuwae1h+ z0`NltmtQaSBM4xbYW|_LDEe+I+-ou7ixH%?{O+xga}xqcX{2786zn7l_z!qrm|z`V zhJB)`z_3!Nbm?nI_K1I76UJJC`WoEEjAN8b`@QkaCQD9-qV~D2m&&&}p&*S>_8MDfOmz)h{%iu=K-DoC>_ft%{}y2d1^}-i$#R zm6RbK1i+y)oq3M(EUH9NbIhvvL$)d;JWrxl?W?0}(mreViuW5^f5v3l7d{`L@>cG_ zY8fah`=v;+?&hCRKQM!9S$zzcDLyHaKrcctL=S;|6MuCvC4F8RwVWC&Q&h`ME*lRC zW);iuRX>?nb<*p-cqb;v+$1DbOPw#B!))bXg_(}`CxG~wl7kc1n*~6$PLmzB8nM&D zi?t~j)%X9Ayn@PlLH$1-`ezQr8l9_?S4^hw-*zPC%L`h26gIz^%u(6*5_KH(BIZNJ z3@zgw$_$I$ft*OUIh1v;@l+XFpCBx^{?*C=8JCxY6=5daF6!ncg&iWAc09!pcV=1z zGTKDLx4_%ar^K}~cN4JOwOqJ`+^q0IsMOB2e%p**QJ!87>qdQttT?6fq{Z^}t^wge z`EwiYb9k8|alBtj74fZ>nHGmh$gLBVstKd6*~Wqmt$~!u%2%95SIEM-xdH6Gq4MFk zwCsy@K#n7O0_%6^^9&%8tsWT7URnBIeZvNP>R@={(dvgcv&$&Ha!w#@sO#TTwT4L@ z_w9`T%&Xse{CIyBB)2CTxv@EtS|Q~0WSlNT{9!E&i^nl195C+p5)_!t654z(YTh$c z37>Oyl;&%RW0_)lF2Ml1oP-BMB-OUU8pDcdoP3qx=aNEOY(C}Av@!pw*q|ae8yw(p zEFM5V5Cte7*kh({6#B*wJ}8kO-)=St@EL|dcP`)gU2euk)OXR ze{LP_4}B3PAmU#hJe65n_yXnwz^Tmxf(5^xAV3rldUK<{NQkyY!Ec#nt_A*cWs-(HPH_`9oPivuQREAcVC95x$1aqU z&}-)(vBiG)9z{t_8J+1OE^@A zKqmJJc%SAw&(6szgJQI|>wyQE7azlOh6rMg7jTyJTO zfv`d@_UG5n*iK=05h)vwL3q;lf0Di>J$T>Zs~wP)VYkHP?7Rn6MqYnq!!i0cefC3H zPD4uY-1N}*G)!$SJ|nNTmSj$myrLL12Gk(c0_3fHsVNO3R{@w2kI2|Ptq)k?QcOL0 z|8kiT7pzAv29j{FOn|fz_Wi%{xxlx1y_Z{F(l+dj=RYs7xWd|xHo8ajTmiiqB*7~6 zaC=tuH;txzMb8o=OpC}VcP+@b-TQ#N^1Ch;2SUj3G)+o#-$HJx_U<(gq56;A7&*=% zE=*qqmn%&+YD2CB%$04TgwjOEBal+?@efHa&XSlfw}b@t9-D*B_&hDCz?HyzY<>Me>)Bhoi}EGw_8hRvVjs z=G+zt5DA~>o}p>d;khPa67J17t!lI3s^mXiM_Hn^K*nQ=`p zKb^0Rgufan6#bWWMwtF|=(4mq*!E1&ni!1V3)cMgcA6kSo#L4$;IGue=nK$VC{&Of|Jp0eS}7hDcrpK9w`N!j<@*An z_`SyIM8Qy()Q-fJC)U_XLRy7%FO3jy5xuEeeX*=~jWKfX!@u^9$cZMfuYB1}Q=~v{ z23oz6;z_~E3_nSw8DmcmH^EZAVbWYBd-gwCe;mu-AfBuhFop>=YZoy~SN+mhV-C_|W zWA}L677&$QnE`&saBo4IL#hlv)lC8W6dp^I`{~B!U`wtl<@)ha+nQpjF%6O#bS8}- ziVlABvjM&4rI8~C45(cqhki1b3;if+x$zT_S(@06i2#Qukay0ELuT6UXQV_Ly(c`| z_+_cO#HMHHoJVpIS-vgnhZRdd9)LgWRKj)@X^T7^dJ$KuQJOv0|3ZxRzd)c#q~x>B z6^$~u(4qb9>4!IYe@G0UhzoUGGoXn9K=ZYW0=jcfAYe$+ZABl#(v3{;Lasrjv#h>nhlv z=lWzJRnQDV)Zvk=csZ{Kb(QfoOJ@i$jf3#U6icYCQv>-&hA~cdq#wTRj6!Voi0HBC z+zm0EUq-SZGL+@2YTp9sFdKFcH$4w=%s7QWe!cz_D>#BAc!cC)_c!9FG?P-gW-L})OSn^B!Geu4E1h{e*~gW$d`f-~pgD*xe|k0$1pM8Ez^ zu6$0$`iJ}DhaZ6w1RGP|r6PPskp_Hv1SI*|KuC_2_Z zcA(7TdkzlTES4G;wGQZ1X30F{?qXvII9nT>7VCH`nRLNZRvPF$h{(X9Gg!@&cP2Af z>f*K7GW@K4j_cH^NnbxMD3e34ZN!_Eht98h%{GTMhWzUN%#A)w9|Q3Et2^Z<`hy~g^Urn&*zwNGPxMfGAo^aBxp@R_=!a3K?6*oiZyO)O z&*vz$Y=RkL*MDMljL`#rInZ^`#RafVS>hR{OQR!6Cd`b+)_A$eioN8e=FyUhQHjnE zkUrRZ^f%-SVQM)^2CDQndMbwH27Np<{>sv2ITgp!K~Ku(Iy|qznI0wgI-r|>R%2D@ zSWBGYE*WRX%0Wm~nreBrYl1kbI(DFEKt)=mHWeKSH4>CaZD`BSs>H$%?{)B8NDNj<%;xxe z2kX@9bY#RK`(N|N;G(*dxbDPf&(cQQ0K``V>t>>x+#-hl*81*iM^tnRsI~ojhi7?g zTa@J084VVlkP&I5?6j2pb!kwnPbanFx0cdIW*qquAPx;TE0vH#VG+l&}?DJh&HF!-TX509~N0K4;rYpaogvs(x6MU<#{SA=AKC$va$ zDJ`NrkKD-@MUF?qrmCe65n^XScv_R7V&t!x_!zhs+ZAZIqKL*vzer>Oet&)7qM(6`I4bVAw4 za-^4LrRnhx3+DYe!R4C~Va*de)N}vqknxV{?LLq_vlBgaVuNG~A-sxnB1_!Gl|}jc z+~QUffu-^jIzNZrKg;fHE$HwZ4B4MGwK&mV*OPBPm3{9}M*Gh^juj6jj4Pbjt~dOW z94KN+(9>;H^TMbM+@1p3xt>3!wnDp{&}uXQue3gu%|kQzfXuQh+(u#>o;|NX^d#c{ z-^K&n+-V;Gd=!w!8mJrRRLMp0(`fM5gWpYl`g+(~mX1i!A9^xGD$$CBh*}~~v-cM(*R?Wrn^Jh8capW2}AbNu}bO8Kgp7M zb_UrIhGMO;-<${_)&#Sv(rLmLoT|v;!sDg_2cUS@_g;9}rdWWPXWmSux9f>vaZX-n zf{+nOq-^DcY3VB(m5P~=$v&xmV@Jjds`7Oc4oIb76=x@msAt9uYxUdlKY&or#Q~DA zpP0EEeqy|T(!TLlyp-J`Tc1wP?|tHGkox|2&K@{w>l}v?faL`QtIC(tf*mHpfmnKz z1U_Z#A$@wqnRVv{f_9XcfnjBj?ulCQ{S#3b9=Q;b8Jqfu{WaPU;X$BAd zLGNIo;?D{xHGamfF`l=|lA%Mtz*R%%o*3C2W`h%T$&gHIw7LtWkcDd8x2T{ke4X>; z!13zROZJge7H<$v!K_QDToX%>U+!g#jHp7FTU-nJOQ+iU-(vyan6lSi{p-)bFj;*c z%mTw;#FCx1?^!+P#n18wCTHzK#$*3=@;p``ng7G2S?)_!tgn}VBMiu#aP#;CWg|%@ zC45nJf-Q3?_g6AfJDd?OMM_?LxS&i$(i0IH5p^Wt$aR}F+)pCWsyswxVCkj%t?Tu5 zW}s@4#0S|6GaTH?< zqdHjMq$keGwBrlzD6_CLTn7R1|MuUzey;aLX!Lvo=8@bJ$Mp{8d{mJK z_T$fInwW-ZgDA{5b3UYMdg1o=O2pPv3(NJUgdnkNpD*-|RR5tH8zCBNXqoO1e_Lbt z?1`S>>gJ~BPmAIKDB+Ue&&_x#wO_zhDEk@H0^Sm{7_1lzy{J~(8>nhok#1XSqSe`9 zr4UZRa9rN|=n_Yj%d_s%$O_5v-P|utRBiAVYX$P;fo@SHdov6Jl45+PHE<(9@h-GY zvtySozbLOq;Q8xLpIdaLMt0zdeZ|4aFg%+KnN_9n*SwQN`taa6ipSqE-O)-2Tw4EN zJEyPo;xvv;)XoaJxdh~%SYVJcxqU6Hz+j2><#9d%DhnyvN->~%$_OxsEg_B3(#w6V zG$YJhy^IY3OSj7%U$U|76aS9LdCEPsR3eO;roVc$$(DFYqG?vv2b$Wf!Df-!Ee-*77 z5NU&j${s}K@{`F^-=3RSsjN!4OWV`{&#z9@j!sQLypAB`z;UooiInwUj3{G5G?xNt zj(sNjayX_*-_o*SG8O(4p{bl3RSujDk^Mj22r^Z}R@fGw7!`v;&U}cRScHiqWtaF% z4~_I5#=~0q(|6_9E@Z+C3O%T}hmf@K2H72+G|sB*99E&2?oL0hKzjU*gYmW2wHQRo z`99~2NWM3wK#}LB&pD#G<>nbDP=jYrQ+jmLY~1L*g#bD}`Rrl3KsRgRDIoBa1p1?W zen3HcyjQydeAC+^_+G+U*9_u-N29xZ9x7MaJm--{#KTu|pA)!G6G z0(LeW^6q!Zbvnv+x-7=)yCt88%#c6RT8bf=ZxCOrH7LKnfoVMe^K-J-U(mbbB&|Wd~aM>AJ|f_#6?d(DYNF)%B#CC@VkdUjQ1dhK5*t zHI{aaTmnX)cHbj3;8IM> zRFU*niCXDV6mSziO3@^5y+{5kR;A7;dF$i_%OP;fB1nApo34S*Yb51wG=PeGJ@DEn z2bnsU;z*_fmEb9OW+r>`oIN(@3#ue?JxXr8evIw!IN9SgrY58>%}zCKm>ex)TT1jK zf~wT5#i4%j)9o#WSX^X^HI||rn82)sXBo`INd4=vif+`pXg24 zAtYT)RF1{zWo=NsQO^Vdu2Q9@>H60)CAJ#AjJ=n`E#Pkc3|hQ?ANlmhXYFv2M;VPH zSKm#Yk3xmAg5#OEu@REfpwgzPqX?4r83Zsvt0&{nrjpOkJ2f|e0!vfHSQ0o2ZNVo> zRAHdq`}uR(=@>@j@3F^kL1cPwmHKY78H#SmNfx zIP=r;GVyBOg#Z&Z9I#e9-v_TR~v#l6R47zO>vW7xN+X1@gR0@`iU{`R-I;Lq0tngLU{F5$wrCZns|0oXChdte?6eulsUleZlKR+`6-U4%F=0(?KT7R8o*0OYyl&*+$$ir+_t z6jTtpxE4Vd^T-_G95JPCk#Hi!RAs~s{pt>|n#561U?Q*L*C2<9w@;PYS`AZD#f<3T zp!;-glxCPy2jBi;D0Yr$!SyVHEsDKZy?PAIOPkC(`4MpJQbt`f9gF_^ZLSLLF9|0l z!UhMS_wU(c3-(j?jkr~k&!0;0$g$EEtA1m;`nMEa@yAtIpK)B`;dVz_DHWiXt}*c{ zivLi9^w^QCg>1clvo)Vx5E$v9W2u*36KYC_?tK)pExU#S1@P{pq17zx00YVQNq(T0 zeppUD`i7^JY`PDVTtcnxI%txRl0+&X#G?;Dx0|K+!(=&woL>mAp00VJ zibn2j-9SzPR-&#CO?qkG(z66_bfrXE zoF7fkCm8;(0BQx5`u3$yFWG4U@LuqK^K!Is^jJcX^Dl%y|M}0GQFo7kMXaHnJWJn; z@?ACbVdQJ;gS4D5w@=6D#-bIHFqI+Q^*})nWC0_i(a>rttAW^oXgIk2`}c3wIiz#} zDQPjPfL*&`Ng`^*Z+`QeF5e3lF@{cMqE-ev+TKX(WAKVg2kdPsXeDJ`f2Zo0!adc_e6VovW zE<8#-$LPn{NGW7M& z0?w9za{SVU5MqWHGZ< z2U0n<;YAMzYXKbfH9pP1&UlIIjV2nj8Uh+bshYZ30=C->x|)4oiPMVClVJVPk9CUqgT` zvG7+z^nlw(*EB%M6-988unf}n$ezi9G`hgmkIf^cr!--(1}vnUMioB&^wX;B;{b@y zKmYSTN3Y^u0)|ZFA{d&sz#`SxUw_@i&JuX#l~z?LQYR{E0v3pki^Ra5ix)3u%i9tVSpc#yPOX%1&^eKMH`oQy3#Ro|N)Wiuxw^G& z)#%$&c~J7ww6zto!O=BviGsEvwJ|8E9%)6^V%?k$gsSiC*|Q}5Qp^`Mw(c}XjAQ|} zgJM7#^=lIi>%3v1YA**d!D3&D!%ekCD}rF%Z*cSsi2fIwm)5&$mm%eMs-D!d7(~Ot zTx6lP0;g2^)N`#eEYa{E5D$UU01$=o>;^aiuc!U@Ko0kkSJKbaOcDm_5zbWEk}sK~GDw&!R)*8qwB8+)e{P}x zH!;Fmg%Pj-t|!1s`G5MSe^NWhs%5~I$<~3XpCzLQnCG!{8u~N_Ojwy3Ndo7Ym9EfK z@?-!0@BgkcM9ASVayumqYO=}FmKw`GgqF*p)^gUitA_W?X+w|Y7lNj3Yw;_!*AKOo zXgNZXxx$_l)MS&TEj5;X2rZXGt>vt3S4;It18XWjP21MuS88t$s!P_LER=_ng&)we zBXY8k2f6civQS=E4tr~`LHm8w_qI7%C=VwKwpeQ&ADk>SmtRRZStx6RrmlRO;FaMH yD-I_M?U#X*g*<4PEY#i>oh+2KK}FXv4F4Z3rVhfwis7LE0000