diff --git a/ABStudio.sln b/ABStudio.sln
new file mode 100644
index 0000000..cbda417
--- /dev/null
+++ b/ABStudio.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32901.82
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ABStudio", "ABStudio\ABStudio.csproj", "{30ADF767-664C-47C5-89C6-60CDC84051B9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {30ADF767-664C-47C5-89C6-60CDC84051B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {30ADF767-664C-47C5-89C6-60CDC84051B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {30ADF767-664C-47C5-89C6-60CDC84051B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {30ADF767-664C-47C5-89C6-60CDC84051B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EEFF4524-997D-4861-96A6-75253F9EE431}
+ EndGlobalSection
+EndGlobal
diff --git a/ABStudio/ABStudio.csproj b/ABStudio/ABStudio.csproj
new file mode 100644
index 0000000..a67552b
--- /dev/null
+++ b/ABStudio/ABStudio.csproj
@@ -0,0 +1,182 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {30ADF767-664C-47C5-89C6-60CDC84051B9}
+ WinExe
+ ABStudio
+ ABStudio
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ true
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ true
+
+
+ icon.ico
+
+
+
+ ..\packages\Aspose.Zip.23.5.0\lib\net40\Aspose.Zip.dll
+
+
+ ..\packages\CppSharp.Runtime.1.0.45.22293\lib\netstandard2.0\CppSharp.Runtime.dll
+
+
+
+ ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
+
+
+
+
+
+
+ ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll
+
+
+ ..\packages\System.Text.Encoding.CodePages.4.5.0\lib\net461\System.Text.Encoding.CodePages.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Component
+
+
+ Component
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ ComboAskForm.cs
+
+
+ Form
+
+
+ Main.cs
+
+
+ Form
+
+
+ MCQAskForm.cs
+
+
+ Form
+
+
+ NumUpDownAskForm.cs
+
+
+ Form
+
+
+ SpritesheetEditor.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ComboAskForm.cs
+
+
+ Main.cs
+
+
+ MCQAskForm.cs
+
+
+ SpritesheetEditor.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
\ No newline at end of file
diff --git a/ABStudio/App.config b/ABStudio/App.config
new file mode 100644
index 0000000..5754728
--- /dev/null
+++ b/ABStudio/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ABStudio/Controls/CustomPanel.cs b/ABStudio/Controls/CustomPanel.cs
new file mode 100644
index 0000000..07e4962
--- /dev/null
+++ b/ABStudio/Controls/CustomPanel.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+using ABStudio.Misc;
+
+namespace ABStudio.Controls
+{
+ public class CustomPanel : Panel
+ {
+ public event MouseEventHandler CTRLMouseWheel;
+
+
+ protected override void OnMouseWheel(MouseEventArgs e)
+ {
+ if (((Common.GetAsyncKeyState(0xA2) & 0x8000) > 0) || ((Common.GetAsyncKeyState(0xA3) & 0x8000) > 0)) // LCONTROL or RCONTROL held
+ {
+ CTRLMouseWheel.Invoke(this, e);
+ ((HandledMouseEventArgs)e).Handled = true;
+ }
+ else
+ {
+ base.OnMouseWheel(e);
+ }
+ }
+ }
+}
diff --git a/ABStudio/Controls/PictureBoxDB.cs b/ABStudio/Controls/PictureBoxDB.cs
new file mode 100644
index 0000000..4ad9c90
--- /dev/null
+++ b/ABStudio/Controls/PictureBoxDB.cs
@@ -0,0 +1,537 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.Contracts;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Forms.Layout;
+
+namespace ABStudio.Controls
+{
+ public class PictureBoxDB : PictureBox
+ {
+ public InterpolationMode InterpolationMode { get; set; }
+ public bool AllowSRectCreation { get; set; } = true;
+ public event EventHandler RectResize;
+ public event EventHandler SelectedSRectChanged;
+ public event EventHandler SRectCreated;
+ public object SelectedSRect {
+ get => selectedSRect;
+ set
+ {
+ selectedSRect = value as SizableRect;
+ RaiseSelectedSRectChanged();
+ this.Invalidate();
+ }
+ }
+
+ private List srects = new List();
+ private SizableRect selectedSRect = null;
+
+ public PictureBoxDB() : base()
+ {
+ this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+ this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+ this.SetStyle(ControlStyles.DoubleBuffer, true);
+ this.DoubleBuffered = true;
+ this.UpdateStyles();
+
+ InterpolationMode = InterpolationMode.Default;
+ }
+
+ private void RaiseRectResize(SizableRect srect)
+ {
+ if (RectResize != null)
+ {
+ SizableRectEventArgs srea = new SizableRectEventArgs(srect, srect.rect, srect.LinkedObject);
+ RectResize.Invoke(this, srea);
+ }
+ }
+
+ private void RaiseSelectedSRectChanged()
+ {
+ if (SelectedSRectChanged != null)
+ SelectedSRectChanged.Invoke(this, EventArgs.Empty);
+ }
+
+ private void RaiseSRectCreated(SizableRect srect)
+ {
+ if (SRectCreated != null)
+ {
+ SizableRectEventArgs srea = new SizableRectEventArgs(srect, srect.rect, srect.LinkedObject);
+ SRectCreated.Invoke(this, srea);
+ }
+ }
+
+ public object AddSRect(Rectangle rect, object linkedObject=null)
+ {
+ SizableRect srect = new SizableRect(rect, this);
+ srect.LinkedObject = linkedObject;
+
+ srects.Add(srect);
+
+ this.Invalidate();
+
+ return srect;
+ }
+
+ public void EditSRect(object srect, Rectangle rect)
+ {
+ (srect as SizableRect).rect = rect;
+
+ this.Invalidate();
+ }
+
+ public void RemoveSRect(object srect)
+ {
+ SizableRect sizableRect = srect as SizableRect;
+ srects.Remove(sizableRect);
+
+ if (SelectedSRect == sizableRect)
+ SelectedSRect = null;
+
+ this.Invalidate();
+ }
+
+ public void ClearSRects()
+ {
+ srects.Clear();
+ SelectedSRect = null;
+
+ this.Invalidate();
+ }
+
+ public object GetSRectLinkedObject(object srect)
+ {
+ return (srect as SizableRect).LinkedObject;
+ }
+
+ public void SetSRectLinkedObject(object srect, object linkedObject)
+ {
+ (srect as SizableRect).LinkedObject = linkedObject;
+ }
+
+ public Point ConvertControlPointToPicturePoint(Point pt)
+ {
+ if (this.Image == null)
+ return pt;
+
+ int w = (int)Math.Round((pt.X * this.Image.Width) / (double)this.Width);
+ int h = (int)Math.Round((pt.Y * this.Image.Height) / (double)this.Height);
+
+ return new Point(w, h);
+ }
+
+ public Point ConvertPicturePointToControlPoint(Point pt)
+ {
+ if (this.Image == null)
+ return pt;
+
+ int w = (int)Math.Round((pt.X * this.Width) / (double)this.Image.Width);
+ int h = (int)Math.Round((pt.Y * this.Height) / (double)this.Image.Height);
+
+ return new Point(w, h);
+ }
+
+ public Rectangle ConvertControlRectToPictureRect(Rectangle rect)
+ {
+ Point orig = ConvertControlPointToPicturePoint(rect.Location);
+ Point s = ConvertControlPointToPicturePoint(new Point(rect.X + rect.Width, rect.Y + rect.Height));
+
+ return new Rectangle(orig, new Size(s.X - orig.X, s.Y - orig.Y));
+ }
+
+ public Rectangle ConvertPictureRectToControlRect(Rectangle rect)
+ {
+ Point orig = ConvertPicturePointToControlPoint(rect.Location);
+ Point s = ConvertPicturePointToControlPoint(new Point(rect.X + rect.Width, rect.Y + rect.Height));
+
+ return new Rectangle(orig, new Size(s.X - orig.X, s.Y - orig.Y));
+ }
+
+ private MouseEventArgs ConvertMEA(MouseEventArgs e)
+ {
+ Point pt = ConvertControlPointToPicturePoint(e.Location);
+ return new MouseEventArgs(e.Button, e.Clicks, pt.X, pt.Y, e.Delta);
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ if (this.Image != null)
+ {
+
+ e.Graphics.InterpolationMode = InterpolationMode;
+ //base.OnPaint(e);
+
+ double zoomX = (double)this.Width / (double)this.Image.Width;
+ double zoomY = (double)this.Height / (double)this.Image.Height;
+ e.Graphics.DrawImage(this.Image, (int)Math.Round(zoomX / 2), (int)Math.Round(zoomY / 2), this.Width, this.Height);
+
+
+ foreach (SizableRect srect in srects)
+ {
+ try
+ {
+ srect.Draw(e.Graphics, selectedSRect == srect);
+ }
+ catch (Exception exp)
+ {
+ Console.WriteLine(exp.Message);
+ }
+ }
+ }
+
+ Contract.Requires(e != null);
+ PaintEventHandler handler = (PaintEventHandler)Events[typeof(Control).GetField("EventPaint", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null)];
+ if (handler != null) handler(this, e);
+ }
+
+ bool isDown = false;
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ base.OnMouseDown(e);
+
+ e = ConvertMEA(e);
+
+ SizableRect formerSelectedSRect = selectedSRect;
+
+ if (e.Button == MouseButtons.Left)
+ {
+ if (selectedSRect == null || !selectedSRect.IsPointInRect(e.Location))
+ {
+ selectedSRect = null;
+ foreach (SizableRect srect in srects)
+ {
+ if (srect.IsPointInRect(e.Location))
+ {
+ selectedSRect = srect;
+ break;
+ }
+ }
+ }
+
+ if (selectedSRect != null)
+ selectedSRect.MouseDown(e);
+ }
+ else if(e.Button == MouseButtons.Right)
+ {
+ if(AllowSRectCreation && !isDown)
+ {
+ selectedSRect = AddSRect(new Rectangle(e.Location, new Size(5, 5))) as SizableRect;
+ RaiseSRectCreated(selectedSRect);
+ isDown = true;
+ }
+ }
+
+ if (formerSelectedSRect != selectedSRect)
+ RaiseSelectedSRectChanged();
+
+ this.Invalidate();
+ }
+
+ protected override void OnMouseUp(MouseEventArgs e)
+ {
+ base.OnMouseUp(e);
+
+ e = ConvertMEA(e);
+
+ isDown = false;
+
+ if (selectedSRect != null)
+ selectedSRect.MouseUp(e);
+ }
+
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ base.OnMouseMove(e);
+
+ e = ConvertMEA(e);
+
+ if (selectedSRect != null && selectedSRect.MouseMove(e))
+ RaiseRectResize(selectedSRect);
+ }
+
+ public class SizableRectEventArgs : EventArgs
+ {
+ private object srect;
+ private Rectangle rect;
+ private object linkedObject = null;
+
+ public object SRect { get => srect; }
+ public Rectangle Rect { get => rect; }
+ public object LinkedObject { get => linkedObject; }
+
+ public SizableRectEventArgs(object srect, Rectangle rect, object linkedObject)
+ {
+ this.srect = srect;
+ this.rect = rect;
+ this.linkedObject = linkedObject;
+ }
+ }
+
+ private class SizableRect
+ {
+ private PictureBoxDB mPictureBox;
+ public Rectangle rect;
+ public bool AllowDeformingDuringMovement = false;
+ public object LinkedObject = null;
+ private bool mIsClick = false;
+ private bool mMove = false;
+ private int oldX;
+ private int oldY;
+ private int sizeNodeRect = 5;
+ private PosSizableRect nodeSelected = PosSizableRect.None;
+
+ private enum PosSizableRect
+ {
+ UpMiddle,
+ LeftMiddle,
+ LeftBottom,
+ LeftUp,
+ RightUp,
+ RightMiddle,
+ RightBottom,
+ BottomMiddle,
+ None
+
+ };
+
+ public SizableRect(Rectangle r, PictureBoxDB owner)
+ {
+ rect = r;
+ mIsClick = false;
+ this.mPictureBox = owner;
+ }
+
+ public void Draw(Graphics g, bool isSelected)
+ {
+ Color col = isSelected ? Color.Red : Color.DarkGreen;
+ Pen pen = new Pen(col);
+
+ g.DrawRectangle(pen, mPictureBox.ConvertPictureRectToControlRect(rect));
+
+ foreach (PosSizableRect pos in Enum.GetValues(typeof(PosSizableRect)))
+ {
+ g.DrawRectangle(pen, GetRect(pos, true));
+ }
+ }
+
+ public void MouseDown(MouseEventArgs e)
+ {
+ mIsClick = true;
+
+ nodeSelected = PosSizableRect.None;
+ nodeSelected = GetNodeSelectable(e.Location);
+
+ if (rect.Contains(new Point(e.X, e.Y)))
+ {
+ mMove = true;
+ }
+ oldX = e.X;
+ oldY = e.Y;
+ }
+
+ public void MouseUp(MouseEventArgs e)
+ {
+ mIsClick = false;
+ mMove = false;
+ }
+
+ public bool MouseMove(MouseEventArgs e)
+ {
+ ChangeCursor(e.Location);
+ if (mIsClick == false)
+ {
+ return false;
+ }
+
+ Rectangle backupRect = rect;
+
+ switch (nodeSelected)
+ {
+ case PosSizableRect.LeftUp:
+ rect.X += e.X - oldX;
+ rect.Width -= e.X - oldX;
+ rect.Y += e.Y - oldY;
+ rect.Height -= e.Y - oldY;
+ break;
+ case PosSizableRect.LeftMiddle:
+ rect.X += e.X - oldX;
+ rect.Width -= e.X - oldX;
+ break;
+ case PosSizableRect.LeftBottom:
+ rect.Width -= e.X - oldX;
+ rect.X += e.X - oldX;
+ rect.Height += e.Y - oldY;
+ break;
+ case PosSizableRect.BottomMiddle:
+ rect.Height += e.Y - oldY;
+ break;
+ case PosSizableRect.RightUp:
+ rect.Width += e.X - oldX;
+ rect.Y += e.Y - oldY;
+ rect.Height -= e.Y - oldY;
+ break;
+ case PosSizableRect.RightBottom:
+ rect.Width += e.X - oldX;
+ rect.Height += e.Y - oldY;
+ break;
+ case PosSizableRect.RightMiddle:
+ rect.Width += e.X - oldX;
+ break;
+
+ case PosSizableRect.UpMiddle:
+ rect.Y += e.Y - oldY;
+ rect.Height -= e.Y - oldY;
+ break;
+
+ default:
+ if (mMove)
+ {
+ rect.X = rect.X + e.X - oldX;
+ rect.Y = rect.Y + e.Y - oldY;
+ }
+ break;
+ }
+ oldX = e.X;
+ oldY = e.Y;
+
+ if (rect.Width < 5 || rect.Height < 5)
+ {
+ rect = backupRect;
+ }
+
+ TestIfRectInsideArea();
+
+ mPictureBox.Invalidate();
+
+ return !rect.Equals(backupRect);
+ }
+
+ private void TestIfRectInsideArea()
+ {
+ // Test if rectangle still inside the area.
+ if (rect.X < 0) rect.X = 0;
+ if (rect.Y < 0) rect.Y = 0;
+ if (rect.Width <= 0) rect.Width = 1;
+ if (rect.Height <= 0) rect.Height = 1;
+
+ if (rect.X + rect.Width > mPictureBox.Image.Width)
+ {
+ rect.X = mPictureBox.Image.Width - rect.Width - 1;
+ }
+ if (rect.Y + rect.Height > mPictureBox.Image.Height)
+ {
+ rect.Y = mPictureBox.Image.Height - rect.Height - 1;
+ }
+ }
+
+ public bool IsPointInRect(Point pt)
+ {
+ return rect.Contains(pt) ||(GetNodeSelectable(pt) != PosSizableRect.None);
+ }
+
+ private Rectangle CreateRectSizableNode(int x, int y, bool convert = false)
+ {
+ if(convert)
+ {
+ Point pt = mPictureBox.ConvertPicturePointToControlPoint(new Point(x, y));
+ x = pt.X;
+ y = pt.Y;
+ }
+
+ return new Rectangle(x - sizeNodeRect / 2, y - sizeNodeRect / 2, sizeNodeRect, sizeNodeRect);
+ }
+
+ private Rectangle GetRect(PosSizableRect p, bool convert = false)
+ {
+ switch (p)
+ {
+ case PosSizableRect.LeftUp:
+ return CreateRectSizableNode(rect.X, rect.Y, convert);
+
+ case PosSizableRect.LeftMiddle:
+ return CreateRectSizableNode(rect.X, rect.Y + rect.Height / 2, convert);
+
+ case PosSizableRect.LeftBottom:
+ return CreateRectSizableNode(rect.X, rect.Y + rect.Height, convert);
+
+ case PosSizableRect.BottomMiddle:
+ return CreateRectSizableNode(rect.X + rect.Width / 2, rect.Y + rect.Height, convert);
+
+ case PosSizableRect.RightUp:
+ return CreateRectSizableNode(rect.X + rect.Width, rect.Y, convert);
+
+ case PosSizableRect.RightBottom:
+ return CreateRectSizableNode(rect.X + rect.Width, rect.Y + rect.Height, convert);
+
+ case PosSizableRect.RightMiddle:
+ return CreateRectSizableNode(rect.X + rect.Width, rect.Y + rect.Height / 2, convert);
+
+ case PosSizableRect.UpMiddle:
+ return CreateRectSizableNode(rect.X + rect.Width / 2, rect.Y, convert);
+ default:
+ return new Rectangle();
+ }
+ }
+
+ private PosSizableRect GetNodeSelectable(Point p)
+ {
+ foreach (PosSizableRect r in Enum.GetValues(typeof(PosSizableRect)))
+ {
+ if (GetRect(r).Contains(p))
+ {
+ return r;
+ }
+ }
+ return PosSizableRect.None;
+ }
+
+ private void ChangeCursor(Point p)
+ {
+ mPictureBox.Cursor = GetCursor(GetNodeSelectable(p));
+ }
+
+ ///
+ /// Get cursor for the handle
+ ///
+ ///
+ ///
+ private Cursor GetCursor(PosSizableRect p)
+ {
+ switch (p)
+ {
+ case PosSizableRect.LeftUp:
+ return Cursors.SizeNWSE;
+
+ case PosSizableRect.LeftMiddle:
+ return Cursors.SizeWE;
+
+ case PosSizableRect.LeftBottom:
+ return Cursors.SizeNESW;
+
+ case PosSizableRect.BottomMiddle:
+ return Cursors.SizeNS;
+
+ case PosSizableRect.RightUp:
+ return Cursors.SizeNESW;
+
+ case PosSizableRect.RightBottom:
+ return Cursors.SizeNWSE;
+
+ case PosSizableRect.RightMiddle:
+ return Cursors.SizeWE;
+
+ case PosSizableRect.UpMiddle:
+ return Cursors.SizeNS;
+ default:
+ return Cursors.Default;
+ }
+ }
+ }
+ }
+}
diff --git a/ABStudio/Controls/SizableRect.cs b/ABStudio/Controls/SizableRect.cs
new file mode 100644
index 0000000..4428223
--- /dev/null
+++ b/ABStudio/Controls/SizableRect.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+namespace ABStudio.Controls
+{
+}
diff --git a/ABStudio/DataReader.cs b/ABStudio/DataReader.cs
new file mode 100644
index 0000000..80c8d03
--- /dev/null
+++ b/ABStudio/DataReader.cs
@@ -0,0 +1,190 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio
+{
+ public static class ByteArrayExtensions
+ {
+ public static string GetString(this byte[] bytes, int idx) { int i = idx; return bytes.GetString(ref i); }
+ public static string GetString(this byte[] bytes, ref int idx)
+ {
+ ushort charCount = bytes.GetUInt16(ref idx);
+
+ string output = "";
+ for (int i = 0; i < charCount; i++)
+ {
+ output += (char)bytes[idx + i];
+ }
+
+ idx += charCount;
+
+ return output;
+ }
+
+ public static float GetFloat(this byte[] bytes, int idx) { int i = idx; return bytes.GetFloat(ref i); }
+ public static float GetFloat(this byte[] bytes, ref int idx)
+ {
+ float val = System.BitConverter.ToSingle(bytes.Skip(idx).Take(4).Reverse().ToArray(), 0);
+ idx += 4;
+ return val;
+ }
+
+ public static long GetInt64(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt64(ref i); }
+ public static long GetInt64(this byte[] bytes, ref int idx)
+ {
+ return (long)bytes.GetUInt64(ref idx);
+ }
+
+ public static ulong GetUInt64(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt64(ref i); }
+ public static ulong GetUInt64(this byte[] bytes, ref int idx)
+ {
+ ulong val = ((ulong)bytes[idx + 7]) | ((ulong)bytes[idx + 6] << 8) | ((ulong)bytes[idx + 5] << 16) | ((ulong)bytes[idx + 4] << 24) | ((ulong)bytes[idx + 3] << 32) | ((ulong)bytes[idx + 2] << 40) | ((ulong)bytes[idx + 1] << 48) | ((ulong)bytes[idx] << 56);
+ idx += 8;
+ return val;
+ }
+
+ public static int GetInt32(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt32(ref i); }
+ public static int GetInt32(this byte[] bytes, ref int idx)
+ {
+ return (int)bytes.GetUInt32(ref idx);
+ }
+
+ public static uint GetUInt32(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt32(ref i); }
+ public static uint GetUInt32(this byte[] bytes, ref int idx)
+ {
+ uint val = ((uint)bytes[idx + 3]) | ((uint)bytes[idx + 2] << 8) | ((uint)bytes[idx + 1] << 16) | ((uint)bytes[idx] << 24);
+ idx += 4;
+ return val;
+ }
+
+ public static short GetInt16(this byte[] bytes, int idx) { int i = idx; return bytes.GetInt16(ref i); }
+ public static short GetInt16(this byte[] bytes, ref int idx)
+ {
+ return (short)bytes.GetUInt16(ref idx);
+ }
+
+ public static ushort GetUInt16(this byte[] bytes, int idx) { int i = idx; return bytes.GetUInt16(ref i); }
+ public static ushort GetUInt16(this byte[] bytes, ref int idx)
+ {
+ ushort val = (ushort)(((uint)bytes[idx + 1]) | ((uint)bytes[idx] << 8));
+ idx += 2;
+ return val;
+ }
+ }
+
+ public static class ByteListExtensions
+ {
+ public static void AddString(this List bytes, string item)
+ {
+ bytes.AddUInt16((ushort)item.Length);
+
+ foreach (char c in item)
+ {
+ bytes.Add((byte)(c & 0xFF));
+ }
+ }
+
+ public static void AddFloat(this List bytes, float item)
+ {
+ foreach (byte b in BitConverter.GetBytes(item))
+ {
+ bytes.Add(b);
+ }
+ }
+
+ public static void InsertFloat(this List bytes, int index, float item)
+ {
+ int i = index;
+ foreach (byte b in BitConverter.GetBytes(item))
+ {
+ bytes[i] = b;
+ i++;
+ }
+ }
+
+ public static void AddInt64(this List bytes, long item)
+ {
+ bytes.AddUInt64((uint)item);
+ }
+
+ public static void InsertInt64(this List bytes, int index, long item)
+ {
+ bytes.InsertUInt64(index, (uint)item);
+ }
+
+ public static void AddUInt64(this List bytes, ulong item)
+ {
+ bytes.Add((byte)((item >> 16) & 0xFF));
+ bytes.Add((byte)((item >> 56) & 0xFF));
+ bytes.Add((byte)((item >> 48) & 0xFF));
+ bytes.Add((byte)((item >> 40) & 0xFF));
+ bytes.Add((byte)((item >> 32) & 0xFF));
+ bytes.Add((byte)((item >> 24) & 0xFF));
+ bytes.Add((byte)((item >> 8) & 0xFF));
+ bytes.Add((byte)(item & 0xFF));
+ }
+
+ public static void InsertUInt64(this List bytes, int index, ulong item)
+ {
+ bytes[index] = (byte)((item >> 56) & 0xFF);
+ bytes[index + 1] = (byte)((item >> 48) & 0xFF);
+ bytes[index + 2] = (byte)((item >> 40) & 0xFF);
+ bytes[index + 3] = (byte)((item >> 32) & 0xFF);
+ bytes[index + 4] = (byte)((item >> 24) & 0xFF);
+ bytes[index + 5] = (byte)((item >> 16) & 0xFF);
+ bytes[index + 6] = (byte)((item >> 8) & 0xFF);
+ bytes[index + 7] = (byte)(item & 0xFF);
+ }
+
+ public static void AddInt32(this List bytes, int item)
+ {
+ bytes.AddUInt32((uint)item);
+ }
+
+ public static void InsertInt32(this List bytes, int index, int item)
+ {
+ bytes.InsertUInt32(index, (uint)item);
+ }
+
+ public static void AddUInt32(this List bytes, uint item)
+ {
+ bytes.Add((byte)((item >> 24) & 0xFF));
+ bytes.Add((byte)((item >> 16) & 0xFF));
+ bytes.Add((byte)((item >> 8) & 0xFF));
+ bytes.Add((byte)(item & 0xFF));
+ }
+
+ public static void InsertUInt32(this List bytes, int index, uint item)
+ {
+ bytes[index] = (byte)((item >> 24) & 0xFF);
+ bytes[index + 1] = (byte)((item >> 16) & 0xFF);
+ bytes[index + 2] = (byte)((item >> 8) & 0xFF);
+ bytes[index + 3] = (byte)(item & 0xFF);
+ }
+
+ public static void AddInt16(this List bytes, short item)
+ {
+ bytes.AddUInt16((ushort)item);
+ }
+
+ public static void InsertInt16(this List bytes, int index, short item)
+ {
+ bytes.InsertUInt16(index, (ushort)item);
+ }
+
+ public static void AddUInt16(this List bytes, uint item)
+ {
+ bytes.Add((byte)((item >> 8) & 0xFF));
+ bytes.Add((byte)(item & 0xFF));
+ }
+
+ public static void InsertUInt16(this List bytes, int index, ushort item)
+ {
+ bytes[index] = (byte)((item >> 8) & 0xFF);
+ bytes[index + 1] = (byte)(item & 0xFF);
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/DAT/DATFile.cs b/ABStudio/FileFormats/DAT/DATFile.cs
new file mode 100644
index 0000000..1e1e942
--- /dev/null
+++ b/ABStudio/FileFormats/DAT/DATFile.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio.FileFormats.DAT
+{
+ public partial class DATFile
+ {
+ private MainSection file;
+ private Type type => file.section.GetType();
+ public string Type => type.Name.Substring(0, type.Name.Length - "Section".Length);
+ public byte[] AsBytes => file.AsBytes();
+ public byte[] AsJSONBytes => file.AsJSONBytes();
+
+
+ private DATFile() { }
+ public DATFile(string filename) : this(File.ReadAllBytes(filename)) { }
+ public DATFile(byte[] data)
+ {
+ file = new MainSection(data);
+ }
+
+ public SpriteData GetAsSpriteData()
+ {
+ if (type == typeof(SpriteSection))
+ return (file.section as SpriteSection).file;
+ else
+ throw new Exception("Current file isn't of type " + type.ToString() + ".");
+ }
+
+ public static DATFile NewSpriteData()
+ {
+ DATFile dat = new DATFile();
+
+ dat.file = new MainSection();
+ dat.file.section = new SpriteSection();
+
+ return dat;
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/DAT/Sections/MainSection.cs b/ABStudio/FileFormats/DAT/Sections/MainSection.cs
new file mode 100644
index 0000000..a2a38d7
--- /dev/null
+++ b/ABStudio/FileFormats/DAT/Sections/MainSection.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio.FileFormats.DAT
+{
+ public partial class DATFile
+ {
+ private sealed class MainSection : Section
+ {
+ public override string Magic => "KA3D";
+ public Section section = null;
+
+ public MainSection() : base() { }
+ public MainSection(byte[] data) : base(data) { }
+
+ public override byte[] AsJSONBytes()
+ {
+ return section.AsJSONBytes();
+ }
+
+ protected override byte[] AsCoreBytes()
+ {
+ return section.AsBytes();
+ }
+
+ protected override void FromCoreBytes(byte[] data)
+ {
+ Type[] types = Assembly.GetAssembly(typeof(Section)).GetTypes().Where(t => t.IsSubclassOf(typeof(Section))).ToArray();
+
+ string wantedMagic = "" + (char)data[0] + (char)data[1] + (char)data[2] + (char)data[3];
+
+ bool supported = false;
+ foreach (Type type in types)
+ {
+ Section o = Activator.CreateInstance(type) as Section;
+ string typeMagic = o.Magic;
+
+ if (wantedMagic == typeMagic)
+ {
+ section = Activator.CreateInstance(type) as Section;
+ section.FromBytes(data);
+
+ supported = true;
+ break;
+ }
+ }
+
+ if (!supported)
+ {
+ throw new Exception("Unsupported DAT section type \"" + wantedMagic + "\".");
+ }
+ }
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/DAT/Sections/Section.cs b/ABStudio/FileFormats/DAT/Sections/Section.cs
new file mode 100644
index 0000000..0d06d03
--- /dev/null
+++ b/ABStudio/FileFormats/DAT/Sections/Section.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio.FileFormats.DAT
+{
+ public partial class DATFile
+ {
+ private abstract class Section
+ {
+ public abstract string Magic { get; }
+
+ public Section() { }
+ public Section(byte[] data)
+ {
+ FromBytes(data);
+ }
+
+ public abstract byte[] AsJSONBytes();
+
+ public byte[] AsBytes()
+ {
+ List rawdata = new List();
+ foreach (char c in Magic)
+ rawdata.Add((byte)(c & 0xFF));
+
+ byte[] actualData = this.AsCoreBytes();
+ rawdata.AddUInt32((uint)actualData.Length);
+
+ return rawdata.Concat(actualData).ToArray();
+ }
+
+ public void FromBytes(byte[] data)
+ {
+ for (int c = 0; c < Magic.Length; c++)
+ {
+ if (data[c] != Magic[c])
+ throw new Exception("A " + this.GetType().Name + " section was initiated with an unmatching byte array.");
+ }
+
+ byte[] rawdata = data.Skip(8).Take((int)data.GetUInt32(4)).ToArray();
+
+ this.FromCoreBytes(rawdata);
+ }
+
+ protected abstract byte[] AsCoreBytes();
+ protected abstract void FromCoreBytes(byte[] data);
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs b/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs
new file mode 100644
index 0000000..a21ee8f
--- /dev/null
+++ b/ABStudio/FileFormats/DAT/Sections/SpriteSection.cs
@@ -0,0 +1,108 @@
+using ABStudio.FileFormats.ZSTREAM;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio.FileFormats.DAT
+{
+ public partial class DATFile
+ {
+ public class SpriteData
+ {
+ public List filenames = new List();
+ public List sprites = new List();
+
+ public ZSTREAMFile associatedZSTREAM = null;
+
+ public class Sprite
+ {
+ public string name = "";
+ public Rectangle rect = new Rectangle();
+ public Point orig = new Point();
+ }
+ public byte[] AsJSONBytes()
+ {
+ if (associatedZSTREAM != null)
+ return associatedZSTREAM.Save();
+
+ throw new Exception("Can't save as JSON without ZSTREAM information.");
+ }
+ }
+
+ private sealed class SpriteSection : Section
+ {
+ public override string Magic => "SPRT";
+ public SpriteData file = new SpriteData();
+
+ public SpriteSection() : base() { }
+ public SpriteSection(byte[] data) : base(data) { }
+
+ public override byte[] AsJSONBytes()
+ {
+ return file.AsJSONBytes();
+ }
+
+ protected override byte[] AsCoreBytes()
+ {
+ List rawdata = new List();
+
+
+ rawdata.AddUInt16((ushort)file.filenames.Count);
+ foreach (string filename in file.filenames)
+ rawdata.AddString(filename);
+
+ rawdata.AddUInt16((ushort)file.sprites.Count);
+ foreach (SpriteData.Sprite sprite in file.sprites)
+ {
+ rawdata.AddString(sprite.name);
+ rawdata.AddUInt16((ushort)sprite.rect.X);
+ rawdata.AddUInt16((ushort)sprite.rect.Y);
+ rawdata.AddUInt16((ushort)sprite.rect.Width);
+ rawdata.AddUInt16((ushort)sprite.rect.Height);
+ rawdata.AddUInt16((ushort)sprite.orig.X);
+ rawdata.AddUInt16((ushort)sprite.orig.Y);
+ }
+
+
+ return rawdata.ToArray();
+ }
+
+ protected override void FromCoreBytes(byte[] data)
+ {
+ file.filenames = new List();
+ file.sprites = new List();
+
+ int idx = 0;
+
+ ushort texCount = data.GetUInt16(ref idx);
+ for (int texN = 0; texN < texCount; texN++)
+ file.filenames.Add(data.GetString(ref idx));
+
+ ushort spriteCount = data.GetUInt16(ref idx);
+ for (int spriteN = 0; spriteN < spriteCount; spriteN++)
+ {
+ SpriteData.Sprite sprite = new SpriteData.Sprite();
+
+ sprite.name = data.GetString(ref idx);
+ sprite.rect.X = data.GetUInt16(ref idx);
+ sprite.rect.Y = data.GetUInt16(ref idx);
+ sprite.rect.Width = data.GetUInt16(ref idx);
+ sprite.rect.Height = data.GetUInt16(ref idx);
+ sprite.orig.X = data.GetUInt16(ref idx);
+ sprite.orig.Y = data.GetUInt16(ref idx);
+
+ file.sprites.Add(sprite);
+ }
+
+ file.associatedZSTREAM = new ZSTREAMFile();
+ file.associatedZSTREAM.associatedSD = file;
+ }
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/PVR/PVRFile.cs b/ABStudio/FileFormats/PVR/PVRFile.cs
new file mode 100644
index 0000000..9691adf
--- /dev/null
+++ b/ABStudio/FileFormats/PVR/PVRFile.cs
@@ -0,0 +1,244 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ABStudio.FileFormats.PVR
+{
+ public class PVRFile
+ {
+ private IntPtr tex = IntPtr.Zero;
+
+ public PVRFile(string filename) : this(File.ReadAllBytes(filename)) { }
+
+ public PVRFile(byte[] pvrData)
+ {
+ IntPtr dataPtr = Marshal.AllocHGlobal(pvrData.Length);
+ Marshal.Copy(pvrData, 0, dataPtr, pvrData.Length);
+
+ tex = PVRTexLib.PVRTexLibCreateTextureFromData(dataPtr);
+ if (ReferenceEquals(tex, null))
+ throw new Exception("Invalid PVR file.");
+ }
+
+ public PVRFile(Bitmap bmp, string format="r4g4b4a4")
+ {
+ PVRHeaderCreateParams headerCreateParams = new PVRHeaderCreateParams();
+ headerCreateParams.PixelFormat = FormatStringToULong("r8g8b8a8");
+ headerCreateParams.Width = (uint)bmp.Width;
+ headerCreateParams.Height = (uint)bmp.Height;
+ headerCreateParams.Depth = 1u;
+ headerCreateParams.NumMipMaps = 1u;
+ headerCreateParams.NumArrayMembers = 1u;
+ headerCreateParams.NumFaces = 1u;
+ headerCreateParams.ColourSpace = PVRTexLibColourSpace.PVRTLCS_Linear;
+ headerCreateParams.ChannelType = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm;
+ headerCreateParams.PreMultiplied = false;
+ IntPtr header = PVRTexLib.PVRTexLibCreateTextureHeader(headerCreateParams);
+
+ ulong textureSize = PVRTexLib.PVRTexLibGetTextureDataSize(header, -1, true, true);
+ if (textureSize == 0)
+ return;
+
+ /*
+ BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
+ var length = bitmapData.Stride * bitmapData.Height;
+ byte[] bytes = new byte[length];
+ Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
+ bmp.UnlockBits(bitmapData);
+ */
+
+ uint bytesPerPixel = PVRTexLib.PVRTexLibGetTextureBitsPerPixel(header) / 8U;
+
+ // Number of pixel for this (2D) surface
+ uint numPixels = (uint)(bmp.Width * bmp.Height);
+
+ byte[] data = new byte[numPixels * bytesPerPixel];
+
+ // All pixels in this surface
+ for (uint pixel = 0U; pixel < numPixels; ++pixel)
+ {
+ uint currPixel = pixel * bytesPerPixel;
+
+ Color col = bmp.GetPixel((int)(pixel % bmp.Width), (int)(pixel / bmp.Width));
+ data[currPixel] = col.R;
+ data[currPixel + 1] = col.G;
+ data[currPixel + 2] = col.B;
+ data[currPixel + 3] = col.A;
+ }
+
+ //bytes = data;
+
+ IntPtr texPtr = Marshal.AllocHGlobal(data.Length);
+ Marshal.Copy(data, 0, texPtr, data.Length);
+
+ tex = PVRTexLib.PVRTexLibCreateTexture(header, texPtr);
+
+ Marshal.FreeHGlobal(texPtr);
+
+ if (format != "r8g8b8a8")
+ TranscodeTex(format);
+ }
+
+ ~PVRFile()
+ {
+ if (!ReferenceEquals(tex, null))
+ PVRTexLib.PVRTexLibDestroyTexture(tex);
+ }
+
+ public string GetFormat()
+ {
+ if (ReferenceEquals(tex, null))
+ return "";
+
+ ulong val = PVRTexLib.PVRTexLibGetTexturePixelFormat(tex);
+
+ return FormatULongToString(val);
+ }
+
+ public static string FormatULongToString(ulong format)
+ {
+ char c1 = (char)(format & 0xFF);
+ char c2 = (char)((format >> 8) & 0xFF);
+ char c3 = (char)((format >> 16) & 0xFF);
+ char c4 = (char)((format >> 24) & 0xFF);
+ byte n1 = (byte)((format >> 32) & 0xFF);
+ byte n2 = (byte)((format >> 40) & 0xFF);
+ byte n3 = (byte)((format >> 48) & 0xFF);
+ byte n4 = (byte)((format >> 56) & 0xFF);
+
+ return "" + c1 + n1 + c2 + n2 + c3 + n3 + c4 + n4;
+ }
+
+ public static ulong FormatStringToULong(string format)
+ {
+ ulong val = 0;
+ val |= (ulong)(format[0] & 0xFF);
+ val |= ((ulong)(format[2] & 0xFF) << 8);
+ val |= ((ulong)(format[4] & 0xFF) << 16);
+ val |= ((ulong)(format[6] & 0xFF) << 24);
+ val |= (((ulong)(format[1] - '0') & 0xFF) << 32);
+ val |= (((ulong)(format[3] - '0') & 0xFF) << 40);
+ val |= (((ulong)(format[5] - '0') & 0xFF) << 48);
+ val |= (((ulong)(format[7] - '0') & 0xFF) << 56);
+
+ return val;
+ }
+
+ public void TranscodeTex(string format) => TranscodeTex(FormatStringToULong(format));
+ public void TranscodeTex(ulong format)
+ {
+ IntPtr newTex = Transcode(format);
+
+ PVRTexLib.PVRTexLibDestroyTexture(tex);
+
+ tex = newTex;
+ }
+
+ private IntPtr Transcode(string format) => Transcode(FormatStringToULong(format));
+ private IntPtr Transcode(ulong format)
+ {
+ IntPtr newTex = PVRTexLib.PVRTexLibCopyTexture(tex);
+ if (ReferenceEquals(newTex, null))
+ throw new Exception("Couldn't duplicate PVR file.");
+
+ IntPtr newHeader = PVRTexLib.PVRTexLibGetTextureHeaderW(newTex);
+ if (ReferenceEquals(newHeader, null))
+ {
+ PVRTexLib.PVRTexLibDestroyTexture(newTex);
+ throw new Exception("Couldn't get duplicated PVR file header.");
+ }
+
+ PVRTexLibTranscoderOptions options = new PVRTexLibTranscoderOptions();
+ options.SizeofStruct = 48;
+ options.PixelFormat = format;
+ options.ChannelType0 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm;
+ options.ChannelType1 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm;
+ options.ChannelType2 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm;
+ options.ChannelType3 = PVRTexLibVariableType.PVRTLVT_UnsignedByteNorm;
+ options.Colourspace = PVRTexLibColourSpace.PVRTLCS_Linear;
+ options.Quality = PVRTexLibCompressorQuality.PVRTLCQ_PVRTCNormal;
+ options.DoDither = false;
+ options.MaxRange = 1.0f;
+ options.MaxThreads = 0u;
+
+ bool didTranscode = PVRTexLib.PVRTexLibTranscodeTexture(newTex, options);
+ if (!didTranscode)
+ {
+ PVRTexLib.PVRTexLibDestroyTexture(newTex);
+ throw new Exception("Couldn't transcode PVR file.");
+ }
+
+ return newTex;
+ }
+
+ public void Save(string filename)
+ {
+ if (!PVRTexLib.PVRTexLibSaveTextureToFile(tex, filename))
+ throw new Exception("Couldn't save PVR file.");
+ }
+
+ public byte[] Save()
+ {
+ string fn = System.IO.Path.GetTempFileName();
+
+ Save(fn);
+
+ byte[] bytes = File.ReadAllBytes(fn);
+
+ File.Delete(fn);
+
+ return bytes;
+ }
+
+ public Bitmap AsBitmap(uint level=0, uint array=0, uint face=0, uint slice=0)
+ {
+ IntPtr newTex = Transcode("r8g8b8a8");
+ IntPtr newHeader = PVRTexLib.PVRTexLibGetTextureHeaderW(newTex);
+
+ uint bytesPerPixel = PVRTexLib.PVRTexLibGetTextureBitsPerPixel(newHeader) / 8U;
+ if (bytesPerPixel != 4)
+ {
+ PVRTexLib.PVRTexLibDestroyTexture(newTex);
+ throw new Exception("PVR transcoding failed.");
+ }
+
+ // Width and height for this Mip level
+ uint levelWidth = PVRTexLib.PVRTexLibGetTextureWidth(newHeader, level);
+ uint levelHeight = PVRTexLib.PVRTexLibGetTextureHeight(newHeader, level);
+
+ Bitmap bmp = new Bitmap((int)levelWidth, (int)levelHeight);
+
+ // Number of pixel for this (2D) surface
+ uint numPixels = levelWidth * levelHeight;
+
+ IntPtr data = PVRTexLib.PVRTexLibGetTextureDataPtr(newTex, level, array, face, slice);
+ if (ReferenceEquals(data, null))
+ {
+ PVRTexLib.PVRTexLibDestroyTexture(newTex);
+ throw new Exception("Couldn't get pixel data for transcoded PVR file.");
+ }
+
+
+ // All pixels in this surface
+ for (uint pixel = 0U; pixel < numPixels; ++pixel)
+ {
+ byte[] px = new byte[bytesPerPixel];
+ Marshal.Copy(data, px, 0, (int)bytesPerPixel);
+
+ bmp.SetPixel((int)(pixel % levelWidth), (int)(pixel / levelWidth), Color.FromArgb(px[3], px[0], px[1], px[2]));
+
+ data = IntPtr.Add(data, (int)bytesPerPixel);
+ }
+
+ PVRTexLib.PVRTexLibDestroyTexture(newTex);
+
+ return bmp;
+ }
+ }
+}
diff --git a/ABStudio/FileFormats/PVR/PVRTexLib.cs b/ABStudio/FileFormats/PVR/PVRTexLib.cs
new file mode 100644
index 0000000..d60eeb9
--- /dev/null
+++ b/ABStudio/FileFormats/PVR/PVRTexLib.cs
@@ -0,0 +1,4451 @@
+// ----------------------------------------------------------------------------
+//
+// This is autogenerated code by CppSharp.
+// Do not edit this file or all your changes will be lost after re-generation.
+//
+// ----------------------------------------------------------------------------
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+using __CallingConvention = global::System.Runtime.InteropServices.CallingConvention;
+using __IntPtr = global::System.IntPtr;
+
+#pragma warning disable CS0109 // Member does not hide an inherited member; new keyword is not required
+
+namespace ABStudio.FileFormats.PVR
+{
+ /// ***********************************************************************
+ ///
+ /// Values for each meta data type that PVRTexLib knows about.
+ /// Texture arrays hinge on each surface being identical in all
+ /// but content, including meta data. If the meta data varies even
+ /// slightly then a new texture should be used.
+ /// It is possible to write your own extension to get around this however.
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibMetaData
+ {
+ PVRTLMD_TextureAtlasCoords = 0,
+ PVRTLMD_BumpData = 1,
+ PVRTLMD_CubeMapOrder = 2,
+ PVRTLMD_TextureOrientation = 3,
+ PVRTLMD_BorderData = 4,
+ PVRTLMD_Padding = 5,
+ PVRTLMD_PerChannelType = 6,
+ PVRTLMD_SupercompressionGlobalData = 7,
+ PVRTLMD_MaxRange = 8,
+ PVRTLMD_NumMetaDataTypes = 9
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Axis
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibAxis
+ {
+ PVRTLA_X = 0,
+ PVRTLA_Y = 1,
+ PVRTLA_Z = 2
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Image orientations per axis
+ /// ***********************************************************************
+ ///
+ [Flags]
+ public enum PVRTexLibOrientation
+ {
+ PVRTLO_Left = 1,
+ PVRTLO_Right = 0,
+ PVRTLO_Up = 2,
+ PVRTLO_Down = 0,
+ PVRTLO_Out = 4,
+ PVRTLO_In = 0
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Describes the colour space of the texture
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibColourSpace
+ {
+ PVRTLCS_Linear = 0,
+ PVRTLCS_sRGB = 1,
+ PVRTLCS_BT601 = 2,
+ PVRTLCS_BT709 = 3,
+ PVRTLCS_BT2020 = 4,
+ PVRTLCS_NumSpaces = 5
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Channel names for non-compressed formats
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibChannelName
+ {
+ PVRTLCN_NoChannel = 0,
+ PVRTLCN_Red = 1,
+ PVRTLCN_Green = 2,
+ PVRTLCN_Blue = 3,
+ PVRTLCN_Alpha = 4,
+ PVRTLCN_Luminance = 5,
+ PVRTLCN_Intensity = 6,
+ PVRTLCN_Depth = 7,
+ PVRTLCN_Stencil = 8,
+ PVRTLCN_Unspecified = 9,
+ PVRTLCN_NumChannels = 10
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Compressed pixel formats that PVRTexLib understands
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibPixelFormat
+ {
+ PVRTLPF_PVRTCI_2bppRGB = 0,
+ PVRTLPF_PVRTCI_2bppRGBA = 1,
+ PVRTLPF_PVRTCI_4bppRGB = 2,
+ PVRTLPF_PVRTCI_4bppRGBA = 3,
+ PVRTLPF_PVRTCII_2bpp = 4,
+ PVRTLPF_PVRTCII_4bpp = 5,
+ PVRTLPF_ETC1 = 6,
+ PVRTLPF_DXT1 = 7,
+ PVRTLPF_DXT2 = 8,
+ PVRTLPF_DXT3 = 9,
+ PVRTLPF_DXT4 = 10,
+ PVRTLPF_DXT5 = 11,
+ PVRTLPF_BC1 = 7,
+ PVRTLPF_BC2 = 9,
+ PVRTLPF_BC3 = 11,
+ PVRTLPF_BC4 = 12,
+ PVRTLPF_BC5 = 13,
+ PVRTLPF_BC6 = 14,
+ PVRTLPF_BC7 = 15,
+ PVRTLPF_UYVY_422 = 16,
+ PVRTLPF_YUY2_422 = 17,
+ PVRTLPF_BW1bpp = 18,
+ PVRTLPF_SharedExponentR9G9B9E5 = 19,
+ PVRTLPF_RGBG8888 = 20,
+ PVRTLPF_GRGB8888 = 21,
+ PVRTLPF_ETC2RGB = 22,
+ PVRTLPF_ETC2RGBA = 23,
+ PVRTLPF_ETC2RGB_A1 = 24,
+ PVRTLPF_EAC_R11 = 25,
+ PVRTLPF_EAC_RG11 = 26,
+ PVRTLPF_ASTC_4x4 = 27,
+ PVRTLPF_ASTC_5x4 = 28,
+ PVRTLPF_ASTC_5x5 = 29,
+ PVRTLPF_ASTC_6x5 = 30,
+ PVRTLPF_ASTC_6x6 = 31,
+ PVRTLPF_ASTC_8x5 = 32,
+ PVRTLPF_ASTC_8x6 = 33,
+ PVRTLPF_ASTC_8x8 = 34,
+ PVRTLPF_ASTC_10x5 = 35,
+ PVRTLPF_ASTC_10x6 = 36,
+ PVRTLPF_ASTC_10x8 = 37,
+ PVRTLPF_ASTC_10x10 = 38,
+ PVRTLPF_ASTC_12x10 = 39,
+ PVRTLPF_ASTC_12x12 = 40,
+ PVRTLPF_ASTC_3x3x3 = 41,
+ PVRTLPF_ASTC_4x3x3 = 42,
+ PVRTLPF_ASTC_4x4x3 = 43,
+ PVRTLPF_ASTC_4x4x4 = 44,
+ PVRTLPF_ASTC_5x4x4 = 45,
+ PVRTLPF_ASTC_5x5x4 = 46,
+ PVRTLPF_ASTC_5x5x5 = 47,
+ PVRTLPF_ASTC_6x5x5 = 48,
+ PVRTLPF_ASTC_6x6x5 = 49,
+ PVRTLPF_ASTC_6x6x6 = 50,
+ PVRTLPF_BASISU_ETC1S = 51,
+ PVRTLPF_BASISU_UASTC = 52,
+ PVRTLPF_RGBM = 53,
+ PVRTLPF_RGBD = 54,
+ PVRTLPF_PVRTCI_HDR_6bpp = 55,
+ PVRTLPF_PVRTCI_HDR_8bpp = 56,
+ PVRTLPF_PVRTCII_HDR_6bpp = 57,
+ PVRTLPF_PVRTCII_HDR_8bpp = 58,
+ PVRTLPF_VYUA10MSB_444 = 59,
+ PVRTLPF_VYUA10LSB_444 = 60,
+ PVRTLPF_VYUA12MSB_444 = 61,
+ PVRTLPF_VYUA12LSB_444 = 62,
+ PVRTLPF_UYV10A2_444 = 63,
+ PVRTLPF_UYVA16_444 = 64,
+ PVRTLPF_YUYV16_422 = 65,
+ PVRTLPF_UYVY16_422 = 66,
+ PVRTLPF_YUYV10MSB_422 = 67,
+ PVRTLPF_YUYV10LSB_422 = 68,
+ PVRTLPF_UYVY10MSB_422 = 69,
+ PVRTLPF_UYVY10LSB_422 = 70,
+ PVRTLPF_YUYV12MSB_422 = 71,
+ PVRTLPF_YUYV12LSB_422 = 72,
+ PVRTLPF_UYVY12MSB_422 = 73,
+ PVRTLPF_UYVY12LSB_422 = 74,
+ PVRTLPF_YUV_3P_444 = 270,
+ PVRTLPF_YUV10MSB_3P_444 = 271,
+ PVRTLPF_YUV10LSB_3P_444 = 272,
+ PVRTLPF_YUV12MSB_3P_444 = 273,
+ PVRTLPF_YUV12LSB_3P_444 = 274,
+ PVRTLPF_YUV16_3P_444 = 275,
+ PVRTLPF_YUV_3P_422 = 276,
+ PVRTLPF_YUV10MSB_3P_422 = 277,
+ PVRTLPF_YUV10LSB_3P_422 = 278,
+ PVRTLPF_YUV12MSB_3P_422 = 279,
+ PVRTLPF_YUV12LSB_3P_422 = 280,
+ PVRTLPF_YUV16_3P_422 = 281,
+ PVRTLPF_YUV_3P_420 = 282,
+ PVRTLPF_YUV10MSB_3P_420 = 283,
+ PVRTLPF_YUV10LSB_3P_420 = 284,
+ PVRTLPF_YUV12MSB_3P_420 = 285,
+ PVRTLPF_YUV12LSB_3P_420 = 286,
+ PVRTLPF_YUV16_3P_420 = 287,
+ PVRTLPF_YVU_3P_420 = 288,
+ PVRTLPF_YUV_2P_422 = 480,
+ PVRTLPF_YUV10MSB_2P_422 = 481,
+ PVRTLPF_YUV10LSB_2P_422 = 482,
+ PVRTLPF_YUV12MSB_2P_422 = 483,
+ PVRTLPF_YUV12LSB_2P_422 = 484,
+ PVRTLPF_YUV16_2P_422 = 485,
+ PVRTLPF_YUV_2P_420 = 486,
+ PVRTLPF_YUV10MSB_2P_420 = 487,
+ PVRTLPF_YUV10LSB_2P_420 = 488,
+ PVRTLPF_YUV12MSB_2P_420 = 489,
+ PVRTLPF_YUV12LSB_2P_420 = 490,
+ PVRTLPF_YUV16_2P_420 = 491,
+ PVRTLPF_YUV_2P_444 = 492,
+ PVRTLPF_YVU_2P_444 = 493,
+ PVRTLPF_YUV10MSB_2P_444 = 494,
+ PVRTLPF_YUV10LSB_2P_444 = 495,
+ PVRTLPF_YVU10MSB_2P_444 = 496,
+ PVRTLPF_YVU10LSB_2P_444 = 497,
+ PVRTLPF_YVU_2P_422 = 498,
+ PVRTLPF_YVU10MSB_2P_422 = 499,
+ PVRTLPF_YVU10LSB_2P_422 = 500,
+ PVRTLPF_YVU_2P_420 = 501,
+ PVRTLPF_YVU10MSB_2P_420 = 502,
+ PVRTLPF_YVU10LSB_2P_420 = 503,
+ PVRTLPF_NumCompressedPFs = 504
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Data types. Describes how the data is interpreted by PVRTexLib and
+ /// how the pointer returned by PVRTexLib_GetTextureDataPtr() should
+ /// be interpreted.
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibVariableType
+ {
+ PVRTLVT_UnsignedByteNorm = 0,
+ PVRTLVT_SignedByteNorm = 1,
+ PVRTLVT_UnsignedByte = 2,
+ PVRTLVT_SignedByte = 3,
+ PVRTLVT_UnsignedShortNorm = 4,
+ PVRTLVT_SignedShortNorm = 5,
+ PVRTLVT_UnsignedShort = 6,
+ PVRTLVT_SignedShort = 7,
+ PVRTLVT_UnsignedIntegerNorm = 8,
+ PVRTLVT_SignedIntegerNorm = 9,
+ PVRTLVT_UnsignedInteger = 10,
+ PVRTLVT_SignedInteger = 11,
+ PVRTLVT_SignedFloat = 12,
+ PVRTLVT_Float = 12,
+ PVRTLVT_UnsignedFloat = 13,
+ PVRTLVT_NumVarTypes = 14,
+ PVRTLVT_Invalid = 255
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Quality level to compress the texture with. Applies to PVRTC,
+ /// ETC, ASTC, BASIS and IMGIC formats.
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibCompressorQuality
+ {
+ /// PVRTC fastest
+ PVRTLCQ_PVRTCFastest = 0,
+ /// PVRTC fast
+ PVRTLCQ_PVRTCFast = 1,
+ /// PVRTC low
+ PVRTLCQ_PVRTCLow = 2,
+ /// PVRTC normal
+ PVRTLCQ_PVRTCNormal = 3,
+ /// PVRTC high
+ PVRTLCQ_PVRTCHigh = 4,
+ /// PVRTC very high
+ PVRTLCQ_PVRTCVeryHigh = 5,
+ /// PVRTC thorough
+ PVRTLCQ_PVRTCThorough = 6,
+ /// PVRTC best
+ PVRTLCQ_PVRTCBest = 7,
+ /// Number of PVRTC modes
+ PVRTLCQ_NumPVRTCModes = 8,
+ /// ETC fast
+ PVRTLCQ_ETCFast = 0,
+ /// ETC normal
+ PVRTLCQ_ETCNormal = 1,
+ /// ETC slow
+ PVRTLCQ_ETCSlow = 2,
+ /// Number of ETC modes
+ PVRTLCQ_NumETCModes = 3,
+ /// ASTC very fast
+ PVRTLCQ_ASTCVeryFast = 0,
+ /// ASTC fast
+ PVRTLCQ_ASTCFast = 1,
+ /// ASTC medium
+ PVRTLCQ_ASTCMedium = 2,
+ /// ASTC thorough
+ PVRTLCQ_ASTCThorough = 3,
+ /// ASTC exhaustive
+ PVRTLCQ_ASTCExhaustive = 4,
+ /// Number of ASTC modes
+ PVRTLCQ_NumASTCModes = 5,
+ /// BASISU lowest quality
+ PVRTLCQ_BASISULowest = 0,
+ /// BASISU low quality
+ PVRTLCQ_BASISULow = 1,
+ /// BASISU normal quality
+ PVRTLCQ_BASISUNormal = 2,
+ /// BASISU high quality
+ PVRTLCQ_BASISUHigh = 3,
+ /// BASISU best quality
+ PVRTLCQ_BASISUBest = 4,
+ /// Number of BASISU modes
+ PVRTLCQ_NumBASISUModes = 5
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Filter to apply when resizing an image
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibResizeMode
+ {
+ /// Nearest filtering
+ PVRTLRM_Nearest = 0,
+ /// Linear filtering
+ PVRTLRM_Linear = 1,
+ /// Cubic filtering, uses Catmull-Rom splines.
+ PVRTLRM_Cubic = 2,
+ /// Number of resize modes
+ PVRTLRM_Modes = 3
+ }
+
+ /// ***********************************************************************
+ ///
+ /// File container type
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibFileContainerType
+ {
+ /// PVR: https://docs.imgtec.com/Specifications/PVR_File_Format_Specification/topics/pvr_intro.html
+ PVRTLFCT_PVR = 0,
+ /// KTX version 1: https://www.khronos.org/registry/KTX/specs/1.0/ktxspec_v1.html
+ PVRTLFCT_KTX = 1,
+ /// KTX version 2: https://github.khronos.org/KTX-Specification/
+ PVRTLFCT_KTX2 = 2,
+ /// ASTC compressed textures only: https://github.com/ARM-software/astc-encoder
+ PVRTLFCT_ASTC = 3,
+ /// Basis Universal compressed textures only: https://github.com/BinomialLLC/basis_universal
+ PVRTLFCT_BASIS = 4,
+ /// DirectDraw Surface: https://docs.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-reference
+ PVRTLFCT_DDS = 5,
+ /// C style header
+ PVRTLFCT_CHeader = 6
+ }
+
+ /// ***********************************************************************
+ ///
+ /// The clamping mode to use when performing a colour diff
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibColourDiffMode
+ {
+ /// Absolute
+ PVRTLCDM_Abs = 0,
+ /// Signed
+ PVRTLCDM_Signed = 1
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Legacy API enum.
+ /// ***********************************************************************
+ ///
+ public enum PVRTexLibLegacyApi
+ {
+ /// OpenGL ES 1.x
+ PVRTLLAPI_OGLES = 1,
+ /// OpenGL ES 2.0
+ PVRTLLAPI_OGLES2 = 2,
+ /// Direct 3D M
+ PVRTLLAPI_D3DM = 3,
+ /// Open GL
+ PVRTLLAPI_OGL = 4,
+ /// DirextX 9
+ PVRTLLAPI_DX9 = 5,
+ /// DirectX 10
+ PVRTLLAPI_DX10 = 6,
+ /// Open VG
+ PVRTLLAPI_OVG = 7,
+ /// MGL
+ PVRTLLAPI_MGL = 8
+ }
+
+ ///
+ /// **************************************************************************
+ /// * Integer types
+ /// **************************************************************************
+ ///
+ public unsafe partial class PVRTextureHeaderV3 : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 52, Pack = 4)]
+ public partial struct __Internal
+ {
+ internal uint u32Version;
+ internal uint u32Flags;
+ internal ulong u64PixelFormat;
+ internal uint u32ColourSpace;
+ internal uint u32ChannelType;
+ internal uint u32Height;
+ internal uint u32Width;
+ internal uint u32Depth;
+ internal uint u32NumSurfaces;
+ internal uint u32NumFaces;
+ internal uint u32MIPMapCount;
+ internal uint u32MetaDataSize;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTextureHeaderV3@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTextureHeaderV3 managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTextureHeaderV3 managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTextureHeaderV3 __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTextureHeaderV3(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTextureHeaderV3 __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTextureHeaderV3)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTextureHeaderV3 __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTextureHeaderV3(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTextureHeaderV3(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTextureHeaderV3(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTextureHeaderV3()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTextureHeaderV3.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTextureHeaderV3(PVRTextureHeaderV3 _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTextureHeaderV3.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTextureHeaderV3.__Internal*)__Instance) = *((PVRTextureHeaderV3.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// Version of the file header, used to identify it.
+ public uint U32Version
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Version;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Version = value;
+ }
+ }
+
+ /// Various format flags.
+ public uint U32Flags
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Flags;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Flags = value;
+ }
+ }
+
+ /// The pixel format, 8cc value storing the 4 channel identifiers and their respective sizes.
+ public ulong U64PixelFormat
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u64PixelFormat;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u64PixelFormat = value;
+ }
+ }
+
+ /// The Colour Space of the texture, currently either linear RGB or sRGB.
+ public uint U32ColourSpace
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32ColourSpace;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32ColourSpace = value;
+ }
+ }
+
+ /// Variable type that the channel is stored in. Supports signed/unsigned int/short/byte or float for now.
+ public uint U32ChannelType
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32ChannelType;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32ChannelType = value;
+ }
+ }
+
+ /// Height of the texture.
+ public uint U32Height
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Height;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Height = value;
+ }
+ }
+
+ /// Width of the texture.
+ public uint U32Width
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Width;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Width = value;
+ }
+ }
+
+ /// Depth of the texture. (Z-slices)
+ public uint U32Depth
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Depth;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Depth = value;
+ }
+ }
+
+ /// Number of members in a Texture Array.
+ public uint U32NumSurfaces
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32NumSurfaces;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32NumSurfaces = value;
+ }
+ }
+
+ /// Number of faces in a Cube Map. Maybe be a value other than 6.
+ public uint U32NumFaces
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32NumFaces;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32NumFaces = value;
+ }
+ }
+
+ /// Number of MIP Maps in the texture - NB: Includes top level.
+ public uint U32MIPMapCount
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32MIPMapCount;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32MIPMapCount = value;
+ }
+ }
+
+ /// Size of the accompanying meta data.
+ public uint U32MetaDataSize
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32MetaDataSize;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32MetaDataSize = value;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Structure containing various texture header parameters for
+ /// PVRTexLib_CreateTextureHeader().
+ /// ***********************************************************************
+ ///
+ public unsafe partial class PVRHeaderCreateParams : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 48)]
+ public partial struct __Internal
+ {
+ internal ulong pixelFormat;
+ internal uint width;
+ internal uint height;
+ internal uint depth;
+ internal uint numMipMaps;
+ internal uint numArrayMembers;
+ internal uint numFaces;
+ internal PVRTexLibColourSpace colourSpace;
+ internal PVRTexLibVariableType channelType;
+ internal byte preMultiplied;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRHeader_CreateParams@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRHeaderCreateParams managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRHeaderCreateParams managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRHeaderCreateParams __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRHeaderCreateParams(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRHeaderCreateParams __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRHeaderCreateParams)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRHeaderCreateParams __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRHeaderCreateParams(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRHeaderCreateParams(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRHeaderCreateParams(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRHeaderCreateParams()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRHeaderCreateParams.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRHeaderCreateParams(PVRHeaderCreateParams _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRHeaderCreateParams.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRHeaderCreateParams.__Internal*)__Instance) = *((PVRHeaderCreateParams.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// pixel format
+ public ulong PixelFormat
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->pixelFormat;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->pixelFormat = value;
+ }
+ }
+
+ /// texture width
+ public uint Width
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->width;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->width = value;
+ }
+ }
+
+ /// texture height
+ public uint Height
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->height;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->height = value;
+ }
+ }
+
+ /// texture depth
+ public uint Depth
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->depth;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->depth = value;
+ }
+ }
+
+ /// number of MIP maps
+ public uint NumMipMaps
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->numMipMaps;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->numMipMaps = value;
+ }
+ }
+
+ /// number of array members
+ public uint NumArrayMembers
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->numArrayMembers;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->numArrayMembers = value;
+ }
+ }
+
+ /// number of faces
+ public uint NumFaces
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->numFaces;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->numFaces = value;
+ }
+ }
+
+ /// colour space
+ public PVRTexLibColourSpace ColourSpace
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->colourSpace;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->colourSpace = value;
+ }
+ }
+
+ /// channel type
+ public PVRTexLibVariableType ChannelType
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->channelType;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->channelType = value;
+ }
+ }
+
+ /// has the RGB been pre-multiplied by the alpha?
+ public bool PreMultiplied
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->preMultiplied != 0;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->preMultiplied = (byte)(value ? 1 : 0);
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Structure containing a textures orientation in each axis.
+ /// ***********************************************************************
+ ///
+ public unsafe partial class PVRTexLib_Orientation : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 12)]
+ public partial struct __Internal
+ {
+ internal PVRTexLibOrientation x;
+ internal PVRTexLibOrientation y;
+ internal PVRTexLibOrientation z;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_Orientation@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLib_Orientation managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLib_Orientation managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTexLib_Orientation __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTexLib_Orientation(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTexLib_Orientation __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTexLib_Orientation)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTexLib_Orientation __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTexLib_Orientation(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTexLib_Orientation(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTexLib_Orientation(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTexLib_Orientation()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLib_Orientation.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTexLib_Orientation(PVRTexLib_Orientation _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLib_Orientation.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLib_Orientation.__Internal*)__Instance) = *((PVRTexLib_Orientation.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// X axis orientation
+ public PVRTexLibOrientation X
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->x;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->x = value;
+ }
+ }
+
+ /// Y axis orientation
+ public PVRTexLibOrientation Y
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->y;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->y = value;
+ }
+ }
+
+ /// Z axis orientation
+ public PVRTexLibOrientation Z
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->z;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->z = value;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Structure containing a OpenGL[ES] format.
+ /// ***********************************************************************
+ ///
+ public unsafe partial class PVRTexLibOpenGLFormat : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 12)]
+ public partial struct __Internal
+ {
+ internal uint internalFormat;
+ internal uint format;
+ internal uint type;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_OpenGLFormat@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibOpenGLFormat managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibOpenGLFormat managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTexLibOpenGLFormat __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTexLibOpenGLFormat(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTexLibOpenGLFormat __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTexLibOpenGLFormat)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTexLibOpenGLFormat __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTexLibOpenGLFormat(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTexLibOpenGLFormat(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTexLibOpenGLFormat(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTexLibOpenGLFormat()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibOpenGLFormat.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTexLibOpenGLFormat(PVRTexLibOpenGLFormat _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibOpenGLFormat.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLibOpenGLFormat.__Internal*)__Instance) = *((PVRTexLibOpenGLFormat.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// GL internal format
+ public uint InternalFormat
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->internalFormat;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->internalFormat = value;
+ }
+ }
+
+ /// GL format
+ public uint Format
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->format;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->format = value;
+ }
+ }
+
+ /// GL type
+ public uint Type
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->type;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->type = value;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Structure containing a block of meta data for a texture.
+ /// ***********************************************************************
+ ///
+ public unsafe partial class PVRTexLibMetaDataBlock : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 24)]
+ public partial struct __Internal
+ {
+ internal uint DevFOURCC;
+ internal uint u32Key;
+ internal uint u32DataSize;
+ internal __IntPtr Data;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_MetaDataBlock@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibMetaDataBlock managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibMetaDataBlock managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTexLibMetaDataBlock __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTexLibMetaDataBlock(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTexLibMetaDataBlock __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTexLibMetaDataBlock)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTexLibMetaDataBlock __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTexLibMetaDataBlock(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTexLibMetaDataBlock(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTexLibMetaDataBlock(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTexLibMetaDataBlock()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibMetaDataBlock.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTexLibMetaDataBlock(PVRTexLibMetaDataBlock _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibMetaDataBlock.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLibMetaDataBlock.__Internal*)__Instance) = *((PVRTexLibMetaDataBlock.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// A 4cc descriptor of the data type's creator. Values starting with 'PVR' are reserved for PVRTexLib.
+ public uint DevFOURCC
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->DevFOURCC;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->DevFOURCC = value;
+ }
+ }
+
+ /// A unique value identifying the data type, and thus how to read it. For example PVRTexLibMetaData.
+ public uint U32Key
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32Key;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32Key = value;
+ }
+ }
+
+ /// Size of 'Data' in bytes.
+ public uint U32DataSize
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->u32DataSize;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->u32DataSize = value;
+ }
+ }
+
+ /// Meta data bytes
+ public byte* Data
+ {
+ get
+ {
+ return (byte*)((__Internal*)__Instance)->Data;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->Data = (__IntPtr)value;
+ }
+ }
+ }
+
+ public unsafe partial class PVRTexLibTranscoderOptions : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 48, Pack = 4)]
+ public partial struct __Internal
+ {
+ internal uint sizeofStruct;
+ internal ulong pixelFormat;
+ internal fixed int channelType[4];
+ internal PVRTexLibColourSpace colourspace;
+ internal PVRTexLibCompressorQuality quality;
+ internal byte doDither;
+ internal float maxRange;
+ internal uint maxThreads;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_TranscoderOptions@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibTranscoderOptions managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibTranscoderOptions managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTexLibTranscoderOptions __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTexLibTranscoderOptions(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTexLibTranscoderOptions __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTexLibTranscoderOptions)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTexLibTranscoderOptions __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTexLibTranscoderOptions(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTexLibTranscoderOptions(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTexLibTranscoderOptions(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTexLibTranscoderOptions()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibTranscoderOptions.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTexLibTranscoderOptions(PVRTexLibTranscoderOptions _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibTranscoderOptions.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLibTranscoderOptions.__Internal*)__Instance) = *((PVRTexLibTranscoderOptions.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// For versioning - sizeof(PVRTexLib_TranscoderOptions)
+ public uint SizeofStruct
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->sizeofStruct;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->sizeofStruct = value;
+ }
+ }
+
+ /// Pixel format type
+ public ulong PixelFormat
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->pixelFormat;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->pixelFormat = value;
+ }
+ }
+
+ /// Per-channel variable type.
+ public PVRTexLibVariableType ChannelType0
+ {
+ get
+ {
+ return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[0];
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->channelType[0] = (int)value;
+ }
+ }
+
+ /// Per-channel variable type.
+ public PVRTexLibVariableType ChannelType1
+ {
+ get
+ {
+ return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[1];
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->channelType[1] = (int)value;
+ }
+ }
+
+ /// Per-channel variable type.
+ public PVRTexLibVariableType ChannelType2
+ {
+ get
+ {
+ return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[2];
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->channelType[2] = (int)value;
+ }
+ }
+
+ /// Per-channel variable type.
+ public PVRTexLibVariableType ChannelType3
+ {
+ get
+ {
+ return (PVRTexLibVariableType)((__Internal*)__Instance)->channelType[3];
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->channelType[3] = (int)value;
+ }
+ }
+
+ /// Colour space
+ public PVRTexLibColourSpace Colourspace
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->colourspace;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->colourspace = value;
+ }
+ }
+
+ /// Compression quality for PVRTC, ASTC, ETC, BASISU and IMGIC, higher quality usually requires more processing time.
+ public PVRTexLibCompressorQuality Quality
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->quality;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->quality = value;
+ }
+ }
+
+ /// Apply dithering to lower precision formats.
+ public bool DoDither
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->doDither != 0;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->doDither = (byte)(value ? 1 : 0);
+ }
+ }
+
+ /// Max range value for RGB[M|D] encoding
+ public float MaxRange
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->maxRange;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->maxRange = value;
+ }
+ }
+
+ /// Max number of threads to use for transcoding, if set to 0 PVRTexLib will use all available cores.
+ public uint MaxThreads
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->maxThreads;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->maxThreads = value;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Structure containing the resulting error metrics computed by:
+ /// PVRTexLib_MaxDifference(),
+ /// PVRTexLib_MeanError(),
+ /// PVRTexLib_MeanSquaredError(),
+ /// PVRTexLib_RootMeanSquaredError(),
+ /// PVRTexLib_StandardDeviation(),
+ /// PVRTexLib_PeakSignalToNoiseRatio().
+ /// ***********************************************************************
+ ///
+ public unsafe partial class PVRTexLibErrorMetrics : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 80)]
+ public partial struct __Internal
+ {
+ internal fixed byte channels[64];
+ internal double allChannels;
+ internal double rgbChannels;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0PVRTexLib_ErrorMetrics@@QEAA@AEBU0@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr _0);
+ }
+
+ public unsafe partial class _0 : IDisposable
+ {
+ [StructLayout(LayoutKind.Sequential, Size = 16)]
+ public partial struct __Internal
+ {
+ internal PVRTexLibChannelName name;
+ internal double value;
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "??0@PVRTexLib_ErrorMetrics@@QEAA@AEBU01@@Z", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr cctor(__IntPtr __instance, __IntPtr __0);
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibErrorMetrics._0 managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibErrorMetrics._0 managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static _0 __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new _0(native.ToPointer(), skipVTables);
+ }
+
+ internal static _0 __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (_0)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static _0 __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new _0(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private _0(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected _0(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public _0()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics._0.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public _0(PVRTexLibErrorMetrics._0 __0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics._0.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLibErrorMetrics._0.__Internal*)__Instance) = *((PVRTexLibErrorMetrics._0.__Internal*)__0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// Channel name. PVRTLCN_NoChannel indicates invalid entry.
+ public PVRTexLibChannelName Name
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->name;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->name = value;
+ }
+ }
+
+ /// Value for this channel.
+ public double Value
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->value;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->value = value;
+ }
+ }
+ }
+
+ public __IntPtr __Instance { get; protected set; }
+
+ internal static readonly new global::System.Collections.Concurrent.ConcurrentDictionary NativeToManagedMap =
+ new global::System.Collections.Concurrent.ConcurrentDictionary();
+
+ internal static void __RecordNativeToManagedMapping(IntPtr native, PVRTexLibErrorMetrics managed)
+ {
+ NativeToManagedMap[native] = managed;
+ }
+
+ internal static bool __TryGetNativeToManagedMapping(IntPtr native, out PVRTexLibErrorMetrics managed)
+ {
+
+ return NativeToManagedMap.TryGetValue(native, out managed);
+ }
+
+ protected bool __ownsNativeInstance;
+
+ internal static PVRTexLibErrorMetrics __CreateInstance(__IntPtr native, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ return new PVRTexLibErrorMetrics(native.ToPointer(), skipVTables);
+ }
+
+ internal static PVRTexLibErrorMetrics __GetOrCreateInstance(__IntPtr native, bool saveInstance = false, bool skipVTables = false)
+ {
+ if (native == __IntPtr.Zero)
+ return null;
+ if (__TryGetNativeToManagedMapping(native, out var managed))
+ return (PVRTexLibErrorMetrics)managed;
+ var result = __CreateInstance(native, skipVTables);
+ if (saveInstance)
+ __RecordNativeToManagedMapping(native, result);
+ return result;
+ }
+
+ internal static PVRTexLibErrorMetrics __CreateInstance(__Internal native, bool skipVTables = false)
+ {
+ return new PVRTexLibErrorMetrics(native, skipVTables);
+ }
+
+ private static void* __CopyValue(__Internal native)
+ {
+ var ret = Marshal.AllocHGlobal(sizeof(__Internal));
+ *(__Internal*)ret = native;
+ return ret.ToPointer();
+ }
+
+ private PVRTexLibErrorMetrics(__Internal native, bool skipVTables = false)
+ : this(__CopyValue(native), skipVTables)
+ {
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ protected PVRTexLibErrorMetrics(void* native, bool skipVTables = false)
+ {
+ if (native == null)
+ return;
+ __Instance = new __IntPtr(native);
+ }
+
+ public PVRTexLibErrorMetrics()
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ }
+
+ public PVRTexLibErrorMetrics(PVRTexLibErrorMetrics _0)
+ {
+ __Instance = Marshal.AllocHGlobal(sizeof(PVRTexLibErrorMetrics.__Internal));
+ __ownsNativeInstance = true;
+ __RecordNativeToManagedMapping(__Instance, this);
+ *((PVRTexLibErrorMetrics.__Internal*)__Instance) = *((PVRTexLibErrorMetrics.__Internal*)_0.__Instance);
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true, callNativeDtor: __ownsNativeInstance);
+ }
+
+ partial void DisposePartial(bool disposing);
+
+ internal protected virtual void Dispose(bool disposing, bool callNativeDtor)
+ {
+ if (__Instance == IntPtr.Zero)
+ return;
+ NativeToManagedMap.TryRemove(__Instance, out _);
+ DisposePartial(disposing);
+ if (__ownsNativeInstance)
+ Marshal.FreeHGlobal(__Instance);
+ __Instance = IntPtr.Zero;
+ }
+
+ /// Per-channel metrics, not all entries have to be valid.
+ public PVRTexLibErrorMetrics._0[] Channels
+ {
+ get
+ {
+ PVRTexLibErrorMetrics._0[] __value = null;
+ if (((__Internal*)__Instance)->channels != null)
+ {
+ __value = new PVRTexLibErrorMetrics._0[4];
+ for (int i = 0; i < 4; i++)
+ __value[i] = PVRTexLibErrorMetrics._0.__GetOrCreateInstance((IntPtr)((PVRTexLibErrorMetrics._0.__Internal*)&(((__Internal*)__Instance)->channels[i * sizeof(PVRTexLibErrorMetrics._0.__Internal)])), true, true);
+ }
+ return __value;
+ }
+
+ set
+ {
+ if (value != null)
+ {
+ if (value.Length != 4)
+ throw new ArgumentOutOfRangeException("value", "The dimensions of the provided array don't match the required size.");
+ for (int i = 0; i < 4; i++)
+ *(PVRTexLibErrorMetrics._0.__Internal*)&((__Internal*)__Instance)->channels[i * sizeof(PVRTexLibErrorMetrics._0.__Internal)] = *(PVRTexLibErrorMetrics._0.__Internal*)value[i].__Instance;
+ }
+ }
+ }
+
+ /// Value for all channels.
+ public double AllChannels
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->allChannels;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->allChannels = value;
+ }
+ }
+
+ /// Value for RGB channels.
+ public double RgbChannels
+ {
+ get
+ {
+ return ((__Internal*)__Instance)->rgbChannels;
+ }
+
+ set
+ {
+ ((__Internal*)__Instance)->rgbChannels = value;
+ }
+ }
+ }
+
+ public unsafe partial class PVRTexLib
+ {
+ public partial struct __Internal
+ {
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetDefaultTextureHeaderParams", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetDefaultTextureHeaderParams(__IntPtr result);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureHeader", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCreateTextureHeader(__IntPtr attribs);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureHeaderFromHeader", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCreateTextureHeaderFromHeader(__IntPtr header, uint metaDataCount, __IntPtr metaData);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTextureHeader", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCopyTextureHeader(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_DestroyTextureHeader", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibDestroyTextureHeader(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureCreateRaw", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibTextureCreateRaw(uint width, uint height, uint depth, uint wMin, uint hMin, uint dMin, uint nBPP, bool bMIPMap, __IntPtr pfnAllocCallback);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureLoadTiled", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibTextureLoadTiled(byte* pDst, uint widthDst, uint heightDst, byte* pSrc, uint widthSrc, uint heightSrc, uint elementSize, bool twiddled);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBitsPerPixel", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureBitsPerPixel(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetFormatBitsPerPixel", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetFormatBitsPerPixel(ulong u64PixelFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureChannelCount", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureChannelCount(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureChannelType", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern PVRTexLibVariableType PVRTexLibGetTextureChannelType(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureColourSpace", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern PVRTexLibColourSpace PVRTexLibGetTextureColourSpace(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureWidth", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureWidth(__IntPtr header, uint mipLevel);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeight", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureHeight(__IntPtr header, uint mipLevel);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDepth", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureDepth(__IntPtr header, uint mipLevel);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureSize", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataSize", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern ulong PVRTexLibGetTextureDataSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOrientation", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureOrientation(__IntPtr header, __IntPtr result);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOpenGLFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureOpenGLFormat(__IntPtr header, __IntPtr result);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureOpenGLESFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureOpenGLESFormat(__IntPtr header, __IntPtr result);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureVulkanFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureVulkanFormat(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureD3DFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureD3DFormat(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDXGIFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureDXGIFormat(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureFormatMinDims", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureFormatMinDims(__IntPtr header, uint* minX, uint* minY, uint* minZ);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetPixelFormatMinDims", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetPixelFormatMinDims(ulong ui64Format, uint* minX, uint* minY, uint* minZ);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureMetaDataSize", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureMetaDataSize(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsPreMultiplied", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGetTextureIsPreMultiplied(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsFileCompressed", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGetTextureIsFileCompressed(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureIsBumpMap", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGetTextureIsBumpMap(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBumpMapScale", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern float PVRTexLibGetTextureBumpMapScale(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetNumTextureAtlasMembers", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetNumTextureAtlasMembers(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureAtlasData", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern float* PVRTexLibGetTextureAtlasData(__IntPtr header, uint* count);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumMipMapLevels", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureNumMipMapLevels(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumFaces", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureNumFaces(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureNumArrayMembers", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern uint PVRTexLibGetTextureNumArrayMembers(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureCubeMapOrder", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureCubeMapOrder(__IntPtr header, sbyte[] cubeOrder);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBumpMapOrder", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureBumpMapOrder(__IntPtr header, sbyte[] bumpOrder);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTexturePixelFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern ulong PVRTexLibGetTexturePixelFormat(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureHasPackedChannelData", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibTextureHasPackedChannelData(__IntPtr header);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannelType", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureChannelType(__IntPtr header, PVRTexLibVariableType type);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureColourSpace", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureColourSpace(__IntPtr header, PVRTexLibColourSpace colourSpace);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureD3DFormat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureD3DFormat(__IntPtr header, uint d3dFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureDXGIFormat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureDXGIFormat(__IntPtr header, uint dxgiFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOGLFormat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureOGLFormat(__IntPtr header, __IntPtr oglFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOGLESFormat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureOGLESFormat(__IntPtr header, __IntPtr oglesFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureVulkanFormat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureVulkanFormat(__IntPtr header, uint vulkanFormat);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTexturePixelFormat", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTexturePixelFormat(__IntPtr header, ulong format);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureWidth", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureWidth(__IntPtr header, uint width);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureHeight", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureHeight(__IntPtr header, uint height);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureDepth", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureDepth(__IntPtr header, uint depth);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumArrayMembers", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureNumArrayMembers(__IntPtr header, uint numMembers);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumMIPLevels", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureNumMIPLevels(__IntPtr header, uint numMIPLevels);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureNumFaces", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureNumFaces(__IntPtr header, uint numFaces);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureOrientation", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureOrientation(__IntPtr header, __IntPtr orientation);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureIsFileCompressed", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureIsFileCompressed(__IntPtr header, bool isFileCompressed);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureIsPreMultiplied", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureIsPreMultiplied(__IntPtr header, bool isPreMultiplied);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureBorder", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureBorder(__IntPtr header, uint* borderWidth, uint* borderHeight, uint* borderDepth);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetMetaDataBlock", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGetMetaDataBlock(__IntPtr header, uint devFOURCC, uint key, __IntPtr dataBlock, __IntPtr pfnAllocCallback);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TextureHasMetaData", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibTextureHasMetaData(__IntPtr header, uint devFOURCC, uint key);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureBumpMap", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureBumpMap(__IntPtr header, float bumpScale, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string bumpOrder);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureAtlas", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureAtlas(__IntPtr header, float* atlasData, uint dataSize);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureCubeMapOrder", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureCubeMapOrder(__IntPtr header, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string cubeMapOrder);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureBorder", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibSetTextureBorder(__IntPtr header, uint borderWidth, uint borderHeight, uint borderDepth);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_AddMetaData", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibAddMetaData(__IntPtr header, __IntPtr dataBlock);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RemoveMetaData", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibRemoveMetaData(__IntPtr header, uint devFOURCC, uint key);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTexture", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCreateTexture(__IntPtr header, __IntPtr data);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTexture", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCopyTexture(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MoveTexture", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibMoveTexture(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_DestroyTexture", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibDestroyTexture(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureFromFile", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCreateTextureFromFile([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CreateTextureFromData", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibCreateTextureFromData(__IntPtr data);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataPtr", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibGetTextureDataPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureDataConstPtr", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibGetTextureDataConstPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeader", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibGetTextureHeader(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureHeaderW", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern __IntPtr PVRTexLibGetTextureHeaderW(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_AddPaddingMetaData", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibAddPaddingMetaData(__IntPtr texture, uint padding);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToFile", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSaveTextureToFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToMemory", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSaveTextureToMemory(__IntPtr texture, PVRTexLibFileContainerType fileType, __IntPtr privateData, ulong* outSize, __IntPtr pfnRealloc);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveSurfaceToImageFile", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSaveSurfaceToImageFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath, uint MIPLevel, uint arrayMember, uint face, uint ZSlice);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SaveTextureToLegacyPVRFile", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSaveTextureToLegacyPVRFile(__IntPtr texture, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string filePath, PVRTexLibLegacyApi api);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_IsTextureMultiPart", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibIsTextureMultiPart(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GetTextureParts", CallingConvention = __CallingConvention.Cdecl)]
+ internal static extern void PVRTexLibGetTextureParts(__IntPtr inTexture, __IntPtr* outTextures, uint* count);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ResizeTexture", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibResizeTexture(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, PVRTexLibResizeMode resizeMode);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ResizeTextureCanvas", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibResizeTextureCanvas(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, int xOffset, int yOffset, int zOffset);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RotateTexture", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibRotateTexture(__IntPtr texture, PVRTexLibAxis rotationAxis, bool forward);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_FlipTexture", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibFlipTexture(__IntPtr texture, PVRTexLibAxis flipDirection);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_BorderTexture", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibBorderTexture(__IntPtr texture, uint borderX, uint borderY, uint borderZ);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_PreMultiplyAlpha", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibPreMultiplyAlpha(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_Bleed", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibBleed(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannels", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureChannels(__IntPtr texture, uint numChannelSets, PVRTexLibChannelName* channels, uint* pValues);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_SetTextureChannelsFloat", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibSetTextureChannelsFloat(__IntPtr texture, uint numChannelSets, PVRTexLibChannelName* channels, float* pValues);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_CopyTextureChannels", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibCopyTextureChannels(__IntPtr textureDestination, __IntPtr textureSource, uint numChannelCopies, PVRTexLibChannelName* destinationChannels, PVRTexLibChannelName* sourceChannels);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateNormalMap", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGenerateNormalMap(__IntPtr texture, float fScale, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(CppSharp.Runtime.UTF8Marshaller))] string channelOrder);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateMIPMaps", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGenerateMIPMaps(__IntPtr texture, PVRTexLibResizeMode filterMode, int mipMapsToDo);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ColourMIPMaps", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibColourMIPMaps(__IntPtr texture);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_TranscodeTexture", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibTranscodeTexture(__IntPtr texture, __IntPtr transcoderOptions);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_Decompress", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibDecompress(__IntPtr texture, uint maxThreads);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_EquiRectToCubeMap", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibEquiRectToCubeMap(__IntPtr texture, PVRTexLibResizeMode filter);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GenerateDiffuseIrradianceCubeMap", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGenerateDiffuseIrradianceCubeMap(__IntPtr texture, uint sampleCount, uint mapSize);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_GeneratePreFilteredSpecularCubeMap", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibGeneratePreFilteredSpecularCubeMap(__IntPtr texture, uint sampleCount, uint mapSize, uint numMipLevelsToDiscard, bool zeroRoughnessIsExternal);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MaxDifference", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibMaxDifference(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MeanError", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibMeanError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_MeanSquaredError", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_RootMeanSquaredError", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibRootMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_StandardDeviation", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibStandardDeviation(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_PeakSignalToNoiseRatio", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibPeakSignalToNoiseRatio(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, __IntPtr metrics);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ColourDiff", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibColourDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float multiplier, PVRTexLibColourDiffMode mode);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_ToleranceDiff", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibToleranceDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float tolerance);
+
+ [SuppressUnmanagedCodeSecurity, DllImport("PVRTexLib.dll", EntryPoint = "PVRTexLib_BlendDiff", CallingConvention = __CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ internal static extern bool PVRTexLibBlendDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float blendFactor);
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Default header attributes.
+ /// ***********************************************************************
+ ///
+ /// Sets up default texture header parameters.
+ public static void PVRTexLibSetDefaultTextureHeaderParams(PVRHeaderCreateParams result)
+ {
+ var __arg0 = result is null ? __IntPtr.Zero : result.__Instance;
+ __Internal.PVRTexLibSetDefaultTextureHeaderParams(__arg0);
+ }
+
+ /// ***********************************************************************
+ /// The header attributes
+ ///
+ /// A handle to a new texture header.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture header using the supplied
+ /// header parameters.
+ ///
+ public static __IntPtr PVRTexLibCreateTextureHeader(PVRHeaderCreateParams attribs)
+ {
+ var __arg0 = attribs is null ? __IntPtr.Zero : attribs.__Instance;
+ var ___ret = __Internal.PVRTexLibCreateTextureHeader(__arg0);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// PVRTextureHeaderV3 structure to create from.
+ /// Number of items in metaData, can be 0.
+ /// Array of meta data blocks, can be null.
+ ///
+ /// A handle to a new texture header.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture header from a PVRV3 structure.
+ /// Optionally supply meta data.
+ ///
+ public static __IntPtr PVRTexLibCreateTextureHeaderFromHeader(PVRTextureHeaderV3 header, uint metaDataCount, PVRTexLibMetaDataBlock metaData)
+ {
+ var __arg0 = header is null ? __IntPtr.Zero : header.__Instance;
+ var __arg2 = metaData is null ? __IntPtr.Zero : metaData.__Instance;
+ var ___ret = __Internal.PVRTexLibCreateTextureHeaderFromHeader(__arg0, metaDataCount, __arg2);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A handle to a new texture header.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture header by copying values from a
+ /// previously allocated texture header.
+ ///
+ public static __IntPtr PVRTexLibCopyTextureHeader(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibCopyTextureHeader(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ ///
+ /// Handle to a PVRTexLib_PVRTextureHeader.
+ /// ***********************************************************************
+ ///
+ /// Free a previously allocated texture header.
+ public static void PVRTexLibDestroyTextureHeader(__IntPtr header)
+ {
+ __Internal.PVRTexLibDestroyTextureHeader(header);
+ }
+
+ /// ************************************************************************
+ /// Width of the texture in pixels
+ /// Height of the texture in pixels
+ /// Number of Z layers
+ /// Minimum width of a texture level
+ /// Minimum height of a texture level
+ /// Minimum depth of a texture level
+ /// Bits per pixel
+ /// Create memory for MIP-map levels also?
+ /// Memory allocation callback function.
+ ///
+ /// Allocated texture memory. free()d by caller.
+ /// ************************************************************************
+ ///
+ ///
+ /// Low level texture creation function.
+ /// Creates a PVRTextureHeaderV3 structure,
+ /// including room for the specified texture, in memory.
+ ///
+ public static PVRTextureHeaderV3 PVRTexLibTextureCreateRaw(uint width, uint height, uint depth, uint wMin, uint hMin, uint dMin, uint nBPP, bool bMIPMap, Delegates.Func___IntPtr_ulong pfnAllocCallback)
+ {
+ var __arg8 = pfnAllocCallback == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnAllocCallback);
+ var ___ret = __Internal.PVRTexLibTextureCreateRaw(width, height, depth, wMin, hMin, dMin, nBPP, bMIPMap, __arg8);
+ var __result0 = PVRTextureHeaderV3.__GetOrCreateInstance(___ret, false);
+ return __result0;
+ }
+
+ /// ***************************************************************************
+ /// Texture to place the tiled data
+ /// Width of destination texture
+ /// Height of destination texture
+ /// Texture to tile
+ /// Width of source texture
+ /// Height of source texture
+ /// Bytes per pixel
+ ///
+ /// True if the data is twiddled
+ /// ***************************************************************************
+ ///
+ ///
+ /// Low level texture creation function.
+ /// Load blocks of data from pSrc into pDst.
+ ///
+ public static void PVRTexLibTextureLoadTiled(byte* pDst, uint widthDst, uint heightDst, byte* pSrc, uint widthSrc, uint heightSrc, uint elementSize, bool twiddled)
+ {
+ __Internal.PVRTexLibTextureLoadTiled(pDst, widthDst, heightDst, pSrc, widthSrc, heightSrc, elementSize, twiddled);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Number of bits per pixel.
+ /// ***********************************************************************
+ ///
+ /// Gets the number of bits per pixel for the specified texture header.
+ public static uint PVRTexLibGetTextureBitsPerPixel(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureBitsPerPixel(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A PVR pixel format ID.
+ ///
+ /// Number of bits per pixel.
+ /// ***********************************************************************
+ ///
+ /// Gets the number of bits per pixel for the specified pixel format.
+ public static uint PVRTexLibGetFormatBitsPerPixel(ulong u64PixelFormat)
+ {
+ var ___ret = __Internal.PVRTexLibGetFormatBitsPerPixel(u64PixelFormat);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// For uncompressed formats the number of channels between 1 and 4.
+ /// For compressed formats 0
+ /// ***********************************************************************
+ ///
+ /// Gets the number of channels for the specified texture header.
+ public static uint PVRTexLibGetTextureChannelCount(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureChannelCount(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// PVRTexLibVariableType enum.
+ /// ***********************************************************************
+ ///
+ /// Gets the channel type for the specified texture header.
+ public static PVRTexLibVariableType PVRTexLibGetTextureChannelType(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureChannelType(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// PVRTexLibColourSpace enum.
+ /// ***********************************************************************
+ ///
+ /// Gets the colour space for the specified texture header.
+ public static PVRTexLibColourSpace PVRTexLibGetTextureColourSpace(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureColourSpace(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// MIP level that user is interested in.
+ ///
+ /// Width of the specified MIP-Map level.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the width of the user specified MIP-Map level for the
+ /// texture
+ ///
+ public static uint PVRTexLibGetTextureWidth(__IntPtr header, uint mipLevel)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureWidth(header, mipLevel);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// MIP level that user is interested in.
+ ///
+ /// Height of the specified MIP-Map level.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the height of the user specified MIP-Map
+ /// level for the texture
+ ///
+ public static uint PVRTexLibGetTextureHeight(__IntPtr header, uint mipLevel)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureHeight(header, mipLevel);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// MIP level that user is interested in.
+ ///
+ /// Depth of the specified MIP-Map level.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the depth of the user specified MIP-Map
+ /// level for the texture
+ ///
+ public static uint PVRTexLibGetTextureDepth(__IntPtr header, uint mipLevel)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureDepth(header, mipLevel);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Specifies a MIP level to check,
+ /// 'PVRTEX_ALLMIPLEVELS' can be passed to get
+ /// the size of all MIP levels.
+ ///
+ ///
+ /// Size of all surfaces is calculated if true,
+ /// only a single surface if false.
+ ///
+ ///
+ /// Size of all faces is calculated if true,
+ /// only a single face if false.
+ ///
+ ///
+ /// Size in PIXELS of the specified texture area.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the size in PIXELS of the texture, given various input
+ /// parameters. User can retrieve the total size of either all
+ /// surfaces or a single surface, all faces or a single face and
+ /// all MIP-Maps or a single specified MIP level. All of these
+ ///
+ public static uint PVRTexLibGetTextureSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureSize(header, mipLevel, allSurfaces, allFaces);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Specifies a mip level to check,
+ /// 'PVRTEX_ALLMIPLEVELS' can be passed to get
+ /// the size of all MIP levels.
+ ///
+ ///
+ /// Size of all surfaces is calculated if true,
+ /// only a single surface if false.
+ ///
+ ///
+ /// Size of all faces is calculated if true,
+ /// only a single face if false.
+ ///
+ ///
+ /// Size in BYTES of the specified texture area.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the size in BYTES of the texture, given various input
+ /// parameters. User can retrieve the size of either all
+ /// surfaces or a single surface, all faces or a single face
+ /// and all MIP-Maps or a single specified MIP level.
+ ///
+ public static ulong PVRTexLibGetTextureDataSize(__IntPtr header, int mipLevel, bool allSurfaces, bool allFaces)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureDataSize(header, mipLevel, allSurfaces, allFaces);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Pointer to a PVRTexLib_Orientation structure.
+ /// ***********************************************************************
+ ///
+ /// Gets the data orientation for this texture.
+ public static void PVRTexLibGetTextureOrientation(__IntPtr header, PVRTexLib_Orientation result)
+ {
+ var __arg1 = result is null ? __IntPtr.Zero : result.__Instance;
+ __Internal.PVRTexLibGetTextureOrientation(header, __arg1);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Pointer to a PVRTexLib_OpenGLFormat structure.
+ /// ***********************************************************************
+ ///
+ /// Gets the OpenGL equivalent format for this texture.
+ public static void PVRTexLibGetTextureOpenGLFormat(__IntPtr header, PVRTexLibOpenGLFormat result)
+ {
+ var __arg1 = result is null ? __IntPtr.Zero : result.__Instance;
+ __Internal.PVRTexLibGetTextureOpenGLFormat(header, __arg1);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Pointer to a PVRTexLib_OpenGLESFormat structure.
+ /// ***********************************************************************
+ ///
+ /// Gets the OpenGLES equivalent format for this texture.
+ public static void PVRTexLibGetTextureOpenGLESFormat(__IntPtr header, PVRTexLibOpenGLFormat result)
+ {
+ var __arg1 = result is null ? __IntPtr.Zero : result.__Instance;
+ __Internal.PVRTexLibGetTextureOpenGLESFormat(header, __arg1);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A VkFormat enum value.
+ /// ***********************************************************************
+ ///
+ /// Gets the Vulkan equivalent format for this texture.
+ public static uint PVRTexLibGetTextureVulkanFormat(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureVulkanFormat(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A D3DFORMAT enum value.
+ /// ***********************************************************************
+ ///
+ /// Gets the Direct3D equivalent format for this texture.
+ public static uint PVRTexLibGetTextureD3DFormat(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureD3DFormat(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A DXGI_FORMAT enum value.
+ /// ***********************************************************************
+ ///
+ /// Gets the DXGI equivalent format for this texture.
+ public static uint PVRTexLibGetTextureDXGIFormat(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureDXGIFormat(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Returns the minimum width.
+ /// Returns the minimum height.
+ ///
+ /// Returns the minimum depth.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the minimum dimensions (x,y,z)
+ /// for the textures pixel format.
+ ///
+ public static void PVRTexLibGetTextureFormatMinDims(__IntPtr header, ref uint minX, ref uint minY, ref uint minZ)
+ {
+ fixed (uint* __minX1 = &minX)
+ {
+ var __arg1 = __minX1;
+ fixed (uint* __minY2 = &minY)
+ {
+ var __arg2 = __minY2;
+ fixed (uint* __minZ3 = &minZ)
+ {
+ var __arg3 = __minZ3;
+ __Internal.PVRTexLibGetTextureFormatMinDims(header, __arg1, __arg2, __arg3);
+ }
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A PVR Pixel Format ID.
+ /// Returns the minimum width.
+ /// Returns the minimum height.
+ ///
+ /// Returns the minimum depth.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the minimum dimensions (x,y,z)
+ /// for the textures pixel format.
+ ///
+ public static void PVRTexLibGetPixelFormatMinDims(ulong ui64Format, ref uint minX, ref uint minY, ref uint minZ)
+ {
+ fixed (uint* __minX1 = &minX)
+ {
+ var __arg1 = __minX1;
+ fixed (uint* __minY2 = &minY)
+ {
+ var __arg2 = __minY2;
+ fixed (uint* __minZ3 = &minZ)
+ {
+ var __arg3 = __minZ3;
+ __Internal.PVRTexLibGetPixelFormatMinDims(ui64Format, __arg1, __arg2, __arg3);
+ }
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Size, in bytes, of the meta data stored in the header.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns the total size of the meta data stored in the header.
+ /// This includes the size of all information stored in all MetaDataBlocks.
+ ///
+ public static uint PVRTexLibGetTextureMetaDataSize(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureMetaDataSize(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// True if texture is premultiplied.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns whether or not the texture's colour has been
+ /// pre-multiplied by the alpha values.
+ ///
+ public static bool PVRTexLibGetTextureIsPreMultiplied(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureIsPreMultiplied(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// True if it is file compressed.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns whether or not the texture is compressed using
+ /// PVRTexLib's FILE compression - this is independent of
+ /// any texture compression.
+ ///
+ public static bool PVRTexLibGetTextureIsFileCompressed(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureIsFileCompressed(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// True if it is a bump map.
+ /// ***********************************************************************
+ ///
+ /// Returns whether or not the texture is a bump map.
+ public static bool PVRTexLibGetTextureIsBumpMap(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureIsBumpMap(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Returns the bump map scale value as a float.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the bump map scaling value for this texture.
+ /// If the texture is not a bump map, 0.0f is returned. If the
+ /// texture is a bump map but no meta data is stored to
+ /// specify its scale, then 1.0f is returned.
+ ///
+ public static float PVRTexLibGetTextureBumpMapScale(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureBumpMapScale(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The number of sub textures defined by meta data.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Works out the number of possible texture atlas members in
+ /// the texture based on the width, height, depth and data size.
+ ///
+ public static uint PVRTexLibGetNumTextureAtlasMembers(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetNumTextureAtlasMembers(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Number of floats in the returned data set.
+ ///
+ /// A pointer directly to the texture atlas data. NULL if
+ /// the texture does not have atlas data.
+ /// ***********************************************************************
+ ///
+ /// Returns a pointer to the texture atlas data.
+ public static float* PVRTexLibGetTextureAtlasData(__IntPtr header, ref uint count)
+ {
+ fixed (uint* __count1 = &count)
+ {
+ var __arg1 = __count1;
+ var ___ret = __Internal.PVRTexLibGetTextureAtlasData(header, __arg1);
+ return ___ret;
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Number of MIP-Map levels in this texture.
+ /// ***********************************************************************
+ ///
+ /// Gets the number of MIP-Map levels stored in this texture.
+ public static uint PVRTexLibGetTextureNumMipMapLevels(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureNumMipMapLevels(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Number of faces in this texture.
+ /// ***********************************************************************
+ ///
+ /// Gets the number of faces stored in this texture.
+ public static uint PVRTexLibGetTextureNumFaces(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureNumFaces(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Number of array members in this texture.
+ /// ***********************************************************************
+ ///
+ /// Gets the number of array members stored in this texture.
+ public static uint PVRTexLibGetTextureNumArrayMembers(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureNumArrayMembers(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Null terminated cube map order string.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the cube map face order.
+ /// cubeOrder string will be in the form "ZzXxYy" with capitals
+ /// representing positive and lower case letters representing
+ /// negative. I.e. Z=Z-Positive, z=Z-Negative.
+ ///
+ public static void PVRTexLibGetTextureCubeMapOrder(__IntPtr header, sbyte[] cubeOrder)
+ {
+ if (cubeOrder == null || cubeOrder.Length != 7)
+ throw new ArgumentOutOfRangeException("cubeOrder", "The dimensions of the provided array don't match the required size.");
+ __Internal.PVRTexLibGetTextureCubeMapOrder(header, cubeOrder);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// terminated bump map order string relative to rgba.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Gets the bump map channel order relative to rgba.
+ /// For example, an RGB texture with bumps mapped to XYZ returns
+ /// 'xyz'. A BGR texture with bumps in the order ZYX will also
+ /// return 'xyz' as the mapping is the same: R=X, G=Y, B=Z.
+ /// If the letter 'h' is present in the string, it means that
+ /// the height map has been stored here.
+ /// Other characters are possible if the bump map was created
+ /// manually, but PVRTexLib will ignore these characters. They
+ /// are returned simply for completeness.
+ ///
+ public static void PVRTexLibGetTextureBumpMapOrder(__IntPtr header, sbyte[] bumpOrder)
+ {
+ if (bumpOrder == null || bumpOrder.Length != 5)
+ throw new ArgumentOutOfRangeException("bumpOrder", "The dimensions of the provided array don't match the required size.");
+ __Internal.PVRTexLibGetTextureBumpMapOrder(header, bumpOrder);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// 64-bit pixel type ID.
+ /// ***********************************************************************
+ ///
+ /// Gets the 64-bit pixel type ID of the texture.
+ public static ulong PVRTexLibGetTexturePixelFormat(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibGetTexturePixelFormat(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// True if the texture format is packed, false otherwise.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Checks whether the pixel format of the texture is packed.
+ /// E.g. R5G6B5, R11G11B10, R4G4B4A4 etc.
+ ///
+ public static bool PVRTexLibTextureHasPackedChannelData(__IntPtr header)
+ {
+ var ___ret = __Internal.PVRTexLibTextureHasPackedChannelData(header);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A PVRTexLibVariableType enum.
+ /// ***********************************************************************
+ ///
+ /// Sets the variable type for the channels in this texture.
+ public static void PVRTexLibSetTextureChannelType(__IntPtr header, PVRTexLibVariableType type)
+ {
+ __Internal.PVRTexLibSetTextureChannelType(header, type);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// A PVRTexLibColourSpace enum.
+ /// ***********************************************************************
+ ///
+ /// Sets the colour space for this texture.
+ public static void PVRTexLibSetTextureColourSpace(__IntPtr header, PVRTexLibColourSpace colourSpace)
+ {
+ __Internal.PVRTexLibSetTextureColourSpace(header, colourSpace);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// A D3DFORMAT enum.
+ ///
+ /// True if successful.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the format of the texture to PVRTexLib's internal
+ /// representation of the D3D format.
+ ///
+ public static bool PVRTexLibSetTextureD3DFormat(__IntPtr header, uint d3dFormat)
+ {
+ var ___ret = __Internal.PVRTexLibSetTextureD3DFormat(header, d3dFormat);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// A DXGI_FORMAT enum.
+ ///
+ /// True if successful.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the format of the texture to PVRTexLib's internal
+ /// representation of the DXGI format.
+ ///
+ public static bool PVRTexLibSetTextureDXGIFormat(__IntPtr header, uint dxgiFormat)
+ {
+ var ___ret = __Internal.PVRTexLibSetTextureDXGIFormat(header, dxgiFormat);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// The OpenGL format.
+ ///
+ /// True if successful.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the format of the texture to PVRTexLib's internal
+ /// representation of the OpenGL format.
+ ///
+ public static bool PVRTexLibSetTextureOGLFormat(__IntPtr header, PVRTexLibOpenGLFormat oglFormat)
+ {
+ var __arg1 = oglFormat is null ? __IntPtr.Zero : oglFormat.__Instance;
+ var ___ret = __Internal.PVRTexLibSetTextureOGLFormat(header, __arg1);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// The OpenGLES format.
+ ///
+ /// True if successful.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the format of the texture to PVRTexLib's internal
+ /// representation of the OpenGLES format.
+ ///
+ public static bool PVRTexLibSetTextureOGLESFormat(__IntPtr header, PVRTexLibOpenGLFormat oglesFormat)
+ {
+ var __arg1 = oglesFormat is null ? __IntPtr.Zero : oglesFormat.__Instance;
+ var ___ret = __Internal.PVRTexLibSetTextureOGLESFormat(header, __arg1);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// A VkFormat enum.
+ ///
+ /// True if successful.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the format of the texture to PVRTexLib's internal
+ /// representation of the OpenGLES format.
+ ///
+ public static bool PVRTexLibSetTextureVulkanFormat(__IntPtr header, uint vulkanFormat)
+ {
+ var ___ret = __Internal.PVRTexLibSetTextureVulkanFormat(header, vulkanFormat);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The format of the pixel.
+ /// ***********************************************************************
+ ///
+ /// Sets the pixel format for this texture.
+ public static void PVRTexLibSetTexturePixelFormat(__IntPtr header, ulong format)
+ {
+ __Internal.PVRTexLibSetTexturePixelFormat(header, format);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The new width.
+ /// ***********************************************************************
+ ///
+ /// Sets the texture width.
+ public static void PVRTexLibSetTextureWidth(__IntPtr header, uint width)
+ {
+ __Internal.PVRTexLibSetTextureWidth(header, width);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The new height.
+ /// ***********************************************************************
+ ///
+ /// Sets the texture height.
+ public static void PVRTexLibSetTextureHeight(__IntPtr header, uint height)
+ {
+ __Internal.PVRTexLibSetTextureHeight(header, height);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The new depth.
+ /// ***********************************************************************
+ ///
+ /// Sets the texture depth.
+ public static void PVRTexLibSetTextureDepth(__IntPtr header, uint depth)
+ {
+ __Internal.PVRTexLibSetTextureDepth(header, depth);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// The new number of array members.
+ /// ***********************************************************************
+ ///
+ /// Sets the number of array members in this texture.
+ public static void PVRTexLibSetTextureNumArrayMembers(__IntPtr header, uint numMembers)
+ {
+ __Internal.PVRTexLibSetTextureNumArrayMembers(header, numMembers);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// New number of MIP-Map levels.
+ /// ***********************************************************************
+ ///
+ /// Sets the number of MIP-Map levels in this texture.
+ public static void PVRTexLibSetTextureNumMIPLevels(__IntPtr header, uint numMIPLevels)
+ {
+ __Internal.PVRTexLibSetTextureNumMIPLevels(header, numMIPLevels);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// New number of faces for this texture.
+ /// ***********************************************************************
+ ///
+ /// Sets the number of faces stored in this texture.
+ public static void PVRTexLibSetTextureNumFaces(__IntPtr header, uint numFaces)
+ {
+ __Internal.PVRTexLibSetTextureNumFaces(header, numFaces);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Pointer to a PVRTexLib_Orientation struct.
+ /// ***********************************************************************
+ ///
+ /// Sets the data orientation for a given axis in this texture.
+ public static void PVRTexLibSetTextureOrientation(__IntPtr header, PVRTexLib_Orientation orientation)
+ {
+ var __arg1 = orientation is null ? __IntPtr.Zero : orientation.__Instance;
+ __Internal.PVRTexLibSetTextureOrientation(header, __arg1);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Sets the file compression to true or false.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets whether or not the texture is compressed using
+ /// PVRTexLib's FILE compression - this is independent of
+ /// any texture compression. Currently unsupported.
+ ///
+ public static void PVRTexLibSetTextureIsFileCompressed(__IntPtr header, bool isFileCompressed)
+ {
+ __Internal.PVRTexLibSetTextureIsFileCompressed(header, isFileCompressed);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Sets if texture is premultiplied.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets whether or not the texture's colour has been
+ /// pre-multiplied by the alpha values.
+ ///
+ public static void PVRTexLibSetTextureIsPreMultiplied(__IntPtr header, bool isPreMultiplied)
+ {
+ __Internal.PVRTexLibSetTextureIsPreMultiplied(header, isPreMultiplied);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Border width
+ /// Border height
+ ///
+ /// Border depth
+ /// ***********************************************************************
+ ///
+ /// Obtains the border size in each dimension for this texture.
+ public static void PVRTexLibGetTextureBorder(__IntPtr header, ref uint borderWidth, ref uint borderHeight, ref uint borderDepth)
+ {
+ fixed (uint* __borderWidth1 = &borderWidth)
+ {
+ var __arg1 = __borderWidth1;
+ fixed (uint* __borderHeight2 = &borderHeight)
+ {
+ var __arg2 = __borderHeight2;
+ fixed (uint* __borderDepth3 = &borderDepth)
+ {
+ var __arg3 = __borderDepth3;
+ __Internal.PVRTexLibGetTextureBorder(header, __arg1, __arg2, __arg3);
+ }
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Four character descriptor representing the
+ /// creator of the meta data
+ ///
+ /// Key value representing the type of meta data stored
+ /// returned meta block data
+ /// Memory allocation callback function.
+ ///
+ /// True if the meta data block was found.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns a copy of a block of meta data from the texture.
+ /// If the meta data doesn't exist, a block with a data size
+ /// of 0 will be returned.
+ ///
+ public static bool PVRTexLibGetMetaDataBlock(__IntPtr header, uint devFOURCC, uint key, PVRTexLibMetaDataBlock dataBlock, Delegates.Func___IntPtr_uint pfnAllocCallback)
+ {
+ var __arg3 = dataBlock is null ? __IntPtr.Zero : dataBlock.__Instance;
+ var __arg4 = pfnAllocCallback == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnAllocCallback);
+ var ___ret = __Internal.PVRTexLibGetMetaDataBlock(header, devFOURCC, key, __arg3, __arg4);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Four character descriptor representing the
+ /// creator of the meta data
+ ///
+ /// Key value representing the type of meta data stored
+ ///
+ /// True if the specified meta data bock exists
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns whether or not the specified meta data exists as
+ /// part of this texture header.
+ ///
+ public static bool PVRTexLibTextureHasMetaData(__IntPtr header, uint devFOURCC, uint key)
+ {
+ var ___ret = __Internal.PVRTexLibTextureHasMetaData(header, devFOURCC, key);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Floating point "height" value to scale the bump map.
+ ///
+ /// Up to 4 character string, with values x,y,z,h in
+ /// some combination. Not all values need to be present.
+ /// Denotes channel order; x,y,z refer to the
+ /// corresponding axes, h indicates presence of the
+ /// original height map. It is possible to have only some
+ /// of these values rather than all. For example if 'h'
+ /// is present alone it will be considered a height map.
+ /// The values should be presented in RGBA order, regardless
+ /// of the texture format, so a zyxh order in a bgra texture
+ /// should still be passed as 'xyzh'. Capitals are allowed.
+ /// Any character stored here that is not one of x,y,z,h
+ /// or a NULL character will be ignored when PVRTexLib
+ /// reads the data, but will be preserved. This is useful
+ /// if you wish to define a custom data channel for instance.
+ /// In these instances PVRTexLib will assume it is simply
+ /// colour data.
+ /// ***********************************************************************
+ ///
+ /// Sets a texture's bump map data.
+ public static void PVRTexLibSetTextureBumpMap(__IntPtr header, float bumpScale, string bumpOrder)
+ {
+ __Internal.PVRTexLibSetTextureBumpMap(header, bumpScale, bumpOrder);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Pointer to an array of atlas data.
+ ///
+ /// Number of floats in atlasData.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets the texture atlas coordinate meta data for later display.
+ /// It is up to the user to make sure that this texture atlas
+ /// data actually makes sense in the context of the header.
+ ///
+ public static void PVRTexLibSetTextureAtlas(__IntPtr header, ref float atlasData, uint dataSize)
+ {
+ fixed (float* __atlasData1 = &atlasData)
+ {
+ var __arg1 = __atlasData1;
+ __Internal.PVRTexLibSetTextureAtlas(header, __arg1, dataSize);
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Up to 6 character string, with values
+ /// x,X,y,Y,z,Z in some combination. Not all
+ /// values need to be present. Denotes face
+ /// order; Capitals refer to positive axis
+ /// positions and small letters refer to
+ /// negative axis positions. E.g. x=X-Negative,
+ /// X=X-Positive. It is possible to have only
+ /// some of these values rather than all, as
+ /// long as they are NULL terminated.
+ /// NB: Values past the 6th character are not read.
+ /// ***********************************************************************
+ ///
+ /// Sets the texture's face ordering.
+ public static void PVRTexLibSetTextureCubeMapOrder(__IntPtr header, string cubeMapOrder)
+ {
+ __Internal.PVRTexLibSetTextureCubeMapOrder(header, cubeMapOrder);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Border width
+ /// Border height
+ ///
+ /// Border depth
+ /// ***********************************************************************
+ ///
+ ///
+ /// Sets a texture's border size data. This value is subtracted
+ /// from the current texture height/width/depth to get the valid
+ /// texture data.
+ ///
+ public static void PVRTexLibSetTextureBorder(__IntPtr header, uint borderWidth, uint borderHeight, uint borderDepth)
+ {
+ __Internal.PVRTexLibSetTextureBorder(header, borderWidth, borderHeight, borderDepth);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Meta data block to be added.
+ /// ***********************************************************************
+ ///
+ /// Adds an arbitrary piece of meta data.
+ public static void PVRTexLibAddMetaData(__IntPtr header, PVRTexLibMetaDataBlock dataBlock)
+ {
+ var __arg1 = dataBlock is null ? __IntPtr.Zero : dataBlock.__Instance;
+ __Internal.PVRTexLibAddMetaData(header, __arg1);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ ///
+ /// Four character descriptor representing the
+ /// creator of the meta data
+ ///
+ ///
+ /// Key value representing the type of meta data stored.
+ /// ***********************************************************************
+ ///
+ /// Removes a specified piece of meta data, if it exists.
+ public static void PVRTexLibRemoveMetaData(__IntPtr header, uint devFOURCC, uint key)
+ {
+ __Internal.PVRTexLibRemoveMetaData(header, devFOURCC, key);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTextureHeader.
+ /// Texture data (may be NULL)
+ ///
+ /// A new texture handle.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture based on a texture header,
+ /// and optionally copies the supplied texture data.
+ ///
+ public static __IntPtr PVRTexLibCreateTexture(__IntPtr header, __IntPtr data)
+ {
+ var ___ret = __Internal.PVRTexLibCreateTexture(header, data);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a PVRTexLib_PVRTexture to copy from.
+ ///
+ /// A new texture handle.
+ /// ***********************************************************************
+ ///
+ /// Creates a copy of the supplied texture.
+ public static __IntPtr PVRTexLibCopyTexture(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibCopyTexture(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a PVRTexLib_PVRTexture to move from.
+ ///
+ /// A new texture handle.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture, moving the contents of the
+ /// supplied texture into the new texture.
+ ///
+ public static __IntPtr PVRTexLibMoveTexture(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibMoveTexture(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ ///
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// ***********************************************************************
+ ///
+ /// Free a texture.
+ public static void PVRTexLibDestroyTexture(__IntPtr texture)
+ {
+ __Internal.PVRTexLibDestroyTexture(texture);
+ }
+
+ /// ***********************************************************************
+ /// File path to the texture to load from.
+ ///
+ /// A new texture handle OR NULL on failure.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture from a file.
+ /// Accepted file formats are: PVR, KTX, KTX2, ASTC, DDS, BASIS,
+ /// PNG, JPEG, BMP, TGA, GIF, HDR, EXR, PSD, PPM, PGM and PIC
+ ///
+ public static __IntPtr PVRTexLibCreateTextureFromFile(string filePath)
+ {
+ var ___ret = __Internal.PVRTexLibCreateTextureFromFile(filePath);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// Pointer to texture data
+ ///
+ /// A new texture handle OR NULL on failure.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a new texture from a pointer that includes a header
+ /// structure, meta data and texture data as laid out in a file.
+ /// This functionality is primarily for user-defined file loading.
+ /// Header may be any version of pvr.
+ ///
+ public static __IntPtr PVRTexLibCreateTextureFromData(__IntPtr data)
+ {
+ var ___ret = __Internal.PVRTexLibCreateTextureFromData(data);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Offset to MIP Map levels
+ /// Offset to array members
+ /// Offset to face numbers
+ /// Offset to Z slice (3D textures only)
+ ///
+ /// Pointer into the texture data OR NULL on failure.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns a pointer to the texture's data.
+ /// The data offset is calculated using the parameters below.
+ ///
+ public static __IntPtr PVRTexLibGetTextureDataPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureDataPtr(texture, MIPLevel, arrayMember, faceNumber, ZSlice);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Offset to MIP Map levels
+ /// Offset to array members
+ /// Offset to face numbers
+ /// Offset to Z slice (3D textures only)
+ ///
+ /// Pointer into the texture data OR NULL on failure.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Returns a const pointer to the texture's data.
+ /// The data offset is calculated using the parameters below.
+ ///
+ public static __IntPtr PVRTexLibGetTextureDataConstPtr(__IntPtr texture, uint MIPLevel, uint arrayMember, uint faceNumber, uint ZSlice)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureDataConstPtr(texture, MIPLevel, arrayMember, faceNumber, ZSlice);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// PVRTexLib_PVRTextureHeader handle.
+ /// ***********************************************************************
+ ///
+ /// Returns a read only texture header.
+ public static __IntPtr PVRTexLibGetTextureHeader(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureHeader(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// PVRTexLib_PVRTextureHeader handle.
+ /// ***********************************************************************
+ ///
+ /// Gets a write-able handle to the texture header.
+ public static __IntPtr PVRTexLibGetTextureHeaderW(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibGetTextureHeaderW(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// Padding boundary value
+ /// ***********************************************************************
+ ///
+ ///
+ /// Pads the texture data to a boundary value equal to "padding".
+ /// For example setting padding=8 will align the start of the
+ /// texture data to an 8 byte boundary.
+ /// NB: This should be called immediately before saving as
+ /// the value is worked out based on the current meta data size.
+ ///
+ public static void PVRTexLibAddPaddingMetaData(__IntPtr texture, uint padding)
+ {
+ __Internal.PVRTexLibAddPaddingMetaData(texture, padding);
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// File path to write to
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Saves the texture to a given file path.
+ /// File type will be determined by the extension present in the string.
+ /// Valid extensions are: PVR, KTX, KTX2, ASTC, DDS, BASIS and h
+ /// If no extension is present the PVR format will be selected.
+ /// Unsupported formats will result in failure.
+ /// ASTC files only support ASTC texture formats.
+ /// BASIS files only support Basis Universal texture formats.
+ ///
+ public static bool PVRTexLibSaveTextureToFile(__IntPtr texture, string filePath)
+ {
+ var ___ret = __Internal.PVRTexLibSaveTextureToFile(texture, filePath);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// File container type to wrap the texture data with.
+ ///
+ /// Pointer to a user supplied allocation context.
+ /// PVRTexLib will pass this into pfnRealloc when a [re]allocation
+ /// is required.
+ ///
+ /// Size, in bytes, of the resulting 'file'/data.
+ ///
+ /// Callback function to reallocate memory on-demand.
+ /// Return NULL to indicate allocation failure.
+ ///
+ ///
+ /// True if the method succeeds.
+ /// N.B This function may allocate even if it fails.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Similar to PVRTexLib_SaveTextureToFile, but redirects
+ /// the data to a memory buffer instead of a file.
+ /// Caller is responsible for de-allocating memory.
+ ///
+ public static bool PVRTexLibSaveTextureToMemory(__IntPtr texture, PVRTexLibFileContainerType fileType, __IntPtr privateData, ref ulong outSize, Delegates.Func_bytePtr___IntPtr_ulong pfnRealloc)
+ {
+ fixed (ulong* __outSize3 = &outSize)
+ {
+ var __arg3 = __outSize3;
+ var __arg4 = pfnRealloc == null ? global::System.IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(pfnRealloc);
+ var ___ret = __Internal.PVRTexLibSaveTextureToMemory(texture, fileType, privateData, __arg3, __arg4);
+ return ___ret;
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Path to write the image file.
+ /// Mip level.
+ /// Array index.
+ /// Face index.
+ /// Z index.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Writes out a single surface to a given image file.
+ /// File type is determined by the extension present in the filepath string.
+ /// Supported file types are PNG, JPG, BMP, TGA and HDR.
+ /// If no extension is present then the PNG format will be selected.
+ /// Unsupported formats will result in failure.
+ ///
+ public static bool PVRTexLibSaveSurfaceToImageFile(__IntPtr texture, string filePath, uint MIPLevel, uint arrayMember, uint face, uint ZSlice)
+ {
+ var ___ret = __Internal.PVRTexLibSaveSurfaceToImageFile(texture, filePath, MIPLevel, arrayMember, face, ZSlice);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// File path to write to
+ /// Target API
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Saves the texture to a file, stripping any
+ /// extensions specified and appending .pvr. This function is
+ /// for legacy support only and saves out to PVR Version 2 file.
+ /// The target api must be specified in order to save to this format.
+ ///
+ public static bool PVRTexLibSaveTextureToLegacyPVRFile(__IntPtr texture, string filePath, PVRTexLibLegacyApi api)
+ {
+ var ___ret = __Internal.PVRTexLibSaveTextureToLegacyPVRFile(texture, filePath, api);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// True if texture contains more than one PVRTexLib_PVRTexture.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Queries the texture object to determine if there are multiple
+ /// texture objects associated with the handle. This may be the
+ /// case after loading certain file types such as EXR, since EXR
+ /// files may contain several images/layers with unique pixel formats.
+ /// In these cases PVRTexLib will group all images with the same
+ /// pixel format into a single PVRTexLib_PVRTexture object, where
+ /// each PVRTexLib_PVRTexture can contain multiple array surfaces.
+ ///
+ public static bool PVRTexLibIsTextureMultiPart(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibIsTextureMultiPart(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// Array of PVRTexLib_PVRTexture handles to be populated.
+ /// All returned handles are independent of each other and 'inTexture'.
+ ///
+ ///
+ /// The number of parts held by inTexture
+ /// ***********************************************************************
+ ///
+ ///
+ /// Retrieves (and moves ownership of) the PVRTexLib_PVRTexture handles
+ /// stored within a multi-part texture and stores them in 'outTextures'.
+ /// Call this function with 'outTextures' == NULL to populate count
+ /// and then allocate an appropriately sized array. Handles returned
+ /// in 'outTextures' should be de-allocated as normal via
+ /// PVRTexLib_DestroyTexture. After calling this function, subsequent
+ /// calls to PVRTexLib_IsTextureMultiPart on the same handle will
+ /// return false.
+ ///
+ public static void PVRTexLibGetTextureParts(__IntPtr inTexture, __IntPtr* outTextures, ref uint count)
+ {
+ fixed (uint* __count2 = &count)
+ {
+ var __arg2 = __count2;
+ __Internal.PVRTexLibGetTextureParts(inTexture, outTextures, __arg2);
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// New width
+ /// New height
+ /// New depth
+ /// Filtering mode
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Resizes the texture to new specified dimensions.
+ public static bool PVRTexLibResizeTexture(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, PVRTexLibResizeMode resizeMode)
+ {
+ var ___ret = __Internal.PVRTexLibResizeTexture(texture, newWidth, newHeight, newDepth, resizeMode);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// New width
+ /// New height
+ /// New depth
+ /// X Offset value from the top left corner
+ /// Y Offset value from the top left corner
+ /// Z Offset value from the top left corner
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Resizes the canvas of a texture to new specified dimensions.
+ /// Offset area is filled with transparent black colour.
+ ///
+ public static bool PVRTexLibResizeTextureCanvas(__IntPtr texture, uint newWidth, uint newHeight, uint newDepth, int xOffset, int yOffset, int zOffset)
+ {
+ var ___ret = __Internal.PVRTexLibResizeTextureCanvas(texture, newWidth, newHeight, newDepth, xOffset, yOffset, zOffset);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Rotation axis
+ /// Direction of rotation; true = clockwise, false = anti-clockwise
+ ///
+ /// True if the method succeeds or not.
+ /// ***********************************************************************
+ ///
+ /// Rotates a texture by 90 degrees around the given axis.
+ public static bool PVRTexLibRotateTexture(__IntPtr texture, PVRTexLibAxis rotationAxis, bool forward)
+ {
+ var ___ret = __Internal.PVRTexLibRotateTexture(texture, rotationAxis, forward);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Flip direction
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Flips a texture on a given axis.
+ public static bool PVRTexLibFlipTexture(__IntPtr texture, PVRTexLibAxis flipDirection)
+ {
+ var ___ret = __Internal.PVRTexLibFlipTexture(texture, flipDirection);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// X border
+ /// Y border
+ /// Z border
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Adds a user specified border to the texture.
+ public static bool PVRTexLibBorderTexture(__IntPtr texture, uint borderX, uint borderY, uint borderZ)
+ {
+ var ___ret = __Internal.PVRTexLibBorderTexture(texture, borderX, borderY, borderZ);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Pre-multiplies a texture's colours by its alpha values.
+ public static bool PVRTexLibPreMultiplyAlpha(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibPreMultiplyAlpha(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Allows a texture's colours to run into any fully transparent areas.
+ public static bool PVRTexLibBleed(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibBleed(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Number of channels to set
+ /// Channels to set
+ /// uint32 values to set channels to
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Sets the specified number of channels to values specified in pValues.
+ public static bool PVRTexLibSetTextureChannels(__IntPtr texture, uint numChannelSets, ref PVRTexLibChannelName channels, ref uint pValues)
+ {
+ fixed (PVRTexLibChannelName* __channels2 = &channels)
+ {
+ var __arg2 = __channels2;
+ fixed (uint* __pValues3 = &pValues)
+ {
+ var __arg3 = __pValues3;
+ var ___ret = __Internal.PVRTexLibSetTextureChannels(texture, numChannelSets, __arg2, __arg3);
+ return ___ret;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Number of channels to set
+ /// Channels to set
+ /// float values to set channels to
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Sets the specified number of channels to values specified in float pValues.
+ public static bool PVRTexLibSetTextureChannelsFloat(__IntPtr texture, uint numChannelSets, ref PVRTexLibChannelName channels, ref float pValues)
+ {
+ fixed (PVRTexLibChannelName* __channels2 = &channels)
+ {
+ var __arg2 = __channels2;
+ fixed (float* __pValues3 = &pValues)
+ {
+ var __arg3 = __pValues3;
+ var ___ret = __Internal.PVRTexLibSetTextureChannelsFloat(texture, numChannelSets, __arg2, __arg3);
+ return ___ret;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Number of channels to copy
+ /// Channels to set
+ /// Source channels to copy from
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Copies the specified channels from textureSource
+ /// into textureDestination. textureSource is not modified so it
+ /// is possible to use the same texture as both input and output.
+ /// When using the same texture as source and destination, channels
+ /// are preserved between swaps e.g. copying Red to Green and then
+ /// Green to Red will result in the two channels trading places
+ /// correctly. Channels in eChannels are set to the value of the channels
+ /// in eChannelSource.
+ ///
+ public static bool PVRTexLibCopyTextureChannels(__IntPtr textureDestination, __IntPtr textureSource, uint numChannelCopies, ref PVRTexLibChannelName destinationChannels, ref PVRTexLibChannelName sourceChannels)
+ {
+ fixed (PVRTexLibChannelName* __destinationChannels3 = &destinationChannels)
+ {
+ var __arg3 = __destinationChannels3;
+ fixed (PVRTexLibChannelName* __sourceChannels4 = &sourceChannels)
+ {
+ var __arg4 = __sourceChannels4;
+ var ___ret = __Internal.PVRTexLibCopyTextureChannels(textureDestination, textureSource, numChannelCopies, __arg3, __arg4);
+ return ___ret;
+ }
+ }
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Scale factor
+ /// Channel order
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Generates a Normal Map from a given height map.
+ /// Assumes the red channel has the height values.
+ /// By default outputs to red/green/blue = x/y/z,
+ /// this can be overridden by specifying a channel
+ /// order in channelOrder. The channels specified
+ /// will output to red/green/blue/alpha in that order.
+ /// So "xyzh" maps x to red, y to green, z to blue
+ /// and h to alpha. 'h' is used to specify that the
+ /// original height map data should be preserved in
+ /// the given channel.
+ ///
+ public static bool PVRTexLibGenerateNormalMap(__IntPtr texture, float fScale, string channelOrder)
+ {
+ var ___ret = __Internal.PVRTexLibGenerateNormalMap(texture, fScale, channelOrder);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Filter mode
+ ///
+ /// Number of levels of MIPMap chain to create.
+ /// Use PVRTEX_ALLMIPLEVELS to create a full mip chain.
+ ///
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Generates MIPMap chain for a texture.
+ public static bool PVRTexLibGenerateMIPMaps(__IntPtr texture, PVRTexLibResizeMode filterMode, int mipMapsToDo)
+ {
+ var ___ret = __Internal.PVRTexLibGenerateMIPMaps(texture, filterMode, mipMapsToDo);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Colours a texture's MIPMap levels with different colours
+ /// for debugging purposes. MIP levels are coloured in the
+ /// following repeating pattern: Red, Green, Blue, Cyan,
+ /// Magenta and Yellow
+ ///
+ public static bool PVRTexLibColourMIPMaps(__IntPtr texture)
+ {
+ var ___ret = __Internal.PVRTexLibColourMIPMaps(texture);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// struct containing transcoder options.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ /// Transcodes a texture from its original format into the specified format.
+ public static bool PVRTexLibTranscodeTexture(__IntPtr texture, PVRTexLibTranscoderOptions transcoderOptions)
+ {
+ if (ReferenceEquals(transcoderOptions, null))
+ throw new global::System.ArgumentNullException("transcoderOptions", "Cannot be null because it is a C++ reference (&).");
+ var __arg1 = transcoderOptions.__Instance;
+ var ___ret = __Internal.PVRTexLibTranscodeTexture(texture, __arg1);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// The maximum number of threads to use for decompression,
+ /// if set to 0 PVRTexLib will use all available cores.
+ ///
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// A convenience function to decompresses a texture into the most
+ /// appropriate format based on the textures 'compressed' format,
+ /// for example a PVRTC compressed texture may decompress to RGB888
+ /// or RGBA8888. This function may also be used to 'decompress'
+ /// packed formats into something easier to manipulate for example
+ /// RGB565 will be decompressed to RGB888.
+ ///
+ public static bool PVRTexLibDecompress(__IntPtr texture, uint maxThreads)
+ {
+ var ___ret = __Internal.PVRTexLibDecompress(texture, maxThreads);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// Filtering mode to apply when sampling the source texture.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Creates a cubemap with six faces from an equirectangular
+ /// projected texture. The input must have an aspect ratio of 2:1,
+ /// i.e. the width must be exactly twice the height.
+ ///
+ public static bool PVRTexLibEquiRectToCubeMap(__IntPtr texture, PVRTexLibResizeMode filter)
+ {
+ var ___ret = __Internal.PVRTexLibEquiRectToCubeMap(texture, filter);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// The number of samples to use when generating
+ /// the diffuse map.
+ ///
+ /// Output dimensions, in pixels.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Generates a mipmapped diffuse irradiance texture from a cubemap
+ /// environment map, to be used primarily with physically based
+ /// rendering (PBR) techniques.
+ /// The input must be a cubemap, the width must equal height,
+ /// and the depth must equal 1.
+ ///
+ public static bool PVRTexLibGenerateDiffuseIrradianceCubeMap(__IntPtr texture, uint sampleCount, uint mapSize)
+ {
+ var ___ret = __Internal.PVRTexLibGenerateDiffuseIrradianceCubeMap(texture, sampleCount, mapSize);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ ///
+ /// The number of samples to use when generating
+ /// the specular map.
+ ///
+ /// Output dimensions, in pixels.
+ ///
+ /// The number of Mip levels to be discarded
+ /// from the bottom of the Mip chain.
+ ///
+ ///
+ /// False to include a roughness of zero
+ /// when generating the prefiltered environment map.
+ /// True to omit a rougness of zero, implying that the user
+ /// will supply roughness zero from the environment texture.
+ ///
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Generates a prefiltered specular irradiance texture from a
+ /// cubemap environment map, to be used primarily with physically
+ /// based rendering (PBR) techniques.
+ /// Each Mip level of the specular map is blurred by a roughness
+ /// value between 0 and 1.
+ /// The input must be a cubemap, the width must equal height,
+ /// and the depth must equal 1.
+ ///
+ public static bool PVRTexLibGeneratePreFilteredSpecularCubeMap(__IntPtr texture, uint sampleCount, uint mapSize, uint numMipLevelsToDiscard, bool zeroRoughnessIsExternal)
+ {
+ var ___ret = __Internal.PVRTexLibGeneratePreFilteredSpecularCubeMap(texture, sampleCount, mapSize, numMipLevelsToDiscard, zeroRoughnessIsExternal);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the maximum difference between two given input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibMaxDifference(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibMaxDifference(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the mean error between two given input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibMeanError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibMeanError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the mean squared error (MSE) between two given input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibMeanSquaredError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the root mean squared error (RMSE) between two given
+ /// input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibRootMeanSquaredError(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibRootMeanSquaredError(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the standard deviation between two given input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibStandardDeviation(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibStandardDeviation(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// The Mip to compare.
+ /// The array to compare.
+ /// The face to compare.
+ /// The Z slice to compare.
+ /// Structure containing the resulting values.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the PSNR between two given input textures.
+ /// The MIPLevel, arrayMember, face and zSlice values determine which
+ /// surfaces are compared. NB: MIPLevel, arrayMember, face and zSlice
+ /// should be valid in both input textures. Both textures must have the
+ /// same dimensions. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibPeakSignalToNoiseRatio(__IntPtr textureLHS, __IntPtr textureRHS, uint MIPLevel, uint arrayMember, uint face, uint zSlice, PVRTexLibErrorMetrics metrics)
+ {
+ var __arg6 = metrics is null ? __IntPtr.Zero : metrics.__Instance;
+ var ___ret = __Internal.PVRTexLibPeakSignalToNoiseRatio(textureLHS, textureRHS, MIPLevel, arrayMember, face, zSlice, __arg6);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// PVRTexLib_PVRTexture that will contain the result on success.
+ ///
+ /// The factor to multiply the deltas to highlight differences,
+ /// generally a value between 1 and 10.
+ ///
+ /// The clamping mode to use, currently supports absolute and signed.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the the [mode] delta per channel between two given
+ /// input textures. Both textures must have the same dimensions and
+ /// may not be compressed. The function will only compare common
+ /// channels i.e. if 'LHS' has RGB while 'RHS' has RGBA channels,
+ /// then only the RGB channels will be compared.
+ ///
+ public static bool PVRTexLibColourDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float multiplier, PVRTexLibColourDiffMode mode)
+ {
+ var ___ret = __Internal.PVRTexLibColourDiff(textureLHS, textureRHS, textureResult, multiplier, mode);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// PVRTexLib_PVRTexture that will contain the result on success.
+ /// The cut-off value to compare the pixel delta to.
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Computes the total absolute pixel difference between two given
+ /// input textures and modulates the output based on the tolerance
+ /// value supplied. Deltas of zero will appear black while pixels
+ /// with deltas greater than or equal to the threshold are set to
+ /// red and finally deltas less than the tolerance are set to blue.
+ /// Both textures must have the same dimensions and may not be
+ /// compressed. The function will only compare common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be compared.
+ ///
+ public static bool PVRTexLibToleranceDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float tolerance)
+ {
+ var ___ret = __Internal.PVRTexLibToleranceDiff(textureLHS, textureRHS, textureResult, tolerance);
+ return ___ret;
+ }
+
+ /// ***********************************************************************
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// A handle to a previously allocated PVRTexLib_PVRTexture.
+ /// PVRTexLib_PVRTexture that will contain the result on success.
+ ///
+ /// The blend weight to use in the blend equation:
+ /// (LHS_delta * BF) + (RHS_delta * (1 - BF)). The value is clamped
+ /// between 0 and 1.
+ ///
+ ///
+ /// True if the method succeeds.
+ /// ***********************************************************************
+ ///
+ ///
+ /// Blend each channel of the input textures using the blend factor
+ /// as a weighting of the first texture against the second.
+ /// Both textures must have the same dimensions and may not be
+ /// compressed. The function will only blend common channels i.e.
+ /// if 'LHS' has RGB while 'RHS' has RGBA channels, then only the RGB
+ /// channels will be blended.
+ ///
+ public static bool PVRTexLibBlendDiff(__IntPtr textureLHS, __IntPtr textureRHS, __IntPtr* textureResult, float blendFactor)
+ {
+ var ___ret = __Internal.PVRTexLibBlendDiff(textureLHS, textureRHS, textureResult, blendFactor);
+ return ___ret;
+ }
+ }
+
+ namespace Delegates
+ {
+ [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)]
+ public unsafe delegate __IntPtr Func___IntPtr_ulong(ulong allocSize);
+
+ [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)]
+ public unsafe delegate __IntPtr Func___IntPtr_uint(uint allocSize);
+
+ [SuppressUnmanagedCodeSecurity, UnmanagedFunctionPointer(__CallingConvention.Cdecl)]
+ public unsafe delegate byte* Func_bytePtr___IntPtr_ulong(__IntPtr privateData, ulong allocSize);
+ }
+}
diff --git a/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs b/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs
new file mode 100644
index 0000000..7058dfa
--- /dev/null
+++ b/ABStudio/FileFormats/ZSTREAM/ZSTREAMFile.cs
@@ -0,0 +1,760 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Microsoft.VisualBasic;
+using Newtonsoft.Json.Linq;
+using ABStudio.FileFormats.DAT;
+using ABStudio.FileFormats.PVR;
+using ABStudio.Forms;
+using SevenZip;
+using SevenZip.Compression.LZMA;
+
+namespace ABStudio.FileFormats.ZSTREAM
+{
+ public class ZSTREAMFile
+ {
+ public DATFile associatedDAT = null;
+ public DATFile.SpriteData associatedSD = null;
+
+ bool noInit = false;
+ int atlas = -1;
+ string encKey = "";
+ bool wasLZMA = false;
+
+ Meta meta = new Meta();
+
+ class Meta
+ {
+ public string app = "";
+ public string format = "";
+ public string image = "";
+ public int sizeW = -1, sizeH = -1, scale = -1;
+ public string version = "";
+ }
+
+ List placementInfos = new List();
+
+ class PlacementInfo
+ {
+ public int x = -1;
+ public int y = -1;
+ public int w = -1;
+ public int h = -1;
+ public int position = -1;
+ public int length = -1;
+ }
+
+ static string[] keyList = new string[]
+ {
+ "55534361505170413454534E56784D49317639534B39554330795A75416E6232", // Classic
+ "7A65506865737435666151755832533241707265403472654368417445765574", // Seasons
+ "55534361505170413454534E56784D49317639534B39554330795A75416E6232", // Rio
+ "526D67645A304A656E4C466757776B5976434C326C5361684662456846656334", // Space
+ "416E3874336D6E38553673706951307A4848723361316C6F44725261336D7445", // Star Wars
+ "4230706D3354416C7A6B4E3967687A6F65324E697A456C6C50644E3068516E69", // Star Wars II
+ "454A52626357683831594734597A6A664C41504D7373416E6E7A785161446E31" // Friends
+ };
+
+ static string[] keyNames = new string[]
+ {
+ "Classic",
+ "Seasons",
+ "Rio",
+ "Space",
+ "Star Wars",
+ "Star Wars II",
+ "Friends",
+ };
+
+ public ZSTREAMFile()
+ {
+ this.noInit = true;
+ }
+
+ public ZSTREAMFile(string filename) : this(File.ReadAllBytes(filename)) { }
+
+ public ZSTREAMFile(byte[] zstreamData)
+ {
+ if (zstreamData[0] != '{')
+ {
+ bool isLZMA = zstreamData[1] == 'L' && zstreamData[2] == 'Z' && zstreamData[3] == 'M' && zstreamData[4] == 'A';
+
+ if(!isLZMA)
+ {
+ for (int i = 0; i < keyList.Length; i++)
+ {
+ try
+ {
+ byte[] decoded = Decrypt(zstreamData, keyList[i]);
+ if (decoded != null)
+ {
+ zstreamData = decoded;
+ encKey = keyList[i];
+ break;
+ }
+ }
+ catch (Exception) { }
+ }
+
+ if(encKey == "")
+ throw new Exception("Couldn't decrypt encrypted file. It might have been encrypted with an unknown key, or its content is invalid.");
+
+ isLZMA = zstreamData[1] == 'L' && zstreamData[2] == 'Z' && zstreamData[3] == 'M' && zstreamData[4] == 'A';
+ }
+
+
+ if(isLZMA)
+ {
+ this.wasLZMA = true;
+
+ SevenZip.Compression.LZMA.Decoder lzmaDecoder = new SevenZip.Compression.LZMA.Decoder();
+
+ MemoryStream msIn = new MemoryStream(zstreamData.Skip(9).ToArray());
+ using (MemoryStream msOut = new MemoryStream())
+ {
+ // Read the decoder properties
+ byte[] properties = new byte[5];
+ msIn.Read(properties, 0, 5);
+
+
+ // Read in the decompress file size.
+ byte[] fileLengthBytes = new byte[8];
+ msIn.Read(fileLengthBytes, 0, 8);
+ long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);
+
+ lzmaDecoder.SetDecoderProperties(properties);
+ lzmaDecoder.Code(msIn, msOut, msIn.Length, fileLength, null);
+
+ msIn.Close();
+
+ zstreamData = msOut.ToArray();
+ }
+ }
+ }
+
+ JObject jo = JObject.Parse(Encoding.UTF8.GetString(zstreamData));
+ JToken root = jo.Root;
+
+
+ JToken meta = root.SelectToken("meta");
+ this.meta.app = meta.SelectToken("app").ToObject();
+ this.meta.format = meta.SelectToken("format").ToObject();
+ this.meta.image = meta.SelectToken("image").ToObject();
+ this.meta.version = meta.SelectToken("version").ToObject();
+
+ JToken metaSize = meta.SelectToken("size");
+ this.meta.sizeW = metaSize.SelectToken("w").ToObject();
+ this.meta.sizeH = metaSize.SelectToken("h").ToObject();
+ this.meta.scale = metaSize.SelectToken("scale").ToObject();
+
+ DATFile dat = DATFile.NewSpriteData();
+ DATFile.SpriteData spriteData = dat.GetAsSpriteData();
+ spriteData.associatedZSTREAM = this;
+
+ spriteData.filenames.Add(this.meta.image);
+
+ JToken frames = root.SelectToken("frames");
+ foreach (JToken frame in frames.Children())
+ {
+ DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite();
+
+ sprite.name = frame.SelectToken("filename").ToObject();
+
+ JToken pivot = frame.SelectToken("pivot");
+ sprite.orig = new Point(
+ pivot.SelectToken("x").ToObject(),
+ pivot.SelectToken("y").ToObject());
+
+ JToken fframe = frame.SelectToken("frame");
+ sprite.rect = new Rectangle(
+ fframe.SelectToken("x").ToObject(),
+ fframe.SelectToken("y").ToObject(),
+ fframe.SelectToken("w").ToObject(),
+ fframe.SelectToken("h").ToObject());
+
+ JToken stream = frame.SelectToken("stream");
+ if (stream != null) {
+ if(stream.SelectToken("atlas") != null)
+ this.atlas = stream.SelectToken("atlas").ToObject();
+
+ PlacementInfo pInfo = new PlacementInfo();
+ pInfo.x = sprite.rect.X;
+ pInfo.y = sprite.rect.Y;
+ pInfo.w = stream.SelectToken("width").ToObject();
+ pInfo.h = stream.SelectToken("height").ToObject();
+ pInfo.position = stream.SelectToken("position").ToObject();
+ pInfo.length = stream.SelectToken("length").ToObject();
+
+ placementInfos.Add(pInfo);
+
+ int xDisp = (pInfo.w - sprite.rect.Width) / 2;
+ int yDisp = (pInfo.h - sprite.rect.Height) / 2;
+
+ sprite.rect.X += xDisp;
+ sprite.rect.Y += yDisp;
+ }
+
+
+
+ spriteData.sprites.Add(sprite);
+ }
+
+ associatedDAT = dat;
+ associatedSD = spriteData;
+ }
+
+ public void UpdateBitmap(Bitmap bmp, string filename)
+ {
+ this.meta.image = filename;
+ this.meta.sizeW = bmp.Width;
+ this.meta.sizeH = bmp.Height;
+ }
+
+ public Bitmap GetBitmap(string path)
+ {
+ byte[] rawData = null;
+
+ try
+ {
+ rawData = File.ReadAllBytes(path);
+ }
+ catch(Exception)
+ {
+ try
+ {
+ rawData = File.ReadAllBytes(path + ".7z");
+ }
+ catch (Exception)
+ {
+ throw new Exception("Couldn't read find file \"" + path + "\"");
+ }
+ }
+
+ if(rawData[0] == '7' && rawData[1] == 'z')
+ {
+ using (MemoryStream outMS = new MemoryStream())
+ {
+ using (MemoryStream inMS = new MemoryStream(rawData))
+ {
+ using (Aspose.Zip.SevenZip.SevenZipArchive archive = new Aspose.Zip.SevenZip.SevenZipArchive(inMS))
+ {
+ foreach(Aspose.Zip.SevenZip.SevenZipArchiveEntry v in archive.Entries)
+ {
+ v.Extract(outMS);
+ break;
+ }
+ }
+ }
+
+ rawData = outMS.ToArray();
+ }
+ }
+
+ Bitmap bmp = new Bitmap(this.meta.sizeW, this.meta.sizeH);
+
+ using(Graphics g = Graphics.FromImage(bmp))
+ {
+ int numimg = 0;
+ foreach (PlacementInfo pInfo in placementInfos)
+ {
+ byte[] streamData = rawData.Skip(pInfo.position).Take(pInfo.length + 0x28).ToArray();
+
+ byte[] pvrVer = new byte[streamData.Length + 0xC];
+ pvrVer[0] = (byte)'P';
+ pvrVer[1] = (byte)'V';
+ pvrVer[2] = (byte)'R';
+ pvrVer[3] = 3;
+
+ pvrVer[4] = 0;
+ pvrVer[5] = 0;
+ pvrVer[6] = 0;
+ pvrVer[7] = 0;
+
+ string fmt = "";
+ int n = 0x20;
+ while (streamData[n] != 0 || n == 0x28) {
+ fmt += (char)streamData[n];
+ n++;
+ }
+ int half = fmt.Length / 2;
+ fmt = fmt.ToLower();
+
+ byte ch1 = (byte)((0 < half) ? fmt[0] : 0);
+ byte ch2 = (byte)((1 < half) ? fmt[1] : 0);
+ byte ch3 = (byte)((2 < half) ? fmt[2] : 0);
+ byte ch4 = (byte)((3 < half) ? fmt[3] : 0);
+ byte va1 = (byte)Convert.ToInt32(new string(new char[] { ((half < fmt.Length) ? fmt[half] : '0') }));
+ byte va2 = (byte)Convert.ToInt32(new string(new char[] { (((half + 1) < fmt.Length) ? fmt[half + 1] : '0') }));
+ byte va3 = (byte)Convert.ToInt32(new string(new char[] { (((half + 2) < fmt.Length) ? fmt[half + 2] : '0') }));
+ byte va4 = (byte)Convert.ToInt32(new string(new char[] { (((half + 3) < fmt.Length) ? fmt[half + 3] : '0')}));
+
+ pvrVer[8] = ch1;
+ pvrVer[9] = ch2;
+ pvrVer[0xA] = ch3;
+ pvrVer[0xB] = ch4;
+
+ pvrVer[0xC] = va1;
+ pvrVer[0xD] = va2;
+ pvrVer[0xE] = va3;
+ pvrVer[0xF] = va4;
+
+ pvrVer[0x10] = 0;
+ pvrVer[0x11] = 0;
+ pvrVer[0x12] = 0;
+ pvrVer[0x13] = 0;
+
+ pvrVer[0x14] = 4;
+ pvrVer[0x15] = 0;
+ pvrVer[0x16] = 0;
+ pvrVer[0x17] = 0;
+
+ pvrVer[0x18] = streamData[9];
+ pvrVer[0x19] = streamData[8];
+ pvrVer[0x1A] = 0;
+ pvrVer[0x1B] = 0;
+
+ pvrVer[0x1C] = streamData[7];
+ pvrVer[0x1D] = streamData[6];
+ pvrVer[0x1E] = 0;
+ pvrVer[0x1F] = 0;
+
+ pvrVer[0x20] = 1;
+ pvrVer[0x21] = 0;
+ pvrVer[0x22] = 0;
+ pvrVer[0x23] = 0;
+
+ pvrVer[0x24] = 1;
+ pvrVer[0x25] = 0;
+ pvrVer[0x26] = 0;
+ pvrVer[0x27] = 0;
+
+ pvrVer[0x28] = 1;
+ pvrVer[0x29] = 0;
+ pvrVer[0x2A] = 0;
+ pvrVer[0x2B] = 0;
+
+ pvrVer[0x2C] = 1;
+ pvrVer[0x2D] = 0;
+ pvrVer[0x2E] = 0;
+ pvrVer[0x2F] = 0;
+
+ pvrVer[0x30] = 0;
+ pvrVer[0x31] = 0;
+ pvrVer[0x32] = 0;
+ pvrVer[0x33] = 0;
+
+ for(int i = 0x28; i < streamData.Length; i++)
+ {
+ pvrVer[i + 0xC] = streamData[i];
+ }
+
+ PVRFile pvr = new PVRFile(pvrVer);
+ Bitmap subBmp = pvr.AsBitmap();
+
+ g.DrawImage(subBmp, new Point(pInfo.x, pInfo.y));
+ }
+ }
+
+ return bmp;
+ }
+
+ public void SaveBitmap(Bitmap bmp, string path)
+ {
+ if (noInit)
+ if (!AskForInfo())
+ throw new Exception("Can't proceed without ZSTREAM information");
+
+ int pos = 0;
+ byte[] outBytes = new byte[placementInfos.Last().position + placementInfos.Last().length + 0x28];
+
+ string fmt = this.meta.format.ToLower();
+ int half = fmt.Length / 2;
+
+ char ch1 = (char)((0 < half) ? fmt[0] : 0);
+ char ch2 = (char)((1 < half) ? fmt[1] : 0);
+ char ch3 = (char)((2 < half) ? fmt[2] : 0);
+ char ch4 = (char)((3 < half) ? fmt[3] : 0);
+ char va1 = (char)((half < fmt.Length) ? fmt[half] : 0);
+ char va2 = (char)(((half + 1) < fmt.Length) ? fmt[half + 1] : 0);
+ char va3 = (char)(((half + 2) < fmt.Length) ? fmt[half + 2] : 0);
+ char va4 = (char)(((half + 3) < fmt.Length) ? fmt[half + 3] : 0);
+
+ fmt = new string(new char[] { ch1, va1, ch2, va2, ch3, va3, ch4, va4 });
+
+ foreach (PlacementInfo pInfo in placementInfos)
+ {
+ Bitmap subbmp = bmp.Clone(new Rectangle(pInfo.x, pInfo.y, pInfo.w, pInfo.h), bmp.PixelFormat);
+
+ PVRFile pvr = new PVRFile(subbmp, fmt);
+ byte[] asData = pvr.Save().Skip(0x44).ToArray();
+ byte[] header = new byte[0x28];
+
+ subbmp.Dispose();
+
+ int fullLen = pInfo.length + 0x28;
+
+ header[0] = (byte)((fullLen >> 24) & 0xFF);
+ header[1] = (byte)((fullLen >> 16) & 0xFF);
+ header[2] = (byte)((fullLen >> 8) & 0xFF);
+ header[3] = (byte)(fullLen & 0xFF);
+
+ header[4] = 0;
+ header[5] = 0x28;
+
+ header[6] = (byte)((pInfo.w >> 8) & 0xFF);
+ header[7] = (byte)(pInfo.w & 0xFF);
+
+ header[8] = (byte)((pInfo.h >> 8) & 0xFF);
+ header[9] = (byte)(pInfo.h & 0xFF);
+
+ header[0xA] = (byte)((this.atlas >> 8) & 0xFF);
+ header[0xB] = (byte)(this.atlas & 0xFF);
+
+ header[0xC] = 0;
+ header[0xD] = 0;
+ header[0xE] = 0;
+ header[0xF] = 0;
+ header[0x10] = 0;
+ header[0x11] = 0;
+ header[0x12] = 0;
+ header[0x13] = 0;
+ header[0x14] = 0;
+ header[0x15] = 0;
+ header[0x16] = 0;
+ header[0x17] = 0;
+
+ header[0x18] = 0;
+ header[0x19] = 1;
+ header[0x1A] = 0;
+ header[0x1B] = 1;
+ header[0x1C] = 0;
+ header[0x1D] = 1;
+ header[0x1E] = 0;
+ header[0x1F] = 1;
+
+ int fmtLen = this.meta.format.Length;
+ header[0x20] = (byte)((0 < fmtLen) ? this.meta.format[0] : 0);
+ header[0x21] = (byte)((1 < fmtLen) ? this.meta.format[1] : 0);
+ header[0x22] = (byte)((2 < fmtLen) ? this.meta.format[2] : 0);
+ header[0x23] = (byte)((3 < fmtLen) ? this.meta.format[3] : 0);
+ header[0x24] = (byte)((4 < fmtLen) ? this.meta.format[4] : 0);
+ header[0x25] = (byte)((5 < fmtLen) ? this.meta.format[5] : 0);
+ header[0x26] = (byte)((6 < fmtLen) ? this.meta.format[6] : 0);
+ header[0x27] = (byte)((7 < fmtLen) ? this.meta.format[7] : 0);
+
+ foreach (byte b in header)
+ outBytes[pos++] = b;
+
+ foreach (byte b in asData)
+ outBytes[pos++] = b;
+ }
+
+ using (MemoryStream outMS = new MemoryStream())
+ {
+ using (MemoryStream inMS = new MemoryStream(outBytes))
+ {
+ using (Aspose.Zip.SevenZip.SevenZipArchive archive = new Aspose.Zip.SevenZip.SevenZipArchive())
+ {
+ archive.CreateEntry(Path.GetFileNameWithoutExtension(path) + ".zstream", inMS);
+
+ archive.Save(outMS);
+ }
+ }
+
+ outBytes = outMS.ToArray();
+ }
+
+
+ File.WriteAllBytes(path + ".7z", outBytes);
+ }
+
+ private bool AskForInfo()
+ {
+ string[] apps = new string[] { "ArtPacker", "Adobe" };
+ using (MCQAskForm mcqAskForm = new MCQAskForm(apps, "JSON creation app"))
+ {
+ if (mcqAskForm.ShowDialog() == DialogResult.OK)
+ {
+ meta.app = apps[mcqAskForm.ChosenAnswer];
+ }
+ else return false;
+ }
+
+ string[] versions = new string[] { "2.4.19" };
+ using (MCQAskForm mcqAskForm = new MCQAskForm(versions, "JSON creation app version"))
+ {
+ if (mcqAskForm.ShowDialog() == DialogResult.OK)
+ {
+ meta.version = versions[mcqAskForm.ChosenAnswer];
+ }
+ else return false;
+ }
+
+ string[] formats = new string[] { "RGBA4444", "RGBA8888", "RGB565" };
+ using (MCQAskForm mcqAskForm = new MCQAskForm(formats, "JSON image format"))
+ {
+ if (mcqAskForm.ShowDialog() == DialogResult.OK)
+ {
+ meta.format = formats[mcqAskForm.ChosenAnswer];
+ }
+ else return false;
+ }
+
+ string[] encryptions = (new string[] { "None" }).Concat(keyNames).Concat(new string[] { "Custom" }).ToArray();
+ using (ComboAskForm comboAskForm = new ComboAskForm(encryptions, "JSON encryption"))
+ {
+ if (comboAskForm.ShowDialog() == DialogResult.OK)
+ {
+ if (comboAskForm.ComboIndex > 0 && comboAskForm.ComboIndex < encryptions.Length - 1)
+ this.encKey = keyList[comboAskForm.ComboIndex - 1];
+ else if (comboAskForm.ComboIndex == encryptions.Length - 1)
+ {
+ string answer = Interaction.InputBox("Custom key:", "Enter a custom key");
+ this.encKey = answer;
+ }
+ else
+ this.encKey = "";
+ }
+ else return false;
+ }
+
+ string[] lzmas = new string[] { "Yes", "No" };
+ using (MCQAskForm mcqAskForm = new MCQAskForm(lzmas, "JSON LZMA Compression?"))
+ {
+ if (mcqAskForm.ShowDialog() == DialogResult.OK)
+ {
+ this.wasLZMA = (mcqAskForm.ChosenAnswer == 0) ? true : false;
+ }
+ else return false;
+ }
+
+ using (NumUpDownAskForm numUpDownAskForm = new NumUpDownAskForm(0, 0, 255, 1))
+ {
+ numUpDownAskForm.Title = "Atlas ID";
+ if (numUpDownAskForm.ShowDialog() == DialogResult.OK)
+ {
+ this.atlas = (int)numUpDownAskForm.NumValue;
+ }
+ else return false;
+ }
+
+ this.noInit = false;
+ return true;
+ }
+
+ public byte[] Save()
+ {
+ if (noInit)
+ if (!AskForInfo())
+ throw new Exception("Can't proceed without ZSTREAM information");
+
+ JObject root = new JObject();
+
+ int position = 0;
+ this.placementInfos.Clear();
+
+ JArray jframes = new JArray();
+ foreach(DATFile.SpriteData.Sprite sprite in associatedSD.sprites)
+ {
+ JObject jframeentry = new JObject();
+
+ JArray jextrude = new JArray();
+ jextrude.Add(0);
+ jextrude.Add(0);
+ jextrude.Add(0);
+ jextrude.Add(0);
+ jframeentry.Add("extrude", jextrude);
+
+ jframeentry.Add("filename", sprite.name);
+
+ JObject jframe = new JObject();
+ int xPad = (sprite.rect.X <= 0) ? 0 : 1;
+ int yPad = (sprite.rect.Y <= 0) ? 0 : 1;
+ jframe.Add("h", sprite.rect.Height);
+ jframe.Add("w", sprite.rect.Width);
+ jframe.Add("x", sprite.rect.X - xPad);
+ jframe.Add("y", sprite.rect.Y - yPad);
+ jframeentry.Add("frame", jframe);
+
+ JObject jpivot = new JObject();
+ jpivot.Add("x", sprite.orig.X);
+ jpivot.Add("y", sprite.orig.Y);
+ jframeentry.Add("pivot", jpivot);
+
+ jframeentry.Add("rotated", false);
+
+ JObject jstream = new JObject();
+ int wPad = xPad + (((sprite.rect.X + sprite.rect.Width) >= this.meta.sizeW) ? 0 : 1);
+ int hPad = yPad + (((sprite.rect.Y + sprite.rect.Height) >= this.meta.sizeH) ? 0 : 1);
+
+ int fmtBitsSum = 0;
+ for (int i = (this.meta.format.Length / 2); i < this.meta.format.Length; i++)
+ fmtBitsSum += Convert.ToInt32(this.meta.format[i].ToString());
+ int length = fmtBitsSum * ((sprite.rect.Width + wPad) * (sprite.rect.Height + hPad)) / 8;
+
+ jstream.Add("atlas", this.atlas);
+ jstream.Add("height", sprite.rect.Height + hPad);
+ jstream.Add("length", length);
+ jstream.Add("position", position);
+ jstream.Add("width", sprite.rect.Width + wPad);
+ jframeentry.Add("stream", jstream);
+
+ PlacementInfo pInfo = new PlacementInfo();
+ pInfo.x = sprite.rect.X - xPad;
+ pInfo.y = sprite.rect.Y - yPad;
+ pInfo.w = sprite.rect.Width + wPad;
+ pInfo.h = sprite.rect.Height + hPad;
+ pInfo.position = position;
+ pInfo.length = length;
+ placementInfos.Add(pInfo);
+
+ position += 0x28 + length;
+
+ jframes.Add(jframeentry);
+ }
+ root.Add("frames", jframes);
+
+ JObject jmeta = new JObject();
+ jmeta.Add("app", this.meta.app);
+ jmeta.Add("format", this.meta.format);
+ jmeta.Add("image", this.meta.image);
+
+ JObject jsize = new JObject();
+ jsize.Add("h", this.meta.sizeH);
+ jsize.Add("scale", this.meta.scale);
+ jsize.Add("w", this.meta.sizeW);
+ jmeta.Add("size", jsize);
+
+ jmeta.Add("version", this.meta.version);
+
+ root.Add("meta", jmeta);
+
+
+ byte[] outBytes = Encoding.UTF8.GetBytes(root.ToString(Newtonsoft.Json.Formatting.None));
+
+ if (wasLZMA)
+ {
+ SevenZip.Compression.LZMA.Encoder lzmaEncoder = new SevenZip.Compression.LZMA.Encoder();
+
+ CoderPropID[] propIDs =
+ {
+ CoderPropID.Algorithm
+ };
+
+ object[] properties =
+ {
+ (System.Int32)(1)
+ };
+
+ lzmaEncoder.SetCoderProperties(propIDs, properties);
+
+ MemoryStream msIn = new MemoryStream(outBytes);
+ using (MemoryStream msOut = new MemoryStream())
+ {
+ lzmaEncoder.Code(msIn, msOut, msIn.Length, -1, null);
+
+ msIn.Close();
+
+ UInt64 tLen = (UInt64)outBytes.Length;
+
+ byte[] header = new byte[] { 0x89, 0x4C, 0x5A, 0x4D, 0x41, 0x0D, 0x0A, 0x1A, 0x0A,
+ 0x5D, 0x00, 0x00, 0x01, 0x00,
+ (byte)(tLen & 0xFF),
+ (byte)((tLen >> 8) & 0xFF),
+ (byte)((tLen >> 16) & 0xFF),
+ (byte)((tLen >> 24) & 0xFF),
+ (byte)((tLen >> 32) & 0xFF),
+ (byte)((tLen >> 40) & 0xFF),
+ (byte)((tLen >> 48) & 0xFF),
+ (byte)((tLen >> 52) & 0xFF)
+ };
+
+ outBytes = header.Concat(msOut.ToArray()).ToArray();
+ }
+ }
+
+ if (encKey != "")
+ {
+ try
+ {
+ outBytes = Encrypt(outBytes, encKey);
+ }
+ catch (Exception) {
+ throw new Exception("Couldn't encrypt file.");
+ }
+ }
+
+ return outBytes;
+ }
+
+
+ public static byte[] Decrypt(byte[] cipherData, string keyString)
+ {
+ byte[] key = new byte[32];
+ for (int i = 0; i < keyString.Length; i += 2)
+ key[i / 2] = Convert.ToByte(keyString.Substring(i, 2), 16);
+
+ byte[] iv = new byte[16];
+
+ try
+ {
+ using (var rijndaelManaged =
+ new RijndaelManaged { Key = key, IV = iv, Mode = CipherMode.CBC })
+ using (var memoryStream =
+ new MemoryStream(cipherData))
+ using (var cryptoStream =
+ new CryptoStream(memoryStream,
+ rijndaelManaged.CreateDecryptor(key, iv),
+ CryptoStreamMode.Read))
+ using (var memoryStream2 =
+ new MemoryStream())
+ {
+ (new StreamReader(cryptoStream)).BaseStream.CopyTo(memoryStream2);
+ return memoryStream2.ToArray();
+ }
+ }
+ catch (CryptographicException e)
+ {
+ Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
+ return null;
+ }
+ }
+ public static byte[] Encrypt(byte[] cipherData, string keyString)
+ {
+ byte[] key = new byte[32];
+ for (int i = 0; i < keyString.Length; i += 2)
+ key[i / 2] = Convert.ToByte(keyString.Substring(i, 2), 16);
+
+ byte[] iv = new byte[16];
+
+ try
+ {
+ using (var rijndaelManaged =
+ new RijndaelManaged { Key = key, IV = iv, Mode = CipherMode.CBC })
+ using (var memoryStream =
+ new MemoryStream(cipherData))
+ using (var cryptoStream =
+ new CryptoStream(memoryStream,
+ rijndaelManaged.CreateEncryptor(key, iv),
+ CryptoStreamMode.Read))
+ using (var memoryStream2 =
+ new MemoryStream())
+ {
+ (new StreamReader(cryptoStream)).BaseStream.CopyTo(memoryStream2);
+ return memoryStream2.ToArray();
+ }
+ }
+ catch (CryptographicException e)
+ {
+ Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
+ return null;
+ }
+ }
+ }
+}
diff --git a/ABStudio/Forms/ComboAskForm.Designer.cs b/ABStudio/Forms/ComboAskForm.Designer.cs
new file mode 100644
index 0000000..9a664af
--- /dev/null
+++ b/ABStudio/Forms/ComboAskForm.Designer.cs
@@ -0,0 +1,79 @@
+
+namespace ABStudio.Forms
+{
+ partial class ComboAskForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.questionComboBox = new System.Windows.Forms.ComboBox();
+ this.okButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // questionComboBox
+ //
+ this.questionComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.questionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.questionComboBox.FormattingEnabled = true;
+ this.questionComboBox.Location = new System.Drawing.Point(12, 12);
+ this.questionComboBox.Name = "questionComboBox";
+ this.questionComboBox.Size = new System.Drawing.Size(317, 21);
+ this.questionComboBox.TabIndex = 0;
+ //
+ // okButton
+ //
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.okButton.Location = new System.Drawing.Point(131, 39);
+ this.okButton.Name = "okButton";
+ this.okButton.Size = new System.Drawing.Size(75, 23);
+ this.okButton.TabIndex = 1;
+ this.okButton.Text = "OK";
+ this.okButton.UseVisualStyleBackColor = true;
+ //
+ // ComboAskForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(341, 74);
+ this.Controls.Add(this.okButton);
+ this.Controls.Add(this.questionComboBox);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "ComboAskForm";
+ this.ShowIcon = false;
+ this.Text = "Question";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ComboBox questionComboBox;
+ private System.Windows.Forms.Button okButton;
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Forms/ComboAskForm.cs b/ABStudio/Forms/ComboAskForm.cs
new file mode 100644
index 0000000..5e7a860
--- /dev/null
+++ b/ABStudio/Forms/ComboAskForm.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ABStudio.Forms
+{
+ public partial class ComboAskForm : Form
+ {
+ public int ComboIndex
+ {
+ get => questionComboBox.SelectedIndex;
+ set => questionComboBox.SelectedIndex = value;
+ }
+
+ public ComboAskForm(string[] coll, string question)
+ {
+ InitializeComponent();
+
+ this.Text = question;
+ int winSize = TextRenderer.MeasureText(question, this.Font).Width + 97;
+
+ questionComboBox.Items.Clear();
+ for (int i = 0; i < coll.Length; i++)
+ {
+ questionComboBox.Items.Add(coll[i]);
+ int maybeWinSize = TextRenderer.MeasureText(coll[i], questionComboBox.Font).Width + 66;
+ if (maybeWinSize > winSize)
+ winSize = maybeWinSize;
+ }
+
+ if (questionComboBox.Items.Count > 0)
+ questionComboBox.SelectedIndex = 0;
+
+ this.Width = winSize;
+ okButton.Location = new Point(winSize / 2 - okButton.Width / 2, okButton.Location.Y);
+ }
+ }
+}
diff --git a/ABStudio/Forms/ComboAskForm.resx b/ABStudio/Forms/ComboAskForm.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/ABStudio/Forms/ComboAskForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ABStudio/Forms/MCQAskForm.Designer.cs b/ABStudio/Forms/MCQAskForm.Designer.cs
new file mode 100644
index 0000000..e4493ce
--- /dev/null
+++ b/ABStudio/Forms/MCQAskForm.Designer.cs
@@ -0,0 +1,51 @@
+
+namespace ABStudio.Forms
+{
+ partial class MCQAskForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // MCQAskForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(441, 47);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "MCQAskForm";
+ this.ShowIcon = false;
+ this.Text = "Question";
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Forms/MCQAskForm.cs b/ABStudio/Forms/MCQAskForm.cs
new file mode 100644
index 0000000..b3b74d3
--- /dev/null
+++ b/ABStudio/Forms/MCQAskForm.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ABStudio.Forms
+{
+ public partial class MCQAskForm : Form
+ {
+ public int ChosenAnswer => chosenAnswer;
+
+ private int chosenAnswer;
+
+ public MCQAskForm(string[] answers, string question)
+ {
+ InitializeComponent();
+
+ this.Text = question;
+ int winSize = TextRenderer.MeasureText(question, this.Font).Width + 97;
+
+ int currX = 12;
+ for (int i = 0; i < answers.Length; i++)
+ {
+ Button btn = new Button();
+ btn.Location = new Point(currX, 12);
+ btn.Text = answers[i];
+ btn.Tag = i;
+
+ btn.Width = TextRenderer.MeasureText(answers[i], btn.Font).Width + 38;
+ currX += btn.Width + 6;
+
+ btn.Click += new EventHandler(this.answerButton_Click);
+ this.Controls.Add(btn);
+ }
+
+ this.Width = Math.Max(winSize, currX + 22);
+ }
+
+ private void answerButton_Click(object sender, EventArgs e)
+ {
+ this.chosenAnswer = (int)((sender as Button).Tag);
+ this.DialogResult = DialogResult.OK;
+ }
+ }
+}
diff --git a/ABStudio/Forms/MCQAskForm.resx b/ABStudio/Forms/MCQAskForm.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/ABStudio/Forms/MCQAskForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ABStudio/Forms/Main.Designer.cs b/ABStudio/Forms/Main.Designer.cs
new file mode 100644
index 0000000..d3efb58
--- /dev/null
+++ b/ABStudio/Forms/Main.Designer.cs
@@ -0,0 +1,127 @@
+
+namespace ABStudio.Forms
+{
+ partial class Main
+ {
+ ///
+ /// Variable nécessaire au concepteur.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Nettoyage des ressources utilisées.
+ ///
+ /// true si les ressources managées doivent être supprimées ; sinon, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Code généré par le Concepteur Windows Form
+
+ ///
+ /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
+ /// le contenu de cette méthode avec l'éditeur de code.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
+ this.menuStrip = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openButton = new System.Windows.Forms.Button();
+ this.newButton = new System.Windows.Forms.Button();
+ this.menuStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // menuStrip
+ //
+ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem});
+ this.menuStrip.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip.Name = "menuStrip";
+ this.menuStrip.Size = new System.Drawing.Size(320, 24);
+ this.menuStrip.TabIndex = 0;
+ this.menuStrip.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.newToolStripMenuItem,
+ this.openToolStripMenuItem});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.fileToolStripMenuItem.Text = "File";
+ //
+ // newToolStripMenuItem
+ //
+ this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+ this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+ this.newToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
+ this.newToolStripMenuItem.Text = "New";
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(155, 22);
+ this.openToolStripMenuItem.Text = "Open...";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+ //
+ // openButton
+ //
+ this.openButton.Location = new System.Drawing.Point(163, 27);
+ this.openButton.Name = "openButton";
+ this.openButton.Size = new System.Drawing.Size(145, 23);
+ this.openButton.TabIndex = 1;
+ this.openButton.Text = "Open...";
+ this.openButton.UseVisualStyleBackColor = true;
+ this.openButton.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
+ //
+ // newButton
+ //
+ this.newButton.Location = new System.Drawing.Point(12, 27);
+ this.newButton.Name = "newButton";
+ this.newButton.Size = new System.Drawing.Size(145, 23);
+ this.newButton.TabIndex = 2;
+ this.newButton.Text = "New";
+ this.newButton.UseVisualStyleBackColor = true;
+ this.newButton.Click += new System.EventHandler(this.newButton_Click);
+ //
+ // Main
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(320, 62);
+ this.Controls.Add(this.newButton);
+ this.Controls.Add(this.openButton);
+ this.Controls.Add(this.menuStrip);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MainMenuStrip = this.menuStrip;
+ this.Name = "Main";
+ this.Text = "AB Classic Studio";
+ this.Load += new System.EventHandler(this.Main_Load);
+ this.Resize += new System.EventHandler(this.Main_Resize);
+ this.menuStrip.ResumeLayout(false);
+ this.menuStrip.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.MenuStrip menuStrip;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+ private System.Windows.Forms.Button openButton;
+ private System.Windows.Forms.Button newButton;
+ }
+}
+
diff --git a/ABStudio/Forms/Main.cs b/ABStudio/Forms/Main.cs
new file mode 100644
index 0000000..3c64650
--- /dev/null
+++ b/ABStudio/Forms/Main.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ABStudio.FileFormats.DAT;
+using ABStudio.Misc;
+
+namespace ABStudio.Forms
+{
+ public partial class Main : Form
+ {
+ public Main()
+ {
+ InitializeComponent();
+ }
+
+
+ private void Main_Load(object sender, EventArgs e)
+ {
+ Main_Resize(sender, e);
+
+ foreach(string displayName in Common.DisplayNames)
+ {
+ ToolStripMenuItem item = new ToolStripMenuItem(displayName);
+ item.Name = "new" + displayName + "ToolStripMenuItem";
+ item.Click += new System.EventHandler(newFileToolStripMenuItem_Click);
+
+ newToolStripMenuItem.DropDownItems.Add(item);
+ }
+ }
+
+ private void Main_Resize(object sender, EventArgs e)
+ {
+ int wPerButton = (this.Size.Width - 46) / 2;
+ int hPerButton = this.Size.Height - 78;
+ newButton.Size = new Size(wPerButton, hPerButton);
+ openButton.Location = new Point(this.Size.Width - wPerButton - 28, openButton.Location.Y);
+ openButton.Size = new Size(wPerButton, hPerButton);
+ }
+
+ private void newFileToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ string fullName = (sender as ToolStripMenuItem).Name;
+ string displayName = fullName.Substring(3, fullName.Length - 20);
+
+ DATFile file = Common.MakeNew(displayName);
+
+ if (file != null)
+ Common.OpenEditor("", file);
+ }
+
+ private void newButton_Click(object sender, EventArgs e)
+ {
+ DATFile file = Common.AskForNew();
+
+ if (file != null)
+ Common.OpenEditor("", file);
+ }
+
+ private void openToolStripMenuItem_Click(object sender, EventArgs e) => Common.OpenFileInNewEditor();
+ }
+}
diff --git a/ABStudio/Forms/Main.resx b/ABStudio/Forms/Main.resx
new file mode 100644
index 0000000..388a8e0
--- /dev/null
+++ b/ABStudio/Forms/Main.resx
@@ -0,0 +1,3288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ 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
+ XPLJr9wrL/nB+6KB11eVJxUqAha60boTrhBEIsAHRJwALzNFIE83wNCTUUhaEBKCUI3AFYK09ABwG2Uh
+ YgD4ZABCpBHweyGiZcJzEOWAriO8/iREuHS73eeM0P6FjoN/rNJID7jHPkF8JT1gz2E24rvkT6vuh8if
+ UeEHbDtV4udNfoYGyAzyMyLiA5ZvCfJbAYjIbzmbjfyDbtiM/j9M0fvZf+B9HAAAAABJRU5ErkJggigA
+ AACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAHe5v/B3uc/wd8nf8HfZ7/B32f/wh+
+ oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqErP8Kha3/Coau/wuG
+ r/8Lh7D/C4ix/wuIsv8LibP/DIq0/wyKtf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nuv8Njrv/DY68/w2O
+ vf8Oj77/DpC+/w6Qv/8OkMD/DpDA/w6Rwf8OkcL/D5LC/w+Sw/8PksP/D5LE/w+SxP8Pk8X/D5PF/w+U
+ xv8PlMb/D5TG/w+Ux/8PlMf/D5TH/w+Ux/8Qlcj/EJXI/xCVyP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCV
+ yP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCUx/8PlMf/D5TH/w+Ux/8Pk8b/D5TG/w+Uxv8Pk8X/D5PF/w+T
+ xf8PksT/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkcH/DpDA/w6QwP8OkL//Do++/w6Pvf8Njr3/DY68/w2N
+ u/8Njbr/DY25/w2MuP8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIs/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqE
+ rf8KhKz/CoSr/wqDqv8Jg6n/CYOo/wmCp/8Jgqb/CYGk/wiAo/8If6L/CH6h/wh+oP8Ifp//B32e/wd8
+ nf8He5z/B3ub/wd7nP8HfJ3/B32e/wd9n/8IfqD/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgab/CYKn/wmD
+ qP8Kg6n/CoSq/wqFrP8Kha3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyKtf8Mirb/DIu3/wyL
+ uP8NjLn/DY26/w2Nuv8Njrv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8OkcL/D5LD/w+S
+ w/8PksT/D5PF/w+Txf8PlMb/D5TG/w+Uxv8PlMf/D5TH/xCVyP8QlMj/EJXI/xCWyf8Qlsn/EJXJ/xCW
+ yf8Qlcn/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlcn/EJbJ/xCV
+ yf8Qlsn/EJXI/xCVyP8Qlcj/EJXI/w+Ux/8PlMf/D5TG/w+Uxv8Pk8X/D5LF/w+SxP8PksT/D5LD/w+S
+ w/8OkcL/DpHB/w6Rwf8OkMD/DpC//w6Pvv8Oj73/DY69/w2OvP8Njbv/DY26/w2Nuf8Mi7j/DIu3/wyK
+ tv8MirX/DIq0/wyJs/8LiLL/C4ix/wuHsP8Lhq//C4au/wqFrf8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmB
+ p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh+oP8Ifp//B32e/wd8nf8He5z/B3yd/wd9nv8HfZ//CH6g/wh+
+ of8If6L/CICj/wiApP8JgKX/CYKm/wmCp/8Jg6n/CoSq/wqEq/8KhKz/CoWt/wqFrv8Lhq//C4ew/wuI
+ sf8LiLL/DImz/wyKtP8MirX/DIq2/wyLt/8MjLj/DY25/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Q
+ v/8OkMD/DpHB/w6Rwv8PksP/D5LD/w+SxP8Pk8X/D5PF/w+Uxv8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCW
+ yf8Qlcn/EJXJ/xCWyv8Qlcr/EJbK/xCXy/8Ql8v/EJbL/xCXy/8Ql8v/EJbL/xCWy/8Ql8z/EJfM/xCX
+ zP8Ql8z/EJfM/xCWy/8Qlsv/EJfL/xCWy/8Qlsv/EJfL/xCWyv8Qlsr/EJbK/xCWyv8Qlsn/EJbJ/xCV
+ yP8Qlcj/EJXI/w+Ux/8PlMf/D5PG/w+Txf8PksX/D5LE/w+SxP8PksP/DpHC/w6Rwv8OkcH/DpDA/w6Q
+ v/8OkL7/Do+9/w2Ovf8Njrz/DY27/w2Nuv8NjLn/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuH
+ sf8Lh7D/C4av/wqFrv8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+
+ oP8Ifp//B32e/wd8nf8HfZ7/B32f/wh+oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jg6j/CYOp/wqD
+ qv8Khav/CoSs/wqFrf8Lhq7/C4av/wuHsf8LiLL/C4mz/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2N
+ uv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8PksX/D5TG/w+U
+ xv8PlMf/EJTH/xCUyP8Qlcj/EJXJ/xCVyf8Qlsr/EJbK/xCXy/8Qlsv/EJbL/xCXzP8Qlsz/EJfM/xGX
+ zP8RmM3/EZfN/xGXzf8RmM3/EZjN/xGXzf8Rl83/EZfN/xGXzf8Rl83/EZjN/xGYzf8Rl83/EZjN/xGY
+ zf8Ql8z/EJfM/xCWzP8Ql8z/EJfL/xCWy/8Ql8v/EJbK/xCWyv8Qlsn/EJbJ/xCVyP8Qlcj/D5TH/w+U
+ x/8Pk8b/D5PF/w+Txf8PksT/D5LD/w+Sw/8OkcL/DpHB/w6QwP8OkL//Do++/w6Pvf8Njrz/DY68/w2N
+ u/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8MibP/C4iy/wuIsf8Lh7D/C4av/wqFrv8KhK3/CoSs/wqF
+ q/8Kg6n/CYOo/wmBp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd9n/8IfqD/CH6h/wh/
+ ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8KhKr/CoSr/wqErP8Kha3/C4av/wuHsP8Lh7H/C4iy/wuJ
+ s/8MibT/DIq1/wyKtv8Mi7f/DYy4/w2Nuf8Njbv/DY68/w2OvP8Oj73/DpC+/w6Qv/8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Txv8PlMf/EJXI/xCVyP8Qlcn/EJbK/xCWyv8Ql8v/EJbL/xCX
+ zP8Qlsz/EJfM/xGYzf8Rl83/EZfN/xGYzv8RmM7/EZjO/xGYzv8Rmc//EZnP/xGYz/8RmM//EZjP/xGY
+ z/8RmM//EZjP/xGYz/8RmM//EZjP/xGZz/8RmM7/EZjO/xGYzv8RmM7/EZjO/xGXzf8Rl83/EZjN/xCX
+ zP8Qlsz/EJbL/xCWy/8Qlsr/EJXK/xCVyf8Qlsn/EJXI/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S
+ w/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mi7f/DIq2/wyK
+ tf8MibT/C4iz/wuIsv8Lh7D/C4av/wqFrv8KhK3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiA
+ pP8IgKP/CH+i/wh+oP8Ifp//CH6g/wh+of8If6L/CICj/wmBpP8JgaX/CYKn/wmDqP8Jg6n/CoOq/wqF
+ q/8KhKz/CoWu/wuGr/8Lh7D/C4ex/wuIsv8MibP/DIq0/wyKtv8Mi7f/DIu4/w2Muf8Njbr/DY27/w2O
+ vP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Ux/8QlMf/EJXI/xCW
+ yf8Qlcn/EJbK/xCXy/8Ql8v/EJfM/xCXzP8RmM3/EZfN/xGYzv8RmM7/EZjO/xGYz/8Rmc//EZnP/xGa
+ 0P8RmdD/EZrQ/xGZ0P8RmdD/EZrR/xGa0f8RmdH/EZnR/xGZ0f8RmdH/EZrR/xGa0f8RmdD/EZnQ/xGZ
+ 0P8RmdD/EZnQ/xGa0P8Rmc//EZjP/xGZz/8RmM7/EZjO/xGXzf8Rl83/EZjN/xCXzP8Ql8z/EJbL/xCW
+ yv8Qlsr/EJbJ/xCWyf8QlMj/D5TH/w+Uxv8PlMb/D5PF/w+SxP8PksP/D5LD/w6Rwv8OkcH/DpDA/w6Q
+ v/8Oj77/DY69/w2OvP8Njbv/DY26/w2MuP8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsv8Lh7H/C4av/wuG
+ rv8Kha3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8IfqH/CH+i/wiA
+ o/8IgKT/CYGl/wmCp/8Jg6j/CYOp/wqDqv8KhKv/CoWt/wqFrv8Lhq//C4ew/wuIsf8LiLL/DIm0/wyK
+ tf8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+S
+ xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXI/xCVyf8Qlsr/EJbK/xCWy/8Ql8z/EJfM/xGXzf8Rl83/EZjO/xGY
+ zv8RmM//EZnP/xGZ0P8RmdD/EZnQ/xGZ0f8RmtH/EZrR/xKb0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa
+ 0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtH/EZrR/xGZ0f8RmtH/EZnQ/xGZ
+ 0P8RmtD/EZnP/xGZz/8RmM7/EZjO/xGXzf8RmM3/EJfM/xCWy/8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U
+ x/8Pk8b/D5TG/w+Sxf8PksT/D5LD/w6Swv8OkcH/DpDA/w6Qv/8OkL7/DY69/w2OvP8Njrv/DY26/w2M
+ uf8Mi7j/DIu3/wyKtv8MirT/C4mz/wuIsv8Lh7H/C4ew/wuGrv8Kha3/CoSs/wqFq/8KhKr/CYOp/wmC
+ p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqE
+ rf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyLt/8NjLn/DY26/w2Nu/8Njrz/DY69/w6P
+ vv8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJXI/xCWyf8Qlcr/EJfL/xCW
+ y/8Ql8z/EZjN/xGXzf8RmM7/EZjO/xGZz/8RmtD/EZnQ/xGZ0P8RmdH/EZrR/xKa0v8SmtL/EprS/xKa
+ 0/8SmtP/EpvT/xKb0/8Sm9T/EpvU/xKb1P8Sm9T/EpvU/xKc1P8SnNT/EpvU/xKb1P8Sm9T/EpvU/xKb
+ 1P8SnNT/EpvT/xKb0/8SmtP/EpvT/xKa0v8SmtL/EpvS/xGa0f8RmdH/EZnQ/xGZ0P8Rmc//EZjP/xGY
+ zv8RmM7/EZfN/xCXzP8Qlsz/EJbL/xCWyv8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S
+ w/8OkcL/DpHB/w6QwP8OkL//Do++/w2Ovf8Njrz/DY26/w2Nuf8Mi7j/DIu3/wyKtv8MirX/DImz/wuI
+ sv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqFq/8Kg6r/CYOp/wmCp/8Jgqb/CYGl/wiApP8If6L/CICj/wiA
+ pP8JgaX/CYGm/wmDqP8Jg6n/CoOq/wqEq/8KhK3/CoWu/wuGr/8Lh7D/C4iy/wuIs/8MibT/DIq1/wyK
+ tv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U
+ x/8Qlcf/EJXI/xCVyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZjP/xGZz/8RmdD/EZnR/xGa
+ 0f8SmtL/EprS/xKb0/8SmtP/EpvT/xKb1P8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc1f8SnNX/EpzW/xKc
+ 1v8SnNb/EpzW/xKc1v8SnNb/EpzW/xKc1v8Sndb/EpzV/xKc1f8SnNX/EpzV/xKd1f8SnNT/EpvU/xKb
+ 1P8Sm9P/EprT/xKa0v8SmtL/EprR/xGZ0f8RmdD/EZnQ/xGZz/8Rmc//EZjO/xGXzf8RmM3/EJbM/xCW
+ y/8Qlsr/EJbK/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Sw/8PksL/DpHB/w6QwP8OkL//Do++/w2O
+ vf8Njrz/DY27/w2Nuv8NjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqF
+ q/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKT/CYGl/wmCpv8Jg6j/CYOp/wqDqv8KhKv/CoSt/wqF
+ rv8Lhq//C4ew/wuIsv8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Muf8Njbr/DY68/w2Ovf8Oj77/DpC//w6Q
+ wP8OkcH/DpLC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCWyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGY
+ zv8RmM7/EZnP/xGZ0P8RmdD/EZnR/xKa0v8SmtL/EprT/xKb0/8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc
+ 1v8SnNb/Ep3W/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd
+ 1/8Tndf/E53X/xOd1/8Sndb/Ep3W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKb1P8SmtP/EprT/xKa
+ 0v8SmtH/EZnR/xGZ0P8RmtD/EZjP/xGYzv8Rl83/EZfN/xCXzP8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U
+ x/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvf8Njrz/DY27/w2Nuv8NjLn/DIu3/wyK
+ tv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha3/CoSs/wqFq/8KhKr/CYOo/wmBp/8Jgab/CYGl/wmA
+ pf8Jgab/CYKn/wmDqf8Kg6r/CoSr/wqFrf8Kha7/C4av/wuHsP8LiLL/C4mz/wyKtP8Mirb/DIu3/wyL
+ uP8Njbn/DY27/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCW
+ yf8Qlsr/EJbK/xCXy/8Ql8z/EZfN/xGYzv8Rmc//EZnP/xGZ0P8RmdH/EZrR/xKa0v8SmtP/EpvT/xKb
+ 1P8SnNT/EpzV/xKc1f8SnNb/Ep3W/xOd1/8Tndf/E53X/xOe2P8Tntj/E57Y/xOe2P8Tntn/E57Z/xOe
+ 2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntj/E57Y/xOe2P8Tntj/E53X/xOd
+ 1/8Tndf/E53W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKa0/8SmtL/EprS/xGa0f8RmdD/EZnQ/xGZ
+ z/8RmM7/EZfN/xGYzf8Ql8z/EJbL/xCWyv8Qlcn/EJXI/w+Ux/8PlMb/D5PF/w+SxP8PksP/DpHC/w6R
+ wf8OkMD/DpC//w6Pvv8Njrz/DY67/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuG
+ r/8Kha3/CoSs/wqEq/8KhKr/CYOo/wmCp/8Jgqb/CYKm/wmCp/8Jg6n/CoOq/wqEq/8KhKz/CoWu/wuG
+ r/8Lh7D/C4iy/wuJs/8MirT/DIq2/wyLt/8Mi7j/DY25/w2Nu/8Njrz/DY69/w6Qvv8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcn/EJbK/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZnP/xGZ
+ 0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzV/xKc1v8Sndb/E53X/xOd1/8Tntj/E57Y/xOe
+ 2f8Tntn/E57Z/xOf2v8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOf2/8Tn9v/E5/b/xOf
+ 2/8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOe2f8Tntn/E57Z/xOe2P8Tntj/E57Y/xOd1/8Tndf/Ep3W/xKc
+ 1v8SnNX/EpzV/xKb1P8Sm9P/EprT/xKa0v8RmtH/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Rl8z/EJfM/xCX
+ y/8Qlsr/EJXJ/xCUyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY27/w2N
+ uv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuGr/8Kha3/CoSs/wqEq/8Kg6n/CYKo/wmC
+ p/8Jgqf/CYOo/wqEqv8KhKv/CoSs/wqFrv8Lhq//C4ew/wuIsv8LibP/DIq0/wyKtv8Mi7f/DIy4/w2N
+ uv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8PlMb/D5TH/xCVyP8Qlsn/EJbK/xCX
+ y/8Ql8z/EZjN/xGXzf8RmM7/EZnP/xGZ0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzW/xKd
+ 1v8Tndf/E53X/xOe2P8Tntj/E57Z/xOe2f8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOg2/8UoNz/FKDc/xSg
+ 3P8UoNz/FKHc/xSh3P8Uodz/FKHc/xSh3P8Uodz/FKHc/xSg3P8UoNz/FKDc/xSg2/8ToNv/E5/b/xOf
+ 2/8Tn9r/E5/a/xOf2v8Tntn/E57Z/xOe2P8Tntj/E53X/xOd1/8Sndb/EpzW/xKc1f8SnNT/EpvU/xKa
+ 0/8SmtL/EZrR/xGa0f8RmdD/EZjP/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/xCVyP8PlMf/D5PG/w+T
+ xf8PksT/D5LD/w6Rwv8OkcH/DpC//w6Pvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuI
+ sv8Lh7H/C4ew/wuGrv8KhK3/CoSs/wqEqv8Jg6n/CYKo/wmCqP8Kg6n/CoSr/wqErP8Kha3/C4av/wuH
+ sP8LiLL/C4iz/wyKtP8Mirb/DIu3/wyMuP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S
+ xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJbM/xGXzf8RmM7/EZjP/xGZ0P8RmdH/EprR/xKa
+ 0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2P8Tntn/E5/a/xOf2v8Tn9v/E5/b/xOf
+ 2/8UoNz/FKDb/xSh3f8Uo9//E5/b/xKSyP8OgbL/C2mP/wlVdv8IQ1z/Bz9Y/wc/WP8IQlv/CExp/wpk
+ i/8Ne6r/EY/G/xOd2f8Uot7/FKHe/xSg3P8Uodz/FKHc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E5/a/xOe
+ 2f8Tntn/E57Y/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xGa0f8RmdD/EZnP/xGZ
+ z/8RmM7/EZjN/xCWzP8Ql8v/EJbK/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6Rwv8OkcH/DpDA/w6Q
+ vv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGrv8KhK3/CoWs/wqE
+ qv8Jg6n/CYOp/wqFq/8KhKz/CoWt/wuGr/8Lh7D/C4ix/wuIs/8MibT/DIq1/wyLt/8Mi7j/DY26/w2N
+ u/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJbL/xGX
+ zP8Rl83/EZjO/xGZz/8RmdD/EZrR/xKa0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe
+ 2f8Tntn/E5/a/xOf2/8Tn9v/FKDb/xSi3v8SmNH/CmOI/wMpOf8ACg3/AAQF/wALDv8ABAX/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAME/wAJDP8ABAX/AAoO/wEY
+ Iv8HQlz/EIzB/xSh3v8UoN3/FKHc/xSg3P8UoNv/E5/b/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd
+ 1/8SnNb/EpzV/xKc1P8Sm9P/EprT/xKa0v8RmdH/EZnQ/xGYz/8RmM7/EZfN/xCWzP8Qlsv/EJbK/xCW
+ yf8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyK
+ tv8MirX/DIm0/wuIsv8Lh7H/C4av/wqFrv8KhK3/CoSr/wqDqv8KhKr/CoWs/wqErf8Lhq7/C4ew/wuH
+ sf8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Nuf8Njbv/DY68/w6Pvv8OkL//DpDA/w6Rwf8PksP/D5LE/w+T
+ xf8PlMb/EJTH/xCWyf8Qlsr/EJbL/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc
+ 1P8SnNX/EpzW/xOd1/8Tntj/E57Y/xOe2f8Tn9r/E5/a/xOf2/8UoNz/EpjS/wdCW/8ABwn/AAcI/wAC
+ Av8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAgL/wAHCf8DJDL/DXmn/xSi
+ 3v8UoNz/FKDc/xOg2/8Tn9v/E5/a/xOe2f8Tntn/E57Y/xOd1/8Tndf/EpzW/xKc1f8Sm9T/EpvT/xKa
+ 0v8RmtH/EZnQ/xGZz/8RmM7/EZjO/xGXzP8Qlsv/EJbK/xCWyf8QlMj/D5TH/w+Txv8Pk8X/D5LE/w6R
+ wv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DImz/wuIsv8Lh7H/C4av/wqF
+ rv8KhKz/CoSr/wqFq/8KhK3/CoWu/wuGr/8Lh7H/C4iy/wyJtP8MirX/DIu3/wyLuP8Njbn/DY27/w2O
+ vP8Oj73/DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlcn/EJbK/xCWy/8Qlsz/EZfN/xGY
+ zv8Rmc//EZnQ/xGa0f8SmtL/EprT/xKb1P8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOf
+ 2/8Sls7/BDBC/wAEBv8AAgL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BgYG/wQE
+ BP8CAgL/BwcH/wgICP8EBAT/AAAA/wAAAP8CAgL/BgYG/wgICP8FBQX/AgIC/wcHB/8DAwP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAkM/wAICf8JVXb/FKHd/xSg2/8UoNz/E5/b/xOf
+ 2v8Tntn/E57Z/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpvU/xKa0/8SmtL/EZnR/xGZ0P8RmM//EZjO/xGX
+ zf8Qlsz/EJfL/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2N
+ uv8NjLn/DIu3/wyKtv8MirX/C4mz/wuIsv8Lh7D/C4av/wqGrv8KhKz/CoSs/wqFrv8Lhq//C4ex/wuI
+ sv8MibP/DIq1/wyKtv8Mi7j/DYy5/w2Nu/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+U
+ x/8Qlcj/EJbJ/xCWyv8Qlsv/EJfM/xGXzf8RmM7/EZnQ/xGZ0f8SmtL/EprT/xKb1P8SnNX/EpzV/xKd
+ 1v8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOh3f8KWXv/AAgK/wACAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8GBgb/BAQE/w4ODv89PT3/d3d3/5WVlf+dnZ3/np6e/52dnf+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc
+ nP+cnJz/nJyc/52dnf+dnZ3/n5+f/5ycnP+NjY3/ZmZm/zU1Nf8EBAT/AQEB/wICAv8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8ACAr/AAsP/w59rP8Uod3/FKDc/xOf2/8Tn9r/E57Z/xOe2f8Tntj/E53X/xKc
+ 1v8SnNX/EpzU/xKb0/8SmtL/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Ql8z/EJbL/xCWyv8Qlcj/D5TH/w+U
+ xv8PksX/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY27/w2Nuv8NjLn/DIu3/wyKtv8MirT/C4iz/wuI
+ sf8Lh7D/C4av/wqFrf8QiK//C4av/wuHsP8LiLL/C4iz/wyKtf8Mirb/DIu3/w2Muf8Njbr/DY68/w2P
+ vf8OkL//DpDA/w6Rwf8PksP/D5LE/w+Txf8PlMf/EJTI/xCWyf8Qlsr/EJbL/xGYzf8RmM7/EZjP/xGZ
+ 0P8RmdH/EprS/xKa0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tntn/E5/a/xOh3f8GOlH/AAYH/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AwMD/wYGBv8xMTH/goKC/52dnf+dnZ3/nJyc/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/5ycnP+dnZ3/m5ub/2tra/8cHBz/AgIC/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAI
+ Cf8ITWr/FKLe/xSg3P8Tn9v/E5/a/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGa
+ 0f8Rmc//EZjO/xGYzf8Qlsz/EJfL/xCWyv8Qlsn/D5TH/w+Uxv8PksX/D5LE/w6Rwv8OkcH/DpC//w6P
+ vv8Njr3/DY67/w2Nuv8NjLj/DIu3/wyKtf8MibT/C4iz/wuIsf8Lh7D/Coau/yaUt/8olbn/G5C3/wqI
+ sv8MirT/DIq2/wyLt/8NjLn/DY26/w2OvP8Njr3/Do++/w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TH/xCU
+ yP8Qlsn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8Sm9P/EpzU/xKc1f8Sndb/E53X/xOe
+ 2P8Tntn/E5/a/xOg2/8ITmv/AAcI/wAAAP8AAAD/AAAA/wAAAP8CAgL/BgYG/05OTv+bm5v/nJyc/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/lJSU/zg4OP8EBAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8ABgf/B0Jc/xSh3f8ToNv/E5/b/xOf
+ 2v8Tntn/E57Y/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCV
+ yv8Qlsn/D5TH/w+Uxv8Pk8X/D5LE/w6Swv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuv8Mi7j/DIu3/wyK
+ tf8MibT/C4iy/wuHsf8Lhq//J5S4/yqXu/8rmLz/LJi+/yiXvv8Li7f/DIy4/w2Nuv8Njrv/DY69/w6P
+ vv8OkMD/DpHB/w+Sw/8PksT/D5LF/w+Txv8Qlcj/EJbJ/xCWyv8Qlsv/EZfN/xGYzv8RmM//EZnQ/xGa
+ 0f8SmtL/EpvU/xKc1f8SnNb/E53X/xOe2P8Tntn/E5/a/xOf2v8Qi7//AAkL/wAAAP8AAAD/AAAA/wAA
+ AP8EBAT/MDAw/5iYmP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+cnJz/nZ2d/56env+fn5//nJyc/5ycnP+Ojo7/FBQU/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAcK/wtjiP8UoNv/E5/b/xOf2v8Tntn/E57Y/xOd1/8Sndb/EpzV/xKc
+ 1P8SmtP/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJbL/xCVyv8Qlsn/D5TH/w+Uxv8Pk8X/D5LD/w6R
+ wv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuf8Mi7j/DIq2/wyKtf8MibP/C4iy/wuHsP8plrr/Kpe8/yyY
+ vf8umb//L5vB/zGdw/8yncT/EpC8/w2OvP8Oj77/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJXI/xCW
+ yf8Qlsr/EJbL/xGXzf8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb1P8SnNX/EpzW/xOd1/8Tntj/E57Z/xOf
+ 2v8Tn9v/BCc1/wACAv8AAAD/AAAA/wAAAP8CAgL/VFRU/56env+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/m5ub/52dnf+lpaX/r6+v/7m5uf/BwcH/xMTE/8fH
+ x//IyMj/yMjI/8jIyP/Hx8f/xMTE/8HBwf+6urr/srKy/6mpqf+goKD/nJyc/4aGhv87Ozv/FxcX/wcH
+ B/8DAwP/AQEB/wgICP8JCQn/DAwM/wQEBP8DAwP/BAQE/wQEBP8CAgL/CAgI/wMDA/8AAAD/AAAA/wAH
+ CP8TnNb/FKDb/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1P8Sm9P/EprS/xGZ0f8RmND/EZjP/xGX
+ zf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Rwv8OkMD/DpC//w6Pvf8Njrz/DY26/w2M
+ uf8Mi7f/DIq2/wyKtP8LiLP/C4ix/yqXu/8rl73/LZm+/y+bwf8wncP/M57E/zWgxv83osj/OaTK/x6W
+ w/8NkMD/DpHC/w+Sw/8Pk8X/D5PG/xCVyP8Qlcn/EJXK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EprS/xKa
+ 0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tn9r/E57a/wAHCf8AAAD/AAAA/wAAAP8BAQH/GRkZ/zU1
+ Nf9tbW3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nJyc/52dnf+wsLD/xcXF/8rK
+ yv/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/CAgI/wICAv8CAgL/BwcH/zs7O/9wcHD/mJiY/6ampv+qqqr/qKio/6io
+ qP+oqKj/qKio/6ioqP+qqqr/pqam/3l5ef8SEhL/BQUF/wAGB/8IVHP/FKDb/xOf2/8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+U
+ xv8PksT/D5LD/w6Rwf8OkMD/Do++/w2Ovf8Njbv/DY26/w2MuP8Mi7f/DIq1/wyJtP8LiLL/Kpi8/yyZ
+ vv8um8D/MJzB/zKexP80n8X/N6LI/zijyf86pMv/O6XM/z6nzv8wocv/C5DE/w+Uxv8PlMf/EJbJ/xCW
+ yv8Ql8v/EZjN/xGYzv8RmM//EZnQ/xKa0v8SmtP/EpvU/xKc1f8Sndb/E53X/xOe2P8Tntn/E5/a/xKW
+ zv8ACAr/AAAA/wAAAP8AAAD/CAgI/zU1Nf81NTX/NTU1/zg4OP+ampr/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+cnJz/pKSk/8PDw//Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/5ycnP8GBgb/paWl/6io
+ qP+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en
+ p/+mpqb/CQkJ/wAAAP8BFR3/FKDd/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ
+ 0f8RmND/EZjP/xGXzf8Qlsz/EJbL/xCVyf8QlMj/D5TH/w+Txf8PksT/D5LD/w6Rwf8OkMD/Do++/w2O
+ vf8Njbv/DY26/wyLuP8Lirb/HpK6/yeXvP8smL3/LZm//y+bwf8xncP/NJ/F/zWgxv83osj/OaTK/zul
+ zP89ps3/P6jP/0Gq0P9Dq9L/QKrS/xGWyf8Qlsr/EJbL/xCXzP8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb
+ 1P8SnNX/Ep3W/xOd1/8Tntn/E5/a/xOf2/8Rkcf/AAYI/wAAAP8AAAD/AQEB/ykpKf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/zc3N/+dnZ3/nZ2d/52dnf+dnZ3/vb29/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/CQkJ/zQ0NP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+ qP+oqKj/qKio/6ioqP+np6f/p6en/6ioqP+Xl5f/hoaG/6ioqP94eHj/AAAA/wAAAP8ACw//E57Z/xOg
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCW
+ yf8QlMj/D5PG/w+Txf8PksT/DpHC/w6Rwf8OkL//Do++/wuNvP8ak77/LZvC/yqZwP8qmb//KJe9/yya
+ vv8umsD/MJ3C/zOexP80n8b/N6LI/zmjyf87pMv/PKbN/z+ozv9BqdD/Q6vS/0Wt1P9HrtX/SK/W/0qw
+ 2P8dnM//EZjO/xGYz/8RmdD/EZrR/xKa0/8Sm9T/EpzV/xKd1v8Tndf/E57Z/xOf2v8Tn9v/EpnS/wAH
+ CP8AAAD/AAAA/wEBAf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ZGRv+fn5//x8fH/8jI
+ yP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ysrP8HBwf/qKio/6io
+ qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+pqan/hoaG/y8vL/8eHh7/JiYm/yUl
+ Jf+jo6P/qamp/wcHB/8AAAD/AAAA/wAAAP8ABgf/EpXN/xSg2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc
+ 1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJbK/xCWyf8Qlcj/D5TG/w+Txf8PksP/DZHC/xWT
+ wv8yoMj/MqDH/zCexv8uncP/LZvB/yqZwP8pmL7/LZm//y+bwf8yncP/NJ/F/zWgx/84osj/OaTL/zum
+ zP8+p87/QKjP/0Kq0f9ErNP/Rq7V/0iu1v9KsNj/TLLZ/0+z2v9RtNz/MabW/w6Y0f8SmtL/EpvU/xKc
+ 1f8Sndb/E53X/xOe2f8Tn9r/E5/b/xSg3P8ACg3/AAAA/wAAAP8ICAj/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/zU1Nf81NTX/Q0ND/3x8fP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/DQ0N/yIiIv+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en
+ p/+ioqL/MzMz/yUlJf8kJCT/JCQk/yQkJP8kJCT/Ghoa/6enp/9eXl7/AAAA/xISEv8BAQH/AAAA/wAA
+ AP8ABgj/EpPK/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8Rmc//EZjO/xGX
+ zf8Qlsv/EJbK/xCWyf8QlMf/EJTG/zOizf86ps7/OKTM/zaiyv80oMj/MZ/H/y+exf8tm8L/K5rB/yqZ
+ v/8umsD/MJ3D/zOexP80n8b/N6LI/zmkyv87pcz/PKbN/z+oz/9BqdD/Q6vS/0at1P9HrtX/SbDX/0ux
+ 2f9Ostr/ULTb/1G13f9Ttt7/V7jf/0qz3f8OmdT/EpzW/xOd1/8Tntn/E5/a/xOf2/8UoNv/AA4U/wAA
+ AP8AAAD/CQkJ/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pz8//0RERP9FRUX/RUVF/5CQ
+ kP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8XFxf8HBwf/oKCg/6io
+ qP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+hoaH/JCQk/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP9XV1f/p6en/wYGBv8CAgL/RUVF/zk5Of8BAQH/AAAA/wAAAP8ACAn/E5vW/xSg3P8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzW/xKc1P8SmtP/EprS/xGZ0P8RmM//EZjO/xGXzP8Nlcv/LqLQ/0Kq0/8/qtL/PKfQ/zqn
+ z/85pc3/N6PL/zWhyf8zoMj/MJ7G/y+exP8tm8L/KpnA/y+cwf8ynsT/NJ/F/zahx/85osn/OqTL/zum
+ zf8/qM7/QanQ/0Or0v9ErNP/R63V/0iv1v9KsNj/TrPa/1C02/9QtNz/U7be/1W43/9XueD/Wrri/1q7
+ 4/9au+P/GqHa/xSf2v8Tn9v/FKDc/wpafP8AAAD/AAAA/wgICP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RkZG/5WVlf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/RUVF/wcHB/+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/MTEx/yUl
+ Jf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/6ampv+fn5//AQEB/ykpKf9FRUX/RUVF/0JC
+ Qv8CAgL/AAAA/wAAAP8ACg3/FKHd/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzV/xKb1P8SmtP/EpvS/w2X
+ 0P8koNL/SLDZ/0Wt1/9ErNb/QqvU/0Cq0/89qNH/PKfQ/zqmzv84pc3/NqLK/zShyf8yoMf/L53F/y2c
+ w/8rm8H/MJ3D/zOfxf81oMb/N6LI/zmky/87pcz/PabO/z+oz/9BqdH/Q6vS/0at1f9Irtb/SrDY/0yy
+ 2f9Ostr/ULTc/1G13f9VuN//Vrjg/1m64f9au+P/XLvj/1695P9hv+b/Y7/n/y6q3/8Rn93/AAgK/wAA
+ AP8BAQH/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zo6Ov9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/4mJif/IyMj/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf8FBQX/YGBg/6io
+ qP+oqKj/qKio/6ioqP+np6f/fX19/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8aGhr/p6en/zo6Ov8CAgL/RERE/0VFRf9FRUX/RUVF/0JCQv8BAQH/AAAA/wAAAP8ACQv/FKDc/xSg
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EZzV/xuf1f9Ls93/TrTd/0uy2/9JsNr/SK/Y/0Wt1/9ErNX/QqvU/z+q
+ 0v88qNH/O6fP/zmmzv83pMz/NaLK/zOhyP8wnsb/Lp3E/y2bwv8ynsT/NJ/G/zahx/84osn/OaTL/zum
+ zf8/qM//QanQ/0Or0v9ErNP/Rq3V/0iu1v9KsNj/TrLa/1C13P9RtN3/VLfe/1a54P9YueH/Wrri/1y7
+ 4/9evOT/YL7l/2K/5/9kwOj/ZcHp/xIlLf8AAAD/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf9AQED/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/2RkZP/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/vb29/wkJCf+pqan/qKio/6ioqP+oqKj/qKio/ywsLP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/0xMTP+np6f/BgYG/xcXF/9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/z8/P/8CAgL/AAAA/wAAAP8GQlr/FKHd/xOg2/8Un9r/FZ/Z/0m14P9VuOL/U7fh/1G2
+ 3/9Ptd7/TbTd/0uy2/9JsNr/R67Y/0St1v9DrNX/QKrT/z6p0v88qND/OqfP/zilzf81osv/NKLJ/zKg
+ x/8vncX/LZvD/zOfxf80oMf/N6LI/zmjyv86pcz/PafO/z+p0P9BqdH/Q6vT/0at1f9Irtb/SrDY/02z
+ 2v9PtNv/ULXc/1K13v9VuN//V7ng/1q64v9bu+P/Xbzk/2C+5f9hv+b/Y8Do/2XB6f9mwOb/AQYI/wAA
+ AP8YGBj/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/1BQUP/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9PT0//BQUF/6en
+ p/+oqKj/qKio/6ampv8fHx//JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/oKCg/6ampv8FBQX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/y0tLf8AAAD/AAAA/wAE
+ Bv8SmdP/PrHi/1295v9au+X/WLvk/1e54v9VuOL/Urfg/1C23/9OtN3/TLPc/0mw2v9IsNn/Ra3X/0St
+ 1v9Cq9T/QKvT/zyn0f87p8//OaTN/zajy/81osr/M6HI/zCfx/8unMT/M5/G/zWhx/84o8n/OaPL/zul
+ zf8/qM//QanR/0Or0v9FrNT/RqzV/0mv1/9Lsdj/TrLa/1C03P9RtN3/Vbff/1e54P9YuuH/Wrvj/1y7
+ 4/9eveX/Yb/m/2PA5/9lwen/ZsPp/xYsNf8AAAD/AgIC/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ND
+ Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0pK
+ Sv+2trb/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/yMjI/woKCv9TU1P/qKio/6ioqP+ZmZn/JSUl/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yAgIP+oqKj/aWlp/wMDA/9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/w4ODv8AAAD/AAAA/wEHCf9gv+f/X77n/1y85v9avOX/V7rj/1a5
+ 4v9TtuH/Ubbf/0+13v9Ns93/S7Hb/0mw2v9Hrtj/RK7X/0Kr1f9Aq9T/PqnS/zuo0P86ps//OKXN/zWi
+ y/8zocn/MqDH/y+dxf80oMf/N6LI/zmjyv86pcz/PafO/z+o0P9BqtH/Q6vT/0at1f9Irtb/SrDY/02y
+ 2v9PtNv/ULXd/1O23v9Vtt//V7ng/1q64v9cu+P/Xrzk/2C/5v9iv+f/ZMDo/2bD6v9pxOz/AgkM/wAA
+ AP8gICD/NTU1/zU1Nf81NTX/NTU1/zU1Nf9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0ZGRv9hYWH/ysrK/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Ly8v/DQ0N/6Oj
+ o/+oqKj/i4uL/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/Kysr/6enp/8YGBj/FxcX/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wIC
+ Av8AAAD/AAAA/0eOrP9gv+j/Xr7n/1u85f9Zu+T/V7nj/1a44v9StuD/ULXf/06z3f9Mstz/SrHa/0iv
+ 2f9Grtf/RK3W/0Kr1P9AqtP/PKjR/zqmz/84o83/NqPM/zWiyv8zocj/MJ7G/zWgx/84osn/OaPL/zul
+ zf8+qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9Lsdj/TrLa/1C03P9RtN3/VLff/1a44P9YuuH/W7vj/128
+ 5P9fvuX/YcDn/2PA6P9lwen/aMLq/ztuhf8AAAD/AQEB/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pj4+/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9KSkr/mZmZ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/7W1tf8EBAT/qKio/4KCgv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9ubm7/qKio/wMDA/87Ozv/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Ozs7/wAAAP8AAAD/AggK/2DA6f9fv+j/XL3m/1q8
+ 5f9XuuT/Vrni/1S34f9RtuD/T7Xe/02z3f9Lsdv/SbDa/0ev2P9Erdf/QqzV/0Cr1P8+qdL/O6jR/zml
+ zv83pMz/NaLL/zOhyf8xn8f/N6LI/zmjyv86pMz/PKbO/z+p0P9BqtH/Q6vT/0at1f9Hrdb/SbDY/02x
+ 2f9Ps9v/ULTd/1O23v9Vt9//V7nh/1q64v9cu+P/Xr3l/2C+5v9iwOf/ZMHp/2bD6v9owun/AgoM/wAA
+ AP8TExP/NTU1/zU1Nf81NTX/NTU1/zg4OP9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/0JCQv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/SEhI/62t
+ rf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/VFRU/yIi
+ Iv+Kior/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/6Kiov+np6f/CQkJ/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/CQkJ/wAAAP8AAAD/Tpy+/2DA6f9ev+f/W7zm/1m85f9XueP/Vbji/1K34P9Qtd//TrTe/0yy
+ 3P9Jsdv/R6/Z/0Wv2P9DrNb/QazV/z+q0/88qdH/OqXP/zilzf81osz/NKLK/zKgyP84o8n/OaPL/zul
+ zf89qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9LsNj/TrHa/1C03P9RtN3/VLff/1a34P9YuuH/W7vj/128
+ 5P9fvub/Yb/n/2PB6P9lwun/aMLq/2rF7P8CCQz/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zU1Nf82Njb/NjY2/zU1Nf8/Pz//RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0dHR/+SkpL/ysrK/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9ISEj/CgoK/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/qamp/46Ojv8DAwP/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9CQkL/AQEB/wAAAP8EDBD/YMDp/1+/
+ 6P9dvuf/Wrzl/1e55P9WueP/VLfh/1C24P9PtN7/TbPd/0qx2/9IsNr/Rq/Y/0St1/9CrNX/QKvU/z2p
+ 0v86p9D/OKTO/zekzP81osv/M6HJ/zijyv85o8v/O6bN/z6o0P9BqtH/Q6vT/0Wt1f9Hrdb/SbDY/0yx
+ 2f9Ostv/ULTc/1O23v9Vt9//V7jh/1q74v9cvOT/Xr3l/2C/5v9iwej/ZcHp/2bC6v9pw+v/S4yp/wAA
+ AP8CAgL/NTU1/zU1Nf81NTX/NTU1/0NDQ/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ISEj/W1tb/7a2tv/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/0lJ
+ Sf8AAAD/JCQk/yQkJP8hISH/GRkZ/ykpKf86Ojr/RERE/0hISP9ISEj/SEhI/0ZGRv8/Pz//NjY2/yws
+ LP8kJCT/Gxsb/xkZGf8AAAD/BAQE/wsLC/8MDAz/ExMT/xoaGv8nJyf/MjIy/zw8PP9BQUH/RERE/0VF
+ Rf9FRUX/RUVF/0RERP8ICAj/AAAA/wIICv9hwer/YMDp/16/6P9cveb/Wbvl/1e55P9VuOL/Urfh/1C1
+ 3/9OtN7/S7Lc/0mx2/9Hr9n/RK7Y/0Os1v9BrNX/P6rT/zuo0f85pc//N6TN/zWjy/8zosr/OaPK/zqk
+ zP89qM//P6nQ/0Gq0v9ErNT/Rq3V/0iu1/9KsNj/TbHa/0+z2/9RtN3/VLff/1a44P9YuuL/Wrvj/128
+ 5P9fvub/Yb/n/2PA6P9lwen/aMPq/2rD6/8XKzX/AAAA/xQUFP81NTX/NTU1/zU1Nf88PDz/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ODg4/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/0ND
+ Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP88PDz/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0hI
+ SP9NTU3/h4eH/8DAwP/Ly8v/ycnJ/8jIyP/Jycn/gICA/wAAAP8gICD/sLCw/7u7u/+6urr/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+6urr/urq6/7u7u/+8vLz/vLy8/7q6
+ uv+0tLT/paWl/319ff9MTEz/Nzc3/wwMDP8MDAz/BgYG/woKCv8BAQH/AQEB/zk5Of8AAAD/AAAA/zVo
+ f/9gwOn/X7/o/12+5/9avOb/V7rk/1a54/9TuOH/ULXg/0603v9Ns93/SrHb/0iw2v9Fr9j/RK3X/0Gs
+ 1f8/qtT/PKjS/zqlz/84pM7/NqPM/zSiyv85o8v/O6XN/z6o0P8/qdH/QqvT/0Ss1P9Grtb/SK/Y/0ux
+ 2f9Os9v/ULTc/1K13v9Vt9//V7jh/1m74v9bvOT/Xr3l/2C/5/9iwOj/ZMHp/2bC6v9ow+v/a8Xs/wMK
+ Df8AAAD/MDAw/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/RERE/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/zY2
+ Nv82Njb/Ojo6/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0xMTP9HR0f/SUlJ/1lZ
+ Wf9ubm7/AwMD/0VFRf+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/7q6
+ uv+7u7v/vb29/w0NDf8DAwP/RUVF/wICAv8AAAD/BAwQ/2HA6f9gwOj/Xb/o/1u95v9YuuX/V7rk/1S5
+ 4v9Rt+H/T7Xf/0203v9Lstz/SLHb/0ev2f9Ertj/QqzW/0Cr1P89qdL/OqbQ/zmlz/83pM3/NKPL/zmk
+ zP88ps7/P6nQ/0Cq0v9Dq9P/Ra3V/0eu1/9KsNj/TLLa/06z2/9QtN3/U7be/1W34P9XueL/Wrvj/1y8
+ 5P9evub/Yb/n/2PA6P9lwun/Z8Tr/2rE7P9tyPD/AwwP/wICAv82Njb/NTU1/zU1Nf9CQkL/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1
+ Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/QUFB/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/Q0ND/zc3N/81NTX/NTU1/zU1Nf81NTX/Ojo6/0NDQ/8NDQ3/Dg4O/7q6uv+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8nJyf/Pz8//CgoK/xcXF/9FRUX/Ghoa/wAA
+ AP8BBwn/Y8Ps/2DA6f9fv+j/Xb7n/1m75v9XuuT/Vrnj/1O44f9QteD/TrTe/0yz3f9Jstv/R7Da/0Su
+ 2P9Crdf/QKvV/z6p0/87qNH/OaXP/zekzv81pMz/OaTM/z2nz/8/qdH/QavS/0Ss1P9Frtb/SK7X/0uw
+ 2f9Nstr/T7Pc/1K13v9Ut9//Vrjh/1i64v9avOT/Xb3l/1+/5/9hv+f/Y8Hp/2XC6v9oxOv/asbt/2rB
+ 6P8AAwT/AQEB/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/OTk5/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv81NTX/RERE/0VFRf9FRUX/RERE/zk5Of82Njb/NjY2/zY2Nv82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zU1Nf8HBwf/uLi4/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8DA
+ wP/Pz8//0NDQ/5mZmf8CAgL/RERE/0VFRf9BQUH/AAAA/wADA/9guuH/YcHq/1+/6P9dv+j/W73n/1e7
+ 5f9WuuT/U7ni/1C24f9Otd//TbTe/0qy3P9Hsdr/Ra/Z/0Ot1/9BrNb/P6rU/z2o0v86ptD/OKXO/zaj
+ zP87pc3/PafP/z+p0f9Bq9P/RK3V/0au1v9Ir9j/S7La/06z2/9QtN3/Urbe/1W44P9XueH/Wbrj/1y9
+ 5P9evub/Tpm4/yM4Qf9kwen/Z8Pr/2nE7P9rxu3/XKjJ/wAAAP8FBQX/NTU1/zU1Nf9DQ0P/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP83Nzf/NjY2/zY2Nv82Njb/NjY2/zU1
+ Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VF
+ Rf8+Pj7/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/yAgIP8bGxv/urq6/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/76+vv/Pz8//0NDQ/9DQ0P/Ly8v/CgoK/0RERP9FRUX/RUVF/0RE
+ RP8BAQH/AAAA/z9/mv9iwer/YMDp/16+6P9bvef/WLvm/1a65P9VueP/Urjh/0+14P9NtN7/S7Pd/0ix
+ 2/9GsNn/RK7Y/0Ks1v9Aq9X/PajS/zqm0P84pc//N6TN/zymzv8+qND/QKnR/0Os1P9ErNX/Rq7X/0qw
+ 2f9Mstr/TrPc/1C03f9Stt//Vbjg/1e54v9avOT/XL3l/16/5/8OExT/EA8P/xcpMf9oxev/asbt/2zG
+ 7f9BeZH/AAAA/wUFBf8sLCz/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0RERP84ODj/NjY2/zY2Nv81NTX/RUVF/0VFRf9FRUX/RUVF/0RERP82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NTU1/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv82Njb/KCgo/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf93d3f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8HBwf/Pz8//0NDQ/9DQ
+ 0P/Q0ND/zc3N/w0NDf9DQ0P/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/Hj1K/2PC6/9gwOr/Xr/o/1y+
+ 5/9avOb/V7vl/1a64/9TuOL/ULbg/0613/9Ms93/SbLc/0ew2v9Er9n/Qq3X/0Cr1f89qdP/O6fR/zml
+ z/83pM7/PKbO/z+p0P9AqtL/RK3U/0Wu1v9Irtf/SrHZ/02z2/9Ps9z/UbXe/1O33/9WueH/WLrj/1q8
+ 5P9dvub/LFVn/xAQEP8QEBD/EA8P/xgqMv9qxez/bcfu/ypNXP8AAAD/Ghoa/zU1Nf8hISH/BAQE/ysr
+ K/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/RUVF/0RE
+ RP9FRUX/RUVF/0VFRf9FRUX/QUFB/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv81NTX/RUVF/0VF
+ Rf9DQ0P/NjY2/zY2Nv82Njb/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/Xl5e/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/urq6/8bGxv/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8HBwf8LCwv/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/GRkZ/wAAAP8BBQb/Y8Lr/2HB6v9fv+n/Xb7o/1u95/9XuuX/Vrrk/1O54/9QtuH/TrXf/0y0
+ 3v9Kstz/R7Hb/0Wv2f9Drdf/QKvV/z6p0/89qNL/OabQ/zekzv88p8//P6jR/0Gr0/9ErdX/Rq7W/0iw
+ 2P9Lstr/TbPb/1C03f9St9//VLfg/1e54v9Zu+P/W7zl/16/5/8QEhL/EBAQ/xAQEP8QEBD/EA8P/xgq
+ Mf9ux+7/JUVT/wAAAP8kJCT/NTU1/0RERP9FRUX/RUVF/zExMf8ICAj/HR0d/0NDQ/9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf89PT3/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9FRUX/RUVF/z8/P/82Njb/NjY2/zMzM/8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2tra/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/vb29/83Nzf/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8/P
+ z/+EhIT/CgoK/z4+Pv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf8xMTH/AAAA/wEHCf9kw+z/YsLr/1/A
+ 6v9dv+j/W73n/1i75f9WuuT/VLnj/1K44v9OtuD/TbXf/0uz3f9Isdv/RbDa/0Ou2P9BrNb/P6rU/z2o
+ 0v86ptD/OKXP/z2nz/8/qNH/QqzT/0St1f9Grtf/SbHZ/0uy2v9Os9z/ULTd/1K23/9VuOH/V7ni/1q7
+ 5P9cveX/W7je/w0TFP8QEBD/EBAQ/xAQEP8QEBD/EBAP/xYnLv8cND//AAAA/ysrK/87Ozv/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/Pz8//xYWFv8AAAD/AAAA/yIiIv9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/PT09/0VF
+ Rf9FRUX/PT09/zY2Nv82Njb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/x8fH/8/P
+ z//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/JSUl/w8PD/81NTX/NjY2/zU1Nf89PT3/RERE/0VF
+ Rf9FRUX/RUVF/0BAQP8AAAD/AQUG/2XF7v9jw+z/YMHq/16/6f9bvef/Wbvm/1e75f9UueP/Urji/0+3
+ 4f9NtN//S7Pd/0iy3P9GsNr/RK/Z/0Kt1/8/qtT/PanT/zqn0f84pc//PajQ/z+p0f9DrNT/RK3W/0au
+ 1/9JsNn/TLPb/0603P9QtN7/Urfg/1W54f9XuuP/Wrvk/1y85f9fvub/YcDo/0B4j/8LDg//EBAQ/xAQ
+ EP8QEBD/EBAQ/wIEBP8AAAD/Li4u/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9BQUH/AgIC/wAAAP8AAAD/AAAA/wYGBv8rKyv/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PDw8/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf8+Pj7/NjY2/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP+7u7v/u7u7/7q6uv/Dw8P/z8/P/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//nZ2d/wsL
+ C/8rKyv/NTU1/zY2Nv82Njb/NjY2/zY2Nv87Ozv/RUVF/0VFRf9FRUX/RERE/wICAv8EDBD/Z8bv/2PD
+ 7P9hwev/X7/p/1y+6P9avOb/V7rl/1a65P9TueP/ULfh/0214P9MtN7/SbPc/0ew2/9Er9n/Qq3X/0Cr
+ 1f89qNP/O6fR/zim0P8+p9D/QKrS/0Ot1P9Erdb/R6/Y/0qx2f9Ms9v/T7Td/1C13v9Tt+D/Vbni/1i6
+ 4/9au+T/Xb7m/2C/5/9hwOj/ZMLq/2fD6/9fsdb/Gisx/xASEv8QEBD/AgIC/wAAAP8uLi7/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yEhIf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/x8fH/9FRUX/RUVF/0VFRf9BQUH/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/Nzc3/0VF
+ Rf9FRUX/RUVF/0FBQf8pKSn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/Pz8//z8/P/9DQ0P/Q0ND/0NDQ/9DQ
+ 0P/Q0ND/0NDQ/9DQ0P/Pz8//xsbG/xMTE/8ICAj/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2
+ Nv9ERET/RUVF/0VFRf9FRUX/AwMD/wEHCf9lw+z/ZMLs/2LC6/9fwOr/Xb7o/1q95/9Xu+X/Vrnk/1O5
+ 4/9RuOL/TrXg/0yz3v9Ks93/R7Db/0Sv2f9CrNf/QKvV/z6q1P88qNL/OKbQ/z6o0f9Bq9P/Q6zU/0Wu
+ 1/9IsNj/SrHa/0203P9PtN3/Tq/W/0CKp/8yZnv/JElZ/yFFVP8dO0j/GjQ+/xkwOv8aMTr/HTVA/yJB
+ Tv8nSVj/LlNj/0BxiP8LFRn/AAAA/zIyMv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf85OTn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DAwM/zo6
+ Ov82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/xQUFP/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//xcXF/x4eHv8EBAT/AAAA/wIC
+ Av8mJib/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zc3N/9FRUX/RUVF/0RERP8AAAD/AQUG/2bC
+ 7P9kw+z/YsLs/1/A6v9dv+n/W73n/1i75v9WuuT/U7nj/1G44v9OtOD/TLPe/0q03f9Hsdv/RK/Z/0Kt
+ 1/9ArNb/PqrU/zyo0v85p9H/PqjR/0Kr0/9ErNX/Ra3X/0mx2f9Lsdr/TbPc/0+13f8JDxH/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wUFBf8AAAD/LCws/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/yMjI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Kysr/zY2Nv82Njb/Pj4+/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5ycnP/Q0ND/0NDQ/8/P
+ z//R0dH/i4uL/wgICP8NDQ3/dHR0/35+fv81NTX/BwcH/wAAAP8BAQH/MDAw/zY2Nv82Njb/NjY2/zY2
+ Nv82Njb/NTU1/0RERP9FRUX/RUVF/wEBAf8BBAX/ZsPs/2TD7f9iwuz/YMHr/12/6f9bvej/Wbzm/1a6
+ 5f9TueP/Ubfi/0614P9MtN//SrPd/0ix2/9FsNr/Q67Y/0Gr1v8+qtT/PKnT/zqn0f8/qdH/QqrT/0Os
+ 1f9Frtf/SbDZ/0uy2/9NtNz/SrLb/wwPDv8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/CAgI/wAAAP8dHR3/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ICAg/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkJCf9CQkL/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/1ZWVv8+Pj7/DAwM/w0NDf8MDAz/gYGB/+Pj4//f39//29vb/9zc
+ 3P/b29v/wMDA/wkJCf8BAQH/KCgo/zY2Nv82Njb/NjY2/zY2Nv82Njb/RUVF/0VFRf9FRUX/AQEB/wAE
+ Bv9Muun/YcLs/2TC7P9gwev/Xb/q/1u+6P9ZvOf/Vrrl/1S65P9SuOL/T7bg/0203/9LtN7/SLDb/0Ww
+ 2v9Drtj/QazW/z+q1f89qNP/OqfR/xWWyP8Qlcj/C5PJ/w6Vy/8Rl83/EpnP/xGZ0f8SmtL/EDZC/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8LCwv/AAAA/xUV
+ Ff9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0FBQf8EBAT/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/GRkZ/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYG
+ Bv9TU1P/7e3t//7+/v/////////////////+/v7///////X19f/b29v/29vb/ywsLP8BAQH/NDQ0/zY2
+ Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf8BAQH/AAcJ/xal5f8VpeT/FqTj/xCh4f8UouD/Iafh/0Cz
+ 4/9TueX/Vbrk/1K34v9QtuH/TbTf/0u03v9Jstz/RbDa/0Ou2P9Crdf/P6vV/z2p0/87qNL/D5TH/xCW
+ yf8Qlsr/EJfM/xGYzv8Rmc//EZnR/xKa0/8RdJz/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8QEBD/EBAQ/xASEf8QHyX/EmKF/w4ODv8AAAD/BAQE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/Kysr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/6enp//7+/v/ExMT/Wlpa/7y8vP/+/v7/////////
+ ///////////////////r6+v/29vb/yIiIv8GBgb/NTU1/zY2Nv82Njb/NTU1/0RERP9FRUX/RERE/wAA
+ AP8ACxD/Fqjp/xWl5f8VpOP/FaTi/xSi4P8Uod//FKHd/xSg3P8Un9r/EJ3Y/xKc1/8dodj/Nqva/0Ww
+ 2/9GsNr/Q67Z/0Gt1/8/q9X/ParU/zuo0v8PlMf/EJXJ/xCXy/8Ql8z/EZjO/xGZ0P8RmtH/EprT/xKb
+ 1P8QFBX/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBMU/xAgJf8Tir3/FZ3Z/xARD/8QDxD/EBAQ/wAA
+ AP8CAgL/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8iIiL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP/+/v7/h4eH/wAAAP8AAAD/AAAA/3Nzc//////////////////////////////////t7e3/29vb/wsL
+ C/81NTX/NjY2/zY2Nv83Nzf/RUVF/0VFRf9FRUX/AwMD/wAGBv8Wp+j/FaXl/xWl5P8VpOL/FaPh/xSi
+ 3/8Uod7/FKDc/xOf2/8Tntn/E53X/xKc1v8Sm9T/EprS/xKZ0f8Pl87/D5jN/xmazf8qoc//N6bR/xCU
+ x/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa0v8Sm9P/EpvU/xASD/8QEBD/EBAQ/xAQEP8QFBX/EBkc/xOD
+ s/8VpeP/FaXk/xE1Qv8QEhP/EBAQ/xAQEP8QEBD/AAAA/wMDA/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PT09/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//7+/v8QEBD/AAAA/wAAAP8AAAD/DAwM//7+
+ /v/////////////////////////////////b29v/ERER/y0tLf82Njb/NjY2/0FBQf9FRUX/RUVF/0RE
+ RP8CAgL/AAcK/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc
+ 1P8SmtP/EZnR/xGZz/8RmM7/EJbM/xCWyv8Qlsn/EJXI/xCVyf8Ql8v/EZfN/xGZz/8RmdD/EprS/xKc
+ 1P8SnNX/EV57/xARDv8QLDX/EoW1/xSi3/8Uod7/FKLg/xSZ0/8QFRX/EBAQ/xAQEP8QEBD/EBAQ/xAR
+ Ev8ACQ3/AAAA/0FBQf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RESP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/xkZGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD//v7+/xAQEP8AAAD/AAAA/wAAAP8ODg7//v7+//////////////////////////////////X1
+ 9f9TU1P/ICAg/zY2Nv81NTX/RERE/0VFRf9FRUX/QEBA/wAAAP8ACQz/Fqbm/xam5v8VpeT/FaTj/xWj
+ 4f8UouD/FKHe/xSh3f8Tn9v/E5/a/xOe2P8Sndb/EpzV/xKa0/8RmtH/EZrQ/xGYzv8Ql8z/EJbK/xCW
+ yf8Qlcj/EJbK/xCWy/8Rl83/EZjP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh
+ 3v8SY4T/EBMU/xAQEP8QEBD/EBAQ/xAQEP8QEA//E2GC/wc7Uv8AAAD/KCgo/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/Xl5e/wEBAf8HBwf/Dg4O/+7u
+ 7v///////////////////////////////////////////1dXV/8kJCT/NjY2/0JCQv9FRUX/RUVF/0VF
+ Rf8wMDD/AAAA/wY4T/8Wp+f/Fqbm/xWl5P8VpOP/FaTi/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xOe
+ 1/8SnNX/EpvT/xKa0f8RmdD/EZjO/xCXzP8Ql8v/EJXJ/xCVyP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa
+ 0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/EV9//xAPD/8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAT
+ E/8Xqer/EYi9/wAAAP8KCgr/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/2xsbP/+/v7/////////////////////////////////////////
+ ///+/v7/MDAw/zExMf85OTn/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/DnWj/xan5/8Wpub/FaXl/xWk
+ 4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCW
+ y/8Qlsn/EJXI/xCVyv8Ql8z/EZfN/xGZz/8RmdH/EprS/xKc1P8SnNb/E53X/xOe2f8Tn9v/FKHc/xSh
+ 3v8Uod//EBUV/xAQEP8QEBD/EBAQ/xAQEP8QFRb/Fabn/xep6/8Xqez/AAgL/wEBAf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8zMzP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsL
+ C/9/f3///v7+//////////////////////////////////7+/v8JCQn/Nzc3/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/AgIC/wAEBf8VpeX/Fqfo/xam5v8VpeX/FaTj/xWk4v8UouD/FKHf/xSh3f8UoNz/E5/a/xOe
+ 2P8Tndf/EpzV/xKc1P8SmtL/EZnQ/xGYzv8RmM3/EJbL/xCWyf8Qlcj/EJbK/xCXzP8RmM7/EZnP/xGZ
+ 0f8Sm9P/EpzU/xKc1v8Tntj/E57Z/xOf2/8UoNz/FKHe/xSi4P8TgrL/EBAR/xAQEP8QEBD/EBAP/xNg
+ gf8WqOr/F6nr/xep6/8ACQz/AAAA/0JCQv9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8iIiL/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/QUFB/yEhIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/kJCQ//7+/v//////////////
+ ////////oKCg/xkZGf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8CAgL/AAME/xan6f8Wp+j/Fqbm/xWl
+ 5f8VpeT/FaTi/xWj4f8Uod//FKHd/xSg3P8Tn9r/E57Z/xOd1/8SnNX/EpvU/xKa0v8RmdD/EZnP/xGX
+ zf8Ql8v/EJXJ/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/EpzW/xOe2P8Tntn/E5/b/xSh
+ 3f8Uod7/FKLg/xWj4f8SWnf/EA8P/xAQEP8QEBD/Fqfo/xao6v8XqOv/F6ns/wY3Tv8AAAD/HBwc/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/zMzM/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/xwc
+ HP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KCgr/AgIC/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/DQ0N/56env/+/v7///////X19f8NDQ3/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/Pj4+/wAAAP8BFyD/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh3/8Uod7/FKDc/xOf
+ 2v8Tntn/E53X/xKc1f8Sm9T/EpvS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJbJ/xCWyv8Qlsz/EZjO/xGZ
+ z/8RmtH/EprT/xKc1P8Sndb/E57Y/xOe2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWj4v8RO0v/EBUX/xWl
+ 5f8WqOn/Fqjq/xeo6/8Xqez/FJnW/wAAAf8DAwP/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/KCgo/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9ERET/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woK
+ Cv+0tLT/CwsL/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8YGBj/AAAA/w96qv8WqOn/Fqfo/xan
+ 5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh3v8UoNz/E5/a/xOe2f8Tndf/Ep3W/xKb1P8SmtL/EZnQ/xGZ
+ z/8Rl83/EJbL/xCWyv8Qlsn/EJbK/xCXzP8RmM7/EZnP/xGa0f8SmtP/Ep3V/xKd1v8Tntj/E57Z/xOf
+ 2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWk4/8Vntr/Fqfn/xao6f8WqOr/F6nr/xep7P8Xq+//AAYI/wEB
+ Af9DQ0P/RUVF/0VFRf9FRUX/AAAA/wAAAP8BAQj/ISOo/wAAAP8AAAD/AAAA/wAAAP86Ojr/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf86Ojr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ERET/RUVF/0VFRf9ERET/ICAg/wEB
+ Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/Ojo6/0RERP9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/wICAv8ACg3/F6rs/xao6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg
+ 3P8Tn9r/E57Z/xOd1/8SnNb/EpvU/xKa0v8RmtH/EZjP/xGYzf8Qlsv/EJbK/xCWyf8Qlsr/EJfM/xGY
+ zv8Rmc//EZrR/xKa0/8SndX/Ep3W/xOe2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWj4f8VpOP/FaXk/xam
+ 5v8Wp+f/Fqjp/xao6v8Xqev/F6rt/xeq7v8EKDn/AAAA/xkZGf9FRUX/RUVF/0VFRf8UFBT/AAAA/wAA
+ AP8fIZ3/KizQ/xgZev8AAAD/AAAA/wAAAP8zMzP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8BAQH/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/BAQE/0FBQf9ERET/RUVF/0VFRf9AQED/AAAA/wESGf8XqOr/Fqfp/xan
+ 6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSi3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1v8Sm9T/EprS/xGa
+ 0f8RmM//EZjN/xCWy/8Qlsr/EJbJ/xCWyv8Ql8z/EZjO/xGZz/8RmtH/EprT/xKd1f8Sndb/E57Y/xOe
+ 2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWk4/8VpeT/Fqbm/xan5/8WqOn/Fqjq/xep6/8Xqu3/F6ru/xSa
+ 2f8AAAH/AQEB/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8qLND/KizQ/ygqyv8AAAD/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MzMz/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/xQUFP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/woK
+ Cv9ERET/RERE/w8PD/8AAAD/EYm//xep6/8WqOn/Fqfo/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh
+ 3v8UoNz/E5/a/xOe2f8Tndf/EpzW/xKb1P8SmtL/EZrR/xGYz/8RmM3/EJbL/xCWyv8Qlsn/EJbK/xCX
+ zP8RmM7/EZnP/xGa0f8SmtP/EpzU/xKd1v8Tntj/E57Z/xOf2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWl
+ 5P8Wpub/Fqfn/xao6f8WqOr/F6jr/xep7P8Xqu7/G6zv/wIICf8AAAD/NjY2/0VFRf9FRUX/RUVF/zMz
+ M/8AAAD/AAAA/yos0P8sLtb/KizR/ykrz/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AwMD/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wEBAf8RERH/PDw8/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zMz
+ M/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/z09Pf8DAwP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv8hISH/AgIC/wAICv8Xqu3/F6nr/xao
+ 6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg3P8Tn9r/E57Z/xOd1/8Sndb/EpvU/xKa
+ 0v8RmdD/EZjP/xGXzf8Qlsv/EJbK/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/Ep3W/xOe
+ 2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWk4f8VpOP/FaXk/xam5v8Wp+f/Fqfo/xao6v8XqOv/Eqjs/2nI
+ 8/94zvb/O2R3/wAAAP8CAgL/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/FRZo/yst0/8sLtb/KizQ/yIk
+ rf8AAAD/AAAA/wcHB/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8WFhb/AAAA/wAAAP8AAAD/AQEB/xAQEP88PDz/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9CQkL/IiIi/wcHB/8RERH/MzMz/0VFRf8EBAT/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8MDAz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CVBx/xeq7P8Xqev/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh
+ 3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJXI/xCW
+ yv8Ql8z/EZjO/xGZz/8RmdH/EpvT/xKc1P8SnNb/E57Y/xOe2f8Tn9v/FKDc/xSh3v8UouD/FaPh/xWk
+ 4/8VpeT/Fqbm/xan5/8Wp+j/F6jq/ze07f90zPT/d871/3jP9v980Pf/AwoN/wAAAP8/Pz//RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8QEVT/KizQ/ywu1v8sLtb/KizQ/w0OQ/8AAAD/AAAA/zg4OP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8CAgL/FBQU/z09
+ Pf9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP84ODj/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEHCf9Cu/L/GKrs/xap
+ 6/8Wp+n/Fqfo/xam5v8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3f8UoNz/E5/a/xOe2f8Tndf/EpzV/xKb
+ 1P8SmtL/EZnQ/xGZz/8Rl83/EJfL/xCVyf8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8Sm9P/EpzU/xKc
+ 1v8Tndf/E57Z/xOf2/8Uodz/FKHe/xSh3/8Vo+H/FaTi/xWl5P8VpeX/Fqfn/xSm6P9uyfH/csvz/3TM
+ 9P92zfT/eM/2/3vO9f8dMTv/AAAA/wYGBv9ERET/RUVF/0VFRf8AAAD/AAAA/wICC/8qLND/LC7W/ywu
+ 1v8qLND/KizQ/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/DAwM/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/Kk5d/27K9P9nxvL/Eqbq/xao6f8Wp+j/Fqbm/xWl5f8VpOP/FaTi/xSi
+ 4P8Uod//FKHd/xSg3P8Tn9r/E57Y/xOd1/8SnNX/EpzU/xKa0v8RmdD/EZjO/xGYzf8Qlsv/EJbJ/xCV
+ yP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/FKHf/xWj
+ 4f8VpOL/FaXk/xOk5f9Tvuz/bMjw/27I8f9xy/P/c8z0/3XN9P93zvX/ec/2/3rN8/8CBwj/AAAA/z4+
+ Pv9FRUX/RUVF/wAAAP8AAAD/DxBP/yos0P8sLtb/LC7W/yst0v8qLND/HiCY/wAAAP8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/yIiIv8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ERET/NDQ0/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wIJC/9wzPb/bcr0/2zI
+ 8v9qx/H/Gajp/xan6P8Wpub/FaXl/xWk4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc
+ 1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCWy/8Qlsn/EJXI/xCWyv8Qlsv/EZjN/xGYz/8RmdD/EprS/xKb
+ 1P8SnNX/E53X/xOe2f8Tn9r/FKDc/xSh3v8Uod//FaPh/xWk4v8kquX/Z8Xu/2nG7/9rx/D/bsfx/3DJ
+ 8v9yzPP/dMz0/3fO9f94zvb/e9D2/xIgJ/8AAAD/AQEB/0RERP9FRUX/AAAA/wAAAP8VFmj/KizQ/y0v
+ 1v8xM9f/Ky3T/yos0f8qLND/AAAA/wAAAP8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/ERER/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsL
+ C/8AAAD/AAAA/wAAAP8AAAD/Q3qT/3DL9P9tyvT/bMjy/2jG8f9lxvH/RLjr/xem5v8VpeT/FaTj/xWk
+ 4v8UouD/FKHf/xSh3f8ToNv/E5/a/xOe2P8Tntf/EpzV/xKb0/8Sm9L/EZnQ/xGYzv8Rl8z/EJfL/xCV
+ yf8Qlcj/EJXJ/xCXy/8Rl83/EZnP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh
+ 3/8RoeD/XcDr/2TC7P9mxO7/acbv/2vH8P9tyPH/b8ny/3LL8/90zPT/ds31/3fO9v97z/b/es3z/wIH
+ CP8AAAD/MzMz/0VFRf8AAAD/AAAA/yos0P8qLNL/MTPX/zY42f8sLtb/Ky3U/yos0P8RElX/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/QEBA/wAAAP8AAAD/MjIy/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zg4OP8BAQH/AAAA/wIIC/9wyvT/bsr0/23J
+ 8/9rx/L/aMbx/2XF8P9kxO//YMLt/xGi5P8VpOP/FaPh/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xKd
+ 1v8SnNX/EprT/xGa0f8RmtD/EZjO/xCXzP8Ql8v/EJbJ/xCUx/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa
+ 0v8Sm9P/EpzV/xOd1/8Tntj/E5/a/xSg2/8Uod3/O7Hk/17A6v9hwev/Y8Ls/2bE7f9oxu//asfw/23I
+ 8f9uyfL/ccrz/3LL9P91zfX/d872/3nO9v980Pf/HjQ+/wAAAP8DAwP/Ly8v/wAAAP8AAAD/KizQ/yst
+ 1f82N9n/NjjZ/ywu1v8tL9b/Ky3U/yos0P8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/DQ0N/wAA
+ AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/wICAv8CBQf/bcLq/3DL9f9tyvT/bMnz/2rI8v9nxvH/ZcXw/2PE7/9gwu3/XsDs/x6n
+ 5P8Vo+H/FKLg/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCW
+ yv8Qlsn/D5TH/xCVyf8Ql8v/EJfM/xGYzv8RmdD/EZrR/xKa0/8SnNX/Ep3W/xOe2P8Tn9r/GKHc/1q8
+ 5/9cvuj/XsDq/2DB6/9iwuz/ZMPt/2fF7/9px/D/a8fw/23J8v9wyvP/csvz/3TM9P9Jf5f/CQ8S/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qLND/LC7W/zY42f82ONn/LC7W/zEz1/8sLtb/KizQ/wAA
+ AP8AAAD/IiIi/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8ICAj/AAAA/zFZbP9yy/X/b8r0/23K
+ 9P9syfP/acjy/2bG8f9lxvD/YsPu/1/B7f9dwOz/W7/r/0W25v8Uot//FKHe/xSh3P8Tn9v/E57Z/xOd
+ 1/8SnNb/EpzU/xKa0v8RmdH/EZnP/xGXzf8Ql8z/EJXK/xCVyP8PlMf/EJbJ/xCWyv8Ql8z/EZjO/xGZ
+ z/8RmtH/EprT/xKc1P8SnNb/D5zX/0u14v9WuuX/WLvm/1u96P9dv+n/X8Hr/2LC7P9kw+3/ZsXu/2jG
+ 7/9rx/D/bcjx/2/K8/9xyvP/HDM9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAE/yos
+ 0P8tL9b/NjjZ/zY42f8wMtf/NjjZ/zEz1/8qLND/AAAA/wAAAP8GBgb/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8jIyP/AAAA/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/HBwc/wAAAP8CBQb/csz1/3DL9f9tyvT/bMr0/2rI8v9nxvH/Zcbx/2PF8P9hw+7/X8Ht/13A
+ 7P9bv+v/WL7p/1S76P8RoN3/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8RmM//EZjN/xCW
+ y/8Qlsr/EJTI/w+Ux/8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8SmtL/EpvU/yml2f9Qt+L/U7jj/1a7
+ 5f9Xu+b/Wr3o/1y/6f9ewOr/YcHr/2PD7f9lxO7/Z8Xv/2nG8P9rx/H/bsny/3DJ8/8AAAD/AAAA/wAA
+ AP8AAAH/AwMP/wAAAP8AAAD/AAAA/wAAAP8VFmj/Ky3T/zM01/82ONn/NjjZ/zQ22P82ONn/NjjZ/yst
+ 0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP83Nzf/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zc3N/8AAAD/AggL/3PN9v9zzPb/b8v1/23K
+ 9P9syfP/acfy/2bF8f9lxPD/Y8Tv/2DC7v9dwOz/XMDr/1q/6/9Xven/Vbzo/1O65v8jpt3/E5/a/xOe
+ 2P8Tndf/EpzV/xKb0/8SmtL/EZnQ/xGYzv8Rl83/EJfL/xCVyf8Qlcj/D5TG/xCUyP8Qlsr/EJbL/xGY
+ zf8RmM//EZnQ/xKa0v9LtN7/TbTg/1C34f9TuOP/Vbrk/1e85v9Zvef/W77p/12/6v9gwOv/YsLs/2TE
+ 7v9mxe//acfw/2rH8f9tyfL/b8nz/wAAAP8AAAD/AAAA/woLNf8rLdT/Ky3T/ywu1v8sLtb/FRZm/xUW
+ aP8rLdX/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/LC7W/xMUY/8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/zU1Nf8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP9JSUn/AgIC/wIFB/9mtdr/c832/3DM9f9uyvT/bMr0/2rJ8/9pyPL/ZcXx/2TE8P9ixO//X8Ht/13A
+ 7P9cv+v/Wb/q/1a96f9Uu+f/Urrm/1C45P9BsuH/E57Y/xKd1v8SnNX/EpvT/xKa0f8RmdD/EZjO/xGX
+ zP8Ql8v/EJXJ/xCUx/8PlMb/EJXI/xCVyf8Qlsv/EZjN/w+Xzv84qdf/SbLc/0u03v9NtN//T7bh/1G4
+ 4v9TueT/Vrvl/1i95/9bvej/Xb/q/1/A6/9hwuz/Y8Pt/2XF7/9nxe//acbw/2zJ8f9uyfL/T4+s/wAA
+ AP8AAAD/AAAA/wAAAP8sLtb/KizP/ywu1v8sLtb/KSvL/ywu1v8xM9f/NjjZ/zEz1/82ONn/NjjZ/zY4
+ 2f8sLtb/FRZo/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/w8P
+ D/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9KSkr/TExM/wICAv8AAAD/SH+Z/3PN9/9zzPb/b8v1/23K
+ 9P9syvT/asnz/2bF8f9lxPD/Y8Xw/2HD7v9ewe3/XMDs/1q/6/9Yvur/Vbzo/1S75/9SueX/T7jk/0y2
+ 4v9KteH/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Uxv8PlMf/EJXJ/xCX
+ y/8cnM7/Q63Y/0Sv2v9HsNv/SrLd/0y03/9OteD/Ubfi/1O54/9VuuX/V7zm/1m96P9bvun/Xr/q/2DB
+ 6/9iw+3/ZMTu/2bF7/9px/D/a8fx/23J8v9vyfP/ccr0/xwzPf8AAAD/AAAA/wAAAP8rLdX/Ky3T/ywu
+ 1v8oKsj/Ky3T/ywu1v82ONn/LC7W/ywu1v82ONn/NjjZ/ywu1v8VFmj/AAAA/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/zQ0NP9FRUX/RUVF/0VFRf9ERET/UFBQ/0xM
+ TP8CAgL/AAAA/zNcb/9zzPb/c8z2/3HN9v9uy/X/bMn0/2rI8/9px/L/ZcXx/2TE8P9ixO//YMLu/13B
+ 7f9cv+v/Wb/q/1e96f9VvOj/Urrm/1G55f9Ot+P/S7Xi/0q04P9Hs9//JKPX/xKa0v8RmdH/EZjP/xGX
+ zf8Ql8z/EJXK/xCVyP8PlMf/D5PF/w+Ux/8Olcj/O6jT/0Cr1v9Crdj/RK7Z/0ev2/9Jsdz/S7Pe/021
+ 4P9PtuH/Urjj/1S55P9Wu+b/WL3n/1u+6f9dv+r/X8Dr/2HC7P9jxO7/ZcXv/2fF7/9px/H/a8ny/23J
+ 8v9wyvP/csv0/1eZt/8AAAD/AAAA/xUWaf8qLM7/LC7W/ygqx/8qLND/LC7W/zQ22P8sLtb/LC7W/zY4
+ 2f82ONn/LC7W/xMUYf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9ERET/TU1N/1FRUf9ISEj/AgIC/wAAAP8eNED/dM32/3PN9/9xzPb/b8v1/23J
+ 9P9syfT/asnz/2fG8v9lxPD/Y8Tw/2HD7/9ewu3/XMDs/1u/6/9Zvur/Vbzp/1S75/9Suub/T7jk/0y2
+ 4/9LteH/SbPg/0ax3v9EsNz/PKzZ/xCY0P8Rmc//EZfN/xCWy/8Qlsr/EJTI/w+Uxv8Pk8X/J53L/zuo
+ 0v89qtT/P6vV/0Ks1/9Drtn/RbDa/0ix3P9Ks97/TLTf/0+24f9Rt+L/U7nk/1W75f9XvOf/Wb7o/1u+
+ 6f9dv+r/X8Hs/2LD7f9kxO7/ZsXv/2jG8P9qyPH/bcny/27K8/9wyvT/csz1/wAAAP8AAAD/AAAA/yst
+ 0v8sLtb/Ky3U/ykrzP8sLtb/LC7W/zI01/8sLtb/NjjZ/zY42f8sLtX/AAAH/wAAAP8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/FxcX/1FRUf9RUVH/Nzc3/wIC
+ Av8AAAD/HzdB/3XO9/9zzff/csz2/3HN9v9tyvT/bMn0/2rI8/9ox/L/ZcXx/2TE8P9ixO//YMPu/13B
+ 7f9cwOz/Wb7q/1e96f9VvOj/U7vn/1G55f9Ot+T/TLbi/0u04f9ItN//RbHe/0Ow3P9Brtr/P63Z/xKY
+ zv8Rl8z/EJfL/xCWyf8Qlcf/D5TG/zakzf84ptD/OqjS/zyp0/8+qtX/Qa3X/0Kt2P9Ertr/R7Db/0qy
+ 3f9MtN//TbXg/1C34v9SueP/VLnl/1a75v9Yvej/W77p/12/6v9ewOv/YcLt/2PE7v9lxe//Z8bw/2nH
+ 8f9ryPL/bcjy/2/K8/9xy/T/c8z1/wAAAP8AAAD/KCrE/yst0v8sLtb/KCrH/yos0P8sLtb/NjjZ/ywu
+ 1v82ONn/NjjZ/yst0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/UVFR/yMjI/8AAAD/AAAA/zNcbv92zvf/dM33/3PM9v9xzPb/bsr0/0WM
+ pf9artH/acjy/2fG8f9lxfH/Y8Tw/2DD7/9ewu7/XMDs/1q/6/9Yver/Vrzp/1S86P9Suub/ULnl/0y3
+ 4/9LteL/SrTg/0ay3/9EsN3/Qq/b/0Cu2v8+rNj/PKvX/yOf0P8Qlsr/EJbJ/w+Ux/8Pk8X/NaPN/zel
+ z/85p9H/O6nT/z2p1P9ArNb/Qq3Y/0Su2f9FsNv/SLLd/0qz3v9MtOD/T7bh/1G44/9TueT/Vbvm/1e9
+ 5/9Zvuj/W77p/13A6/9fwez/YsPt/2XE7v9mxe//aMXw/2nH8f9syPL/bcnz/3DK9P9xy/X/AAAA/wAA
+ AP8FBRv/KizO/ywu1v8sLtb/KCrH/yst0/8sLs//Ky3S/zY42f82ONn/KizR/wAAAP8AAAD/IiIi/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/R0dH/1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAF
+ B/9Jf5j/ds/4/3TO+P9zzff/ccz2/3DM9v9tyvX/S5aw/0WOp/9Djaf/QYuj/0mZtv9bt+D/YMTv/13B
+ 7f9cwOv/Wb7q/1e96f9VvOn/U7vn/1G65v9PuOT/TLbj/0u14f9JtOD/RbLe/0Ow3f9Cr9v/P63Z/z6r
+ 2P88q9b/OajU/zOm0v8PlMj/D5TG/w+Txf80osz/NqTO/zim0P87qNL/PanU/z6r1v9Brdf/Qq3Z/0Sv
+ 2v9Isdz/SrPe/0u03/9OtuH/ULji/1K45P9UuuX/Vrzn/1i96P9avun/Xb/q/17A6/9gwu3/YsPu/2XE
+ 7v9mxfD/Y73l/zVkef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rLdX/KizQ/ywu1v8rLdL/KCrJ/ywu
+ 1v8sLtb/LC7O/zAyyP8pK87/AAAA/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/SUlJ/1FR
+ Uf9RUVH/UVFR/wAAAP8AAAD/AAAA/wAAAP8ABwn/FZfU/0O99v90zvj/c8z3/3LM9v9wzPb/bcr1/2zJ
+ 9P9Vpsf/RI2n/0OMpv9Bjab/QIuk/z+LpP8+i6T/PImh/zuJo/9Cl7b/S6jO/1C13/9Suub/ULrm/0y2
+ 5P9LteL/SrTg/0ey3v9FsN3/QrDb/0Cu2v8+rNj/PazX/zqq1v84p9T/M5/I/yuLq/8ObYv/DGiF/zSj
+ zP82o83/N6bQ/zmn0f87qdP/ParV/0Gt1/9Crtj/Q67a/0ax2/9Isd3/SrPf/0y04P9OtuL/Ubjj/1O5
+ 5f9Vu+b/V7vn/1m96P9bvun/XcDr/1/B7P8xYXb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wsLN/8qLM//KizQ/ywu1v8pK8z/LC7W/ywu1v8sLtb/LC7W/ywu1v8ICSv/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP80NDT/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ERET/TU1N/1FRUf9RUVH/UVFR/1FRUf9QUFD/Dg4O/wAAAP8AAAD/AAgK/xmu
+ 8/8YrfT/Ga3z/3DL9v9yzPb/ccz2/27M9v9syfT/a8jz/1+33f9Djab/Qo2m/0GMpf8/iqT/Pouk/z2K
+ o/87iKL/Ooeh/zmGoP84hqD/NoWf/zWFnv8zg53/MoKb/zB/mf8vfpf/LHyW/yx8lv8qfJb/KXuU/yd3
+ kf8meZL/JXiS/yR4kf8edZD/QnF//2JiYv+5ubn/MqLL/zSjzf82pM7/OKbR/zup0/88qdT/P6vW/0Gu
+ 2P9Crtn/RK/b/0iy3P9Jst7/TLTf/0214f9Pt+L/Ubjk/1S65f9WvOf/WLzo/1q+6f8BAgP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8cHBv/HB0b/xwdG/8cHRv/HB0b/y4wrf8qLM//KizO/yst
+ 0f8pK8v/KizO/yst0v8sLtb/LC7W/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9HR0f/UFBQ/1FRUf9RUVH/UVFR/1FR
+ Uf9QUFD/MzMz/wMDA/8AAAD/AAMF/wc3Tv8ZrvT/GK30/xit8/8YrfL/Eqry/3DL9v9uzPX/aGVl/21n
+ Zv9mdn7/ZajE/0KNpf9AjKb/QIqj/z+LpP8+i6T/PIqj/zqHof85h6H/OIag/zeFn/82hp//NIOd/zKD
+ nf8xgZv/MIKb/y6Amf8tfpn/LH2X/yp7lv8pe5T/JXmU/yx5kP9RcXv/YWFg/5ubm//5+fn/+fn5//X1
+ 9f8xocr/NKPM/zajzv83ptD/OafR/zuq1P89qtX/QazX/0Kv2f9Dr9r/RrHc/0iz3f9KtN//TLXg/062
+ 4v9QuOP/Urnl/1S65f8vZn7/AAAA/wAAAP8AAAD/AAAA/wAAAP8jJCL/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zg5PP8rLdT/KizO/ywu1v8sLtb/KizR/yoszv8qLM7/Ky3U/ywu
+ 1v8sLtb/LC7W/x4glv8AAAD/AAAA/wAAAP8AAAD/AAAA/yIiIv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/0VF
+ Rf9OTk7/UVFR/1FRUf9RUVH/UVFR/1FRUf9RUVH/RUVF/wMDA/8AAAD/AAAA/wAKDv8Vnt3/Ga70/xit
+ 9P8YrfP/GK7z/xis8v8YrPH/LbLx/23K9f9pdnv//v7+//7+/v/8/Pz/zc3N/4eHh/9nZGP/Ymhp/191
+ e/9Te4j/R4CT/0CDmf86g5z/N4Se/zSEnf8ygZz/MoKb/zGAmv80f5f/N3yS/z94iv9Rc37/YWxu/2Bf
+ Xv+BgoH/0NDQ//7+/v/+/v7///////39/f/6+vr/9fX1/zCgyv8zo8z/NaPN/zalz/85ptH/OqnT/z2q
+ 1f8/rNb/Qa3Y/0Ku2f9Er9v/R7Ld/0my3v9LtOD/TbXh/0+34/9RuOT/ESYv/wAAAP8AAAD/AAAA/xsc
+ G/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/KizQ/yst0v8sLtb/LC7W/ywu1v8qLM//KizO/yst0v8sLtb/LC7W/ywu1v8mKLz/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/IiIi/zo6Ov9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RkZG/05OTv9RUVH/UVFR/1FRUf9RUVH/UVFR/1FRUf9QUFD/QkJC/wMD
+ A/8AAAD/AAAA/wAHCv8IQl3/GbD2/xmu9f8YrfT/GK3z/xiu8/8YrPL/GKzx/xir8P8Xq+//YMXz/2mg
+ uP/v7+////////////////////////7+/v///////v7+//7+/v/z8/P/5eXl/9TU1P/Hx8f/v8DA/7y8
+ vP+/v7//xMTE/9HR0f/j4+P/8vLy//7+/v/+/v7//v7+/////////////////////////////f39//n5
+ +f/19fX/L6DJ/zGhy/80pM3/NqTO/zel0P85qNL/O6nU/z2r1v9Ardf/Qq7Z/0Ov2v9GsNz/SLLd/0q0
+ 3/9MteD/Trbi/xQtOP8AAAD/AAAA/wAAAP85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/y0tK/8sLtb/LC7W/yoszv8qLND/LC7W/ywu
+ 1v8sLtb/Ky3T/yoszv8qLND/LC7W/ywu1v8sLtb/LC7W/wICC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yYm
+ Jv9RUVH/UVFR/1FRUf9RUVH/LS0t/wMDA/8AAAD/AAAA/wADBP8CGib/GK3z/xmv9f8ZrvX/GK30/xit
+ 8/8YrvP/GKzy/xis8f8YrPD/F6vv/xer7/8Uqe7/acDn/7Ozs///////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////f39////////////////////////9/f3/+fn5//X19f8unsj/MKHK/zOjzP80pM7/NqXP/zmm
+ 0f87qdP/PKrV/z+s1v9Brdj/Qq/a/0Sv2/9Hst3/SLLe/0q14P85iKj/AAAA/wAAAP8MDAz/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/JiYk/ygqsv8wMtf/LjDW/yos0f8qLM7/KizO/yst0v8uMNb/NjjZ/zEz1/8rLdL/KizO/yst
+ 0v8sLtb/LC7W/ywu1v8WF2v/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAD
+ Bf8BExz/F6Tn/xmv9f8ZrvX/Ga/1/xit9P8YrfP/GK7z/xis8v8YrPH/GKzw/xis8P8Xq+//F6ru/xeq
+ 7f8Zq+7/fX+A////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////8AAAD/YGBg//////////////////39
+ /f/5+fn/9fX1/y2ex/8voMn/MaHL/zSkzf81pM7/N6bQ/zmo0v87qdT/PavW/z+s1/9Brtn/Qq/a/0Ww
+ 3P9Ist3/SbPf/wAAAP8AAAD/AAAA/zk6N/85Ojf/OTo3/zk6N/85Ojf/Ozw5/0JDQP9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9CQ0D/PD06/zk6N/85Ojf/OTo3/zk6N/8xMS//Gxsa/x8gTv8zNdj/NjjZ/ywu
+ 1v8qLNH/KizO/yoszv8qLM7/Ky3U/zEz1/82ONn/LjDW/yos0P8qLM7/Ky3S/ywu1v8sLtb/LC7W/ywu
+ 1v8sLtb/Ky3S/xcYcv8WF2v/Fhdr/xUWav8SE1r/Cgoz/wYHIv8FBRz/Bwck/woKMv8RElb/FRZq/wQE
+ Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcwRP8ZsPb/Ga71/xmv9f8YrfT/GK3z/xiu
+ 8/8YrPL/GKzx/xis8P8YrPD/F6vv/xep7v8Xqe3/F6ns/xSo7P9jY2P//v7+////////////////////
+ ////////AAAA////////////////////////////////////////////////////////////////////
+ ////////AAAA/wAAAP8AAAD/mZmZ/////////////f39//n5+f/19fX/LJ3G/y6eyP8woMr/MqPM/zSk
+ zv82pM//OabR/zqo0/87qdT/PqzW/0Gt2P9Cr9r/RK/b/0ax3P9Cps7/AAAA/wAAAP8yMzH/OTo3/zk6
+ N/85Ojf/Ozw5/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JD
+ QP85Ojf/OTo3/zk6N/8xMS//ICAf/xsbGv8nKaX/MzXY/zY42f8uMNb/Ky3U/yoszv8qLM7/KizO/yos
+ 0f8sLtb/NDbY/zM02P8sLtb/KizR/yoszv8qLM7/KizP/yst0v8sLtX/LC7W/ywu1v8sLtb/LC7W/ywu
+ 1v8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu1v8sLtb/LC7W/zc4Sf85Ojf/JSUk/xUVFP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/DFZ6/xit8/8YrvP/GKzy/xis8f8YrPD/GKzw/xer7/8Xqe7/F6nt/xep
+ 7P8XqOv/F6jp/2RgX/////////////////////////////////8AAAD/AAAA////////////////////
+ ////////////////////////////////////////Pz8//wAAAP8AAAD/AAAA/wAAAP8AAAD/////////
+ ///9/f3/+fn5//T09P8rnMX/LZ7H/y6fyf8xocv/M6PN/zWlz/83ptD/OafS/zup1P88qtX/P6zX/0Gt
+ 2f9Cr9r/RbHc/yNYbv8AAAD/AAAA/z5dev85Ojf/OTo3/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/80NTL/MDAu/xsb
+ Gv8bGxr/Jiid/zAy1/82ONn/MzXY/ywu1v8rLdT/KizP/yoszv8qLM7/LC7W/zQ22P82ONn/NjjZ/zEz
+ 1/8sLtb/Ky3S/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yst
+ 0v8rLdL/MjOG/zk6N/85Ojf/OTo3/zk6N/85Ojf/LzAt/wkKCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wlC
+ Xf8YrPH/GKvw/xes8P8Xq+//F6nu/xep7f8Xqez/F6jr/xao6v8Xp+j/aWNi//7+/v//////////////
+ ////////Pz8//wAAAP8AAAD/AAAA/wAAAP9/f3//////////////////////////////////Pz8//wAA
+ AP8AAAD/WVlZ//////////////////////////////////z8/P/5+fn/9PT0/ymbxP8sncb/Lp7I/zCh
+ yv8yosz/NKTO/zakz/83ptH/OafS/zup1P8+q9b/QK3Y/0Gu2f9Cr9v/AAAA/wAAAP8AAAD/RH64/zk6
+ N/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6N/85Ojf/MjIw/y8vLf8bGxr/Gxsa/yAhWP8sLtb/MTPX/zY4
+ 2f82ONn/MTPX/ywu1v8rLdP/Ky3S/y4w1v82ONn/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/NjjZ/zU3
+ 2P8zNdj/MDLX/y0v1v8tL9b/LjDW/y8x1v8rLdP/KizO/ygqx/8dHkD/MjIw/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/8vMC3/AAAA/wAAAP8AAAD/AAAA/wAAAP8Pb5v/F6vv/xeq7v8Xqe3/F6ns/xeo
+ 6/8WqOr/Fqjp/xao6P9qbGz//v7+//////////////////////8AAAD/AAAA/zMzM/9sbGz/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP9/f3///////8rKyv8zMzP/c3Nz////////////////////////////////////
+ /////////Pz8//n5+f/09PT/KZzE/yucxf8tnsf/Lp7J/zGiy/8zo83/NKTO/zal0P84p9L/OqjT/zup
+ 1f8+qtb/Qa7Z/0Ku2v8AAAD/AAAA/xoaGf9Hjtb/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf85Ojf/ODk2/zExL/8xMS//JiYk/xsbGv8bGxr/Hh4+/yYonf8sLtb/MTPX/zU32P82ONn/NjjZ/zY4
+ 2f82ONn/NjjZ/zY42f82ONn/MTPX/yst0/8qLM7/KizO/yoszv8qLM7/KizO/yoszv8rLdT/Ky3V/yMk
+ d/8bGxr/Gxsa/y8vLf80NDL/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wwM
+ C/8AAAD/AAAA/wAAAP8AAAD/F6nt/xep7P8XqOv/Fqjq/xao6f8Wp+j/Fqfn/2dvcf/+/v7/////////
+ /////////////7a2tv////////////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA
+ AP9mZmb/8vLy/////////////////xkZGf/////////////////8/Pz/+Pj4//T09P8omsL/KZvE/yyd
+ xv8tnsj/L6DK/zKizP80pM7/NaXP/zem0f85p9L/OqnU/z2q1f8+rNf/Qa3Z/wAAAP8AAAD/DQ0M/1CR
+ 0f9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zg5Nv8xMS//MTEv/zEx
+ L/8mJiX/Gxsa/xsbGv8bGxr/Gxsa/xwcKP8jJHj/IyR3/ygqtf8rLdb/LC7W/ywu1v8sLtb/Ky3V/ygq
+ sP8jJHf/IyR4/x0dM/8bGxr/Gxsa/xsbGv8lJST/Li4s/zExL/80NDL/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/wAAAP8AAAD/F6nr/xan
+ 6v8WqOn/Fqfo/xan5/8Wpub/ZHF2//7+/v//////////////////////////////////////////////
+ ////////Pz8//wAAAP8AAAD///////////9/f3//AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////
+ //////////////z8/P/4+Pj/9PT0/yeYwf8pnMT/KpzF/yyex/8unsn/MKHL/zKizf80pM7/NqXQ/zem
+ 0f85qNP/O6nU/z6q1v8/rNf/AAEB/wAAAP8AAAD/Q0RB/1Sn+/9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zs8Of85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//Li4s/yYm
+ JP8mJiT/JCQj/yIiIP8hIR//JSUj/yYmJP8mJiT/JiYl/zAwLv8xMS//MTEv/zExL/8xMS//MTEv/zU1
+ M/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/8SEhL/AAAA/wAAAP8AAAD/Fqfp/xan6P8Wp+f/Fqbm/xam5f9icnj//f39////
+ ////////////////////////v7+//wAAAP9/f3//KCgo/wAAAP8AAAD/kJCQ////////////////////
+ //////////////////+ZmZn/AAAA/wAAAP8AAAD//////////////////Pz8//j4+P/09PT/JpjA/yeZ
+ wv8pnMT/K53G/yyeyP8unsn/MaHL/zOjzf80pM//NqXQ/zin0v86qdP/O6nV/z6r1v8kY3z/AAAA/wAA
+ AP9DREH/Q0NA/1Sn+/9Up/v/T4rF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9AQT7/OTo3/zk6N/85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zEx
+ L/8xMS//MTEv/zU1M/83ODX/OTo3/zk6N/85Ojf/Pj88/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/QEE+/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8qKyn/AAAA/wAA
+ AP8AAAD/Fqfn/xam5v8VpeX/FaXk/2Nwdf/9/f3///////////////////////////9dXV3/AAAA/wAA
+ AP8AAAD/rKys////////////f39//wAAAP8AAAD/AAAA/wAAAP88PDz/////////////////Hh4e/wAA
+ AP/////////////////8/Pz/+Pj4//Pz8/8lmL//J5jB/yibw/8pnMX/LJ7H/y2fyP8vn8r/MqLN/zOj
+ zv81pM//NqbR/zmn0v86qNT/O6rV/z6r1/8AAAD/AAAA/wAAAP9DREH/Q0RB/0+Ozf9Up/v/VKf7/0+R
+ 0v9DQ0D/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf8+Pzz/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/89Pjv/Pj88/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf8+Pzz/OTo3/zk6N/85Ojf/OTo3/zk6N/8kJCL/AAAA/wAAAP8LU3P/FaXl/xWl5P8VpeP/ZW9y//7+
+ /v////////////////////////////////8AAAD/AAAA/////////////////wAAAP8AAAD/AAAA/z8/
+ P/8/Pz//Pz8//wAAAP////////////////////////////////////////////z8/P/4+Pj/8/Pz/yOX
+ vv8mmMD/J5nC/ymcxP8qncb/LJ7H/y6eyf8wocv/MqLN/zSkz/81pdD/NqbR/zmn0/86qNT/PKrW/y6A
+ of8AAAD/AAAA/wAAAP9DREH/Q0RB/0NEQf9Pj8//VKf7/1Sn+/9Up/v/S3We/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/1hZVv/w8PD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/85Ojf/OTo3/zk6
+ N/8AAAD/AAAA/wAAAP8VpeT/FaTj/xWj4f9qbW3//v7+/////////////////////////////////wAA
+ AP9oaGj/////////////////KCgo/6Ghof//////v7+//7+/v/+ioqL//////1NTU///////////////
+ /////////////////////////Pz8//j4+P/z8/P/Ipa9/ySXv/8mmMH/J5nC/ymcxf8rncb/LJ7I/y6f
+ yv8woMv/MqLN/zSkz/81pdD/N6bS/zmo0/86qdX/ParW/w8qNf8AAAD/AAAA/wAAAP8iIiH/Q0RB/0NE
+ Qf9DREH/Sm2O/1Sn+/9Up/v/VKf7/1Sn+/9HXXD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/cnNw//////90dHL/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/w97qv8VpOL/FqPg/2to
+ aP/+/v7///////////////////////////////////////////////////////////9/f3//WVlZ/3h4
+ eP8AAAD/JCQk/wAAAP+UlJT/AAAA///////////////////////////////////////8/Pz/9/f3//Pz
+ 8/8hlLv/I5a+/yWYwP8mmMH/KJrD/ymbxf8rncf/LJ7J/y6fyv8xosz/MqLN/zSkz/82ptH/N6fS/zmp
+ 1P86qdX/PavW/yt4lv8AAAD/AAAA/wAAAP8AAAD/ICAf/0NEQf9DREH/Q0RB/0NEQf9LdZ3/VKf7/1Sn
+ +/9Up/v/S3Wd/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf////////////////9vcG7/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/////////
+ //9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6
+ N/85Ojf/OTo3/wAAAP8AAAD/Axki/xWj4f8Wot//amNi//7+/v//////////////////////////////
+ /////////////////////////////1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/zs7O/+RkZH/////////
+ //////////////////////////////v7+//39/f/8/Pz/yCTuv8hlLz/I5e//yWYwP8nmcL/KZzE/yqd
+ xv8snsf/LJ/J/y+gy/8xocz/MqLN/zSl0P82ptH/N6jT/zmp1P87qtX/PavX/z6r2P8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8yMzH/Q0RB/0NEQf9DREH/REpM/1Om+v9Up/v/VKf7/0dcb/9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//Pz8/+goJ//8/Pz////
+ ///Pz8//Q0RB/0NEQf9CQ0D/u7u6////////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zk6N/85Ojf/AAAA/wAAAP8AAAD/FKLg/xOh
+ 3/9mZGP/////////////////////////////////////////////////////////////////8/Pz/wAA
+ AP8AAAD///////////8AAAD/AAAA/xYWFv8AAAD/SUlJ////////////////////////////+/v7//f3
+ 9//z8/P/H5O6/yGTu/8hlL3/JJe//yWYwf8nmcL/KZzF/yqdxv8snsj/LZ/J/y+gy/8yos3/M6PO/zSl
+ 0P82p9L/N6fT/zmo1P87q9b/PavX/z6r2P9Artn/AgcJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQ0M/0JD
+ QP9DREH/Q0RB/0NDQP9Up/v/VKf7/0+NzP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB///////////////////////+/v7/3Nzb////
+ ////////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9CQ0H/OTo3/zxOXv8GDBH/AAAA/wAAAP8Uod//DaDf/15fX//+/v7/////////////////////////
+ /////////////////////////////wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA
+ AP8AAAD///////////////////////7+/v/7+/v/9/f3//Pz8/8dkrn/H5K6/yGUvP8ilb3/JZjA/yaZ
+ wf8nmsP/KZvF/yqdx/8snsj/Lp/K/zCgy/8yos3/M6PO/zWl0P82ptL/N6fT/zmo1P88qtb/PKvX/z6s
+ 2P8+rdn/EpvS/wlNaf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8uLy3/Q0RB/0NEQf9HX3X/VKf7/0+O
+ zP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9KS0j/VFVS/1RVUv9LTEn/Q0RB/0NEQf94eHb/Q0RB/6Cg
+ n///////////////////////rq6t/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/R47W/wAAAP8AAAD/AAAA/xSh
+ 3f8Nndz/bW9v//7+/v////////////////////////////////////////////////9/f3//AAAA/wAA
+ AP9MTEz/AAAA/wAAAP+UlJT/BwcH////////////Pz8//39/f////////////////////////v7+//v7
+ +//39/f/8vLy/xyQt/8ekrn/IJO7/yGUvP8ilr7/JZjA/yaZwv8nmsP/KZvF/yqdx/8sn8n/LqDK/zCh
+ zP8xos3/MqPO/zWl0P82p9L/N6jT/zmp1f87qtb/PavX/w+Yz/8RmtH/EprS/xKa0/8Sm9T/BTBC/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/MjMx/0NEQf9DR0f/VKf7/0dcb/9DREH/Q0RB/0NEQf9DREH/T1BN/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL//v7+/////////////////5+fnv9DREH/Q0RB/1NUUf///////v7+/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/SGaB/02a6P88Tl7/AAAA/wAAAP8KUG7/FKDc/xub0f+JiYn/////////////////////////
+ //////////////////////////////////8AAAD/////////////////f39//wAAAP//////////////
+ ///////////////////////////////////+/v7/+/v7//f39//y8vL/G4+2/xyQt/8ek7r/IJS7/yGU
+ vf8jl7//JZjB/yaZwv8omsT/KZvF/yueyP8sn8n/LqDK/zChzP8yos3/MqPO/zWl0P82ptL/N6fT/zmp
+ 1f8bnM7/EZjO/xGZz/8RmdD/EprS/xKa0/8Sm9T/EpzV/w11oP8AAAD/AAAA/wAAAP8AAAD/EBAP/0NE
+ Qf9GW2z/VKf7/0NEQf9DREH/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9XWFX//////4yN
+ i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf/39/b///////////+ioqH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9IY3z/UJDQ/1Sn+/9Up/v/R15z/yorKP8AAAD/AAAA/xSg
+ 3P8Tn9v/LIy1/7y8vP///////////////////////////////////////////////////////////+7u
+ 7v////////////////9/f3//AAAA/2JiYv//////f39//yIiIv8AAAD///////////////////////7+
+ /v/7+/v/9/f3//Ly8v8ajrX/G4+2/xyRuP8fk7r/IJS7/yGUvf8kl7//JZjB/yeZwv8omsT/KZzF/yue
+ yP8sn8n/LqHL/zChzP8xos3/M6TP/zWk0P82ptH/MKXR/xCXzP8Rl83/EZjO/xGZz/8RmdD/EprR/xKa
+ 0/8Sm9T/EpzV/xKc1v8OdaH/AAAA/wAAAP8AAAD/AAAA/0NEQf9QlNj/RE9W/0NEQf9DREH/T1BN/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1NUUf/+/v7/R0hF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf///////////3JycP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/RFBY/0t1nv9Me6n/U6b5/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/VKf7/1Sn
+ +/9Up/v/THqn/0NEQf9DREH/AAAA/wAAAP8AAAD/E5/a/xOe2f9QfI3/6enp////////////////////
+ ////////////////////////////////////////Hh4e/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP+Kior//////////////////v7+//v7+//29vb/8vLy/xmNs/8ajrX/G5C3/x2R
+ uf8fk7r/IJS8/yGVvf8kmMD/JZnB/yeaw/8omsT/KZzG/yudx/8sn8n/L6HL/zChzP8yos3/M6TP/zWk
+ 0P8Plcn/EJbK/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZrR/xKa0v8Sm9P/EpzU/xKc1v8Tndf/BCc1/wAA
+ AP8AAAD/EBEQ/0NEQP9TpPX/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL/Q0RB/42OjP9zdHL/QkNA/0NEQf9DREH/Q0RB/8LCwf//////Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NGRf9RmeH/VKf7/1Sn+/9Up/v/VKf7/1Sn
+ +/9Up/v/VKf7/1Sn+/9Pjs3/S3Wd/0t0nP9DQ0D/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/AAAA/xOf
+ 2v8Tntn/E57X/2ducf/+/v7/////////////////////////////////////////////////////////
+ //8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////////////
+ ///+/v7/+vr6//b29v/y8vL/F4uy/xmNtP8ajrX/HJC3/x6Suf8fk7v/IJS8/yGVvv8kmMD/JZjB/yea
+ w/8om8T/KZzG/yqeyP8sn8r/LqHL/y+hzP8xos3/EJTH/xCVyP8Qlcn/EJbK/xCXzP8Rl83/EZjO/xGZ
+ z/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc1f8SnNb/BCc1/wAAAP8AAAD/Q0RB/1Sn+/9DREH/Q0RB/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9/gH7////////////39/f//////4yN
+ i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9Up/v/VKf7/1Sn+/9NgLP/Rldl/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/MzQx/wAAAP8AAAD/AAAA/wAAAP8LZYr/E57Y/xOe2P8Undb/ZmFg////////////////////
+ /////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////////7+/v/6+vr/9vb2//Hx8f8WirD/F4uy/xmO
+ tP8aj7b/HJC3/x6Tuv8fk7v/IJS8/yGVvv8kmMD/JZnC/yeaw/8om8X/KZzG/yqdyP8sn8r/LqHL/yGb
+ yf8Pk8X/D5TH/xCVyP8Qlcn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc
+ 1f8SnNb/AAAA/wAAAP8PDw7/S3Wd/0lqiv9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv92d3T/////////////////XF1a/8PEw///////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9ESk7/VKf7/1Ol+P9DRED/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9CQ0D/Kysp/yEiIP8hIiD/Hh4d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dnai/xOe
+ 2P8Tndf/Ep3W/wqa1/9wcXL//v7+////////////////////////////////////////////////////
+ ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////
+ /////////v7+//r6+v/29vb/8fHx/xaKr/8WirH/GIyy/xmOtf8aj7b/HJC3/x6Suv8fk7v/IJS9/yGV
+ vv8kmMD/JZnC/yebw/8om8X/KZzG/yqdyP8rnsn/D5LD/w+SxP8Pk8X/D5TH/xCVyP8Qlsn/EJbK/xCW
+ y/8Ql8z/EZfN/xGYzv8Rmc//EZnQ/xGa0f8SmtL/EpvT/xKc1P8GNUj/AAAA/wAAAP9DREH/VKf7/0NE
+ Qf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS//////9UVVL/VFVS/87Ozf/c3dz/////////
+ ////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/1Sn
+ +/9HXG//Q0RB/0NEQf8iIyH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CU9s/xOe2P8Tndf/E53X/xKc1v8SnNX/H5XF/7u7u///////////////
+ //////////////////////////////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA///////////////////////+/v7/+vr6//b29v/x8fH/FYqu/xaK
+ sP8WirH/GI2z/xmOtf8aj7b/HJG4/x6Suv8fk7v/IJS9/yKWvv8kl8D/JZnC/yebw/8om8X/KZzG/w2Q
+ wP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlsn/EJXK/xCXy/8Ql8z/EZfN/xGYzv8RmM//EZnQ/xGZ
+ 0f8SmtL/EprT/xKb1P8AAAD/AAAA/zAxL/9Tpvr/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv/Dw8L/qaqo/1RVUv9UVVL/wMDA//////+goJ//Q0RB/0NEQf+hoaD/QkNA/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/RVJb/0NEQf8ODg7/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAID/wlPbf8Nb5j/E57Z/xOe2P8Tndf/E53X/xKc
+ 1v8SnNX/EpzU/xKb0/9YeYX//Pz8////////////////////////////////////////////////////
+ //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1lZWf//////////////
+ //////////////39/f/6+vr/9vb2//Hx8f8Uiaz/FYuv/xaKsP8Wi7H/GI2z/xmOtf8bj7f/HJC4/x6T
+ uv8flLz/IZS9/yKWvv8kl8D/JZnC/yabw/8Vk7//DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U
+ x/8Qlcj/EJbK/xCXy/8Ql8z/EZjN/xGYzv8RmM//EZnQ/xGZ0P8RmtH/EprS/wAAAP8AAAD/AAAA/0ZW
+ ZP9Nf7L/S0xJ/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS////////////qaqo////////////////////
+ //9VVlP/Q0RB/6Okov+hoaD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/TorG/0py
+ mP87Ozn/AAAA/wAAAP8AAAD/AAAA/wAAAP8mXHP/NoKi/0u35f9Kt+X/Srbk/0m25P9JteP/R7Xj/zmv
+ 3/8Tntn/E57Z/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprR/2JfX//+/v7/////////
+ ////////////////////////////////////////////////////////////////////////jIyM/39/
+ f/9/f3//jIyM/////////////////////////////////////////////f39//r6+v/19fX/8fHx/xGG
+ q/8Uiq3/FYqv/xaKsP8Wi7L/GY20/xmPtf8bkLf/HJG4/x6Suv8flLz/IJS9/yKWvv8kl8D/IZfB/w2O
+ vP8Oj77/DpC//w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJfM/xGX
+ zf8RmM7/EZjP/xGZ0P8RmdH/CU1p/wAAAP8AAAD/Q0RB/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL///////////////////////////////////////////+0tbP//////6GhoP9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0ZVYf9TpPb/QkNA/wAAAP8AAAD/AAAA/xUzQP9Lt+X/Srbk/0q2
+ 5P9JtuT/SbXj/0m14/9IteP/R7Ti/0az4v9Gs+H/RbPh/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb
+ 1P8SmtP/EprS/xGa0f8kjrj/xsbG////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////8/Pz/+/v7//Pz8//Cw8P/EYaq/xKHq/8Uia3/FYqv/xaKsP8Wi7L/GI2z/xmP
+ tf8aj7f/HJC4/x6Suv8flLz/IJW9/yKVvv8Mjbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S
+ xP8Pk8X/D5TG/w+Ux/8QlMj/EJXJ/xCVyv8Qlsv/EJbM/xGXzf8RmM7/EZjO/xGZz/8RmdD/AAAA/wAA
+ AP8hIiD/THuq/0dec/9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv//////////////////////////////
+ ////////////////////////oKGf/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/VKf7/0NE
+ Qf8AAAD/AAAA/wAAAP9HsN3/Sbbj/0m24/9IteP/SLXj/0e04v9GtOL/RrPh/0Wy4f9Fs+H/RLLg/0Sy
+ 3/9Csd//EJzW/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xKa0f8RmdH/DpjQ/2ZlZP/+/v7/////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////v7+//7+/v/+/v7//v7+/+zs7P+7vLz/g39+/15jY/9MdoL/IoKg/wmD
+ qv8QhKj/EYaq/xKHrP8Uiq3/FYuv/xaKsf8Wi7L/GI2z/xmPtv8aj7f/HJC4/x2Suv8flLz/DYy4/wyM
+ uP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8Qlcf/EJXI/xCW
+ yf8Qlsr/EJbL/xCWzP8Rl83/EZjO/xGYz/8AAQH/AAAA/wAAAP9DREH/VKf7/0tMSf9UVVL/VFVS/1RV
+ Uv9UVVL/VFVS//////////////////////////////////////////////////////+FhYP/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/1On+/9ETVL/Dg4N/wAAAP8AAAD/NYep/0e14v9GtOL/RrPi/0az
+ 4f9FsuH/RbPh/0Sy4P9EsuD/Q7Hf/0Kx3/9Csd//QLDe/0Cv3f8Yntb/EpzU/xKb1P8SmtP/EprS/xKa
+ 0f8RmdH/EZnQ/xGZz/8kjrj/YWhp/3t1df+dnJz/wMHB/9jY2P/n5+f/7/Dw//j4+P/8/Pz//f39//39
+ /f/+/v7//v7+//39/f/9/f3//Pz8//b29v/v7+//5+jo/93e3v/Fxsb/paWl/4eDgv9tbGz/WGNm/013
+ g/8ug5//G4uv/wyIsf8Tiq//Eomu/xCHrP8Phar/DoWp/w+Ep/8Qhaj/EYer/xKHrP8Uia3/FYuv/xaK
+ sf8Wi7L/GI2z/xmPtv8aj7f/HJC4/xaPt/8Mirb/DIu3/wyMuP8Njbn/DY27/w2OvP8Njr3/DpC+/w6Q
+ v/8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJfL/xCXzP8Ql8z/EZfN/w59
+ qf8AAAD/AAAA/z9APf9Soe//R1tt/1RVUv9UVVL/VFVS/1RVUv9UVVL/5OXk////////////////////
+ /////////////////////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9OicT/TX6w/zAx
+ L/8AAAD/AAAA/xEsOP9Fs+H/RbLg/0Sy4P9EsuD/RLLg/0Ox3/9Dsd//QrHf/0Gx3v9AsN7/QK/d/z+v
+ 3f8/rtz/Pq7c/zCo2P8SmtP/EprS/xGa0f8RmdH/EZnQ/xGZz/8RmM7/EZjO/xGXzf8Rl8z/EpfL/wyV
+ y/8Klcv/CZLJ/xOVxv8VksH/GY+8/x6Quf8hj7b/I4+1/ySPtP8ijrP/II2z/x2Ms/8Yi7X/FIy2/xKO
+ uf8MjLj/CIq4/wiKuP8Iibb/GI+3/xiOtv8XjrX/Foy0/xaLsv8Ti7H/Eoqv/xKJrv8Qh6z/D4Wq/w6E
+ qf8Ng6f/DoOm/w+Ep/8Qhqn/EYer/xKHrP8Uia3/FYuw/xaKsf8Wi7L/GI2z/xmPtv8aj7b/C4iz/wyK
+ tP8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+T
+ xf8PlMb/EJXH/xCVyP8Qlsn/EJbK/xCWy/8Ql8z/EZfM/wAAAP8AAAD/AAAA/0NEQP9Up/v/S0xJ/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL///////////////////////////////////////////+Jioj/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/R1xv/1Ok9/9DREH/AAAA/wAAAP8AAAD/Q7Hf/0Ox3/9Csd//QrHf/0Gx
+ 3v9Bsd7/QK/e/0Cv3f8/r93/P6/d/z+u3P8+rtz/Pa7b/z2t2/89rdr/PKza/xGZ0f8RmdD/EZnQ/xGY
+ z/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6R
+ wv8OkcH/DpDA/w6Qv/8Oj77/DY68/w2Ou/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyJtP8LibP/Fo61/xaN
+ tP8Wi7L/E4qx/xKKr/8SiK3/EIes/w+Gq/8Ohan/DYOn/wyCpv8MgaT/DoOm/w+Ep/8QhKj/EYar/xKH
+ rP8Uiq7/FYyw/xaKsf8Wi7L/F42z/wqHsP8LiLL/C4mz/wyKtP8MirX/DIu3/wyLuP8NjLn/DY26/w2O
+ u/8Njrz/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcj/EJbJ/xCW
+ yv8Qlsv/CEtm/wAAAP8AAAD/Q0RB/1Ke6/9Kc5r/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/X2Be/9nZ
+ 2f//////////////////////aWpn/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NDQP9Up/v/Q0RB/wAA
+ AP8AAAD/AAAA/0Cw3v9AsN7/QK/d/0Cv3f9Ar93/P6/d/z+v3P8/rtz/Pq7c/z6u2/89rdv/Pa3b/z2t
+ 2v88rNr/OqvZ/zqr2f85qtj/D5jP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCV
+ yP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+Sw/8OkcL/DpHB/w6Qv/8OkL7/DY69/w2OvP8Njbv/DY26/w2M
+ uf8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsf8Lh7D/Fouy/xOKsf8Siq//Eoiu/xCHrP8Phqv/DoWp/w2C
+ p/8Ngqb/CoGl/wyBo/8MgaT/DoOm/w+Ep/8Qhan/EYar/xKHrP8UiK3/FYyw/xWKsf8OiK//C4av/wuH
+ sP8LiLL/C4iz/wyJtP8MirX/DIq2/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY+9/w6Qvv8OkL//DpDA/w6R
+ wf8PksP/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJbJ/xCWyf8Qlsr/AAAA/wAAAP8NDQz/Q0RB/1Sn
+ +/9DRED/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/VKf7/0NEQf8ODw7/AAAA/wAAAP8vgqX/P67c/z+u3P8/rtz/Pq/c/z6u
+ 2/89rdv/Pa3b/z2t2v88rdr/PKza/zus2f86q9n/OavZ/ziq2P84qtj/N6rX/zep1v8Vms//EZfN/xGY
+ zf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCVyP8QlMf/D5TH/w+Uxv8PksX/D5LE/w+Sw/8OkcL/DpHB/w6Q
+ wP8OkL//Do++/w2Ovf8Njrz/DY27/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuG
+ r/8PiK//Eomv/xKIrv8Qh6z/D4ar/w6Fqf8Ng6f/DYOm/wqCpf8JgKP/C4Ci/wyBo/8NgqT/DoOm/w+F
+ qP8Qhan/EYer/xGHrP8TiK3/E4uv/wqErf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyL
+ t/8NjLj/DY26/w2Nu/8Njrz/DY69/w6Pvv8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5PF/w+U
+ xv8PlMf/EJXI/xCWyf8GP1X/AAAA/wAAAP9DREH/SnOZ/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL/VFVS/0dIRf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0NA/1Sn+/9FUVr/IyQj/wAA
+ AP8AAAD/Dys2/z2u2/89rdr/Pa3a/zyt2v88rdr/O6za/zur2f86q9n/OqvZ/zmr2P85qtj/OKrY/zeq
+ 1/83qdf/N6nW/zao1v81qNX/NafV/yei0f8Ql8z/EJbL/xCWyv8Qlsr/EJbJ/xCVyP8QlMf/D5TH/w+T
+ xv8Pk8X/D5LE/w+Sw/8PksL/DpHC/w6Rwf8OkL//Do++/w6Pvf8Njrz/DY67/w2Nuv8NjLn/DIu4/wyL
+ t/8Mirb/DIq1/wyJs/8LiLL/C4ex/wuHsP8Lhq//CoWt/wqErP8RiK3/EIes/w+Gq/8Ohan/DYOn/w2D
+ pv8LgaX/CoCj/wl/ov8KgKH/C4Ci/wyBo/8MgaT/DoOm/w+FqP8Phan/EIar/xGHrP8JhKr/CoSr/wqF
+ rf8Kha7/C4av/wuHsP8LiLH/C4iy/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2Nuv8Njrv/DY68/w2P
+ vf8OkL7/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Txf8PlMb/D5TH/xCVyP8AAAD/AAAA/wAA
+ AP9DREH/U6Lz/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9TVFH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0ZZaP9Up/v/R1xu/zIzMf8AAAD/AAAA/wAAAP86q9n/OqvZ/zqr2f85q9n/OarY/zmq
+ 2P85qtj/OKrY/ziq1/83qtf/N6nX/zap1v82qdb/NajV/zWn1f81p9X/NKbU/zOm0/8zptP/MqbS/xCW
+ yv8Qlcn/EJbJ/xCVyP8PlMf/D5TH/w+Txv8Pk8X/D5LE/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6P
+ vv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqF
+ rf8KhKz/CoSr/wqDqv8Phqv/DoSp/w2Dp/8Mgqb/CoKl/wl/o/8Jf6L/CH6g/wh9n/8KgKH/Cn+i/wyB
+ o/8MgaT/DoOm/w+FqP8Phan/CYKo/wmDqf8Kg6r/CoSr/wqErP8Kha7/C4av/wuHsP8Lh7H/C4iy/wuJ
+ s/8MirT/DIq1/wyKtv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+Txf8Pk8X/D5TG/wdQa/8AAAD/AAAA/ywtK/9DREH/VKf7/1Sn+/9FVGD/R0hF/1NU
+ Uf9UVVL/S0xJ/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9PjMj/VKf7/0ZXZf9CQ0D/AAAA/wAA
+ AP8AAAD/N6rX/zeq1/83qtf/N6rX/zep1/83qtf/N6nW/zap1v82qdb/NafV/zWn1f81p9X/NafU/zSn
+ 1P8zptP/M6bT/zOm0/8yptL/MaTR/zCk0f8wo9D/D5XI/xCVyP8PlMf/D5PG/w+Uxv8Pk8X/D5LE/w+S
+ xP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Qvv8Nj73/DY68/w2Ou/8Njbr/DY25/wyLuP8Mi7f/DIq2/wyK
+ tf8MibT/C4iz/wuIsv8Lh7H/C4av/wuGrv8Kha3/CoSs/wqEq/8KhKr/CYOp/wqDqP8Ng6f/DIKm/wqC
+ pf8Jf6P/CX+i/wh+of8Ifp//B3ye/wh9n/8JfqD/CoCi/wyBo/8MgaT/DYOm/wyDpv8Jgqf/CYOo/wmD
+ qf8KhKr/CoSr/wqErP8Kha3/C4au/wuHsP8Lh7H/C4iy/wuIs/8MibT/DIq1/wyKtv8Mi7f/DIu4/w2N
+ uf8Njbr/DY67/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwf8OkcL/D5LD/w+SxP8PksT/D5PF/wAA
+ AP8AAAD/AAAA/0JDQP9DREH/Upvk/1Sn+/9Tpvr/RVBY/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9LdZ3/VKf7/1Sn+/9DREH/QUI//wAAAP8AAAD/AAAA/zap1v82qdb/NajV/zWo1f81qNX/NajV/zWn
+ 1f81p9X/NafU/zSm1P80ptP/M6bT/zOm0/8zptP/MqbS/zKl0f8xpNH/MKPQ/zCi0P8wos//L6LP/y6i
+ zv8Rlcf/D5TG/w+Txf8Pk8X/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2O
+ vP8Njbv/DY26/w2Muf8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha7/CoWt/wqE
+ rP8KhKv/CoSq/wmCqP8Jgqf/CYGm/wyCpf8KgaX/CYCj/wl/ov8IfqH/CH6f/wd9nv8HfJ3/CHye/wh9
+ n/8Jf6D/CoCi/wuAo/8MgaT/CYGk/wmBpf8Jgab/CYOo/wmDqf8Kg6r/CoSr/wqErP8KhK3/Coau/wuG
+ r/8Lh7D/C4ix/wuIsv8MibP/DIq1/wyKtv8Mi7f/DIu4/w2Muf8Njbn/DY26/w2Ou/8Njrz/DY69/w6P
+ vv8OkL//DpDA/w6Rwf8OkcH/DpHC/w+Sw/8PksP/D5LE/wAAAP8AAAD/AAAA/0NEQf9DREH/R1xv/1Sn
+ +/9Up/v/VKf7/1Sn+/9Tpvr/U6T2/1Sn+/9Up/v/VKf7/1Sn+/9LdJv/Q0RB/zIzMf8AAAD/AAAA/wAA
+ AP8xncf/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/MqbS/zKl0v8xpNH/MaTR/zCj
+ 0P8wo9D/MKPQ/y+iz/8vo8//LaLO/y2izv8soc3/K6DN/x+ayf8PksT/D5LE/w+Sw/8PksP/DpHC/w6R
+ wf8OkMD/DpC//w6Qv/8Oj77/DY69/w2OvP8Njbv/DY26/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuI
+ s/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqErf8Khaz/CoSq/wqDqf8Jg6j/CYGn/wmCpv8JgaX/CICk/wl/
+ o/8Jf6L/CH6h/wh+n/8HfZ7/B3yd/wd7nP8HfJ3/B3ye/wh9n/8JfqD/CoCi/wh/ov8IgKP/CICk/wmB
+ pf8Jgqb/CYKn/wmCqP8KhKr/CoWr/wqErP8KhK3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyK
+ tf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R
+ wv8PksL/C3Sb/wAAAP8AAAD/AAAA/zIzMP9DREH/Q0RB/0NFQ/9Meqf/VKf7/1Sn+/9Up/v/VKf7/1GZ
+ 4P9HXG//Q0RB/0NEQf8SEhH/AAAA/wAAAP8AAAD/Koqu/zKl0f8ypdH/MaTR/zGk0f8xpNH/MaTR/zGk
+ 0f8wpNH/MKPQ/zCj0P8wotD/MKPQ/y+iz/8vo8//LqPP/y2izv8toc7/LKHN/yyhzf8roM3/Kp/M/yqg
+ zP8pnsr/KJ3K/w+Sw/8OkcL/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2OvP8Njbv/DY26/w2N
+ uf8NjLj/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqFrf8KhKz/CoSr/wqE
+ qv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd8nf8HfJz/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAgAAAAAABAAABAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEFCf8CCg3/CwsL/wMJ
+ Ff8EExr/ERER/xcYFv8YGBf/EBYY/xAYGv8bGxv/HyAe/yAgH/8HCCT/Bhsj/xgdJ/8LDDj/HR44/wkh
+ K/8SIyn/BSg3/xIrNv8ZMTz/IyMj/ycoJv8nKCj/Kysr/zAwLv83Nzb/P0A9/0BBPv8ODkT/DxBK/xAR
+ Tv8RElf/HyBJ/wY1Sf8VN0X/Bz1T/xE+Uf8iPEj/NzhN/yAhWv8VFmf/Fxhy/yIjaP81NmL/IyR3/wdB
+ Wv8XRFb/KEhW/z1MV/8rUF//CEto/xJMY/8JUG7/ClV2/xJcfP8gTmH/K1Rm/zJZav85XHT/EmB+/yZi
+ ev81Y3b/RERD/0dIRf9JSkf/QEZK/0RKTP9LS0r/T1BN/1BRTv9ETVP/RVFa/1RVU/9fYF3/YGFe/0ZY
+ Z/9HXnL/SGB2/0hie/9Cb3v/SG55/1dvef9JcHz/WHJ7/2ZnZv9wcW//anV4/3d3d/+AgH7/GxyH/x0f
+ kf8eIJb/JieN/zEyhf8mKJb/Jiem/y4wrf8nKLn/C12A/wthhf8MZYv/EmaK/w1slf8SbZP/DXGc/wd8
+ nf8IfZ7/EnSY/yVth/86a4H/LXOM/zlziv8jd5H/LnWT/yZ5lP8re5T/JXuc/y1+mf87e5P/Dnek/wh9
+ of8Oe6n/EXuq/xF+sP8of6H/SWWA/0lohf9Jaor/SHiK/1F1hP9Idpj/ZXuC/3F+gv9MeKT/THys/0t/
+ sv8pK8z/LzHP/zEyzP8rLdP/LjDV/zM12P8tgZ3/M4Od/wmBpP8KhKv/D4iv/xKHrP8LhrD/C4m0/w2N
+ uv8Vi7P/DpC+/xyRuf8qhaX/OYik/yeNtf8wi7D/JJa8/zOSuP9cgI3/RYKa/3iDh/9oiJX/RIym/0aT
+ rv9fkab/TYK1/06FvP9Flrb/VJq5/2qbsv9Sob//E47E/w6Sw/8Olcr/DpjP/xCWy/8SnNX/KZvE/zKd
+ xP8hn9D/FKDc/y2hzP82o8v/KaTW/zOl0f85ptD/NqjV/zyp0/8zqdn/PKza/z6w3/8Vpub/GK3y/xmw
+ 9v8prOX/Na7j/yuw6/86suf/IrDy/ze38v9NicT/UI7M/0ufw/9Zn8D/UJDP/0iO1v9Qk9b/RaTJ/1Wm
+ yP9DrNX/V63S/0mx3P9Std3/ZKrK/2Gt0P9ot9v/TZbg/1Ga4/9Snuv/U6Du/0q14v9Xu+T/U6X5/0W+
+ 9v9Qv/L/Yr7m/13A6/9awvL/ZMLr/2rI8v9zzPX/e9D3/4aGhv+Qj4//kJGP/4eWm/+bm5v/m5+g/5qh
+ o/+np6f/urq6/8K/v//AwL//yMjI/9DPz//U1NT/5+fn//39/f8AAAD/AAAA/21tbW5ubm6UlJSUlJSV
+ lJWVlZWYlZmWmZmZmZmamZqampqampqyspqysrKysrKysrKdtZ21tbW1tbW1tbW1tbW1tbW1tbW1tbW1
+ tbOdtbKdsrKzsrKyspyynJyanJqampqampqZmZmZmZmWlpmYlZWVlZWUlZSVlJSUbZRtbW1tbW1ubpRt
+ lJSUlJWUlZWVlZmVmZWZmJmZmZqZnJmcmpyanJqyspyasrKysrKysrWdtbW1tbW1tbW1tbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tbW1tZ2ysrKyspyysrKcnJqcmpqampqamZmamZmZlpiYlZiVlZWUlJSUlJSUbpRt
+ bW1tbW1ulJSUlJSUlZSVlZWVlpWWmZmZmZmamZqZmpqampqcspqcsrKysrKds521tbW1tbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tJ21sp21srKysrKyspyympqampqamZmZmZmZlpiYlZiVlZWV
+ lJSUlG6UbXxtbW1ulG6UlJSUlZSVlZWVmZWVmZmZmZqampmamZycnJyysrKctbKysrWdtbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tba1tba1tba1tba1tbW1tbW1tbW1tbW1tbW1srKysrKcnJycnJqcmpqampmZmZmZ
+ mZaWlZWVlZWVlJWUlJSUbpRtbm2UlJSUlJSVlJWVlZWZlpmWmZmZmZmZnJqcnJycspyysrKynJ21tbW1
+ tbW1tbW1tbW1tbW1tba1trW2tba1tba1tbW1tba1tba1trW1tbW1tbW1tbW1tbKdtbKysrKysrKcnJqc
+ mpyZmpqamZmZmZiZmJWYlZWUlZSUlJRubnx8lG6UlJSUlZWVlZmVmZmVmZmZmZqampqcmpycnJycsrKy
+ s7K1tbW1tbW1tbW1trW1tra2trW2tbW1trW2tba2tba2tra2tba1tba1tba1tbW1tbW1tbW1tbW1tZ2y
+ tLKysrKcspqcmpyamZmamZmZmZaYmJWVlZWVlJWUlJSUbW6UlJSUlZSVlZWVlZWWmZmZmpmamZqcmpyc
+ nLKysrKynbKdtbW1tbW1tbW1tbW1trW1tbW1trW2tra2tra2tra2tra2tra2tra2tba2tba2tba1tbW1
+ tbW1tbW1tbKdsrKysrKcnJycmpqanJmampmZmZmVmZWVlZWUlZSUlJSUfJSUlJWUlZWVlZmVmZaZmZma
+ mZqampycnLKcsrKys7K1tbW1tbW1tbW1tbW2trW1tra2tra2tra2tra2tra2tra2tra2tra2tra2trW2
+ tbW2tbW2trW1trW1tbW1tbW1tZ2ysrKcnJycnJqampmZmZmZlpmWmJWVlZWVlJWUlJSUlJSVlJWVlZWV
+ mZaZlpmZmZqampycnJycsrKcnLKdtbW1tbW1tbW1tba2tbW1tra2tra2tra2tra6tra2tra2tra2tra2
+ ura2tra2tra2tra2trW1trW1tbW1tbW1tbW1sp21nLWyspycnJqcmpyZmpqZmZaZmJmVlZWVlJWUlJSU
+ lJWUlZWVlZmWmZmZmpmampqanJycnLKdsrOztbW1tbW1tbW1tra1tbW2tra2tra2tra2trq2tra2trq6
+ ura6urq2tra2tra2tra6tra2tra2tra1trW1trW1tbW1tbW1tbW1nLKysrKcnJqamZyZmZmZmZaYlZWV
+ lZWVlJSUlJWUlZWVlZmVmZmWmZmZmpqanJycnLKynLKynbW1tbW1tbW1trW1tba2tra2tra2tra2trq2
+ trq2tra6tra2ura2tsW2tra2trq2ura2ura2tra2tra2tra1tra1tbW1tbW1tbKys7KynLKcnJycmZya
+ mpmZmZmZlZmVlZSVlJSUlJWVlZWZlZmWmZmZmpqampycnJyysrKzs7W1tbW1tbW2tba1tra2tra2tra2
+ tra2tra2trq6trq6xbbFtrq2xbq2trq6xbbFtrq2ura2trq2ura2tra2tra1tba2tbW1tbW1tbWdsrKz
+ nLKynJycmZqZmZmZmZmVlpWVlZWVlZWUlZWVlZaZmZaZmpmampqcnJyysp2ysp21tbW1tbW1tbW1tba2
+ tra2trq2trq2tsW2xbq6urq6tra6trbFtsW2tsW2ura2urq2urq2urq6tra2tra2tra2tra2tbW1tbW1
+ tbW1tbWysrKyspycnJycmpqcmpmZmZmYmJiVlZWUlJWVlZWZlZmZmZqZmpqanJycnLKysrOytbW1tbW1
+ tbW2tra2tra2tra2tra6trq6ura2tra6urWbfmg6OjY2Nzg6OWtvm7W2usW6urq6trq6urq6trq2tra2
+ tra2tra2trW1tbW1tbW1nbKysrKcnJycmpmZmZmZmZmVmJWVlZWVlZWZlZmWmZmZmZqampycnLKynbK1
+ nbW1tbW1tbW2tbW2tra2tra2tra2ura6ura2tn46MRUEAQAAAQEAAAEAAAAAAAEAAAQPJThrsbrFtra6
+ tra6ura6tra2tra2trW1tra1tbW1tbW1s521spyynJycmpqampmZmZmYmZWVlZWWlZmVmZmZmpmampqc
+ nJyysrKytbK1tbW1tba1tbW2tra2tra2tra6tsW2urZ+ORUBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAEBBSdptbbFura6ura2ura2tra2tra1tba1trW1tbW1srKcspycnJycnJqZmpaZmZaVlZiVlZWWlZaZ
+ mZmZmpqcnJycsp2ysrKytbW1tbW1tba2tra2tra2trbFtra6tn4xBQAAAAAAAAAAAwEBAwMLGBgYGA0Y
+ DQgDAAAAAAAAAAAAAAEAFTmxxba6urq2tsW2tra2tra2tbW1tbW1tbW1s7OysrKcnJyanJmampmZmZmY
+ lZWVlpiZmZmZmpqampqcnJyysrK1srW1tbW1tbW2tba2tra2tra6tra2tTkPAAAAAAAAAAEIHEdYW+/v
+ 8vXy8/Lz9fL18vLy7llNQhoDAAAAAAAAAAAVara2trq6tra2trq2tra2tra1trW1tbW1nbKcspycnJyc
+ mpqZmZmZlpiYlZeWlpaZlpqZmpqcnLKcnLKysrK1tbW1tba1trW2tra2trq2tra2tTYDAQAAAAADCEJY
+ 7/Ly8vPy9fPy8/Lz8vLy8vLz8vL18vPy8vLuTR0DAAAAAAAABDq1urq6urq2tra2tra2tbW1tbW1tbW1
+ tbWysrKcnJyampqampmZmZiWoqKdlpqWmpmcmpycnLKysrW1tbW1tbW1trW1ura2trbFtrq6tjgEAAAA
+ AAELTO7y8vXy8vPy8/Ly8vLy8vLy8vLz8vLz8vLy8/Lz8/Ly8/JbQwgAAAAAAAI2tbq6trq2ura2tra2
+ tra1tbW1tbW1srKysrKcnJyampqZmZmZlpiio6Kjop2ampycnLKcsrKysrW1tbW1tba1tra2tra2tra2
+ um8PAAAAAQNCW/Xy8/Ly8vLy8vLy8/Lz8/Py8/Pz8/Pz8vLy8/Pz8vLy8vPy8u/uXEwIAAAAAAAEZrbF
+ tra2tra2tra2tba2tbW1tbW1s7KznbKcnJyampqamZmWmaKiuKK4uKKimpycnLKytbWytbW1tbW2tra1
+ ura2tra2urYxAAAAAANJ7/L18vLy8vL18vLz8vPz9fX29vb29/f49/f29vb29fX1W0cdGAYBAwMAAwYI
+ BgMBAAEAD3+2xbbFtra2tra2tbW2tba1tbW1nbOynLKcnJyampmZmZmWuKOiuLi4uLy8t5yysrKytbW1
+ tbW2tbS1tra2tra2xbqbDwAAAAELHFny8/Ly9fLz8vLz9fb2+fn5+fn5+fn5+fr5+fn5+vn5+fkYAQMc
+ TFiI7/X19fX19fPuWB0BBDm2tra6trq2tra2trW1tbW1tbWytbKyspycnJqampqZmZmiori4uLi81bzV
+ vLuisrOytbW0tba1tra6tbq6trq2fgQAAAAGHB0dHe7y8vLz8vP19/n5+fn6+fr5+fn5+fr5+fn5+fn5
+ +fn57gNc9fX19fX19fX19fX19fX19e4aABa1trq6tra2tra2tra1tbW1tbWytbKynLKcnJycmp2doqK4
+ uLi4vLy8wbzB19e8ubW1tbS0tLa1urW6trbFtnwDAAABEB0cHR0dQvLy8vX2+fn5+fn5+fn5+fn5+vn5
+ +fn5+fr5+fr5+fkYR/X19fX19fX19fX19fX18lvv9VgAAA+bura6trq2tra2tba2tbW1tbWytbKynJyc
+ nJ2iuKKiori4uLi8vNW8wdXX19fX17m1trS2tLq0ura6trZ+BAAAAxwdHR0dHB0dTPX3+fn5+fr5+fr5
+ +fn5+fn5+fn5+fr5+fn5+fn57gPy9fX19fX19fX19fNZRxsYGO7yBgAAAAR+ura6tra2tra2tbW2tbW0
+ s7Wyspycoru4uLi3t6K4uLi4vLzVvNXX1dfY19nY2tm8uba0tra6urq6tQUAAA4cHR0cHR0dHR0q7vn5
+ +fn5+fn5+fn5+fr5+fn5+vn5+fn5+fn5+fkcHvX19fX19fX19e5IGBoYGBgd9U0ABgAAAAR+urq2urq2
+ tra2trW1tbO1srK5u7+8vLy4uLi4t6K4uLjVvLzBwdfX2Nfa19ra2traxLm6urq6urYVAAAGHR0dHRwd
+ HR0qQkdC7/n5+vn5+fn6+fn6+fn5+vn5+fn5+fr5+vn59QPu9fX19fX19e5CGBgYGBkYGE71CAFCGwEA
+ AASXtsW2trq2tra2trS1tLm7wcHVv7y8vLy4uKKiuLi4vLzVvNXV19fX19fa2dra4+Pj59m9urq2OQAB
+ Ax0dHB0dHR0dQkVCQkJH7/n5+fr5+fn5+fn5+fn5+fn6+fn5+fn5+flMGPX19fX19fJHGBgYGBkYGBgY
+ 71wBGkdCHQEAAAWxurq6tra2tra1ur7X2dfX18HBwby8vLu4vLe4uLy8vL/B19fX19fa2tra2uPj493j
+ 5+faxLUCAAMcHR0cHR0cHkJCQkJCR0JF7vn5+fn5+fn5+fn6+fn5+fn5+fr5+fn5+QhN9fX19fVZGxga
+ GBoYGBoYGB31RwMfQkJCHQEAABW2trq6ura2vcPa2dnZ19fX18G/vLy8vLi3ori4vLzVvMHV19fX2NfZ
+ 2tra2uPj2ufn6urqMwAAGx0dHR0dHSpCR0JHQkJCR0JFW/n5+fr5+vn5+fn5+fr5+fn5+fn5+fnyAfL1
+ 9fXzRxgYGBgYGBgYGBgaTPUGDUVCR0JCHQEAADbFtra9xOPa2tna2dnX2dfXwcHBvLy8uLy3vLy8vLzB
+ wdfX19fZ2tra2trd493o6urn6q4AAAsdHR0cHR0eQkVCQkJCQkJCQkJHWPb5+fn5+fn5+vn5+fn5+vn5
+ +fr5+U4b9fX17x0YGBgYGhgYGhgYGhju7gMdQkNCRUJCGwAAAX7L4+Pj4+Pj49na2dnX19fBwb+8vLy8
+ uLe4uNW81dXV19fX19rZ2tra49rj4+fd5+rqMwABHBwdHR0dQkJCR0JCQkdDQkJHQkJCTPP5+fn6+fn5
+ +fr5+fn5+fn5+fn5G0z19VwbGBgYGhgYGBgYGRgYGvVOA0JCQkJHQkJCCAAAFufq5+Pj49rZ2tnZ2dfX
+ 19fXwcG8vLy4vLy8vLzBwdfX19jZ2tjZ2uPj5+Pn5+fq6t0DABAdHR0dHCpCQkJCQkdCQkJDQkNCQkdC
+ R1v3+fn5+fn5+fn5+fn6+fn5+fcD7vVbGhgYGBoYGBgaGBgYGBhE9R0NRUJCQ0JDQkNCAwABeujj4+Pj
+ 4+Pj2drZ2dnX18HBv7y8vLy31by81cHV19fX19fa2tra2trj5+fn6urqcQABHRwdHR1CRUJHRUJCQkJC
+ QkJCQkJCQkJCQknv+fn5+fn5+fr5+fn5+vn57wb1WxgYGBoYGBgYGBgaGBkYGlj1BhxCQ0JCQ0VCQkcc
+ AAAQ4+fq5+Pj2tna2dnZ19fX18HXvLy8vLy8vLy/wdfX19ja2tra2uPn5+fj5+rq6uoWAAsdHB0dHUJC
+ QkJCQkJHQkNCKkJCQkdCR0JHQkJN8/n5+fn6+fn5+fn5+flYKlsYGRgYGBgYGhgYGBgYGBgY7u4DHkJD
+ QkJDQkNCQ0IGAACl6OPj4+Pj49rZ2dnZ2dfXwde8vLy8u7y81cHV19fX19nZ2tra2trj4+fq3erq2AEA
+ Gx0dHR1CR0JCQkdCQkIqHR0dHSpCQkJFQkJDQkJHTO/3+fn5+fn5+vn5+U4LGhgYGhgaGBgYGBoaGBgZ
+ GBjzWwZCRUJFQkJCQkJDQh0AABfq6urj4+Pa2eja2dfZ19fXvMS8vLy8vLy819fX19nX2tjZ2uPj5+fn
+ 6urq6+uEAAMdHRwdQkJCQkJHQkJCQh0dHR0dHUJCQkJDQkJCQ0JCR0dZ8/f6+fr5+fn5TgAYGBgdR0xO
+ Tk5YTkxMTEUdHRgGAQgLGBobHB0dQh9CQggAAdbj4+Pj4+Pj2dnZ2dnZ19fBwby8wby8v7/V19fX19ra
+ 2tra2trj2urd6urq6jMACB0dHSpCR0JCQkJCR0IdHR0dHB0dQkNCQkVCHSofQkJCQkJHR1ju9ff5+flb
+ ABvv9vb49vb29vb29vb2+Pb29vb28+/uWU1KHRgDAQEDDQAAcerq6OPj49rj2trZ2dfE19m8wby8vLy8
+ 18HX19jX2dna2uPj5+fq5+rn6t3sFAAaHR0dQkJCQkJHQkJCQh0dHR0dHR0fRUJCQh0dHR0qQkJCR0JC
+ QkNDRUxOW1gBTPb29vb29vj29vb49vb2+Pb29vb49vb29vb29vb1GwAfAwAX5+jo4+Pj49nZ2dnZ2dfX
+ wcHBvLy8vMHV19fX19fa2dra49ra6trq6urq690AABwcHUJCQkJDKkdCQkJCHR0dHR0dHUJDQkIdHR0c
+ HR0fQkJDQkJCHR0dHR0dHwgd9vf29vf29vf29vb49vb29vj29vb49vb29vb2+foQDUIYAALn6ufq4+Po
+ 4+Pa4tnZ2dfB2bzBvLy8vNfX19fa2tra2trj4+rj6urq6ursrgEDHR0dQkJCQkdCR0JCRyodHR0dHR0d
+ R0JCKh0cHR0dHR1FR0JCKhwdHR0dHR0dGwDy9vb29vb29vb2+Pb29vj29vb49vb29vj2+fr67gNCQh0A
+ Aa3q6Ojj4+Pa2dnZ2dnZ18TBvLzBvLzBwdfX19fZ2dra2trn2uqlNerq6+qlAQMdHUJDQkJCQkJCQkJH
+ Qh0dHR0dHUJCQkIdHR0dHR0dHUJCQh4dHR0dHR0dHR0dDR329vb29vb29vb29vb29vb29vb29vb29/r7
+ +vUIHkJFQgABcejq4+jj6Ojj49rZ2dnX19nXwby8vNXX19fX2dra2uPj4+Pn2gsDM+rq61MAAxgdQkJC
+ Q0JHQkJCRUJCQh4dHSpCQkJCQh0dHR0dHR0dRUJFHR0dHR0YBgMAAAMDA1j39vb39vf29vb39vb29vb2
+ 9vb2+fr6+vr1GB5CQkdCBgA86urq4+Pj2trZ2eLZ2dfZwby8wby8wdfX2NfZ2drZ2trn2uhBBgYGM+zq
+ QQALGxgYGCpCQkJCR0JCQ0VDQkJCRUJDQkIeHR0dHB0dHR1CQh4dHR0cAwAAAAAAAAAAAAhO9fb29vb2
+ 9vb29vb29vb4+fn5+vr78hAdQkNCQ0INABfq6uPq4+jj6OPi2tnZ18TZ18HBvMHV2dfX2dra2trj4+Po
+ 2gYGBgYGM+o+ABgdQkIqGxgYHUJCQkJCQkJDQkNCQkNCQyodHR0dHR0dHUJCQh0dGwAAAAAAAAAAAAAA
+ AAADWPb29/b29vb29vb5+fr6+/v7+lsIHUJFQ0JCQhsAEOrq6uPo4+PZ2trZ2dnZ2cG8wbzBvMHX19fZ
+ 2dnZ2trj2uiwFAYGBgYGMzMAGB5CQkJCRUIcEAYGGBwfQkJCQ0JDQkJDHR0dHR0dHR0eQkMdHRwBAAAA
+ AAAAAAAAAAAAAAAAG/X29vb29vn5+fv5+/v5+vZCCBwdHR1CQ0JCHQAB5+ro6uPj6Oji6OLZ2dfZ2dnB
+ wbzV19fX19nZ2trj4+Pa5+rahBQFBgYGAAAaQkJCR0JCQkJCQhwIAQADBhseQkNCQkMeHR0dHB0dHUJC
+ Qh8dAwAAAAAAAAAAAAAAAAAAAAAAB/L29vn5+fv5+/v6+fvuCxgdHR0dHSpCQkUeAAHj6uro6OPj49rZ
+ 2tni2cTXvLzBwbzB19fZ2drZ2trj6Ojj6Orq6qozBgYDABpDQkJCR0JHQkdCQkIeGAMBAAADGBxCQh4d
+ HR0dHR0dQ0JFHxgAAAAAAAAAAAAAAAAAAAAAAAAAB/n6+vv7+vv7+fr1HQYbHR0cHR0dHUJCQkIAAdbq
+ 6ujo6Nro4uPi4tnZ2cTZ18G819fZ19nX2dqpc0A9PTw1NTM8PUE9KQMAG0JCQ0VCQkJCQkJCR0JCQhsG
+ AAAAAAMLGx0dHR0dHUJCQkJCAwAAAAAAAAAAAAAAAAAAAAAAAAAAHfv6+fr6+/n1QgAABhgdHR0dHR0d
+ HUJDQgAA0evo6ujj4+ja49nZ2dnZwcG818G8wdfX2dnZ2RcGBgYGAwYGBgYDBgYDAwAbRUJCQkJHRUJH
+ QkVCRUJCR0IqGwMAAAAAAAcYHR0eQ0JCQx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA7vr7+/dbHQtbW0wL
+ AAMbHR0dHR0dRUNCAwDW6uro6Oja6Nno49nZ2dnZ18TBvNfV2dnZ2dnEFwYGAwYGBgYGBgYGBgYDABhC
+ Q0JHQkJCQkJCQkJCQkdCQkJCQh0QAwAAAAAACBxCQkVDCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWEwb
+ Axju+/z8+/vyGQAZHR0dHR1CQkIBALjj6Oro6Ojj6Nni2tnZ2cS82bzBtbe5tbW0tboxBgYGBgYGBgYG
+ BgYFBgMADUJCQkJFQkdCQkVCR0JCQkVCQkdCQkdCHAgAAAAAAAMNHUMDAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAADVj5/f39/f39/fz7RwAbHR0dHUJDQgMAscXFxb3Ky+LZ49rZ2dnZ2dnBwcG1tbW1tba2tj8G
+ BgMGAwUGBgYGCSYmBQAGQ0JDQkdCQkJCR0JCQkJCR0JCR0JCQkJCRyobAwEBAAAAAwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAb7/fVb9f39/f39/fz8KgYdHR0dQkNCAAK2xcXFxbq6urq6ur3EwNnZvNnBwLW1
+ tbW1tLS0nQYGBgYGBgYGKGt+FgYDAANFQkVCQkJCQ0JDQkdCQ0JCQkVCQkdCQkJCR0JCHQ0DAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAHf3uAAADW/39/f39/fz2AxwdHR1DQkIAAcXFusW6usW6ura6tra2
+ tra5ubu8tbW1tba2uba2EwYGBgcma7a2MgYGBgYAAEJCQkJCR0JFQkJCRUJCRUJCR0JCQkJCQkdCQkJH
+ QkIcBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY/R0AAAAb/f39/f39/fwdGh0dH0NCKgAPxcXFxcW6
+ urq6ura2tra1tbW1tbW1tbW1tbW2tLY/DDFrtcW6lxQGBgYGBg8AHUJHQkJCQkNFQ0JHQkJHQkJCQkcq
+ R0VCQkJHKkdCQkdCDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8RwAAAB/9/f39/f39/FgLHR1CQ0Id
+ ABbFxcXFusW6urq6urq2tra2tbW1tbW1tbW2tra2ura6urq6uj8GBgYGBgZpNgAaQkNCQkJHQkJCQkNC
+ QkNCQkdCQkJHQkJHQkVCQkJCRUIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCAQML+f39/f39/f39
+ WBgdH0JCQhsANsXFxcXFurq6urq2trS2tba1tbW1tbW1tbW0trW6trq6urppBQMGBgYGFsVrAAhCQkJD
+ QkNCQkNCQkNCQkJCQkdCQkJCQkJCQkJHQkJCQkIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPz9
+ /f39/f39/f1JGipCQ0JFDQBpxcXFxbrFxbq6trq6trq1tra1tbW1tbW2tLa2tra6tra6xbUHBgYGBgm1
+ xbYBA0JDRUNCQkNFQkJCQkNFQ0NFQkJFQkdCQkJHQkJCRUJHQhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAACFz8/f39/f39/QkdQ0NCQkMGALHFxcXFxbq6urq6ura2trW2tbW1tbW1tbW1tLa2trq6urq6
+ um8GBgYGP8XGxQ8AHUJCQ0IfGhgdQkVEQkJCQkJCQkJCQkdCQkJHQkJCQkIdGQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAQvv/P39/f3vGEJCQ0JDQgAFxcXFxcW6xbq6ura6trq2trW2tLW1tbW1trW5
+ tra2ura6urq6xT8GBhbFxcbGNgAYRUNCQwYAAAADG0JHRUNCQ0dCR0JCRypCQkdCQkdCGAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAEN8v39+QtCQkJDQkIcACXGxcXFxcW6xbq6urq2urW2tba1
+ tbW1tbW1tba1tra6urq6urrFujcLtcXFxcV+AANDQkUdAAAAAAAABh1CQkJCQkJCQkJCR0JCQkJCQkMZ
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKh0GAAAAAAAAAAAAGe4LHUNCQkVDQxQAa8XFxcXFusW6xbq2
+ trq6tra0trW1tbW1tbW2tra2ura6urq6xbrFxbXFxcfFx8UFAB1DQx4AABFdDgAAAB1CRUJDRUJCR0JC
+ QkVCR0JCRxsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1DQkIYAQAAAAAAAAAAAQMdQkNCQ0JCAwG2xcXF
+ xcXFurq6urq6urS2tba1tbW1tbW1tba1tra2ura6usW6xcXFxcXFxcXGxTEAC0JDRQ0AAF2PLAAAABtD
+ QkJHQkJFQkJHQkJCQkJDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAYqQkJCQkIdAwAAAAAAAAAAAAAGHUNC
+ Qh0AJcXGxcXFusXFxbq6trq2ura2tra1tbW1tbW2tba2trq2urq6urq6xcXFxcfFx8XGfQEDQkJCQgMA
+ BI+PYwQAAB1DQkNCQkJCR0JCRypHQkJCAQAAAAAAAAAAAAAAAAAAAAAAAAMcQkJDQkdCRUJCDQAAAAAA
+ AAAAAAAACB1ECABvxsXFxcXFxbq6urq6ura2trS2tbW1tbW1tbW1trW2trq6urq6xcXFxcXFxcXFxsbL
+ BQAbRUNCGwAAY4+PYwQAAEJDQkJHQkJCQkJCR0JCQkIGAAAAAAEAAwsbCAAAAQAAAAAAG0JDQkJCQkJC
+ QkJHHAMAAAAAAAAAAAAAAQ0CBcXFxsXFxcW6xcW6ura6ura2urW6tbW1tbW1tba2tra2ura6urq6usXF
+ xcXFxcbF6O1TAAZCQkMfAAAtj5CPXgAABkJFQkNCQkJHQkJCQkJCRxABAQEDCBwqR0JCQhwYCAsbKgYB
+ HUNDQkNCR0JHQkJCKgsBAAAAAAAAAAAAAAA5xcXFxcXFxcW6urq6urq2tra1tbW1tbW1tbW1trW2tra6
+ urq6usXFxcXFxcXFy+zs7d0DAB1CQ0MEACOPj5CPIwAAHUJCQkdFQkJFQkJHQkJCHAMLHUJCR0JCR0JC
+ QkJHQkJCQwYAHUNCRUJCRUJCR0JCQhsDAAAAAAAAAAAABMPHxcbFxcXFusXFurq2ura2ura6tba1tbW1
+ tbW2tba2trq2urq6urq6xcXFzOvs7e3s7TUABkJCQgYAEY+Qj4+MBAADQkVCQkJCQkdCQkVCQkdCQkJC
+ QkJCQkJHKkJCR0JCQkdCHQEDQkJCQ0JCQkdCQkVHQh8IAQAAAAAAAAA97OnFxsXFxcXFurq6urq6ura2
+ tbS1tbW1tbW1tba1tra2trq6urrFxcXFxeLr7Ors7O3t2wAAHUVDAwAjj4+Qj4xdAAAcR0JCR0JCQkdC
+ QkJCRUJCR0JFQkdCQkJHQkJCQkVCR0JDGAADQkJCR0JCQkJCQkNFQkIbAQAAAAAABerr7OnKxcXFxbrF
+ urq6trq2urW6ubW1tbW1tbW1trW6tbq2urq6urq6xcvo6urs7Ozs7O3tMwAGQkIAACyPkZGPj4wEAAhC
+ Q0JCQkVCQkJCR0JHQkJCRUJCQkJCRUJCQkdCQkJCQkVCBAALQkNCQkNCQkVHQkJCR0IfCAAAAACE6+vr
+ 6+vLxcXFxbrFurq6urq0trW2tbW1tbW1tbW2tba2tra6urq6usXi6urr7Ors7Ozs7e3bAgAbHQAAXpCR
+ kZCPjyMAAUJDQkJCR0JCQkJCQkJCQkJCR0JHQkJHQkJDQkJCR0JCQkIdAAAaQ0JCQkdCQkJCQkJCQkJD
+ GwMAFuzs6+vr6uvoxbrFurq6ura6trq2tba1tbW1tbW1tba1urS6trq6urrL6Orq6+vq7Ort7O3t7e00
+ AAMZAACMj5GRkZGPXgAAHUJCQkdCRUJHQkdCRUJHQkdCQkJCQkJCQkcqR0JCQkJHQkIIAAEdRUNCRUNC
+ QkdCRUNDRUMeAQLW6+vr6+vr6OnoyrrFurq6trq0urW0trW1tbW1tbW1tbS0tra2urq94ujo6Ovq6uvr
+ 7Ors7IYzFxYAAAAABI+RkZGRkZCPAAAYQkZCQkJCRUJCQkJCRUJCRUJCR0JCR0JCQkJHQkdCQkVCQh8A
+ AANCQkNCQkNCQkJCQkNCQgYBQezs7Ovr6uvr6Ojoy8W6urq2ura6trq1trW1tbW1tbW1urW6tLq6xOjo
+ 6Ojo6urr6+rs7Ow9AAAAAAAAAAAgj5GRkZGRkZEOAAhFQ0JCQkdCQkdCQkdCQkJCQkJFQkJDQkJCR0VC
+ QkVCQkJHQhgAAAtCQkNCQ0VCR0JDQkUNABbr7Ovr6+vp6+jo6Ojj4sW6urq6urW2tbW1tbW1srW1tbS1
+ trS6vdnj2ePj6Ojo6Ovq6+rs6wAADhEREQQAACyQkZGRkZGRjxEABkJCR0JCQkJCQkVCQkJHRUJHQkJH
+ KkJHQkJCQkJCQkdCQkJCQgMAABxDQkJDQkJDQkNDHAAF3ezt6+vr6+vq6ejo6Ojo4r26urW6tbq1trW1
+ tbWzs7W0tbW0udni6OPo6Ojo6Orq6uvr6+vsAQAAI4yPkGUsLY+RkZGRkZGRLAAGQ0JCQkJHQkJCR0JC
+ R0JCQkJCQkJCR0JCQkJFQkdCQkVCQkJHGwAAAx5CQ0JCQkNCRx0AAa7r7Ovr6+vr6+nq6Ojo5uLj4sS6
+ urq0trW1tbW1tbKdtbW0tMLZ2dnZ4uLj4+jo6Ojr6urr6uyGAAAABGWPkI+Pj5GRkZGRkY8sAABCR0JF
+ QkJHQkNCQkJCQkJHQkJHQkJHRUJHQkdCQkJCQkdCQkJFBgAACEVDQ0JFQ0odAwGG7e3t6+zr6+vq6Ojo
+ 6Ojo4+bj4sS6tra2urW1tbW1tbW1tbvZ2dnZ2ePj4+Po4+Po6Ojr6+vr6+zbMwAADoyPj4yPj5GQj5GR
+ kSwAAEJDQkJDQkVCQkVCQkdCR0JFQ0JCQ0JCQkJCQkJCQkdCR0JCQ0IdAAAAG0JCQkRJHQMAQezs6+vr
+ 6+vo6unp6Ojm4+Lo4uLi2eK9trS1tbW1tbW1tbW9wbzE2dnZ2eLj4uPo6Ojq6ujq6uvr6+zspQAALIyQ
+ jI+QkZCRkZGQLAADRUNCQkNCQ0JCR0JFQkJCQkJCQ0VCQkdCQ0JCR0JCQkJCQ0JFQ0IGAAADQkNHTB0D
+ AD3s7Ozt6+vr6+vr6+jo6Ojm6OLo4uLi2dnAtrW1tbW1srK5wcHZ2dnZ2dnZ6Nno6Obj6Ojp6+vr6+vs
+ 6+zsFwADj4+PjI+QkY+RkZARAAZCQ0JDQkNCQkNCQkJDQ0JDQ0JFQkJDQkJCQkNFQkNFQkJFQkJDQh0A
+ AAAYSUkdAAE87Ozs6+zr6+vr6+no6Ojo6Oji6OLi4tnE2cHBurW1tbW1vrzAwcHB18TZ2eLZ4+Lj4+jj
+ 4+jo6urq6+rs7OyoAABej4+MjI+Rj5GRjxEABkVCQ0NCQkJFQ0JDQkJCQkJCQkdCQkNCRUNCQkNCQkdC
+ QkdCQkJCQgYAAABCGwAAce3s7OzssNbq6+ro6Ojo6Oji6OPi4uLi4tnZxMTBubW1tbK8wcHBwdnB2dnZ
+ 2eLj2eji6Ojo6Orr6+vq7Ozq7O0FACKQkI+Mj42NkZGMAAAYQkJCQ0VDQ0JCQ0JCQ0VDQkNCQ0JCQ0JC
+ Q0JDQkNCQ0JCQ0JDQkJHKgAAAAEAAIbs7Ozs7OvWqaWp1djo6Ojo6OPj4uPi4tnZ2cPEwcHAu7W1sry8
+ vMHBwcTE2dnZ2eLi4+Pj6OPo6Orq6tqoQTMXDwAAAGWPkIyMj5CMkWUAAAAGHUVCQ0JCQ0JCQ0JDQkJF
+ Q0JDQkJFQ0JCQ0JCQkNCQkNCQkJKSUlJBgAAAAR/5ezs7Ozr7NaoqaWoqKWprbDV2tra4uLi4sTZ2cTB
+ wLy3nm9wvL7AwcHX19nZ2dnZ2ejj4uPj6Ojq1kEFAAAAAAAAAAAAIo2MkY+Pj4+PZSMAAAAAAxtCRUNC
+ Q0RCRUNCQ0JDQkJDRUJDQkNCRUNFQ0NFQ0VHTEhMSUcIAAAVtsbG6+vs5+zr2KipqZ+pk6iTqJOTk5OT
+ k5Ofn56eknh2cnJWh/W7vLy8wcG819fE2dni4uLj4+Pj1SYAAAAAAAADBgwNDAwNYoyMjIyPj4+Pj4ws
+ BAAAAAMYQkVFQkJDQkJDQkJDQkJDQ0JDQkNCQ0JCQkdHSUlJTEkcAwABNsbHxsbM7Otb8aeqpZ+on5+o
+ k5+Tk5OTk5KTknd3dnZ6c1am9fv9/by8vsHBxNfZxNnZ2dni4+Lj40EAAAAABw0cHh4cHhweHB4dNGSN
+ kJCPj4+Pj4+PXQQAAAAAGB9CRkJCRUJDQkJDQkNCQ0VDRUNCREdHSUxMTEkdBgAAD3/HxsbGxsbN7Kf9
+ /fz29e6HV4SEhIalpXOThHOEhFNVpvL2/P39/f39u7y8vLy8xLzXxNnZ2eLZ49omAAAADRwdHR4cHhwe
+ HR4dHR4cHSqMj5CQj4+Mj4+QkF0RAAAAAAYYGx0fRUVEQ0NFQkVCQkJHR0lLTExMSUkdBgAAATnFx8bG
+ xsbGxsXlr/r9/f39/f39/Pv5+fb29vb2+fn7/P39/f39/f39/f28u7zAwMHEwcTZxNnZ2eLiMgAAAxwd
+ HR4cHh0dHh0eHB4dHR0eHJGMjIyQkJCPj4yPkI9jIAAAAAAAAAAAAAAEBgYGBgYGBgYGGR5JSEQbAwAA
+ ASe2xsbGx8fGxsXGxszb9v39/f39/f39/f39/f39/f39/f39/f1b+/39/f39/Le8u7y8vMHBwdnX2dnZ
+ 4noAAAcdHR4dHR4dHR4dHR4cHh0eHhwZYJGRj4yMj5GRkY+Pj5CQZSwRAAAAAAAAAAAAAAAAAAAAAAAA
+ AAADAQAAASWbx8bHx8fGxsbGxsbGxb3y/f39/f39/f39/f39/f39/f39/f399gBY/f39/f39u7u8vMDA
+ vMTBxMTE2dnZBQABHR0eHR0fHx8fQx9DHx8eHR0dHRwNLo6RkY+MjIyQkZGQjIyMkI+PjGJfLSwsLCwi
+ ICAhIiwsIAAAAAAAAAAFMZvHx8fGxsXHxsbGxsXGxe79/f39/ftM9v39/f39/f39/f39/fwbAAPy/f39
+ /f24u7u8vLzAwcHB2dfE2XcAABseHR0fH0MfQ0MfH0MfQx9CHx4dHhwNFGCRkZGQkIyMjJGRkZCOjY2Q
+ kI+Qj5CQkI+QkI+Pj5CQLxwNDAMBAAAAAA85usfGx8bFxsXGxcbFWv39/f39+QAd/P39/f39/f39/fxY
+ AAAAAAv9/f39/be4u7y7wLzAwcHZxNnZOwAEPh0dH0MfH0MfHx9DH0MfQx9CHx8eHRwcDRhgjpGRkJCN
+ jIyQkZGRkZGOkY2NjIyMkIyMj4+Pj49hHR0dHB0NBwAAAAABNsXGxcbGxsXGxcZa/f39/f1MAAADQu72
+ /f39/fxNAANY/P35+/39/f38t7u3vLy8wMG8xMHEwdkWABCGHh9CH0MfH0MfQx9DH0JCQkJCH0IfHR4c
+ HA0YLmORkZGRkZGRkZGRkZGRkZGRkJCQkJCRkY6QZCQcHh4dHh0dHg0GAAAAAmbGxsbFxsXFxYX9/f39
+ +wAATlgbAAAAHVv28kxb/P39/f39/f39/f23t7u7u7y8vMC8wcHZxBYADNNLQh9DH0JDH0JDHx9DHx9D
+ H0MfQx9CHx4cHBwNDRgrYGWRjpGRkZGRkY6RjZCNjY2NjWViMBINHB0eHRweHR4cHh0cBwAAABW6xcXG
+ xcbFhfz9/f399vz9/f399u4dAAAAHVj2/P37WP39/f39/Le3u7e7vLzAwMDBw8PXFQAGq9RGQx9DHx9E
+ H0JCQx9DHx9DH0JDH0MfQh4eHRwcHBkNDQwkKzAwYmRkZGRkYTAwKyQZDQ0bHBwcHR0eHR0dHh0eHB4d
+ GwMAAAWxxcXFxcWE/P39/f39/f39/ftMA0z8+e9HBgAAGAAA+f39/f39ore3uLu8u7y8wMDBwdkmAANL
+ 4dRPH0IfQh9DHx9CH0JEH0MfQh8fQkJCH0MfHhwdHBwcHBwcDRsNGQ0NDRkNHBwcHBwcHRweHR0eHR4d
+ Hh0dHR0dHh0dHgcAAAK1xcXFxYX8/f39/f31TO5MAAbu/P35/P39+/JCABj9/f39/fy3t7e3u7u8vMC8
+ wMHBwUAAABxP4eSrS0MfQx8fRB9DHx9CQkJCQkMfH0MfQx9DHx4eHh0cHBwcHBwcHBwcHBwcHBweHB4e
+ Hx9DH0IfQx9DHx8eHh0dHh0dHg0AABPFxcXFhPz9/f39/VsAAAPy/fzuBwAABlj9/f1CAPz9/f39/aKi
+ t7e7t7u8vMC8wMHEvAIAAx5Gq+Tkq1AfQkMfQh9CQh9CH0JCH0MfQx9CH0MfQx8fHx8eHR4cHhweHR4e
+ Hh0fH0MfQx9CH0MfREIfQx8fRB9DHx8dHR4dHQ0AADnFxcWF/P39/f39/QAA+/39CAALEB0bC/n9/f37
+ /f39/f38t7e3t7u4u7u7vMC8wMHBcAAABh1CS6vk5OGJS0IfQkIfRB9DH0JCH0MfQx9DH0IfWfgfQkJC
+ Qh9CQx9DHx9DQx9DH0IfQx9DHx8fH0MfQkQfH0MfQx8dHR4dHQYABLbFxYX8/f39/f39HVv9/f1F7vj5
+ 9fn5WP39/f39/f39/f2ioreit7e7vLu8vMDAwMHEMgAAARkfQkqE1OTk1INFQkJCH0JDH0MfQh9DH0Mf
+ Qx/w/fIfHx9DH0NCSVhDH0MfHx9DH0MfQh9DH0RDH0QfHx9DH0MfH0QfHR0dHAAAacXFVfz9/f39/f39
+ /f39/FvuHEcLGO4d/f39/f39/f39/J2it7e7t7e3u7y7vMDAwMHBQAAAAAAYHUJCS4ng5OGGRx9DHx9D
+ QkJCH0IfQh9DTP39/e5EH0MfH0z8/EMfH0MfQx9CH0JDH0MfHx8fH0MfQ0IfQh9DHx8eHh0dAQAnxbZV
+ /f39/f39/f39/f32Wx0AAAAATPX8/f39/f39/f39op2ioqK4t7u7u7y8wLzAwcTBoxUAAAAABhsfH0NS
+ 0OTkUkJCQx8fH0MfQx9DH0NE+PX4/fZJRFn2/f36H0JDH0MfQx9DQkIfQkMfREJEH0MfH0QfQx9DH0Qd
+ HR0QABW2xVv9/f39/f39/f39/fz5GAD2+wsAR0Lu/f39/f39/fydoqKitbe3u7e7u7u8wLzAwMHB154m
+ AAAAAAALHB9CT9Lkqx8fQx9DH0JCQkIfH0MfH0JO/Pz8/fr4/P1JH0IfQx9CH0IfH0MfH0IfHx8fQh9D
+ H0MfQx8fH0IdPhYAFcW2W/39/f39/f39/f35QhoAAPn8AAAGABj9/f39/f39/aKdoqKit7e3t7u7u7y7
+ wMDBwcHEwcGbOAUAAAAAAxsfH4bkq0IfQkJDH0lJSUlDTvBZ8vz9+/31Hx9DTh8fQx9CH0JCQkNDH0Mf
+ RB9DQkRCQkIfQh9CH0QfHzTOBQAlurfv/f39/f39/f39/e4AHVgLC1sd9/1M7v39/f39/f38m6KdoqKi
+ t7e3u7i7vLy8vMDAwMDBurW6tn4xAgAAAAMcQk/kgkMfH0NJSUlOSUn5/f388kwfWf37TR9CQkJCQx9D
+ H0MfHx9DH0IfQh8fHx9CH0IfQx9DH0SG3lAAADm6oPP9/f39/f39/f39/Ab7/f1bAPn9/fn5/f39/f39
+ /f2dnaKdoqK3t7e3ubu7u7y9vMDAwb21trW1trq1ZxMAAAAIQlLgQh9DRElMTExMSfD99UMfQkJCSfr9
+ /fAfQh9CH0MfQh9DHx9DH0JCQkJCQkJCH0NGUIOr4eSDGQAAbLqf9v39/f39/f39/f399f39/VsAWPmI
+ Rxr8/f39/f38/J2bnaKinZ2it7e3t7u7u7y+vsC9tbW1tra1tbq1umcFAAADH86BQh9JTElMSUxMWflJ
+ H0IfQkIfHvz9XEIfQx9CQkJCQh9DH0IfQk+ChorPz9Lk5OTk5N+KSx0AAAW6uqX5/f39/f39/f39/f1H
+ G0IYAAAAAAAAAPL9/f39/f39m6KdnZ2iore3t7e3ubu7vLu8vLWzs7W1tba2trq2urUlAAALT6xCQklJ
+ TE1JTExMSUxJXO5YQx9C9vwfQx9DH0MfQx8fREJCUazk5OTk5NTQzqyGhlBLQkMcAwAAfrq2hfz9/f39
+ /f39/f39/QAAAAAAAAAAAAAAHf39/f39/fybm52dop2iop23t7e3t7u7vLy1nbW1tbW1trW1tra2trYl
+ AAAd30dCTExJTExMSUxMTPL9/f38W0MfQ0JCQh9DH0IfH0MfS9Lk36iCT0JCQkJCH0JCQx0bBgAAAD+2
+ trZa/f39/f39/f39/f35AAAAAAAAAAAAAAAA/f39/f39/ZebnZ2dnZ2iore3t7e3u7u7tbW1tbW1tbW1
+ tra1tba2trUCAAuGg0JMTExMSUxMTO77/P3y+f1YHx9CH0IfQkIfQx9DH0/k0lBCQkIfHRwZGBgMBgYA
+ AAAAAAJourq2tfL9/f39/f39/f39/fYAAAAAAAAAAAAAAEL9/f39/f38nZebm52dop2dop23t7e3u7ey
+ srW1tbW1tbW1tba2tra2tjEAAEfUQklJTExMTElZ+05Y+fv9+vz2H0MfQx9DH0NCQh9P4YNDHRkHAAAA
+ AAAAAAAAAAAAAAU4tbq2trae9v39/f39/f39/f39/QMAAAAAAAAAAAAG+f39/f39/fyXm5ugm52doqKd
+ t7e3t7m3srKysrWytbW1tbW1tbW2tbq1fAAAG85PSExMSUxMTPb1SUz2/fYeH/VZQ0IfQkJDHx8fQ9RS
+ HQsAAAAAAAAAAAAAFhUlOGeXtrq2tra2toT8/f39/f39/f39/f39+xgAAAAAAAAGWP39/f39/f38/Zeb
+ m5uXnZudnaKdnZ23t52cnLKcmrW1tbW1tbW1trW2tba2BQAFgahITExMTExJ/fz2/P39/VtC9fNCH0Mf
+ Qh9CQkKKhh0AAAAAEzx1n7ji4uLivbq6ura6tra6tba2pv39/f39/f39/f39/f39/fny7u7u+P39/f39
+ /f39/f38l5eXm6CdoJ2dnaKit7ednJyynLK1srKztbW1tbW1tbW2tbY5AAAe30dMSUxJTFj9/f39/f39
+ /fb98h9DH0MfQx9DUs4dAAAAO7zi4uLi4sviy+LEtra2ura2tra2tp/2/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39+/aXl5ebl5ubnZudnZ2dnZyampqcsrKysrKysrW1tbO1tbW1tpsAAA2KgkxMTExJ
+ XP39/f39/f39/f3zQx9CH0JCH0rfRgMABJ/i4uLL4uLi4uLZ2dm5urq1ura2trW1pv39/f39/f39/f39
+ /f39/f39/f39/f39/f38+vbzp4Rzl5SXl5eXm52bop2dnZ2cmpycnJycnLKysrK1srK0s7O1tbW1thUA
+ A0vfR0xMTExO/f39/f39/f39/fAfRB9DHx9E1E8KAAB14uLL4uLiy9nZxMTE2bq6tba2tbW1tqCk8vX2
+ 9/n7+/z7/Pz8/Pv7+/v5+fb19fGkhHeSl5eXl5WXl5eXl5ebm5uXnZ2dnZmZmpqampyympyysrKys521
+ tbW1tbW1ZwAAHM6FSUxMTEn5/f39/f39/f39TEMfQ0IfQ4mJGwAAMuLE4uLZxNnZy8TE2cTLvba2urW2
+ tra1tbW1tbWgoJ6enp6Sn5KSnp6enpeel5mZnZ2bm52bl5eXl5SUl5eXl5eXm5udm52ZmZqZmZycmpqy
+ srKysrWytbW1tbW1tbW1BAAGUN9JSUlMTE77/f39/f39/fIfQh8fQx+C0h0AAA/B2cTZxMTExMPZw8TD
+ w8PAtbW2trW1tbWztLW1tbKytZy1srKaspyanJqZnJmZmZmbnZubl5eXlZSUl26XbpeXl5ebm5edmZaZ
+ mZmcmZqanJqanJycspyasrWzs7W1tbM2AAAdzolMTExMTEnw+Pv9/flcH0NCH0MfT99FAwACo9nExMTD
+ xNnExMPDw8PDwdm2trW1tbW1s7Ozs7WytbWatbKcmrKampqamZyZmZmZmZabl5uXl5WXl5eUlJeXl5eX
+ l5eXnZaYmZmYmZmamZyanJydsrK1srW1srKys7W1tZsAAAZL5E9MSUlMTExMSUlEH0MfHx9DH0/fTwgA
+ AHDExNnExNnDw8PDw8PDw8PDwrW1tbW1tbW1tZ2ysrWcsrWymrKynJycmpqamZmZmZiWmZaZl5eVl5SU
+ lJSUbm6XbpeXl5eXlZiYmJmZmZmZmpmampqampqcsrKasrOys7K1tTYAAB2G30tMTExMSUxMRB9DH0JC
+ Qx9P4VEYAAAyw8PDw8PDwsPDw8HBw8LDwr6+vbW1tLW1tbW1tbWynLWyspqynJqampqdmZmZmZmZmZmV
+ lZeXlZeUl5SUfHyUl5SXl5eXl5WVlZaYmJmYmZmZmpqampycsrKasrK1nbKysrO1mAEABkLS1EtJTElM
+ TElCQx9CHx9CUuSCGwAAD7zDw8PDw8PDwcLCw8LAwMC+wr67tbSys7KztbWysrWyspqaspyanJqZmpmZ
+ mZmZmZWYlZWVlZeXlJeUlHyUbpRulJSUl5eUlZWVlZaWlZmZmZmZmZqampqamrKasrKytbObtZq1NgAA
+ GEbU4VJESUlHQh8fQkJCSorhUh0AAAG4wcPBwsLCv8LCwMDCvsC+vr68vb61nbWys7KymrWymrKasrKa
+ mpqampqZmZmZmZWYmZWVlZWUlZSXlJR8lG5ubpSUl26XlJWUlZWVlZiZlpaZlpmZmZqZmpqamrKcmpqy
+ srKytbW1DwAAHUbO5NKCRh8fQkIfS4ng1E8dAAACoMDCwsLAwL7CvsDAvr6+vb6+vL28u7W1tbWdsrKy
+ spyymrKcmpyampmamZmZmZmWmZaVlZWVlZWUlZR8lJRtfG1ufHyUlJSUlJWVlJWVlZWYmZmZmZmZmZqa
+ mpqampqysrKaspyymrV8AgAAHUKC3+Tk1M/Pz9/k4YZDGwAAAIDAvr6+vr6+vr6+vry9vry8vbu9u72+
+ tbK1srKysrKyspyympqamZqampmZmZmZlpmYlZWVlZWVlJR8lJR8fHxtbW1tbnyUlJSUlJSVlZWVlZWV
+ mJiZmZmZmZmZmpqampqamrKcsrKysrJoAAAAG0JCUorP3+DSrIJGHwsAAAF4vr6+vr6+vr6+vr28vby7
+ vbu7u7u7u7e3srKysrKcnJqampqampqamZmZmZmZmZWYlZWVlZWVlJSUlJR8fHxtbW0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
+ AABAAAAAgAAAAAEAIAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32e/wh+oP8If6L/CICk/wmC
+ pv8Jgqj/CoSq/wqErP8Lhq7/C4ex/wuIs/8MirT/DIq2/wyLuP8Njbr/DY68/w6Pvf8OkL//DpDA/w6R
+ wv8PksP/D5LE/w+Sxf8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCWyf8Qlsn/EJXJ/xCVyf8Qlsn/EJbJ/xCV
+ yP8QlMj/EJXH/w+Ux/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkL//Do++/w2OvP8Njbv/DYy5/wyL
+ t/8MirX/C4mz/wuIsf8Lhq//CoSt/wqEq/8Jg6n/CYKn/wmBpf8If6L/CH6g/wd9nv8He5z/B32e/wh+
+ oP8If6L/CICk/wmCpv8Jg6n/CoSr/wqErf8Lhq//C4ix/wyJtP8Mirb/DIu4/w2Nuv8Njrz/Do+9/w6Q
+ v/8OkcH/D5LC/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJbJ/xCWyv8Ql8v/EJfL/xCXzP8Ql8z/EJfM/xGX
+ zP8Rl8z/EJfM/xCXzP8Qlsz/EJbL/xCWy/8Qlsr/EJXJ/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6R
+ wf8OkMD/Do++/w2OvP8Njbr/DIu4/wyKtv8MirT/C4iy/wuHsP8Kha7/CoWs/wqEqf8Jgqf/CYGl/wiA
+ o/8IfqD/B32e/wh+oP8If6L/CYGk/wmCp/8Jg6n/CoSr/wqGrv8Lh7D/C4iy/wyKtP8Mi7f/DYy5/w2N
+ u/8Njr3/DpC//w6Rwf8PksL/D5LE/w+Uxv8PlMf/EJXI/xCWyv8Ql8v/EJfM/xGYzf8Rl83/EZjO/xGZ
+ z/8Rmc//EZnP/xGZ0P8RmdD/EZnQ/xGZ0P8RmtD/EZnP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCV
+ yv8Qlsn/EJXH/w+Uxv8Pk8X/D5LD/w6Rwf8OkL//Do+9/w2Ou/8Njbn/DIu3/wyKtf8LiLP/C4ex/wqG
+ rv8KhKz/CoSq/wmCp/8JgaX/CICj/wh+oP8If6L/CICk/wmCp/8Jg6n/CoSr/wqFrv8Lh7D/C4iz/wyK
+ tf8Mi7f/DY26/w2OvP8Oj77/DpDA/w6Rwv8PksT/D5TG/w+Ux/8Qlsn/EJbK/xCXzP8Rl83/EZjO/xGY
+ z/8RmdD/EZnR/xGa0f8SmtL/EprS/xKa0/8Sm9P/EpvT/xKb0/8Sm9P/EprT/xKa0/8SmtL/EpvS/xGZ
+ 0f8RmdD/EZnP/xGYzv8Rl83/EJbM/xCXy/8Qlcn/EJXI/w+Uxv8PksT/D5LD/w6Rwf8OkL//DY68/w2N
+ uv8Mi7j/DIq2/wyJs/8Lh7H/C4av/wqErP8Kg6r/CYKn/wmApf8IgKP/CICk/wmCpv8Jg6n/CoSr/wqF
+ rv8Lh7D/C4iz/wyKtf8Mi7j/DY26/w2OvP8OkL//DpHB/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/xGX
+ zf8RmM//EZnQ/xGa0f8SmtL/EpvT/xKb1P8SnNX/EpzV/xKc1v8Sndb/E53W/xOd1/8Tndf/E57X/xKd
+ 1v8SnNb/Ep3W/xKc1f8SnNT/EpvT/xKa0/8SmtH/EZnQ/xGYz/8RmM7/EJfM/xCWy/8Qlsn/EJXH/w+U
+ xv8PksT/DpHC/w6Qv/8Njr3/DY27/w2Muf8Mirb/DIm0/wuIsf8Lhq//CoSs/wqEqv8Jgqf/CYGl/wmC
+ pv8Jg6n/CoWr/wqFrv8Lh7D/C4mz/wyKtv8Mi7j/DY27/w2Ovf8OkL//DpHC/w+SxP8PlMb/EJXI/xCV
+ yv8Ql8z/EZfN/xGYz/8RmdD/EprS/xKb0/8SnNT/EpzV/xKd1v8Tndf/E57Y/xOe2f8Tntn/E57Z/xOf
+ 2v8Tn9r/E5/a/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb0/8SmtL/EZnR/xGZ
+ z/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Txf8PksP/DpDA/w6Pvv8Njrv/DYy5/wyKtv8MibT/C4ix/wuG
+ r/8KhKz/CoOp/wmBp/8Jgqj/CoWr/wqGrv8Lh7D/C4iz/wyKtv8MjLj/DY27/w6Pvf8OkMD/D5LC/w+T
+ xf8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGZ0P8SmtL/EpvT/xKc1f8Sndb/E53X/xOe2f8Tn9r/E5/a/xOg
+ 2/8UoNz/FKDc/xSh3f8Uot7/FKLf/xSi3/8Uod3/FKDc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzV/xKb1P8SmtL/EZnR/xGYz/8Rl83/EJbL/xCVyf8Qlcf/D5PF/w+Sw/8OkcH/Do++/w2O
+ vP8NjLn/DIq2/wyJtP8Lh7H/C4au/wqErP8Jg6n/CoSq/wqErf8Lh7D/C4iz/wyKtf8Mi7j/DY27/w6P
+ vv8OkMD/D5LD/w+Txf8PlMf/EJbK/xCXzP8RmM7/EZnQ/xKa0f8Sm9P/EpzV/xOd1v8Tntj/E57Z/xOf
+ 2v8UoNz/DHKd/wAJDf8AAwT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAEB/wAF
+ Bv8ISmb/FKLe/xSg3P8Tn9v/E5/a/xOe2P8Tndf/EpzV/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJbK/xCV
+ yP8PlMb/D5LD/w6Rwf8OkL7/DY68/w2Muf8Mirb/DImz/wuHsf8Kha7/CoSr/wqErP8Lhq//C4iy/wyK
+ tf8Mi7j/DY27/w6Pvf8OkMD/D5LD/w+Txf8Qlcj/EJbK/xCXzP8RmM7/EZnQ/xKa0v8SnNT/EpzW/xOe
+ 2P8Tntn/E57a/wY5Tv8AAQH/AAAA/wAAAP8AAAD/BgYG/wgICP86Ojr/cXFx/46Ojv+VlZX/kJCQ/4WF
+ hf9DQ0P/DQ0N/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAgK/xSi3v8ToNv/E5/a/xOe2P8Tndf/EpzV/xKa
+ 0/8RmdH/EZjP/xGYzf8Ql8v/EJXI/w+Uxv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4ew/wqF
+ rf8jkrb/C4iy/wyKtP8Mi7f/DY26/w2Ovf8OkMD/D5LD/w+Txf8QlMj/EJbK/xGYzf8RmM//EZnR/xKa
+ 0/8SnNX/E53X/xOe2f8Tn9r/AAcJ/wAAAP8AAAD/BAQE/0RERP+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ycnP+Li4v/BAQE/wAAAP8AAAD/AAMD/xGQ
+ xf8Tn9v/E57Z/xOe2P8SnNb/EpvU/xKa0v8RmtD/EZfN/xCXy/8Qlsn/D5TG/w+SxP8OkcH/Do++/w2N
+ u/8MjLj/DIq1/wuIsv8Lhq//KZa6/yyZvv8wnML/C4y5/w2Ovf8OkL//D5LC/w+Txf8Qlcj/EJbK/xGX
+ zf8RmM//EZrR/xKb1P8SnNb/E57Y/xOf2v8KW33/AAAA/wAAAP8ODg7/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+cnJz/m5ub/52dnf+enp7/nZ2d/5ubm/+dnZ3/nZ2d/52dnf+UlJT/Xl5e/zEx
+ Mf8WFhb/AAAA/wAAAP8AAAD/AAQF/xSh3f8Tn9r/E57Y/xKd1v8SnNT/EprS/xGZ0P8Rl83/EJbL/xCW
+ yf8PlMb/D5LD/w6QwP8Oj73/DY27/wyLuP8MirX/C4iy/yuYvf8um8D/M57E/zeiyP86pMv/EpPC/w+T
+ xf8Qlcf/EJbK/xGYzf8RmM//EprS/xKb1P8SnNb/E57Y/xOf2v8ACg7/AAAA/wEBAf81NTX/i4uL/52d
+ nf+dnZ3/nZ2d/5ycnP++vr7/yMjI/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8jI
+ yP8EBAT/iIiI/6mpqf+np6f/qKio/6ioqP+oqKj/qKio/6mpqf8HBwf/Ax8s/xOf2/8Tntn/E53X/xKc
+ 1f8SmtL/EZjQ/xGXzf8Qlsv/EJXI/w+Uxv8PksP/DpDA/w2Ovf8Njbr/DIu3/wyJs/8smb//MJ3D/zSf
+ xv85pMr/PKbN/0Gp0P9GrNT/MaTR/xCXzP8RmM//EprR/xKb1P8Sndb/E57Z/xOf2/8ABgf/AAAA/zIy
+ Mv81NTX/NTU1/zU1Nf+cnJz/sLCw/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf9AQED/p6en/6ioqP+oqKj/qKio/6ioqP+oqKj/qamp/0lJSf8TExP/oaGh/wAA
+ AP8ACQz/E6Db/xOe2f8Tndf/EpzV/xKa0v8RmdD/EZfN/xCWyv8Qlcj/D5PF/w6Rwv8Mj7//L57F/y2b
+ wv8pmb//L5vB/zOfxf83osj/O6XM/0Coz/9Dq9L/SK7W/0ux2f9QtNv/Urbd/xOc1P8Sndb/E57Z/xOf
+ 2/8ACg3/AAAA/zU1Nf81NTX/NTU1/zU1Nf84ODj/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/BAQE/6ioqP+oqKj/qKio/6ioqP9fX1//JCQk/yQk
+ JP8kJCT/paWl/wQEBP8rKyv/AAAA/wAHCP8UoNz/E57Z/xOd1/8SnNT/EprS/xGZz/8RmM3/EJbK/zGj
+ zv87p8//OKTM/zOgyP8vnsX/KprB/zGew/81oMf/OaTL/z6nzv9CqtH/Rq3V/0qw2P9PtNv/Urbe/1e5
+ 4P9au+P/X73k/wyc2v8RjsT/AAAA/zU1Nf81NTX/NTU1/zU1Nf9ERET/RUVF/0VFRf9GRkb/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/vLy8/6enp/+oqKj/qKio/5+f
+ n/8kJCT/JCQk/yQkJP8kJCT/JCQk/6enp/8ICAj/RUVF/0NDQ/8AAAD/AAoN/xSg3P8Tntn/E53X/xKb
+ 1P8goNT/SrHa/0au1/9Cq9T/PajR/zmmzv81osr/MZ/H/y2bwv8zn8X/OKLJ/zulzf9AqdD/RKzT/0iu
+ 1v9Nstr/ULTd/1W43/9auuL/Xrzk/2K/5v9lwen/AAAA/ywsLP81NTX/NTU1/zU1Nf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wcH
+ B/+oqKj/qKio/yEhIf8kJCT/JCQk/yQkJP8kJCT/JCQk/xoaGv9ERET/RERE/0VFRf9FRUX/Ojo6/wAA
+ AP8Nb5r/EJ7b/1q65P9VuOL/ULbf/0yz3P9Jsdr/RKzW/0Cr0/87p9D/N6TM/zOhyf8vnsX/NaDH/zmj
+ y/8+qM//QqrS/0at1f9KsNj/ULTc/1S33v9YuuH/XLvj/2C/5v9lwej/UZm5/wEBAf81NTX/NTU1/zU1
+ Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/5CQkP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf8ICAj/qKio/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP+Tk5P/CQkJ/0VF
+ Rf9FRUX/RUVF/0VFRf8GBgb/AAAA/2C/6P9bvOb/V7nj/1O34f9OtN3/SrHb/0eu2P9CrNX/PajS/zml
+ zv81osr/MJ/H/zejyf87pc3/QKnQ/0Or0/9Irtb/TrLa/1G03f9VuOD/Wrvi/1695f9jwej/Z8Lq/wIH
+ Cv8xMTH/NTU1/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9FRUX/RUVF/0VFRf9FRUX/SEhI/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/lZWV/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/p6en/wkJCf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8YMj3/X7/o/1m85f9WuOL/ULbf/0yz
+ 3P9Ir9n/RK3W/0Cr0/86ptD/NqPM/zOhyf85o8r/PajP/0Gq0v9GrdX/SrDY/0+z2/9Ttt7/WLnh/1y8
+ 5P9hv+f/ZcHp/2nD6v8AAAD/NTU1/zU1Nf9ERET/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/SEhI/7CwsP/Jycn/ycnJ/8nJyf/Jycn/y8vL/xoaGv8kJCT/JCQk/ygo
+ KP8oKCj/KSkp/ycnJ/8lJSX/JCQk/4CAgP8/Pz//RUVF/0VFRf9ERET/RUVF/0VFRf8oKCj/AAAA/2DA
+ 6f9cvuf/V7nk/1K34f9OtN7/SrHb/0Wu2P9CrNX/PKjS/zilzv80osr/OaTM/z6o0P9Dq9P/R67W/0yy
+ 2v9QtN3/Vbfg/1q74/9evub/Y8Do/2fC6v9kuN3/AQEB/zU1Nf82Njb/RUVF/0VFRf9FRUX/RUVF/0FB
+ Qf82Njb/NjY2/zY2Nv9ERET/RUVF/0NDQ/82Njb/Pj4+/0VFRf9FRUX/RUVF/0tLS/9dXV3/tra2/8jI
+ yP8GBgb/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+7u7v/ubm5/4CA
+ gP8MDAz/BAQE/wAAAP9iwev/Xr/o/1m85f9WueP/ULbg/0yz3f9HsNn/Q63W/z+q0/85pc//NaPM/zul
+ zf8/qdH/RK3V/0iv2P9Os9v/UrXe/1e54f9cvOT/YL/n/2TB6f9pxOz/GTA5/x0dHf81NTX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf83Nzf/NjY2/zY2Nv82Njb/RUVF/0RERP82Njb/NjY2/zY2Nv9ERET/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv81NTX/AQEB/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u//Ozs7/RERE/0RERP8CAgL/GzdD/1/A6f9bvef/V7rk/1K34f9NtN7/SLHb/0Su
+ 2P9Aq9X/OqbQ/zekzf88ps7/QarS/0Wu1v9LsNn/T7Pc/1S33/9YuuL/Xb7l/xATFP9mwur/asbt/wEG
+ CP81NTX/Ozs7/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/RUVF/0VFRf87Ozv/NjY2/zY2
+ Nv82Njb/PT09/0VFRf82Njb/NjY2/zY2Nv81NTX/Gxsb/zU1Nf9ERET/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8rKyv/Q0ND/zc3N/0RERP9FRUX/NjY2/wIICv9hwer/Xb7o/1e7
+ 5f9TueL/TrXf/0qy3P9Fr9n/QazW/zyo0v84pc7/PafP/0Os0/9Grtf/S7La/1C03f9VuOH/Wrvk/1Ws
+ 0f8QEBD/EA8P/2zG7f8EDRD/NTU1/0VFRf8DAwP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/NTU1/zY2Nv82Njb/NjY2/0FBQf9ERET/NjY2/zU1Nf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP+5ubn/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/z8/P/9DQ0P/Q0ND/ra2t/0RERP9FRUX/RUVF/0VF
+ Rf8AAAD/Y8Lr/16/6f9avOb/Vbrk/1C34f9Ms93/R7Da/0Kt1/89qdP/OKXP/z+o0f9ErtX/R6/Y/02z
+ 2/9Rtt//Vrni/1u85P9fvOT/ERUV/xAQEP8QEBD/AAID/zQ0NP9FRUX/RUVF/0VFRf9FRUX/EBAQ/wAA
+ AP8iIiL/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv9ERET/RUVF/zY2Nv8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8TExP/Pz8//0NDQ/9DQ0P/Q0ND/CAgI/zU1
+ Nf82Njb/Ojo6/0VFRf9FRUX/AAAA/2TC7P9fwOr/W73n/1a65P9RuOL/TLTe/0ex2/9Crdf/PqrU/zmm
+ 0P8/qNH/RKzV/0mw2f9OtNz/UbXe/1e75P9dvef/Yb/n/2XC6/9syPH/HTM8/wAAAP9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/0JCQv81NTX/NjY2/zY2Nv81NTX/RUVF/0RE
+ RP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9DQ0P/Q0ND/0NDQ/9DQ
+ 0P95eXn/CwsL/zU1Nf82Njb/NjY2/zY2Nv9FRUX/RUVF/wAAAP9lw+z/YMHr/1u96P9XuuX/Urji/021
+ 3/9Jstz/Q67Y/z+r1f86p9H/QKrS/0St1v9JsNr/TrTd/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8AAAD/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8AAAD/AAAA/wAA
+ AP8tLS3/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP/R0dH/y8vL/xAQEP8cHBz/3Nzc/83Nzf8ICAj/Kioq/zY2Nv82Njb/PDw8/0VFRf8AAAD/ZcTt/2HB
+ 6/9dv+n/WLvm/1O44/9NtOD/SrPd/0Su2f9Aq9X/O6jS/xCVyP8Qlsv/EZjO/xKa0v8QEhL/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEhL/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/IiIi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/+Dg4P/+/v7//v7+////////////4eHh/ysrK/82Njb/NjY2/z09
+ Pf9FRUX/AAAA/xWl5f8VpOL/FKLf/wyd3P8tqt3/TrTg/0mx3f9Er9n/QKzW/zup0/8Qlcj/EJfM/xGY
+ z/8SmtL/EE9n/xAQEP8QEBD/EBQV/xOHuf8Sa5H/EBAQ/wUFBf8nJyf/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/x8fH/AAAA/wEBAf//////////////
+ ///j4+P/AgIC/zY2Nv9ERET/RUVF/wAAAP8Wpub/FaTj/xSi4P8Uod3/E5/a/xOd1/8Sm9P/EZnQ/xGY
+ zf8MlMn/EJbJ/xCXzP8Rmc//EprT/xKd1v8Sksj/FKHc/xSh3/8QFBX/EBAQ/xAQEP8Vir7/AwMD/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/29vb/wAA
+ AP8QEBD//////////////////////wsLC/82Njb/RUVF/0RERP8ABQb/Fqbm/xWl5P8Vo+H/FKHe/xOf
+ 2v8Tndf/EpvU/xGa0f8RmM3/EJbK/xCVyf8Rl8z/EZnQ/xKb0/8Tndf/E5/a/xSh3f8QEQ7/EBAQ/xAQ
+ EP8QFRX/F6jq/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/6Ojo//////////////////////8NDQ3/RERE/0VFRf9ERET/AAoN/xan
+ 5/8VpeT/FaPh/xSh3v8Tn9v/E57Y/xKc1P8RmdH/EZjO/xCWyv8Qlsn/EZjN/xGZ0P8SnNT/E53X/xOf
+ 2v8Uod3/FKLg/xAPEP8QEBD/Fqfo/xeq7P8AAgP/RERE/0VFRf9FRUX/AAAA/xISEv9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/9vb2///////p6en/RERE/0VF
+ Rf9FRUX/Dw8P/xKRyf8Wp+f/FaXk/xWj4f8Uod7/E5/b/xOe2P8SndX/EZrR/xGYzv8Qlsr/EJXJ/xGX
+ zf8RmdD/EpvU/xOd1/8Tn9r/FKHd/xWj4f8VpOP/FZrV/xao6f8Xquz/BCk6/x4eHv9FRUX/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9FRUX/DAwM/wAAAP8AAAD/AAAA/wAA
+ AP8LCwv/RERE/0VFRf9FRUX/RUVF/wAAAP8WqOn/Fqfn/xWl5P8Vo+H/FKHe/xOg2/8Tntj/EpzV/xGa
+ 0f8RmM7/EJbK/xCVyf8Rl83/EZnQ/xKb1P8Tndf/E5/a/xSh3f8Vo+H/FaXk/xam5v8WqOn/F6rs/xer
+ 8P8AAAD/RUVF/0VFRf8AAAD/KizQ/x8hnf8AAAD/NjY2/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf9FRUX/RUVF/0VF
+ Rf9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/RERE/0VFRf8ACAr/Fqfq/xan5/8VpeT/FaTi/xSh
+ 3v8ToNv/E57Y/xKc1f8RmtH/EZjO/xCXy/8Qlcn/EZjN/xGZ0P8SnNT/E53X/xOf2v8Uod3/FaLg/xWl
+ 5P8Wpub/Fqfp/xeq7P9BuvH/AQQF/0RERP9FRUX/AAAA/wAAAP8sLtb/KSvO/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/xEREf9ERET/MzMz/wAAAP8AAAD/FBQU/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/FaHh/xao
+ 6v8Wp+f/FaXk/xWj4f8Uod7/E6Db/xOe2P8SnNX/EZrR/xGYzv8Qlsr/EJbJ/xGYzf8RmdD/EpvT/xOd
+ 1/8Tn9r/FKHd/xSi4P8VpOP/Fqbm/xKl6P9zzPT/d831/2Glw/8CAgL/RUVF/0VFRf8AAAD/LC7W/yst
+ 0/8BAQj/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8jIyP/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8AAAD/AAAA/wAA
+ AP8AAAD/AAEB/1nB8f8WqOr/Fqfn/xWl5P8VpOH/FKHe/xOf2/8Tntj/EpzU/xGZ0f8RmM7/EJbK/xCW
+ yf8Ql8z/EZnQ/xKa0/8Sndb/E5/a/xSh3f8UouD/FaTj/2bF7v9tyPH/csvz/3bO9f97z/b/AAAA/0VF
+ Rf8iIiL/AAAA/ywu1v8sLtb/KizQ/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsLC/8DAwP/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/wICAv8AAAD/AAAA/2rA5/9tyPP/Z8bx/xan5/8VpeT/FaPh/xSh3v8Tn9v/E53X/xKc
+ 1P8RmdH/EZfN/xCVyv8Qlcj/EJbM/xGZz/8SmtP/EpzW/xOe2f8UoNz/HaXh/2LC7P9nxe7/bMbw/3DK
+ 8/90zPT/ec/2/1SPqv8BAQH/AAAA/wAAAv8sLtb/MDLX/ywu1v8AAAD/ERER/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/zY2
+ Nv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wIJC/9vyvT/bMnz/2bH8f9jxO7/FKTj/xSi
+ 4P8Uod3/E5/a/xOd1/8Sm9T/EZnQ/xGXzf8Qlsr/EJTI/xCWy/8RmM//EprS/xKc1f8Tntn/WLvm/12/
+ 6f9hwev/ZcTu/2rG8P9uyfL/csv0/wAAAP8AAAD/AAAA/wAAAP8qLND/NDbY/zY42f82ONn/Fxh0/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0FBQf8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP9yy/X/bcr0/2rH
+ 8v9lxfD/YcLu/1zA6/9Ruuf/FKHd/xOf2v8Sndb/EpvT/xGZ0P8Rl8z/EJXJ/w+Ux/8Ql8v/EZjO/xKa
+ 0f9Br93/Ubfi/1a75f9avuj/X8Hr/2PD7f9oxu//bMjx/zhkef8AAAD/Ky3V/yst1f8AAAD/KizQ/zY4
+ 2f82ONn/NjjZ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RERE/wIC
+ Av9wxu7/cMv1/2zK9P9nxvH/Y8Xw/17B7f9bv+v/Vbzo/1G55f8Tntn/EpzW/xKa0v8Rmc//EJbM/xCV
+ yP8PlMf/EJXK/xCYzv9Hr9v/S7Pe/1C34f9UuuT/WL3n/12/6v9iwuz/Zsbv/2rH8f9uyvP/AAAA/wAA
+ AP8sLtb/LC7W/yos0P82ONn/MjTX/zY42f8qLND/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/IiIi/0VF
+ Rf9FRUX/Tk5O/wICAv8+boT/c8z2/23J9P9qyfP/ZcXx/2LE7/9dwOz/Wb7q/1S75/9PuOT/S7Xh/xee
+ 1v8SmtL/EZjO/xCWy/8Qlcj/D5TG/zyp0/9BrNb/RK/a/0qy3f9OteD/U7nj/1a85v9bvun/X8Dr/2TE
+ 7v9oxvD/bMjy/3DK9P82YHP/AAAA/yst0v8oKsj/LC7W/ywu1v82ONn/KizQ/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP9FRUX/UVFR/wICAv8bLjb/c833/3DM9f9syfT/Z8by/2PE8P9fwu7/W7/r/1a8
+ 6f9Suub/Tbfj/0q04P9FsN3/QK3Z/xGYzv8Qlsr/D5TH/zalzv87qNL/P6vW/0Ou2f9Isdz/TLTf/1C3
+ 4v9VuuX/WL3o/12/6v9hwu3/ZcTv/2nH8f9tyfL/csz1/wAAAP8rLdP/LC7W/yos0f8zNdf/NjjZ/yUn
+ vP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8/boT/dM33/3HM9v9qxe7/RIyl/2PD
+ 7v9hwu7/XcHt/1m+6v9UvOj/ULnl/0u24v9Is9//Q7Dc/z6s2f87q9b/EJXJ/w+Txv81o83/OKbR/z2p
+ 1P9Crdj/Ra/b/0qy3v9Pt+H/Urnk/1a85/9bvun/X8Hs/2TE7v8AAAD/AAAA/wAAAP8AAAD/AAAA/yos
+ 0P8qLNH/LC7W/ywu1v8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/1FRUf9RUVH/AAAA/wAAAP8Xpun/Ysf2/3LL
+ 9v9ty/X/asjz/0OMpv9BjKX/Pouk/zuIov84hZ//Noag/z2XuP9Cpcz/QarU/z6o0/83ncT/KYOh/yN1
+ jf9DbXj/NKPM/zalz/87qdP/QKzW/0Ov2v9Ist3/TLTg/1C34/9UuuX/Qo2u/wAAAP8AAAD/AAAA/yor
+ Kf85Ojf/OTo3/zk6N/8zNHj/KizO/yst0v8qLM7/LC7W/ywu1v8FBRr/AAAA/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9PT0//UVFR/1FRUf9QUFD/AgIC/wAI
+ C/8ZrvT/GK3z/xit8v9uy/b/19fX/42Ojf9gcnf/Qomf/zuJo/85h6D/N4Sf/zSEnv8xgpz/MICZ/yt+
+ mP8se5P/YW1w/6qrq//+/v7/9/f3/zGhyv81pM7/OabR/z2r1f9Crtj/RbDb/0qz3v9NtuH/CRUa/wAA
+ AP82NzT/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8rLdT/Ky3U/ywu1v8qLM7/Ky3U/ywu
+ 1v8WF2v/AAAA/wAAAP8AAAD/BQUF/yIiIv8oKCj/RUVF/0VFRf9FRUX/SkpK/1FRUf9RUVH/UVFR/09P
+ T/8DAwP/AAAA/xKLw/8ZrvX/GK3z/xis8v8Yq/D/F6vu/2FcWv///////////////////////v7+////
+ //////////////7+/v////////////////////////////f39/8un8j/M6PM/zal0P87qtT/P6zX/0Ku
+ 2v9Hst3/S7Xg/wAAAP85Ojf/OTo3/zk6N/85Ojf/QEE+/z9APf85Ojf/OTo3/zk6N/8zNDH/Jymm/zI0
+ 1/8qLM7/KizO/zEz1/8wMtf/KizO/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/C1yB/xmv9v8Zr/X/GK3z/xis8v8YrPD/F6vv/xep7f9UfZD/////////
+ //////////////////////////////////////////////////8AAAD///////7+/v/39/f/LJ3G/zCh
+ y/80pM7/OafR/zyq1f9Brdj/RLDb/wAAAP8VLEL/OTo3/0BBPv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/OTo3/zIyMP8bGxr/LS/W/zQ22P8rLdT/KizO/yst0v82ONn/LC7W/yoszv8qLM7/KizP/yst
+ 0v8rLdX/LC7W/ywu1v8sLtb/Ky3V/zk6N/85Ojf/AAAA/wAAAP8AAAD/AAAA/xit8v8YrPD/F6vv/xep
+ 7f8XqOv/Jp3R/////////////////wAAAP/j4+P//////////////////////wAAAP8AAAD/Xl5e////
+ ///+/v7/9/f3/yqcxf8unsj/MqLN/zal0P85qNP/PqvW/0Ku2v8AAAD/QWyX/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zExL/8bGxr/IiJo/y8x1/82ONn/MjTY/zI0
+ 1/82ONn/NjjZ/zEz1/8qLM7/KizO/yoszv8oKsj/KizO/xsbGv85Ojf/OTo3/zk6N/85Ojf/OTo3/wAA
+ AP8AAAD/BSo7/xep7f8XqOv/Fqjp/xmn5f///////////7+/v//X19f//////wAAAP8AAAD/AAAA/39/
+ f////////////////////////v7+//b29v8pm8P/LJ7H/y+fyv80pM7/N6bR/zup1P8/rNf/AAAA/0BB
+ Pv9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zEx
+ L/8xMS//JiYk/xsbGv8bGxr/Gxsa/xsbGv8bGxr/Gxsa/xsbGv8mJiT/MTEv/zU1M/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wAAAP8AAAD/Fqfp/xan5/8So+X/////////////////////////
+ //8AAAD/AAAA////////////f39//wAAAP8AAAD///////7+/v/29vb/J5jA/ymcxf8tn8j/MqLM/zSk
+ z/84p9L/O6nV/wAAAP8AAAD/Q0RB/1Sn+/9HW2z/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/QkNA/zk6N/85Ojf/NTUz/zU1M/81NTP/NTUz/zk6N/85Ojf/Pj88/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9BQj//OTo3/zk6N/85Ojf/AAAA/wUpOf8VpeX/E6Pi////
+ /////////////0NDQ/8AAAD//////wAAAP8AAAD/AAAA/39/f///////AAAA///////9/f3/9vb2/ySX
+ v/8nmcL/K53G/y6eyf8yos3/NaXQ/zmn0/89q9b/AAAA/wAAAP9DREH/Rlhn/1Sn+/9Up/v/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf87PDn/OTo3/zk6
+ N/8AAAD/FaTj/xug2P//////////////////////////////////////f39//39/f/9/f3//////////
+ /////////f39//X19f8hlLz/JZjA/yiaw/8rnsf/LqDK/zKizf81ptH/OajU/z2r1/8AAAD/AAAA/wAA
+ AP9DREH/Q0RB/0+Kxf9Up/v/Q0NA/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf///////////0NE
+ Qf9DREH/T1BN//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/zs8Of85Ojf/AAAA/xWj4f8rj7r//////////////////////////////////////wAA
+ AP8DAwP/ra2t//b29v////////////39/f/19fX/H5K6/yKUvf8mmcH/KZvF/yyeyP8wocv/MqPO/zan
+ 0v85qdT/PavX/0Ct2f8AAAD/AAAA/wAAAP8aGxn/Q0RB/0+OzP9Pjsz/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf//////9vb2/0NEQf/Ly8r/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTk3/wAAAP8Uod7/W3iD////////////////////
+ ////////AAAA/wAAAP8AAAD/AAAA/39/f/8AAAD////////////9/f3/9fX1/xyQt/8glLv/IpW+/yaZ
+ wv8pm8X/LJ/J/zChzP8yo87/NqfS/zmp1f8SmM7/EZnQ/xKa0/8SnNX/AAAA/wAAAP8eHx7/Q0hJ/0NE
+ Qf9DREH/S0xJ/1RVUv9UVVL/VFVS//////9DREH/Q0RB/0NEQf//////iouJ/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/UZnh/z1WbP8AAAD/FKDc/2pk
+ Y////////////////////////////////////////////wAAAP//////AAAA/////////////f39//T0
+ 9P8ajrX/HJG4/yCUvP8jl7//JprD/ymcxf8sn8n/MKHM/zOkz/80ptH/EJfM/xGYzv8RmdD/EprT/xKc
+ 1f8Tndf/AAAA/wQEBP9Up/v/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/2pr
+ af9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/S3ei/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/S3Wd/0NE
+ Qf8AAAD/AAAA/xOe2f9vcHH///////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA
+ AP////////////z8/P/09PT/F4uy/xqPtv8ekrn/IJS8/ySYwP8nmsP/KZzG/yyfyv8vocz/D5TH/xCV
+ yf8Qlsv/EZjO/xGY0P8SmtL/EpvU/xKc1v8AAAD/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS////
+ /////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/S3eh/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/PDw5/wAAAP8AAAD/AAAA/xOe2P8Tndb/5eXl////////////////////////////AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/goKC///////8/Pz/9PT0/xaLsP8YjLP/G4+2/x6Suv8glL3/JJfA/yeb
+ w/8pnMb/DZDB/w+SxP8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGa0f8SmtP/AAAA/wEBAf9LdZ3/VFVS/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL//////0JDQP+pqaj/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/Q0RB/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/E57Z/xOd1/8SnNX/EZvU//7+/v//////////////
+ //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////Pz8//Pz8/8Uia3/Foqw/xiM
+ s/8bj7f/HpK6/yCUvf8jl8D/HJXA/w6Qv/8OkcH/D5LE/w+Txv8Qlcj/EJbK/xGXzP8RmM7/EZnQ/xKa
+ 0v8AAAD/UJTY/1RVUv9UVVL/VFVS/6ipp/////////////////9xcW///////0NEQf9DREH/Q0RB/0NE
+ Qf9HXnL/Ojs4/wAAAP8AAAD/S7fl/0q25P9JtuT/SLXj/0a04v8Tntj/E53X/xKc1v8Sm9T/EprS/111
+ fv////////////////////////////////////////////////////////////////////////////z8
+ /P/y8vL/EYeq/xSJrf8Wi7H/GI2z/xuPt/8dkrr/IJW9/w2Nuv8Njrz/DpC//w6Rwf8PksP/D5TG/xCV
+ yP8Qlsr/EJbL/xGXzf8RmM//AAAA/0NEQf9DREH/VFVS/1RVUv/w8fD/////////////////////////
+ //9DREH/Q0RB/0NEQf9DREH/Q0RB/wAAAP9JteP/R7Xj/0az4v9Gs+H/RLPg/0Oy3/9Bsd//EpzV/xKb
+ 1P8SmtP/EZnR/w6Y0P/y8vL//v7+//7+/v/+/v7///////////////////////7+/v/+/v7///////7+
+ /v/Iycn/cG1t/0V8jP8Khq7/D4Wq/w+Ep/8Rhqv/FImt/xaKsf8YjbP/Go+3/wyKtP8Mi7f/DY25/w2O
+ vP8Oj77/DpDA/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/wQmM/8AAAD/VKf7/1RVUv9UVVL/VFVS////
+ //////////////////9qa2j/Q0RB/0NEQf9DREH/T47M/wAAAP8EDA//RLLg/0Ox3/9Csd//QbDe/0Cv
+ 3f8/rtz/Pa7b/xCZ0v8RmdH/EZrQ/xGYzv8RmM3/EJbL/xCVyf8Qlcf/EJPF/xGTw/8QkcD/EJC+/w6O
+ vP8Ojbr/DIu4/wyKtf8Xj7b/Foyz/xSLsf8SiK7/D4Wq/w2Dp/8MgaT/D4Sn/xGGq/8Uia3/FYqx/wuH
+ r/8LiLL/DIm0/wyLt/8NjLn/DY67/w6Pvf8OkMD/DpHC/w+SxP8PlMb/D5TH/xCWyf8Qlsr/AAAA/0NE
+ Qf9GWmv/VFVS/1RVUv9UVVL/VFVS/6Chn/9DREH/Q0RB/0NEQf9DREH/VKf7/wAAAP8AAAD/QK/d/z+u
+ 3P8/rtz/Pq7b/z2t2/88rdr/OqvZ/zmq2P8zqNb/EZjO/xCXzP8Qlsv/EJXJ/xCVyP8Pk8b/D5LE/w+S
+ wv8OkMD/Do++/w2OvP8Njbr/DIu3/wyKtf8LiLL/C4ew/xOKsf8SiK7/D4ar/w2Cp/8KgaX/C4Ci/wyB
+ pP8Phaj/EYer/xOIrf8KhK3/C4av/wuIsf8MibT/DIq2/wyLuP8Njbr/DY69/w6Qv/8OkcH/D5LD/w+S
+ xP8PlMb/D5TH/wAAAP8AAAD/T47M/0NEQf9UVVL/VFVS/1RVUv9DREH/Q0RB/0NEQf9DREH/VKf7/zEy
+ MP8AAAD/PK3a/zus2f86q9n/OqvZ/zmq2P83qtf/N6nX/zWo1f81p9X/M6bT/xCXy/8Qlcn/EJXI/w+T
+ xv8Pk8X/D5LD/w6Rwf8OkL//DY69/w2Nu/8NjLn/DIu3/wyKtP8LiLL/C4ew/wqFrf8KhKv/D4ar/w2D
+ p/8KgaX/CX+i/wh9n/8LgKL/DIGk/w+Ep/8Jg6j/CoOq/wqErP8Lhq//C4ex/wuJs/8MirX/DIu3/w2N
+ uf8Njrv/Do+9/w6Qv/8OkcH/D5LD/w+SxP8PlMb/AAAA/zIzMf9Tpvv/S3We/0NEQf9DREH/Q0RB/0NE
+ Qf9DQ0D/VKf7/0JCQP8AAAD/N6nW/zap1v82qdb/NqjV/zWn1f81p9X/NKfU/zOm0/8ypdL/MKTR/y+i
+ z/8PlMf/D5TG/w+Txf8PksP/DpHC/w6QwP8Oj77/DY68/w2Nuv8Mi7j/DIq2/wyJtP8LiLL/C4av/wqE
+ rf8KhKv/CYKo/wuCpv8KgaX/CX+i/wh+n/8HfJ3/CH2f/wqAov8IgKP/CYGl/wmCp/8KhKr/CoSs/wqF
+ rv8Lh7D/C4iy/wyKtP8Mirb/DIy4/w2Nuv8Njrz/Do++/w6Qv/8OkcH/DpHC/w+SxP8AAAD/QEE+/0NE
+ Qf9Up/v/VKf7/1Sn+/9Up/v/Q0RB/zAxL/8AAAD/J3+h/zOm0/8zp9P/MqbS/zKl0f8xpNH/MKPQ/zCj
+ 0P8uos//LaLO/yyhzf8qn8z/DZHE/w+Sw/8OkcH/DpDA/w6Pvv8Njrz/DY27/w2Muf8Mi7f/DIq1/wuI
+ s/8Lh7H/C4av/wqFrf8KhKr/CYKo/wmCpv8IgKT/CX+i/wh+n/8HfJ3/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAEB/wgI
+ B/8BBAr/AwkM/wsLC/8QEA//BAsT/wgUGP8SEhL/GBkX/xAXGv8QGBv/Gxwc/x8gHv8gIR//CAgn/wMa
+ JP8MHCP/BB4q/xYeIf8KCzX/BCAt/xQjKv8EKDf/GC02/xYxPf8jIyP/KCgm/ycpKf8rLCv/MDEu/yQk
+ Nv8lLDD/Kisx/yUlPP8uNTr/Nzc3/z9APf9AQT7/Dg9G/xARTv8RElf/BjJE/ww1Rv8GNkn/BzlO/xM3
+ Rv8HPFT/JSVI/yg7SP8mJlX/FRZp/xgZef8nKGT/JSZ3/zIzf/8HQln/GURW/yVBTP88Q0b/JExe/zlL
+ W/8JSmb/EUlg/xJRbP8LV3f/EVZy/y1Obv8sV2n/N1lu/ztbdP84Znr/RERD/0hJRv9ESUv/S0tK/09R
+ Tv9QUU7/RExR/0NQWv9LU1j/U1NR/1hZVv9bXFv/YWJf/0ZZaP9HXXH/R2B3/0phdv9IZH3/YmJi/2xs
+ bP9xcm//c3Nz/3x8fP9/gH7/gYF//xschv8dH5D/HiCT/yMlm/8mJ6T/LzGl/yUnuP8KX4H/DGWL/xJl
+ iP8NapP/B3yd/wh+n/8gaIT/OWyD/yxwjP86dIr/JnWU/zd7lv8OdaH/CX2h/xJ1ov9KaIT/SmyM/0Z3
+ jP9JbpL/TnKT/0N9lv9LdJz/QX+b/0x5pP9Me6j/TX+w/ykryf8vMc//Ky3S/y4w1P8yNNf/N4Ga/wmB
+ pP8KhKv/GoKi/xGHqv8Sia3/HYiv/wuHsP8LibT/DY27/xCBsf8Ui7L/Goyz/xKEuP8Qir7/HI24/w6Q
+ vv8akLf/HJK6/y6Jqv89iqf/Jo+6/zKNtP89j7T/JJa9/zSVu/9GgZf/V4aV/3CTnf9Fiqb/WpWs/02B
+ tP9Ohbz/QJi5/1mauP9vnK7/epym/xGNwf8OksP/D5bL/xOUxv8ZlcP/EJXK/xGYzv8amsz/EpzU/ymb
+ xP82nML/IZ/R/xSg3P8soMz/NqPL/yCh1f8spNP/J6XZ/y2q3/8zpdH/OabR/zWo1f88qdP/M6rc/zus
+ 2v8VpuX/GK3y/yir5P8yruT/LbDr/z6y4/8msPD/T4rF/1CPzf9HncD/UJHT/1elxf9DrNX/V63S/0Sw
+ 3P9Lstv/U7Tc/2Kt0P9htdn/RLLg/0u14f9GuOv/S7rs/1e75P9Gu/H/Yr3l/13B7P9MwPb/V8Dw/2PC
+ 6/91xuv/asfx/3PM9f+EhIP/i4uK/4+Qjv+RkY//mZmZ/5ikqf+Grbr/kqu1/6Kiov+oqaf/qqqq/6+w
+ rv+ntbj/ubm5/8DAv/+UssD/qb7G/77Bwf/IyMj/1tbW/+bm5v/09PT//v7+/wAAAP8AAAD/AAAA/2xs
+ bIiIiIiJiY6Pj4+QkJCQrJCtra2tra+ur7GxsbGxrrGxsa6xsa2vra2tra2srZCQkI+Pj4mJiYmJiIh1
+ bWxsbYiIiImJiY+Pj4+QkJCQkK2tra2xrrSxsbGxsbGurrKxrrGusbGxsbGxrK2trZCQkJCQj4+Pj4mJ
+ iYmIiGxtbYiIiImJjo6Pj4+QkJCsra2tsbGxrKyxrLS0tLS0tLSytLS0tLSxtLGxsbGusa2trZCXkJCQ
+ j4+PjomJiYiIdYiIiYmOiY+Pj4+XkJCXra2xrrGxtLG0tLS0tLS0tLS0tLS0tLS0tLS0tLGxsayxsa+t
+ rayQkJCPj4+JiYmIiIiIiIiJi4+Pj4+QkJCtra2xsayxrLS0tLS0tLS0tLS0tLi0uLS0tLS0tLS0tLSx
+ sbKxsaytrZeQkI+Pj4mJiYmIiImOiY+Pj5CXl62tra+xsbG0tLS0tLS4tLi0uLi0uLi4tLi0tLS0uLS0
+ tLS0tLSsrLGxra2XkJCQj46PiYmJiImJiY+Pj4+Xl5etr6+xsay0tLS0tLS0tLS0tLSslHZ2dpGstMW4
+ tLS4uLi0tLS0tLSxsa+sra2tkJCQj4+PiYmJiY6Pj4+Xl5evrbGysbS0tLS0uLS4uJRBLxACAAAAAAAA
+ AAIGKkF2tLS0tLS0tLS0tKy0sa+trJCQkJCPiYuJiY+Pj4+Xl5evra+xrLS0tLS0tLSsPgYCAAIaJEtS
+ WlpaU00lGwUAAAIvdrS4uLS0tLS0sbGxr62tl5CPj4+Oj5iMko+Xl5etrbGysbS0tLS0uKwsAAIOUV7q
+ 7urq7uru6u7u6u7q5lohAQAQarS0tLi0tLSxsbGvra2XkJCQj4mfn5+Yl5etra6xsbS0tLS0tEICAiRe
+ 6urq6uru8PDx8fHx8PDuX1pRSyQGAQASdrS0tLS0tLSxsa+tl62Qj4+Pn7a6urq1r66vsrS0tLS0tBcA
+ CCFd7uru8PP0+Pj4+Pj4+Pj48yFTX+ru8O7uXiE+tLS0tLS0sbGxr62Ql5eQmJ+2urq6wtG5srK0tLS0
+ tBIBDCQkJOnx+Pj4+fj4+Pj4+Pj4+Frn8PDw8O/mWltcABe0tLi0tLSxsq+tr7Cfn7W1urq60dHS1NXT
+ u7S0tCsBHSQkJCRR8/j4+Pj4+Pj4+Pj4+PQl8O/u7loeGhtdGg4AF7S0tLS0tLG0v7q6urmfoLq6ztHR
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA
+ IAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32f/wh/ov8JgaT/CYKn/wqEqv8KhK3/C4ew/wuI
+ s/8MirX/DIu4/w2Nuv8Njrz/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJTH/xCVyP8Qlsn/EJbJ/xCV
+ yf8Qlcn/EJbJ/xCWyf8Qlcj/EJXI/w+Ux/8PlMb/D5LE/w+Sw/8OkcH/DpC//w2Ovf8Njbv/DIy4/wyK
+ tv8MibP/C4ex/wqFrv8KhKv/CYKo/wmBpf8If6L/CH6g/wd8nf8HfZ//CH+i/wmBpf8Jgqj/CoSr/wqF
+ rv8Lh7H/DIm0/wyLt/8Njbn/DY68/w6Qv/8OkcH/D5LD/w+Txf8PlMf/EJXI/xCVyv8Qlsv/EJfM/xGX
+ zf8Rl83/EZjO/xGYzv8RmM7/EZjO/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/w+Ux/8PlMb/D5LE/w6R
+ wv8OkL//DY69/w2Nuv8Mi7j/DIq1/wuIsv8Lhq//CoSs/wmDqf8Jgqb/CICj/wh+oP8If6L/CYGl/wmD
+ qP8KhKv/C4av/wuIsv8MirX/DIu4/w2Nu/8Oj77/DpHB/w+Sw/8Pk8X/EJXI/xCWyv8Qlsv/EZfN/xGY
+ zv8RmtD/EZnR/xKb0v8SmtL/EpvT/xKa0/8SmtP/EprT/xKa0v8SmtL/EZnR/xGZ0P8RmM//EZfN/xCX
+ zP8Qlcr/EJXI/w+Txv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4av/wqErP8Jg6n/CYKm/wiA
+ o/8JgKT/CYOo/wqEq/8Lhq//C4iy/wyKtf8NjLj/DY68/w6Qv/8OkcL/D5LE/w+Ux/8Qlcn/EJbL/xGY
+ zv8Rmc//EZnR/xKa0v8Sm9T/EpzV/xKc1v8Sndb/E53X/xOd1/8Tndf/E53X/xKd1v8SnNb/EpzV/xKb
+ 1P8SmtP/EZrR/xGY0P8RmM7/EJfM/xCWyv8Qlcj/D5PF/w6Rwv8OkMD/DY68/w2Muf8Mirb/C4iz/wuG
+ r/8KhKz/CYOp/wmBpf8Jg6j/CoSr/wuGr/8LiLL/DIq2/w2Muf8Njrz/DpDA/w+Sw/8PlMb/EJXI/xCW
+ y/8Rl83/EZnQ/xKa0v8Sm9T/EpzV/xOd1/8Tntj/E57Z/xOf2v8Tn9v/E6Db/xSg2/8UoNv/E6Db/xOf
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJXJ/w+Uxv8PksT/DpDA/w2O
+ vf8Njbr/DIq2/wuIs/8Lh7D/CoWs/wmDqP8KhKr/CoWu/wuIsv8MirX/DYy5/w2Ovf8OkMD/D5LE/w+U
+ x/8Qlcn/EJbM/xGYz/8RmtH/EpvU/xKc1v8Tntj/E5/a/xOf2/8Tntr/AAMD/wAEBf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAQH/Dn6t/xSh3P8UoNv/E5/a/xOe2P8SnNb/EpvU/xKa0v8RmdD/EZfN/xCV
+ yv8Qlcf/D5LE/w6Rwf8Oj77/DY26/wyKtv8LiLP/C4av/wqEq/8KhK3/C4ex/wyKtf8NjLj/DY68/w6Q
+ wP8PksP/D5TH/xCWyv8Rl83/EZnQ/xKa0/8SnNX/E53X/xOf2v8ToNv/AAEC/wAAAP8AAAD/DAwM/1JS
+ Uv+bm5v/nJyc/5ycnP+cnJz/nZ2d/4eHh/8CAgL/AAAA/wAAAP8AAAD/AAcK/xSg3P8Tn9r/E57Y/xKc
+ 1f8SmtP/EZnQ/xGYzv8Qlsv/EJXI/w+SxP8OkcH/DY+9/w2Nuf8Mirb/C4iy/wqFrv8olbn/Eoy1/wyL
+ uP8Njrz/DpDA/w+SxP8PlMf/EJbK/xGYzv8RmdD/EpvT/xKd1v8Tntn/E5/Z/wAAAP8AAAD/RUVF/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/AwMD/wAA
+ AP8ACAv/FKDb/xOe2f8Tndf/EpvU/xGZ0f8RmM7/EJbL/xCVyP8PksT/DpHB/w2Ovf8NjLn/DIq1/wuH
+ sf8rl73/MJzC/zagxv83osr/D5LD/w+Ux/8Qlcr/EZjO/xGZ0f8Sm9T/E53X/xOf2v8ADhH/AAAA/zQ0
+ NP+cnJz/nZ2d/52dnf+dnZ3/tbW1/8jIyP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/IyMj/Dg4O/4aG
+ hv+oqKj/qKio/6ioqP+oqKj/CwsL/wVEXv8Tn9r/E57Y/xKc1f8SmtL/EZjO/xCWy/8Qlcj/D5LE/w6Q
+ wP8Njrz/DIu4/wyJtP8tmr//M5/F/zmkyv8+p87/Q6vS/0iw1/8RmM3/EZnQ/xKb1P8Tndf/E5/a/wAE
+ Bf8AAAD/NTU1/zU1Nf81NTX/oaGh/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf8EBAT/qKio/6ioqP+oqKj/qKio/6SkpP8kJCT/p6en/wAAAP8ACQz/E5/b/xOe2P8SnNX/EZrR/xGY
+ zv8Qlsr/D5TH/w+Sw/8imcP/L57F/yqZv/8wncP/NqHH/zumzf9BqdH/R63V/02y2f9Rtd3/V7ng/wya
+ 1/8Tn9r/AyAt/wICAv81NTX/NTU1/zU1Nf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8jIyP+lpaX/qKio/6ioqP83Nzf/JCQk/yQkJP8kJCT/PDw8/0VFRf8AAAD/AAcJ/xOf
+ 2/8Tntj/EpzU/xGZ0f8RmM3/Q6zU/zyn0P84pc3/M6DH/y2bwv80n8X/OaTL/z+oz/9ErNP/SrDY/1C0
+ 3P9WueD/W7vj/2G+5v9mwun/AAAA/zU1Nf81NTX/NjY2/0VFRf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/39/f/+oqKj/p6en/yQkJP8kJCT/JCQk/yQkJP8jIyP/AQEB/0VF
+ Rf9FRUX/AAAA/wdScv8Sntr/V7ni/1C23/9Lsdv/Ra3X/0Cq0/86ps//NaLK/y+dxf82ocj/O6XN/0Gq
+ 0v9HrdX/TrLa/1O33v9ZuuL/Xr3l/2TA6P8DDRL/NTU1/zU1Nf83Nzf/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wQEBP+pqan/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP+np6f/RERE/0VFRf9FRUX/RERE/wAAAP9gv+j/Wbzl/1S34f9Os93/SbDa/0Os1f88qNL/N6TM/zKg
+ x/85o8r/PqjP/0Ss1P9JsNj/ULTc/1e44P9cu+P/YsDn/2jC6v8AAAD/NTU1/zU1Nf9FRUX/RUVF/0VF
+ Rf9DQ0P/NTU1/0VFRf9FRUX/RUVF/0VFRf/Kysr/ycnJ/8nJyf/Jycn/ycnJ/3Z2dv8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP+qqqr/RUVF/0VFRf9FRUX/RUVF/w8PD/8AAgP/Xb7n/1e54/9RtuD/S7Lc/0Wv
+ 2P9Aq9T/OaTO/zOiyv85pMz/QKnR/0at1v9Nsdr/U7be/1m64v9evub/ZcHp/2rD6/8BAQH/NTU1/0VF
+ Rf9FRUX/RUVF/0RERP82Njb/NjY2/0RERP9FRUX/PDw8/0NDQ/9FRUX/RUVF/0NDQ//ExMT/ycnJ/wAA
+ AP+6urr/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/u7u7/7e3t/9ERET/EBAQ/wMDA/8AAAD/YMDp/1q8
+ 5v9UuOL/TrTe/0ew2v9Crdb/O6jR/zakzP88ps7/QqvT/0iv2P9Os9v/Vbjg/1u85P9hwOj/Z8Pq/12s
+ zf81NTX/QEBA/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/0VFRf9ERET/NjY2/zY2Nv9ERET/RUVF/zY2
+ Nv82Njb/NjY2/ysrK/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+5ubn/z8/P/0RE
+ RP8AAAD/YcHq/1y+5/9WuuT/ULXg/0my2/9Ertj/PajS/zekzv8+qND/RK3V/0uw2f9Qtd3/V7ni/12+
+ 5v8QEBD/acTr/wABAf8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf87Ozv/RERE/0VFRf81NTX/NjY2/zY2
+ Nv9ERET/ODg4/zY2Nv8AAAD/AAAA/wAAAP8AAAD/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/9DQ
+ 0P/Pz8//Q0ND/0VFRf8iIiL/Y8Hp/16/6P9XuuX/Urji/0yz3f9Frtn/QKvU/zilz/8/qNH/Ra7W/0yy
+ 2/9Std//WLrj/1u54P8QEBD/EBAQ/wABAv82Njb/RUVF/0VFRf86Ojr/AAAA/0RERP9FRUX/RUVF/0VF
+ Rf82Njb/NjY2/zY2Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8/P
+ z//Q0ND/0NDQ/7+/v/81NTX/NTU1/0VFRf9FRUX/KE9f/2DA6v9avOb/U7nj/0203/9HsNv/QKvV/zqn
+ 0f8/qdL/Rq3X/02z3P9TuOH/SJS1/zt1jf8/d4//V5+//wAAAP9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wEBAf81NTX/NjY2/zU1Nf9FRUX/NjY2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/0NDQ/9DQ0P/Pz8//AQEB/zY2Nv82Njb/NjY2/z4+Pv9ERET/Dx8m/2HB6/9bvej/Vbrk/020
+ 4P9Hsdv/QazW/zuo0v9AqtL/LqTS/xOa0P8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wICAv9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP9FRUX/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CwsL/yIiIv//////8vLy/9vb2/8CAgL/NjY2/zU1Nf9FRUX/AR0p/yeq
+ 5f9cv+n/Vrrk/0614P9Jstz/QqzX/zyp0/8Qlsn/EZfN/xKa0v8QGRn/EBAQ/xAQEP8QKjX/EBQT/w8P
+ D/9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//v7+/wAAAP8FBQX////////////a2tr/NTU1/z09
+ Pf9ERET/Cld5/xWk4/8UouD/E6Db/xOd1/8SmtP/EpjO/xqay/8Qlsn/EZjO/xKa0v8TnNb/E57a/xSh
+ 3/8QEA//EBAQ/xNznP8VFRX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP+BgYH/////////
+ ////////NjY2/0VFRf9FRUX/Fqfo/xWl5P8UouD/FKDc/xOe2P8SnNT/EZjP/xCWyv8Qlsr/EZjO/xKa
+ 0/8Tndf/FKDc/xSh4P8QEBD/EBEQ/xep6/8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/ERER/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8ODg7//f39///////+/v7/RUVF/0VFRf8EBAT/Fqfo/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCX
+ y/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8UmNT/Fqfo/xeq7P8ABAX/RUVF/zk5Of8CAgv/AAAA/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9DQ0P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/PDw8/wAAAP8AAAD/AAAA/xYWFv9ERET/RUVF/0VFRf8AAAD/Fqjp/xWl5f8Vo+H/FKHd/xOe
+ 2P8Sm9T/EZrQ/xCWy/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xeq7P8XrPH/MjIy/0VF
+ Rf8AAAD/KizQ/wAAAP9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/zk5Of9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8AAAD/BQUF/0RERP8ENUr/Fqjp/xWl
+ 5f8Vo+H/FKHd/xOe2P8Sm9T/EZrQ/xCWy/8Qlsr/EZjO/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xOn
+ 6/94zvX/AAAA/0VFRf8AAAD/KizQ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/y4u
+ Lv9FRUX/RUVF/0VFRf9FRUX/RUVF/ycnJ/9FRUX/RUVF/0VFRf9FRUX/JCQk/wAAAP8AAAD/AAAA/wAA
+ AP8Xqez/Fqjp/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCXy/8Qlcn/EZjO/xKa0/8Tndf/E5/b/xSi
+ 4P8VpOP/a8fw/3HL8/93zfX/J0JQ/0RERP8ICAj/KizQ/ywu1v8qLND/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wkJCf9DQ0P/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP8AAAD/AAAA/wULDv9syfP/FKbo/xWl5P8Vo+H/FKHc/xOe2P8Sm9T/EZnP/xCWyv8Qlsn/EZjO/xKa
+ 0v8Sndb/E5/b/zSv4v9jwuz/acfw/3DJ8v90zPT/e9D3/wAAAP8AAAD/KizQ/zY42f8sLtb/AAAA/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/3DL9f9rx/L/ZMXw/1u/6/8UouD/FKDc/xOd1/8SmtP/EZnP/xCV
+ yv8Qlcj/EZjN/xGZ0f8Sndb/Vbnk/1u96P9gwev/ZsXv/23H8f8FCw3/AAAA/wAAAP8AAAD/LC7W/zY4
+ 2f82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf8FBQX/c833/23K9P9nxfH/Y8Tv/1zA6/9WvOj/E5/b/xOd
+ 1/8SmtL/EZjO/xCWyf8PlMf/EJbM/0ew2/9Ms97/Urjj/1i85/9ewOr/ZMTu/2rG8P9vyfP/AAAA/ywu
+ 1v8sLtb/LC7W/zQ22P82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wkJCf9FRUX/RUVF/ykpKf9IgZv/cMz1/2vJ8/9lxPD/X8Lu/1m/
+ 6v9Uu+f/Tbbj/w6a1f8RmdH/EZfN/xCVyP8MkcX/PqvV/0Su2f9Kst3/ULfi/1a75v9bvun/YcPt/2fF
+ 7/9syPL/ccz1/wAAAP8sLtX/KizS/ywu1v82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9QUFD/EhIS/xIgJP9zzPb/bcn0/2jG
+ 8v9jxfD/XcHs/1e86f9Suub/S7Xi/0Wx3f8/rNn/EJfM/w+Ux/82pc7/O6nT/0Kt2P9Isdz/TbXg/1O5
+ 5P9Yvej/XcDr/2XE7v9px/H/bsnz/wAAAP8sLtb/Ky3V/ykrx/81N9j/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Tk5O/wAAAP8AAAD/IYOr/3PN
+ 9/9wzPb/RY6n/0KNpv9Bkaz/Wr7r/1S75/9Ot+T/SbTg/0Ow3P89q9j/N6fT/w6Qwv80o8z/OabR/z+r
+ 1v9Er9r/SrTf/0+34/9Vu+b/Dh0l/wAAAP8AAAD/CQkJ/zk6N/85Ojf/KizO/yoszv8rLdT/LC7W/wAA
+ AP8AAAD/OTk5/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf9RUVH/SEhI/wAA
+ AP8ZrvT/GK7z/3DL9v+bm5z/U4CO/z6Jo/88iqP/OIag/zWFnv8xgpz/LX6Z/yl8lv82dor/l5eX//n5
+ +f8xocv/NqXP/zyq1f9Cr9n/SLLd/0y14f8AAAD/FxcW/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/ywu
+ 1v8qLM//LC7W/yoszv8sLtb/AAAI/wAAAP8AAAD/AAAA/wICAv8LCwv/CwsL/wsLC/8+Pj7/UVFR/0JC
+ Qv8AAAD/BCs9/xmu9f8YrfP/GKzx/xer7/99fX3/////////////////////////////////////////
+ //////////////j4+P8unsj/NKPN/zmo0v8+rNb/Qq/b/0KkzP8AAAD/OTo3/z4/PP9DREH/Q0RB/0NE
+ Qf9AQT7/OTo3/yQkI/8wMtf/LC7W/yoszv8sLtb/LC7W/yoszv8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu
+ 1v8cHB//AAAA/wAAAP8AAAD/GK70/xiu8/8YrPH/F6vv/xeq7P9sa2v///////////8AAAD/////////
+ /////////////wAAAP8AAAD///////j4+P8sncX/MaLL/zakz/86qNP/Qa3Y/wAAAP9Hjtb/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf82NjT/Gxsa/ykquf82ONn/LS/W/ywu1v82ONn/NjjZ/zQ2
+ 2P8zNdf/LC7W/ygqy/8bHCr/OTo3/zk6N/85Ojf/AQEB/wAAAP8Xq+//F6rs/xao6v9bdn///////9zc
+ 3P8qKir/AAAA/wAAAP+3t7f/Kioq//////////////////j4+P8pm8P/LZ7I/zOjzf83ptH/PKrV/wAA
+ AP9DREH/Q0xR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zc4Nf8xMS//Li4s/xsb
+ Gv8bGxr/Gxsa/xwcG/8tLSz/MTEv/zg4Nv85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/C2CH/xan
+ 5/9KhJv///////////8pKSn/ExMT/1FRUf///////////wAAAP8AAAD///////f39/8mmMD/KpzF/y6f
+ yv80pM//OajT/z6s1/8AAAD/Q0RB/1Sn+/9Lc5v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/z4/PP87PDn/Pj88/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6
+ N/85Ojf/AAAA/xWl5P9Xe4j///////////8AAAD//////wAAAP+AgID/gICA//////////////////f3
+ 9/8hlbz/J5nC/yudx/8wocv/NKXQ/zmo1P8+q9f/AAAA/wQEBP9DREH/UJPX/1Sn+/9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf//////Q0RB/0NEQf9DREH/kpOR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf85Ojf/Njc0/wMaJP9nZWb//////////////////////7Kysv8AAAD/AAAA////
+ //////////////b29v8fk7r/JJe//yiaw/8sn8j/MaHM/zWm0f85qNT/PqvY/w+Ar/8AAAD/AAAA/0NE
+ Qf9GXHD/Q0RB/0NEQf9DREH/UVJP/0NEQf9DREH///////////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/QGmT/wMaJP9mZmf//////////////////////wAA
+ AP8AAAD/AAAA/wAAAP////////////b29v8ckLf/IJS7/yWYwP8omsT/LJ/J/zGizf81pdD/JZ/Q/xGY
+ z/8SmtL/EpzV/wAAAP8AAAD/SW6Q/0NEQf9UVVL/VFVS/1RVUv9fYF3/Q0RB/0NEQf//////Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DQ0D/S3We/1Sn+/9TpPb/AAAA/xOf2/+fn5//////////
+ //////////////////9qamr/AAAA/wAAAP////////////X19f8YjbP/HJC3/yCUvP8lmMH/KJvF/yyf
+ yv8woc3/EJXI/xCWy/8RmM7/EZrR/xKb1P8Tndb/AAAA/0NEQf9UVVL/VFVS/1RVUv9UVVL///////T0
+ 9P9DREH/Q0RB/0NEQf9DREH/Q0RB/0dedP9Tpvr/Q0RB/0NEQf9DREH/Q0RB/zo7OP8AAAD/AQ0R/xOd
+ 1//+/v7//////////////////////wAAAP8AAAD/AAAA/wAAAP////////////X19f8WirD/GY20/x2R
+ uP8glL3/JZnC/yibxf8OkcL/D5PF/xCVyP8Qlsv/EZjO/xGZ0f8SmtP/AAAA/1Sn+/9UVVL/VFVS/1RV
+ Uv9UVVL//////0NEQf9dXlv/Q0RB/0NEQf9DREH/Q0RB/0NEQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wxu
+ mP8Tntj/EpzW/xKb0////////////////////////////wAAAP8AAAD/AAAA/wcHB/////////////X1
+ 9f8Sh6z/Foqw/xmOtf8dkbj/IJS9/wyNu/8Oj77/DpHB/w+Txf8PlMf/EJXK/xGXzf8Rmc//AAAA/0NE
+ Qf9UVVL/VFVS/29wbv//////////////////////Q0RB/0NEQf9DREH/Q0RB/wAAAP9KtuT/SbXj/0e0
+ 4v9FsuH/J6Xa/xKc1v8Sm9T/EprS/2pkZP//////////////////////////////////////////////
+ ///+/v7/+fn5/2poaf8PhKj/Eois/xaKsf8ZjrX/HJG4/wyLt/8Njbr/Do+9/w6Rwf8PksP/D5TG/xCW
+ yf8Ql8v/EZfN/wAAAP9To/b/VFVS/1RVUv////////////////9CQ0D/Q0RB/0NEQf9Qldv/AAAA/0Sy
+ 4P9EsuD/QrHf/0Cw3v8/r93/Pa7b/xKa0f8RmdD/EZjO/xCWy/8Tlsn/CZLH/wOQx/8Dj8X/A4zB/wWK
+ vP8PjLj/DIq0/xaNtf8Ti7H/EYes/w2EqP8MgaT/EISo/xOIrf8VirH/C4ew/wyJs/8Mirb/DY26/w2O
+ vf8OkL//D5LC/w+Txf8PlMf/EJbJ/wAAAP9DREH/VFVS/1RVUv9UVVL/VFVS/0NEQf9DREH/Q0RB/1Sn
+ +/8AAAD/P6/d/z+u3P8+r9z/Pa3b/zyt2v85q9n/N6rX/xGXzf8Qlsz/EJXK/xCVyP8PksX/D5LD/w6Q
+ wP8Oj73/DY26/wyLt/8MibT/C4ex/xOLsf8Rhqz/DoOp/wqBpf8KgKH/DIGk/w+FqP8KhKn/CoWt/wuH
+ sP8LiLP/DIq2/w2Muf8Njbv/Do++/w6Rwf8PksP/D5PF/w+Ux/8AAAD/VKf7/0tMSf9UVVL/Q0RB/0NE
+ Qf9DREH/VKf7/wAAAP8SNkb/OarY/ziq1/83qdf/NqjW/zWn1f8zptP/MqXS/xCVyf8QlMf/D5PF/w+S
+ w/8OkcH/DpC//w2OvP8NjLn/DIq2/wuJs/8Lh7D/CoWt/wqDqv8NhKj/CoGl/wh+of8HfJ3/CoCh/wqA
+ o/8Jgab/CYOp/wqErP8Lhq//C4iy/wyJtP8Mi7f/DY26/w2OvP8Oj77/DpDA/w+Sw/8ABAX/AAAA/0NG
+ Rf9Up/v/VKf7/1Sn+/9EUVr/AAAA/wAAAP8zptP/M6bT/zOn0/8ypdH/MKPQ/zCj0P8uo8//LKHN/xaX
+ xv8PksP/DpHB/w6Qv/8Njr3/DY26/wyLuP8MirX/C4iy/wuGr/8Kha3/CoSq/wmCp/8IgKT/CH6h/wd9
+ nv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABAAgAAAAAAAASAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAA/wUGDP8DCQv/CwsL/w8QD/8QEA//BQoU/wcQE/8LERT/AhQb/wsSHP8REhH/ExcY/xMY
+ Gv8bGxv/ICEf/wgJK/8HGyT/Fh4i/xgdIP8LCzb/AyAr/w4iK/8WIif/BCg3/xYrNP8SMD7/Jycn/zEy
+ L/8oKDz/ODg3/z9APf9AQT7/DQ5B/xQVTP8GMkT/CDNH/wY5Tv8NPE//ETNB/xM9Tf8YP0//BztR/w49
+ Uf8pKUP/IzpE/ykqVv8mPVT/FBVg/whEXP8UQFL/MkBL/y9FWv8nS1r/MERX/zlGUP87SFP/MEhf/wlN
+ af8STmf/Gk5j/xZPaf8KUW7/C1V1/zJKYP8rVWj/P1Ji/zlTa/8xWWv/N2R4/0REQ/9HSEX/SUpH/0NJ
+ TP9MTEz/UFFO/0VQV/9FUlv/U1NS/1hZVv9QWF7/XFxc/0RXZ/9HXnL/QF57/1Bgbf9LYXX/RmN+/0hi
+ ef9iYmL/bGxr/3R0dP95enf/e3t7/xsdif8dH5H/KCmE/yUmnP8lJ6r/KSu2/wxcgf8MZYv/DWyU/w9s
+ mP8TbJL/DXaf/wd9nv8IfJ7/KGuI/zpsg/89dYn/K3eW/zp7k/8OdKD/CH6h/w99rP8Rd6T/LX+g/0hm
+ gv9GaYv/SWyM/0pukP9LcZX/RHyW/0pzm/9MdqD/THqm/018qv8pK8j/Ky3S/y4w0/8zNdf/OoKZ/wmB
+ pP8KhKv/EIWp/xyFq/8SiKz/C4aw/wuJtP8Njbv/EoS1/xSLsv8ZjbT/EoO5/xKJvP8OkL//HJC3/xaS
+ vf8dkbn/IYmr/yuJqf86kK7/IpS8/yuYvf86kLT/NJO4/0SDl/9Xi5z/ZJCe/02MqP9Kka//UZGu/02A
+ sv9El7T/S5Wy/0qat/9BmLn/TJy7/1Gauf9dob7/aqS+/3enuv9/rLr/Eo/F/w6Sw/8TlMX/EJXJ/xGY
+ zf8cmcj/EpvT/xyc0v8Tntj/KZvF/zGdw/88ncX/IJ/R/xSg3P8tocz/NqPL/yah0f8rpNT/JKTY/yun
+ 3P8sqN3/M6XR/zqm0P81qNb/PKnT/zKp2f87rNr/FaXl/xis8v8gq+r/NbLp/02fwv9Npsn/VaXG/0Os
+ 1P9Or9f/Q67Y/0mv2P9EsNz/S7Lb/1K13f9hpMP/dq7H/2Sz2P9Es+L/S7Xh/0u45/9Btun/V7rk/2O9
+ 5P9dwOv/WMP0/2PC6/9px/H/c8z1/4KCgv+HiIb/ioqJ/5CQj/+Tk5P/l5iW/5ycnP+Bqrr/mbK9/6Sk
+ pP+nqKb/qKmn/6qqqv+6urr/gK3A/5+6xf+mws7/scfO/8jIyP/R0dH/29zc/9/g4P/j4+P/6+vr//T0
+ 9P/+/v7/AAAA/2pqhYWFhoaKi4yMjJKSr7CurrGusbGxsrGxsbGxsbGxr6+SjIyMi4uLhoaFhYVqampy
+ hYWKiYuLi4yMkpKur7GxsbKxsrKysrK0sbGxsbGxsbGvkpKMjIyLi4uGhoWFanKFhoaGi4uMjIyvsK6x
+ sbGysrSytLS0tLS0tLS0tLKxsrGxsbCvkoyMi4uLhoaFhYWGhoqLi5KLr6+wsbGytLK0tLS0tra2tra0
+ tra2tLS0srKxsbGur6+MjIuLioaGhYaHhouLi5Kvr7GxsbKytLS2tra2u7a2trS7tru2tra2tLS0srKx
+ sa+vkoyLi4uGhoaKi4uSkpKvsbGytLK0tra2rmU6GBEGBgYQGCU/c7a2tra0tLKysbGvr4yMi4uKhoeL
+ i4uSkq+vsbGytLa2tmQVAQscSllaW1paT0YPAQYxjba2trS0srGxr6+SkouLipmTjpKSr7CysrS0tLZo
+ BgpK5evr6+vr6+7r6+vr5k4MABiNtra0tLGxsa+vjIyLi5qavbezr7KytLS2tCQBD+Xr6+7y8vf39/f3
+ 9+kfUVvl5VtJOra2tLS0sbGvkoyLjri9vb3Qxbq0tLa0IwYcHkbu9/f39/j39/f391Hu7vHrW0rlASO0
+ tra0tLGvsre3mre9xc7T1tbVx7Y6Ax4eHkZR9/f39/f49/f38Vrx7lEbDxxOHgMatbS0tb/Fzr29t729
+ ztDQ1tbe4qkGHh4eRkZGUfL39/f39/f4Wu7mHBsPG1EcRiAGP8vU1dXS0L29t7290NPW1t7f4jUPHh9G
+ RkZGSUrq9/f39/f3WV0bDxsPG1ocSUYeAc/e3tXT1Ma9vb3O0NPW3t/i2QoeHkZJRh8fRkZGWev39/f3
+ HhsbGxsbG1keR0dGD0He3t7V0MbGvb3G0NbW1t/ipQweRkZGRhweIEYfIEZOW+nuG+jv8fHx6+jlW1lO
+ Ewrf3t7V1dLGvcbR09XW4NbidxseRkZGIB4eRh8eHiBGHh4eG/Hy8vLy8vLy8vfrHAup4N7e1NDGvb3Q
+ 1d7ezxepRBseRkdGRh9GRx4cHkYfHAwDAx7p8vLy8vL39/EfRhtw3t7e29TGxsbQ1dbepRcNGR5HHh4b
+ HR5GRh4eHkYeBQAAAAAASvLy9/j45RweRh1F4t7e1dTSvdDV1XBtRUUtAx5GRkZGHg4DDhseHkYbAAAA
+ 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
+ AAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAHfZ7/CH+i/wmBpv8Khav/C4av/wuI
+ s/8Mi7f/DY27/w6Pvv8OkcH/D5LE/w+Uxv8QlMj/EJbJ/xCWyv8Ql8v/EJfL/xCWyv8Qlcn/EJXI/w+U
+ xv8PksT/DpHC/w6Qv/8Njrv/DIu4/wyJtP8Lh7D/CoWr/wmCp/8IgKP/B32e/wh/ov8Jgqf/CoSr/wuH
+ sP8MirX/DYy5/w6Pvf8OkcH/D5PF/xCUyP8Ql8v/EZfN/xGZz/8RmdD/EZnR/xKa0f8Sm9L/EZrR/xGZ
+ 0P8RmM//EZjN/xCWy/8Qlcj/D5PF/w6Rwv8Oj77/DY26/wyKtf8Lh7H/CoSs/wmCp/8IgKP/CYKm/wqE
+ q/8Lh7D/DIq1/w2Nuv8OkL//D5LE/xCUx/8Qlsv/EZjO/xGZ0f8Sm9P/EpzV/xOd1/8Tntj/E57Y/xOe
+ 2P8Tntj/E53X/xKc1f8Sm9T/EZrR/xGZz/8Ql8z/EJXI/w+SxP8OkMD/DY27/wyKtv8LiLH/CoSs/wmC
+ p/8Khav/C4ew/wyKtv8Njbv/DpDA/w+Sxf8Qlcn/EZjN/xGZ0f8SnNT/E53X/xOf2v8UoNv/Dn6u/wAL
+ D/8ACQv/AAME/wIdKf8Uot//FKDc/xOf2v8Tndf/EpzV/xKa0f8RmM7/EJXK/w+Uxv8OkcH/DY68/wyK
+ tv8Lh7H/CoSr/wuGr/8MirX/DY26/w6QwP8Pk8X/EJXK/xGYz/8SmtP/E53X/xOf2v8ABgf/AAAA/woK
+ Cv+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ubm/8FBQX/AAAA/wIdKP8Tn9r/E53X/xKb0/8Rmc//EJbL/w+U
+ xv8OkcH/DY67/wyKtv8Lh7D/LJi9/zSexP8OkL//D5PF/xCVyv8RmM//EpvU/xOe2P8BFR3/AAAA/52d
+ nf+dnZ3/nZ2d/6Ghof/Jycn/ycnJ/8nJyf/Jycn/vr6+/wQEBP81NTX/dHR0/wYGBv8Pfq7/E57Z/xKc
+ 1P8RmND/EJfL/w+Uxv8OkMD/DY26/wyJtP8wnMH/OaLJ/0Gp0P9Irtb/EJjP/xKb1P8Tntn/AAYH/zU1
+ Nf81NTX/NTU1/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9/f3//qKio/6ioqP8nJyf/JCQk/wAA
+ AP8ABwj/E57Z/xKc1f8RmtD/EJbK/w+Txf81oMj/LJvB/zSfxv88ps3/Ra3U/06y2v9XueD/Xr3k/2C+
+ 5/81NTX/NTU1/0RERP9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ioqP9SUlL/JCQk/yQk
+ JP+lpaX/RUVF/0FBQf8CHSj/E57Z/1K33/9JsNr/QavU/zilzf8wnsb/OKPK/0Gp0f9Jr9f/UbXd/1y7
+ 4/9jwOj/AAAA/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf8iIiL/JSUl/yQk
+ JP8kJCT/JCQk/5SUlP9FRUX/RUVF/wICAv9fv+j/V7nj/06z3f9Frdf/PKnR/zSiyv87pc3/RKvU/06y
+ 2v9XuOD/X77m/2jD6/80NDT/QUFB/0VFRf9FRUX/NjY2/zY2Nv9FRUX/RERE/0VFRf+tra3/ycnJ/wgI
+ CP+Tk5P/vLy8/7y8vP+urq7/SkpK/wkJCf8JCQn/Kysr/wIJDP9avOb/Ubfg/0mw2v9AqtT/N6TN/z+p
+ 0P9Hrtf/ULTd/1q74/9jwOf/a8Xs/zU1Nf9FRUX/RUVF/0VFRf82Njb/RERE/zY2Nv82Njb/RUVF/zY2
+ Nv82Njb/NjY2/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8/Pz/9FRUX/AAAA/1+/6P9VuuP/TLPd/0Kt
+ 1/85pc//QKrS/0qx2f9Tt+D/XLzl/xAQEP9wyfD/RERE/0VFRf8iIiL/RUVF/0VFRf9FRUX/NjY2/zY2
+ Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/y8vL/+7u7v/u7u7/9DQ0P/Q0ND/NTU1/0VFRf8EBAT/YsLr/1e6
+ 5f9OteD/RK7Z/zyo0v9CrNP/S7Lb/w4NC/8RFhj/EhcY/wsLCv9FRUX/RUVF/0VFRf9FRUX/MTEx/wAA
+ AP8oKCj/NjY2/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/1FRUf/Q0ND/DQ0N/wICAv82Njb/NjY2/yoq
+ Kv9jwuz/Wrzn/1C34f9HsNv/PanT/xCWyv8RmdD/EBAQ/xAQEP8QEhL/EBIT/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2lpaf/+/v7//////wgI
+ CP82Njb/HR0d/xWl5P8Uod7/E57Y/xac0v8/q9X/EJfL/xGa0f8Tntj/FKHe/xAQEP8RKjX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE////
+ ////////5+fn/0VFRf8BAQH/FaXl/xSh3/8Tntn/EprS/xCXzP8Ql8v/EprS/xOe2f8Uod//EA8P/xao
+ 6v8BAQH/RUVF/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/ygoKP9ERET/RUVF/wAKDf8Wpub/FKLg/xOf2v8SmtP/EJfM/xCXy/8SmtL/E57Z/xSh
+ 3/8VpeX/F6nr/wU1TP9FRUX/AAAA/yos0P9FRUX/RUVF/0VFRf9FRUX/Li4u/wAAAP8AAAD/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf8CAgL/AAAA/wAAAP85OTn/F6jr/xam5v8UouD/E5/a/xKa0/8Ql8z/EJfL/xKb
+ 0v8Tntj/FKHf/xWl5f9wyfL/eM/2/yEhIf8AAAD/MTPX/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/zY2Nv9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP9syPL/FaXl/xSi4P8Tntn/EprT/xCW
+ zP8Qlcr/EZnR/xOd1/9Uuub/ZMPt/23H8f92zfX/AwkM/wAAAP82ONn/KizR/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RUVF/0VFRf9ERET/cMv1/2fG8f9fwe3/FKHf/xOe
+ 2P8SmtL/EJbL/xCWyf8Rmc//TrTg/1i85v9gwev/acbw/wAAAP8sLtb/KSvN/zY42f8xM9f/MjIy/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RkZG/1WXtf9tyvT/ZcTw/1y/
+ 6/9Tuub/EZ3X/xGZ0P8Qlsr/OafR/0Kt2P9Ls97/U7nk/1y+6f9lxO7/bcny/wAAAP8sLtb/MDLX/zEz
+ 1/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/1BQUP8oR1X/ccz2/2nI
+ 8/9gw+//WL3p/0+45P9Fst7/PqzY/xCUyP82pM7/PqrV/0ex3P9PtuL/V7zn/wAAAP8AAAD/AAAA/x4f
+ lP8pK8r/LC7W/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf8CAgL/Ga/2/3PM
+ 9v9rw+v/QYyl/zyJov82hZ//MYGb/yt8l/8neZL/oaKi/zKiy/86qNP/Qq7Z/0q03/8AAAD/OTo3/zk6
+ N/85Ojf/OTo3/yMkdf8qLM7/MDLX/ywu1v8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/AAgM/xmu
+ 9f8YrPL/F6vv//7+/v/////////////////////////////////7+/v/Lp7I/zakz/89q9b/RbHc/zk6
+ N/9DREH/Q0RB/0NEQf9DREH/P0A9/yQkIv8xM9f/Ky3V/zI02P81N9j/Ky3S/yst0v8sLtb/LzAt/zk6
+ N/8KCgr/AAAA/xer7/8XqOv/mZqa//////8AAAD/Pz8//7+/v//5+fn///////v7+/8pnMT/MaHK/zen
+ 0v8/rNf/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JDQP8xMS//MTEv/zExL/8xMS//MTEv/zk6
+ N/8+Pzz/QkNA/zk6N/85Ojf/AAAA/xan5/91dnb//////wAAAP//////AAAA//////9/f3//+vr6/ySX
+ v/8rnsf/MqLN/zmo0/8AAAD/Q0RB/0t1nf9RmuP/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/AAAA/5aWlv///////////wkJCf8AAAD/X19f////
+ ///6+vr/H5O6/yaZwf8sn8n/M6PO/zmo1P8RmtD/AAAA/wAAAP9GWWn/Q0RB/09QTf9UVVL//////3N0
+ cv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NFRP8AAAD//v7+////////////AAAA/wAA
+ AP////////////n5+f8bjrX/IJS8/yeaw/8sn8r/M6PP/xCXzP8RmdD/EpzU/wAAAP9HXG//VFVS/1RV
+ Uv9UVVL/4ODg/6Sko/9DREH/Q0RB/0NEQf9Up/v/S3We/0NEQf9DREH/AAAA/xOe2f//////////////
+ //8AAAD/AAAA/wAAAP//////+Pj4/xaKsP8bj7b/IZS9/yaaw/8OkcL/D5TG/xCWy/8RmM//EprT/0NE
+ Qf9UVVL/VFVS/1RVUv9NTkv/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/Mn2c/xOe2f8Sndb/EprT////
+ //////////////////8AAAD////////////4+Pj/EYer/xaKsf8aj7f/DIu3/w2OvP8OkcH/D5PF/xCV
+ yf8RmM3/AAAA/1RVUv9UVVL///////////9DREH/Q0RB/0dcb/8udpb/RbLh/0Ox3/9Ar93/EprT/xGZ
+ 0P8Klc7/WW1z/21ra/94cnL/bGts/1drcP8cj7T/FIqw/w+Gqv8MgaT/EYer/xGJr/8LiLL/DIq2/w2N
+ u/8OkL//D5LD/w+Ux/8Oibj/Rllq/1RVUv9UVVL/Q0RB/0NEQf9Up/v/AAAA/z2u2/89rdr/OqvZ/zep
+ 1/8RmM3/EJbK/w+Ux/8PksT/DpDA/w2OvP8Mi7f/C4iy/wqGrv8Phqv/CoGl/wh9n/8MgaT/CYOo/wqE
+ rP8Lh7H/DIq1/w2Muf8Njr3/DpDA/w+Sw/8AAAD/T4vI/0psjf9DRED/UZfe/wAAAP81qNX/NKfU/zOm
+ 0/8xpNH/L6LP/yygzf8PksT/DpHB/w2Ovf8Njbn/DIq1/wuIsf8KhK3/CYOo/wqCpf8Ifp//AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQEB/wwMDP8PDxr/DBIU/xMU
+ FP8SGRz/HBwc/w8eJf8ZGSv/EhM7/w0kLf8WICX/GyEj/xklKv8LKjf/Eycw/xQpMf8QKjX/HSsw/xYz
+ P/8cMDn/IyMj/yUnKP8rKyv/Li49/yMxOf80NDT/ODk2/zIyPP87Ozv/QUI//xESR/8SE0j/FBVd/wc3
+ S/8MN0z/BzlP/ww5Tv8RNUX/GjVA/xg7SP8HPFL/CD5U/y4vS/8vMEn/LT1M/zE8Rv8uLlP/FBVi/xgZ
+ df8uL27/JSdw/wlDXP8QRVz/JkJO/ypCUf8qS1z/NUpd/whKZf8KTGj/Eklh/xJQa/8JVXP/HVt3/zVN
+ Zf8hUmf/KlRm/yxXaP8wV2r/OVJp/yNacf8kX3j/Pmp+/0NEQ/9LS0r/RExQ/1NTU/9ZWlf/Ulha/1tb
+ W/9GVmL/Q1dp/0FbdP9CXnj/QWB+/0hkff9QY3P/ZGRj/2doZf9sbGv/cHFv/3Nzc/93eHb/fn5+/yAh
+ lv8qK5T/ISOj/ygqr/8mKLb/Jii6/yoru/8MYYb/DGWK/xZkhP8Ocp3/B32e/wl+n/8paoT/J22I/yl2
+ l/8IfqH/D3uo/xp9pf8Qeqr/RWaG/0pqiP9KbY3/TG6O/0J0i/8qLMX/Ky3P/ywu0/8uMNT/MTPW/zM1
+ 2P8IgKP/CYGm/wyCpf8Jg6j/CoSr/w+Gq/8PgK//CoWs/w2Hr/8bhKT/EYer/xCIr/8Lh7D/C4ix/wyJ
+ s/8MirX/DI26/w2OvP8RgrP/FIqw/xqPtv8Rjbz/DpC//xuQt/89i6b/PI6q/yCUvP8lmL//LJm9/0KG
+ nf9JiKP/Vo+i/16br/9DlrH/U5u7/1uevf8RjsP/DpDB/w+SxP8PlMb/EJLC/xyXw/8Qlsr/EZjO/xKa
+ 0/8endD/E57Y/yWZwv8qm8T/IpzK/y2fyf8xm8P/FKLf/y2izv81oMb/M6PN/zmkzP8ioNP/LKTT/yWl
+ 2/8optv/M6bT/zmm0f87qdP/O6zZ/xWk4v8bpuL/F6nr/xus7/8YrfL/JKvm/zux4/9PoML/RabO/1ur
+ zf9Cq9T/T6nQ/0Ou2P9Fsdz/S7Lb/1K13f9fuN//ZqnA/3i0yP96uM//arbZ/0Wz4f9OtuH/T7jl/0m6
+ 7v9Rt+D/VLnj/1q75P9Svev/W77p/2C/5v9dwOz/TsD0/1zC8P9iwev/bcfv/2XF8P9ox/H/bcny/4KC
+ gf+Li4v/lJST/5ubm/+jo6P/qquq/7S0tP+7u7v/v8C//4O6zf+YuML/hbvQ/5HA1f+ZwtT/mcTY/7DK
+ 1v+7093/w8PD/8nJyf/Q0ND/1Nrd/9nZ2f/m5ub/6+vr//Ly8v/8/Pz/AAAA/2lugIGFi4yNoqKjpaSn
+ p6enp6enp6Whjo6OiYmEgH1pfYCEhYyNk6OjpKeoqampqampqainp6enoY6NjImEgX2AgYqMjZOjpaep
+ qampq6urq6upq6mpqaeno6KOjYuEgIGKjI2TpaepqamrqGg+NCoqO2aPq6upqainpKKOjIuEiIyTk6So
+ qampbyMISldcXV1bTx0HO6GrqamnpI6OjIqZmaakqKipqToEW+jp6+vs7OxdV1pPS2erq6inp6KOkLC1
+ xry3qakqFRtM7ff39/f39lvq509PFySrq6mnrq2ts7XIzc7ZbRUaHklZ9vf39/fo6FcWFUwbFju4vczI
+ tbC1yMzN2eAZGklJSUlN6ff39+VKFRUWTElJBsXXzMq8tLXJzNjZxwwdSUkbHUkeT+bqTFtdXVtcWE0X
+ Q9vXzMi7u8rN2Z+bF0pJSRweHRxJHRcV6ezs7Ozt7EkZ4NnMyrXIzNjFBTYaHRwaHkkdGx4VAAAAT+z2
+ 9+pJSQzc2NTIvMjMQzg2Ax5JSR4VBgYaSQAAAAAAT+nnHRodFdnZ1Mu8qKgRBSYDG0lKSUpJGgYBAAAA
+ AAABXfb+Vx0Wvr+4ubenqZKPBTUXSUlJSUlKSRoAAAAAAAAG7P7oSRS+vqupp6epqbE9vhQbAhdJSklJ
+ FQAAAAAABAEBW0xJPMCxq6mop6ixscDAPx0JMRdJSUkVAAQBAQZJHgQAAAZvvr6rqaeoqam+w93SFgh6
+ Hx1KSUlJSUlKFx1JShcBD9bAvqupqKSpscTg5KANCXteGklJSUlKSUlJBElJSReg4tq4q6mnp7bU2ODh
+ RDBge2QVSUpJSUlJSkkaBkkbdOTi29q5qai0yszY3eDkOHd6YRdJSUlKSUlJSR4EF0jh3ODa1cu3pbS8
+ y9XJQhIGM3hjHwweSUlJSklKSg1o3vCcmpWWlZ3vtLzLxgsaHR0bMnp6YSEJCAgIFRUlq8LC9f78/fz7
+ 6/6ytMhrLh5JSR4dK193fHt7emQvFwYlp8Dz+lvo6Oft/q20umtAVUkeSUkeHhocLCwcGx4eHRsFofH+
+ 5eVa5+j+l620uigZc3RLHh5J6krlSUkeSR5JHhs08v7860zo/v6Xra+0vHAqC1RLSk3n6ehJHkkeSR5L
+ Uyr0/v7mWeX+/pSXrbKuqKihDlFMTObmWUlJUHNyckALcfn+/kkAAPf+kJSXrKWnqKloN0xb9vZbSUst
+ JkFGZqGt/v7+6lfn/v2HkJSSjqKlp6cPVlv+/lxJOUbUy8SqqbDR8PDu0M+ehn+HiIqMjY6jpD5FTldY
+ SVImvb29vKqnpKWijoyLiYd+an+AhIqMjY6ijgpUdXNTELC6urq3rqOijo2MioSAfm4AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
+ AAAYAAAAMAAAAAEAIAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAHfZ//CYGl/wqEq/8Lh7H/DIq2/w2O
+ u/8OkMD/D5LE/w+Ux/8Qlcn/EJbL/xCWzP8Qlsz/EJfL/xCWyv8QlMf/D5LE/w6Rwf8Njrz/DIu3/wuH
+ sf8KhKv/CYKm/wh+oP8JgaX/CoSr/wuIsv8NjLj/Do++/w+SxP8Qlsn/EZfM/xGY0P8SmtL/EpvU/xKc
+ 1f8SnNX/EpvU/xKa0v8RmdD/EZfN/xCVyf8PksT/DpC//w2Nuf8LiLP/CoSs/wmCpv8KhKv/C4iy/w2M
+ uf8OkMD/D5TG/xCWy/8RmdD/EpzV/xOe2P8Tn9v/FKHc/xCNwf8Untn/FKHd/xOf2/8Tntj/EpzV/xGZ
+ 0f8Qlsz/D5TH/w6Rwf8Njbr/C4iz/wqErP8Lh7H/DYy4/w6QwP8PlMf/EZfN/xKa0/8Tntj/AAoM/wAA
+ AP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/5ycnP8AAAD/C2yV/xOe2f8Sm9T/EZjO/xCVyP8OkcH/DY25/wuI
+ sv8vm8H/OaTK/xGUxv8Rl83/EpvU/xOf2v8AAAD/NTU1/52dnf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6io
+ qP+oqKj/qKio/6Kiov8Tn9r/EpzV/xGYzv8PlMf/DpC//ySWvv81oMf/QKnQ/0uw2P9XueD/Yb7m/wAA
+ AP81NTX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/AwMD/6ioqP8kJCT/JCQk/0JCQv8AAAD/E5/b/w2Y
+ 0/9Hrtj/O6bQ/zCfx/85pMz/Rq3V/1G03f9evOT/acTs/zU1Nf9FRUX/RUVF/0VFRf9FRUX/ycnJ/8nJ
+ yf/Jycn/p6en/yQkJP8kJCT/Gxsb/0VFRf9FRUX/AAAA/1m75P9Ns93/QqzV/zajy/8/qdD/S7HZ/1e4
+ 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
+ K/8cLTX/ES05/x8xOP8hISH/IiQj/yQkJP8nJyr/LCws/yIiOP8uMTL/KDc9/zQ0NP8wNzz/Nzc8/zk5
+ Of89Pjv/PT09/z9APf9AQT7/GBlL/xobU/8ZGln/FjVC/xs3RP8fO0z/JTpE/yM6Sf8kPkj/ID1N/yY9
+ Tf8zM0T/NT5B/zQ1SP8xMlT/IiN4/xZBVv8XSF7/IkBO/yhIVv82SFD/Mkda/zJJXv8zUFz/DUhh/xJP
+ av8MUWz/ElBq/wpUdP8LWHn/Dlp5/wtef/80TWT/KlVm/zBVav8/V23/QUJB/0NEQf9ERUL/REVF/0xN
+ Sv9OTkz/QE9c/0xSVv9FUFj/UVFR/1RUVP9YWVb/Wlpa/11dXP9GVWH/QFhu/0dcbv9GXnT/W2Bh/0hg
+ df9MZn3/YmJi/2pqav9ubm3/cXFx/3Z2dv96enr/IiOe/yosm/8jJKn/Jym2/ycpv/8pK7//DGGF/w9m
+ jf8MaI7/EWWL/wh+n/8qaIL/KHKP/z1wh/8/d47/JHKS/zF9nP8JfqD/Dnqm/xF3p/8Sfq3/R3qS/ywu
+ yv8uMM3/LzHV/zM12P8JgaX/DIOn/wqDqP8KhKv/DoWp/w+Ar/8Khaz/EIWp/xaJrv8fi6//D4Gx/wuI
+ sv8Ni7b/DIy5/w2Ovf8Qg7T/Fouw/xWNtP8OkL//HJG4/x2TvP8vhaf/MoKi/zeHqf8qkrf/I5a+/yWU
+ vv8ukbj/LJa8/0yXuP8XjsD/DpDB/w+TxP8PlMb/FJPB/xGQxf8Qlcf/FJXH/xuTwP8Qlsn/FJbI/xCX
+ zP8RmM3/FZrO/xmbzv8Ul9D/EpvT/xOe2P8hl8D/JZjB/y+cwf8qnMT/JZ/N/yyeyP8on8z/MZ/G/zCc
+ yP8Uod7/HaXf/zWhx/8woMr/NaLJ/zOjzv82o8z/NqTO/zqlzP8tptj/MaXS/zSl0P8xotb/OqbQ/zWo
+ 1f85qNP/PajR/z2q1v84q9n/ParY/z+v3f8Wpub/F6rt/zu06v8qs/L/V5/A/1qoy/9Cq9P/Q67Y/1Or
+ 0P9GsNv/S7Lc/1ix1v9Ttd7/WbXc/0Kz4/9PuOX/T7zr/1O34P9UueP/W7zk/2O84/9dwOv/Y8Pt/2rI
+ 8v9zy/P/gYGB/4SEgv+Ghob/iYmI/4yMi/+NjY3/kJCQ/5WVlf+bm5v/k7G7/6Ghof+lpaT/qKin/6qq
+ qv+0tLT/urq6/5G1wP+kwcr/rsfR/63Q3/+61N//tdTi/8PDw//FxcX/yMjI/87Pz//J2t//0NDQ/9ra
+ 2f/a4eT/3ePl//r6+v//////AAAA/2d3eoKDhZaanp6goKCgoJualoWDgnl3Z3d6goSWl56gpKWlpqWl
+ paWgnpeWhIN6eHuChIWYoKWlpXBjOjxkhqWlpaGYloSDfYiEiZukpZU2Kldc4eBbTAs6pKWknpaEgqmy
+ raKlcQRF6+319vboXORZMnGloJuZi7LLz9fBCRZCWvX29vbh3hYWHQqVucG/rLjL0dhrFkNFQk/p9vZL
+ EBBFHEIx2M/LuMDP2Nk1HUUZGxsbS1lX7Ozr5uAI0tbOuMvPzSQVHBsZRBkbEgABV+317EwWlNfPwb9t
+ JA0ORUUZEA4WAgAAAE/rXBYZjtXPwKB8NwwKRUVFRUUSAAAAABRM/lsYhqamo6ClpTlkGQUbRUUbAAAA
+ AAEC4E8UsMWlpaGlsMW8FCAeQkVCARADA0UWAQAvxbGloaGlsdXdNSBiEkVFRUVFGxJFQgPKx7CloZ65
+ 19vJB112E0VFRUVFRRAZG3Lc29OmoLvO1NrZQGF1BkVEREVFRUICa9nQ1s/Bi7vMzz8PEixzXx8RFBYW
+ QiRxyPDv7u7n+7O/jRdCQx0sXnN0YF8tDiFwxvPp7Ovl/aq1jjNVRUNDHB0pKxgaHRoSZPH15Vzp/pGz
+ u2kiPlJERuriT0NDQ0NFLvL+6Uv1/YqorKuhbyNJTeHfR0NSU0E0PPv+5BBa/YeKp5eeoT1QWfrqQ0gw
+ aGyBr/7++eP3+H6Hg4SJm4koVO3jSifDzsKhn5GTj4B/e254fYKEhZY4QVZTJZK+urqfloWEgn15bgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAA
+ AAAAAAAAAAAAAAAAAAAIf6L/CoSr/wyJtP8Njrz/D5LD/xCVyP8Ql8z/EZjO/xGYzv8Ql8z/EJbJ/w+S
+ xP8Njr3/DIq1/wqErP8IgKP/CoSr/wyKtv8OkMD/EJXI/xGZ0P8SnNX/E57Z/xOg2/8ToNv/E57Z/xKc
+ 1v8RmdD/EJXJ/w6QwP8Mirb/CoWs/xKMtf8OkMD/EJbK/xKb0/8Tn9r/RUVF/52dnf+dnZ3/nZ2d/52d
+ nf8DAwP/FKDb/xKb1P8Qlsv/DpHB/wyKtf82ocf/R63V/1e54P8DIS3/NTU1/0VFRf/Jycn/ycnJ/8nJ
+ yf+oqKj/JCQk/zw8PP8ABwn/EpzU/0Os1P8zoMf/PqjP/1C03P9iwOf/NTU1/0VFRf82Njb/RUVF/8nJ
+ yf/Jycn/JCQk/yQkJP9FRUX/RUVF/12+5/9Lstz/OaTO/0St1f9XueL/acXs/0VFRf9FRUX/RERE/zY2
+ Nv85OTn/AAAA/7u7u/+7u7v/u7u7/0NDQ/9jwer/Urji/0Cr1P8updL/EBAQ/xAQEP9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/DAwM//Ly8v82Njb/Ah0p/1a65P9CrNf/EZjO/xSg3P8QERH/RUVF/0VF
+ Rf9FRUX/RUVF/xEREf8AAAD/AAAA/wAAAP/+/v7/RUVF/xan6P8Uod3/EZnP/xGYzv8UoNz/Fqfo/wAA
+ AP8qLND/RUVF/0VFRf8AAAD/RUVF/0VFRf9FRUX/JCQk/wAAAP8WqOn/FKHd/xGZz/8RmM3/Vbnk/2bF
+ 7/8AAAD/LC7W/wAAAP9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf90zvj/Y8Tv/xOf2/8RmM7/O6nT/021
+ 4P9dwOv/bsnz/yst1f8AAAD/RUVF/0VFRf9FRUX/RUVF/05OTv8jg6z/RY6n/1q/6/9JtOD/N6fT/zSj
+ zf9Cr9v/OTo3/0NEQf85Ojf/LC7W/ywu1v8sLtb/LC7W/wAAAP8YrvT/F6vv////////////////////
+ //8qncX/OajT/0NEQf9DREH/Q0RB/0NEQf9DREH/Pj88/0NEQf9DREH/Q0RB/wAAAP///////////39/
+ f///////IJS7/yyfyf8loND/EpzV/0pukv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0t1nf8AAAD/////////
+ //8AAAD//////xaKsP8glL3/DpHB/xCWyv8AAAD/VFVS//////9DREH/Q0RB/0m24/8npdr/EprS////
+ //////////////n5+f8MgaT/CoWt/wyKtv8Oj77/D5PF/1Sn+/9DREH/VKf7/zmq2P82qdb/MqbS/w+T
+ xf8OkL//DIq2/wqFrf8KgaX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAD/Dw8P/w8UFv8VFRX/FSgw/yMjI/8lJSX/KSkp/yoqKv8rKyv/Jygy/ywwMv8vMTL/LzU3/zIy
+ Mv8zMzP/MjI0/zA2OP8wMD7/ODg4/zk6Ov86Ojr/Ozs7/zw8PP8+Pzz/Pz8//z9APf9BQj//HjpF/zk6
+ SP8cHWz/Jyho/yIjdv8iI3r/GUhc/y9HWP84TFX/NkpZ/zJMXP81TFz/N0xc/z9QXv8SSmT/HU5n/xNS
+ bf8PXn//ElRx/xdcev8ZXHn/Lkxt/zNWZ/86XW3/NWBy/0BAQP9BQUH/QkJB/0NDQ/9DRkX/RERE/0VF
+ Rf9GRkb/REhJ/09PT/9JSlb/TFpf/1BQUP9TVFH/VldZ/1hYWP9bXVv/XFxc/11dXf9fX1//RVZl/1lq
+ eP9gYGD/YmJi/2RlYv9iZ2n/b29v/3Fxcf99fX3/IySE/yYno/8sLaL/Jiis/ykrtv8RYoP/DW+Y/w5x
+ m/8WcZn/LmmD/zFxjv8gd5z/MXua/wh/ov9AdYz/CICj/wuCpf8NgqX/CoSr/w2Brf8Khaz/C4au/wyG
+ rf8PgbD/DIq1/w2Ltf8Njrz/Do++/xaLsf8Qh7n/DpC//xySuf8ck7z/IoSt/y6IrP8glLz/Mpe+/0yC
+ mv91lJ//S5u8/w6QwP8PkcL/D5LD/w+SxP8PlMb/EpLB/xOTyf8Qlcn/EJbK/xCXzP8Rl8z/EZjO/xWZ
+ zv8RmdD/EprT/xKb1P8SnNX/IJfH/yKXxP8qnMX/LZ/J/zCfx/87msD/FKDc/zeiyP80pM3/OqbP/z6o
+ z/8hotf/KaLQ/yyj0v8uo9D/IqDZ/yup3v82qNX/N6nW/zmo0/8/q9T/Pa3b/xel5v8rr+r/O6/h/zyw
+ 4P9EocX/TqDD/02jxP9OpMf/RK3V/0Wt1f9Lstz/U7LY/1C03P9qstD/TbXg/1K44f9eueD/X8Lu/2fF
+ 7/+AgID/hoaG/46Ojv+SkpL/k5SS/5mZmf+ampr/n5+f/6SkpP+oqKj/s7Oz/7m5uf+8vLz/v7+//5PC
+ 0f+tyNL/vdvm/8fHx//Jycn/2tra/9/f3//L2+P/yuDq/+Tk5P/g6ez/8PDw/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/YWZqbHyBg4WFhIF9bGpnYWZqeoGHiWlYWW+Kh4J7amZxf4KKLUC0urpIJF2Jg39rkqqgMA9Q
+ xcbAtUE6LJaYj5WtsQs6GUu7t0Q+RxR5q5SprDQTFxoTEwNPwMBMYLCfmBwENTgOBwMAAEy8N1ujnIWA
+ LhEQOzsDAAABtkZakYeFkaIzHhI7CAkGNgUCmpGHhqSzMVMfOzs6Owg3d7KbhZ6vpjJWIBU7PDwMXK6o
+ paeTkA0aHVRVUiEKKqHJv8HHjXYjSTk3Qz8XGxgiyr1Ry3WOjFcnQrhNPUkpK8y+Fs1ucnyCL07IRSZe
+ c4vEw3jCY2hqbWUoSiV0nZd+cGpnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+
+
+
\ No newline at end of file
diff --git a/ABStudio/Forms/NumUpDownAskForm.Designer.cs b/ABStudio/Forms/NumUpDownAskForm.Designer.cs
new file mode 100644
index 0000000..130d78a
--- /dev/null
+++ b/ABStudio/Forms/NumUpDownAskForm.Designer.cs
@@ -0,0 +1,78 @@
+
+namespace ABStudio.Forms
+{
+ partial class NumUpDownAskForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.okButton = new System.Windows.Forms.Button();
+ this.questionNumUpDown = new System.Windows.Forms.NumericUpDown();
+ ((System.ComponentModel.ISupportInitialize)(this.questionNumUpDown)).BeginInit();
+ this.SuspendLayout();
+ //
+ // okButton
+ //
+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.okButton.Location = new System.Drawing.Point(131, 39);
+ this.okButton.Name = "okButton";
+ this.okButton.Size = new System.Drawing.Size(75, 23);
+ this.okButton.TabIndex = 1;
+ this.okButton.Text = "OK";
+ this.okButton.UseVisualStyleBackColor = true;
+ //
+ // questionNumUpDown
+ //
+ this.questionNumUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.questionNumUpDown.Location = new System.Drawing.Point(12, 13);
+ this.questionNumUpDown.Name = "questionNumUpDown";
+ this.questionNumUpDown.Size = new System.Drawing.Size(317, 20);
+ this.questionNumUpDown.TabIndex = 2;
+ //
+ // NumUpDownAskForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(341, 74);
+ this.Controls.Add(this.questionNumUpDown);
+ this.Controls.Add(this.okButton);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "NumUpDownAskForm";
+ this.ShowIcon = false;
+ this.Text = "Question";
+ ((System.ComponentModel.ISupportInitialize)(this.questionNumUpDown)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Button okButton;
+ private System.Windows.Forms.NumericUpDown questionNumUpDown;
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Forms/NumUpDownAskForm.cs b/ABStudio/Forms/NumUpDownAskForm.cs
new file mode 100644
index 0000000..41fa343
--- /dev/null
+++ b/ABStudio/Forms/NumUpDownAskForm.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ABStudio.Forms
+{
+ public partial class NumUpDownAskForm : Form
+ {
+ public string Title
+ {
+ set => this.Text = value;
+ }
+ public decimal NumValue
+ {
+ get => questionNumUpDown.Value;
+ set => questionNumUpDown.Value = value;
+ }
+
+ public NumUpDownAskForm(decimal defaultValue, decimal minValue, decimal maxValue, decimal increment=1.0m)
+ {
+ InitializeComponent();
+
+ questionNumUpDown.DecimalPlaces = BitConverter.GetBytes(decimal.GetBits(increment)[3])[2]; // https://stackoverflow.com/a/13493771
+
+ if (increment == 1)
+ questionNumUpDown.DecimalPlaces = 0;
+
+ questionNumUpDown.Increment = increment;
+ questionNumUpDown.Minimum = minValue;
+ questionNumUpDown.Maximum = maxValue;
+ questionNumUpDown.Value = defaultValue;
+ }
+ }
+}
diff --git a/ABStudio/Forms/SpritesheetEditor.Designer.cs b/ABStudio/Forms/SpritesheetEditor.Designer.cs
new file mode 100644
index 0000000..005363d
--- /dev/null
+++ b/ABStudio/Forms/SpritesheetEditor.Designer.cs
@@ -0,0 +1,777 @@
+
+namespace ABStudio.Forms
+{
+ partial class SpritesheetEditor
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SpritesheetEditor));
+ this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openHereToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openInNewInstanceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.importSpritesheetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.importSpritesFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.exportSpritesheetImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.exportCroppedSpritesheetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.clearAllSpritesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.propertiesGroupBox = new System.Windows.Forms.GroupBox();
+ this.selectedSpriteGroupBox = new System.Windows.Forms.GroupBox();
+ this.spriteOrigPtMapLabel = new System.Windows.Forms.Label();
+ this.spriteOrigPtMapBRButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapBButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapBLButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapTRButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapTButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapTLButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapRButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapCButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtMapLButton = new System.Windows.Forms.Button();
+ this.spriteOrigPtLabel = new System.Windows.Forms.Label();
+ this.spriteOrigPtYLabel = new System.Windows.Forms.Label();
+ this.spriteOrigPtXLabel = new System.Windows.Forms.Label();
+ this.spriteOrigPtYNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteOrigPtXNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteRectHLabel = new System.Windows.Forms.Label();
+ this.spriteRectWLabel = new System.Windows.Forms.Label();
+ this.spriteRectHNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteRectWNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteRectLabel = new System.Windows.Forms.Label();
+ this.spriteRectYLabel = new System.Windows.Forms.Label();
+ this.spriteRectXLabel = new System.Windows.Forms.Label();
+ this.spriteRectYNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteRectXNumUpDown = new System.Windows.Forms.NumericUpDown();
+ this.spriteNameLabel = new System.Windows.Forms.Label();
+ this.spriteNameTextBox = new System.Windows.Forms.TextBox();
+ this.reloadPictureButton = new System.Windows.Forms.Button();
+ this.filenameLabel = new System.Windows.Forms.Label();
+ this.filenameTextBox = new System.Windows.Forms.TextBox();
+ this.imageViewPanel = new ABStudio.Controls.CustomPanel();
+ this.insideViewPanel = new System.Windows.Forms.Panel();
+ this.spritesheetPictureBox = new ABStudio.Controls.PictureBoxDB();
+ this.menuStrip1.SuspendLayout();
+ this.propertiesGroupBox.SuspendLayout();
+ this.selectedSpriteGroupBox.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtYNumUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtXNumUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectHNumUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectWNumUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectYNumUpDown)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectXNumUpDown)).BeginInit();
+ this.imageViewPanel.SuspendLayout();
+ this.insideViewPanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.spritesheetPictureBox)).BeginInit();
+ this.SuspendLayout();
+ //
+ // menuStrip1
+ //
+ this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.editToolStripMenuItem,
+ this.helpToolStripMenuItem});
+ this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip1.Name = "menuStrip1";
+ this.menuStrip1.Size = new System.Drawing.Size(931, 24);
+ this.menuStrip1.TabIndex = 1;
+ this.menuStrip1.Text = "menuStrip";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.newToolStripMenuItem,
+ this.openToolStripMenuItem,
+ this.saveToolStripMenuItem,
+ this.saveAsToolStripMenuItem,
+ this.toolStripSeparator1,
+ this.importToolStripMenuItem,
+ this.exportToolStripMenuItem,
+ this.toolStripSeparator2,
+ this.exitToolStripMenuItem});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.fileToolStripMenuItem.Text = "File";
+ //
+ // newToolStripMenuItem
+ //
+ this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+ this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+ this.newToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.newToolStripMenuItem.Text = "New";
+ this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click);
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.openHereToolStripMenuItem,
+ this.openInNewInstanceToolStripMenuItem});
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.openToolStripMenuItem.Text = "Open...";
+ //
+ // openHereToolStripMenuItem
+ //
+ this.openHereToolStripMenuItem.Name = "openHereToolStripMenuItem";
+ this.openHereToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+ this.openHereToolStripMenuItem.Size = new System.Drawing.Size(227, 22);
+ this.openHereToolStripMenuItem.Text = "Here";
+ this.openHereToolStripMenuItem.Click += new System.EventHandler(this.openHereToolStripMenuItem_Click);
+ //
+ // openInNewInstanceToolStripMenuItem
+ //
+ this.openInNewInstanceToolStripMenuItem.Name = "openInNewInstanceToolStripMenuItem";
+ this.openInNewInstanceToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.O)));
+ this.openInNewInstanceToolStripMenuItem.Size = new System.Drawing.Size(227, 22);
+ this.openInNewInstanceToolStripMenuItem.Text = "In new instance";
+ this.openInNewInstanceToolStripMenuItem.Click += new System.EventHandler(this.openInNewInstanceToolStripMenuItem_Click);
+ //
+ // saveToolStripMenuItem
+ //
+ this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+ this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+ this.saveToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.saveToolStripMenuItem.Text = "Save";
+ this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+ //
+ // saveAsToolStripMenuItem
+ //
+ this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+ this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.S)));
+ this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.saveAsToolStripMenuItem.Text = "Save As...";
+ this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(188, 6);
+ //
+ // importToolStripMenuItem
+ //
+ this.importToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.importSpritesheetToolStripMenuItem,
+ this.importSpritesFolderToolStripMenuItem});
+ this.importToolStripMenuItem.Name = "importToolStripMenuItem";
+ this.importToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.importToolStripMenuItem.Text = "Import...";
+ //
+ // importSpritesheetToolStripMenuItem
+ //
+ this.importSpritesheetToolStripMenuItem.Name = "importSpritesheetToolStripMenuItem";
+ this.importSpritesheetToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)));
+ this.importSpritesheetToolStripMenuItem.Size = new System.Drawing.Size(208, 22);
+ this.importSpritesheetToolStripMenuItem.Text = "Spritesheet";
+ this.importSpritesheetToolStripMenuItem.Click += new System.EventHandler(this.importSpritesheetToolStripMenuItem_Click);
+ //
+ // importSpritesFolderToolStripMenuItem
+ //
+ this.importSpritesFolderToolStripMenuItem.Name = "importSpritesFolderToolStripMenuItem";
+ this.importSpritesFolderToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.I)));
+ this.importSpritesFolderToolStripMenuItem.Size = new System.Drawing.Size(208, 22);
+ this.importSpritesFolderToolStripMenuItem.Text = "Sprites folder";
+ this.importSpritesFolderToolStripMenuItem.Click += new System.EventHandler(this.importSpritesFolderToolStripMenuItem_Click);
+ //
+ // exportToolStripMenuItem
+ //
+ this.exportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.exportSpritesheetImageToolStripMenuItem,
+ this.exportCroppedSpritesheetToolStripMenuItem});
+ this.exportToolStripMenuItem.Name = "exportToolStripMenuItem";
+ this.exportToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.exportToolStripMenuItem.Text = "Export...";
+ //
+ // exportSpritesheetImageToolStripMenuItem
+ //
+ this.exportSpritesheetImageToolStripMenuItem.Name = "exportSpritesheetImageToolStripMenuItem";
+ this.exportSpritesheetImageToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
+ this.exportSpritesheetImageToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
+ this.exportSpritesheetImageToolStripMenuItem.Text = "Spritesheet to image";
+ this.exportSpritesheetImageToolStripMenuItem.Click += new System.EventHandler(this.exportSpritesheetImageToolStripMenuItem_Click);
+ //
+ // exportCroppedSpritesheetToolStripMenuItem
+ //
+ this.exportCroppedSpritesheetToolStripMenuItem.Name = "exportCroppedSpritesheetToolStripMenuItem";
+ this.exportCroppedSpritesheetToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.E)));
+ this.exportCroppedSpritesheetToolStripMenuItem.Size = new System.Drawing.Size(248, 22);
+ this.exportCroppedSpritesheetToolStripMenuItem.Text = "Cropped spritesheet";
+ this.exportCroppedSpritesheetToolStripMenuItem.Click += new System.EventHandler(this.exportCroppedSpritesheetToolStripMenuItem_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(188, 6);
+ //
+ // exitToolStripMenuItem
+ //
+ this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ this.exitToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q)));
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+ this.exitToolStripMenuItem.Text = "Exit";
+ this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
+ //
+ // editToolStripMenuItem
+ //
+ this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.clearAllSpritesToolStripMenuItem});
+ this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+ this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
+ this.editToolStripMenuItem.Text = "Edit";
+ //
+ // clearAllSpritesToolStripMenuItem
+ //
+ this.clearAllSpritesToolStripMenuItem.Name = "clearAllSpritesToolStripMenuItem";
+ this.clearAllSpritesToolStripMenuItem.Size = new System.Drawing.Size(153, 22);
+ this.clearAllSpritesToolStripMenuItem.Text = "Clear all sprites";
+ this.clearAllSpritesToolStripMenuItem.Click += new System.EventHandler(this.clearAllSpritesToolStripMenuItem_Click);
+ //
+ // helpToolStripMenuItem
+ //
+ this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.aboutToolStripMenuItem});
+ this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+ this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
+ this.helpToolStripMenuItem.Text = "Help";
+ //
+ // aboutToolStripMenuItem
+ //
+ this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+ this.aboutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.H)));
+ this.aboutToolStripMenuItem.Size = new System.Drawing.Size(150, 22);
+ this.aboutToolStripMenuItem.Text = "About";
+ this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+ //
+ // propertiesGroupBox
+ //
+ this.propertiesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.propertiesGroupBox.Controls.Add(this.selectedSpriteGroupBox);
+ this.propertiesGroupBox.Controls.Add(this.reloadPictureButton);
+ this.propertiesGroupBox.Controls.Add(this.filenameLabel);
+ this.propertiesGroupBox.Controls.Add(this.filenameTextBox);
+ this.propertiesGroupBox.Location = new System.Drawing.Point(547, 27);
+ this.propertiesGroupBox.Name = "propertiesGroupBox";
+ this.propertiesGroupBox.Size = new System.Drawing.Size(372, 503);
+ this.propertiesGroupBox.TabIndex = 2;
+ this.propertiesGroupBox.TabStop = false;
+ this.propertiesGroupBox.Text = "Properties";
+ //
+ // selectedSpriteGroupBox
+ //
+ this.selectedSpriteGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBRButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapBLButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTRButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapTLButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapRButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapCButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtMapLButton);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtYLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtXLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtYNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteOrigPtXNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectHLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectWLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectHNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectWNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectYLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectXLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectYNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteRectXNumUpDown);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteNameLabel);
+ this.selectedSpriteGroupBox.Controls.Add(this.spriteNameTextBox);
+ this.selectedSpriteGroupBox.Location = new System.Drawing.Point(9, 65);
+ this.selectedSpriteGroupBox.Name = "selectedSpriteGroupBox";
+ this.selectedSpriteGroupBox.Size = new System.Drawing.Size(357, 432);
+ this.selectedSpriteGroupBox.TabIndex = 4;
+ this.selectedSpriteGroupBox.TabStop = false;
+ this.selectedSpriteGroupBox.Text = "Selected sprite";
+ //
+ // spriteOrigPtMapLabel
+ //
+ this.spriteOrigPtMapLabel.AutoSize = true;
+ this.spriteOrigPtMapLabel.Location = new System.Drawing.Point(229, 162);
+ this.spriteOrigPtMapLabel.Name = "spriteOrigPtMapLabel";
+ this.spriteOrigPtMapLabel.Size = new System.Drawing.Size(31, 13);
+ this.spriteOrigPtMapLabel.TabIndex = 26;
+ this.spriteOrigPtMapLabel.Text = "Map:";
+ //
+ // spriteOrigPtMapBRButton
+ //
+ this.spriteOrigPtMapBRButton.Location = new System.Drawing.Point(323, 215);
+ this.spriteOrigPtMapBRButton.Name = "spriteOrigPtMapBRButton";
+ this.spriteOrigPtMapBRButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapBRButton.TabIndex = 25;
+ this.spriteOrigPtMapBRButton.Text = "↘";
+ this.spriteOrigPtMapBRButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapBRButton.Click += new System.EventHandler(this.spriteOrigPtMapBRButton_Click);
+ //
+ // spriteOrigPtMapBButton
+ //
+ this.spriteOrigPtMapBButton.Location = new System.Drawing.Point(294, 215);
+ this.spriteOrigPtMapBButton.Name = "spriteOrigPtMapBButton";
+ this.spriteOrigPtMapBButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapBButton.TabIndex = 24;
+ this.spriteOrigPtMapBButton.Text = "↓";
+ this.spriteOrigPtMapBButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapBButton.Click += new System.EventHandler(this.spriteOrigPtMapBButton_Click);
+ //
+ // spriteOrigPtMapBLButton
+ //
+ this.spriteOrigPtMapBLButton.Location = new System.Drawing.Point(265, 215);
+ this.spriteOrigPtMapBLButton.Name = "spriteOrigPtMapBLButton";
+ this.spriteOrigPtMapBLButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapBLButton.TabIndex = 23;
+ this.spriteOrigPtMapBLButton.Text = "↙";
+ this.spriteOrigPtMapBLButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapBLButton.Click += new System.EventHandler(this.spriteOrigPtMapBLButton_Click);
+ //
+ // spriteOrigPtMapTRButton
+ //
+ this.spriteOrigPtMapTRButton.Location = new System.Drawing.Point(323, 157);
+ this.spriteOrigPtMapTRButton.Name = "spriteOrigPtMapTRButton";
+ this.spriteOrigPtMapTRButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapTRButton.TabIndex = 22;
+ this.spriteOrigPtMapTRButton.Text = "↗";
+ this.spriteOrigPtMapTRButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapTRButton.Click += new System.EventHandler(this.spriteOrigPtMapTRButton_Click);
+ //
+ // spriteOrigPtMapTButton
+ //
+ this.spriteOrigPtMapTButton.Location = new System.Drawing.Point(294, 157);
+ this.spriteOrigPtMapTButton.Name = "spriteOrigPtMapTButton";
+ this.spriteOrigPtMapTButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapTButton.TabIndex = 21;
+ this.spriteOrigPtMapTButton.Text = "↑";
+ this.spriteOrigPtMapTButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapTButton.Click += new System.EventHandler(this.spriteOrigPtMapTButton_Click);
+ //
+ // spriteOrigPtMapTLButton
+ //
+ this.spriteOrigPtMapTLButton.Location = new System.Drawing.Point(265, 157);
+ this.spriteOrigPtMapTLButton.Name = "spriteOrigPtMapTLButton";
+ this.spriteOrigPtMapTLButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapTLButton.TabIndex = 20;
+ this.spriteOrigPtMapTLButton.Text = "↖";
+ this.spriteOrigPtMapTLButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapTLButton.Click += new System.EventHandler(this.spriteOrigPtMapTLButton_Click);
+ //
+ // spriteOrigPtMapRButton
+ //
+ this.spriteOrigPtMapRButton.Location = new System.Drawing.Point(323, 186);
+ this.spriteOrigPtMapRButton.Name = "spriteOrigPtMapRButton";
+ this.spriteOrigPtMapRButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapRButton.TabIndex = 19;
+ this.spriteOrigPtMapRButton.Text = "→ ";
+ this.spriteOrigPtMapRButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapRButton.Click += new System.EventHandler(this.spriteOrigPtMapRButton_Click);
+ //
+ // spriteOrigPtMapCButton
+ //
+ this.spriteOrigPtMapCButton.Location = new System.Drawing.Point(294, 186);
+ this.spriteOrigPtMapCButton.Name = "spriteOrigPtMapCButton";
+ this.spriteOrigPtMapCButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapCButton.TabIndex = 18;
+ this.spriteOrigPtMapCButton.Text = "•";
+ this.spriteOrigPtMapCButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapCButton.Click += new System.EventHandler(this.spriteOrigPtMapCButton_Click);
+ //
+ // spriteOrigPtMapLButton
+ //
+ this.spriteOrigPtMapLButton.Location = new System.Drawing.Point(265, 186);
+ this.spriteOrigPtMapLButton.Name = "spriteOrigPtMapLButton";
+ this.spriteOrigPtMapLButton.Size = new System.Drawing.Size(23, 23);
+ this.spriteOrigPtMapLButton.TabIndex = 17;
+ this.spriteOrigPtMapLButton.Text = "←";
+ this.spriteOrigPtMapLButton.UseVisualStyleBackColor = true;
+ this.spriteOrigPtMapLButton.Click += new System.EventHandler(this.spriteOrigPtMapLButton_Click);
+ //
+ // spriteOrigPtLabel
+ //
+ this.spriteOrigPtLabel.AutoSize = true;
+ this.spriteOrigPtLabel.Location = new System.Drawing.Point(6, 133);
+ this.spriteOrigPtLabel.Name = "spriteOrigPtLabel";
+ this.spriteOrigPtLabel.Size = new System.Drawing.Size(63, 13);
+ this.spriteOrigPtLabel.TabIndex = 16;
+ this.spriteOrigPtLabel.Text = "Origin point:";
+ //
+ // spriteOrigPtYLabel
+ //
+ this.spriteOrigPtYLabel.AutoSize = true;
+ this.spriteOrigPtYLabel.Location = new System.Drawing.Point(243, 133);
+ this.spriteOrigPtYLabel.Name = "spriteOrigPtYLabel";
+ this.spriteOrigPtYLabel.Size = new System.Drawing.Size(17, 13);
+ this.spriteOrigPtYLabel.TabIndex = 15;
+ this.spriteOrigPtYLabel.Text = "Y:";
+ //
+ // spriteOrigPtXLabel
+ //
+ this.spriteOrigPtXLabel.AutoSize = true;
+ this.spriteOrigPtXLabel.Location = new System.Drawing.Point(105, 133);
+ this.spriteOrigPtXLabel.Name = "spriteOrigPtXLabel";
+ this.spriteOrigPtXLabel.Size = new System.Drawing.Size(17, 13);
+ this.spriteOrigPtXLabel.TabIndex = 14;
+ this.spriteOrigPtXLabel.Text = "X:";
+ //
+ // spriteOrigPtYNumUpDown
+ //
+ this.spriteOrigPtYNumUpDown.Location = new System.Drawing.Point(266, 131);
+ this.spriteOrigPtYNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteOrigPtYNumUpDown.Minimum = new decimal(new int[] {
+ 32768,
+ 0,
+ 0,
+ -2147483648});
+ this.spriteOrigPtYNumUpDown.Name = "spriteOrigPtYNumUpDown";
+ this.spriteOrigPtYNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteOrigPtYNumUpDown.TabIndex = 13;
+ this.spriteOrigPtYNumUpDown.ValueChanged += new System.EventHandler(this.spriteOrigPtYNumUpDown_ValueChanged);
+ //
+ // spriteOrigPtXNumUpDown
+ //
+ this.spriteOrigPtXNumUpDown.Location = new System.Drawing.Point(128, 131);
+ this.spriteOrigPtXNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteOrigPtXNumUpDown.Minimum = new decimal(new int[] {
+ 32768,
+ 0,
+ 0,
+ -2147483648});
+ this.spriteOrigPtXNumUpDown.Name = "spriteOrigPtXNumUpDown";
+ this.spriteOrigPtXNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteOrigPtXNumUpDown.TabIndex = 12;
+ this.spriteOrigPtXNumUpDown.ValueChanged += new System.EventHandler(this.spriteOrigPtXNumUpDown_ValueChanged);
+ //
+ // spriteRectHLabel
+ //
+ this.spriteRectHLabel.AutoSize = true;
+ this.spriteRectHLabel.Location = new System.Drawing.Point(219, 89);
+ this.spriteRectHLabel.Name = "spriteRectHLabel";
+ this.spriteRectHLabel.Size = new System.Drawing.Size(41, 13);
+ this.spriteRectHLabel.TabIndex = 11;
+ this.spriteRectHLabel.Text = "Height:";
+ //
+ // spriteRectWLabel
+ //
+ this.spriteRectWLabel.AutoSize = true;
+ this.spriteRectWLabel.Location = new System.Drawing.Point(84, 89);
+ this.spriteRectWLabel.Name = "spriteRectWLabel";
+ this.spriteRectWLabel.Size = new System.Drawing.Size(38, 13);
+ this.spriteRectWLabel.TabIndex = 10;
+ this.spriteRectWLabel.Text = "Width:";
+ //
+ // spriteRectHNumUpDown
+ //
+ this.spriteRectHNumUpDown.Location = new System.Drawing.Point(266, 87);
+ this.spriteRectHNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteRectHNumUpDown.Name = "spriteRectHNumUpDown";
+ this.spriteRectHNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteRectHNumUpDown.TabIndex = 9;
+ this.spriteRectHNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectHNumUpDown_ValueChanged);
+ //
+ // spriteRectWNumUpDown
+ //
+ this.spriteRectWNumUpDown.Location = new System.Drawing.Point(128, 87);
+ this.spriteRectWNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteRectWNumUpDown.Name = "spriteRectWNumUpDown";
+ this.spriteRectWNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteRectWNumUpDown.TabIndex = 8;
+ this.spriteRectWNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectWNumUpDown_ValueChanged);
+ //
+ // spriteRectLabel
+ //
+ this.spriteRectLabel.AutoSize = true;
+ this.spriteRectLabel.Location = new System.Drawing.Point(6, 63);
+ this.spriteRectLabel.Name = "spriteRectLabel";
+ this.spriteRectLabel.Size = new System.Drawing.Size(59, 13);
+ this.spriteRectLabel.TabIndex = 7;
+ this.spriteRectLabel.Text = "Rectangle:";
+ //
+ // spriteRectYLabel
+ //
+ this.spriteRectYLabel.AutoSize = true;
+ this.spriteRectYLabel.Location = new System.Drawing.Point(243, 63);
+ this.spriteRectYLabel.Name = "spriteRectYLabel";
+ this.spriteRectYLabel.Size = new System.Drawing.Size(17, 13);
+ this.spriteRectYLabel.TabIndex = 6;
+ this.spriteRectYLabel.Text = "Y:";
+ //
+ // spriteRectXLabel
+ //
+ this.spriteRectXLabel.AutoSize = true;
+ this.spriteRectXLabel.Location = new System.Drawing.Point(105, 63);
+ this.spriteRectXLabel.Name = "spriteRectXLabel";
+ this.spriteRectXLabel.Size = new System.Drawing.Size(17, 13);
+ this.spriteRectXLabel.TabIndex = 5;
+ this.spriteRectXLabel.Text = "X:";
+ //
+ // spriteRectYNumUpDown
+ //
+ this.spriteRectYNumUpDown.Location = new System.Drawing.Point(266, 61);
+ this.spriteRectYNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteRectYNumUpDown.Name = "spriteRectYNumUpDown";
+ this.spriteRectYNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteRectYNumUpDown.TabIndex = 4;
+ this.spriteRectYNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectYNumUpDown_ValueChanged);
+ //
+ // spriteRectXNumUpDown
+ //
+ this.spriteRectXNumUpDown.Location = new System.Drawing.Point(128, 61);
+ this.spriteRectXNumUpDown.Maximum = new decimal(new int[] {
+ 65535,
+ 0,
+ 0,
+ 0});
+ this.spriteRectXNumUpDown.Name = "spriteRectXNumUpDown";
+ this.spriteRectXNumUpDown.Size = new System.Drawing.Size(85, 20);
+ this.spriteRectXNumUpDown.TabIndex = 3;
+ this.spriteRectXNumUpDown.ValueChanged += new System.EventHandler(this.spriteRectXNumUpDown_ValueChanged);
+ //
+ // spriteNameLabel
+ //
+ this.spriteNameLabel.AutoSize = true;
+ this.spriteNameLabel.Location = new System.Drawing.Point(6, 22);
+ this.spriteNameLabel.Name = "spriteNameLabel";
+ this.spriteNameLabel.Size = new System.Drawing.Size(66, 13);
+ this.spriteNameLabel.TabIndex = 2;
+ this.spriteNameLabel.Text = "Sprite name:";
+ //
+ // spriteNameTextBox
+ //
+ this.spriteNameTextBox.Location = new System.Drawing.Point(78, 19);
+ this.spriteNameTextBox.Name = "spriteNameTextBox";
+ this.spriteNameTextBox.Size = new System.Drawing.Size(273, 20);
+ this.spriteNameTextBox.TabIndex = 0;
+ this.spriteNameTextBox.TextChanged += new System.EventHandler(this.spriteNameTextBox_TextChanged);
+ //
+ // reloadPictureButton
+ //
+ this.reloadPictureButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.reloadPictureButton.Location = new System.Drawing.Point(304, 18);
+ this.reloadPictureButton.Name = "reloadPictureButton";
+ this.reloadPictureButton.Size = new System.Drawing.Size(62, 23);
+ this.reloadPictureButton.TabIndex = 2;
+ this.reloadPictureButton.Text = "Reload";
+ this.reloadPictureButton.UseVisualStyleBackColor = true;
+ this.reloadPictureButton.Click += new System.EventHandler(this.reloadPictureButton_Click);
+ //
+ // filenameLabel
+ //
+ this.filenameLabel.AutoSize = true;
+ this.filenameLabel.Location = new System.Drawing.Point(6, 24);
+ this.filenameLabel.Name = "filenameLabel";
+ this.filenameLabel.Size = new System.Drawing.Size(85, 13);
+ this.filenameLabel.TabIndex = 1;
+ this.filenameLabel.Text = "Picture filename:";
+ //
+ // filenameTextBox
+ //
+ this.filenameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.filenameTextBox.Location = new System.Drawing.Point(97, 19);
+ this.filenameTextBox.Name = "filenameTextBox";
+ this.filenameTextBox.Size = new System.Drawing.Size(201, 20);
+ this.filenameTextBox.TabIndex = 3;
+ this.filenameTextBox.TextChanged += new System.EventHandler(this.filenameTextBox_TextChanged);
+ //
+ // imageViewPanel
+ //
+ this.imageViewPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.imageViewPanel.AutoScroll = true;
+ this.imageViewPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
+ this.imageViewPanel.Controls.Add(this.insideViewPanel);
+ this.imageViewPanel.Location = new System.Drawing.Point(12, 27);
+ this.imageViewPanel.Name = "imageViewPanel";
+ this.imageViewPanel.Size = new System.Drawing.Size(529, 503);
+ this.imageViewPanel.TabIndex = 0;
+ this.imageViewPanel.CTRLMouseWheel += new System.Windows.Forms.MouseEventHandler(this.imageViewPanel_CTRLMouseWheel);
+ this.imageViewPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.imageViewPanel_Scroll);
+ //
+ // insideViewPanel
+ //
+ this.insideViewPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
+ this.insideViewPanel.Controls.Add(this.spritesheetPictureBox);
+ this.insideViewPanel.Location = new System.Drawing.Point(3, 3);
+ this.insideViewPanel.Name = "insideViewPanel";
+ this.insideViewPanel.Size = new System.Drawing.Size(523, 497);
+ this.insideViewPanel.TabIndex = 1;
+ //
+ // spritesheetPictureBox
+ //
+ this.spritesheetPictureBox.AllowSRectCreation = true;
+ this.spritesheetPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
+ this.spritesheetPictureBox.Location = new System.Drawing.Point(3, 3);
+ this.spritesheetPictureBox.Name = "spritesheetPictureBox";
+ this.spritesheetPictureBox.SelectedSRect = null;
+ this.spritesheetPictureBox.Size = new System.Drawing.Size(100, 50);
+ this.spritesheetPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.spritesheetPictureBox.TabIndex = 0;
+ this.spritesheetPictureBox.TabStop = false;
+ this.spritesheetPictureBox.RectResize += new System.EventHandler(this.spritesheetPictureBox_RectResize);
+ this.spritesheetPictureBox.SelectedSRectChanged += new System.EventHandler(this.spritesheetPictureBox_SelectedSRectChanged);
+ this.spritesheetPictureBox.SRectCreated += new System.EventHandler(this.spritesheetPictureBox_SRectCreated);
+ this.spritesheetPictureBox.Click += new System.EventHandler(this.spritesheetPictureBox_Click);
+ this.spritesheetPictureBox.Paint += new System.Windows.Forms.PaintEventHandler(this.spritesheetPictureBox_Paint);
+ //
+ // SpritesheetEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(931, 542);
+ this.Controls.Add(this.propertiesGroupBox);
+ this.Controls.Add(this.imageViewPanel);
+ this.Controls.Add(this.menuStrip1);
+ this.DoubleBuffered = true;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.KeyPreview = true;
+ this.MainMenuStrip = this.menuStrip1;
+ this.Name = "SpritesheetEditor";
+ this.Text = "AB Classic Spritesheet Editor";
+ this.Load += new System.EventHandler(this.SpritesheetEditor_Load);
+ this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SpritesheetEditor_KeyDown);
+ this.Resize += new System.EventHandler(this.SpritesheetEditor_Resize);
+ this.menuStrip1.ResumeLayout(false);
+ this.menuStrip1.PerformLayout();
+ this.propertiesGroupBox.ResumeLayout(false);
+ this.propertiesGroupBox.PerformLayout();
+ this.selectedSpriteGroupBox.ResumeLayout(false);
+ this.selectedSpriteGroupBox.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtYNumUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteOrigPtXNumUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectHNumUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectWNumUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectYNumUpDown)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.spriteRectXNumUpDown)).EndInit();
+ this.imageViewPanel.ResumeLayout(false);
+ this.insideViewPanel.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.spritesheetPictureBox)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private ABStudio.Controls.CustomPanel imageViewPanel;
+ private System.Windows.Forms.MenuStrip menuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openHereToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openInNewInstanceToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem exportSpritesheetImageToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem exportCroppedSpritesheetToolStripMenuItem;
+ private ABStudio.Controls.PictureBoxDB spritesheetPictureBox;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem importSpritesheetToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem importSpritesFolderToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+ private System.Windows.Forms.Panel insideViewPanel;
+ private System.Windows.Forms.GroupBox propertiesGroupBox;
+ private System.Windows.Forms.TextBox filenameTextBox;
+ private System.Windows.Forms.Label filenameLabel;
+ private System.Windows.Forms.Button reloadPictureButton;
+ private System.Windows.Forms.GroupBox selectedSpriteGroupBox;
+ private System.Windows.Forms.TextBox spriteNameTextBox;
+ private System.Windows.Forms.Label spriteNameLabel;
+ private System.Windows.Forms.Label spriteRectYLabel;
+ private System.Windows.Forms.Label spriteRectXLabel;
+ private System.Windows.Forms.NumericUpDown spriteRectYNumUpDown;
+ private System.Windows.Forms.NumericUpDown spriteRectXNumUpDown;
+ private System.Windows.Forms.Label spriteRectHLabel;
+ private System.Windows.Forms.Label spriteRectWLabel;
+ private System.Windows.Forms.NumericUpDown spriteRectHNumUpDown;
+ private System.Windows.Forms.NumericUpDown spriteRectWNumUpDown;
+ private System.Windows.Forms.Label spriteRectLabel;
+ private System.Windows.Forms.Label spriteOrigPtLabel;
+ private System.Windows.Forms.Label spriteOrigPtYLabel;
+ private System.Windows.Forms.Label spriteOrigPtXLabel;
+ private System.Windows.Forms.NumericUpDown spriteOrigPtYNumUpDown;
+ private System.Windows.Forms.NumericUpDown spriteOrigPtXNumUpDown;
+ private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem clearAllSpritesToolStripMenuItem;
+ private System.Windows.Forms.Label spriteOrigPtMapLabel;
+ private System.Windows.Forms.Button spriteOrigPtMapBRButton;
+ private System.Windows.Forms.Button spriteOrigPtMapBButton;
+ private System.Windows.Forms.Button spriteOrigPtMapBLButton;
+ private System.Windows.Forms.Button spriteOrigPtMapTRButton;
+ private System.Windows.Forms.Button spriteOrigPtMapTButton;
+ private System.Windows.Forms.Button spriteOrigPtMapTLButton;
+ private System.Windows.Forms.Button spriteOrigPtMapRButton;
+ private System.Windows.Forms.Button spriteOrigPtMapCButton;
+ private System.Windows.Forms.Button spriteOrigPtMapLButton;
+ private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Forms/SpritesheetEditor.cs b/ABStudio/Forms/SpritesheetEditor.cs
new file mode 100644
index 0000000..a6d817f
--- /dev/null
+++ b/ABStudio/Forms/SpritesheetEditor.cs
@@ -0,0 +1,691 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ABStudio.Controls;
+using ABStudio.FileFormats.DAT;
+using ABStudio.FileFormats.PVR;
+using ABStudio.Misc;
+using StbRectPackSharp;
+
+namespace ABStudio.Forms
+{
+ public partial class SpritesheetEditor : Form
+ {
+ private static readonly string Title = "AB Classic Spritesheet Editor";
+
+ private string originalPath = "";
+ private DATFile file = null;
+ private DATFile.SpriteData data = null;
+ private Bitmap spritesheet = null;
+ private float zoom = 1.0f;
+ private object SelectedObj => spritesheetPictureBox.SelectedSRect;
+ private DATFile.SpriteData.Sprite SelectedSprite => spritesheetPictureBox.GetSRectLinkedObject(SelectedObj) as DATFile.SpriteData.Sprite;
+
+ #region Extensions management
+
+ private static readonly string[] supportedPicExt = new string[] { "pvr", "png", "jpg", "gif", "bmp", "tiff" };
+ private static readonly string[] supportedPicName = new string[] { "PowerVR Image File", "Portable Network Graphics", "Joint Photographic Experts Group", "Graphics Interchange Format", "Bitmap Image file", "Tagged Image File Format" };
+
+ private static string GenerateSaveExtension(bool allowPVR)
+ {
+ string ext = "";
+
+ for(int i = (allowPVR ? 0 : 1); i < supportedPicExt.Length; i++)
+ {
+ ext += supportedPicName[i] + " (*." + supportedPicExt[i] + ")| *." + supportedPicExt[i] + "|";
+ }
+
+ return ext + "All files (*.*)|*.*";
+ }
+
+ private static string[] GenerateSaveExtensionTable(bool allowPVR)
+ {
+ List exts = new List();
+
+ for(int i = (allowPVR ? 0 : 1); i < supportedPicExt.Length; i++)
+ {
+ exts.Add(supportedPicName[i] + " (*." + supportedPicExt[i] + ")");
+ }
+
+ return exts.ToArray();
+ }
+
+ #endregion
+
+ #region Constructor
+
+ public SpritesheetEditor(string path, DATFile file)
+ {
+ InitializeComponent();
+
+ originalPath = path;
+ ChangeFile(file);
+ }
+
+ #endregion
+
+ #region Form triggers
+
+ private void RefreshTitle()
+ {
+ this.Text = Title + " - " + ((originalPath == "") ? "New file" : Path.GetFileName(originalPath));
+ }
+
+ private void SpritesheetEditor_Load(object sender, EventArgs e)
+ {
+ }
+
+ private void SpritesheetEditor_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Delete && spritesheetPictureBox.Focused)
+ {
+ spritesheetPictureBox_KeyPressDel(sender, e);
+ e.Handled = true;
+ }
+ }
+
+ private void SpritesheetEditor_Resize(object sender, EventArgs e)
+ {
+ RefreshZoom();
+ }
+
+ #endregion
+
+ #region Menu Strip triggers
+
+ private void newToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ ChangeFile(Common.NewSpritesheetFile());
+ }
+
+ private void openHereToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ DATFile file = Common.OpenFile(ref originalPath);
+
+ if (file != null)
+ ChangeFile(file);
+ }
+
+ private void openInNewInstanceToolStripMenuItem_Click(object sender, EventArgs e) => Common.OpenFileInNewEditor();
+
+ private void saveToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Common.SaveFile(ref originalPath, file);
+
+ if(!originalPath.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
+ {
+ data.associatedZSTREAM = null;
+ }
+
+ if (!SaveSpritesheet())
+ return;
+
+ RefreshTitle();
+ }
+
+ private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!Common.SaveAsFile(ref originalPath, file))
+ return;
+
+ if (!SaveSpritesheet())
+ return;
+
+ RefreshTitle();
+ }
+
+ private bool SaveSpritesheet()
+ {
+ string ext = Path.GetExtension(data.filenames[0]).ToLower();
+
+ bool isJsonStreamCombo = (originalPath.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) && (ext == ".stream");
+
+ if (data.filenames[0] == "" || ext == "")
+ {
+ MessageBox.Show("Please write a filename for the picture to save with your spritesheet.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+
+ if (supportedPicExt.ToList().IndexOf(ext.Substring(1)) < 0 && !isJsonStreamCombo)
+ {
+ MessageBox.Show("Unsupported extention \"" + ext + "\", please use a supported extension like PVR or PNG.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+
+ string fname = Path.GetDirectoryName(originalPath) + Path.DirectorySeparatorChar + data.filenames[0];
+
+ if (ext == ".pvr")
+ {
+ PVRFile pvr = new PVRFile(spritesheet);
+ pvr.Save(fname);
+ }
+ else if(ext == ".stream")
+ {
+ data.associatedZSTREAM.SaveBitmap(spritesheet, fname);
+ }
+ else
+ {
+ spritesheet.Save(fname);
+ }
+
+ return true;
+ }
+
+ private void importSpritesheetToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ using (OpenFileDialog dialog = new OpenFileDialog())
+ {
+ dialog.Filter = GenerateSaveExtension(true);
+ dialog.DefaultExt = (originalPath == "" || data.filenames.Count < 1 || data.filenames[0] == "") ? "pvr" : Path.GetExtension(data.filenames[0]).Substring(1);
+ dialog.FilterIndex = 1;
+ dialog.RestoreDirectory = true;
+ if (dialog.ShowDialog() == DialogResult.OK)
+ {
+ LoadBitmap(dialog.FileName);
+
+ filenameTextBox.Text = Path.GetFileName(dialog.FileName);
+ }
+ }
+ }
+
+ private void importSpritesFolderToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ FolderPicker dialog = new FolderPicker();
+ if (dialog.ShowDialog() == true)
+ {
+ MCQAskForm maf = new MCQAskForm(new string[] { "Insert them", "Overwrite existing ones", "Don't import them" }, "In which way do you want to import borders of the imported sprites?");
+ if(maf.ShowDialog() == DialogResult.OK)
+ {
+ Packer packer = new Packer(256, 256);
+
+ List bmps = new List();
+ List names = new List();
+ foreach(string file in Directory.GetFiles(dialog.ResultPath))
+ {
+ if (supportedPicExt.ToList().IndexOf(Path.GetExtension(file).Substring(1)) < 0)
+ continue;
+
+ bmps.Add(new Bitmap(file));
+ names.Add(Path.GetFileNameWithoutExtension(file));
+ }
+
+ foreach (Bitmap bmp in bmps) {
+ Packer.PackRectForce(ref packer, bmp.Width + 4, bmp.Height + 4, bmp);
+ }
+
+ if (maf.ChosenAnswer == 1)
+ data.sprites.Clear();
+
+ Bitmap full = new Bitmap(packer.Width, packer.Height);
+ using (Graphics g = Graphics.FromImage(full))
+ {
+ foreach (PackerRectangle rect in packer.PackRectangles)
+ {
+ Bitmap bmp = rect.Data as Bitmap;
+ Rectangle mainRect = new Rectangle(rect.X + 2, rect.Y + 2, bmp.Width, bmp.Height);
+ g.DrawImage(bmp, mainRect, new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
+
+ g.DrawImage(bmp, new Rectangle(rect.X+1, rect.Y+2, 1, bmp.Height), new Rectangle(0, 0, 1, bmp.Height), GraphicsUnit.Pixel);
+ g.DrawImage(bmp, new Rectangle(rect.X+bmp.Width+2, rect.Y+2, 1, bmp.Height), new Rectangle(bmp.Width-1, 0, 1, bmp.Height), GraphicsUnit.Pixel);
+
+ g.DrawImage(bmp, new Rectangle(rect.X+2, rect.Y+1, bmp.Width, 1), new Rectangle(0, 0, bmp.Width, 1), GraphicsUnit.Pixel);
+ g.DrawImage(bmp, new Rectangle(rect.X+2, rect.Y+bmp.Height+2, bmp.Width, 1), new Rectangle(0, bmp.Height-1, bmp.Width, 1), GraphicsUnit.Pixel);
+
+ if (maf.ChosenAnswer != 2)
+ {
+ DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite();
+ sprite.name = names[bmps.IndexOf(bmp)];
+ sprite.rect = mainRect;
+ sprite.orig = new Point(sprite.rect.Width / 2, sprite.rect.Height / 2);
+
+ data.sprites.Add(sprite);
+ }
+ }
+ }
+
+ spritesheet = full;
+ spritesheetPictureBox.Image = spritesheet;
+ RefreshRects();
+ RefreshZoom();
+
+ filenameTextBox.Text = "-- IMPORTED SPRITE FOLDER, REPLACE THIS --";
+ }
+ }
+ }
+
+ private void exportSpritesheetImageToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ SaveFileDialog dialog;
+ dialog = new SaveFileDialog();
+ dialog.Filter = GenerateSaveExtension(false);// "Portable Network Graphics|*.png|Joint Photographic Experts Group|*.jpg|Graphics Interchange Format|*.gif|Bitmap Image file|*.bmp|Tagged Image File Format|*.tiff|All files (*.*)|*.*";
+ dialog.DefaultExt = supportedPicExt[1];
+ dialog.FileName = Path.GetFileNameWithoutExtension(originalPath) + "." + supportedPicExt[1];
+ if (dialog.ShowDialog() == DialogResult.OK)
+ spritesheet.Save(dialog.FileName);
+ }
+
+ private void exportCroppedSpritesheetToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ FolderPicker dialog = new FolderPicker();
+ if (dialog.ShowDialog() == true)
+ {
+
+ ComboAskForm caf = new ComboAskForm(GenerateSaveExtensionTable(false), "In which format do you want to save the cropped spritesheet?");
+ if (caf.ShowDialog() == DialogResult.OK)
+ {
+ foreach (DATFile.SpriteData.Sprite sprite in data.sprites)
+ {
+ if (sprite.rect.Width < 1 || sprite.rect.Height < 1)
+ continue;
+
+ Bitmap bmp = new Bitmap(sprite.rect.Width, sprite.rect.Height);
+
+ using (Graphics g = Graphics.FromImage(bmp))
+ {
+ g.DrawImage(spritesheet, new Rectangle(0, 0, sprite.rect.Width, sprite.rect.Height), sprite.rect, GraphicsUnit.Pixel);
+ }
+
+ bmp.Save(dialog.ResultPath + Path.DirectorySeparatorChar + sprite.name + "." + supportedPicExt[caf.ComboIndex+1]);
+ }
+ }
+ }
+ }
+
+ private void exitToolStripMenuItem_Click(object sender, EventArgs e) => Close();
+
+ private void clearAllSpritesToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ spritesheetPictureBox.ClearSRects();
+ data.sprites.Clear();
+ }
+
+ private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ MessageBox.Show("AB Studio Spritesheets Editor"
+ + Environment.NewLine + "By RSM (rsm4618 @ Discord)"
+ + Environment.NewLine
+ + Environment.NewLine + "Libraries used:"
+ + Environment.NewLine + "- PVRTexLib"
+ + Environment.NewLine + "- CppSharp"
+ + Environment.NewLine + "- Newtonsoft.Json"
+ + Environment.NewLine + "- Aspose.Zip"
+ + Environment.NewLine
+ + Environment.NewLine + "Documentation:"
+ + Environment.NewLine + "- RizDub"
+ + Environment.NewLine + "- AB360"
+ + Environment.NewLine
+ + Environment.NewLine + "Special thanks:"
+ + Environment.NewLine + "- AB Series Modding Hub Discord Server"
+ + Environment.NewLine + "- Hidden birds",
+ "About", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ #endregion
+
+ #region Reloading & Refreshing utility functions
+
+ private void ChangeFile(DATFile file)
+ {
+ RefreshTitle();
+ this.file = file;
+ this.data = file.GetAsSpriteData();
+ LoadBitmap();
+ RefreshRects();
+ RefreshLocalSprite();
+
+ while (data.filenames.Count < 1)
+ data.filenames.Add("");
+
+ filenameTextBox.Text = data.filenames[0];
+ }
+
+ private void LoadBitmap(string path=null)
+ {
+ if (path == "")
+ path = null;
+
+ bool hasSpecifiedPath = path != null;
+
+ if (data.filenames.Count <= 0 && !hasSpecifiedPath)
+ {
+ spritesheet = new Bitmap(4, 4);
+ }
+ else if(data.filenames.Count == 1 || hasSpecifiedPath)
+ {
+ string fullPath = (hasSpecifiedPath) ? path : (Path.GetDirectoryName(originalPath) + Path.DirectorySeparatorChar + data.filenames[0]);
+ string ext = Path.GetExtension(fullPath).ToLower();
+ if(ext == ".pvr")
+ {
+ PVRFile pvr = new PVRFile(fullPath);
+ spritesheet = pvr.AsBitmap();
+ }
+ else if(fullPath.EndsWith(".stream") || ext == ".zstream")
+ {
+ if (data.associatedZSTREAM != null)
+ spritesheet = data.associatedZSTREAM.GetBitmap(fullPath);
+ else
+ throw new Exception("Non-JSON sheets can't have a stream or zstream texture");
+ }
+ else
+ {
+ spritesheet = new Bitmap(fullPath);
+ }
+
+ if (data.associatedZSTREAM != null)
+ data.associatedZSTREAM.UpdateBitmap(spritesheet, Path.GetFileName(fullPath));
+ }
+ else
+ {
+ MessageBox.Show("Multi-spritesheet DAT files aren't supported.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ spritesheetPictureBox.Image = spritesheet;
+ RefreshZoom();
+ }
+
+ private void RefreshZoom()
+ {
+ float w = spritesheet.Width * zoom;
+ float h = spritesheet.Height * zoom;
+
+ insideViewPanel.Size = new Size(Math.Max((int)Math.Round(w * 1.1f), imageViewPanel.Width - 6), Math.Max((int)Math.Round(h * 1.1f), imageViewPanel.Height - 6));
+ spritesheetPictureBox.Location = new Point((int)Math.Round((insideViewPanel.Size.Width / 2.0f) - (w / 2.0f)), (int)Math.Round((insideViewPanel.Size.Height / 2.0f) - (h / 2.0f)));
+ spritesheetPictureBox.Size = new Size((int)Math.Round(w), (int)Math.Round(h));
+ }
+
+ private void RefreshRects()
+ {
+ spritesheetPictureBox.ClearSRects();
+
+ foreach(DATFile.SpriteData.Sprite sprite in data.sprites)
+ {
+ spritesheetPictureBox.AddSRect(sprite.rect, sprite);
+ }
+ }
+
+ private void RefreshLocalSprite()
+ {
+ bool isSelected = SelectedObj != null;
+ selectedSpriteGroupBox.Enabled = isSelected;
+
+ if (isSelected)
+ {
+ DATFile.SpriteData.Sprite sprite = SelectedSprite;
+ spriteNameTextBox.Text = sprite.name;
+ spriteRectXNumUpDown.Value = sprite.rect.X;
+ spriteRectYNumUpDown.Value = sprite.rect.Y;
+ spriteRectWNumUpDown.Value = sprite.rect.Width;
+ spriteRectHNumUpDown.Value = sprite.rect.Height;
+ spriteOrigPtXNumUpDown.Value = sprite.orig.X;
+ spriteOrigPtYNumUpDown.Value = sprite.orig.Y;
+ }
+ }
+
+ private void RefreshSelectedRect()
+ {
+ if (SelectedObj != null)
+ spritesheetPictureBox.EditSRect(SelectedObj, SelectedSprite.rect);
+ }
+
+ #endregion
+
+ #region Image view panel triggers
+
+ private void imageViewPanel_CTRLMouseWheel(object sender, MouseEventArgs e)
+ {
+ if (e.Delta > 0)
+ {
+ if (zoom < 10.0f)
+ zoom /= 0.9f;
+ else
+ return;
+ }
+ else
+ {
+ if (imageViewPanel.HorizontalScroll.Visible || imageViewPanel.VerticalScroll.Visible)
+ zoom *= 0.9f;
+ else
+ return;
+ }
+
+ int viewportWidthBefore = imageViewPanel.Width - (imageViewPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
+ int viewportHeightBefore = imageViewPanel.Height - (imageViewPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0);
+
+ double scrollbarLeftRatio = (double)imageViewPanel.HorizontalScroll.Value / (double)imageViewPanel.HorizontalScroll.Maximum;
+ double scrollbarTopRatio = (double)imageViewPanel.VerticalScroll.Value / (double)imageViewPanel.VerticalScroll.Maximum;
+ int scrollbarRightPos = (imageViewPanel.HorizontalScroll.Value + viewportWidthBefore);
+ double scrollbarRightRatio = (double)(imageViewPanel.HorizontalScroll.Value + viewportWidthBefore) / (double)imageViewPanel.HorizontalScroll.Maximum;
+ int scrollbarTopPos = (imageViewPanel.VerticalScroll.Value + viewportHeightBefore);
+ double scrollbarBottomRatio = (double)(imageViewPanel.VerticalScroll.Value + viewportHeightBefore) / (double)imageViewPanel.VerticalScroll.Maximum;
+
+ RefreshZoom();
+ imageViewPanel.PerformLayout();
+
+ int viewportWidthAfter = imageViewPanel.Width - (imageViewPanel.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
+ int viewportHeightAfter = imageViewPanel.Height - (imageViewPanel.HorizontalScroll.Visible ? SystemInformation.HorizontalScrollBarHeight : 0);
+
+ int zoomLeft = (int)Math.Round(imageViewPanel.HorizontalScroll.Maximum * scrollbarLeftRatio);
+ int zoomTop = (int)Math.Round(imageViewPanel.VerticalScroll.Maximum * scrollbarTopRatio);
+
+ int goRight = (int)Math.Round(imageViewPanel.HorizontalScroll.Maximum * scrollbarRightRatio) - zoomLeft - viewportWidthBefore;
+ int goDown = (int)Math.Round(imageViewPanel.VerticalScroll.Maximum * scrollbarBottomRatio) - zoomTop - viewportHeightBefore;
+
+ int zoomFinalX = (int)Math.Round(zoomLeft + (goRight * ((double)e.X / (double)viewportWidthBefore)));
+ int zoomFinalY = (int)Math.Round(zoomTop + (goDown * ((double)e.Y / (double)viewportHeightBefore)));
+
+ if (zoomFinalX < 0)
+ zoomFinalX = 0;
+ if (zoomFinalX > imageViewPanel.HorizontalScroll.Maximum)
+ zoomFinalX = imageViewPanel.HorizontalScroll.Maximum;
+
+ if (imageViewPanel.HorizontalScroll.Visible)
+ imageViewPanel.HorizontalScroll.Value = zoomFinalX;
+
+ if (zoomFinalY < 0)
+ zoomFinalY = 0;
+ if (zoomFinalY > imageViewPanel.VerticalScroll.Maximum)
+ zoomFinalY = imageViewPanel.VerticalScroll.Maximum;
+
+ if (imageViewPanel.VerticalScroll.Visible)
+ imageViewPanel.VerticalScroll.Value = zoomFinalY;
+
+ imageViewPanel.PerformLayout();
+
+ }
+
+ private void imageViewPanel_Scroll(object sender, ScrollEventArgs e)
+ {
+ }
+
+ #endregion
+
+ #region Spritesheet picturebox triggers
+
+ private void spritesheetPictureBox_RectResize(object sender, PictureBoxDB.SizableRectEventArgs e)
+ {
+ DATFile.SpriteData.Sprite sprite = e.LinkedObject as DATFile.SpriteData.Sprite;
+ sprite.rect = e.Rect;
+
+ RefreshLocalSprite();
+ }
+
+ private void spritesheetPictureBox_SRectCreated(object sender, PictureBoxDB.SizableRectEventArgs e)
+ {
+ DATFile.SpriteData.Sprite sprite = new DATFile.SpriteData.Sprite();
+ sprite.name = "";
+ sprite.rect = e.Rect;
+ sprite.orig = new Point(sprite.rect.Width / 2, sprite.rect.Height / 2);
+ data.sprites.Add(sprite);
+
+ spritesheetPictureBox.SetSRectLinkedObject(e.SRect, sprite);
+ }
+
+ private void spritesheetPictureBox_Click(object sender, EventArgs e)
+ {
+ (sender as Control).Focus();
+ }
+
+ private void spritesheetPictureBox_Paint(object sender, PaintEventArgs e)
+ {
+ if(SelectedObj != null)
+ {
+ Point pt = spritesheetPictureBox.ConvertPicturePointToControlPoint(SelectedSprite.orig);
+ Point pt2 = spritesheetPictureBox.ConvertPicturePointToControlPoint(SelectedSprite.rect.Location);
+ e.Graphics.DrawRectangle(new Pen(Color.Red), new Rectangle(pt2.X + pt.X - 2, pt2.Y + pt.Y - 2, 5, 5));
+ }
+ }
+
+ private void spritesheetPictureBox_SelectedSRectChanged(object sender, EventArgs e)
+ {
+ RefreshLocalSprite();
+ }
+
+ private void spritesheetPictureBox_KeyPressDel(object sender, KeyEventArgs e)
+ {
+ if (SelectedObj != null)
+ {
+ data.sprites.Remove(SelectedSprite);
+ spritesheetPictureBox.RemoveSRect(SelectedObj);
+ RefreshLocalSprite();
+ }
+ }
+
+ #endregion
+
+ #region Manual rectangle edit controls triggers
+
+ private void filenameTextBox_TextChanged(object sender, EventArgs e)
+ {
+ while (data.filenames.Count < 1)
+ data.filenames.Add("");
+
+ data.filenames[0] = filenameTextBox.Text;
+ }
+
+ private void reloadPictureButton_Click(object sender, EventArgs e)
+ {
+ if (filenameTextBox.Text == "")
+ MessageBox.Show("No path to reload.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ else
+ LoadBitmap();
+ }
+ private void spriteNameTextBox_TextChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.name = spriteNameTextBox.Text;
+ }
+
+ private void spriteRectXNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.rect.X = (int)spriteRectXNumUpDown.Value;
+ RefreshSelectedRect();
+ }
+
+ private void spriteRectYNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.rect.Y = (int)spriteRectYNumUpDown.Value;
+ RefreshSelectedRect();
+ }
+
+ private void spriteRectWNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.rect.Width = (int)spriteRectWNumUpDown.Value;
+ //spriteOrigPtXNumUpDown.Maximum = SelectedSprite.rect.Width - 1;
+ RefreshSelectedRect();
+ }
+
+ private void spriteRectHNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.rect.Height = (int)spriteRectHNumUpDown.Value;
+ //spriteOrigPtYNumUpDown.Maximum = SelectedSprite.rect.Height - 1;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtXNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.orig.X = (int)spriteOrigPtXNumUpDown.Value;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtYNumUpDown_ValueChanged(object sender, EventArgs e)
+ {
+ SelectedSprite.orig.Y = (int)spriteOrigPtYNumUpDown.Value;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapCButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapTLButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = 0;
+ spriteOrigPtYNumUpDown.Value = 0;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapTButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2;
+ spriteOrigPtYNumUpDown.Value = 0;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapTRButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1;
+ spriteOrigPtYNumUpDown.Value = 0;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapRButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapBRButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width - 1;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapBButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = SelectedSprite.rect.Width / 2;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapBLButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = 0;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height - 1;
+ RefreshSelectedRect();
+ }
+
+ private void spriteOrigPtMapLButton_Click(object sender, EventArgs e)
+ {
+ spriteOrigPtXNumUpDown.Value = 0;
+ spriteOrigPtYNumUpDown.Value = SelectedSprite.rect.Height / 2;
+ RefreshSelectedRect();
+ }
+
+ #endregion
+ }
+}
diff --git a/ABStudio/Forms/SpritesheetEditor.resx b/ABStudio/Forms/SpritesheetEditor.resx
new file mode 100644
index 0000000..4d0249a
--- /dev/null
+++ b/ABStudio/Forms/SpritesheetEditor.resx
@@ -0,0 +1,3288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ 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
+ XPLJr9wrL/nB+6KB11eVJxUqAha60boTrhBEIsAHRJwALzNFIE83wNCTUUhaEBKCUI3AFYK09ABwG2Uh
+ YgD4ZABCpBHweyGiZcJzEOWAriO8/iREuHS73eeM0P6FjoN/rNJID7jHPkF8JT1gz2E24rvkT6vuh8if
+ UeEHbDtV4udNfoYGyAzyMyLiA5ZvCfJbAYjIbzmbjfyDbtiM/j9M0fvZf+B9HAAAAABJRU5ErkJggigA
+ AACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAHe5v/B3uc/wd8nf8HfZ7/B32f/wh+
+ oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqErP8Kha3/Coau/wuG
+ r/8Lh7D/C4ix/wuIsv8LibP/DIq0/wyKtf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nuv8Njrv/DY68/w2O
+ vf8Oj77/DpC+/w6Qv/8OkMD/DpDA/w6Rwf8OkcL/D5LC/w+Sw/8PksP/D5LE/w+SxP8Pk8X/D5PF/w+U
+ xv8PlMb/D5TG/w+Ux/8PlMf/D5TH/w+Ux/8Qlcj/EJXI/xCVyP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCV
+ yP8Qlcj/EJTI/xCVyP8Qlcj/EJXI/xCUx/8PlMf/D5TH/w+Ux/8Pk8b/D5TG/w+Uxv8Pk8X/D5PF/w+T
+ xf8PksT/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkcH/DpDA/w6QwP8OkL//Do++/w6Pvf8Njr3/DY68/w2N
+ u/8Njbr/DY25/w2MuP8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIs/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqE
+ rf8KhKz/CoSr/wqDqv8Jg6n/CYOo/wmCp/8Jgqb/CYGk/wiAo/8If6L/CH6h/wh+oP8Ifp//B32e/wd8
+ nf8He5z/B3ub/wd7nP8HfJ3/B32e/wd9n/8IfqD/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgab/CYKn/wmD
+ qP8Kg6n/CoSq/wqFrP8Kha3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyKtf8Mirb/DIu3/wyL
+ uP8NjLn/DY26/w2Nuv8Njrv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8OkcL/D5LD/w+S
+ w/8PksT/D5PF/w+Txf8PlMb/D5TG/w+Uxv8PlMf/D5TH/xCVyP8QlMj/EJXI/xCWyf8Qlsn/EJXJ/xCW
+ yf8Qlcn/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlsr/EJbK/xCWyv8Qlcn/EJbJ/xCV
+ yf8Qlsn/EJXI/xCVyP8Qlcj/EJXI/w+Ux/8PlMf/D5TG/w+Uxv8Pk8X/D5LF/w+SxP8PksT/D5LD/w+S
+ w/8OkcL/DpHB/w6Rwf8OkMD/DpC//w6Pvv8Oj73/DY69/w2OvP8Njbv/DY26/w2Nuf8Mi7j/DIu3/wyK
+ tv8MirX/DIq0/wyJs/8LiLL/C4ix/wuHsP8Lhq//C4au/wqFrf8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmB
+ p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh+oP8Ifp//B32e/wd8nf8He5z/B3yd/wd9nv8HfZ//CH6g/wh+
+ of8If6L/CICj/wiApP8JgKX/CYKm/wmCp/8Jg6n/CoSq/wqEq/8KhKz/CoWt/wqFrv8Lhq//C4ew/wuI
+ sf8LiLL/DImz/wyKtP8MirX/DIq2/wyLt/8MjLj/DY25/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Q
+ v/8OkMD/DpHB/w6Rwv8PksP/D5LD/w+SxP8Pk8X/D5PF/w+Uxv8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCW
+ yf8Qlcn/EJXJ/xCWyv8Qlcr/EJbK/xCXy/8Ql8v/EJbL/xCXy/8Ql8v/EJbL/xCWy/8Ql8z/EJfM/xCX
+ zP8Ql8z/EJfM/xCWy/8Qlsv/EJfL/xCWy/8Qlsv/EJfL/xCWyv8Qlsr/EJbK/xCWyv8Qlsn/EJbJ/xCV
+ yP8Qlcj/EJXI/w+Ux/8PlMf/D5PG/w+Txf8PksX/D5LE/w+SxP8PksP/DpHC/w6Rwv8OkcH/DpDA/w6Q
+ v/8OkL7/Do+9/w2Ovf8Njrz/DY27/w2Nuv8NjLn/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuH
+ sf8Lh7D/C4av/wqFrv8KhKz/CoSr/wqEqv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+
+ oP8Ifp//B32e/wd8nf8HfZ7/B32f/wh+oP8IfqH/CH+i/wiAo/8IgKT/CYGl/wmBpv8Jg6j/CYOp/wqD
+ qv8Khav/CoSs/wqFrf8Lhq7/C4av/wuHsf8LiLL/C4mz/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2N
+ uv8Njbv/DY68/w2Ovf8Oj77/DpC//w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8PksX/D5TG/w+U
+ xv8PlMf/EJTH/xCUyP8Qlcj/EJXJ/xCVyf8Qlsr/EJbK/xCXy/8Qlsv/EJbL/xCXzP8Qlsz/EJfM/xGX
+ zP8RmM3/EZfN/xGXzf8RmM3/EZjN/xGXzf8Rl83/EZfN/xGXzf8Rl83/EZjN/xGYzf8Rl83/EZjN/xGY
+ zf8Ql8z/EJfM/xCWzP8Ql8z/EJfL/xCWy/8Ql8v/EJbK/xCWyv8Qlsn/EJbJ/xCVyP8Qlcj/D5TH/w+U
+ x/8Pk8b/D5PF/w+Txf8PksT/D5LD/w+Sw/8OkcL/DpHB/w6QwP8OkL//Do++/w6Pvf8Njrz/DY68/w2N
+ u/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8MibP/C4iy/wuIsf8Lh7D/C4av/wqFrv8KhK3/CoSs/wqF
+ q/8Kg6n/CYOo/wmBp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd9n/8IfqD/CH6h/wh/
+ ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8KhKr/CoSr/wqErP8Kha3/C4av/wuHsP8Lh7H/C4iy/wuJ
+ s/8MibT/DIq1/wyKtv8Mi7f/DYy4/w2Nuf8Njbv/DY68/w2OvP8Oj73/DpC+/w6Qv/8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Txv8PlMf/EJXI/xCVyP8Qlcn/EJbK/xCWyv8Ql8v/EJbL/xCX
+ zP8Qlsz/EJfM/xGYzf8Rl83/EZfN/xGYzv8RmM7/EZjO/xGYzv8Rmc//EZnP/xGYz/8RmM//EZjP/xGY
+ z/8RmM//EZjP/xGYz/8RmM//EZjP/xGZz/8RmM7/EZjO/xGYzv8RmM7/EZjO/xGXzf8Rl83/EZjN/xCX
+ zP8Qlsz/EJbL/xCWy/8Qlsr/EJXK/xCVyf8Qlsn/EJXI/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S
+ w/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mi7f/DIq2/wyK
+ tf8MibT/C4iz/wuIsv8Lh7D/C4av/wqFrv8KhK3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiA
+ pP8IgKP/CH+i/wh+oP8Ifp//CH6g/wh+of8If6L/CICj/wmBpP8JgaX/CYKn/wmDqP8Jg6n/CoOq/wqF
+ q/8KhKz/CoWu/wuGr/8Lh7D/C4ex/wuIsv8MibP/DIq0/wyKtv8Mi7f/DIu4/w2Muf8Njbr/DY27/w2O
+ vP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+SxP8Pk8X/D5TG/w+Ux/8QlMf/EJXI/xCW
+ yf8Qlcn/EJbK/xCXy/8Ql8v/EJfM/xCXzP8RmM3/EZfN/xGYzv8RmM7/EZjO/xGYz/8Rmc//EZnP/xGa
+ 0P8RmdD/EZrQ/xGZ0P8RmdD/EZrR/xGa0f8RmdH/EZnR/xGZ0f8RmdH/EZrR/xGa0f8RmdD/EZnQ/xGZ
+ 0P8RmdD/EZnQ/xGa0P8Rmc//EZjP/xGZz/8RmM7/EZjO/xGXzf8Rl83/EZjN/xCXzP8Ql8z/EJbL/xCW
+ yv8Qlsr/EJbJ/xCWyf8QlMj/D5TH/w+Uxv8PlMb/D5PF/w+SxP8PksP/D5LD/w6Rwv8OkcH/DpDA/w6Q
+ v/8Oj77/DY69/w2OvP8Njbv/DY26/w2MuP8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsv8Lh7H/C4av/wuG
+ rv8Kha3/CoSs/wqEq/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKP/CH+i/wh+oP8IfqH/CH+i/wiA
+ o/8IgKT/CYGl/wmCp/8Jg6j/CYOp/wqDqv8KhKv/CoWt/wqFrv8Lhq//C4ew/wuIsf8LiLL/DIm0/wyK
+ tf8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+S
+ xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXI/xCVyf8Qlsr/EJbK/xCWy/8Ql8z/EJfM/xGXzf8Rl83/EZjO/xGY
+ zv8RmM//EZnP/xGZ0P8RmdD/EZnQ/xGZ0f8RmtH/EZrR/xKb0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa
+ 0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtL/EprS/xKa0v8SmtH/EZrR/xGZ0f8RmtH/EZnQ/xGZ
+ 0P8RmtD/EZnP/xGZz/8RmM7/EZjO/xGXzf8RmM3/EJfM/xCWy/8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U
+ x/8Pk8b/D5TG/w+Sxf8PksT/D5LD/w6Swv8OkcH/DpDA/w6Qv/8OkL7/DY69/w2OvP8Njrv/DY26/w2M
+ uf8Mi7j/DIu3/wyKtv8MirT/C4mz/wuIsv8Lh7H/C4ew/wuGrv8Kha3/CoSs/wqFq/8KhKr/CYOp/wmC
+ p/8Jgqb/CYGl/wiApP8IgKP/CH6h/wh/ov8IgKP/CICk/wmBpf8Jgqf/CYOo/wmDqf8Kg6r/CoSr/wqE
+ rf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyLt/8NjLn/DY26/w2Nu/8Njrz/DY69/w6P
+ vv8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJXI/xCWyf8Qlcr/EJfL/xCW
+ y/8Ql8z/EZjN/xGXzf8RmM7/EZjO/xGZz/8RmtD/EZnQ/xGZ0P8RmdH/EZrR/xKa0v8SmtL/EprS/xKa
+ 0/8SmtP/EpvT/xKb0/8Sm9T/EpvU/xKb1P8Sm9T/EpvU/xKc1P8SnNT/EpvU/xKb1P8Sm9T/EpvU/xKb
+ 1P8SnNT/EpvT/xKb0/8SmtP/EpvT/xKa0v8SmtL/EpvS/xGa0f8RmdH/EZnQ/xGZ0P8Rmc//EZjP/xGY
+ zv8RmM7/EZfN/xCXzP8Qlsz/EJbL/xCWyv8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+S
+ w/8OkcL/DpHB/w6QwP8OkL//Do++/w2Ovf8Njrz/DY26/w2Nuf8Mi7j/DIu3/wyKtv8MirX/DImz/wuI
+ sv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqFq/8Kg6r/CYOp/wmCp/8Jgqb/CYGl/wiApP8If6L/CICj/wiA
+ pP8JgaX/CYGm/wmDqP8Jg6n/CoOq/wqEq/8KhK3/CoWu/wuGr/8Lh7D/C4iy/wuIs/8MibT/DIq1/wyK
+ tv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U
+ x/8Qlcf/EJXI/xCVyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZjP/xGZz/8RmdD/EZnR/xGa
+ 0f8SmtL/EprS/xKb0/8SmtP/EpvT/xKb1P8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc1f8SnNX/EpzW/xKc
+ 1v8SnNb/EpzW/xKc1v8SnNb/EpzW/xKc1v8Sndb/EpzV/xKc1f8SnNX/EpzV/xKd1f8SnNT/EpvU/xKb
+ 1P8Sm9P/EprT/xKa0v8SmtL/EprR/xGZ0f8RmdD/EZnQ/xGZz/8Rmc//EZjO/xGXzf8RmM3/EJbM/xCW
+ y/8Qlsr/EJbK/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Sw/8PksL/DpHB/w6QwP8OkL//Do++/w2O
+ vf8Njrz/DY27/w2Nuv8NjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGr/8Kha3/CoSs/wqF
+ q/8KhKr/CYKo/wmCp/8Jgqb/CYGl/wiApP8IgKT/CYGl/wmCpv8Jg6j/CYOp/wqDqv8KhKv/CoSt/wqF
+ rv8Lhq//C4ew/wuIsv8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Muf8Njbr/DY68/w2Ovf8Oj77/DpC//w6Q
+ wP8OkcH/DpLC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCWyf8Qlcr/EJfL/xCWy/8Ql8z/EZfN/xGY
+ zv8RmM7/EZnP/xGZ0P8RmdD/EZnR/xKa0v8SmtL/EprT/xKb0/8Sm9T/EpzU/xKc1f8SnNX/EpzV/xKc
+ 1v8SnNb/Ep3W/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd1/8Tndf/E53X/xOd
+ 1/8Tndf/E53X/xOd1/8Sndb/Ep3W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKb1P8SmtP/EprT/xKa
+ 0v8SmtH/EZnR/xGZ0P8RmtD/EZjP/xGYzv8Rl83/EZfN/xCXzP8Qlsv/EJbK/xCVyf8Qlsn/EJXI/w+U
+ x/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvf8Njrz/DY27/w2Nuv8NjLn/DIu3/wyK
+ tv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha3/CoSs/wqFq/8KhKr/CYOo/wmBp/8Jgab/CYGl/wmA
+ pf8Jgab/CYKn/wmDqf8Kg6r/CoSr/wqFrf8Kha7/C4av/wuHsP8LiLL/C4mz/wyKtP8Mirb/DIu3/wyL
+ uP8Njbn/DY27/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCW
+ yf8Qlsr/EJbK/xCXy/8Ql8z/EZfN/xGYzv8Rmc//EZnP/xGZ0P8RmdH/EZrR/xKa0v8SmtP/EpvT/xKb
+ 1P8SnNT/EpzV/xKc1f8SnNb/Ep3W/xOd1/8Tndf/E53X/xOe2P8Tntj/E57Y/xOe2P8Tntn/E57Z/xOe
+ 2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntn/E57Z/xOe2f8Tntj/E57Y/xOe2P8Tntj/E53X/xOd
+ 1/8Tndf/E53W/xKc1v8SnNb/EpzV/xKc1f8SnNT/EpvU/xKa0/8SmtL/EprS/xGa0f8RmdD/EZnQ/xGZ
+ z/8RmM7/EZfN/xGYzf8Ql8z/EJbL/xCWyv8Qlcn/EJXI/w+Ux/8PlMb/D5PF/w+SxP8PksP/DpHC/w6R
+ wf8OkMD/DpC//w6Pvv8Njrz/DY67/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuG
+ r/8Kha3/CoSs/wqEq/8KhKr/CYOo/wmCp/8Jgqb/CYKm/wmCp/8Jg6n/CoOq/wqEq/8KhKz/CoWu/wuG
+ r/8Lh7D/C4iy/wuJs/8MirT/DIq2/wyLt/8Mi7j/DY25/w2Nu/8Njrz/DY69/w6Qvv8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcn/EJbK/xCWy/8Ql8z/EZfN/xGYzv8RmM7/EZnP/xGZ
+ 0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzV/xKc1v8Sndb/E53X/xOd1/8Tntj/E57Y/xOe
+ 2f8Tntn/E57Z/xOf2v8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOf2/8Tn9v/E5/b/xOf
+ 2/8Tn9r/E5/a/xOf2v8Tn9r/E5/a/xOe2f8Tntn/E57Z/xOe2P8Tntj/E57Y/xOd1/8Tndf/Ep3W/xKc
+ 1v8SnNX/EpzV/xKb1P8Sm9P/EprT/xKa0v8RmtH/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Rl8z/EJfM/xCX
+ y/8Qlsr/EJXJ/xCUyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6Rwf8OkMD/DpC//w6Pvv8Njr3/DY27/w2N
+ uv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIs/8LiLH/C4ew/wuGr/8Kha3/CoSs/wqEq/8Kg6n/CYKo/wmC
+ p/8Jgqf/CYOo/wqEqv8KhKv/CoSs/wqFrv8Lhq//C4ew/wuIsv8LibP/DIq0/wyKtv8Mi7f/DIy4/w2N
+ uv8Njbv/DY68/w6Pvf8OkL//DpDA/w6Rwf8OksL/D5LD/w+SxP8PlMb/D5TH/xCVyP8Qlsn/EJbK/xCX
+ y/8Ql8z/EZjN/xGXzf8RmM7/EZnP/xGZ0P8RmdH/EprS/xKa0v8SmtP/EpvU/xKc1P8SnNX/EpzW/xKd
+ 1v8Tndf/E53X/xOe2P8Tntj/E57Z/xOe2f8Tn9r/E5/a/xOf2/8Tn9v/E5/b/xOg2/8UoNz/FKDc/xSg
+ 3P8UoNz/FKHc/xSh3P8Uodz/FKHc/xSh3P8Uodz/FKHc/xSg3P8UoNz/FKDc/xSg2/8ToNv/E5/b/xOf
+ 2/8Tn9r/E5/a/xOf2v8Tntn/E57Z/xOe2P8Tntj/E53X/xOd1/8Sndb/EpzW/xKc1f8SnNT/EpvU/xKa
+ 0/8SmtL/EZrR/xGa0f8RmdD/EZjP/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/xCVyP8PlMf/D5PG/w+T
+ xf8PksT/D5LD/w6Rwv8OkcH/DpC//w6Pvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuI
+ sv8Lh7H/C4ew/wuGrv8KhK3/CoSs/wqEqv8Jg6n/CYKo/wmCqP8Kg6n/CoSr/wqErP8Kha3/C4av/wuH
+ sP8LiLL/C4iz/wyKtP8Mirb/DIu3/wyMuP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S
+ xP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJbM/xGXzf8RmM7/EZjP/xGZ0P8RmdH/EprR/xKa
+ 0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2P8Tntn/E5/a/xOf2v8Tn9v/E5/b/xOf
+ 2/8UoNz/FKDb/xSh3f8Uo9//E5/b/xKSyP8OgbL/C2mP/wlVdv8IQ1z/Bz9Y/wc/WP8IQlv/CExp/wpk
+ i/8Ne6r/EY/G/xOd2f8Uot7/FKHe/xSg3P8Uodz/FKHc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E5/a/xOe
+ 2f8Tntn/E57Y/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xGa0f8RmdD/EZnP/xGZ
+ z/8RmM7/EZjN/xCWzP8Ql8v/EJbK/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6Rwv8OkcH/DpDA/w6Q
+ vv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DIm0/wuIsv8Lh7H/C4ew/wuGrv8KhK3/CoWs/wqE
+ qv8Jg6n/CYOp/wqFq/8KhKz/CoWt/wuGr/8Lh7D/C4ix/wuIs/8MibT/DIq1/wyLt/8Mi7j/DY26/w2N
+ u/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJbL/xGX
+ zP8Rl83/EZjO/xGZz/8RmdD/EZrR/xKa0v8SmtP/EpvU/xKc1f8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe
+ 2f8Tntn/E5/a/xOf2/8Tn9v/FKDb/xSi3v8SmNH/CmOI/wMpOf8ACg3/AAQF/wALDv8ABAX/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAME/wAJDP8ABAX/AAoO/wEY
+ Iv8HQlz/EIzB/xSh3v8UoN3/FKHc/xSg3P8UoNv/E5/b/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd
+ 1/8SnNb/EpzV/xKc1P8Sm9P/EprT/xKa0v8RmdH/EZnQ/xGYz/8RmM7/EZfN/xCWzP8Qlsv/EJbK/xCW
+ yf8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyK
+ tv8MirX/DIm0/wuIsv8Lh7H/C4av/wqFrv8KhK3/CoSr/wqDqv8KhKr/CoWs/wqErf8Lhq7/C4ew/wuH
+ sf8LiLP/DIm0/wyKtf8Mi7f/DIu4/w2Nuf8Njbv/DY68/w6Pvv8OkL//DpDA/w6Rwf8PksP/D5LE/w+T
+ xf8PlMb/EJTH/xCWyf8Qlsr/EJbL/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc
+ 1P8SnNX/EpzW/xOd1/8Tntj/E57Y/xOe2f8Tn9r/E5/a/xOf2/8UoNz/EpjS/wdCW/8ABwn/AAcI/wAC
+ Av8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAgL/wAHCf8DJDL/DXmn/xSi
+ 3v8UoNz/FKDc/xOg2/8Tn9v/E5/a/xOe2f8Tntn/E57Y/xOd1/8Tndf/EpzW/xKc1f8Sm9T/EpvT/xKa
+ 0v8RmtH/EZnQ/xGZz/8RmM7/EZjO/xGXzP8Qlsv/EJbK/xCWyf8QlMj/D5TH/w+Txv8Pk8X/D5LE/w6R
+ wv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2Nuv8NjLn/DIu4/wyKtv8MirX/DImz/wuIsv8Lh7H/C4av/wqF
+ rv8KhKz/CoSr/wqFq/8KhK3/CoWu/wuGr/8Lh7H/C4iy/wyJtP8MirX/DIu3/wyLuP8Njbn/DY27/w2O
+ vP8Oj73/DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlcn/EJbK/xCWy/8Qlsz/EZfN/xGY
+ zv8Rmc//EZnQ/xGa0f8SmtL/EprT/xKb1P8SnNX/EpzW/xOd1/8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOf
+ 2/8Sls7/BDBC/wAEBv8AAgL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/BgYG/wQE
+ BP8CAgL/BwcH/wgICP8EBAT/AAAA/wAAAP8CAgL/BgYG/wgICP8FBQX/AgIC/wcHB/8DAwP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAkM/wAICf8JVXb/FKHd/xSg2/8UoNz/E5/b/xOf
+ 2v8Tntn/E57Z/xOe2P8Tndf/Ep3W/xKc1v8SnNX/EpvU/xKa0/8SmtL/EZnR/xGZ0P8RmM//EZjO/xGX
+ zf8Qlsz/EJfL/xCVyf8Qlcj/D5TH/w+Uxv8Pk8X/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY68/w2N
+ uv8NjLn/DIu3/wyKtv8MirX/C4mz/wuIsv8Lh7D/C4av/wqGrv8KhKz/CoSs/wqFrv8Lhq//C4ex/wuI
+ sv8MibP/DIq1/wyKtv8Mi7j/DYy5/w2Nu/8Njrz/Do+9/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+U
+ x/8Qlcj/EJbJ/xCWyv8Qlsv/EJfM/xGXzf8RmM7/EZnQ/xGZ0f8SmtL/EprT/xKb1P8SnNX/EpzV/xKd
+ 1v8Tndf/E57Y/xOe2f8Tn9r/E5/a/xOh3f8KWXv/AAgK/wACAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8GBgb/BAQE/w4ODv89PT3/d3d3/5WVlf+dnZ3/np6e/52dnf+cnJz/nJyc/5ycnP+cnJz/nJyc/5yc
+ nP+cnJz/nJyc/52dnf+dnZ3/n5+f/5ycnP+NjY3/ZmZm/zU1Nf8EBAT/AQEB/wICAv8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8ACAr/AAsP/w59rP8Uod3/FKDc/xOf2/8Tn9r/E57Z/xOe2f8Tntj/E53X/xKc
+ 1v8SnNX/EpzU/xKb0/8SmtL/EZrR/xGZ0P8Rmc//EZjO/xGXzf8Ql8z/EJbL/xCWyv8Qlcj/D5TH/w+U
+ xv8PksX/D5LE/w+Swv8OkcH/DpDA/w6Qvv8Njr3/DY27/w2Nuv8NjLn/DIu3/wyKtv8MirT/C4iz/wuI
+ sf8Lh7D/C4av/wqFrf8QiK//C4av/wuHsP8LiLL/C4iz/wyKtf8Mirb/DIu3/w2Muf8Njbr/DY68/w2P
+ vf8OkL//DpDA/w6Rwf8PksP/D5LE/w+Txf8PlMf/EJTI/xCWyf8Qlsr/EJbL/xGYzf8RmM7/EZjP/xGZ
+ 0P8RmdH/EprS/xKa0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tntn/E5/a/xOh3f8GOlH/AAYH/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AwMD/wYGBv8xMTH/goKC/52dnf+dnZ3/nJyc/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/5ycnP+dnZ3/m5ub/2tra/8cHBz/AgIC/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAI
+ Cf8ITWr/FKLe/xSg3P8Tn9v/E5/a/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGa
+ 0f8Rmc//EZjO/xGYzf8Qlsz/EJfL/xCWyv8Qlsn/D5TH/w+Uxv8PksX/D5LE/w6Rwv8OkcH/DpC//w6P
+ vv8Njr3/DY67/w2Nuv8NjLj/DIu3/wyKtf8MibT/C4iz/wuIsf8Lh7D/Coau/yaUt/8olbn/G5C3/wqI
+ sv8MirT/DIq2/wyLt/8NjLn/DY26/w2OvP8Njr3/Do++/w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TH/xCU
+ yP8Qlsn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8Sm9P/EpzU/xKc1f8Sndb/E53X/xOe
+ 2P8Tntn/E5/a/xOg2/8ITmv/AAcI/wAAAP8AAAD/AAAA/wAAAP8CAgL/BgYG/05OTv+bm5v/nJyc/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/lJSU/zg4OP8EBAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8ABgf/B0Jc/xSh3f8ToNv/E5/b/xOf
+ 2v8Tntn/E57Y/xOd1/8SnNb/EpzV/xKb1P8SmtP/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCV
+ yv8Qlsn/D5TH/w+Uxv8Pk8X/D5LE/w6Swv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuv8Mi7j/DIu3/wyK
+ tf8MibT/C4iy/wuHsf8Lhq//J5S4/yqXu/8rmLz/LJi+/yiXvv8Li7f/DIy4/w2Nuv8Njrv/DY69/w6P
+ vv8OkMD/DpHB/w+Sw/8PksT/D5LF/w+Txv8Qlcj/EJbJ/xCWyv8Qlsv/EZfN/xGYzv8RmM//EZnQ/xGa
+ 0f8SmtL/EpvU/xKc1f8SnNb/E53X/xOe2P8Tntn/E5/a/xOf2v8Qi7//AAkL/wAAAP8AAAD/AAAA/wAA
+ AP8EBAT/MDAw/5iYmP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+cnJz/nZ2d/56env+fn5//nJyc/5ycnP+Ojo7/FBQU/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAcK/wtjiP8UoNv/E5/b/xOf2v8Tntn/E57Y/xOd1/8Sndb/EpzV/xKc
+ 1P8SmtP/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJbL/xCVyv8Qlsn/D5TH/w+Uxv8Pk8X/D5LD/w6R
+ wv8OkcH/DpC//w6Pvv8Njrz/DY27/w2Nuf8Mi7j/DIq2/wyKtf8MibP/C4iy/wuHsP8plrr/Kpe8/yyY
+ vf8umb//L5vB/zGdw/8yncT/EpC8/w2OvP8Oj77/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJXI/xCW
+ yf8Qlsr/EJbL/xGXzf8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb1P8SnNX/EpzW/xOd1/8Tntj/E57Z/xOf
+ 2v8Tn9v/BCc1/wACAv8AAAD/AAAA/wAAAP8CAgL/VFRU/56env+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/m5ub/52dnf+lpaX/r6+v/7m5uf/BwcH/xMTE/8fH
+ x//IyMj/yMjI/8jIyP/Hx8f/xMTE/8HBwf+6urr/srKy/6mpqf+goKD/nJyc/4aGhv87Ozv/FxcX/wcH
+ B/8DAwP/AQEB/wgICP8JCQn/DAwM/wQEBP8DAwP/BAQE/wQEBP8CAgL/CAgI/wMDA/8AAAD/AAAA/wAH
+ CP8TnNb/FKDb/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1P8Sm9P/EprS/xGZ0f8RmND/EZjP/xGX
+ zf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+Uxv8Pk8X/D5LD/w6Rwv8OkMD/DpC//w6Pvf8Njrz/DY26/w2M
+ uf8Mi7f/DIq2/wyKtP8LiLP/C4ix/yqXu/8rl73/LZm+/y+bwf8wncP/M57E/zWgxv83osj/OaTK/x6W
+ w/8NkMD/DpHC/w+Sw/8Pk8X/D5PG/xCVyP8Qlcn/EJXK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EprS/xKa
+ 0/8Sm9T/EpzV/xKc1v8Tndf/E57Y/xOe2f8Tn9r/E57a/wAHCf8AAAD/AAAA/wAAAP8BAQH/GRkZ/zU1
+ Nf9tbW3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nJyc/52dnf+wsLD/xcXF/8rK
+ yv/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/CAgI/wICAv8CAgL/BwcH/zs7O/9wcHD/mJiY/6ampv+qqqr/qKio/6io
+ qP+oqKj/qKio/6ioqP+qqqr/pqam/3l5ef8SEhL/BQUF/wAGB/8IVHP/FKDb/xOf2/8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjP/xGXzf8Ql8z/EJfL/xCWyv8Qlcj/D5TH/w+U
+ xv8PksT/D5LD/w6Rwf8OkMD/Do++/w2Ovf8Njbv/DY26/w2MuP8Mi7f/DIq1/wyJtP8LiLL/Kpi8/yyZ
+ vv8um8D/MJzB/zKexP80n8X/N6LI/zijyf86pMv/O6XM/z6nzv8wocv/C5DE/w+Uxv8PlMf/EJbJ/xCW
+ yv8Ql8v/EZjN/xGYzv8RmM//EZnQ/xKa0v8SmtP/EpvU/xKc1f8Sndb/E53X/xOe2P8Tntn/E5/a/xKW
+ zv8ACAr/AAAA/wAAAP8AAAD/CAgI/zU1Nf81NTX/NTU1/zg4OP+ampr/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+cnJz/pKSk/8PDw//Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/5ycnP8GBgb/paWl/6io
+ qP+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en
+ p/+mpqb/CQkJ/wAAAP8BFR3/FKDd/xOf2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ
+ 0f8RmND/EZjP/xGXzf8Qlsz/EJbL/xCVyf8QlMj/D5TH/w+Txf8PksT/D5LD/w6Rwf8OkMD/Do++/w2O
+ vf8Njbv/DY26/wyLuP8Lirb/HpK6/yeXvP8smL3/LZm//y+bwf8xncP/NJ/F/zWgxv83osj/OaTK/zul
+ zP89ps3/P6jP/0Gq0P9Dq9L/QKrS/xGWyf8Qlsr/EJbL/xCXzP8RmM7/EZjP/xGZ0P8SmtH/EprT/xKb
+ 1P8SnNX/Ep3W/xOd1/8Tntn/E5/a/xOf2/8Rkcf/AAYI/wAAAP8AAAD/AQEB/ykpKf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/zc3N/+dnZ3/nZ2d/52dnf+dnZ3/vb29/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/CQkJ/zQ0NP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6io
+ qP+oqKj/qKio/6ioqP+np6f/p6en/6ioqP+Xl5f/hoaG/6ioqP94eHj/AAAA/wAAAP8ACw//E57Z/xOg
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJfL/xCW
+ yf8QlMj/D5PG/w+Txf8PksT/DpHC/w6Rwf8OkL//Do++/wuNvP8ak77/LZvC/yqZwP8qmb//KJe9/yya
+ vv8umsD/MJ3C/zOexP80n8b/N6LI/zmjyf87pMv/PKbN/z+ozv9BqdD/Q6vS/0Wt1P9HrtX/SK/W/0qw
+ 2P8dnM//EZjO/xGYz/8RmdD/EZrR/xKa0/8Sm9T/EpzV/xKd1v8Tndf/E57Z/xOf2v8Tn9v/EpnS/wAH
+ CP8AAAD/AAAA/wEBAf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ZGRv+fn5//x8fH/8jI
+ yP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ysrP8HBwf/qKio/6io
+ qP+oqKj/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+pqan/hoaG/y8vL/8eHh7/JiYm/yUl
+ Jf+jo6P/qamp/wcHB/8AAAD/AAAA/wAAAP8ABgf/EpXN/xSg2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc
+ 1f8Sm9P/EprS/xGZ0f8RmdD/EZjO/xGXzf8Ql8z/EJbK/xCWyf8Qlcj/D5TG/w+Txf8PksP/DZHC/xWT
+ wv8yoMj/MqDH/zCexv8uncP/LZvB/yqZwP8pmL7/LZm//y+bwf8yncP/NJ/F/zWgx/84osj/OaTL/zum
+ zP8+p87/QKjP/0Kq0f9ErNP/Rq7V/0iu1v9KsNj/TLLZ/0+z2v9RtNz/MabW/w6Y0f8SmtL/EpvU/xKc
+ 1f8Sndb/E53X/xOe2f8Tn9r/E5/b/xSg3P8ACg3/AAAA/wAAAP8ICAj/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/zU1Nf81NTX/Q0ND/3x8fP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/IyMj/DQ0N/yIiIv+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/qKio/6en
+ p/+ioqL/MzMz/yUlJf8kJCT/JCQk/yQkJP8kJCT/Ghoa/6enp/9eXl7/AAAA/xISEv8BAQH/AAAA/wAA
+ AP8ABgj/EpPK/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKc1f8Sm9P/EprS/xGZ0f8Rmc//EZjO/xGX
+ zf8Qlsv/EJbK/xCWyf8QlMf/EJTG/zOizf86ps7/OKTM/zaiyv80oMj/MZ/H/y+exf8tm8L/K5rB/yqZ
+ v/8umsD/MJ3D/zOexP80n8b/N6LI/zmkyv87pcz/PKbN/z+oz/9BqdD/Q6vS/0at1P9HrtX/SbDX/0ux
+ 2f9Ostr/ULTb/1G13f9Ttt7/V7jf/0qz3f8OmdT/EpzW/xOd1/8Tntn/E5/a/xOf2/8UoNv/AA4U/wAA
+ AP8AAAD/CQkJ/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pz8//0RERP9FRUX/RUVF/5CQ
+ kP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8XFxf8HBwf/oKCg/6io
+ qP+oqKj/qKio/6ioqP+oqKj/qKio/6enp/+hoaH/JCQk/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP9XV1f/p6en/wYGBv8CAgL/RUVF/zk5Of8BAQH/AAAA/wAAAP8ACAn/E5vW/xSg3P8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzW/xKc1P8SmtP/EprS/xGZ0P8RmM//EZjO/xGXzP8Nlcv/LqLQ/0Kq0/8/qtL/PKfQ/zqn
+ z/85pc3/N6PL/zWhyf8zoMj/MJ7G/y+exP8tm8L/KpnA/y+cwf8ynsT/NJ/F/zahx/85osn/OqTL/zum
+ zf8/qM7/QanQ/0Or0v9ErNP/R63V/0iv1v9KsNj/TrPa/1C02/9QtNz/U7be/1W43/9XueD/Wrri/1q7
+ 4/9au+P/GqHa/xSf2v8Tn9v/FKDc/wpafP8AAAD/AAAA/wgICP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RkZG/5WVlf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/RUVF/wcHB/+np6f/qKio/6ioqP+oqKj/qKio/6ioqP+oqKj/MTEx/yUl
+ Jf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/6ampv+fn5//AQEB/ykpKf9FRUX/RUVF/0JC
+ Qv8CAgL/AAAA/wAAAP8ACg3/FKHd/xSg3P8Tn9r/E57Z/xOe2P8Tndf/EpzV/xKb1P8SmtP/EpvS/w2X
+ 0P8koNL/SLDZ/0Wt1/9ErNb/QqvU/0Cq0/89qNH/PKfQ/zqmzv84pc3/NqLK/zShyf8yoMf/L53F/y2c
+ w/8rm8H/MJ3D/zOfxf81oMb/N6LI/zmky/87pcz/PabO/z+oz/9BqdH/Q6vS/0at1f9Irtb/SrDY/0yy
+ 2f9Ostr/ULTc/1G13f9VuN//Vrjg/1m64f9au+P/XLvj/1695P9hv+b/Y7/n/y6q3/8Rn93/AAgK/wAA
+ AP8BAQH/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/zo6Ov9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/4mJif/IyMj/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf8FBQX/YGBg/6io
+ qP+oqKj/qKio/6ioqP+np6f/fX19/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8aGhr/p6en/zo6Ov8CAgL/RERE/0VFRf9FRUX/RUVF/0JCQv8BAQH/AAAA/wAAAP8ACQv/FKDc/xSg
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EZzV/xuf1f9Ls93/TrTd/0uy2/9JsNr/SK/Y/0Wt1/9ErNX/QqvU/z+q
+ 0v88qNH/O6fP/zmmzv83pMz/NaLK/zOhyP8wnsb/Lp3E/y2bwv8ynsT/NJ/G/zahx/84osn/OaTL/zum
+ zf8/qM//QanQ/0Or0v9ErNP/Rq3V/0iu1v9KsNj/TrLa/1C13P9RtN3/VLfe/1a54P9YueH/Wrri/1y7
+ 4/9evOT/YL7l/2K/5/9kwOj/ZcHp/xIlLf8AAAD/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/NTU1/zU1
+ Nf9AQED/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/2RkZP/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/vb29/wkJCf+pqan/qKio/6ioqP+oqKj/qKio/ywsLP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/0xMTP+np6f/BgYG/xcXF/9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/z8/P/8CAgL/AAAA/wAAAP8GQlr/FKHd/xOg2/8Un9r/FZ/Z/0m14P9VuOL/U7fh/1G2
+ 3/9Ptd7/TbTd/0uy2/9JsNr/R67Y/0St1v9DrNX/QKrT/z6p0v88qND/OqfP/zilzf81osv/NKLJ/zKg
+ x/8vncX/LZvD/zOfxf80oMf/N6LI/zmjyv86pcz/PafO/z+p0P9BqdH/Q6vT/0at1f9Irtb/SrDY/02z
+ 2v9PtNv/ULXc/1K13v9VuN//V7ng/1q64v9bu+P/Xbzk/2C+5f9hv+b/Y8Do/2XB6f9mwOb/AQYI/wAA
+ AP8YGBj/NTU1/zU1Nf81NTX/NTU1/zU1Nf81NTX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/1BQUP/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9PT0//BQUF/6en
+ p/+oqKj/qKio/6ampv8fHx//JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/oKCg/6ampv8FBQX/QkJC/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/y0tLf8AAAD/AAAA/wAE
+ Bv8SmdP/PrHi/1295v9au+X/WLvk/1e54v9VuOL/Urfg/1C23/9OtN3/TLPc/0mw2v9IsNn/Ra3X/0St
+ 1v9Cq9T/QKvT/zyn0f87p8//OaTN/zajy/81osr/M6HI/zCfx/8unMT/M5/G/zWhx/84o8n/OaPL/zul
+ zf8/qM//QanR/0Or0v9FrNT/RqzV/0mv1/9Lsdj/TrLa/1C03P9RtN3/Vbff/1e54P9YuuH/Wrvj/1y7
+ 4/9eveX/Yb/m/2PA5/9lwen/ZsPp/xYsNf8AAAD/AgIC/zU1Nf81NTX/NTU1/zU1Nf81NTX/NTU1/0ND
+ Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0pK
+ Sv+2trb/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/yMjI/woKCv9TU1P/qKio/6ioqP+ZmZn/JSUl/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yAgIP+oqKj/aWlp/wMDA/9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/w4ODv8AAAD/AAAA/wEHCf9gv+f/X77n/1y85v9avOX/V7rj/1a5
+ 4v9TtuH/Ubbf/0+13v9Ns93/S7Hb/0mw2v9Hrtj/RK7X/0Kr1f9Aq9T/PqnS/zuo0P86ps//OKXN/zWi
+ y/8zocn/MqDH/y+dxf80oMf/N6LI/zmjyv86pcz/PafO/z+o0P9BqtH/Q6vT/0at1f9Irtb/SrDY/02y
+ 2v9PtNv/ULXd/1O23v9Vtt//V7ng/1q64v9cu+P/Xrzk/2C/5v9iv+f/ZMDo/2bD6v9pxOz/AgkM/wAA
+ AP8gICD/NTU1/zU1Nf81NTX/NTU1/zU1Nf9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0ZGRv9hYWH/ysrK/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Ly8v/DQ0N/6Oj
+ o/+oqKj/i4uL/yUlJf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/Kysr/6enp/8YGBj/FxcX/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wIC
+ Av8AAAD/AAAA/0eOrP9gv+j/Xr7n/1u85f9Zu+T/V7nj/1a44v9StuD/ULXf/06z3f9Mstz/SrHa/0iv
+ 2f9Grtf/RK3W/0Kr1P9AqtP/PKjR/zqmz/84o83/NqPM/zWiyv8zocj/MJ7G/zWgx/84osn/OaPL/zul
+ zf8+qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9Lsdj/TrLa/1C03P9RtN3/VLff/1a44P9YuuH/W7vj/128
+ 5P9fvuX/YcDn/2PA6P9lwen/aMLq/ztuhf8AAAD/AQEB/zU1Nf81NTX/NTU1/zU1Nf81NTX/Pj4+/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9KSkr/mZmZ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/7W1tf8EBAT/qKio/4KCgv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9ubm7/qKio/wMDA/87Ozv/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Ozs7/wAAAP8AAAD/AggK/2DA6f9fv+j/XL3m/1q8
+ 5f9XuuT/Vrni/1S34f9RtuD/T7Xe/02z3f9Lsdv/SbDa/0ev2P9Erdf/QqzV/0Cr1P8+qdL/O6jR/zml
+ zv83pMz/NaLL/zOhyf8xn8f/N6LI/zmjyv86pMz/PKbO/z+p0P9BqtH/Q6vT/0at1f9Hrdb/SbDY/02x
+ 2f9Ps9v/ULTd/1O23v9Vt9//V7nh/1q64v9cu+P/Xr3l/2C+5v9iwOf/ZMHp/2bD6v9owun/AgoM/wAA
+ AP8TExP/NTU1/zU1Nf81NTX/NTU1/zg4OP9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/0JCQv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/SEhI/62t
+ rf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/VFRU/yIi
+ Iv+Kior/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/6Kiov+np6f/CQkJ/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/CQkJ/wAAAP8AAAD/Tpy+/2DA6f9ev+f/W7zm/1m85f9XueP/Vbji/1K34P9Qtd//TrTe/0yy
+ 3P9Jsdv/R6/Z/0Wv2P9DrNb/QazV/z+q0/88qdH/OqXP/zilzf81osz/NKLK/zKgyP84o8n/OaPL/zul
+ zf89qM//QKnR/0Kq0v9ErNT/Rq3V/0iu1/9LsNj/TrHa/1C03P9RtN3/VLff/1a34P9YuuH/W7vj/128
+ 5P9fvub/Yb/n/2PB6P9lwun/aMLq/2rF7P8CCQz/AQEB/zQ0NP81NTX/NTU1/zU1Nf81NTX/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zU1Nf82Njb/NjY2/zU1Nf8/Pz//RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0dHR/+SkpL/ysrK/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9ISEj/CgoK/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/qamp/46Ojv8DAwP/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9CQkL/AQEB/wAAAP8EDBD/YMDp/1+/
+ 6P9dvuf/Wrzl/1e55P9WueP/VLfh/1C24P9PtN7/TbPd/0qx2/9IsNr/Rq/Y/0St1/9CrNX/QKvU/z2p
+ 0v86p9D/OKTO/zekzP81osv/M6HJ/zijyv85o8v/O6bN/z6o0P9BqtH/Q6vT/0Wt1f9Hrdb/SbDY/0yx
+ 2f9Ostv/ULTc/1O23v9Vt9//V7jh/1q74v9cvOT/Xr3l/2C/5v9iwej/ZcHp/2bC6v9pw+v/S4yp/wAA
+ AP8CAgL/NTU1/zU1Nf81NTX/NTU1/0NDQ/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ISEj/W1tb/7a2tv/Kysr/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/0lJ
+ Sf8AAAD/JCQk/yQkJP8hISH/GRkZ/ykpKf86Ojr/RERE/0hISP9ISEj/SEhI/0ZGRv8/Pz//NjY2/yws
+ LP8kJCT/Gxsb/xkZGf8AAAD/BAQE/wsLC/8MDAz/ExMT/xoaGv8nJyf/MjIy/zw8PP9BQUH/RERE/0VF
+ Rf9FRUX/RUVF/0RERP8ICAj/AAAA/wIICv9hwer/YMDp/16/6P9cveb/Wbvl/1e55P9VuOL/Urfh/1C1
+ 3/9OtN7/S7Lc/0mx2/9Hr9n/RK7Y/0Os1v9BrNX/P6rT/zuo0f85pc//N6TN/zWjy/8zosr/OaPK/zqk
+ zP89qM//P6nQ/0Gq0v9ErNT/Rq3V/0iu1/9KsNj/TbHa/0+z2/9RtN3/VLff/1a44P9YuuL/Wrvj/128
+ 5P9fvub/Yb/n/2PA6P9lwen/aMPq/2rD6/8XKzX/AAAA/xQUFP81NTX/NTU1/zU1Nf88PDz/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ODg4/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/0ND
+ Q/9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP88PDz/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0hI
+ SP9NTU3/h4eH/8DAwP/Ly8v/ycnJ/8jIyP/Jycn/gICA/wAAAP8gICD/sLCw/7u7u/+6urr/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+6urr/urq6/7u7u/+8vLz/vLy8/7q6
+ uv+0tLT/paWl/319ff9MTEz/Nzc3/wwMDP8MDAz/BgYG/woKCv8BAQH/AQEB/zk5Of8AAAD/AAAA/zVo
+ f/9gwOn/X7/o/12+5/9avOb/V7rk/1a54/9TuOH/ULXg/0603v9Ns93/SrHb/0iw2v9Fr9j/RK3X/0Gs
+ 1f8/qtT/PKjS/zqlz/84pM7/NqPM/zSiyv85o8v/O6XN/z6o0P8/qdH/QqvT/0Ss1P9Grtb/SK/Y/0ux
+ 2f9Os9v/ULTc/1K13v9Vt9//V7jh/1m74v9bvOT/Xr3l/2C/5/9iwOj/ZMHp/2bC6v9ow+v/a8Xs/wMK
+ Df8AAAD/MDAw/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/RERE/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/zY2
+ Nv82Njb/Ojo6/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0xMTP9HR0f/SUlJ/1lZ
+ Wf9ubm7/AwMD/0VFRf+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/7q6
+ uv+7u7v/vb29/w0NDf8DAwP/RUVF/wICAv8AAAD/BAwQ/2HA6f9gwOj/Xb/o/1u95v9YuuX/V7rk/1S5
+ 4v9Rt+H/T7Xf/0203v9Lstz/SLHb/0ev2f9Ertj/QqzW/0Cr1P89qdL/OqbQ/zmlz/83pM3/NKPL/zmk
+ zP88ps7/P6nQ/0Cq0v9Dq9P/Ra3V/0eu1/9KsNj/TLLa/06z2/9QtN3/U7be/1W34P9XueL/Wrvj/1y8
+ 5P9evub/Yb/n/2PA6P9lwun/Z8Tr/2rE7P9tyPD/AwwP/wICAv82Njb/NTU1/zU1Nf9CQkL/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1
+ Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/QUFB/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/Q0ND/zc3N/81NTX/NTU1/zU1Nf81NTX/Ojo6/0NDQ/8NDQ3/Dg4O/7q6uv+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8nJyf/Pz8//CgoK/xcXF/9FRUX/Ghoa/wAA
+ AP8BBwn/Y8Ps/2DA6f9fv+j/Xb7n/1m75v9XuuT/Vrnj/1O44f9QteD/TrTe/0yz3f9Jstv/R7Da/0Su
+ 2P9Crdf/QKvV/z6p0/87qNH/OaXP/zekzv81pMz/OaTM/z2nz/8/qdH/QavS/0Ss1P9Frtb/SK7X/0uw
+ 2f9Nstr/T7Pc/1K13v9Ut9//Vrjh/1i64v9avOT/Xb3l/1+/5/9hv+f/Y8Hp/2XC6v9oxOv/asbt/2rB
+ 6P8AAwT/AQEB/zU1Nf81NTX/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/OTk5/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv81NTX/RERE/0VFRf9FRUX/RERE/zk5Of82Njb/NjY2/zY2Nv82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zU1Nf8HBwf/uLi4/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8DA
+ wP/Pz8//0NDQ/5mZmf8CAgL/RERE/0VFRf9BQUH/AAAA/wADA/9guuH/YcHq/1+/6P9dv+j/W73n/1e7
+ 5f9WuuT/U7ni/1C24f9Otd//TbTe/0qy3P9Hsdr/Ra/Z/0Ot1/9BrNb/P6rU/z2o0v86ptD/OKXO/zaj
+ zP87pc3/PafP/z+p0f9Bq9P/RK3V/0au1v9Ir9j/S7La/06z2/9QtN3/Urbe/1W44P9XueH/Wbrj/1y9
+ 5P9evub/Tpm4/yM4Qf9kwen/Z8Pr/2nE7P9rxu3/XKjJ/wAAAP8FBQX/NTU1/zU1Nf9DQ0P/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP83Nzf/NjY2/zY2Nv82Njb/NjY2/zU1
+ Nf9ERET/RUVF/0VFRf9ERET/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VF
+ Rf8+Pj7/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/yAgIP8bGxv/urq6/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/76+vv/Pz8//0NDQ/9DQ0P/Ly8v/CgoK/0RERP9FRUX/RUVF/0RE
+ RP8BAQH/AAAA/z9/mv9iwer/YMDp/16+6P9bvef/WLvm/1a65P9VueP/Urjh/0+14P9NtN7/S7Pd/0ix
+ 2/9GsNn/RK7Y/0Ks1v9Aq9X/PajS/zqm0P84pc//N6TN/zymzv8+qND/QKnR/0Os1P9ErNX/Rq7X/0qw
+ 2f9Mstr/TrPc/1C03f9Stt//Vbjg/1e54v9avOT/XL3l/16/5/8OExT/EA8P/xcpMf9oxev/asbt/2zG
+ 7f9BeZH/AAAA/wUFBf8sLCz/NTU1/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0RERP84ODj/NjY2/zY2Nv81NTX/RUVF/0VFRf9FRUX/RUVF/0RERP82Njb/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NTU1/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv82Njb/KCgo/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf93d3f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/urq6/8HBwf/Pz8//0NDQ/9DQ
+ 0P/Q0ND/zc3N/w0NDf9DQ0P/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/Hj1K/2PC6/9gwOr/Xr/o/1y+
+ 5/9avOb/V7vl/1a64/9TuOL/ULbg/0613/9Ms93/SbLc/0ew2v9Er9n/Qq3X/0Cr1f89qdP/O6fR/zml
+ z/83pM7/PKbO/z+p0P9AqtL/RK3U/0Wu1v9Irtf/SrHZ/02z2/9Ps9z/UbXe/1O33/9WueH/WLrj/1q8
+ 5P9dvub/LFVn/xAQEP8QEBD/EA8P/xgqMv9qxez/bcfu/ypNXP8AAAD/Ghoa/zU1Nf8hISH/BAQE/ysr
+ K/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/RUVF/0RE
+ RP9FRUX/RUVF/0VFRf9FRUX/QUFB/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv81NTX/RUVF/0VF
+ Rf9DQ0P/NjY2/zY2Nv82Njb/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/Xl5e/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/urq6/8bGxv/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8HBwf8LCwv/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/GRkZ/wAAAP8BBQb/Y8Lr/2HB6v9fv+n/Xb7o/1u95/9XuuX/Vrrk/1O54/9QtuH/TrXf/0y0
+ 3v9Kstz/R7Hb/0Wv2f9Drdf/QKvV/z6p0/89qNL/OabQ/zekzv88p8//P6jR/0Gr0/9ErdX/Rq7W/0iw
+ 2P9Lstr/TbPb/1C03f9St9//VLfg/1e54v9Zu+P/W7zl/16/5/8QEhL/EBAQ/xAQEP8QEBD/EA8P/xgq
+ Mf9ux+7/JUVT/wAAAP8kJCT/NTU1/0RERP9FRUX/RUVF/zExMf8ICAj/HR0d/0NDQ/9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf89PT3/NjY2/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9FRUX/RUVF/z8/P/82Njb/NjY2/zMzM/8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2tra/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/vb29/83Nzf/Pz8//0NDQ/9DQ0P/Q0ND/0NDQ/8/P
+ z/+EhIT/CgoK/z4+Pv9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf8xMTH/AAAA/wEHCf9kw+z/YsLr/1/A
+ 6v9dv+j/W73n/1i75f9WuuT/VLnj/1K44v9OtuD/TbXf/0uz3f9Isdv/RbDa/0Ou2P9BrNb/P6rU/z2o
+ 0v86ptD/OKXP/z2nz/8/qNH/QqzT/0St1f9Grtf/SbHZ/0uy2v9Os9z/ULTd/1K23/9VuOH/V7ni/1q7
+ 5P9cveX/W7je/w0TFP8QEBD/EBAQ/xAQEP8QEBD/EBAP/xYnLv8cND//AAAA/ysrK/87Ozv/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/Pz8//xYWFv8AAAD/AAAA/yIiIv9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/zw8PP82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/PT09/0VF
+ Rf9FRUX/PT09/zY2Nv82Njb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/x8fH/8/P
+ z//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Q0ND/JSUl/w8PD/81NTX/NjY2/zU1Nf89PT3/RERE/0VF
+ Rf9FRUX/RUVF/0BAQP8AAAD/AQUG/2XF7v9jw+z/YMHq/16/6f9bvef/Wbvm/1e75f9UueP/Urji/0+3
+ 4f9NtN//S7Pd/0iy3P9GsNr/RK/Z/0Kt1/8/qtT/PanT/zqn0f84pc//PajQ/z+p0f9DrNT/RK3W/0au
+ 1/9JsNn/TLPb/0603P9QtN7/Urfg/1W54f9XuuP/Wrvk/1y85f9fvub/YcDo/0B4j/8LDg//EBAQ/xAQ
+ EP8QEBD/EBAQ/wIEBP8AAAD/Li4u/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9BQUH/AgIC/wAAAP8AAAD/AAAA/wYGBv8rKyv/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PDw8/zY2
+ Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf8+Pj7/NjY2/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP+7u7v/u7u7/7q6uv/Dw8P/z8/P/8/Pz//Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//nZ2d/wsL
+ C/8rKyv/NTU1/zY2Nv82Njb/NjY2/zY2Nv87Ozv/RUVF/0VFRf9FRUX/RERE/wICAv8EDBD/Z8bv/2PD
+ 7P9hwev/X7/p/1y+6P9avOb/V7rl/1a65P9TueP/ULfh/0214P9MtN7/SbPc/0ew2/9Er9n/Qq3X/0Cr
+ 1f89qNP/O6fR/zim0P8+p9D/QKrS/0Ot1P9Erdb/R6/Y/0qx2f9Ms9v/T7Td/1C13v9Tt+D/Vbni/1i6
+ 4/9au+T/Xb7m/2C/5/9hwOj/ZMLq/2fD6/9fsdb/Gisx/xASEv8QEBD/AgIC/wAAAP8uLi7/RERE/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yEhIf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/x8fH/9FRUX/RUVF/0VFRf9BQUH/NjY2/zY2Nv82Njb/NjY2/zY2Nv82Njb/Nzc3/0VF
+ Rf9FRUX/RUVF/0FBQf8pKSn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/Pz8//z8/P/9DQ0P/Q0ND/0NDQ/9DQ
+ 0P/Q0ND/0NDQ/9DQ0P/Pz8//xsbG/xMTE/8ICAj/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zY2
+ Nv9ERET/RUVF/0VFRf9FRUX/AwMD/wEHCf9lw+z/ZMLs/2LC6/9fwOr/Xb7o/1q95/9Xu+X/Vrnk/1O5
+ 4/9RuOL/TrXg/0yz3v9Ks93/R7Db/0Sv2f9CrNf/QKvV/z6q1P88qNL/OKbQ/z6o0f9Bq9P/Q6zU/0Wu
+ 1/9IsNj/SrHa/0203P9PtN3/Tq/W/0CKp/8yZnv/JElZ/yFFVP8dO0j/GjQ+/xkwOv8aMTr/HTVA/yJB
+ Tv8nSVj/LlNj/0BxiP8LFRn/AAAA/zIyMv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf85OTn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DAwM/zo6
+ Ov82Njb/NjY2/zY2Nv82Njb/NjY2/zY2Nv9ERET/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/xQUFP/Q0ND/0NDQ/9DQ0P/Q0ND/0NDQ/9DQ0P/Pz8//xcXF/x4eHv8EBAT/AAAA/wIC
+ Av8mJib/NTU1/zY2Nv82Njb/NjY2/zY2Nv82Njb/NjY2/zc3N/9FRUX/RUVF/0RERP8AAAD/AQUG/2bC
+ 7P9kw+z/YsLs/1/A6v9dv+n/W73n/1i75v9WuuT/U7nj/1G44v9OtOD/TLPe/0q03f9Hsdv/RK/Z/0Kt
+ 1/9ArNb/PqrU/zyo0v85p9H/PqjR/0Kr0/9ErNX/Ra3X/0mx2f9Lsdr/TbPc/0+13f8JDxH/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wUFBf8AAAD/LCws/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/yMjI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Kysr/zY2Nv82Njb/Pj4+/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5ycnP/Q0ND/0NDQ/8/P
+ z//R0dH/i4uL/wgICP8NDQ3/dHR0/35+fv81NTX/BwcH/wAAAP8BAQH/MDAw/zY2Nv82Njb/NjY2/zY2
+ Nv82Njb/NTU1/0RERP9FRUX/RUVF/wEBAf8BBAX/ZsPs/2TD7f9iwuz/YMHr/12/6f9bvej/Wbzm/1a6
+ 5f9TueP/Ubfi/0614P9MtN//SrPd/0ix2/9FsNr/Q67Y/0Gr1v8+qtT/PKnT/zqn0f8/qdH/QqrT/0Os
+ 1f9Frtf/SbDZ/0uy2/9NtNz/SrLb/wwPDv8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/CAgI/wAAAP8dHR3/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/ICAg/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkJCf9CQkL/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/1ZWVv8+Pj7/DAwM/w0NDf8MDAz/gYGB/+Pj4//f39//29vb/9zc
+ 3P/b29v/wMDA/wkJCf8BAQH/KCgo/zY2Nv82Njb/NjY2/zY2Nv82Njb/RUVF/0VFRf9FRUX/AQEB/wAE
+ Bv9Muun/YcLs/2TC7P9gwev/Xb/q/1u+6P9ZvOf/Vrrl/1S65P9SuOL/T7bg/0203/9LtN7/SLDb/0Ww
+ 2v9Drtj/QazW/z+q1f89qNP/OqfR/xWWyP8Qlcj/C5PJ/w6Vy/8Rl83/EpnP/xGZ0f8SmtL/EDZC/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8LCwv/AAAA/xUV
+ Ff9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0FBQf8EBAT/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/GRkZ/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYG
+ Bv9TU1P/7e3t//7+/v/////////////////+/v7///////X19f/b29v/29vb/ywsLP8BAQH/NDQ0/zY2
+ Nv82Njb/NjY2/zU1Nf9FRUX/RUVF/0VFRf8BAQH/AAcJ/xal5f8VpeT/FqTj/xCh4f8UouD/Iafh/0Cz
+ 4/9TueX/Vbrk/1K34v9QtuH/TbTf/0u03v9Jstz/RbDa/0Ou2P9Crdf/P6vV/z2p0/87qNL/D5TH/xCW
+ yf8Qlsr/EJfM/xGYzv8Rmc//EZnR/xKa0/8RdJz/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8QEBD/EBAQ/xASEf8QHyX/EmKF/w4ODv8AAAD/BAQE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/Kysr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/6enp//7+/v/ExMT/Wlpa/7y8vP/+/v7/////////
+ ///////////////////r6+v/29vb/yIiIv8GBgb/NTU1/zY2Nv82Njb/NTU1/0RERP9FRUX/RERE/wAA
+ AP8ACxD/Fqjp/xWl5f8VpOP/FaTi/xSi4P8Uod//FKHd/xSg3P8Un9r/EJ3Y/xKc1/8dodj/Nqva/0Ww
+ 2/9GsNr/Q67Z/0Gt1/8/q9X/ParU/zuo0v8PlMf/EJXJ/xCXy/8Ql8z/EZjO/xGZ0P8RmtH/EprT/xKb
+ 1P8QFBX/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBMU/xAgJf8Tir3/FZ3Z/xARD/8QDxD/EBAQ/wAA
+ AP8CAgL/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8iIiL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP/+/v7/h4eH/wAAAP8AAAD/AAAA/3Nzc//////////////////////////////////t7e3/29vb/wsL
+ C/81NTX/NjY2/zY2Nv83Nzf/RUVF/0VFRf9FRUX/AwMD/wAGBv8Wp+j/FaXl/xWl5P8VpOL/FaPh/xSi
+ 3/8Uod7/FKDc/xOf2/8Tntn/E53X/xKc1v8Sm9T/EprS/xKZ0f8Pl87/D5jN/xmazf8qoc//N6bR/xCU
+ x/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa0v8Sm9P/EpvU/xASD/8QEBD/EBAQ/xAQEP8QFBX/EBkc/xOD
+ s/8VpeP/FaXk/xE1Qv8QEhP/EBAQ/xAQEP8QEBD/AAAA/wMDA/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/PT09/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//7+/v8QEBD/AAAA/wAAAP8AAAD/DAwM//7+
+ /v/////////////////////////////////b29v/ERER/y0tLf82Njb/NjY2/0FBQf9FRUX/RUVF/0RE
+ RP8CAgL/AAcK/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc
+ 1P8SmtP/EZnR/xGZz/8RmM7/EJbM/xCWyv8Qlsn/EJXI/xCVyf8Ql8v/EZfN/xGZz/8RmdD/EprS/xKc
+ 1P8SnNX/EV57/xARDv8QLDX/EoW1/xSi3/8Uod7/FKLg/xSZ0/8QFRX/EBAQ/xAQEP8QEBD/EBAQ/xAR
+ Ev8ACQ3/AAAA/0FBQf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RESP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/xkZGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD//v7+/xAQEP8AAAD/AAAA/wAAAP8ODg7//v7+//////////////////////////////////X1
+ 9f9TU1P/ICAg/zY2Nv81NTX/RERE/0VFRf9FRUX/QEBA/wAAAP8ACQz/Fqbm/xam5v8VpeT/FaTj/xWj
+ 4f8UouD/FKHe/xSh3f8Tn9v/E5/a/xOe2P8Sndb/EpzV/xKa0/8RmtH/EZrQ/xGYzv8Ql8z/EJbK/xCW
+ yf8Qlcj/EJbK/xCWy/8Rl83/EZjP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh
+ 3v8SY4T/EBMU/xAQEP8QEBD/EBAQ/xAQEP8QEA//E2GC/wc7Uv8AAAD/KCgo/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/Xl5e/wEBAf8HBwf/Dg4O/+7u
+ 7v///////////////////////////////////////////1dXV/8kJCT/NjY2/0JCQv9FRUX/RUVF/0VF
+ Rf8wMDD/AAAA/wY4T/8Wp+f/Fqbm/xWl5P8VpOP/FaTi/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xOe
+ 1/8SnNX/EpvT/xKa0f8RmdD/EZjO/xCXzP8Ql8v/EJXJ/xCVyP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa
+ 0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/EV9//xAPD/8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAT
+ E/8Xqer/EYi9/wAAAP8KCgr/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/2xsbP/+/v7/////////////////////////////////////////
+ ///+/v7/MDAw/zExMf85OTn/RUVF/0VFRf9FRUX/RUVF/xgYGP8AAAD/DnWj/xan5/8Wpub/FaXl/xWk
+ 4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCW
+ y/8Qlsn/EJXI/xCVyv8Ql8z/EZfN/xGZz/8RmdH/EprS/xKc1P8SnNb/E53X/xOe2f8Tn9v/FKHc/xSh
+ 3v8Uod//EBUV/xAQEP8QEBD/EBAQ/xAQEP8QFRb/Fabn/xep6/8Xqez/AAgL/wEBAf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8zMzP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsL
+ C/9/f3///v7+//////////////////////////////////7+/v8JCQn/Nzc3/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/AgIC/wAEBf8VpeX/Fqfo/xam5v8VpeX/FaTj/xWk4v8UouD/FKHf/xSh3f8UoNz/E5/a/xOe
+ 2P8Tndf/EpzV/xKc1P8SmtL/EZnQ/xGYzv8RmM3/EJbL/xCWyf8Qlcj/EJbK/xCXzP8RmM7/EZnP/xGZ
+ 0f8Sm9P/EpzU/xKc1v8Tntj/E57Z/xOf2/8UoNz/FKHe/xSi4P8TgrL/EBAR/xAQEP8QEBD/EBAP/xNg
+ gf8WqOr/F6nr/xep6/8ACQz/AAAA/0JCQv9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8iIiL/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/QUFB/yEhIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/kJCQ//7+/v//////////////
+ ////////oKCg/xkZGf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8CAgL/AAME/xan6f8Wp+j/Fqbm/xWl
+ 5f8VpeT/FaTi/xWj4f8Uod//FKHd/xSg3P8Tn9r/E57Z/xOd1/8SnNX/EpvU/xKa0v8RmdD/EZnP/xGX
+ zf8Ql8v/EJXJ/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/EpzW/xOe2P8Tntn/E5/b/xSh
+ 3f8Uod7/FKLg/xWj4f8SWnf/EA8P/xAQEP8QEBD/Fqfo/xao6v8XqOv/F6ns/wY3Tv8AAAD/HBwc/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/zMzM/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/xwc
+ HP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KCgr/AgIC/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/DQ0N/56env/+/v7///////X19f8NDQ3/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/Pj4+/wAAAP8BFyD/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh3/8Uod7/FKDc/xOf
+ 2v8Tntn/E53X/xKc1f8Sm9T/EpvS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJbJ/xCWyv8Qlsz/EZjO/xGZ
+ z/8RmtH/EprT/xKc1P8Sndb/E57Y/xOe2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWj4v8RO0v/EBUX/xWl
+ 5f8WqOn/Fqjq/xeo6/8Xqez/FJnW/wAAAf8DAwP/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/KCgo/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9ERET/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woK
+ Cv+0tLT/CwsL/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8YGBj/AAAA/w96qv8WqOn/Fqfo/xan
+ 5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh3v8UoNz/E5/a/xOe2f8Tndf/Ep3W/xKb1P8SmtL/EZnQ/xGZ
+ z/8Rl83/EJbL/xCWyv8Qlsn/EJbK/xCXzP8RmM7/EZnP/xGa0f8SmtP/Ep3V/xKd1v8Tntj/E57Z/xOf
+ 2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWk4/8Vntr/Fqfn/xao6f8WqOr/F6nr/xep7P8Xq+//AAYI/wEB
+ Af9DQ0P/RUVF/0VFRf9FRUX/AAAA/wAAAP8BAQj/ISOo/wAAAP8AAAD/AAAA/wAAAP86Ojr/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf86Ojr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ERET/RUVF/0VFRf9ERET/ICAg/wEB
+ Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/Ojo6/0RERP9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/wICAv8ACg3/F6rs/xao6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg
+ 3P8Tn9r/E57Z/xOd1/8SnNb/EpvU/xKa0v8RmtH/EZjP/xGYzf8Qlsv/EJbK/xCWyf8Qlsr/EJfM/xGY
+ zv8Rmc//EZrR/xKa0/8SndX/Ep3W/xOe2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWj4f8VpOP/FaXk/xam
+ 5v8Wp+f/Fqjp/xao6v8Xqev/F6rt/xeq7v8EKDn/AAAA/xkZGf9FRUX/RUVF/0VFRf8UFBT/AAAA/wAA
+ AP8fIZ3/KizQ/xgZev8AAAD/AAAA/wAAAP8zMzP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8BAQH/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/BAQE/0FBQf9ERET/RUVF/0VFRf9AQED/AAAA/wESGf8XqOr/Fqfp/xan
+ 6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSi3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1v8Sm9T/EprS/xGa
+ 0f8RmM//EZjN/xCWy/8Qlsr/EJbJ/xCWyv8Ql8z/EZjO/xGZz/8RmtH/EprT/xKd1f8Sndb/E57Y/xOe
+ 2f8Tn9v/FKHd/xSh3v8UouD/FaPh/xWk4/8VpeT/Fqbm/xan5/8WqOn/Fqjq/xep6/8Xqu3/F6ru/xSa
+ 2f8AAAH/AQEB/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8qLND/KizQ/ygqyv8AAAD/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MzMz/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/xQUFP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/woK
+ Cv9ERET/RERE/w8PD/8AAAD/EYm//xep6/8WqOn/Fqfo/xan5/8VpeX/FaXk/xWk4v8Vo+H/FKLf/xSh
+ 3v8UoNz/E5/a/xOe2f8Tndf/EpzW/xKb1P8SmtL/EZrR/xGYz/8RmM3/EJbL/xCWyv8Qlsn/EJbK/xCX
+ zP8RmM7/EZnP/xGa0f8SmtP/EpzU/xKd1v8Tntj/E57Z/xOf2/8Uod3/FKHe/xSi4P8Vo+H/FaTj/xWl
+ 5P8Wpub/Fqfn/xao6f8WqOr/F6jr/xep7P8Xqu7/G6zv/wIICf8AAAD/NjY2/0VFRf9FRUX/RUVF/zMz
+ M/8AAAD/AAAA/yos0P8sLtb/KizR/ykrz/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AwMD/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wEBAf8RERH/PDw8/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zMz
+ M/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/z09Pf8DAwP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv8hISH/AgIC/wAICv8Xqu3/F6nr/xao
+ 6f8Wp+j/Fqfn/xWl5f8VpeT/FaTi/xWj4f8Uot//FKHe/xSg3P8Tn9r/E57Z/xOd1/8Sndb/EpvU/xKa
+ 0v8RmdD/EZjP/xGXzf8Qlsv/EJbK/xCVyP8Qlsr/EJbM/xGYzv8Rmc//EZnR/xKa0/8SnNT/Ep3W/xOe
+ 2P8Tntn/E5/b/xSh3f8Uod7/FKLg/xWk4f8VpOP/FaXk/xam5v8Wp+f/Fqfo/xao6v8XqOv/Eqjs/2nI
+ 8/94zvb/O2R3/wAAAP8CAgL/RERE/0VFRf9FRUX/RUVF/wAAAP8AAAD/FRZo/yst0/8sLtb/KizQ/yIk
+ rf8AAAD/AAAA/wcHB/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8WFhb/AAAA/wAAAP8AAAD/AQEB/xAQEP88PDz/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9CQkL/IiIi/wcHB/8RERH/MzMz/0VFRf8EBAT/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8MDAz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CVBx/xeq7P8Xqev/Fqjp/xan6P8Wp+f/FaXl/xWl5P8VpOL/FaPh/xSh
+ 3/8Uod7/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8Rmc//EZfN/xCXy/8Qlsr/EJXI/xCW
+ yv8Ql8z/EZjO/xGZz/8RmdH/EpvT/xKc1P8SnNb/E57Y/xOe2f8Tn9v/FKDc/xSh3v8UouD/FaPh/xWk
+ 4/8VpeT/Fqbm/xan5/8Wp+j/F6jq/ze07f90zPT/d871/3jP9v980Pf/AwoN/wAAAP8/Pz//RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8QEVT/KizQ/ywu1v8sLtb/KizQ/w0OQ/8AAAD/AAAA/zg4OP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8CAgL/FBQU/z09
+ Pf9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP84ODj/AwMD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEHCf9Cu/L/GKrs/xap
+ 6/8Wp+n/Fqfo/xam5v8VpeX/FaXk/xWk4v8Vo+H/FKHf/xSh3f8UoNz/E5/a/xOe2f8Tndf/EpzV/xKb
+ 1P8SmtL/EZnQ/xGZz/8Rl83/EJfL/xCVyf8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8Sm9P/EpzU/xKc
+ 1v8Tndf/E57Z/xOf2/8Uodz/FKHe/xSh3/8Vo+H/FaTi/xWl5P8VpeX/Fqfn/xSm6P9uyfH/csvz/3TM
+ 9P92zfT/eM/2/3vO9f8dMTv/AAAA/wYGBv9ERET/RUVF/0VFRf8AAAD/AAAA/wICC/8qLND/LC7W/ywu
+ 1v8qLND/KizQ/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/DAwM/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/Kk5d/27K9P9nxvL/Eqbq/xao6f8Wp+j/Fqbm/xWl5f8VpOP/FaTi/xSi
+ 4P8Uod//FKHd/xSg3P8Tn9r/E57Y/xOd1/8SnNX/EpzU/xKa0v8RmdD/EZjO/xGYzf8Qlsv/EJbJ/xCV
+ yP8Qlsr/EJfM/xGXzf8RmM//EZrR/xKa0v8Sm9T/EpzW/xOd1/8Tntn/E5/b/xSh3P8Uod7/FKHf/xWj
+ 4f8VpOL/FaXk/xOk5f9Tvuz/bMjw/27I8f9xy/P/c8z0/3XN9P93zvX/ec/2/3rN8/8CBwj/AAAA/z4+
+ Pv9FRUX/RUVF/wAAAP8AAAD/DxBP/yos0P8sLtb/LC7W/yst0v8qLND/HiCY/wAAAP8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/yIiIv8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ERET/NDQ0/wICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wIJC/9wzPb/bcr0/2zI
+ 8v9qx/H/Gajp/xan6P8Wpub/FaXl/xWk4/8VpOL/FKPg/xSh3/8Uod3/FKDc/xOf2v8Tntj/E53X/xKc
+ 1f8Sm9P/EprS/xGZ0P8RmM7/EZjN/xCWy/8Qlsn/EJXI/xCWyv8Qlsv/EZjN/xGYz/8RmdD/EprS/xKb
+ 1P8SnNX/E53X/xOe2f8Tn9r/FKDc/xSh3v8Uod//FaPh/xWk4v8kquX/Z8Xu/2nG7/9rx/D/bsfx/3DJ
+ 8v9yzPP/dMz0/3fO9f94zvb/e9D2/xIgJ/8AAAD/AQEB/0RERP9FRUX/AAAA/wAAAP8VFmj/KizQ/y0v
+ 1v8xM9f/Ky3T/yos0f8qLND/AAAA/wAAAP8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/ERER/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsL
+ C/8AAAD/AAAA/wAAAP8AAAD/Q3qT/3DL9P9tyvT/bMjy/2jG8f9lxvH/RLjr/xem5v8VpeT/FaTj/xWk
+ 4v8UouD/FKHf/xSh3f8ToNv/E5/a/xOe2P8Tntf/EpzV/xKb0/8Sm9L/EZnQ/xGYzv8Rl8z/EJfL/xCV
+ yf8Qlcj/EJXJ/xCXy/8Rl83/EZnP/xGZ0P8SmtL/EpvU/xKc1f8Tndf/E57Z/xOf2v8UoNz/FKHd/xSh
+ 3/8RoeD/XcDr/2TC7P9mxO7/acbv/2vH8P9tyPH/b8ny/3LL8/90zPT/ds31/3fO9v97z/b/es3z/wIH
+ CP8AAAD/MzMz/0VFRf8AAAD/AAAA/yos0P8qLNL/MTPX/zY42f8sLtb/Ky3U/yos0P8RElX/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/QEBA/wAAAP8AAAD/MjIy/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zg4OP8BAQH/AAAA/wIIC/9wyvT/bsr0/23J
+ 8/9rx/L/aMbx/2XF8P9kxO//YMLt/xGi5P8VpOP/FaPh/xSi4P8Uod7/FKHd/xOg2/8Tn9r/E57Y/xKd
+ 1v8SnNX/EprT/xGa0f8RmtD/EZjO/xCXzP8Ql8v/EJbJ/xCUx/8Qlsn/EJbL/xGYzf8RmM7/EZnQ/xKa
+ 0v8Sm9P/EpzV/xOd1/8Tntj/E5/a/xSg2/8Uod3/O7Hk/17A6v9hwev/Y8Ls/2bE7f9oxu//asfw/23I
+ 8f9uyfL/ccrz/3LL9P91zfX/d872/3nO9v980Pf/HjQ+/wAAAP8DAwP/Ly8v/wAAAP8AAAD/KizQ/yst
+ 1f82N9n/NjjZ/ywu1v8tL9b/Ky3U/yos0P8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/DQ0N/wAA
+ AP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RERE/wICAv8CBQf/bcLq/3DL9f9tyvT/bMnz/2rI8v9nxvH/ZcXw/2PE7/9gwu3/XsDs/x6n
+ 5P8Vo+H/FKLg/xSh3v8UoNz/E5/b/xOe2f8Tntj/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCW
+ yv8Qlsn/D5TH/xCVyf8Ql8v/EJfM/xGYzv8RmdD/EZrR/xKa0/8SnNX/Ep3W/xOe2P8Tn9r/GKHc/1q8
+ 5/9cvuj/XsDq/2DB6/9iwuz/ZMPt/2fF7/9px/D/a8fw/23J8v9wyvP/csvz/3TM9P9Jf5f/CQ8S/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qLND/LC7W/zY42f82ONn/LC7W/zEz1/8sLtb/KizQ/wAA
+ AP8AAAD/IiIi/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8ICAj/AAAA/zFZbP9yy/X/b8r0/23K
+ 9P9syfP/acjy/2bG8f9lxvD/YsPu/1/B7f9dwOz/W7/r/0W25v8Uot//FKHe/xSh3P8Tn9v/E57Z/xOd
+ 1/8SnNb/EpzU/xKa0v8RmdH/EZnP/xGXzf8Ql8z/EJXK/xCVyP8PlMf/EJbJ/xCWyv8Ql8z/EZjO/xGZ
+ z/8RmtH/EprT/xKc1P8SnNb/D5zX/0u14v9WuuX/WLvm/1u96P9dv+n/X8Hr/2LC7P9kw+3/ZsXu/2jG
+ 7/9rx/D/bcjx/2/K8/9xyvP/HDM9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAE/yos
+ 0P8tL9b/NjjZ/zY42f8wMtf/NjjZ/zEz1/8qLND/AAAA/wAAAP8GBgb/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8jIyP/AAAA/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9ERET/HBwc/wAAAP8CBQb/csz1/3DL9f9tyvT/bMr0/2rI8v9nxvH/Zcbx/2PF8P9hw+7/X8Ht/13A
+ 7P9bv+v/WL7p/1S76P8RoN3/FKDc/xOf2v8Tntn/E53X/xKc1f8Sm9T/EprS/xGZ0P8RmM//EZjN/xCW
+ y/8Qlsr/EJTI/w+Ux/8Qlcj/EJXK/xCXzP8Rl83/EZnP/xGZ0f8SmtL/EpvU/yml2f9Qt+L/U7jj/1a7
+ 5f9Xu+b/Wr3o/1y/6f9ewOr/YcHr/2PD7f9lxO7/Z8Xv/2nG8P9rx/H/bsny/3DJ8/8AAAD/AAAA/wAA
+ AP8AAAH/AwMP/wAAAP8AAAD/AAAA/wAAAP8VFmj/Ky3T/zM01/82ONn/NjjZ/zQ22P82ONn/NjjZ/yst
+ 0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP83Nzf/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/zc3N/8AAAD/AggL/3PN9v9zzPb/b8v1/23K
+ 9P9syfP/acfy/2bF8f9lxPD/Y8Tv/2DC7v9dwOz/XMDr/1q/6/9Xven/Vbzo/1O65v8jpt3/E5/a/xOe
+ 2P8Tndf/EpzV/xKb0/8SmtL/EZnQ/xGYzv8Rl83/EJfL/xCVyf8Qlcj/D5TG/xCUyP8Qlsr/EJbL/xGY
+ zf8RmM//EZnQ/xKa0v9LtN7/TbTg/1C34f9TuOP/Vbrk/1e85v9Zvef/W77p/12/6v9gwOv/YsLs/2TE
+ 7v9mxe//acfw/2rH8f9tyfL/b8nz/wAAAP8AAAD/AAAA/woLNf8rLdT/Ky3T/ywu1v8sLtb/FRZm/xUW
+ aP8rLdX/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/LC7W/xMUY/8AAAD/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/zU1Nf8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP9JSUn/AgIC/wIFB/9mtdr/c832/3DM9f9uyvT/bMr0/2rJ8/9pyPL/ZcXx/2TE8P9ixO//X8Ht/13A
+ 7P9cv+v/Wb/q/1a96f9Uu+f/Urrm/1C45P9BsuH/E57Y/xKd1v8SnNX/EpvT/xKa0f8RmdD/EZjO/xGX
+ zP8Ql8v/EJXJ/xCUx/8PlMb/EJXI/xCVyf8Qlsv/EZjN/w+Xzv84qdf/SbLc/0u03v9NtN//T7bh/1G4
+ 4v9TueT/Vrvl/1i95/9bvej/Xb/q/1/A6/9hwuz/Y8Pt/2XF7/9nxe//acbw/2zJ8f9uyfL/T4+s/wAA
+ AP8AAAD/AAAA/wAAAP8sLtb/KizP/ywu1v8sLtb/KSvL/ywu1v8xM9f/NjjZ/zEz1/82ONn/NjjZ/zY4
+ 2f8sLtb/FRZo/wAAAP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/w8P
+ D/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9KSkr/TExM/wICAv8AAAD/SH+Z/3PN9/9zzPb/b8v1/23K
+ 9P9syvT/asnz/2bF8f9lxPD/Y8Xw/2HD7v9ewe3/XMDs/1q/6/9Yvur/Vbzo/1S75/9SueX/T7jk/0y2
+ 4v9KteH/EpzW/xKc1P8SmtP/EZnR/xGZz/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Uxv8PlMf/EJXJ/xCX
+ y/8cnM7/Q63Y/0Sv2v9HsNv/SrLd/0y03/9OteD/Ubfi/1O54/9VuuX/V7zm/1m96P9bvun/Xr/q/2DB
+ 6/9iw+3/ZMTu/2bF7/9px/D/a8fx/23J8v9vyfP/ccr0/xwzPf8AAAD/AAAA/wAAAP8rLdX/Ky3T/ywu
+ 1v8oKsj/Ky3T/ywu1v82ONn/LC7W/ywu1v82ONn/NjjZ/ywu1v8VFmj/AAAA/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/zQ0NP9FRUX/RUVF/0VFRf9ERET/UFBQ/0xM
+ TP8CAgL/AAAA/zNcb/9zzPb/c8z2/3HN9v9uy/X/bMn0/2rI8/9px/L/ZcXx/2TE8P9ixO//YMLu/13B
+ 7f9cv+v/Wb/q/1e96f9VvOj/Urrm/1G55f9Ot+P/S7Xi/0q04P9Hs9//JKPX/xKa0v8RmdH/EZjP/xGX
+ zf8Ql8z/EJXK/xCVyP8PlMf/D5PF/w+Ux/8Olcj/O6jT/0Cr1v9Crdj/RK7Z/0ev2/9Jsdz/S7Pe/021
+ 4P9PtuH/Urjj/1S55P9Wu+b/WL3n/1u+6f9dv+r/X8Dr/2HC7P9jxO7/ZcXv/2fF7/9px/H/a8ny/23J
+ 8v9wyvP/csv0/1eZt/8AAAD/AAAA/xUWaf8qLM7/LC7W/ygqx/8qLND/LC7W/zQ22P8sLtb/LC7W/zY4
+ 2f82ONn/LC7W/xMUYf8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9ERET/TU1N/1FRUf9ISEj/AgIC/wAAAP8eNED/dM32/3PN9/9xzPb/b8v1/23J
+ 9P9syfT/asnz/2fG8v9lxPD/Y8Tw/2HD7/9ewu3/XMDs/1u/6/9Zvur/Vbzp/1S75/9Suub/T7jk/0y2
+ 4/9LteH/SbPg/0ax3v9EsNz/PKzZ/xCY0P8Rmc//EZfN/xCWy/8Qlsr/EJTI/w+Uxv8Pk8X/J53L/zuo
+ 0v89qtT/P6vV/0Ks1/9Drtn/RbDa/0ix3P9Ks97/TLTf/0+24f9Rt+L/U7nk/1W75f9XvOf/Wb7o/1u+
+ 6f9dv+r/X8Hs/2LD7f9kxO7/ZsXv/2jG8P9qyPH/bcny/27K8/9wyvT/csz1/wAAAP8AAAD/AAAA/yst
+ 0v8sLtb/Ky3U/ykrzP8sLtb/LC7W/zI01/8sLtb/NjjZ/zY42f8sLtX/AAAH/wAAAP8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/FxcX/1FRUf9RUVH/Nzc3/wIC
+ Av8AAAD/HzdB/3XO9/9zzff/csz2/3HN9v9tyvT/bMn0/2rI8/9ox/L/ZcXx/2TE8P9ixO//YMPu/13B
+ 7f9cwOz/Wb7q/1e96f9VvOj/U7vn/1G55f9Ot+T/TLbi/0u04f9ItN//RbHe/0Ow3P9Brtr/P63Z/xKY
+ zv8Rl8z/EJfL/xCWyf8Qlcf/D5TG/zakzf84ptD/OqjS/zyp0/8+qtX/Qa3X/0Kt2P9Ertr/R7Db/0qy
+ 3f9MtN//TbXg/1C34v9SueP/VLnl/1a75v9Yvej/W77p/12/6v9ewOv/YcLt/2PE7v9lxe//Z8bw/2nH
+ 8f9ryPL/bcjy/2/K8/9xy/T/c8z1/wAAAP8AAAD/KCrE/yst0v8sLtb/KCrH/yos0P8sLtb/NjjZ/ywu
+ 1v82ONn/NjjZ/yst0/8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/UVFR/yMjI/8AAAD/AAAA/zNcbv92zvf/dM33/3PM9v9xzPb/bsr0/0WM
+ pf9artH/acjy/2fG8f9lxfH/Y8Tw/2DD7/9ewu7/XMDs/1q/6/9Yver/Vrzp/1S86P9Suub/ULnl/0y3
+ 4/9LteL/SrTg/0ay3/9EsN3/Qq/b/0Cu2v8+rNj/PKvX/yOf0P8Qlsr/EJbJ/w+Ux/8Pk8X/NaPN/zel
+ z/85p9H/O6nT/z2p1P9ArNb/Qq3Y/0Su2f9FsNv/SLLd/0qz3v9MtOD/T7bh/1G44/9TueT/Vbvm/1e9
+ 5/9Zvuj/W77p/13A6/9fwez/YsPt/2XE7v9mxe//aMXw/2nH8f9syPL/bcnz/3DK9P9xy/X/AAAA/wAA
+ AP8FBRv/KizO/ywu1v8sLtb/KCrH/yst0/8sLs//Ky3S/zY42f82ONn/KizR/wAAAP8AAAD/IiIi/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/R0dH/1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAF
+ B/9Jf5j/ds/4/3TO+P9zzff/ccz2/3DM9v9tyvX/S5aw/0WOp/9Djaf/QYuj/0mZtv9bt+D/YMTv/13B
+ 7f9cwOv/Wb7q/1e96f9VvOn/U7vn/1G65v9PuOT/TLbj/0u14f9JtOD/RbLe/0Ow3f9Cr9v/P63Z/z6r
+ 2P88q9b/OajU/zOm0v8PlMj/D5TG/w+Txf80osz/NqTO/zim0P87qNL/PanU/z6r1v9Brdf/Qq3Z/0Sv
+ 2v9Isdz/SrPe/0u03/9OtuH/ULji/1K45P9UuuX/Vrzn/1i96P9avun/Xb/q/17A6/9gwu3/YsPu/2XE
+ 7v9mxfD/Y73l/zVkef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rLdX/KizQ/ywu1v8rLdL/KCrJ/ywu
+ 1v8sLtb/LC7O/zAyyP8pK87/AAAA/wAAAP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/SUlJ/1FR
+ Uf9RUVH/UVFR/wAAAP8AAAD/AAAA/wAAAP8ABwn/FZfU/0O99v90zvj/c8z3/3LM9v9wzPb/bcr1/2zJ
+ 9P9Vpsf/RI2n/0OMpv9Bjab/QIuk/z+LpP8+i6T/PImh/zuJo/9Cl7b/S6jO/1C13/9Suub/ULrm/0y2
+ 5P9LteL/SrTg/0ey3v9FsN3/QrDb/0Cu2v8+rNj/PazX/zqq1v84p9T/M5/I/yuLq/8ObYv/DGiF/zSj
+ zP82o83/N6bQ/zmn0f87qdP/ParV/0Gt1/9Crtj/Q67a/0ax2/9Isd3/SrPf/0y04P9OtuL/Ubjj/1O5
+ 5f9Vu+b/V7vn/1m96P9bvun/XcDr/1/B7P8xYXb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wsLN/8qLM//KizQ/ywu1v8pK8z/LC7W/ywu1v8sLtb/LC7W/ywu1v8ICSv/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP80NDT/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9ERET/TU1N/1FRUf9RUVH/UVFR/1FRUf9QUFD/Dg4O/wAAAP8AAAD/AAgK/xmu
+ 8/8YrfT/Ga3z/3DL9v9yzPb/ccz2/27M9v9syfT/a8jz/1+33f9Djab/Qo2m/0GMpf8/iqT/Pouk/z2K
+ o/87iKL/Ooeh/zmGoP84hqD/NoWf/zWFnv8zg53/MoKb/zB/mf8vfpf/LHyW/yx8lv8qfJb/KXuU/yd3
+ kf8meZL/JXiS/yR4kf8edZD/QnF//2JiYv+5ubn/MqLL/zSjzf82pM7/OKbR/zup0/88qdT/P6vW/0Gu
+ 2P9Crtn/RK/b/0iy3P9Jst7/TLTf/0214f9Pt+L/Ubjk/1S65f9WvOf/WLzo/1q+6f8BAgP/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf8cHBv/HB0b/xwdG/8cHRv/HB0b/y4wrf8qLM//KizO/yst
+ 0f8pK8v/KizO/yst0v8sLtb/LC7W/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9HR0f/UFBQ/1FRUf9RUVH/UVFR/1FR
+ Uf9QUFD/MzMz/wMDA/8AAAD/AAMF/wc3Tv8ZrvT/GK30/xit8/8YrfL/Eqry/3DL9v9uzPX/aGVl/21n
+ Zv9mdn7/ZajE/0KNpf9AjKb/QIqj/z+LpP8+i6T/PIqj/zqHof85h6H/OIag/zeFn/82hp//NIOd/zKD
+ nf8xgZv/MIKb/y6Amf8tfpn/LH2X/yp7lv8pe5T/JXmU/yx5kP9RcXv/YWFg/5ubm//5+fn/+fn5//X1
+ 9f8xocr/NKPM/zajzv83ptD/OafR/zuq1P89qtX/QazX/0Kv2f9Dr9r/RrHc/0iz3f9KtN//TLXg/062
+ 4v9QuOP/Urnl/1S65f8vZn7/AAAA/wAAAP8AAAD/AAAA/wAAAP8jJCL/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zg5PP8rLdT/KizO/ywu1v8sLtb/KizR/yoszv8qLM7/Ky3U/ywu
+ 1v8sLtb/LC7W/x4glv8AAAD/AAAA/wAAAP8AAAD/AAAA/yIiIv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/0VF
+ Rf9OTk7/UVFR/1FRUf9RUVH/UVFR/1FRUf9RUVH/RUVF/wMDA/8AAAD/AAAA/wAKDv8Vnt3/Ga70/xit
+ 9P8YrfP/GK7z/xis8v8YrPH/LbLx/23K9f9pdnv//v7+//7+/v/8/Pz/zc3N/4eHh/9nZGP/Ymhp/191
+ e/9Te4j/R4CT/0CDmf86g5z/N4Se/zSEnf8ygZz/MoKb/zGAmv80f5f/N3yS/z94iv9Rc37/YWxu/2Bf
+ Xv+BgoH/0NDQ//7+/v/+/v7///////39/f/6+vr/9fX1/zCgyv8zo8z/NaPN/zalz/85ptH/OqnT/z2q
+ 1f8/rNb/Qa3Y/0Ku2f9Er9v/R7Ld/0my3v9LtOD/TbXh/0+34/9RuOT/ESYv/wAAAP8AAAD/AAAA/xsc
+ G/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/KizQ/yst0v8sLtb/LC7W/ywu1v8qLM//KizO/yst0v8sLtb/LC7W/ywu1v8mKLz/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/IiIi/zo6Ov9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RkZG/05OTv9RUVH/UVFR/1FRUf9RUVH/UVFR/1FRUf9QUFD/QkJC/wMD
+ A/8AAAD/AAAA/wAHCv8IQl3/GbD2/xmu9f8YrfT/GK3z/xiu8/8YrPL/GKzx/xir8P8Xq+//YMXz/2mg
+ uP/v7+////////////////////////7+/v///////v7+//7+/v/z8/P/5eXl/9TU1P/Hx8f/v8DA/7y8
+ vP+/v7//xMTE/9HR0f/j4+P/8vLy//7+/v/+/v7//v7+/////////////////////////////f39//n5
+ +f/19fX/L6DJ/zGhy/80pM3/NqTO/zel0P85qNL/O6nU/z2r1v9Ardf/Qq7Z/0Ov2v9GsNz/SLLd/0q0
+ 3/9MteD/Trbi/xQtOP8AAAD/AAAA/wAAAP85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/y0tK/8sLtb/LC7W/yoszv8qLND/LC7W/ywu
+ 1v8sLtb/Ky3T/yoszv8qLND/LC7W/ywu1v8sLtb/LC7W/wICC/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yYm
+ Jv9RUVH/UVFR/1FRUf9RUVH/LS0t/wMDA/8AAAD/AAAA/wADBP8CGib/GK3z/xmv9f8ZrvX/GK30/xit
+ 8/8YrvP/GKzy/xis8f8YrPD/F6vv/xer7/8Uqe7/acDn/7Ozs///////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////f39////////////////////////9/f3/+fn5//X19f8unsj/MKHK/zOjzP80pM7/NqXP/zmm
+ 0f87qdP/PKrV/z+s1v9Brdj/Qq/a/0Sv2/9Hst3/SLLe/0q14P85iKj/AAAA/wAAAP8MDAz/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/JiYk/ygqsv8wMtf/LjDW/yos0f8qLM7/KizO/yst0v8uMNb/NjjZ/zEz1/8rLdL/KizO/yst
+ 0v8sLtb/LC7W/ywu1v8WF2v/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAD
+ Bf8BExz/F6Tn/xmv9f8ZrvX/Ga/1/xit9P8YrfP/GK7z/xis8v8YrPH/GKzw/xis8P8Xq+//F6ru/xeq
+ 7f8Zq+7/fX+A////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////8AAAD/YGBg//////////////////39
+ /f/5+fn/9fX1/y2ex/8voMn/MaHL/zSkzf81pM7/N6bQ/zmo0v87qdT/PavW/z+s1/9Brtn/Qq/a/0Ww
+ 3P9Ist3/SbPf/wAAAP8AAAD/AAAA/zk6N/85Ojf/OTo3/zk6N/85Ojf/Ozw5/0JDQP9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9CQ0D/PD06/zk6N/85Ojf/OTo3/zk6N/8xMS//Gxsa/x8gTv8zNdj/NjjZ/ywu
+ 1v8qLNH/KizO/yoszv8qLM7/Ky3U/zEz1/82ONn/LjDW/yos0P8qLM7/Ky3S/ywu1v8sLtb/LC7W/ywu
+ 1v8sLtb/Ky3S/xcYcv8WF2v/Fhdr/xUWav8SE1r/Cgoz/wYHIv8FBRz/Bwck/woKMv8RElb/FRZq/wQE
+ Ff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcwRP8ZsPb/Ga71/xmv9f8YrfT/GK3z/xiu
+ 8/8YrPL/GKzx/xis8P8YrPD/F6vv/xep7v8Xqe3/F6ns/xSo7P9jY2P//v7+////////////////////
+ ////////AAAA////////////////////////////////////////////////////////////////////
+ ////////AAAA/wAAAP8AAAD/mZmZ/////////////f39//n5+f/19fX/LJ3G/y6eyP8woMr/MqPM/zSk
+ zv82pM//OabR/zqo0/87qdT/PqzW/0Gt2P9Cr9r/RK/b/0ax3P9Cps7/AAAA/wAAAP8yMzH/OTo3/zk6
+ N/85Ojf/Ozw5/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JD
+ QP85Ojf/OTo3/zk6N/8xMS//ICAf/xsbGv8nKaX/MzXY/zY42f8uMNb/Ky3U/yoszv8qLM7/KizO/yos
+ 0f8sLtb/NDbY/zM02P8sLtb/KizR/yoszv8qLM7/KizP/yst0v8sLtX/LC7W/ywu1v8sLtb/LC7W/ywu
+ 1v8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu1v8sLtb/LC7W/zc4Sf85Ojf/JSUk/xUVFP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/DFZ6/xit8/8YrvP/GKzy/xis8f8YrPD/GKzw/xer7/8Xqe7/F6nt/xep
+ 7P8XqOv/F6jp/2RgX/////////////////////////////////8AAAD/AAAA////////////////////
+ ////////////////////////////////////////Pz8//wAAAP8AAAD/AAAA/wAAAP8AAAD/////////
+ ///9/f3/+fn5//T09P8rnMX/LZ7H/y6fyf8xocv/M6PN/zWlz/83ptD/OafS/zup1P88qtX/P6zX/0Gt
+ 2f9Cr9r/RbHc/yNYbv8AAAD/AAAA/z5dev85Ojf/OTo3/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/80NTL/MDAu/xsb
+ Gv8bGxr/Jiid/zAy1/82ONn/MzXY/ywu1v8rLdT/KizP/yoszv8qLM7/LC7W/zQ22P82ONn/NjjZ/zEz
+ 1/8sLtb/Ky3S/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yoszv8qLM7/KizO/yst
+ 0v8rLdL/MjOG/zk6N/85Ojf/OTo3/zk6N/85Ojf/LzAt/wkKCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wlC
+ Xf8YrPH/GKvw/xes8P8Xq+//F6nu/xep7f8Xqez/F6jr/xao6v8Xp+j/aWNi//7+/v//////////////
+ ////////Pz8//wAAAP8AAAD/AAAA/wAAAP9/f3//////////////////////////////////Pz8//wAA
+ AP8AAAD/WVlZ//////////////////////////////////z8/P/5+fn/9PT0/ymbxP8sncb/Lp7I/zCh
+ yv8yosz/NKTO/zakz/83ptH/OafS/zup1P8+q9b/QK3Y/0Gu2f9Cr9v/AAAA/wAAAP8AAAD/RH64/zk6
+ N/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6N/85Ojf/MjIw/y8vLf8bGxr/Gxsa/yAhWP8sLtb/MTPX/zY4
+ 2f82ONn/MTPX/ywu1v8rLdP/Ky3S/y4w1v82ONn/NjjZ/zY42f82ONn/NjjZ/zY42f82ONn/NjjZ/zU3
+ 2P8zNdj/MDLX/y0v1v8tL9b/LjDW/y8x1v8rLdP/KizO/ygqx/8dHkD/MjIw/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/8vMC3/AAAA/wAAAP8AAAD/AAAA/wAAAP8Pb5v/F6vv/xeq7v8Xqe3/F6ns/xeo
+ 6/8WqOr/Fqjp/xao6P9qbGz//v7+//////////////////////8AAAD/AAAA/zMzM/9sbGz/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP9/f3///////8rKyv8zMzP/c3Nz////////////////////////////////////
+ /////////Pz8//n5+f/09PT/KZzE/yucxf8tnsf/Lp7J/zGiy/8zo83/NKTO/zal0P84p9L/OqjT/zup
+ 1f8+qtb/Qa7Z/0Ku2v8AAAD/AAAA/xoaGf9Hjtb/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf85Ojf/ODk2/zExL/8xMS//JiYk/xsbGv8bGxr/Hh4+/yYonf8sLtb/MTPX/zU32P82ONn/NjjZ/zY4
+ 2f82ONn/NjjZ/zY42f82ONn/MTPX/yst0/8qLM7/KizO/yoszv8qLM7/KizO/yoszv8rLdT/Ky3V/yMk
+ d/8bGxr/Gxsa/y8vLf80NDL/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wwM
+ C/8AAAD/AAAA/wAAAP8AAAD/F6nt/xep7P8XqOv/Fqjq/xao6f8Wp+j/Fqfn/2dvcf/+/v7/////////
+ /////////////7a2tv////////////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA
+ AP9mZmb/8vLy/////////////////xkZGf/////////////////8/Pz/+Pj4//T09P8omsL/KZvE/yyd
+ xv8tnsj/L6DK/zKizP80pM7/NaXP/zem0f85p9L/OqnU/z2q1f8+rNf/Qa3Z/wAAAP8AAAD/DQ0M/1CR
+ 0f9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zg5Nv8xMS//MTEv/zEx
+ L/8mJiX/Gxsa/xsbGv8bGxr/Gxsa/xwcKP8jJHj/IyR3/ygqtf8rLdb/LC7W/ywu1v8sLtb/Ky3V/ygq
+ sP8jJHf/IyR4/x0dM/8bGxr/Gxsa/xsbGv8lJST/Li4s/zExL/80NDL/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/wAAAP8AAAD/F6nr/xan
+ 6v8WqOn/Fqfo/xan5/8Wpub/ZHF2//7+/v//////////////////////////////////////////////
+ ////////Pz8//wAAAP8AAAD///////////9/f3//AgIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////
+ //////////////z8/P/4+Pj/9PT0/yeYwf8pnMT/KpzF/yyex/8unsn/MKHL/zKizf80pM7/NqXQ/zem
+ 0f85qNP/O6nU/z6q1v8/rNf/AAEB/wAAAP8AAAD/Q0RB/1Sn+/9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/zs8Of85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//Li4s/yYm
+ JP8mJiT/JCQj/yIiIP8hIR//JSUj/yYmJP8mJiT/JiYl/zAwLv8xMS//MTEv/zExL/8xMS//MTEv/zU1
+ M/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/8SEhL/AAAA/wAAAP8AAAD/Fqfp/xan6P8Wp+f/Fqbm/xam5f9icnj//f39////
+ ////////////////////////v7+//wAAAP9/f3//KCgo/wAAAP8AAAD/kJCQ////////////////////
+ //////////////////+ZmZn/AAAA/wAAAP8AAAD//////////////////Pz8//j4+P/09PT/JpjA/yeZ
+ wv8pnMT/K53G/yyeyP8unsn/MaHL/zOjzf80pM//NqXQ/zin0v86qdP/O6nV/z6r1v8kY3z/AAAA/wAA
+ AP9DREH/Q0NA/1Sn+/9Up/v/T4rF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9AQT7/OTo3/zk6N/85Ojf/NTUz/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zExL/8xMS//MTEv/zEx
+ L/8xMS//MTEv/zU1M/83ODX/OTo3/zk6N/85Ojf/Pj88/0JDQP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/QEE+/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8qKyn/AAAA/wAA
+ AP8AAAD/Fqfn/xam5v8VpeX/FaXk/2Nwdf/9/f3///////////////////////////9dXV3/AAAA/wAA
+ AP8AAAD/rKys////////////f39//wAAAP8AAAD/AAAA/wAAAP88PDz/////////////////Hh4e/wAA
+ AP/////////////////8/Pz/+Pj4//Pz8/8lmL//J5jB/yibw/8pnMX/LJ7H/y2fyP8vn8r/MqLN/zOj
+ zv81pM//NqbR/zmn0v86qNT/O6rV/z6r1/8AAAD/AAAA/wAAAP9DREH/Q0RB/0+Ozf9Up/v/VKf7/0+R
+ 0v9DQ0D/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf8+Pzz/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/89Pjv/Pj88/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf8+Pzz/OTo3/zk6N/85Ojf/OTo3/zk6N/8kJCL/AAAA/wAAAP8LU3P/FaXl/xWl5P8VpeP/ZW9y//7+
+ /v////////////////////////////////8AAAD/AAAA/////////////////wAAAP8AAAD/AAAA/z8/
+ P/8/Pz//Pz8//wAAAP////////////////////////////////////////////z8/P/4+Pj/8/Pz/yOX
+ vv8mmMD/J5nC/ymcxP8qncb/LJ7H/y6eyf8wocv/MqLN/zSkz/81pdD/NqbR/zmn0/86qNT/PKrW/y6A
+ of8AAAD/AAAA/wAAAP9DREH/Q0RB/0NEQf9Pj8//VKf7/1Sn+/9Up/v/S3We/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/1hZVv/w8PD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ojs4/zk6N/85Ojf/OTo3/zk6
+ N/8AAAD/AAAA/wAAAP8VpeT/FaTj/xWj4f9qbW3//v7+/////////////////////////////////wAA
+ AP9oaGj/////////////////KCgo/6Ghof//////v7+//7+/v/+ioqL//////1NTU///////////////
+ /////////////////////////Pz8//j4+P/z8/P/Ipa9/ySXv/8mmMH/J5nC/ymcxf8rncb/LJ7I/y6f
+ yv8woMv/MqLN/zSkz/81pdD/N6bS/zmo0/86qdX/ParW/w8qNf8AAAD/AAAA/wAAAP8iIiH/Q0RB/0NE
+ Qf9DREH/Sm2O/1Sn+/9Up/v/VKf7/1Sn+/9HXXD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/cnNw//////90dHL/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6N/85Ojf/OTo3/zk6N/8AAAD/AAAA/w97qv8VpOL/FqPg/2to
+ aP/+/v7///////////////////////////////////////////////////////////9/f3//WVlZ/3h4
+ eP8AAAD/JCQk/wAAAP+UlJT/AAAA///////////////////////////////////////8/Pz/9/f3//Pz
+ 8/8hlLv/I5a+/yWYwP8mmMH/KJrD/ymbxf8rncf/LJ7J/y6fyv8xosz/MqLN/zSkz/82ptH/N6fS/zmp
+ 1P86qdX/PavW/yt4lv8AAAD/AAAA/wAAAP8AAAD/ICAf/0NEQf9DREH/Q0RB/0NEQf9LdZ3/VKf7/1Sn
+ +/9Up/v/S3Wd/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf////////////////9vcG7/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/////////
+ //9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Ozw5/zk6
+ N/85Ojf/OTo3/wAAAP8AAAD/Axki/xWj4f8Wot//amNi//7+/v//////////////////////////////
+ /////////////////////////////1FRUf8AAAD/AAAA/wAAAP8AAAD/AAAA/zs7O/+RkZH/////////
+ //////////////////////////////v7+//39/f/8/Pz/yCTuv8hlLz/I5e//yWYwP8nmcL/KZzE/yqd
+ xv8snsf/LJ/J/y+gy/8xocz/MqLN/zSl0P82ptH/N6jT/zmp1P87qtX/PavX/z6r2P8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8yMzH/Q0RB/0NEQf9DREH/REpM/1Om+v9Up/v/VKf7/0dcb/9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//Pz8/+goJ//8/Pz////
+ ///Pz8//Q0RB/0NEQf9CQ0D/u7u6////////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zk6N/85Ojf/AAAA/wAAAP8AAAD/FKLg/xOh
+ 3/9mZGP/////////////////////////////////////////////////////////////////8/Pz/wAA
+ AP8AAAD///////////8AAAD/AAAA/xYWFv8AAAD/SUlJ////////////////////////////+/v7//f3
+ 9//z8/P/H5O6/yGTu/8hlL3/JJe//yWYwf8nmcL/KZzF/yqdxv8snsj/LZ/J/y+gy/8yos3/M6PO/zSl
+ 0P82p9L/N6fT/zmo1P87q9b/PavX/z6r2P9Artn/AgcJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/DQ0M/0JD
+ QP9DREH/Q0RB/0NDQP9Up/v/VKf7/0+NzP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB///////////////////////+/v7/3Nzb////
+ ////////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9CQ0H/OTo3/zxOXv8GDBH/AAAA/wAAAP8Uod//DaDf/15fX//+/v7/////////////////////////
+ /////////////////////////////wAAAP8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAA
+ AP8AAAD///////////////////////7+/v/7+/v/9/f3//Pz8/8dkrn/H5K6/yGUvP8ilb3/JZjA/yaZ
+ wf8nmsP/KZvF/yqdx/8snsj/Lp/K/zCgy/8yos3/M6PO/zWl0P82ptL/N6fT/zmo1P88qtb/PKvX/z6s
+ 2P8+rdn/EpvS/wlNaf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8uLy3/Q0RB/0NEQf9HX3X/VKf7/0+O
+ zP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9KS0j/VFVS/1RVUv9LTEn/Q0RB/0NEQf94eHb/Q0RB/6Cg
+ n///////////////////////rq6t/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/R47W/wAAAP8AAAD/AAAA/xSh
+ 3f8Nndz/bW9v//7+/v////////////////////////////////////////////////9/f3//AAAA/wAA
+ AP9MTEz/AAAA/wAAAP+UlJT/BwcH////////////Pz8//39/f////////////////////////v7+//v7
+ +//39/f/8vLy/xyQt/8ekrn/IJO7/yGUvP8ilr7/JZjA/yaZwv8nmsP/KZvF/yqdx/8sn8n/LqDK/zCh
+ zP8xos3/MqPO/zWl0P82p9L/N6jT/zmp1f87qtb/PavX/w+Yz/8RmtH/EprS/xKa0/8Sm9T/BTBC/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/MjMx/0NEQf9DR0f/VKf7/0dcb/9DREH/Q0RB/0NEQf9DREH/T1BN/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL//v7+/////////////////5+fnv9DREH/Q0RB/1NUUf///////v7+/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/SGaB/02a6P88Tl7/AAAA/wAAAP8KUG7/FKDc/xub0f+JiYn/////////////////////////
+ //////////////////////////////////8AAAD/////////////////f39//wAAAP//////////////
+ ///////////////////////////////////+/v7/+/v7//f39//y8vL/G4+2/xyQt/8ek7r/IJS7/yGU
+ vf8jl7//JZjB/yaZwv8omsT/KZvF/yueyP8sn8n/LqDK/zChzP8yos3/MqPO/zWl0P82ptL/N6fT/zmp
+ 1f8bnM7/EZjO/xGZz/8RmdD/EprS/xKa0/8Sm9T/EpzV/w11oP8AAAD/AAAA/wAAAP8AAAD/EBAP/0NE
+ Qf9GW2z/VKf7/0NEQf9DREH/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9XWFX//////4yN
+ i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf/39/b///////////+ioqH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9IY3z/UJDQ/1Sn+/9Up/v/R15z/yorKP8AAAD/AAAA/xSg
+ 3P8Tn9v/LIy1/7y8vP///////////////////////////////////////////////////////////+7u
+ 7v////////////////9/f3//AAAA/2JiYv//////f39//yIiIv8AAAD///////////////////////7+
+ /v/7+/v/9/f3//Ly8v8ajrX/G4+2/xyRuP8fk7r/IJS7/yGUvf8kl7//JZjB/yeZwv8omsT/KZzF/yue
+ yP8sn8n/LqHL/zChzP8xos3/M6TP/zWk0P82ptH/MKXR/xCXzP8Rl83/EZjO/xGZz/8RmdD/EprR/xKa
+ 0/8Sm9T/EpzV/xKc1v8OdaH/AAAA/wAAAP8AAAD/AAAA/0NEQf9QlNj/RE9W/0NEQf9DREH/T1BN/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1NUUf/+/v7/R0hF/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf///////////3JycP9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/RFBY/0t1nv9Me6n/U6b5/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/VKf7/1Sn
+ +/9Up/v/THqn/0NEQf9DREH/AAAA/wAAAP8AAAD/E5/a/xOe2f9QfI3/6enp////////////////////
+ ////////////////////////////////////////Hh4e/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP+Kior//////////////////v7+//v7+//29vb/8vLy/xmNs/8ajrX/G5C3/x2R
+ uf8fk7r/IJS8/yGVvf8kmMD/JZnB/yeaw/8omsT/KZzG/yudx/8sn8n/L6HL/zChzP8yos3/M6TP/zWk
+ 0P8Plcn/EJbK/xCXzP8Rl83/EZjO/xGYz/8RmdD/EZrR/xKa0v8Sm9P/EpzU/xKc1v8Tndf/BCc1/wAA
+ AP8AAAD/EBEQ/0NEQP9TpPX/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL/Q0RB/42OjP9zdHL/QkNA/0NEQf9DREH/Q0RB/8LCwf//////Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NGRf9RmeH/VKf7/1Sn+/9Up/v/VKf7/1Sn
+ +/9Up/v/VKf7/1Sn+/9Pjs3/S3Wd/0t0nP9DQ0D/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/AAAA/xOf
+ 2v8Tntn/E57X/2ducf/+/v7/////////////////////////////////////////////////////////
+ //8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////////////
+ ///+/v7/+vr6//b29v/y8vL/F4uy/xmNtP8ajrX/HJC3/x6Suf8fk7v/IJS8/yGVvv8kmMD/JZjB/yea
+ w/8om8T/KZzG/yqeyP8sn8r/LqHL/y+hzP8xos3/EJTH/xCVyP8Qlcn/EJbK/xCXzP8Rl83/EZjO/xGZ
+ z/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc1f8SnNb/BCc1/wAAAP8AAAD/Q0RB/1Sn+/9DREH/Q0RB/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9/gH7////////////39/f//////4yN
+ i/9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9Up/v/VKf7/1Sn+/9NgLP/Rldl/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/MzQx/wAAAP8AAAD/AAAA/wAAAP8LZYr/E57Y/xOe2P8Undb/ZmFg////////////////////
+ /////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////////7+/v/6+vr/9vb2//Hx8f8WirD/F4uy/xmO
+ tP8aj7b/HJC3/x6Tuv8fk7v/IJS8/yGVvv8kmMD/JZnC/yeaw/8om8X/KZzG/yqdyP8sn8r/LqHL/yGb
+ yf8Pk8X/D5TH/xCVyP8Qlcn/EJbK/xCWy/8RmM3/EZjO/xGYz/8RmdD/EZnR/xKa0v8SmtP/EpvU/xKc
+ 1f8SnNb/AAAA/wAAAP8PDw7/S3Wd/0lqiv9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv92d3T/////////////////XF1a/8PEw///////Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9ESk7/VKf7/1Ol+P9DRED/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9CQ0D/Kysp/yEiIP8hIiD/Hh4d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dnai/xOe
+ 2P8Tndf/Ep3W/wqa1/9wcXL//v7+////////////////////////////////////////////////////
+ ////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////
+ /////////v7+//r6+v/29vb/8fHx/xaKr/8WirH/GIyy/xmOtf8aj7b/HJC3/x6Suv8fk7v/IJS9/yGV
+ vv8kmMD/JZnC/yebw/8om8X/KZzG/yqdyP8rnsn/D5LD/w+SxP8Pk8X/D5TH/xCVyP8Qlsn/EJbK/xCW
+ y/8Ql8z/EZfN/xGYzv8Rmc//EZnQ/xGa0f8SmtL/EpvT/xKc1P8GNUj/AAAA/wAAAP9DREH/VKf7/0NE
+ Qf9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS//////9UVVL/VFVS/87Ozf/c3dz/////////
+ ////////0NDP/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/1Sn
+ +/9HXG//Q0RB/0NEQf8iIyH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CU9s/xOe2P8Tndf/E53X/xKc1v8SnNX/H5XF/7u7u///////////////
+ //////////////////////////////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA///////////////////////+/v7/+vr6//b29v/x8fH/FYqu/xaK
+ sP8WirH/GI2z/xmOtf8aj7b/HJG4/x6Suv8fk7v/IJS9/yKWvv8kl8D/JZnC/yebw/8om8X/KZzG/w2Q
+ wP8OkcL/D5LD/w+SxP8Pk8X/D5TG/xCVyP8Qlsn/EJXK/xCXy/8Ql8z/EZfN/xGYzv8RmM//EZnQ/xGZ
+ 0f8SmtL/EprT/xKb1P8AAAD/AAAA/zAxL/9Tpvr/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv/Dw8L/qaqo/1RVUv9UVVL/wMDA//////+goJ//Q0RB/0NEQf+hoaD/QkNA/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/RVJb/0NEQf8ODg7/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAID/wlPbf8Nb5j/E57Z/xOe2P8Tndf/E53X/xKc
+ 1v8SnNX/EpzU/xKb0/9YeYX//Pz8////////////////////////////////////////////////////
+ //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1lZWf//////////////
+ //////////////39/f/6+vr/9vb2//Hx8f8Uiaz/FYuv/xaKsP8Wi7H/GI2z/xmOtf8bj7f/HJC4/x6T
+ uv8flLz/IZS9/yKWvv8kl8D/JZnC/yabw/8Vk7//DpC//w6QwP8OkcL/D5LD/w+SxP8Pk8X/D5TG/w+U
+ x/8Qlcj/EJbK/xCXy/8Ql8z/EZjN/xGYzv8RmM//EZnQ/xGZ0P8RmtH/EprS/wAAAP8AAAD/AAAA/0ZW
+ ZP9Nf7L/S0xJ/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS////////////qaqo////////////////////
+ //9VVlP/Q0RB/6Okov+hoaD/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/TorG/0py
+ mP87Ozn/AAAA/wAAAP8AAAD/AAAA/wAAAP8mXHP/NoKi/0u35f9Kt+X/Srbk/0m25P9JteP/R7Xj/zmv
+ 3/8Tntn/E57Z/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprR/2JfX//+/v7/////////
+ ////////////////////////////////////////////////////////////////////////jIyM/39/
+ f/9/f3//jIyM/////////////////////////////////////////////f39//r6+v/19fX/8fHx/xGG
+ q/8Uiq3/FYqv/xaKsP8Wi7L/GY20/xmPtf8bkLf/HJG4/x6Suv8flLz/IJS9/yKWvv8kl8D/IZfB/w2O
+ vP8Oj77/DpC//w6QwP8OkcH/D5LD/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJXJ/xCWyv8Qlsv/EJfM/xGX
+ zf8RmM7/EZjP/xGZ0P8RmdH/CU1p/wAAAP8AAAD/Q0RB/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL///////////////////////////////////////////+0tbP//////6GhoP9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0ZVYf9TpPb/QkNA/wAAAP8AAAD/AAAA/xUzQP9Lt+X/Srbk/0q2
+ 5P9JtuT/SbXj/0m14/9IteP/R7Ti/0az4v9Gs+H/RbPh/xOe2P8Tndf/E53X/xKc1v8SnNX/EpzU/xKb
+ 1P8SmtP/EprS/xGa0f8kjrj/xsbG////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////8/Pz/+/v7//Pz8//Cw8P/EYaq/xKHq/8Uia3/FYqv/xaKsP8Wi7L/GI2z/xmP
+ tf8aj7f/HJC4/x6Suv8flLz/IJW9/yKVvv8Mjbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/D5LC/w+S
+ xP8Pk8X/D5TG/w+Ux/8QlMj/EJXJ/xCVyv8Qlsv/EJbM/xGXzf8RmM7/EZjO/xGZz/8RmdD/AAAA/wAA
+ AP8hIiD/THuq/0dec/9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv//////////////////////////////
+ ////////////////////////oKGf/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/VKf7/0NE
+ Qf8AAAD/AAAA/wAAAP9HsN3/Sbbj/0m24/9IteP/SLXj/0e04v9GtOL/RrPh/0Wy4f9Fs+H/RLLg/0Sy
+ 3/9Csd//EJzW/xKc1v8SnNX/EpzU/xKb1P8SmtP/EprS/xKa0f8RmdH/DpjQ/2ZlZP/+/v7/////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////v7+//7+/v/+/v7//v7+/+zs7P+7vLz/g39+/15jY/9MdoL/IoKg/wmD
+ qv8QhKj/EYaq/xKHrP8Uiq3/FYuv/xaKsf8Wi7L/GI2z/xmPtv8aj7f/HJC4/x2Suv8flLz/DYy4/wyM
+ uP8Njbr/DY27/w2OvP8Oj73/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8Qlcf/EJXI/xCW
+ yf8Qlsr/EJbL/xCWzP8Rl83/EZjO/xGYz/8AAQH/AAAA/wAAAP9DREH/VKf7/0tMSf9UVVL/VFVS/1RV
+ Uv9UVVL/VFVS//////////////////////////////////////////////////////+FhYP/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/1On+/9ETVL/Dg4N/wAAAP8AAAD/NYep/0e14v9GtOL/RrPi/0az
+ 4f9FsuH/RbPh/0Sy4P9EsuD/Q7Hf/0Kx3/9Csd//QLDe/0Cv3f8Yntb/EpzU/xKb1P8SmtP/EprS/xKa
+ 0f8RmdH/EZnQ/xGZz/8kjrj/YWhp/3t1df+dnJz/wMHB/9jY2P/n5+f/7/Dw//j4+P/8/Pz//f39//39
+ /f/+/v7//v7+//39/f/9/f3//Pz8//b29v/v7+//5+jo/93e3v/Fxsb/paWl/4eDgv9tbGz/WGNm/013
+ g/8ug5//G4uv/wyIsf8Tiq//Eomu/xCHrP8Phar/DoWp/w+Ep/8Qhaj/EYer/xKHrP8Uia3/FYuv/xaK
+ sf8Wi7L/GI2z/xmPtv8aj7f/HJC4/xaPt/8Mirb/DIu3/wyMuP8Njbn/DY27/w2OvP8Njr3/DpC+/w6Q
+ v/8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Uxv8PlMf/EJXI/xCVyf8Qlsr/EJfL/xCXzP8Ql8z/EZfN/w59
+ qf8AAAD/AAAA/z9APf9Soe//R1tt/1RVUv9UVVL/VFVS/1RVUv9UVVL/5OXk////////////////////
+ /////////////////////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9OicT/TX6w/zAx
+ L/8AAAD/AAAA/xEsOP9Fs+H/RbLg/0Sy4P9EsuD/RLLg/0Ox3/9Dsd//QrHf/0Gx3v9AsN7/QK/d/z+v
+ 3f8/rtz/Pq7c/zCo2P8SmtP/EprS/xGa0f8RmdH/EZnQ/xGZz/8RmM7/EZjO/xGXzf8Rl8z/EpfL/wyV
+ y/8Klcv/CZLJ/xOVxv8VksH/GY+8/x6Quf8hj7b/I4+1/ySPtP8ijrP/II2z/x2Ms/8Yi7X/FIy2/xKO
+ uf8MjLj/CIq4/wiKuP8Iibb/GI+3/xiOtv8XjrX/Foy0/xaLsv8Ti7H/Eoqv/xKJrv8Qh6z/D4Wq/w6E
+ qf8Ng6f/DoOm/w+Ep/8Qhqn/EYer/xKHrP8Uia3/FYuw/xaKsf8Wi7L/GI2z/xmPtv8aj7b/C4iz/wyK
+ tP8Mirb/DIu3/wyLuP8Njbn/DY26/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w+Sw/8PksT/D5PF/w+T
+ xf8PlMb/EJXH/xCVyP8Qlsn/EJbK/xCWy/8Ql8z/EZfM/wAAAP8AAAD/AAAA/0NEQP9Up/v/S0xJ/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL///////////////////////////////////////////+Jioj/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/R1xv/1Ok9/9DREH/AAAA/wAAAP8AAAD/Q7Hf/0Ox3/9Csd//QrHf/0Gx
+ 3v9Bsd7/QK/e/0Cv3f8/r93/P6/d/z+u3P8+rtz/Pa7b/z2t2/89rdr/PKza/xGZ0f8RmdD/EZnQ/xGY
+ z/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlsr/EJXJ/xCVyP8PlMf/D5TG/w+Txf8PksT/D5LD/w6R
+ wv8OkcH/DpDA/w6Qv/8Oj77/DY68/w2Ou/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyJtP8LibP/Fo61/xaN
+ tP8Wi7L/E4qx/xKKr/8SiK3/EIes/w+Gq/8Ohan/DYOn/wyCpv8MgaT/DoOm/w+Ep/8QhKj/EYar/xKH
+ rP8Uiq7/FYyw/xaKsf8Wi7L/F42z/wqHsP8LiLL/C4mz/wyKtP8MirX/DIu3/wyLuP8NjLn/DY26/w2O
+ u/8Njrz/Do++/w6Qv/8OkMD/DpHB/w6Rwv8PksP/D5LE/w+Txf8PlMb/D5TH/xCVyP8Qlcj/EJbJ/xCW
+ yv8Qlsv/CEtm/wAAAP8AAAD/Q0RB/1Ke6/9Kc5r/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/X2Be/9nZ
+ 2f//////////////////////aWpn/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NDQP9Up/v/Q0RB/wAA
+ AP8AAAD/AAAA/0Cw3v9AsN7/QK/d/0Cv3f9Ar93/P6/d/z+v3P8/rtz/Pq7c/z6u2/89rdv/Pa3b/z2t
+ 2v88rNr/OqvZ/zqr2f85qtj/D5jP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCV
+ yP8PlMf/D5TG/w+Uxv8Pk8X/D5LE/w+Sw/8OkcL/DpHB/w6Qv/8OkL7/DY69/w2OvP8Njbv/DY26/w2M
+ uf8Mi7f/DIq2/wyKtf8MibT/C4iz/wuIsf8Lh7D/Fouy/xOKsf8Siq//Eoiu/xCHrP8Phqv/DoWp/w2C
+ p/8Ngqb/CoGl/wyBo/8MgaT/DoOm/w+Ep/8Qhan/EYar/xKHrP8UiK3/FYyw/xWKsf8OiK//C4av/wuH
+ sP8LiLL/C4iz/wyJtP8MirX/DIq2/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY+9/w6Qvv8OkL//DpDA/w6R
+ wf8PksP/D5LD/w+SxP8Pk8X/D5PG/w+Ux/8Qlcj/EJbJ/xCWyf8Qlsr/AAAA/wAAAP8NDQz/Q0RB/1Sn
+ +/9DRED/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/VKf7/0NEQf8ODw7/AAAA/wAAAP8vgqX/P67c/z+u3P8/rtz/Pq/c/z6u
+ 2/89rdv/Pa3b/z2t2v88rdr/PKza/zus2f86q9n/OavZ/ziq2P84qtj/N6rX/zep1v8Vms//EZfN/xGY
+ zf8Ql8z/EJbL/xCXy/8Qlcr/EJXJ/xCVyP8QlMf/D5TH/w+Uxv8PksX/D5LE/w+Sw/8OkcL/DpHB/w6Q
+ wP8OkL//Do++/w2Ovf8Njrz/DY27/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuG
+ r/8PiK//Eomv/xKIrv8Qh6z/D4ar/w6Fqf8Ng6f/DYOm/wqCpf8JgKP/C4Ci/wyBo/8NgqT/DoOm/w+F
+ qP8Qhan/EYer/xGHrP8TiK3/E4uv/wqErf8Kha7/C4av/wuHsP8LiLH/C4mz/wyJtP8MirX/DIq2/wyL
+ t/8NjLj/DY26/w2Nu/8Njrz/DY69/w6Pvv8OkL//DpDA/w6Rwf8OkcL/D5LD/w+SxP8Pk8X/D5PF/w+U
+ xv8PlMf/EJXI/xCWyf8GP1X/AAAA/wAAAP9DREH/SnOZ/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RV
+ Uv9UVVL/VFVS/0dIRf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0NA/1Sn+/9FUVr/IyQj/wAA
+ AP8AAAD/Dys2/z2u2/89rdr/Pa3a/zyt2v88rdr/O6za/zur2f86q9n/OqvZ/zmr2P85qtj/OKrY/zeq
+ 1/83qdf/N6nW/zao1v81qNX/NafV/yei0f8Ql8z/EJbL/xCWyv8Qlsr/EJbJ/xCVyP8QlMf/D5TH/w+T
+ xv8Pk8X/D5LE/w+Sw/8PksL/DpHC/w6Rwf8OkL//Do++/w6Pvf8Njrz/DY67/w2Nuv8NjLn/DIu4/wyL
+ t/8Mirb/DIq1/wyJs/8LiLL/C4ex/wuHsP8Lhq//CoWt/wqErP8RiK3/EIes/w+Gq/8Ohan/DYOn/w2D
+ pv8LgaX/CoCj/wl/ov8KgKH/C4Ci/wyBo/8MgaT/DoOm/w+FqP8Phan/EIar/xGHrP8JhKr/CoSr/wqF
+ rf8Kha7/C4av/wuHsP8LiLH/C4iy/wyJtP8MirX/DIq2/wyLt/8Mi7j/DYy5/w2Nuv8Njrv/DY68/w2P
+ vf8OkL7/DpC//w6QwP8OkcH/DpHC/w+Sw/8PksT/D5PF/w+Txf8PlMb/D5TH/xCVyP8AAAD/AAAA/wAA
+ AP9DREH/U6Lz/1Sn+/9DREH/VFVS/1RVUv9UVVL/VFVS/1RVUv9TVFH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0ZZaP9Up/v/R1xu/zIzMf8AAAD/AAAA/wAAAP86q9n/OqvZ/zqr2f85q9n/OarY/zmq
+ 2P85qtj/OKrY/ziq1/83qtf/N6nX/zap1v82qdb/NajV/zWn1f81p9X/NKbU/zOm0/8zptP/MqbS/xCW
+ yv8Qlcn/EJbJ/xCVyP8PlMf/D5TH/w+Txv8Pk8X/D5LE/w+SxP8PksP/DpHC/w6Rwf8OkMD/DpC//w6P
+ vv8Njr3/DY68/w2Nu/8Njbr/DYy5/wyLuP8Mirb/DIq1/wyKtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqF
+ rf8KhKz/CoSr/wqDqv8Phqv/DoSp/w2Dp/8Mgqb/CoKl/wl/o/8Jf6L/CH6g/wh9n/8KgKH/Cn+i/wyB
+ o/8MgaT/DoOm/w+FqP8Phan/CYKo/wmDqf8Kg6r/CoSr/wqErP8Kha7/C4av/wuHsP8Lh7H/C4iy/wuJ
+ s/8MirT/DIq1/wyKtv8Mi7j/DYy5/w2Nuv8Njbv/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R
+ wv8PksP/D5LE/w+Txf8Pk8X/D5TG/wdQa/8AAAD/AAAA/ywtK/9DREH/VKf7/1Sn+/9FVGD/R0hF/1NU
+ Uf9UVVL/S0xJ/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9PjMj/VKf7/0ZXZf9CQ0D/AAAA/wAA
+ AP8AAAD/N6rX/zeq1/83qtf/N6rX/zep1/83qtf/N6nW/zap1v82qdb/NafV/zWn1f81p9X/NafU/zSn
+ 1P8zptP/M6bT/zOm0/8yptL/MaTR/zCk0f8wo9D/D5XI/xCVyP8PlMf/D5PG/w+Uxv8Pk8X/D5LE/w+S
+ xP8PksP/DpHC/w6Rwf8OkMD/DpC//w6Qvv8Nj73/DY68/w2Ou/8Njbr/DY25/wyLuP8Mi7f/DIq2/wyK
+ tf8MibT/C4iz/wuIsv8Lh7H/C4av/wuGrv8Kha3/CoSs/wqEq/8KhKr/CYOp/wqDqP8Ng6f/DIKm/wqC
+ pf8Jf6P/CX+i/wh+of8Ifp//B3ye/wh9n/8JfqD/CoCi/wyBo/8MgaT/DYOm/wyDpv8Jgqf/CYOo/wmD
+ qf8KhKr/CoSr/wqErP8Kha3/C4au/wuHsP8Lh7H/C4iy/wuIs/8MibT/DIq1/wyKtv8Mi7f/DIu4/w2N
+ uf8Njbr/DY67/w2OvP8Njr3/Do++/w6Qv/8OkMD/DpHB/w6Rwf8OkcL/D5LD/w+SxP8PksT/D5PF/wAA
+ AP8AAAD/AAAA/0JDQP9DREH/Upvk/1Sn+/9Tpvr/RVBY/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9LdZ3/VKf7/1Sn+/9DREH/QUI//wAAAP8AAAD/AAAA/zap1v82qdb/NajV/zWo1f81qNX/NajV/zWn
+ 1f81p9X/NafU/zSm1P80ptP/M6bT/zOm0/8zptP/MqbS/zKl0f8xpNH/MKPQ/zCi0P8wos//L6LP/y6i
+ zv8Rlcf/D5TG/w+Txf8Pk8X/D5LE/w+Sw/8PksP/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2O
+ vP8Njbv/DY26/w2Muf8Mi7j/DIu3/wyKtv8MirX/DIm0/wuIsv8LiLH/C4ew/wuGr/8Kha7/CoWt/wqE
+ rP8KhKv/CoSq/wmCqP8Jgqf/CYGm/wyCpf8KgaX/CYCj/wl/ov8IfqH/CH6f/wd9nv8HfJ3/CHye/wh9
+ n/8Jf6D/CoCi/wuAo/8MgaT/CYGk/wmBpf8Jgab/CYOo/wmDqf8Kg6r/CoSr/wqErP8KhK3/Coau/wuG
+ r/8Lh7D/C4ix/wuIsv8MibP/DIq1/wyKtv8Mi7f/DIu4/w2Muf8Njbn/DY26/w2Ou/8Njrz/DY69/w6P
+ vv8OkL//DpDA/w6Rwf8OkcH/DpHC/w+Sw/8PksP/D5LE/wAAAP8AAAD/AAAA/0NEQf9DREH/R1xv/1Sn
+ +/9Up/v/VKf7/1Sn+/9Tpvr/U6T2/1Sn+/9Up/v/VKf7/1Sn+/9LdJv/Q0RB/zIzMf8AAAD/AAAA/wAA
+ AP8xncf/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/M6bT/zOm0/8zptP/MqbS/zKl0v8xpNH/MaTR/zCj
+ 0P8wo9D/MKPQ/y+iz/8vo8//LaLO/y2izv8soc3/K6DN/x+ayf8PksT/D5LE/w+Sw/8PksP/DpHC/w6R
+ wf8OkMD/DpC//w6Qv/8Oj77/DY69/w2OvP8Njbv/DY26/w2Nuf8MjLj/DIu3/wyKtv8MirX/DIm0/wuI
+ s/8LiLL/C4ex/wuHsP8Lhq//CoWu/wqErf8Khaz/CoSq/wqDqf8Jg6j/CYGn/wmCpv8JgaX/CICk/wl/
+ o/8Jf6L/CH6h/wh+n/8HfZ7/B3yd/wd7nP8HfJ3/B3ye/wh9n/8JfqD/CoCi/wh/ov8IgKP/CICk/wmB
+ pf8Jgqb/CYKn/wmCqP8KhKr/CoWr/wqErP8KhK3/CoWu/wuGr/8Lh7D/C4ex/wuIsv8LiLP/DIm0/wyK
+ tf8Mirb/DIu3/wyLuP8NjLn/DY26/w2Nu/8Njrz/DY68/w2Ovf8Oj77/DpC//w6QwP8OkMD/DpHB/w6R
+ wv8PksL/C3Sb/wAAAP8AAAD/AAAA/zIzMP9DREH/Q0RB/0NFQ/9Meqf/VKf7/1Sn+/9Up/v/VKf7/1GZ
+ 4P9HXG//Q0RB/0NEQf8SEhH/AAAA/wAAAP8AAAD/Koqu/zKl0f8ypdH/MaTR/zGk0f8xpNH/MaTR/zGk
+ 0f8wpNH/MKPQ/zCj0P8wotD/MKPQ/y+iz/8vo8//LqPP/y2izv8toc7/LKHN/yyhzf8roM3/Kp/M/yqg
+ zP8pnsr/KJ3K/w+Sw/8OkcL/DpHC/w6Rwf8OkMD/DpC//w6Pvv8Oj77/DY69/w2OvP8Njbv/DY26/w2N
+ uf8NjLj/DIu4/wyLt/8Mirb/DIq1/wyJtP8LiLP/C4iy/wuHsf8Lh7D/C4au/wqFrf8KhKz/CoSr/wqE
+ qv8Jg6n/CYKo/wmCp/8Jgab/CYGl/wiApP8IgKP/CH+i/wh+oP8Ifp//B32e/wd8nf8HfJz/AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAgAAAAAABAAABAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEFCf8CCg3/CwsL/wMJ
+ Ff8EExr/ERER/xcYFv8YGBf/EBYY/xAYGv8bGxv/HyAe/yAgH/8HCCT/Bhsj/xgdJ/8LDDj/HR44/wkh
+ K/8SIyn/BSg3/xIrNv8ZMTz/IyMj/ycoJv8nKCj/Kysr/zAwLv83Nzb/P0A9/0BBPv8ODkT/DxBK/xAR
+ Tv8RElf/HyBJ/wY1Sf8VN0X/Bz1T/xE+Uf8iPEj/NzhN/yAhWv8VFmf/Fxhy/yIjaP81NmL/IyR3/wdB
+ Wv8XRFb/KEhW/z1MV/8rUF//CEto/xJMY/8JUG7/ClV2/xJcfP8gTmH/K1Rm/zJZav85XHT/EmB+/yZi
+ ev81Y3b/RERD/0dIRf9JSkf/QEZK/0RKTP9LS0r/T1BN/1BRTv9ETVP/RVFa/1RVU/9fYF3/YGFe/0ZY
+ Z/9HXnL/SGB2/0hie/9Cb3v/SG55/1dvef9JcHz/WHJ7/2ZnZv9wcW//anV4/3d3d/+AgH7/GxyH/x0f
+ kf8eIJb/JieN/zEyhf8mKJb/Jiem/y4wrf8nKLn/C12A/wthhf8MZYv/EmaK/w1slf8SbZP/DXGc/wd8
+ nf8IfZ7/EnSY/yVth/86a4H/LXOM/zlziv8jd5H/LnWT/yZ5lP8re5T/JXuc/y1+mf87e5P/Dnek/wh9
+ of8Oe6n/EXuq/xF+sP8of6H/SWWA/0lohf9Jaor/SHiK/1F1hP9Idpj/ZXuC/3F+gv9MeKT/THys/0t/
+ sv8pK8z/LzHP/zEyzP8rLdP/LjDV/zM12P8tgZ3/M4Od/wmBpP8KhKv/D4iv/xKHrP8LhrD/C4m0/w2N
+ uv8Vi7P/DpC+/xyRuf8qhaX/OYik/yeNtf8wi7D/JJa8/zOSuP9cgI3/RYKa/3iDh/9oiJX/RIym/0aT
+ rv9fkab/TYK1/06FvP9Flrb/VJq5/2qbsv9Sob//E47E/w6Sw/8Olcr/DpjP/xCWy/8SnNX/KZvE/zKd
+ xP8hn9D/FKDc/y2hzP82o8v/KaTW/zOl0f85ptD/NqjV/zyp0/8zqdn/PKza/z6w3/8Vpub/GK3y/xmw
+ 9v8prOX/Na7j/yuw6/86suf/IrDy/ze38v9NicT/UI7M/0ufw/9Zn8D/UJDP/0iO1v9Qk9b/RaTJ/1Wm
+ yP9DrNX/V63S/0mx3P9Std3/ZKrK/2Gt0P9ot9v/TZbg/1Ga4/9Snuv/U6Du/0q14v9Xu+T/U6X5/0W+
+ 9v9Qv/L/Yr7m/13A6/9awvL/ZMLr/2rI8v9zzPX/e9D3/4aGhv+Qj4//kJGP/4eWm/+bm5v/m5+g/5qh
+ o/+np6f/urq6/8K/v//AwL//yMjI/9DPz//U1NT/5+fn//39/f8AAAD/AAAA/21tbW5ubm6UlJSUlJSV
+ lJWVlZWYlZmWmZmZmZmamZqampqampqyspqysrKysrKysrKdtZ21tbW1tbW1tbW1tbW1tbW1tbW1tbW1
+ tbOdtbKdsrKzsrKyspyynJyanJqampqampqZmZmZmZmWlpmYlZWVlZWUlZSVlJSUbZRtbW1tbW1ubpRt
+ lJSUlJWUlZWVlZmVmZWZmJmZmZqZnJmcmpyanJqyspyasrKysrKysrWdtbW1tbW1tbW1tbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tbW1tZ2ysrKyspyysrKcnJqcmpqampqamZmamZmZlpiYlZiVlZWUlJSUlJSUbpRt
+ bW1tbW1ulJSUlJSUlZSVlZWVlpWWmZmZmZmamZqZmpqampqcspqcsrKysrKds521tbW1tbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tJ21sp21srKysrKyspyympqampqamZmZmZmZlpiYlZiVlZWV
+ lJSUlG6UbXxtbW1ulG6UlJSUlZSVlZWVmZWVmZmZmZqampmamZycnJyysrKctbKysrWdtbW1tbW1tbW1
+ tbW1tbW1tbW1tbW1tba1tba1tba1tba1tbW1tbW1tbW1tbW1tbW1srKysrKcnJycnJqcmpqampmZmZmZ
+ mZaWlZWVlZWVlJWUlJSUbpRtbm2UlJSUlJSVlJWVlZWZlpmWmZmZmZmZnJqcnJycspyysrKynJ21tbW1
+ tbW1tbW1tbW1tbW1tba1trW2tba1tba1tbW1tba1tba1trW1tbW1tbW1tbW1tbKdtbKysrKysrKcnJqc
+ mpyZmpqamZmZmZiZmJWYlZWUlZSUlJRubnx8lG6UlJSUlZWVlZmVmZmVmZmZmZqampqcmpycnJycsrKy
+ s7K1tbW1tbW1tbW1trW1tra2trW2tbW1trW2tba2tba2tra2tba1tba1tba1tbW1tbW1tbW1tbW1tZ2y
+ tLKysrKcspqcmpyamZmamZmZmZaYmJWVlZWVlJWUlJSUbW6UlJSUlZSVlZWVlZWWmZmZmpmamZqcmpyc
+ nLKysrKynbKdtbW1tbW1tbW1tbW1trW1tbW1trW2tra2tra2tra2tra2tra2tra2tba2tba2tba1tbW1
+ tbW1tbW1tbKdsrKysrKcnJycmpqanJmampmZmZmVmZWVlZWUlZSUlJSUfJSUlJWUlZWVlZmVmZaZmZma
+ mZqampycnLKcsrKys7K1tbW1tbW1tbW1tbW2trW1tra2tra2tra2tra2tra2tra2tra2tra2tra2trW2
+ tbW2tbW2trW1trW1tbW1tbW1tZ2ysrKcnJycnJqampmZmZmZlpmWmJWVlZWVlJWUlJSUlJSVlJWVlZWV
+ mZaZlpmZmZqampycnJycsrKcnLKdtbW1tbW1tbW1tba2tbW1tra2tra2tra2tra6tra2tra2tra2tra2
+ ura2tra2tra2tra2trW1trW1tbW1tbW1tbW1sp21nLWyspycnJqcmpyZmpqZmZaZmJmVlZWVlJWUlJSU
+ lJWUlZWVlZmWmZmZmpmampqanJycnLKdsrOztbW1tbW1tbW1tra1tbW2tra2tra2tra2trq2tra2trq6
+ ura6urq2tra2tra2tra6tra2tra2tra1trW1trW1tbW1tbW1tbW1nLKysrKcnJqamZyZmZmZmZaYlZWV
+ lZWVlJSUlJWUlZWVlZmVmZmWmZmZmpqanJycnLKynLKynbW1tbW1tbW1trW1tba2tra2tra2tra2trq2
+ trq2tra6tra2ura2tsW2tra2trq2ura2ura2tra2tra2tra1tra1tbW1tbW1tbKys7KynLKcnJycmZya
+ mpmZmZmZlZmVlZSVlJSUlJWVlZWZlZmWmZmZmpqampycnJyysrKzs7W1tbW1tbW2tba1tra2tra2tra2
+ tra2tra2trq6trq6xbbFtrq2xbq2trq6xbbFtrq2ura2trq2ura2tra2tra1tba2tbW1tbW1tbWdsrKz
+ nLKynJycmZqZmZmZmZmVlpWVlZWVlZWUlZWVlZaZmZaZmpmampqcnJyysp2ysp21tbW1tbW1tbW1tba2
+ tra2trq2trq2tsW2xbq6urq6tra6trbFtsW2tsW2ura2urq2urq2urq6tra2tra2tra2tra2tbW1tbW1
+ tbW1tbWysrKyspycnJycmpqcmpmZmZmYmJiVlZWUlJWVlZWZlZmZmZqZmpqanJycnLKysrOytbW1tbW1
+ tbW2tra2tra2tra2tra6trq6ura2tra6urWbfmg6OjY2Nzg6OWtvm7W2usW6urq6trq6urq6trq2tra2
+ tra2tra2trW1tbW1tbW1nbKysrKcnJycmpmZmZmZmZmVmJWVlZWVlZWZlZmWmZmZmZqampycnLKynbK1
+ nbW1tbW1tbW2tbW2tra2tra2tra2ura6ura2tn46MRUEAQAAAQEAAAEAAAAAAAEAAAQPJThrsbrFtra6
+ tra6ura6tra2tra2trW1tra1tbW1tbW1s521spyynJycmpqampmZmZmYmZWVlZWWlZmVmZmZmpmampqc
+ nJyysrKytbK1tbW1tba1tbW2tra2tra2tra6tsW2urZ+ORUBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAEBBSdptbbFura6ura2ura2tra2tra1tba1trW1tbW1srKcspycnJycnJqZmpaZmZaVlZiVlZWWlZaZ
+ mZmZmpqcnJycsp2ysrKytbW1tbW1tba2tra2tra2trbFtra6tn4xBQAAAAAAAAAAAwEBAwMLGBgYGA0Y
+ DQgDAAAAAAAAAAAAAAEAFTmxxba6urq2tsW2tra2tra2tbW1tbW1tbW1s7OysrKcnJyanJmampmZmZmY
+ lZWVlpiZmZmZmpqampqcnJyysrK1srW1tbW1tbW2tba2tra2tra6tra2tTkPAAAAAAAAAAEIHEdYW+/v
+ 8vXy8/Lz9fL18vLy7llNQhoDAAAAAAAAAAAVara2trq6tra2trq2tra2tra1trW1tbW1nbKcspycnJyc
+ mpqZmZmZlpiYlZeWlpaZlpqZmpqcnLKcnLKysrK1tbW1tba1trW2tra2trq2tra2tTYDAQAAAAADCEJY
+ 7/Ly8vPy9fPy8/Lz8vLy8vLz8vL18vPy8vLuTR0DAAAAAAAABDq1urq6urq2tra2tra2tbW1tbW1tbW1
+ tbWysrKcnJyampqampmZmZiWoqKdlpqWmpmcmpycnLKysrW1tbW1tbW1trW1ura2trbFtrq6tjgEAAAA
+ AAELTO7y8vXy8vPy8/Ly8vLy8vLy8vLz8vLz8vLy8/Lz8/Ly8/JbQwgAAAAAAAI2tbq6trq2ura2tra2
+ tra1tbW1tbW1srKysrKcnJyampqZmZmZlpiio6Kjop2ampycnLKcsrKysrW1tbW1tba1tra2tra2tra2
+ um8PAAAAAQNCW/Xy8/Ly8vLy8vLy8/Lz8/Py8/Pz8/Pz8vLy8/Pz8vLy8vPy8u/uXEwIAAAAAAAEZrbF
+ tra2tra2tra2tba2tbW1tbW1s7KznbKcnJyampqamZmWmaKiuKK4uKKimpycnLKytbWytbW1tbW2tra1
+ ura2tra2urYxAAAAAANJ7/L18vLy8vL18vLz8vPz9fX29vb29/f49/f29vb29fX1W0cdGAYBAwMAAwYI
+ BgMBAAEAD3+2xbbFtra2tra2tbW2tba1tbW1nbOynLKcnJyampmZmZmWuKOiuLi4uLy8t5yysrKytbW1
+ tbW2tbS1tra2tra2xbqbDwAAAAELHFny8/Ly9fLz8vLz9fb2+fn5+fn5+fn5+fr5+fn5+vn5+fkYAQMc
+ TFiI7/X19fX19fPuWB0BBDm2tra6trq2tra2trW1tbW1tbWytbKyspycnJqampqZmZmiori4uLi81bzV
+ vLuisrOytbW0tba1tra6tbq6trq2fgQAAAAGHB0dHe7y8vLz8vP19/n5+fn6+fr5+fn5+fr5+fn5+fn5
+ +fn57gNc9fX19fX19fX19fX19fX19e4aABa1trq6tra2tra2tra1tbW1tbWytbKynLKcnJycmp2doqK4
+ uLi4vLy8wbzB19e8ubW1tbS0tLa1urW6trbFtnwDAAABEB0cHR0dQvLy8vX2+fn5+fn5+fn5+fn5+vn5
+ +fn5+fr5+fr5+fkYR/X19fX19fX19fX19fX18lvv9VgAAA+bura6trq2tra2tba2tbW1tbWytbKynJyc
+ nJ2iuKKiori4uLi8vNW8wdXX19fX17m1trS2tLq0ura6trZ+BAAAAxwdHR0dHB0dTPX3+fn5+fr5+fr5
+ +fn5+fn5+fn5+fr5+fn5+fn57gPy9fX19fX19fX19fNZRxsYGO7yBgAAAAR+ura6tra2tra2tbW2tbW0
+ s7Wyspycoru4uLi3t6K4uLi4vLzVvNXX1dfY19nY2tm8uba0tra6urq6tQUAAA4cHR0cHR0dHR0q7vn5
+ +fn5+fn5+fn5+fr5+fn5+vn5+fn5+fn5+fkcHvX19fX19fX19e5IGBoYGBgd9U0ABgAAAAR+urq2urq2
+ tra2trW1tbO1srK5u7+8vLy4uLi4t6K4uLjVvLzBwdfX2Nfa19ra2traxLm6urq6urYVAAAGHR0dHRwd
+ HR0qQkdC7/n5+vn5+fn6+fn6+fn5+vn5+fn5+fr5+vn59QPu9fX19fX19e5CGBgYGBkYGE71CAFCGwEA
+ AASXtsW2trq2tra2trS1tLm7wcHVv7y8vLy4uKKiuLi4vLzVvNXV19fX19fa2dra4+Pj59m9urq2OQAB
+ Ax0dHB0dHR0dQkVCQkJH7/n5+fr5+fn5+fn5+fn5+fn6+fn5+fn5+flMGPX19fX19fJHGBgYGBkYGBgY
+ 71wBGkdCHQEAAAWxurq6tra2tra1ur7X2dfX18HBwby8vLu4vLe4uLy8vL/B19fX19fa2tra2uPj493j
+ 5+faxLUCAAMcHR0cHR0cHkJCQkJCR0JF7vn5+fn5+fn5+fn6+fn5+fn5+fr5+fn5+QhN9fX19fVZGxga
+ GBoYGBoYGB31RwMfQkJCHQEAABW2trq6ura2vcPa2dnZ19fX18G/vLy8vLi3ori4vLzVvMHV19fX2NfZ
+ 2tra2uPj2ufn6urqMwAAGx0dHR0dHSpCR0JHQkJCR0JFW/n5+fr5+vn5+fn5+fr5+fn5+fn5+fnyAfL1
+ 9fXzRxgYGBgYGBgYGBgaTPUGDUVCR0JCHQEAADbFtra9xOPa2tna2dnX2dfXwcHBvLy8uLy3vLy8vLzB
+ wdfX19fZ2tra2trd493o6urn6q4AAAsdHR0cHR0eQkVCQkJCQkJCQkJHWPb5+fn5+fn5+vn5+fn5+vn5
+ +fr5+U4b9fX17x0YGBgYGhgYGhgYGhju7gMdQkNCRUJCGwAAAX7L4+Pj4+Pj49na2dnX19fBwb+8vLy8
+ uLe4uNW81dXV19fX19rZ2tra49rj4+fd5+rqMwABHBwdHR0dQkJCR0JCQkdDQkJHQkJCTPP5+fn6+fn5
+ +fr5+fn5+fn5+fn5G0z19VwbGBgYGhgYGBgYGRgYGvVOA0JCQkJHQkJCCAAAFufq5+Pj49rZ2tnZ2dfX
+ 19fXwcG8vLy4vLy8vLzBwdfX19jZ2tjZ2uPj5+Pn5+fq6t0DABAdHR0dHCpCQkJCQkdCQkJDQkNCQkdC
+ R1v3+fn5+fn5+fn5+fn6+fn5+fcD7vVbGhgYGBoYGBgaGBgYGBhE9R0NRUJCQ0JDQkNCAwABeujj4+Pj
+ 4+Pj2drZ2dnX18HBv7y8vLy31by81cHV19fX19fa2tra2trj5+fn6urqcQABHRwdHR1CRUJHRUJCQkJC
+ QkJCQkJCQkJCQknv+fn5+fn5+fr5+fn5+vn57wb1WxgYGBoYGBgYGBgaGBkYGlj1BhxCQ0JCQ0VCQkcc
+ AAAQ4+fq5+Pj2tna2dnZ19fX18HXvLy8vLy8vLy/wdfX19ja2tra2uPn5+fj5+rq6uoWAAsdHB0dHUJC
+ QkJCQkJHQkNCKkJCQkdCR0JHQkJN8/n5+fn6+fn5+fn5+flYKlsYGRgYGBgYGhgYGBgYGBgY7u4DHkJD
+ QkJDQkNCQ0IGAACl6OPj4+Pj49rZ2dnZ2dfXwde8vLy8u7y81cHV19fX19nZ2tra2trj4+fq3erq2AEA
+ Gx0dHR1CR0JCQkdCQkIqHR0dHSpCQkJFQkJDQkJHTO/3+fn5+fn5+vn5+U4LGhgYGhgaGBgYGBoaGBgZ
+ GBjzWwZCRUJFQkJCQkJDQh0AABfq6urj4+Pa2eja2dfZ19fXvMS8vLy8vLy819fX19nX2tjZ2uPj5+fn
+ 6urq6+uEAAMdHRwdQkJCQkJHQkJCQh0dHR0dHUJCQkJDQkJCQ0JCR0dZ8/f6+fr5+fn5TgAYGBgdR0xO
+ Tk5YTkxMTEUdHRgGAQgLGBobHB0dQh9CQggAAdbj4+Pj4+Pj2dnZ2dnZ19fBwby8wby8v7/V19fX19ra
+ 2tra2trj2urd6urq6jMACB0dHSpCR0JCQkJCR0IdHR0dHB0dQkNCQkVCHSofQkJCQkJHR1ju9ff5+flb
+ ABvv9vb49vb29vb29vb2+Pb29vb28+/uWU1KHRgDAQEDDQAAcerq6OPj49rj2trZ2dfE19m8wby8vLy8
+ 18HX19jX2dna2uPj5+fq5+rn6t3sFAAaHR0dQkJCQkJHQkJCQh0dHR0dHR0fRUJCQh0dHR0qQkJCR0JC
+ QkNDRUxOW1gBTPb29vb29vj29vb49vb2+Pb29vb49vb29vb29vb1GwAfAwAX5+jo4+Pj49nZ2dnZ2dfX
+ wcHBvLy8vMHV19fX19fa2dra49ra6trq6urq690AABwcHUJCQkJDKkdCQkJCHR0dHR0dHUJDQkIdHR0c
+ HR0fQkJDQkJCHR0dHR0dHwgd9vf29vf29vf29vb49vb29vj29vb49vb29vb2+foQDUIYAALn6ufq4+Po
+ 4+Pa4tnZ2dfB2bzBvLy8vNfX19fa2tra2trj4+rj6urq6ursrgEDHR0dQkJCQkdCR0JCRyodHR0dHR0d
+ R0JCKh0cHR0dHR1FR0JCKhwdHR0dHR0dGwDy9vb29vb29vb2+Pb29vj29vb49vb29vj2+fr67gNCQh0A
+ Aa3q6Ojj4+Pa2dnZ2dnZ18TBvLzBvLzBwdfX19fZ2dra2trn2uqlNerq6+qlAQMdHUJDQkJCQkJCQkJH
+ Qh0dHR0dHUJCQkIdHR0dHR0dHUJCQh4dHR0dHR0dHR0dDR329vb29vb29vb29vb29vb29vb29vb29/r7
+ +vUIHkJFQgABcejq4+jj6Ojj49rZ2dnX19nXwby8vNXX19fX2dra2uPj4+Pn2gsDM+rq61MAAxgdQkJC
+ Q0JHQkJCRUJCQh4dHSpCQkJCQh0dHR0dHR0dRUJFHR0dHR0YBgMAAAMDA1j39vb39vf29vb39vb29vb2
+ 9vb2+fr6+vr1GB5CQkdCBgA86urq4+Pj2trZ2eLZ2dfZwby8wby8wdfX2NfZ2drZ2trn2uhBBgYGM+zq
+ QQALGxgYGCpCQkJCR0JCQ0VDQkJCRUJDQkIeHR0dHB0dHR1CQh4dHR0cAwAAAAAAAAAAAAhO9fb29vb2
+ 9vb29vb29vb4+fn5+vr78hAdQkNCQ0INABfq6uPq4+jj6OPi2tnZ18TZ18HBvMHV2dfX2dra2trj4+Po
+ 2gYGBgYGM+o+ABgdQkIqGxgYHUJCQkJCQkJDQkNCQkNCQyodHR0dHR0dHUJCQh0dGwAAAAAAAAAAAAAA
+ AAADWPb29/b29vb29vb5+fr6+/v7+lsIHUJFQ0JCQhsAEOrq6uPo4+PZ2trZ2dnZ2cG8wbzBvMHX19fZ
+ 2dnZ2trj2uiwFAYGBgYGMzMAGB5CQkJCRUIcEAYGGBwfQkJCQ0JDQkJDHR0dHR0dHR0eQkMdHRwBAAAA
+ AAAAAAAAAAAAAAAAG/X29vb29vn5+fv5+/v5+vZCCBwdHR1CQ0JCHQAB5+ro6uPj6Oji6OLZ2dfZ2dnB
+ wbzV19fX19nZ2trj4+Pa5+rahBQFBgYGAAAaQkJCR0JCQkJCQhwIAQADBhseQkNCQkMeHR0dHB0dHUJC
+ Qh8dAwAAAAAAAAAAAAAAAAAAAAAAB/L29vn5+fv5+/v6+fvuCxgdHR0dHSpCQkUeAAHj6uro6OPj49rZ
+ 2tni2cTXvLzBwbzB19fZ2drZ2trj6Ojj6Orq6qozBgYDABpDQkJCR0JHQkdCQkIeGAMBAAADGBxCQh4d
+ HR0dHR0dQ0JFHxgAAAAAAAAAAAAAAAAAAAAAAAAAB/n6+vv7+vv7+fr1HQYbHR0cHR0dHUJCQkIAAdbq
+ 6ujo6Nro4uPi4tnZ2cTZ18G819fZ19nX2dqpc0A9PTw1NTM8PUE9KQMAG0JCQ0VCQkJCQkJCR0JCQhsG
+ AAAAAAMLGx0dHR0dHUJCQkJCAwAAAAAAAAAAAAAAAAAAAAAAAAAAHfv6+fr6+/n1QgAABhgdHR0dHR0d
+ HUJDQgAA0evo6ujj4+ja49nZ2dnZwcG818G8wdfX2dnZ2RcGBgYGAwYGBgYDBgYDAwAbRUJCQkJHRUJH
+ QkVCRUJCR0IqGwMAAAAAAAcYHR0eQ0JCQx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA7vr7+/dbHQtbW0wL
+ AAMbHR0dHR0dRUNCAwDW6uro6Oja6Nno49nZ2dnZ18TBvNfV2dnZ2dnEFwYGAwYGBgYGBgYGBgYDABhC
+ Q0JHQkJCQkJCQkJCQkdCQkJCQh0QAwAAAAAACBxCQkVDCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWEwb
+ Axju+/z8+/vyGQAZHR0dHR1CQkIBALjj6Oro6Ojj6Nni2tnZ2cS82bzBtbe5tbW0tboxBgYGBgYGBgYG
+ BgYFBgMADUJCQkJFQkdCQkVCR0JCQkVCQkdCQkdCHAgAAAAAAAMNHUMDAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAADVj5/f39/f39/fz7RwAbHR0dHUJDQgMAscXFxb3Ky+LZ49rZ2dnZ2dnBwcG1tbW1tba2tj8G
+ BgMGAwUGBgYGCSYmBQAGQ0JDQkdCQkJCR0JCQkJCR0JCR0JCQkJCRyobAwEBAAAAAwAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAb7/fVb9f39/f39/fz8KgYdHR0dQkNCAAK2xcXFxbq6urq6ur3EwNnZvNnBwLW1
+ tbW1tLS0nQYGBgYGBgYGKGt+FgYDAANFQkVCQkJCQ0JDQkdCQ0JCQkVCQkdCQkJCR0JCHQ0DAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAHf3uAAADW/39/f39/fz2AxwdHR1DQkIAAcXFusW6usW6ura6tra2
+ tra5ubu8tbW1tba2uba2EwYGBgcma7a2MgYGBgYAAEJCQkJCR0JFQkJCRUJCRUJCR0JCQkJCQkdCQkJH
+ QkIcBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY/R0AAAAb/f39/f39/fwdGh0dH0NCKgAPxcXFxcW6
+ urq6ura2tra1tbW1tbW1tbW1tbW2tLY/DDFrtcW6lxQGBgYGBg8AHUJHQkJCQkNFQ0JHQkJHQkJCQkcq
+ R0VCQkJHKkdCQkdCDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8RwAAAB/9/f39/f39/FgLHR1CQ0Id
+ ABbFxcXFusW6urq6urq2tra2tbW1tbW1tbW2tra2ura6urq6uj8GBgYGBgZpNgAaQkNCQkJHQkJCQkNC
+ QkNCQkdCQkJHQkJHQkVCQkJCRUIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZCAQML+f39/f39/f39
+ WBgdH0JCQhsANsXFxcXFurq6urq2trS2tba1tbW1tbW1tbW0trW6trq6urppBQMGBgYGFsVrAAhCQkJD
+ QkNCQkNCQkNCQkJCQkdCQkJCQkJCQkJHQkJCQkIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPz9
+ /f39/f39/f1JGipCQ0JFDQBpxcXFxbrFxbq6trq6trq1tra1tbW1tbW2tLa2tra6tra6xbUHBgYGBgm1
+ xbYBA0JDRUNCQkNFQkJCQkNFQ0NFQkJFQkdCQkJHQkJCRUJHQhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAACFz8/f39/f39/QkdQ0NCQkMGALHFxcXFxbq6urq6ura2trW2tbW1tbW1tbW1tLa2trq6urq6
+ um8GBgYGP8XGxQ8AHUJCQ0IfGhgdQkVEQkJCQkJCQkJCQkdCQkJHQkJCQkIdGQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAQvv/P39/f3vGEJCQ0JDQgAFxcXFxcW6xbq6ura6trq2trW2tLW1tbW1trW5
+ tra2ura6urq6xT8GBhbFxcbGNgAYRUNCQwYAAAADG0JHRUNCQ0dCR0JCRypCQkdCQkdCGAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAMDAAAAAAAAAAEN8v39+QtCQkJDQkIcACXGxcXFxcW6xbq6urq2urW2tba1
+ tbW1tbW1tba1tra6urq6urrFujcLtcXFxcV+AANDQkUdAAAAAAAABh1CQkJCQkJCQkJCR0JCQkJCQkMZ
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKh0GAAAAAAAAAAAAGe4LHUNCQkVDQxQAa8XFxcXFusW6xbq2
+ trq6tra0trW1tbW1tbW2tra2ura6urq6xbrFxbXFxcfFx8UFAB1DQx4AABFdDgAAAB1CRUJDRUJCR0JC
+ QkVCR0JCRxsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1DQkIYAQAAAAAAAAAAAQMdQkNCQ0JCAwG2xcXF
+ xcXFurq6urq6urS2tba1tbW1tbW1tba1tra2ura6usW6xcXFxcXFxcXGxTEAC0JDRQ0AAF2PLAAAABtD
+ QkJHQkJFQkJHQkJCQkJDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAYqQkJCQkIdAwAAAAAAAAAAAAAGHUNC
+ Qh0AJcXGxcXFusXFxbq6trq2ura2tra1tbW1tbW2tba2trq2urq6urq6xcXFxcfFx8XGfQEDQkJCQgMA
+ BI+PYwQAAB1DQkNCQkJCR0JCRypHQkJCAQAAAAAAAAAAAAAAAAAAAAAAAAMcQkJDQkdCRUJCDQAAAAAA
+ AAAAAAAACB1ECABvxsXFxcXFxbq6urq6ura2trS2tbW1tbW1tbW1trW2trq6urq6xcXFxcXFxcXFxsbL
+ BQAbRUNCGwAAY4+PYwQAAEJDQkJHQkJCQkJCR0JCQkIGAAAAAAEAAwsbCAAAAQAAAAAAG0JDQkJCQkJC
+ QkJHHAMAAAAAAAAAAAAAAQ0CBcXFxsXFxcW6xcW6ura6ura2urW6tbW1tbW1tba2tra2ura6urq6usXF
+ xcXFxcbF6O1TAAZCQkMfAAAtj5CPXgAABkJFQkNCQkJHQkJCQkJCRxABAQEDCBwqR0JCQhwYCAsbKgYB
+ HUNDQkNCR0JHQkJCKgsBAAAAAAAAAAAAAAA5xcXFxcXFxcW6urq6urq2tra1tbW1tbW1tbW1trW2tra6
+ urq6usXFxcXFxcXFy+zs7d0DAB1CQ0MEACOPj5CPIwAAHUJCQkdFQkJFQkJHQkJCHAMLHUJCR0JCR0JC
+ QkJHQkJCQwYAHUNCRUJCRUJCR0JCQhsDAAAAAAAAAAAABMPHxcbFxcXFusXFurq2ura2ura6tba1tbW1
+ tbW2tba2trq2urq6urq6xcXFzOvs7e3s7TUABkJCQgYAEY+Qj4+MBAADQkVCQkJCQkdCQkVCQkdCQkJC
+ QkJCQkJHKkJCR0JCQkdCHQEDQkJCQ0JCQkdCQkVHQh8IAQAAAAAAAAA97OnFxsXFxcXFurq6urq6ura2
+ tbS1tbW1tbW1tba1tra2trq6urrFxcXFxeLr7Ors7O3t2wAAHUVDAwAjj4+Qj4xdAAAcR0JCR0JCQkdC
+ QkJCRUJCR0JFQkdCQkJHQkJCQkVCR0JDGAADQkJCR0JCQkJCQkNFQkIbAQAAAAAABerr7OnKxcXFxbrF
+ urq6trq2urW6ubW1tbW1tbW1trW6tbq2urq6urq6xcvo6urs7Ozs7O3tMwAGQkIAACyPkZGPj4wEAAhC
+ Q0JCQkVCQkJCR0JHQkJCRUJCQkJCRUJCQkdCQkJCQkVCBAALQkNCQkNCQkVHQkJCR0IfCAAAAACE6+vr
+ 6+vLxcXFxbrFurq6urq0trW2tbW1tbW1tbW2tba2tra6urq6usXi6urr7Ors7Ozs7e3bAgAbHQAAXpCR
+ kZCPjyMAAUJDQkJCR0JCQkJCQkJCQkJCR0JHQkJHQkJDQkJCR0JCQkIdAAAaQ0JCQkdCQkJCQkJCQkJD
+ GwMAFuzs6+vr6uvoxbrFurq6ura6trq2tba1tbW1tbW1tba1urS6trq6urrL6Orq6+vq7Ort7O3t7e00
+ AAMZAACMj5GRkZGPXgAAHUJCQkdCRUJHQkdCRUJHQkdCQkJCQkJCQkcqR0JCQkJHQkIIAAEdRUNCRUNC
+ QkdCRUNDRUMeAQLW6+vr6+vr6OnoyrrFurq6trq0urW0trW1tbW1tbW1tbS0tra2urq94ujo6Ovq6uvr
+ 7Ors7IYzFxYAAAAABI+RkZGRkZCPAAAYQkZCQkJCRUJCQkJCRUJCRUJCR0JCR0JCQkJHQkdCQkVCQh8A
+ AANCQkNCQkNCQkJCQkNCQgYBQezs7Ovr6uvr6Ojoy8W6urq2ura6trq1trW1tbW1tbW1urW6tLq6xOjo
+ 6Ojo6urr6+rs7Ow9AAAAAAAAAAAgj5GRkZGRkZEOAAhFQ0JCQkdCQkdCQkdCQkJCQkJFQkJDQkJCR0VC
+ QkVCQkJHQhgAAAtCQkNCQ0VCR0JDQkUNABbr7Ovr6+vp6+jo6Ojj4sW6urq6urW2tbW1tbW1srW1tbS1
+ trS6vdnj2ePj6Ojo6Ovq6+rs6wAADhEREQQAACyQkZGRkZGRjxEABkJCR0JCQkJCQkVCQkJHRUJHQkJH
+ KkJHQkJCQkJCQkdCQkJCQgMAABxDQkJDQkJDQkNDHAAF3ezt6+vr6+vq6ejo6Ojo4r26urW6tbq1trW1
+ tbWzs7W0tbW0udni6OPo6Ojo6Orq6uvr6+vsAQAAI4yPkGUsLY+RkZGRkZGRLAAGQ0JCQkJHQkJCR0JC
+ R0JCQkJCQkJCR0JCQkJFQkdCQkVCQkJHGwAAAx5CQ0JCQkNCRx0AAa7r7Ovr6+vr6+nq6Ojo5uLj4sS6
+ urq0trW1tbW1tbKdtbW0tMLZ2dnZ4uLj4+jo6Ojr6urr6uyGAAAABGWPkI+Pj5GRkZGRkY8sAABCR0JF
+ QkJHQkNCQkJCQkJHQkJHQkJHRUJHQkdCQkJCQkdCQkJFBgAACEVDQ0JFQ0odAwGG7e3t6+zr6+vq6Ojo
+ 6Ojo4+bj4sS6tra2urW1tbW1tbW1tbvZ2dnZ2ePj4+Po4+Po6Ojr6+vr6+zbMwAADoyPj4yPj5GQj5GR
+ kSwAAEJDQkJDQkVCQkVCQkdCR0JFQ0JCQ0JCQkJCQkJCQkdCR0JCQ0IdAAAAG0JCQkRJHQMAQezs6+vr
+ 6+vo6unp6Ojm4+Lo4uLi2eK9trS1tbW1tbW1tbW9wbzE2dnZ2eLj4uPo6Ojq6ujq6uvr6+zspQAALIyQ
+ jI+QkZCRkZGQLAADRUNCQkNCQ0JCR0JFQkJCQkJCQ0VCQkdCQ0JCR0JCQkJCQ0JFQ0IGAAADQkNHTB0D
+ AD3s7Ozt6+vr6+vr6+jo6Ojm6OLo4uLi2dnAtrW1tbW1srK5wcHZ2dnZ2dnZ6Nno6Obj6Ojp6+vr6+vs
+ 6+zsFwADj4+PjI+QkY+RkZARAAZCQ0JDQkNCQkNCQkJDQ0JDQ0JFQkJDQkJCQkNFQkNFQkJFQkJDQh0A
+ AAAYSUkdAAE87Ozs6+zr6+vr6+no6Ojo6Oji6OLi4tnE2cHBurW1tbW1vrzAwcHB18TZ2eLZ4+Lj4+jj
+ 4+jo6urq6+rs7OyoAABej4+MjI+Rj5GRjxEABkVCQ0NCQkJFQ0JDQkJCQkJCQkdCQkNCRUNCQkNCQkdC
+ QkdCQkJCQgYAAABCGwAAce3s7OzssNbq6+ro6Ojo6Oji6OPi4uLi4tnZxMTBubW1tbK8wcHBwdnB2dnZ
+ 2eLj2eji6Ojo6Orr6+vq7Ozq7O0FACKQkI+Mj42NkZGMAAAYQkJCQ0VDQ0JCQ0JCQ0VDQkNCQ0JCQ0JC
+ Q0JDQkNCQ0JCQ0JDQkJHKgAAAAEAAIbs7Ozs7OvWqaWp1djo6Ojo6OPj4uPi4tnZ2cPEwcHAu7W1sry8
+ vMHBwcTE2dnZ2eLi4+Pj6OPo6Orq6tqoQTMXDwAAAGWPkIyMj5CMkWUAAAAGHUVCQ0JCQ0JCQ0JDQkJF
+ Q0JDQkJFQ0JCQ0JCQkNCQkNCQkJKSUlJBgAAAAR/5ezs7Ozr7NaoqaWoqKWprbDV2tra4uLi4sTZ2cTB
+ wLy3nm9wvL7AwcHX19nZ2dnZ2ejj4uPj6Ojq1kEFAAAAAAAAAAAAIo2MkY+Pj4+PZSMAAAAAAxtCRUNC
+ Q0RCRUNCQ0JDQkJDRUJDQkNCRUNFQ0NFQ0VHTEhMSUcIAAAVtsbG6+vs5+zr2KipqZ+pk6iTqJOTk5OT
+ k5Ofn56eknh2cnJWh/W7vLy8wcG819fE2dni4uLj4+Pj1SYAAAAAAAADBgwNDAwNYoyMjIyPj4+Pj4ws
+ BAAAAAMYQkVFQkJDQkJDQkJDQkJDQ0JDQkNCQ0JCQkdHSUlJTEkcAwABNsbHxsbM7Otb8aeqpZ+on5+o
+ k5+Tk5OTk5KTknd3dnZ6c1am9fv9/by8vsHBxNfZxNnZ2dni4+Lj40EAAAAABw0cHh4cHhweHB4dNGSN
+ kJCPj4+Pj4+PXQQAAAAAGB9CRkJCRUJDQkJDQkNCQ0VDRUNCREdHSUxMTEkdBgAAD3/HxsbGxsbN7Kf9
+ /fz29e6HV4SEhIalpXOThHOEhFNVpvL2/P39/f39u7y8vLy8xLzXxNnZ2eLZ49omAAAADRwdHR4cHhwe
+ HR4dHR4cHSqMj5CQj4+Mj4+QkF0RAAAAAAYYGx0fRUVEQ0NFQkVCQkJHR0lLTExMSUkdBgAAATnFx8bG
+ xsbGxsXlr/r9/f39/f39/Pv5+fb29vb2+fn7/P39/f39/f39/f28u7zAwMHEwcTZxNnZ2eLiMgAAAxwd
+ HR4cHh0dHh0eHB4dHR0eHJGMjIyQkJCPj4yPkI9jIAAAAAAAAAAAAAAEBgYGBgYGBgYGGR5JSEQbAwAA
+ ASe2xsbGx8fGxsXGxszb9v39/f39/f39/f39/f39/f39/f39/f1b+/39/f39/Le8u7y8vMHBwdnX2dnZ
+ 4noAAAcdHR4dHR4dHR4dHR4cHh0eHhwZYJGRj4yMj5GRkY+Pj5CQZSwRAAAAAAAAAAAAAAAAAAAAAAAA
+ AAADAQAAASWbx8bHx8fGxsbGxsbGxb3y/f39/f39/f39/f39/f39/f39/f399gBY/f39/f39u7u8vMDA
+ vMTBxMTE2dnZBQABHR0eHR0fHx8fQx9DHx8eHR0dHRwNLo6RkY+MjIyQkZGQjIyMkI+PjGJfLSwsLCwi
+ ICAhIiwsIAAAAAAAAAAFMZvHx8fGxsXHxsbGxsXGxe79/f39/ftM9v39/f39/f39/f39/fwbAAPy/f39
+ /f24u7u8vLzAwcHB2dfE2XcAABseHR0fH0MfQ0MfH0MfQx9CHx4dHhwNFGCRkZGQkIyMjJGRkZCOjY2Q
+ kI+Qj5CQkI+QkI+Pj5CQLxwNDAMBAAAAAA85usfGx8bFxsXGxcbFWv39/f39+QAd/P39/f39/f39/fxY
+ AAAAAAv9/f39/be4u7y7wLzAwcHZxNnZOwAEPh0dH0MfH0MfHx9DH0MfQx9CHx8eHRwcDRhgjpGRkJCN
+ jIyQkZGRkZGOkY2NjIyMkIyMj4+Pj49hHR0dHB0NBwAAAAABNsXGxcbGxsXGxcZa/f39/f1MAAADQu72
+ /f39/fxNAANY/P35+/39/f38t7u3vLy8wMG8xMHEwdkWABCGHh9CH0MfH0MfQx9DH0JCQkJCH0IfHR4c
+ HA0YLmORkZGRkZGRkZGRkZGRkZGRkJCQkJCRkY6QZCQcHh4dHh0dHg0GAAAAAmbGxsbFxsXFxYX9/f39
+ +wAATlgbAAAAHVv28kxb/P39/f39/f39/f23t7u7u7y8vMC8wcHZxBYADNNLQh9DH0JDH0JDHx9DHx9D
+ H0MfQx9CHx4cHBwNDRgrYGWRjpGRkZGRkY6RjZCNjY2NjWViMBINHB0eHRweHR4cHh0cBwAAABW6xcXG
+ xcbFhfz9/f399vz9/f399u4dAAAAHVj2/P37WP39/f39/Le3u7e7vLzAwMDBw8PXFQAGq9RGQx9DHx9E
+ H0JCQx9DHx9DH0JDH0MfQh4eHRwcHBkNDQwkKzAwYmRkZGRkYTAwKyQZDQ0bHBwcHR0eHR0dHh0eHB4d
+ GwMAAAWxxcXFxcWE/P39/f39/f39/ftMA0z8+e9HBgAAGAAA+f39/f39ore3uLu8u7y8wMDBwdkmAANL
+ 4dRPH0IfQh9DHx9CH0JEH0MfQh8fQkJCH0MfHhwdHBwcHBwcDRsNGQ0NDRkNHBwcHBwcHRweHR0eHR4d
+ Hh0dHR0dHh0dHgcAAAK1xcXFxYX8/f39/f31TO5MAAbu/P35/P39+/JCABj9/f39/fy3t7e3u7u8vMC8
+ wMHBwUAAABxP4eSrS0MfQx8fRB9DHx9CQkJCQkMfH0MfQx9DHx4eHh0cHBwcHBwcHBwcHBwcHBweHB4e
+ Hx9DH0IfQx9DHx8eHh0dHh0dHg0AABPFxcXFhPz9/f39/VsAAAPy/fzuBwAABlj9/f1CAPz9/f39/aKi
+ t7e7t7u8vMC8wMHEvAIAAx5Gq+Tkq1AfQkMfQh9CQh9CH0JCH0MfQx9CH0MfQx8fHx8eHR4cHhweHR4e
+ Hh0fH0MfQx9CH0MfREIfQx8fRB9DHx8dHR4dHQ0AADnFxcWF/P39/f39/QAA+/39CAALEB0bC/n9/f37
+ /f39/f38t7e3t7u4u7u7vMC8wMHBcAAABh1CS6vk5OGJS0IfQkIfRB9DH0JCH0MfQx9DH0IfWfgfQkJC
+ Qh9CQx9DHx9DQx9DH0IfQx9DHx8fH0MfQkQfH0MfQx8dHR4dHQYABLbFxYX8/f39/f39HVv9/f1F7vj5
+ 9fn5WP39/f39/f39/f2ioreit7e7vLu8vMDAwMHEMgAAARkfQkqE1OTk1INFQkJCH0JDH0MfQh9DH0Mf
+ Qx/w/fIfHx9DH0NCSVhDH0MfHx9DH0MfQh9DH0RDH0QfHx9DH0MfH0QfHR0dHAAAacXFVfz9/f39/f39
+ /f39/FvuHEcLGO4d/f39/f39/f39/J2it7e7t7e3u7y7vMDAwMHBQAAAAAAYHUJCS4ng5OGGRx9DHx9D
+ QkJCH0IfQh9DTP39/e5EH0MfH0z8/EMfH0MfQx9CH0JDH0MfHx8fH0MfQ0IfQh9DHx8eHh0dAQAnxbZV
+ /f39/f39/f39/f32Wx0AAAAATPX8/f39/f39/f39op2ioqK4t7u7u7y8wLzAwcTBoxUAAAAABhsfH0NS
+ 0OTkUkJCQx8fH0MfQx9DH0NE+PX4/fZJRFn2/f36H0JDH0MfQx9DQkIfQkMfREJEH0MfH0QfQx9DH0Qd
+ HR0QABW2xVv9/f39/f39/f39/fz5GAD2+wsAR0Lu/f39/f39/fydoqKitbe3u7e7u7u8wLzAwMHB154m
+ AAAAAAALHB9CT9Lkqx8fQx9DH0JCQkIfH0MfH0JO/Pz8/fr4/P1JH0IfQx9CH0IfH0MfH0IfHx8fQh9D
+ H0MfQx8fH0IdPhYAFcW2W/39/f39/f39/f35QhoAAPn8AAAGABj9/f39/f39/aKdoqKit7e3t7u7u7y7
+ wMDBwcHEwcGbOAUAAAAAAxsfH4bkq0IfQkJDH0lJSUlDTvBZ8vz9+/31Hx9DTh8fQx9CH0JCQkNDH0Mf
+ RB9DQkRCQkIfQh9CH0QfHzTOBQAlurfv/f39/f39/f39/e4AHVgLC1sd9/1M7v39/f39/f38m6KdoqKi
+ t7e3u7i7vLy8vMDAwMDBurW6tn4xAgAAAAMcQk/kgkMfH0NJSUlOSUn5/f388kwfWf37TR9CQkJCQx9D
+ H0MfHx9DH0IfQh8fHx9CH0IfQx9DH0SG3lAAADm6oPP9/f39/f39/f39/Ab7/f1bAPn9/fn5/f39/f39
+ /f2dnaKdoqK3t7e3ubu7u7y9vMDAwb21trW1trq1ZxMAAAAIQlLgQh9DRElMTExMSfD99UMfQkJCSfr9
+ /fAfQh9CH0MfQh9DHx9DH0JCQkJCQkJCH0NGUIOr4eSDGQAAbLqf9v39/f39/f39/f399f39/VsAWPmI
+ Rxr8/f39/f38/J2bnaKinZ2it7e3t7u7u7y+vsC9tbW1tra1tbq1umcFAAADH86BQh9JTElMSUxMWflJ
+ H0IfQkIfHvz9XEIfQx9CQkJCQh9DH0IfQk+ChorPz9Lk5OTk5N+KSx0AAAW6uqX5/f39/f39/f39/f1H
+ G0IYAAAAAAAAAPL9/f39/f39m6KdnZ2iore3t7e3ubu7vLu8vLWzs7W1tba2trq2urUlAAALT6xCQklJ
+ TE1JTExMSUxJXO5YQx9C9vwfQx9DH0MfQx8fREJCUazk5OTk5NTQzqyGhlBLQkMcAwAAfrq2hfz9/f39
+ /f39/f39/QAAAAAAAAAAAAAAHf39/f39/fybm52dop2iop23t7e3t7u7vLy1nbW1tbW1trW1tra2trYl
+ AAAd30dCTExJTExMSUxMTPL9/f38W0MfQ0JCQh9DH0IfH0MfS9Lk36iCT0JCQkJCH0JCQx0bBgAAAD+2
+ trZa/f39/f39/f39/f35AAAAAAAAAAAAAAAA/f39/f39/ZebnZ2dnZ2iore3t7e3u7u7tbW1tbW1tbW1
+ tra1tba2trUCAAuGg0JMTExMSUxMTO77/P3y+f1YHx9CH0IfQkIfQx9DH0/k0lBCQkIfHRwZGBgMBgYA
+ AAAAAAJourq2tfL9/f39/f39/f39/fYAAAAAAAAAAAAAAEL9/f39/f38nZebm52dop2dop23t7e3u7ey
+ srW1tbW1tbW1tba2tra2tjEAAEfUQklJTExMTElZ+05Y+fv9+vz2H0MfQx9DH0NCQh9P4YNDHRkHAAAA
+ AAAAAAAAAAAAAAU4tbq2trae9v39/f39/f39/f39/QMAAAAAAAAAAAAG+f39/f39/fyXm5ugm52doqKd
+ t7e3t7m3srKysrWytbW1tbW1tbW2tbq1fAAAG85PSExMSUxMTPb1SUz2/fYeH/VZQ0IfQkJDHx8fQ9RS
+ HQsAAAAAAAAAAAAAFhUlOGeXtrq2tra2toT8/f39/f39/f39/f39+xgAAAAAAAAGWP39/f39/f38/Zeb
+ m5uXnZudnaKdnZ23t52cnLKcmrW1tbW1tbW1trW2tba2BQAFgahITExMTExJ/fz2/P39/VtC9fNCH0Mf
+ Qh9CQkKKhh0AAAAAEzx1n7ji4uLivbq6ura6tra6tba2pv39/f39/f39/f39/f39/fny7u7u+P39/f39
+ /f39/f38l5eXm6CdoJ2dnaKit7ednJyynLK1srKztbW1tbW1tbW2tbY5AAAe30dMSUxJTFj9/f39/f39
+ /fb98h9DH0MfQx9DUs4dAAAAO7zi4uLi4sviy+LEtra2ura2tra2tp/2/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39+/aXl5ebl5ubnZudnZ2dnZyampqcsrKysrKysrW1tbO1tbW1tpsAAA2KgkxMTExJ
+ XP39/f39/f39/f3zQx9CH0JCH0rfRgMABJ/i4uLL4uLi4uLZ2dm5urq1ura2trW1pv39/f39/f39/f39
+ /f39/f39/f39/f39/f38+vbzp4Rzl5SXl5eXm52bop2dnZ2cmpycnJycnLKysrK1srK0s7O1tbW1thUA
+ A0vfR0xMTExO/f39/f39/f39/fAfRB9DHx9E1E8KAAB14uLL4uLiy9nZxMTE2bq6tba2tbW1tqCk8vX2
+ 9/n7+/z7/Pz8/Pv7+/v5+fb19fGkhHeSl5eXl5WXl5eXl5ebm5uXnZ2dnZmZmpqampyympyysrKys521
+ tbW1tbW1ZwAAHM6FSUxMTEn5/f39/f39/f39TEMfQ0IfQ4mJGwAAMuLE4uLZxNnZy8TE2cTLvba2urW2
+ tra1tbW1tbWgoJ6enp6Sn5KSnp6enpeel5mZnZ2bm52bl5eXl5SUl5eXl5eXm5udm52ZmZqZmZycmpqy
+ srKysrWytbW1tbW1tbW1BAAGUN9JSUlMTE77/f39/f39/fIfQh8fQx+C0h0AAA/B2cTZxMTExMPZw8TD
+ w8PAtbW2trW1tbWztLW1tbKytZy1srKaspyanJqZnJmZmZmbnZubl5eXlZSUl26XbpeXl5ebm5edmZaZ
+ mZmcmZqanJqanJycspyasrWzs7W1tbM2AAAdzolMTExMTEnw+Pv9/flcH0NCH0MfT99FAwACo9nExMTD
+ xNnExMPDw8PDwdm2trW1tbW1s7Ozs7WytbWatbKcmrKampqamZyZmZmZmZabl5uXl5WXl5eUlJeXl5eX
+ l5eXnZaYmZmYmZmamZyanJydsrK1srW1srKys7W1tZsAAAZL5E9MSUlMTExMSUlEH0MfHx9DH0/fTwgA
+ AHDExNnExNnDw8PDw8PDw8PDwrW1tbW1tbW1tZ2ysrWcsrWymrKynJycmpqamZmZmZiWmZaZl5eVl5SU
+ lJSUbm6XbpeXl5eXlZiYmJmZmZmZmpmampqampqcsrKasrOys7K1tTYAAB2G30tMTExMSUxMRB9DH0JC
+ Qx9P4VEYAAAyw8PDw8PDwsPDw8HBw8LDwr6+vbW1tLW1tbW1tbWynLWyspqynJqampqdmZmZmZmZmZmV
+ lZeXlZeUl5SUfHyUl5SXl5eXl5WVlZaYmJmYmZmZmpqampycsrKasrK1nbKysrO1mAEABkLS1EtJTElM
+ TElCQx9CHx9CUuSCGwAAD7zDw8PDw8PDwcLCw8LAwMC+wr67tbSys7KztbWysrWyspqaspyanJqZmpmZ
+ mZmZmZWYlZWVlZeXlJeUlHyUbpRulJSUl5eUlZWVlZaWlZmZmZmZmZqampqamrKasrKytbObtZq1NgAA
+ GEbU4VJESUlHQh8fQkJCSorhUh0AAAG4wcPBwsLCv8LCwMDCvsC+vr68vb61nbWys7KymrWymrKasrKa
+ mpqampqZmZmZmZWYmZWVlZWUlZSXlJR8lG5ubpSUl26XlJWUlZWVlZiZlpaZlpmZmZqZmpqamrKcmpqy
+ srKytbW1DwAAHUbO5NKCRh8fQkIfS4ng1E8dAAACoMDCwsLAwL7CvsDAvr6+vb6+vL28u7W1tbWdsrKy
+ spyymrKcmpyampmamZmZmZmWmZaVlZWVlZWUlZR8lJRtfG1ufHyUlJSUlJWVlJWVlZWYmZmZmZmZmZqa
+ mpqampqysrKaspyymrV8AgAAHUKC3+Tk1M/Pz9/k4YZDGwAAAIDAvr6+vr6+vr6+vry9vry8vbu9u72+
+ tbK1srKysrKyspyympqamZqampmZmZmZlpmYlZWVlZWVlJR8lJR8fHxtbW1tbnyUlJSUlJSVlZWVlZWV
+ mJiZmZmZmZmZmpqampqamrKcsrKysrJoAAAAG0JCUorP3+DSrIJGHwsAAAF4vr6+vr6+vr6+vr28vby7
+ vbu7u7u7u7e3srKysrKcnJqampqampqamZmZmZmZmZWYlZWVlZWVlJSUlJR8fHxtbW0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
+ AABAAAAAgAAAAAEAIAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32e/wh+oP8If6L/CICk/wmC
+ pv8Jgqj/CoSq/wqErP8Lhq7/C4ex/wuIs/8MirT/DIq2/wyLuP8Njbr/DY68/w6Pvf8OkL//DpDA/w6R
+ wv8PksP/D5LE/w+Sxf8PlMb/D5TH/w+Ux/8Qlcj/EJXI/xCWyf8Qlsn/EJXJ/xCVyf8Qlsn/EJbJ/xCV
+ yP8QlMj/EJXH/w+Ux/8Pk8b/D5PF/w+SxP8PksP/DpHC/w6Rwf8OkL//Do++/w2OvP8Njbv/DYy5/wyL
+ t/8MirX/C4mz/wuIsf8Lhq//CoSt/wqEq/8Jg6n/CYKn/wmBpf8If6L/CH6g/wd9nv8He5z/B32e/wh+
+ oP8If6L/CICk/wmCpv8Jg6n/CoSr/wqErf8Lhq//C4ix/wyJtP8Mirb/DIu4/w2Nuv8Njrz/Do+9/w6Q
+ v/8OkcH/D5LC/w+SxP8Pk8X/D5TG/w+Ux/8Qlcj/EJbJ/xCWyv8Ql8v/EJfL/xCXzP8Ql8z/EJfM/xGX
+ zP8Rl8z/EJfM/xCXzP8Qlsz/EJbL/xCWy/8Qlsr/EJXJ/xCWyf8Qlcj/D5TH/w+Txf8PksT/D5LD/w6R
+ wf8OkMD/Do++/w2OvP8Njbr/DIu4/wyKtv8MirT/C4iy/wuHsP8Kha7/CoWs/wqEqf8Jgqf/CYGl/wiA
+ o/8IfqD/B32e/wh+oP8If6L/CYGk/wmCp/8Jg6n/CoSr/wqGrv8Lh7D/C4iy/wyKtP8Mi7f/DYy5/w2N
+ u/8Njr3/DpC//w6Rwf8PksL/D5LE/w+Uxv8PlMf/EJXI/xCWyv8Ql8v/EJfM/xGYzf8Rl83/EZjO/xGZ
+ z/8Rmc//EZnP/xGZ0P8RmdD/EZnQ/xGZ0P8RmtD/EZnP/xGYz/8RmM7/EZjO/xGXzf8Ql8z/EJbL/xCV
+ yv8Qlsn/EJXH/w+Uxv8Pk8X/D5LD/w6Rwf8OkL//Do+9/w2Ou/8Njbn/DIu3/wyKtf8LiLP/C4ex/wqG
+ rv8KhKz/CoSq/wmCp/8JgaX/CICj/wh+oP8If6L/CICk/wmCp/8Jg6n/CoSr/wqFrv8Lh7D/C4iz/wyK
+ tf8Mi7f/DY26/w2OvP8Oj77/DpDA/w6Rwv8PksT/D5TG/w+Ux/8Qlsn/EJbK/xCXzP8Rl83/EZjO/xGY
+ z/8RmdD/EZnR/xGa0f8SmtL/EprS/xKa0/8Sm9P/EpvT/xKb0/8Sm9P/EprT/xKa0/8SmtL/EpvS/xGZ
+ 0f8RmdD/EZnP/xGYzv8Rl83/EJbM/xCXy/8Qlcn/EJXI/w+Uxv8PksT/D5LD/w6Rwf8OkL//DY68/w2N
+ uv8Mi7j/DIq2/wyJs/8Lh7H/C4av/wqErP8Kg6r/CYKn/wmApf8IgKP/CICk/wmCpv8Jg6n/CoSr/wqF
+ rv8Lh7D/C4iz/wyKtf8Mi7j/DY26/w2OvP8OkL//DpHB/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/xGX
+ zf8RmM//EZnQ/xGa0f8SmtL/EpvT/xKb1P8SnNX/EpzV/xKc1v8Sndb/E53W/xOd1/8Tndf/E57X/xKd
+ 1v8SnNb/Ep3W/xKc1f8SnNT/EpvT/xKa0/8SmtH/EZnQ/xGYz/8RmM7/EJfM/xCWy/8Qlsn/EJXH/w+U
+ xv8PksT/DpHC/w6Qv/8Njr3/DY27/w2Muf8Mirb/DIm0/wuIsf8Lhq//CoSs/wqEqv8Jgqf/CYGl/wmC
+ pv8Jg6n/CoWr/wqFrv8Lh7D/C4mz/wyKtv8Mi7j/DY27/w2Ovf8OkL//DpHC/w+SxP8PlMb/EJXI/xCV
+ yv8Ql8z/EZfN/xGYz/8RmdD/EprS/xKb0/8SnNT/EpzV/xKd1v8Tndf/E57Y/xOe2f8Tntn/E57Z/xOf
+ 2v8Tn9r/E5/a/xOf2v8Tn9r/E57Z/xOe2f8Tntj/E53X/xOd1/8SnNb/EpzV/xKb0/8SmtL/EZnR/xGZ
+ z/8RmM7/EJfM/xCWyv8Qlsn/D5TH/w+Txf8PksP/DpDA/w6Pvv8Njrv/DYy5/wyKtv8MibT/C4ix/wuG
+ r/8KhKz/CoOp/wmBp/8Jgqj/CoWr/wqGrv8Lh7D/C4iz/wyKtv8MjLj/DY27/w6Pvf8OkMD/D5LC/w+T
+ xf8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGZ0P8SmtL/EpvT/xKc1f8Sndb/E53X/xOe2f8Tn9r/E5/a/xOg
+ 2/8UoNz/FKDc/xSh3f8Uot7/FKLf/xSi3/8Uod3/FKDc/xSg3P8UoNz/E6Db/xOf2/8Tn9r/E57Z/xOe
+ 2P8Tndf/EpzV/xKb1P8SmtL/EZnR/xGYz/8Rl83/EJbL/xCVyf8Qlcf/D5PF/w+Sw/8OkcH/Do++/w2O
+ vP8NjLn/DIq2/wyJtP8Lh7H/C4au/wqErP8Jg6n/CoSq/wqErf8Lh7D/C4iz/wyKtf8Mi7j/DY27/w6P
+ vv8OkMD/D5LD/w+Txf8PlMf/EJbK/xCXzP8RmM7/EZnQ/xKa0f8Sm9P/EpzV/xOd1v8Tntj/E57Z/xOf
+ 2v8UoNz/DHKd/wAJDf8AAwT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAEB/wAF
+ Bv8ISmb/FKLe/xSg3P8Tn9v/E5/a/xOe2P8Tndf/EpzV/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJbK/xCV
+ yP8PlMb/D5LD/w6Rwf8OkL7/DY68/w2Muf8Mirb/DImz/wuHsf8Kha7/CoSr/wqErP8Lhq//C4iy/wyK
+ tf8Mi7j/DY27/w6Pvf8OkMD/D5LD/w+Txf8Qlcj/EJbK/xCXzP8RmM7/EZnQ/xKa0v8SnNT/EpzW/xOe
+ 2P8Tntn/E57a/wY5Tv8AAQH/AAAA/wAAAP8AAAD/BgYG/wgICP86Ojr/cXFx/46Ojv+VlZX/kJCQ/4WF
+ hf9DQ0P/DQ0N/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAgK/xSi3v8ToNv/E5/a/xOe2P8Tndf/EpzV/xKa
+ 0/8RmdH/EZjP/xGYzf8Ql8v/EJXI/w+Uxv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4ew/wqF
+ rf8jkrb/C4iy/wyKtP8Mi7f/DY26/w2Ovf8OkMD/D5LD/w+Txf8QlMj/EJbK/xGYzf8RmM//EZnR/xKa
+ 0/8SnNX/E53X/xOe2f8Tn9r/AAcJ/wAAAP8AAAD/BAQE/0RERP+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ycnP+Li4v/BAQE/wAAAP8AAAD/AAMD/xGQ
+ xf8Tn9v/E57Z/xOe2P8SnNb/EpvU/xKa0v8RmtD/EZfN/xCXy/8Qlsn/D5TG/w+SxP8OkcH/Do++/w2N
+ u/8MjLj/DIq1/wuIsv8Lhq//KZa6/yyZvv8wnML/C4y5/w2Ovf8OkL//D5LC/w+Txf8Qlcj/EJbK/xGX
+ zf8RmM//EZrR/xKb1P8SnNb/E57Y/xOf2v8KW33/AAAA/wAAAP8ODg7/nZ2d/52dnf+dnZ3/nZ2d/52d
+ nf+dnZ3/nZ2d/52dnf+cnJz/m5ub/52dnf+enp7/nZ2d/5ubm/+dnZ3/nZ2d/52dnf+UlJT/Xl5e/zEx
+ Mf8WFhb/AAAA/wAAAP8AAAD/AAQF/xSh3f8Tn9r/E57Y/xKd1v8SnNT/EprS/xGZ0P8Rl83/EJbL/xCW
+ yf8PlMb/D5LD/w6QwP8Oj73/DY27/wyLuP8MirX/C4iy/yuYvf8um8D/M57E/zeiyP86pMv/EpPC/w+T
+ xf8Qlcf/EJbK/xGYzf8RmM//EprS/xKb1P8SnNb/E57Y/xOf2v8ACg7/AAAA/wEBAf81NTX/i4uL/52d
+ nf+dnZ3/nZ2d/5ycnP++vr7/yMjI/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8jI
+ yP8EBAT/iIiI/6mpqf+np6f/qKio/6ioqP+oqKj/qKio/6mpqf8HBwf/Ax8s/xOf2/8Tntn/E53X/xKc
+ 1f8SmtL/EZjQ/xGXzf8Qlsv/EJXI/w+Uxv8PksP/DpDA/w2Ovf8Njbr/DIu3/wyJs/8smb//MJ3D/zSf
+ xv85pMr/PKbN/0Gp0P9GrNT/MaTR/xCXzP8RmM//EprR/xKb1P8Sndb/E57Z/xOf2/8ABgf/AAAA/zIy
+ Mv81NTX/NTU1/zU1Nf+cnJz/sLCw/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf9AQED/p6en/6ioqP+oqKj/qKio/6ioqP+oqKj/qamp/0lJSf8TExP/oaGh/wAA
+ AP8ACQz/E6Db/xOe2f8Tndf/EpzV/xKa0v8RmdD/EZfN/xCWyv8Qlcj/D5PF/w6Rwv8Mj7//L57F/y2b
+ wv8pmb//L5vB/zOfxf83osj/O6XM/0Coz/9Dq9L/SK7W/0ux2f9QtNv/Urbd/xOc1P8Sndb/E57Z/xOf
+ 2/8ACg3/AAAA/zU1Nf81NTX/NTU1/zU1Nf84ODj/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/BAQE/6ioqP+oqKj/qKio/6ioqP9fX1//JCQk/yQk
+ JP8kJCT/paWl/wQEBP8rKyv/AAAA/wAHCP8UoNz/E57Z/xOd1/8SnNT/EprS/xGZz/8RmM3/EJbK/zGj
+ zv87p8//OKTM/zOgyP8vnsX/KprB/zGew/81oMf/OaTL/z6nzv9CqtH/Rq3V/0qw2P9PtNv/Urbe/1e5
+ 4P9au+P/X73k/wyc2v8RjsT/AAAA/zU1Nf81NTX/NTU1/zU1Nf9ERET/RUVF/0VFRf9GRkb/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/vLy8/6enp/+oqKj/qKio/5+f
+ n/8kJCT/JCQk/yQkJP8kJCT/JCQk/6enp/8ICAj/RUVF/0NDQ/8AAAD/AAoN/xSg3P8Tntn/E53X/xKb
+ 1P8goNT/SrHa/0au1/9Cq9T/PajR/zmmzv81osr/MZ/H/y2bwv8zn8X/OKLJ/zulzf9AqdD/RKzT/0iu
+ 1v9Nstr/ULTd/1W43/9auuL/Xrzk/2K/5v9lwen/AAAA/ywsLP81NTX/NTU1/zU1Nf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wcH
+ B/+oqKj/qKio/yEhIf8kJCT/JCQk/yQkJP8kJCT/JCQk/xoaGv9ERET/RERE/0VFRf9FRUX/Ojo6/wAA
+ AP8Nb5r/EJ7b/1q65P9VuOL/ULbf/0yz3P9Jsdr/RKzW/0Cr0/87p9D/N6TM/zOhyf8vnsX/NaDH/zmj
+ y/8+qM//QqrS/0at1f9KsNj/ULTc/1S33v9YuuH/XLvj/2C/5v9lwej/UZm5/wEBAf81NTX/NTU1/zU1
+ Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/5CQkP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf8ICAj/qKio/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP+Tk5P/CQkJ/0VF
+ Rf9FRUX/RUVF/0VFRf8GBgb/AAAA/2C/6P9bvOb/V7nj/1O34f9OtN3/SrHb/0eu2P9CrNX/PajS/zml
+ zv81osr/MJ/H/zejyf87pc3/QKnQ/0Or0/9Irtb/TrLa/1G03f9VuOD/Wrvi/1695f9jwej/Z8Lq/wIH
+ Cv8xMTH/NTU1/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9FRUX/RUVF/0VFRf9FRUX/SEhI/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/lZWV/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP8kJCT/p6en/wkJCf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8YMj3/X7/o/1m85f9WuOL/ULbf/0yz
+ 3P9Ir9n/RK3W/0Cr0/86ptD/NqPM/zOhyf85o8r/PajP/0Gq0v9GrdX/SrDY/0+z2/9Ttt7/WLnh/1y8
+ 5P9hv+f/ZcHp/2nD6v8AAAD/NTU1/zU1Nf9ERET/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/SEhI/7CwsP/Jycn/ycnJ/8nJyf/Jycn/y8vL/xoaGv8kJCT/JCQk/ygo
+ KP8oKCj/KSkp/ycnJ/8lJSX/JCQk/4CAgP8/Pz//RUVF/0VFRf9ERET/RUVF/0VFRf8oKCj/AAAA/2DA
+ 6f9cvuf/V7nk/1K34f9OtN7/SrHb/0Wu2P9CrNX/PKjS/zilzv80osr/OaTM/z6o0P9Dq9P/R67W/0yy
+ 2v9QtN3/Vbfg/1q74/9evub/Y8Do/2fC6v9kuN3/AQEB/zU1Nf82Njb/RUVF/0VFRf9FRUX/RUVF/0FB
+ Qf82Njb/NjY2/zY2Nv9ERET/RUVF/0NDQ/82Njb/Pj4+/0VFRf9FRUX/RUVF/0tLS/9dXV3/tra2/8jI
+ yP8GBgb/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7q6uv+7u7v/ubm5/4CA
+ gP8MDAz/BAQE/wAAAP9iwev/Xr/o/1m85f9WueP/ULbg/0yz3f9HsNn/Q63W/z+q0/85pc//NaPM/zul
+ zf8/qdH/RK3V/0iv2P9Os9v/UrXe/1e54f9cvOT/YL/n/2TB6f9pxOz/GTA5/x0dHf81NTX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf83Nzf/NjY2/zY2Nv82Njb/RUVF/0RERP82Njb/NjY2/zY2Nv9ERET/RUVF/0RE
+ RP81NTX/NjY2/zY2Nv81NTX/AQEB/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u//Ozs7/RERE/0RERP8CAgL/GzdD/1/A6f9bvef/V7rk/1K34f9NtN7/SLHb/0Su
+ 2P9Aq9X/OqbQ/zekzf88ps7/QarS/0Wu1v9LsNn/T7Pc/1S33/9YuuL/Xb7l/xATFP9mwur/asbt/wEG
+ CP81NTX/Ozs7/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zY2Nv82Njb/RUVF/0VFRf87Ozv/NjY2/zY2
+ Nv82Njb/PT09/0VFRf82Njb/NjY2/zY2Nv81NTX/Gxsb/zU1Nf9ERET/u7u7/7u7u/+7u7v/u7u7/7u7
+ u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8rKyv/Q0ND/zc3N/0RERP9FRUX/NjY2/wIICv9hwer/Xb7o/1e7
+ 5f9TueL/TrXf/0qy3P9Fr9n/QazW/zyo0v84pc7/PafP/0Os0/9Grtf/S7La/1C03f9VuOH/Wrvk/1Ws
+ 0f8QEBD/EA8P/2zG7f8EDRD/NTU1/0VFRf8DAwP/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/NTU1/zY2Nv82Njb/NjY2/0FBQf9ERET/NjY2/zU1Nf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP+5ubn/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/z8/P/9DQ0P/Q0ND/ra2t/0RERP9FRUX/RUVF/0VF
+ Rf8AAAD/Y8Lr/16/6f9avOb/Vbrk/1C34f9Ms93/R7Da/0Kt1/89qdP/OKXP/z+o0f9ErtX/R6/Y/02z
+ 2/9Rtt//Vrni/1u85P9fvOT/ERUV/xAQEP8QEBD/AAID/zQ0NP9FRUX/RUVF/0VFRf9FRUX/EBAQ/wAA
+ AP8iIiL/RUVF/0VFRf9FRUX/RUVF/zU1Nf82Njb/NjY2/zY2Nv9ERET/RUVF/zY2Nv8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8TExP/Pz8//0NDQ/9DQ0P/Q0ND/CAgI/zU1
+ Nf82Njb/Ojo6/0VFRf9FRUX/AAAA/2TC7P9fwOr/W73n/1a65P9RuOL/TLTe/0ex2/9Crdf/PqrU/zmm
+ 0P8/qNH/RKzV/0mw2f9OtNz/UbXe/1e75P9dvef/Yb/n/2XC6/9syPH/HTM8/wAAAP9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP8AAAD/AAAA/0JCQv81NTX/NjY2/zY2Nv81NTX/RUVF/0RE
+ RP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9DQ0P/Q0ND/0NDQ/9DQ
+ 0P95eXn/CwsL/zU1Nf82Njb/NjY2/zY2Nv9FRUX/RUVF/wAAAP9lw+z/YMHr/1u96P9XuuX/Urji/021
+ 3/9Jstz/Q67Y/z+r1f86p9H/QKrS/0St1v9JsNr/TrTd/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQ
+ EP8AAAD/RERE/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/yIiIv8AAAD/AAAA/wAA
+ AP8tLS3/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP/R0dH/y8vL/xAQEP8cHBz/3Nzc/83Nzf8ICAj/Kioq/zY2Nv82Njb/PDw8/0VFRf8AAAD/ZcTt/2HB
+ 6/9dv+n/WLvm/1O44/9NtOD/SrPd/0Su2f9Aq9X/O6jS/xCVyP8Qlsv/EZjO/xKa0v8QEhL/EBAQ/xAQ
+ EP8QEBD/EBAQ/xAQEP8QEhL/AAAA/0RERP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/IiIi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/+Dg4P/+/v7//v7+////////////4eHh/ysrK/82Njb/NjY2/z09
+ Pf9FRUX/AAAA/xWl5f8VpOL/FKLf/wyd3P8tqt3/TrTg/0mx3f9Er9n/QKzW/zup0/8Qlcj/EJfM/xGY
+ z/8SmtL/EE9n/xAQEP8QEBD/EBQV/xOHuf8Sa5H/EBAQ/wUFBf8nJyf/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/x8fH/AAAA/wEBAf//////////////
+ ///j4+P/AgIC/zY2Nv9ERET/RUVF/wAAAP8Wpub/FaTj/xSi4P8Uod3/E5/a/xOd1/8Sm9P/EZnQ/xGY
+ zf8MlMn/EJbJ/xCXzP8Rmc//EprT/xKd1v8Sksj/FKHc/xSh3/8QFBX/EBAQ/xAQEP8Vir7/AwMD/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/29vb/wAA
+ AP8QEBD//////////////////////wsLC/82Njb/RUVF/0RERP8ABQb/Fqbm/xWl5P8Vo+H/FKHe/xOf
+ 2v8Tndf/EpvU/xGa0f8RmM3/EJbK/xCVyf8Rl8z/EZnQ/xKb0/8Tndf/E5/a/xSh3f8QEQ7/EBAQ/xAQ
+ EP8QFRX/F6jq/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/6Ojo//////////////////////8NDQ3/RERE/0VFRf9ERET/AAoN/xan
+ 5/8VpeT/FaPh/xSh3v8Tn9v/E57Y/xKc1P8RmdH/EZjO/xCWyv8Qlsn/EZjN/xGZ0P8SnNT/E53X/xOf
+ 2v8Uod3/FKLg/xAPEP8QEBD/Fqfo/xeq7P8AAgP/RERE/0VFRf9FRUX/AAAA/xISEv9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/9vb2///////p6en/RERE/0VF
+ Rf9FRUX/Dw8P/xKRyf8Wp+f/FaXk/xWj4f8Uod7/E5/b/xOe2P8SndX/EZrR/xGYzv8Qlsr/EJXJ/xGX
+ zf8RmdD/EpvU/xOd1/8Tn9r/FKHd/xWj4f8VpOP/FZrV/xao6f8Xquz/BCk6/x4eHv9FRUX/AAAA/wAA
+ AP8AAAD/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9FRUX/DAwM/wAAAP8AAAD/AAAA/wAA
+ AP8LCwv/RERE/0VFRf9FRUX/RUVF/wAAAP8WqOn/Fqfn/xWl5P8Vo+H/FKHe/xOg2/8Tntj/EpzV/xGa
+ 0f8RmM7/EJbK/xCVyf8Rl83/EZnQ/xKb1P8Tndf/E5/a/xSh3f8Vo+H/FaXk/xam5v8WqOn/F6rs/xer
+ 8P8AAAD/RUVF/0VFRf8AAAD/KizQ/x8hnf8AAAD/NjY2/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEREf9FRUX/RUVF/0VF
+ Rf9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAwP/RERE/0VFRf8ACAr/Fqfq/xan5/8VpeT/FaTi/xSh
+ 3v8ToNv/E57Y/xKc1f8RmtH/EZjO/xCXy/8Qlcn/EZjN/xGZ0P8SnNT/E53X/xOf2v8Uod3/FaLg/xWl
+ 5P8Wpub/Fqfp/xeq7P9BuvH/AQQF/0RERP9FRUX/AAAA/wAAAP8sLtb/KSvO/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP8AAAD/AAAA/xEREf9ERET/MzMz/wAAAP8AAAD/FBQU/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8DAwP/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/FaHh/xao
+ 6v8Wp+f/FaXk/xWj4f8Uod7/E6Db/xOe2P8SnNX/EZrR/xGYzv8Qlsr/EJbJ/xGYzf8RmdD/EpvT/xOd
+ 1/8Tn9r/FKHd/xSi4P8VpOP/Fqbm/xKl6P9zzPT/d831/2Glw/8CAgL/RUVF/0VFRf8AAAD/LC7W/yst
+ 0/8BAQj/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8jIyP/RERE/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0NDQ/8AAAD/AAAA/wAA
+ AP8AAAD/AAEB/1nB8f8WqOr/Fqfn/xWl5P8VpOH/FKHe/xOf2/8Tntj/EpzU/xGZ0f8RmM7/EJbK/xCW
+ yf8Ql8z/EZnQ/xKa0/8Sndb/E5/a/xSh3f8UouD/FaTj/2bF7v9tyPH/csvz/3bO9f97z/b/AAAA/0VF
+ Rf8iIiL/AAAA/ywu1v8sLtb/KizQ/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wsLC/8DAwP/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/wICAv8AAAD/AAAA/2rA5/9tyPP/Z8bx/xan5/8VpeT/FaPh/xSh3v8Tn9v/E53X/xKc
+ 1P8RmdH/EZfN/xCVyv8Qlcj/EJbM/xGZz/8SmtP/EpzW/xOe2f8UoNz/HaXh/2LC7P9nxe7/bMbw/3DK
+ 8/90zPT/ec/2/1SPqv8BAQH/AAAA/wAAAv8sLtb/MDLX/ywu1v8AAAD/ERER/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/zY2
+ Nv9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/QUFB/wIJC/9vyvT/bMnz/2bH8f9jxO7/FKTj/xSi
+ 4P8Uod3/E5/a/xOd1/8Sm9T/EZnQ/xGXzf8Qlsr/EJTI/xCWy/8RmM//EprS/xKc1f8Tntn/WLvm/12/
+ 6f9hwev/ZcTu/2rG8P9uyfL/csv0/wAAAP8AAAD/AAAA/wAAAP8qLND/NDbY/zY42f82ONn/Fxh0/wAA
+ AP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0FBQf8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/wAAAP9yy/X/bcr0/2rH
+ 8v9lxfD/YcLu/1zA6/9Ruuf/FKHd/xOf2v8Sndb/EpvT/xGZ0P8Rl8z/EJXJ/w+Ux/8Ql8v/EZjO/xKa
+ 0f9Br93/Ubfi/1a75f9avuj/X8Hr/2PD7f9oxu//bMjx/zhkef8AAAD/Ky3V/yst1f8AAAD/KizQ/zY4
+ 2f82ONn/NjjZ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RERE/wIC
+ Av9wxu7/cMv1/2zK9P9nxvH/Y8Xw/17B7f9bv+v/Vbzo/1G55f8Tntn/EpzW/xKa0v8Rmc//EJbM/xCV
+ yP8PlMf/EJXK/xCYzv9Hr9v/S7Pe/1C34f9UuuT/WL3n/12/6v9iwuz/Zsbv/2rH8f9uyvP/AAAA/wAA
+ AP8sLtb/LC7W/yos0P82ONn/MjTX/zY42f8qLND/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/IiIi/0VF
+ Rf9FRUX/Tk5O/wICAv8+boT/c8z2/23J9P9qyfP/ZcXx/2LE7/9dwOz/Wb7q/1S75/9PuOT/S7Xh/xee
+ 1v8SmtL/EZjO/xCWy/8Qlcj/D5TG/zyp0/9BrNb/RK/a/0qy3f9OteD/U7nj/1a85v9bvun/X8Dr/2TE
+ 7v9oxvD/bMjy/3DK9P82YHP/AAAA/yst0v8oKsj/LC7W/ywu1v82ONn/KizQ/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP9FRUX/UVFR/wICAv8bLjb/c833/3DM9f9syfT/Z8by/2PE8P9fwu7/W7/r/1a8
+ 6f9Suub/Tbfj/0q04P9FsN3/QK3Z/xGYzv8Qlsr/D5TH/zalzv87qNL/P6vW/0Ou2f9Isdz/TLTf/1C3
+ 4v9VuuX/WL3o/12/6v9hwu3/ZcTv/2nH8f9tyfL/csz1/wAAAP8rLdP/LC7W/yos0f8zNdf/NjjZ/yUn
+ vP8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8/boT/dM33/3HM9v9qxe7/RIyl/2PD
+ 7v9hwu7/XcHt/1m+6v9UvOj/ULnl/0u24v9Is9//Q7Dc/z6s2f87q9b/EJXJ/w+Txv81o83/OKbR/z2p
+ 1P9Crdj/Ra/b/0qy3v9Pt+H/Urnk/1a85/9bvun/X8Hs/2TE7v8AAAD/AAAA/wAAAP8AAAD/AAAA/yos
+ 0P8qLNH/LC7W/ywu1v8AAAD/AAAA/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/1FRUf9RUVH/AAAA/wAAAP8Xpun/Ysf2/3LL
+ 9v9ty/X/asjz/0OMpv9BjKX/Pouk/zuIov84hZ//Noag/z2XuP9Cpcz/QarU/z6o0/83ncT/KYOh/yN1
+ jf9DbXj/NKPM/zalz/87qdP/QKzW/0Ov2v9Ist3/TLTg/1C34/9UuuX/Qo2u/wAAAP8AAAD/AAAA/yor
+ Kf85Ojf/OTo3/zk6N/8zNHj/KizO/yst0v8qLM7/LC7W/ywu1v8FBRr/AAAA/wAAAP9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0RERP9PT0//UVFR/1FRUf9QUFD/AgIC/wAI
+ C/8ZrvT/GK3z/xit8v9uy/b/19fX/42Ojf9gcnf/Qomf/zuJo/85h6D/N4Sf/zSEnv8xgpz/MICZ/yt+
+ mP8se5P/YW1w/6qrq//+/v7/9/f3/zGhyv81pM7/OabR/z2r1f9Crtj/RbDb/0qz3v9NtuH/CRUa/wAA
+ AP82NzT/OTo3/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8rLdT/Ky3U/ywu1v8qLM7/Ky3U/ywu
+ 1v8WF2v/AAAA/wAAAP8AAAD/BQUF/yIiIv8oKCj/RUVF/0VFRf9FRUX/SkpK/1FRUf9RUVH/UVFR/09P
+ T/8DAwP/AAAA/xKLw/8ZrvX/GK3z/xis8v8Yq/D/F6vu/2FcWv///////////////////////v7+////
+ //////////////7+/v////////////////////////////f39/8un8j/M6PM/zal0P87qtT/P6zX/0Ku
+ 2v9Hst3/S7Xg/wAAAP85Ojf/OTo3/zk6N/85Ojf/QEE+/z9APf85Ojf/OTo3/zk6N/8zNDH/Jymm/zI0
+ 1/8qLM7/KizO/zEz1/8wMtf/KizO/ywu1v8sLtb/Fhdr/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/C1yB/xmv9v8Zr/X/GK3z/xis8v8YrPD/F6vv/xep7f9UfZD/////////
+ //////////////////////////////////////////////////8AAAD///////7+/v/39/f/LJ3G/zCh
+ y/80pM7/OafR/zyq1f9Brdj/RLDb/wAAAP8VLEL/OTo3/0BBPv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/OTo3/zIyMP8bGxr/LS/W/zQ22P8rLdT/KizO/yst0v82ONn/LC7W/yoszv8qLM7/KizP/yst
+ 0v8rLdX/LC7W/ywu1v8sLtb/Ky3V/zk6N/85Ojf/AAAA/wAAAP8AAAD/AAAA/xit8v8YrPD/F6vv/xep
+ 7f8XqOv/Jp3R/////////////////wAAAP/j4+P//////////////////////wAAAP8AAAD/Xl5e////
+ ///+/v7/9/f3/yqcxf8unsj/MqLN/zal0P85qNP/PqvW/0Ku2v8AAAD/QWyX/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zExL/8bGxr/IiJo/y8x1/82ONn/MjTY/zI0
+ 1/82ONn/NjjZ/zEz1/8qLM7/KizO/yoszv8oKsj/KizO/xsbGv85Ojf/OTo3/zk6N/85Ojf/OTo3/wAA
+ AP8AAAD/BSo7/xep7f8XqOv/Fqjp/xmn5f///////////7+/v//X19f//////wAAAP8AAAD/AAAA/39/
+ f////////////////////////v7+//b29v8pm8P/LJ7H/y+fyv80pM7/N6bR/zup1P8/rNf/AAAA/0BB
+ Pv9Up/v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTo3/zEx
+ L/8xMS//JiYk/xsbGv8bGxr/Gxsa/xsbGv8bGxr/Gxsa/xsbGv8mJiT/MTEv/zU1M/85Ojf/OTo3/zk6
+ N/85Ojf/OTo3/zk6N/85Ojf/OTo3/wAAAP8AAAD/Fqfp/xan5/8So+X/////////////////////////
+ //8AAAD/AAAA////////////f39//wAAAP8AAAD///////7+/v/29vb/J5jA/ymcxf8tn8j/MqLM/zSk
+ z/84p9L/O6nV/wAAAP8AAAD/Q0RB/1Sn+/9HW2z/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/QkNA/zk6N/85Ojf/NTUz/zU1M/81NTP/NTUz/zk6N/85Ojf/Pj88/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9BQj//OTo3/zk6N/85Ojf/AAAA/wUpOf8VpeX/E6Pi////
+ /////////////0NDQ/8AAAD//////wAAAP8AAAD/AAAA/39/f///////AAAA///////9/f3/9vb2/ySX
+ v/8nmcL/K53G/y6eyf8yos3/NaXQ/zmn0/89q9b/AAAA/wAAAP9DREH/Rlhn/1Sn+/9Up/v/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf87PDn/OTo3/zk6
+ N/8AAAD/FaTj/xug2P//////////////////////////////////////f39//39/f/9/f3//////////
+ /////////f39//X19f8hlLz/JZjA/yiaw/8rnsf/LqDK/zKizf81ptH/OajU/z2r1/8AAAD/AAAA/wAA
+ AP9DREH/Q0RB/0+Kxf9Up/v/Q0NA/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf///////////0NE
+ Qf9DREH/T1BN//////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/zs8Of85Ojf/AAAA/xWj4f8rj7r//////////////////////////////////////wAA
+ AP8DAwP/ra2t//b29v////////////39/f/19fX/H5K6/yKUvf8mmcH/KZvF/yyeyP8wocv/MqPO/zan
+ 0v85qdT/PavX/0Ct2f8AAAD/AAAA/wAAAP8aGxn/Q0RB/0+OzP9Pjsz/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf//////9vb2/0NEQf/Ly8r/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/OTk3/wAAAP8Uod7/W3iD////////////////////
+ ////////AAAA/wAAAP8AAAD/AAAA/39/f/8AAAD////////////9/f3/9fX1/xyQt/8glLv/IpW+/yaZ
+ wv8pm8X/LJ/J/zChzP8yo87/NqfS/zmp1f8SmM7/EZnQ/xKa0/8SnNX/AAAA/wAAAP8eHx7/Q0hJ/0NE
+ Qf9DREH/S0xJ/1RVUv9UVVL/VFVS//////9DREH/Q0RB/0NEQf//////iouJ/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/UZnh/z1WbP8AAAD/FKDc/2pk
+ Y////////////////////////////////////////////wAAAP//////AAAA/////////////f39//T0
+ 9P8ajrX/HJG4/yCUvP8jl7//JprD/ymcxf8sn8n/MKHM/zOkz/80ptH/EJfM/xGYzv8RmdD/EprT/xKc
+ 1f8Tndf/AAAA/wQEBP9Up/v/Q0RB/1RVUv9UVVL/VFVS/1RVUv9UVVL/Q0RB/0NEQf9DREH/Q0RB/2pr
+ af9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/S3ei/1Sn+/9Up/v/VKf7/1Sn+/9Up/v/S3Wd/0NE
+ Qf8AAAD/AAAA/xOe2f9vcHH///////////////////////////9/f3//AAAA/wAAAP8AAAD/AAAA/wAA
+ AP////////////z8/P/09PT/F4uy/xqPtv8ekrn/IJS8/ySYwP8nmsP/KZzG/yyfyv8vocz/D5TH/xCV
+ yf8Qlsv/EZjO/xGY0P8SmtL/EpvU/xKc1v8AAAD/Q0RB/0NEQf9UVVL/VFVS/1RVUv9UVVL/VFVS////
+ /////////////0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/S3eh/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/PDw5/wAAAP8AAAD/AAAA/xOe2P8Tndb/5eXl////////////////////////////AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/goKC///////8/Pz/9PT0/xaLsP8YjLP/G4+2/x6Suv8glL3/JJfA/yeb
+ w/8pnMb/DZDB/w+SxP8PlMf/EJXJ/xCWy/8Rl83/EZnP/xGa0f8SmtP/AAAA/wEBAf9LdZ3/VFVS/1RV
+ Uv9UVVL/VFVS/1RVUv9UVVL//////0JDQP+pqaj/Q0RB/0NEQf9DREH/Q0RB/0NEQf9Up/v/Q0RB/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/E57Z/xOd1/8SnNX/EZvU//7+/v//////////////
+ //////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/////////////Pz8//Pz8/8Uia3/Foqw/xiM
+ s/8bj7f/HpK6/yCUvf8jl8D/HJXA/w6Qv/8OkcH/D5LE/w+Txv8Qlcj/EJbK/xGXzP8RmM7/EZnQ/xKa
+ 0v8AAAD/UJTY/1RVUv9UVVL/VFVS/6ipp/////////////////9xcW///////0NEQf9DREH/Q0RB/0NE
+ Qf9HXnL/Ojs4/wAAAP8AAAD/S7fl/0q25P9JtuT/SLXj/0a04v8Tntj/E53X/xKc1v8Sm9T/EprS/111
+ fv////////////////////////////////////////////////////////////////////////////z8
+ /P/y8vL/EYeq/xSJrf8Wi7H/GI2z/xuPt/8dkrr/IJW9/w2Nuv8Njrz/DpC//w6Rwf8PksP/D5TG/xCV
+ yP8Qlsr/EJbL/xGXzf8RmM//AAAA/0NEQf9DREH/VFVS/1RVUv/w8fD/////////////////////////
+ //9DREH/Q0RB/0NEQf9DREH/Q0RB/wAAAP9JteP/R7Xj/0az4v9Gs+H/RLPg/0Oy3/9Bsd//EpzV/xKb
+ 1P8SmtP/EZnR/w6Y0P/y8vL//v7+//7+/v/+/v7///////////////////////7+/v/+/v7///////7+
+ /v/Iycn/cG1t/0V8jP8Khq7/D4Wq/w+Ep/8Rhqv/FImt/xaKsf8YjbP/Go+3/wyKtP8Mi7f/DY25/w2O
+ vP8Oj77/DpDA/w+Sw/8Pk8X/D5TH/xCWyf8Qlsr/EJfM/wQmM/8AAAD/VKf7/1RVUv9UVVL/VFVS////
+ //////////////////9qa2j/Q0RB/0NEQf9DREH/T47M/wAAAP8EDA//RLLg/0Ox3/9Csd//QbDe/0Cv
+ 3f8/rtz/Pa7b/xCZ0v8RmdH/EZrQ/xGYzv8RmM3/EJbL/xCVyf8Qlcf/EJPF/xGTw/8QkcD/EJC+/w6O
+ vP8Ojbr/DIu4/wyKtf8Xj7b/Foyz/xSLsf8SiK7/D4Wq/w2Dp/8MgaT/D4Sn/xGGq/8Uia3/FYqx/wuH
+ r/8LiLL/DIm0/wyLt/8NjLn/DY67/w6Pvf8OkMD/DpHC/w+SxP8PlMb/D5TH/xCWyf8Qlsr/AAAA/0NE
+ Qf9GWmv/VFVS/1RVUv9UVVL/VFVS/6Chn/9DREH/Q0RB/0NEQf9DREH/VKf7/wAAAP8AAAD/QK/d/z+u
+ 3P8/rtz/Pq7b/z2t2/88rdr/OqvZ/zmq2P8zqNb/EZjO/xCXzP8Qlsv/EJXJ/xCVyP8Pk8b/D5LE/w+S
+ wv8OkMD/Do++/w2OvP8Njbr/DIu3/wyKtf8LiLL/C4ew/xOKsf8SiK7/D4ar/w2Cp/8KgaX/C4Ci/wyB
+ pP8Phaj/EYer/xOIrf8KhK3/C4av/wuIsf8MibT/DIq2/wyLuP8Njbr/DY69/w6Qv/8OkcH/D5LD/w+S
+ xP8PlMb/D5TH/wAAAP8AAAD/T47M/0NEQf9UVVL/VFVS/1RVUv9DREH/Q0RB/0NEQf9DREH/VKf7/zEy
+ MP8AAAD/PK3a/zus2f86q9n/OqvZ/zmq2P83qtf/N6nX/zWo1f81p9X/M6bT/xCXy/8Qlcn/EJXI/w+T
+ xv8Pk8X/D5LD/w6Rwf8OkL//DY69/w2Nu/8NjLn/DIu3/wyKtP8LiLL/C4ew/wqFrf8KhKv/D4ar/w2D
+ p/8KgaX/CX+i/wh9n/8LgKL/DIGk/w+Ep/8Jg6j/CoOq/wqErP8Lhq//C4ex/wuJs/8MirX/DIu3/w2N
+ uf8Njrv/Do+9/w6Qv/8OkcH/D5LD/w+SxP8PlMb/AAAA/zIzMf9Tpvv/S3We/0NEQf9DREH/Q0RB/0NE
+ Qf9DQ0D/VKf7/0JCQP8AAAD/N6nW/zap1v82qdb/NqjV/zWn1f81p9X/NKfU/zOm0/8ypdL/MKTR/y+i
+ z/8PlMf/D5TG/w+Txf8PksP/DpHC/w6QwP8Oj77/DY68/w2Nuv8Mi7j/DIq2/wyJtP8LiLL/C4av/wqE
+ rf8KhKv/CYKo/wuCpv8KgaX/CX+i/wh+n/8HfJ3/CH2f/wqAov8IgKP/CYGl/wmCp/8KhKr/CoSs/wqF
+ rv8Lh7D/C4iy/wyKtP8Mirb/DIy4/w2Nuv8Njrz/Do++/w6Qv/8OkcH/DpHC/w+SxP8AAAD/QEE+/0NE
+ Qf9Up/v/VKf7/1Sn+/9Up/v/Q0RB/zAxL/8AAAD/J3+h/zOm0/8zp9P/MqbS/zKl0f8xpNH/MKPQ/zCj
+ 0P8uos//LaLO/yyhzf8qn8z/DZHE/w+Sw/8OkcH/DpDA/w6Pvv8Njrz/DY27/w2Muf8Mi7f/DIq1/wuI
+ s/8Lh7H/C4av/wqFrf8KhKr/CYKo/wmCpv8IgKT/CX+i/wh+n/8HfJ3/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAgAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAEB/wgI
+ B/8BBAr/AwkM/wsLC/8QEA//BAsT/wgUGP8SEhL/GBkX/xAXGv8QGBv/Gxwc/x8gHv8gIR//CAgn/wMa
+ JP8MHCP/BB4q/xYeIf8KCzX/BCAt/xQjKv8EKDf/GC02/xYxPf8jIyP/KCgm/ycpKf8rLCv/MDEu/yQk
+ Nv8lLDD/Kisx/yUlPP8uNTr/Nzc3/z9APf9AQT7/Dg9G/xARTv8RElf/BjJE/ww1Rv8GNkn/BzlO/xM3
+ Rv8HPFT/JSVI/yg7SP8mJlX/FRZp/xgZef8nKGT/JSZ3/zIzf/8HQln/GURW/yVBTP88Q0b/JExe/zlL
+ W/8JSmb/EUlg/xJRbP8LV3f/EVZy/y1Obv8sV2n/N1lu/ztbdP84Znr/RERD/0hJRv9ESUv/S0tK/09R
+ Tv9QUU7/RExR/0NQWv9LU1j/U1NR/1hZVv9bXFv/YWJf/0ZZaP9HXXH/R2B3/0phdv9IZH3/YmJi/2xs
+ bP9xcm//c3Nz/3x8fP9/gH7/gYF//xschv8dH5D/HiCT/yMlm/8mJ6T/LzGl/yUnuP8KX4H/DGWL/xJl
+ iP8NapP/B3yd/wh+n/8gaIT/OWyD/yxwjP86dIr/JnWU/zd7lv8OdaH/CX2h/xJ1ov9KaIT/SmyM/0Z3
+ jP9JbpL/TnKT/0N9lv9LdJz/QX+b/0x5pP9Me6j/TX+w/ykryf8vMc//Ky3S/y4w1P8yNNf/N4Ga/wmB
+ pP8KhKv/GoKi/xGHqv8Sia3/HYiv/wuHsP8LibT/DY27/xCBsf8Ui7L/Goyz/xKEuP8Qir7/HI24/w6Q
+ vv8akLf/HJK6/y6Jqv89iqf/Jo+6/zKNtP89j7T/JJa9/zSVu/9GgZf/V4aV/3CTnf9Fiqb/WpWs/02B
+ tP9Ohbz/QJi5/1mauP9vnK7/epym/xGNwf8OksP/D5bL/xOUxv8ZlcP/EJXK/xGYzv8amsz/EpzU/ymb
+ xP82nML/IZ/R/xSg3P8soMz/NqPL/yCh1f8spNP/J6XZ/y2q3/8zpdH/OabR/zWo1f88qdP/M6rc/zus
+ 2v8VpuX/GK3y/yir5P8yruT/LbDr/z6y4/8msPD/T4rF/1CPzf9HncD/UJHT/1elxf9DrNX/V63S/0Sw
+ 3P9Lstv/U7Tc/2Kt0P9htdn/RLLg/0u14f9GuOv/S7rs/1e75P9Gu/H/Yr3l/13B7P9MwPb/V8Dw/2PC
+ 6/91xuv/asfx/3PM9f+EhIP/i4uK/4+Qjv+RkY//mZmZ/5ikqf+Grbr/kqu1/6Kiov+oqaf/qqqq/6+w
+ rv+ntbj/ubm5/8DAv/+UssD/qb7G/77Bwf/IyMj/1tbW/+bm5v/09PT//v7+/wAAAP8AAAD/AAAA/2xs
+ bIiIiIiJiY6Pj4+QkJCQrJCtra2tra+ur7GxsbGxrrGxsa6xsa2vra2tra2srZCQkI+Pj4mJiYmJiIh1
+ bWxsbYiIiImJiY+Pj4+QkJCQkK2tra2xrrSxsbGxsbGurrKxrrGusbGxsbGxrK2trZCQkJCQj4+Pj4mJ
+ iYmIiGxtbYiIiImJjo6Pj4+QkJCsra2tsbGxrKyxrLS0tLS0tLSytLS0tLSxtLGxsbGusa2trZCXkJCQ
+ j4+PjomJiYiIdYiIiYmOiY+Pj4+XkJCXra2xrrGxtLG0tLS0tLS0tLS0tLS0tLS0tLS0tLGxsayxsa+t
+ rayQkJCPj4+JiYmIiIiIiIiJi4+Pj4+QkJCtra2xsayxrLS0tLS0tLS0tLS0tLi0uLS0tLS0tLS0tLSx
+ sbKxsaytrZeQkI+Pj4mJiYmIiImOiY+Pj5CXl62tra+xsbG0tLS0tLS4tLi0uLi0uLi4tLi0tLS0uLS0
+ tLS0tLSsrLGxra2XkJCQj46PiYmJiImJiY+Pj4+Xl5etr6+xsay0tLS0tLS0tLS0tLSslHZ2dpGstMW4
+ tLS4uLi0tLS0tLSxsa+sra2tkJCQj4+PiYmJiY6Pj4+Xl5evrbGysbS0tLS0uLS4uJRBLxACAAAAAAAA
+ AAIGKkF2tLS0tLS0tLS0tKy0sa+trJCQkJCPiYuJiY+Pj4+Xl5evra+xrLS0tLS0tLSsPgYCAAIaJEtS
+ WlpaU00lGwUAAAIvdrS4uLS0tLS0sbGxr62tl5CPj4+Oj5iMko+Xl5etrbGysbS0tLS0uKwsAAIOUV7q
+ 7urq7uru6u7u6u7q5lohAQAQarS0tLi0tLSxsbGvra2XkJCQj4mfn5+Yl5etra6xsbS0tLS0tEICAiRe
+ 6urq6uru8PDx8fHx8PDuX1pRSyQGAQASdrS0tLS0tLSxsa+tl62Qj4+Pn7a6urq1r66vsrS0tLS0tBcA
+ CCFd7uru8PP0+Pj4+Pj4+Pj48yFTX+ru8O7uXiE+tLS0tLS0sbGxr62Ql5eQmJ+2urq6wtG5srK0tLS0
+ tBIBDCQkJOnx+Pj4+fj4+Pj4+Pj4+Frn8PDw8O/mWltcABe0tLi0tLSxsq+tr7Cfn7W1urq60dHS1NXT
+ u7S0tCsBHSQkJCRR8/j4+Pj4+Pj4+Pj4+PQl8O/u7loeGhtdGg4AF7S0tLS0tLG0v7q6urmfoLq6ztHR
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA
+ IAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAHe5z/B32f/wh/ov8JgaT/CYKn/wqEqv8KhK3/C4ew/wuI
+ s/8MirX/DIu4/w2Nuv8Njrz/DpC//w6Rwf8OkcL/D5LE/w+Txf8PlMb/EJTH/xCVyP8Qlsn/EJbJ/xCV
+ yf8Qlcn/EJbJ/xCWyf8Qlcj/EJXI/w+Ux/8PlMb/D5LE/w+Sw/8OkcH/DpC//w2Ovf8Njbv/DIy4/wyK
+ tv8MibP/C4ex/wqFrv8KhKv/CYKo/wmBpf8If6L/CH6g/wd8nf8HfZ//CH+i/wmBpf8Jgqj/CoSr/wqF
+ rv8Lh7H/DIm0/wyLt/8Njbn/DY68/w6Qv/8OkcH/D5LD/w+Txf8PlMf/EJXI/xCVyv8Qlsv/EJfM/xGX
+ zf8Rl83/EZjO/xGYzv8RmM7/EZjO/xGYzv8Rl83/EJfM/xCWy/8Qlsr/EJbJ/w+Ux/8PlMb/D5LE/w6R
+ wv8OkL//DY69/w2Nuv8Mi7j/DIq1/wuIsv8Lhq//CoSs/wmDqf8Jgqb/CICj/wh+oP8If6L/CYGl/wmD
+ qP8KhKv/C4av/wuIsv8MirX/DIu4/w2Nu/8Oj77/DpHB/w+Sw/8Pk8X/EJXI/xCWyv8Qlsv/EZfN/xGY
+ zv8RmtD/EZnR/xKb0v8SmtL/EpvT/xKa0/8SmtP/EprT/xKa0v8SmtL/EZnR/xGZ0P8RmM//EZfN/xCX
+ zP8Qlcr/EJXI/w+Txv8PksT/DpHB/w6Qvv8Njrz/DYy5/wyKtv8LibP/C4av/wqErP8Jg6n/CYKm/wiA
+ o/8JgKT/CYOo/wqEq/8Lhq//C4iy/wyKtf8NjLj/DY68/w6Qv/8OkcL/D5LE/w+Ux/8Qlcn/EJbL/xGY
+ zv8Rmc//EZnR/xKa0v8Sm9T/EpzV/xKc1v8Sndb/E53X/xOd1/8Tndf/E53X/xKd1v8SnNb/EpzV/xKb
+ 1P8SmtP/EZrR/xGY0P8RmM7/EJfM/xCWyv8Qlcj/D5PF/w6Rwv8OkMD/DY68/w2Muf8Mirb/C4iz/wuG
+ r/8KhKz/CYOp/wmBpf8Jg6j/CoSr/wuGr/8LiLL/DIq2/w2Muf8Njrz/DpDA/w+Sw/8PlMb/EJXI/xCW
+ y/8Rl83/EZnQ/xKa0v8Sm9T/EpzV/xOd1/8Tntj/E57Z/xOf2v8Tn9v/E6Db/xSg2/8UoNv/E6Db/xOf
+ 2/8Tn9r/E57Z/xOe2P8Tndf/EpzW/xKb1P8SmtL/EZnQ/xGYzv8Ql8z/EJXJ/w+Uxv8PksT/DpDA/w2O
+ vf8Njbr/DIq2/wuIs/8Lh7D/CoWs/wmDqP8KhKr/CoWu/wuIsv8MirX/DYy5/w2Ovf8OkMD/D5LE/w+U
+ x/8Qlcn/EJbM/xGYz/8RmtH/EpvU/xKc1v8Tntj/E5/a/xOf2/8Tntr/AAMD/wAEBf8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAQH/Dn6t/xSh3P8UoNv/E5/a/xOe2P8SnNb/EpvU/xKa0v8RmdD/EZfN/xCV
+ yv8Qlcf/D5LE/w6Rwf8Oj77/DY26/wyKtv8LiLP/C4av/wqEq/8KhK3/C4ex/wyKtf8NjLj/DY68/w6Q
+ wP8PksP/D5TH/xCWyv8Rl83/EZnQ/xKa0/8SnNX/E53X/xOf2v8ToNv/AAEC/wAAAP8AAAD/DAwM/1JS
+ Uv+bm5v/nJyc/5ycnP+cnJz/nZ2d/4eHh/8CAgL/AAAA/wAAAP8AAAD/AAcK/xSg3P8Tn9r/E57Y/xKc
+ 1f8SmtP/EZnQ/xGYzv8Qlsv/EJXI/w+SxP8OkcH/DY+9/w2Nuf8Mirb/C4iy/wqFrv8olbn/Eoy1/wyL
+ uP8Njrz/DpDA/w+SxP8PlMf/EJbK/xGYzv8RmdD/EpvT/xKd1v8Tntn/E5/Z/wAAAP8AAAD/RUVF/52d
+ nf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/52dnf+dnZ3/AwMD/wAA
+ AP8ACAv/FKDb/xOe2f8Tndf/EpvU/xGZ0f8RmM7/EJbL/xCVyP8PksT/DpHB/w2Ovf8NjLn/DIq1/wuH
+ sf8rl73/MJzC/zagxv83osr/D5LD/w+Ux/8Qlcr/EZjO/xGZ0f8Sm9T/E53X/xOf2v8ADhH/AAAA/zQ0
+ NP+cnJz/nZ2d/52dnf+dnZ3/tbW1/8jIyP/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/IyMj/Dg4O/4aG
+ hv+oqKj/qKio/6ioqP+oqKj/CwsL/wVEXv8Tn9r/E57Y/xKc1f8SmtL/EZjO/xCWy/8Qlcj/D5LE/w6Q
+ wP8Njrz/DIu4/wyJtP8tmr//M5/F/zmkyv8+p87/Q6vS/0iw1/8RmM3/EZnQ/xKb1P8Tndf/E5/a/wAE
+ Bf8AAAD/NTU1/zU1Nf81NTX/oaGh/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf8EBAT/qKio/6ioqP+oqKj/qKio/6SkpP8kJCT/p6en/wAAAP8ACQz/E5/b/xOe2P8SnNX/EZrR/xGY
+ zv8Qlsr/D5TH/w+Sw/8imcP/L57F/yqZv/8wncP/NqHH/zumzf9BqdH/R63V/02y2f9Rtd3/V7ng/wya
+ 1/8Tn9r/AyAt/wICAv81NTX/NTU1/zU1Nf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8jIyP+lpaX/qKio/6ioqP83Nzf/JCQk/yQkJP8kJCT/PDw8/0VFRf8AAAD/AAcJ/xOf
+ 2/8Tntj/EpzU/xGZ0f8RmM3/Q6zU/zyn0P84pc3/M6DH/y2bwv80n8X/OaTL/z+oz/9ErNP/SrDY/1C0
+ 3P9WueD/W7vj/2G+5v9mwun/AAAA/zU1Nf81NTX/NjY2/0VFRf9FRUX/RUVF/0VFRf/Jycn/ycnJ/8nJ
+ yf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/39/f/+oqKj/p6en/yQkJP8kJCT/JCQk/yQkJP8jIyP/AQEB/0VF
+ Rf9FRUX/AAAA/wdScv8Sntr/V7ni/1C23/9Lsdv/Ra3X/0Cq0/86ps//NaLK/y+dxf82ocj/O6XN/0Gq
+ 0v9HrdX/TrLa/1O33v9ZuuL/Xr3l/2TA6P8DDRL/NTU1/zU1Nf83Nzf/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/ycnJ/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/wQEBP+pqan/JCQk/yQkJP8kJCT/JCQk/yQk
+ JP+np6f/RERE/0VFRf9FRUX/RERE/wAAAP9gv+j/Wbzl/1S34f9Os93/SbDa/0Os1f88qNL/N6TM/zKg
+ x/85o8r/PqjP/0Ss1P9JsNj/ULTc/1e44P9cu+P/YsDn/2jC6v8AAAD/NTU1/zU1Nf9FRUX/RUVF/0VF
+ Rf9DQ0P/NTU1/0VFRf9FRUX/RUVF/0VFRf/Kysr/ycnJ/8nJyf/Jycn/ycnJ/3Z2dv8kJCT/JCQk/yQk
+ JP8kJCT/JCQk/yQkJP+qqqr/RUVF/0VFRf9FRUX/RUVF/w8PD/8AAgP/Xb7n/1e54/9RtuD/S7Lc/0Wv
+ 2P9Aq9T/OaTO/zOiyv85pMz/QKnR/0at1v9Nsdr/U7be/1m64v9evub/ZcHp/2rD6/8BAQH/NTU1/0VF
+ Rf9FRUX/RUVF/0RERP82Njb/NjY2/0RERP9FRUX/PDw8/0NDQ/9FRUX/RUVF/0NDQ//ExMT/ycnJ/wAA
+ AP+6urr/u7u7/7u7u/+7u7v/u7u7/7u7u/+6urr/u7u7/7e3t/9ERET/EBAQ/wMDA/8AAAD/YMDp/1q8
+ 5v9UuOL/TrTe/0ew2v9Crdb/O6jR/zakzP88ps7/QqvT/0iv2P9Os9v/Vbjg/1u85P9hwOj/Z8Pq/12s
+ zf81NTX/QEBA/0VFRf9FRUX/RUVF/0NDQ/82Njb/NjY2/0VFRf9ERET/NjY2/zY2Nv9ERET/RUVF/zY2
+ Nv82Njb/NjY2/ysrK/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+5ubn/z8/P/0RE
+ RP8AAAD/YcHq/1y+5/9WuuT/ULXg/0my2/9Ertj/PajS/zekzv8+qND/RK3V/0uw2f9Qtd3/V7ni/12+
+ 5v8QEBD/acTr/wABAf8KCgr/RUVF/0VFRf9FRUX/RUVF/0VFRf87Ozv/RERE/0VFRf81NTX/NjY2/zY2
+ Nv9ERET/ODg4/zY2Nv8AAAD/AAAA/wAAAP8AAAD/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/9DQ
+ 0P/Pz8//Q0ND/0VFRf8iIiL/Y8Hp/16/6P9XuuX/Urji/0yz3f9Frtn/QKvU/zilz/8/qNH/Ra7W/0yy
+ 2/9Std//WLrj/1u54P8QEBD/EBAQ/wABAv82Njb/RUVF/0VFRf86Ojr/AAAA/0RERP9FRUX/RUVF/0VF
+ Rf82Njb/NjY2/zY2Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+7u7v/u7u7/8/P
+ z//Q0ND/0NDQ/7+/v/81NTX/NTU1/0VFRf9FRUX/KE9f/2DA6v9avOb/U7nj/0203/9HsNv/QKvV/zqn
+ 0f8/qdL/Rq3X/02z3P9TuOH/SJS1/zt1jf8/d4//V5+//wAAAP9ERET/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wEBAf81NTX/NjY2/zU1Nf9FRUX/NjY2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/0NDQ/9DQ0P/Pz8//AQEB/zY2Nv82Njb/NjY2/z4+Pv9ERET/Dx8m/2HB6/9bvej/Vbrk/020
+ 4P9Hsdv/QazW/zuo0v9AqtL/LqTS/xOa0P8QEBD/EBAQ/xAQEP8QEBD/EBAQ/wICAv9ERET/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP9FRUX/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/CwsL/yIiIv//////8vLy/9vb2/8CAgL/NjY2/zU1Nf9FRUX/AR0p/yeq
+ 5f9cv+n/Vrrk/0614P9Jstz/QqzX/zyp0/8Qlsn/EZfN/xKa0v8QGRn/EBAQ/xAQEP8QKjX/EBQT/w8P
+ D/9ERET/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/zs7O/8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//v7+/wAAAP8FBQX////////////a2tr/NTU1/z09
+ Pf9ERET/Cld5/xWk4/8UouD/E6Db/xOd1/8SmtP/EpjO/xqay/8Qlsn/EZjO/xKa0v8TnNb/E57a/xSh
+ 3/8QEA//EBAQ/xNznP8VFRX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP+BgYH/////////
+ ////////NjY2/0VFRf9FRUX/Fqfo/xWl5P8UouD/FKDc/xOe2P8SnNT/EZjP/xCWyv8Qlsr/EZjO/xKa
+ 0/8Tndf/FKDc/xSh4P8QEBD/EBEQ/xep6/8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/ERER/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8ODg7//f39///////+/v7/RUVF/0VFRf8EBAT/Fqfo/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCX
+ y/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8UmNT/Fqfo/xeq7P8ABAX/RUVF/zk5Of8CAgv/AAAA/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9DQ0P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/PDw8/wAAAP8AAAD/AAAA/xYWFv9ERET/RUVF/0VFRf8AAAD/Fqjp/xWl5f8Vo+H/FKHd/xOe
+ 2P8Sm9T/EZrQ/xCWy/8Qlsr/EZnP/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xeq7P8XrPH/MjIy/0VF
+ Rf8AAAD/KizQ/wAAAP9BQUH/RUVF/0VFRf9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/zk5Of9FRUX/RUVF/0RERP8AAAD/AAAA/wAAAP8AAAD/BQUF/0RERP8ENUr/Fqjp/xWl
+ 5f8Vo+H/FKHd/xOe2P8Sm9T/EZrQ/xCWy/8Qlsr/EZjO/xKa0/8Tndf/FKDc/xSi4P8VpeT/Fqfo/xOn
+ 6/94zvX/AAAA/0VFRf8AAAD/KizQ/yos0P8AAAD/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/y4u
+ Lv9FRUX/RUVF/0VFRf9FRUX/RUVF/ycnJ/9FRUX/RUVF/0VFRf9FRUX/JCQk/wAAAP8AAAD/AAAA/wAA
+ AP8Xqez/Fqjp/xWl5f8Vo+H/FKHd/xOe2P8Sm9T/EZnP/xCXy/8Qlcn/EZjO/xKa0/8Tndf/E5/b/xSi
+ 4P8VpOP/a8fw/3HL8/93zfX/J0JQ/0RERP8ICAj/KizQ/ywu1v8qLND/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wkJCf9DQ0P/RUVF/0VFRf9FRUX/RUVF/0RE
+ RP8AAAD/AAAA/wULDv9syfP/FKbo/xWl5P8Vo+H/FKHc/xOe2P8Sm9T/EZnP/xCWyv8Qlsn/EZjO/xKa
+ 0v8Sndb/E5/b/zSv4v9jwuz/acfw/3DJ8v90zPT/e9D3/wAAAP8AAAD/KizQ/zY42f8sLtb/AAAA/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf8AAAD/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/3DL9f9rx/L/ZMXw/1u/6/8UouD/FKDc/xOd1/8SmtP/EZnP/xCV
+ yv8Qlcj/EZjN/xGZ0f8Sndb/Vbnk/1u96P9gwev/ZsXv/23H8f8FCw3/AAAA/wAAAP8AAAD/LC7W/zY4
+ 2f82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/AAAA/0VFRf9FRUX/RUVF/0VFRf8FBQX/c833/23K9P9nxfH/Y8Tv/1zA6/9WvOj/E5/b/xOd
+ 1/8SmtL/EZjO/xCWyf8PlMf/EJbM/0ew2/9Ms97/Urjj/1i85/9ewOr/ZMTu/2rG8P9vyfP/AAAA/ywu
+ 1v8sLtb/LC7W/zQ22P82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/AAAA/wkJCf9FRUX/RUVF/ykpKf9IgZv/cMz1/2vJ8/9lxPD/X8Lu/1m/
+ 6v9Uu+f/Tbbj/w6a1f8RmdH/EZfN/xCVyP8MkcX/PqvV/0Su2f9Kst3/ULfi/1a75v9bvun/YcPt/2fF
+ 7/9syPL/ccz1/wAAAP8sLtX/KizS/ywu1v82ONn/AAAA/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9QUFD/EhIS/xIgJP9zzPb/bcn0/2jG
+ 8v9jxfD/XcHs/1e86f9Suub/S7Xi/0Wx3f8/rNn/EJfM/w+Ux/82pc7/O6nT/0Kt2P9Isdz/TbXg/1O5
+ 5P9Yvej/XcDr/2XE7v9px/H/bsnz/wAAAP8sLtb/Ky3V/ykrx/81N9j/AAAA/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/Tk5O/wAAAP8AAAD/IYOr/3PN
+ 9/9wzPb/RY6n/0KNpv9Bkaz/Wr7r/1S75/9Ot+T/SbTg/0Ow3P89q9j/N6fT/w6Qwv80o8z/OabR/z+r
+ 1v9Er9r/SrTf/0+34/9Vu+b/Dh0l/wAAAP8AAAD/CQkJ/zk6N/85Ojf/KizO/yoszv8rLdT/LC7W/wAA
+ AP8AAAD/OTk5/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf9RUVH/SEhI/wAA
+ AP8ZrvT/GK7z/3DL9v+bm5z/U4CO/z6Jo/88iqP/OIag/zWFnv8xgpz/LX6Z/yl8lv82dor/l5eX//n5
+ +f8xocv/NqXP/zyq1f9Cr9n/SLLd/0y14f8AAAD/FxcW/zk6N/85Ojf/OTo3/zk6N/85Ojf/OTo3/ywu
+ 1v8qLM//LC7W/yoszv8sLtb/AAAI/wAAAP8AAAD/AAAA/wICAv8LCwv/CwsL/wsLC/8+Pj7/UVFR/0JC
+ Qv8AAAD/BCs9/xmu9f8YrfP/GKzx/xer7/99fX3/////////////////////////////////////////
+ //////////////j4+P8unsj/NKPN/zmo0v8+rNb/Qq/b/0KkzP8AAAD/OTo3/z4/PP9DREH/Q0RB/0NE
+ Qf9AQT7/OTo3/yQkI/8wMtf/LC7W/yoszv8sLtb/LC7W/yoszv8sLtb/LC7W/ywu1v8sLtb/LC7W/ywu
+ 1v8cHB//AAAA/wAAAP8AAAD/GK70/xiu8/8YrPH/F6vv/xeq7P9sa2v///////////8AAAD/////////
+ /////////////wAAAP8AAAD///////j4+P8sncX/MaLL/zakz/86qNP/Qa3Y/wAAAP9Hjtb/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf82NjT/Gxsa/ykquf82ONn/LS/W/ywu1v82ONn/NjjZ/zQ2
+ 2P8zNdf/LC7W/ygqy/8bHCr/OTo3/zk6N/85Ojf/AQEB/wAAAP8Xq+//F6rs/xao6v9bdn///////9zc
+ 3P8qKir/AAAA/wAAAP+3t7f/Kioq//////////////////j4+P8pm8P/LZ7I/zOjzf83ptH/PKrV/wAA
+ AP9DREH/Q0xR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zc4Nf8xMS//Li4s/xsb
+ Gv8bGxr/Gxsa/xwcG/8tLSz/MTEv/zg4Nv85Ojf/OTo3/zk6N/85Ojf/OTo3/zk6N/8AAAD/C2CH/xan
+ 5/9KhJv///////////8pKSn/ExMT/1FRUf///////////wAAAP8AAAD///////f39/8mmMD/KpzF/y6f
+ yv80pM//OajT/z6s1/8AAAD/Q0RB/1Sn+/9Lc5v/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/z4/PP87PDn/Pj88/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/zk6
+ N/85Ojf/AAAA/xWl5P9Xe4j///////////8AAAD//////wAAAP+AgID/gICA//////////////////f3
+ 9/8hlbz/J5nC/yudx/8wocv/NKXQ/zmo1P8+q9f/AAAA/wQEBP9DREH/UJPX/1Sn+/9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf//////Q0RB/0NEQf9DREH/kpOR/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf85Ojf/Njc0/wMaJP9nZWb//////////////////////7Kysv8AAAD/AAAA////
+ //////////////b29v8fk7r/JJe//yiaw/8sn8j/MaHM/zWm0f85qNT/PqvY/w+Ar/8AAAD/AAAA/0NE
+ Qf9GXHD/Q0RB/0NEQf9DREH/UVJP/0NEQf9DREH///////////9DREH/Q0RB/0NEQf9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/QGmT/wMaJP9mZmf//////////////////////wAA
+ AP8AAAD/AAAA/wAAAP////////////b29v8ckLf/IJS7/yWYwP8omsT/LJ/J/zGizf81pdD/JZ/Q/xGY
+ z/8SmtL/EpzV/wAAAP8AAAD/SW6Q/0NEQf9UVVL/VFVS/1RVUv9fYF3/Q0RB/0NEQf//////Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DQ0D/S3We/1Sn+/9TpPb/AAAA/xOf2/+fn5//////////
+ //////////////////9qamr/AAAA/wAAAP////////////X19f8YjbP/HJC3/yCUvP8lmMH/KJvF/yyf
+ yv8woc3/EJXI/xCWy/8RmM7/EZrR/xKb1P8Tndb/AAAA/0NEQf9UVVL/VFVS/1RVUv9UVVL///////T0
+ 9P9DREH/Q0RB/0NEQf9DREH/Q0RB/0dedP9Tpvr/Q0RB/0NEQf9DREH/Q0RB/zo7OP8AAAD/AQ0R/xOd
+ 1//+/v7//////////////////////wAAAP8AAAD/AAAA/wAAAP////////////X19f8WirD/GY20/x2R
+ uP8glL3/JZnC/yibxf8OkcL/D5PF/xCVyP8Qlsv/EZjO/xGZ0f8SmtP/AAAA/1Sn+/9UVVL/VFVS/1RV
+ Uv9UVVL//////0NEQf9dXlv/Q0RB/0NEQf9DREH/Q0RB/0NEQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wxu
+ mP8Tntj/EpzW/xKb0////////////////////////////wAAAP8AAAD/AAAA/wcHB/////////////X1
+ 9f8Sh6z/Foqw/xmOtf8dkbj/IJS9/wyNu/8Oj77/DpHB/w+Txf8PlMf/EJXK/xGXzf8Rmc//AAAA/0NE
+ Qf9UVVL/VFVS/29wbv//////////////////////Q0RB/0NEQf9DREH/Q0RB/wAAAP9KtuT/SbXj/0e0
+ 4v9FsuH/J6Xa/xKc1v8Sm9T/EprS/2pkZP//////////////////////////////////////////////
+ ///+/v7/+fn5/2poaf8PhKj/Eois/xaKsf8ZjrX/HJG4/wyLt/8Njbr/Do+9/w6Rwf8PksP/D5TG/xCW
+ yf8Ql8v/EZfN/wAAAP9To/b/VFVS/1RVUv////////////////9CQ0D/Q0RB/0NEQf9Qldv/AAAA/0Sy
+ 4P9EsuD/QrHf/0Cw3v8/r93/Pa7b/xKa0f8RmdD/EZjO/xCWy/8Tlsn/CZLH/wOQx/8Dj8X/A4zB/wWK
+ vP8PjLj/DIq0/xaNtf8Ti7H/EYes/w2EqP8MgaT/EISo/xOIrf8VirH/C4ew/wyJs/8Mirb/DY26/w2O
+ vf8OkL//D5LC/w+Txf8PlMf/EJbJ/wAAAP9DREH/VFVS/1RVUv9UVVL/VFVS/0NEQf9DREH/Q0RB/1Sn
+ +/8AAAD/P6/d/z+u3P8+r9z/Pa3b/zyt2v85q9n/N6rX/xGXzf8Qlsz/EJXK/xCVyP8PksX/D5LD/w6Q
+ wP8Oj73/DY26/wyLt/8MibT/C4ex/xOLsf8Rhqz/DoOp/wqBpf8KgKH/DIGk/w+FqP8KhKn/CoWt/wuH
+ sP8LiLP/DIq2/w2Muf8Njbv/Do++/w6Rwf8PksP/D5PF/w+Ux/8AAAD/VKf7/0tMSf9UVVL/Q0RB/0NE
+ Qf9DREH/VKf7/wAAAP8SNkb/OarY/ziq1/83qdf/NqjW/zWn1f8zptP/MqXS/xCVyf8QlMf/D5PF/w+S
+ w/8OkcH/DpC//w2OvP8NjLn/DIq2/wuJs/8Lh7D/CoWt/wqDqv8NhKj/CoGl/wh+of8HfJ3/CoCh/wqA
+ o/8Jgab/CYOp/wqErP8Lhq//C4iy/wyJtP8Mi7f/DY26/w2OvP8Oj77/DpDA/w+Sw/8ABAX/AAAA/0NG
+ Rf9Up/v/VKf7/1Sn+/9EUVr/AAAA/wAAAP8zptP/M6bT/zOn0/8ypdH/MKPQ/zCj0P8uo8//LKHN/xaX
+ xv8PksP/DpHB/w6Qv/8Njr3/DY26/wyLuP8MirX/C4iy/wuGr/8Kha3/CoSq/wmCp/8IgKT/CH6h/wd9
+ nv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABAAgAAAAAAAASAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAA/wUGDP8DCQv/CwsL/w8QD/8QEA//BQoU/wcQE/8LERT/AhQb/wsSHP8REhH/ExcY/xMY
+ Gv8bGxv/ICEf/wgJK/8HGyT/Fh4i/xgdIP8LCzb/AyAr/w4iK/8WIif/BCg3/xYrNP8SMD7/Jycn/zEy
+ L/8oKDz/ODg3/z9APf9AQT7/DQ5B/xQVTP8GMkT/CDNH/wY5Tv8NPE//ETNB/xM9Tf8YP0//BztR/w49
+ Uf8pKUP/IzpE/ykqVv8mPVT/FBVg/whEXP8UQFL/MkBL/y9FWv8nS1r/MERX/zlGUP87SFP/MEhf/wlN
+ af8STmf/Gk5j/xZPaf8KUW7/C1V1/zJKYP8rVWj/P1Ji/zlTa/8xWWv/N2R4/0REQ/9HSEX/SUpH/0NJ
+ TP9MTEz/UFFO/0VQV/9FUlv/U1NS/1hZVv9QWF7/XFxc/0RXZ/9HXnL/QF57/1Bgbf9LYXX/RmN+/0hi
+ ef9iYmL/bGxr/3R0dP95enf/e3t7/xsdif8dH5H/KCmE/yUmnP8lJ6r/KSu2/wxcgf8MZYv/DWyU/w9s
+ mP8TbJL/DXaf/wd9nv8IfJ7/KGuI/zpsg/89dYn/K3eW/zp7k/8OdKD/CH6h/w99rP8Rd6T/LX+g/0hm
+ gv9GaYv/SWyM/0pukP9LcZX/RHyW/0pzm/9MdqD/THqm/018qv8pK8j/Ky3S/y4w0/8zNdf/OoKZ/wmB
+ pP8KhKv/EIWp/xyFq/8SiKz/C4aw/wuJtP8Njbv/EoS1/xSLsv8ZjbT/EoO5/xKJvP8OkL//HJC3/xaS
+ vf8dkbn/IYmr/yuJqf86kK7/IpS8/yuYvf86kLT/NJO4/0SDl/9Xi5z/ZJCe/02MqP9Kka//UZGu/02A
+ sv9El7T/S5Wy/0qat/9BmLn/TJy7/1Gauf9dob7/aqS+/3enuv9/rLr/Eo/F/w6Sw/8TlMX/EJXJ/xGY
+ zf8cmcj/EpvT/xyc0v8Tntj/KZvF/zGdw/88ncX/IJ/R/xSg3P8tocz/NqPL/yah0f8rpNT/JKTY/yun
+ 3P8sqN3/M6XR/zqm0P81qNb/PKnT/zKp2f87rNr/FaXl/xis8v8gq+r/NbLp/02fwv9Npsn/VaXG/0Os
+ 1P9Or9f/Q67Y/0mv2P9EsNz/S7Lb/1K13f9hpMP/dq7H/2Sz2P9Es+L/S7Xh/0u45/9Btun/V7rk/2O9
+ 5P9dwOv/WMP0/2PC6/9px/H/c8z1/4KCgv+HiIb/ioqJ/5CQj/+Tk5P/l5iW/5ycnP+Bqrr/mbK9/6Sk
+ pP+nqKb/qKmn/6qqqv+6urr/gK3A/5+6xf+mws7/scfO/8jIyP/R0dH/29zc/9/g4P/j4+P/6+vr//T0
+ 9P/+/v7/AAAA/2pqhYWFhoaKi4yMjJKSr7CurrGusbGxsrGxsbGxsbGxr6+SjIyMi4uLhoaFhYVqampy
+ hYWKiYuLi4yMkpKur7GxsbKxsrKysrK0sbGxsbGxsbGvkpKMjIyLi4uGhoWFanKFhoaGi4uMjIyvsK6x
+ sbGysrSytLS0tLS0tLS0tLKxsrGxsbCvkoyMi4uLhoaFhYWGhoqLi5KLr6+wsbGytLK0tLS0tra2tra0
+ tra2tLS0srKxsbGur6+MjIuLioaGhYaHhouLi5Kvr7GxsbKytLS2tra2u7a2trS7tru2tra2tLS0srKx
+ sa+vkoyLi4uGhoaKi4uSkpKvsbGytLK0tra2rmU6GBEGBgYQGCU/c7a2tra0tLKysbGvr4yMi4uKhoeL
+ i4uSkq+vsbGytLa2tmQVAQscSllaW1paT0YPAQYxjba2trS0srGxr6+SkouLipmTjpKSr7CysrS0tLZo
+ BgpK5evr6+vr6+7r6+vr5k4MABiNtra0tLGxsa+vjIyLi5qavbezr7KytLS2tCQBD+Xr6+7y8vf39/f3
+ 9+kfUVvl5VtJOra2tLS0sbGvkoyLjri9vb3Qxbq0tLa0IwYcHkbu9/f39/j39/f391Hu7vHrW0rlASO0
+ tra0tLGvsre3mre9xc7T1tbVx7Y6Ax4eHkZR9/f39/f49/f38Vrx7lEbDxxOHgMatbS0tb/Fzr29t729
+ ztDQ1tbe4qkGHh4eRkZGUfL39/f39/f4Wu7mHBsPG1EcRiAGP8vU1dXS0L29t7290NPW1t7f4jUPHh9G
+ RkZGSUrq9/f39/f3WV0bDxsPG1ocSUYeAc/e3tXT1Ma9vb3O0NPW3t/i2QoeHkZJRh8fRkZGWev39/f3
+ HhsbGxsbG1keR0dGD0He3t7V0MbGvb3G0NbW1t/ipQweRkZGRhweIEYfIEZOW+nuG+jv8fHx6+jlW1lO
+ Ewrf3t7V1dLGvcbR09XW4NbidxseRkZGIB4eRh8eHiBGHh4eG/Hy8vLy8vLy8vfrHAup4N7e1NDGvb3Q
+ 1d7ezxepRBseRkdGRh9GRx4cHkYfHAwDAx7p8vLy8vL39/EfRhtw3t7e29TGxsbQ1dbepRcNGR5HHh4b
+ HR5GRh4eHkYeBQAAAAAASvLy9/j45RweRh1F4t7e1dTSvdDV1XBtRUUtAx5GRkZGHg4DDhseHkYbAAAA
+ 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
+ AAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAHfZ7/CH+i/wmBpv8Khav/C4av/wuI
+ s/8Mi7f/DY27/w6Pvv8OkcH/D5LE/w+Uxv8QlMj/EJbJ/xCWyv8Ql8v/EJfL/xCWyv8Qlcn/EJXI/w+U
+ xv8PksT/DpHC/w6Qv/8Njrv/DIu4/wyJtP8Lh7D/CoWr/wmCp/8IgKP/B32e/wh/ov8Jgqf/CoSr/wuH
+ sP8MirX/DYy5/w6Pvf8OkcH/D5PF/xCUyP8Ql8v/EZfN/xGZz/8RmdD/EZnR/xKa0f8Sm9L/EZrR/xGZ
+ 0P8RmM//EZjN/xCWy/8Qlcj/D5PF/w6Rwv8Oj77/DY26/wyKtf8Lh7H/CoSs/wmCp/8IgKP/CYKm/wqE
+ q/8Lh7D/DIq1/w2Nuv8OkL//D5LE/xCUx/8Qlsv/EZjO/xGZ0f8Sm9P/EpzV/xOd1/8Tntj/E57Y/xOe
+ 2P8Tntj/E53X/xKc1f8Sm9T/EZrR/xGZz/8Ql8z/EJXI/w+SxP8OkMD/DY27/wyKtv8LiLH/CoSs/wmC
+ p/8Khav/C4ew/wyKtv8Njbv/DpDA/w+Sxf8Qlcn/EZjN/xGZ0f8SnNT/E53X/xOf2v8UoNv/Dn6u/wAL
+ D/8ACQv/AAME/wIdKf8Uot//FKDc/xOf2v8Tndf/EpzV/xKa0f8RmM7/EJXK/w+Uxv8OkcH/DY68/wyK
+ tv8Lh7H/CoSr/wuGr/8MirX/DY26/w6QwP8Pk8X/EJXK/xGYz/8SmtP/E53X/xOf2v8ABgf/AAAA/woK
+ Cv+dnZ3/nZ2d/52dnf+dnZ3/nZ2d/5ubm/8FBQX/AAAA/wIdKP8Tn9r/E53X/xKb0/8Rmc//EJbL/w+U
+ xv8OkcH/DY67/wyKtv8Lh7D/LJi9/zSexP8OkL//D5PF/xCVyv8RmM//EpvU/xOe2P8BFR3/AAAA/52d
+ nf+dnZ3/nZ2d/6Ghof/Jycn/ycnJ/8nJyf/Jycn/vr6+/wQEBP81NTX/dHR0/wYGBv8Pfq7/E57Z/xKc
+ 1P8RmND/EJfL/w+Uxv8OkMD/DY26/wyJtP8wnMH/OaLJ/0Gp0P9Irtb/EJjP/xKb1P8Tntn/AAYH/zU1
+ Nf81NTX/NTU1/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/8nJyf9/f3//qKio/6ioqP8nJyf/JCQk/wAA
+ AP8ABwj/E57Z/xKc1f8RmtD/EJbK/w+Txf81oMj/LJvB/zSfxv88ps3/Ra3U/06y2v9XueD/Xr3k/2C+
+ 5/81NTX/NTU1/0RERP9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6ioqP9SUlL/JCQk/yQk
+ JP+lpaX/RUVF/0FBQf8CHSj/E57Z/1K33/9JsNr/QavU/zilzf8wnsb/OKPK/0Gp0f9Jr9f/UbXd/1y7
+ 4/9jwOj/AAAA/zU1Nf9FRUX/RUVF/0VFRf9FRUX/RUVF/8nJyf/Jycn/ycnJ/8nJyf8iIiL/JSUl/yQk
+ JP8kJCT/JCQk/5SUlP9FRUX/RUVF/wICAv9fv+j/V7nj/06z3f9Frdf/PKnR/zSiyv87pc3/RKvU/06y
+ 2v9XuOD/X77m/2jD6/80NDT/QUFB/0VFRf9FRUX/NjY2/zY2Nv9FRUX/RERE/0VFRf+tra3/ycnJ/wgI
+ CP+Tk5P/vLy8/7y8vP+urq7/SkpK/wkJCf8JCQn/Kysr/wIJDP9avOb/Ubfg/0mw2v9AqtT/N6TN/z+p
+ 0P9Hrtf/ULTd/1q74/9jwOf/a8Xs/zU1Nf9FRUX/RUVF/0VFRf82Njb/RERE/zY2Nv82Njb/RUVF/zY2
+ Nv82Njb/NjY2/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/8/Pz/9FRUX/AAAA/1+/6P9VuuP/TLPd/0Kt
+ 1/85pc//QKrS/0qx2f9Tt+D/XLzl/xAQEP9wyfD/RERE/0VFRf8iIiL/RUVF/0VFRf9FRUX/NjY2/zY2
+ Nv9FRUX/NTU1/wAAAP8AAAD/AAAA/y8vL/+7u7v/u7u7/9DQ0P/Q0ND/NTU1/0VFRf8EBAT/YsLr/1e6
+ 5f9OteD/RK7Z/zyo0v9CrNP/S7Lb/w4NC/8RFhj/EhcY/wsLCv9FRUX/RUVF/0VFRf9FRUX/MTEx/wAA
+ AP8oKCj/NjY2/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/1FRUf/Q0ND/DQ0N/wICAv82Njb/NjY2/yoq
+ Kv9jwuz/Wrzn/1C34f9HsNv/PanT/xCWyv8RmdD/EBAQ/xAQEP8QEhL/EBIT/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2lpaf/+/v7//////wgI
+ CP82Njb/HR0d/xWl5P8Uod7/E57Y/xac0v8/q9X/EJfL/xGa0f8Tntj/FKHe/xAQEP8RKjX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE////
+ ////////5+fn/0VFRf8BAQH/FaXl/xSh3/8Tntn/EprS/xCXzP8Ql8v/EprS/xOe2f8Uod//EA8P/xao
+ 6v8BAQH/RUVF/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/wEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/ygoKP9ERET/RUVF/wAKDf8Wpub/FKLg/xOf2v8SmtP/EJfM/xCXy/8SmtL/E57Z/xSh
+ 3/8VpeX/F6nr/wU1TP9FRUX/AAAA/yos0P9FRUX/RUVF/0VFRf9FRUX/Li4u/wAAAP8AAAD/AAAA/wAA
+ AP9FRUX/RUVF/0VFRf8CAgL/AAAA/wAAAP85OTn/F6jr/xam5v8UouD/E5/a/xKa0/8Ql8z/EJfL/xKb
+ 0v8Tntj/FKHf/xWl5f9wyfL/eM/2/yEhIf8AAAD/MTPX/wAAAP9FRUX/RUVF/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/zY2Nv9FRUX/RUVF/0VFRf9ERET/AAAA/wAAAP9syPL/FaXl/xSi4P8Tntn/EprT/xCW
+ zP8Qlcr/EZnR/xOd1/9Uuub/ZMPt/23H8f92zfX/AwkM/wAAAP82ONn/KizR/0VFRf9FRUX/RUVF/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RUVF/0VFRf9ERET/cMv1/2fG8f9fwe3/FKHf/xOe
+ 2P8SmtL/EJbL/xCWyf8Rmc//TrTg/1i85v9gwev/acbw/wAAAP8sLtb/KSvN/zY42f8xM9f/MjIy/0VF
+ Rf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/wAAAP9FRUX/RkZG/1WXtf9tyvT/ZcTw/1y/
+ 6/9Tuub/EZ3X/xGZ0P8Qlsr/OafR/0Kt2P9Ls97/U7nk/1y+6f9lxO7/bcny/wAAAP8sLtb/MDLX/zEz
+ 1/9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/AAAA/1BQUP8oR1X/ccz2/2nI
+ 8/9gw+//WL3p/0+45P9Fst7/PqzY/xCUyP82pM7/PqrV/0ex3P9PtuL/V7zn/wAAAP8AAAD/AAAA/x4f
+ lP8pK8r/LC7W/wAAAP8RERH/RUVF/0VFRf9FRUX/RUVF/0VFRf9FRUX/RERE/1FRUf8CAgL/Ga/2/3PM
+ 9v9rw+v/QYyl/zyJov82hZ//MYGb/yt8l/8neZL/oaKi/zKiy/86qNP/Qq7Z/0q03/8AAAD/OTo3/zk6
+ N/85Ojf/OTo3/yMkdf8qLM7/MDLX/ywu1v8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBQX/AAgM/xmu
+ 9f8YrPL/F6vv//7+/v/////////////////////////////////7+/v/Lp7I/zakz/89q9b/RbHc/zk6
+ N/9DREH/Q0RB/0NEQf9DREH/P0A9/yQkIv8xM9f/Ky3V/zI02P81N9j/Ky3S/yst0v8sLtb/LzAt/zk6
+ N/8KCgr/AAAA/xer7/8XqOv/mZqa//////8AAAD/Pz8//7+/v//5+fn///////v7+/8pnMT/MaHK/zen
+ 0v8/rNf/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0JDQP8xMS//MTEv/zExL/8xMS//MTEv/zk6
+ N/8+Pzz/QkNA/zk6N/85Ojf/AAAA/xan5/91dnb//////wAAAP//////AAAA//////9/f3//+vr6/ySX
+ v/8rnsf/MqLN/zmo0/8AAAD/Q0RB/0t1nf9RmuP/Q0RB/0NEQf9DREH/Q0RB//////9DREH/Q0RB/0NE
+ Qf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf85Ojf/AAAA/5aWlv///////////wkJCf8AAAD/X19f////
+ ///6+vr/H5O6/yaZwf8sn8n/M6PO/zmo1P8RmtD/AAAA/wAAAP9GWWn/Q0RB/09QTf9UVVL//////3N0
+ cv9DREH/Q0RB/0NEQf9DREH/Q0RB/0NEQf9DREH/Q0RB/0NFRP8AAAD//v7+////////////AAAA/wAA
+ AP////////////n5+f8bjrX/IJS8/yeaw/8sn8r/M6PP/xCXzP8RmdD/EpzU/wAAAP9HXG//VFVS/1RV
+ Uv9UVVL/4ODg/6Sko/9DREH/Q0RB/0NEQf9Up/v/S3We/0NEQf9DREH/AAAA/xOe2f//////////////
+ //8AAAD/AAAA/wAAAP//////+Pj4/xaKsP8bj7b/IZS9/yaaw/8OkcL/D5TG/xCWy/8RmM//EprT/0NE
+ Qf9UVVL/VFVS/1RVUv9NTkv/Q0RB/0NEQf9DREH/Q0RB/wAAAP8AAAD/Mn2c/xOe2f8Sndb/EprT////
+ //////////////////8AAAD////////////4+Pj/EYer/xaKsf8aj7f/DIu3/w2OvP8OkcH/D5PF/xCV
+ yf8RmM3/AAAA/1RVUv9UVVL///////////9DREH/Q0RB/0dcb/8udpb/RbLh/0Ox3/9Ar93/EprT/xGZ
+ 0P8Klc7/WW1z/21ra/94cnL/bGts/1drcP8cj7T/FIqw/w+Gqv8MgaT/EYer/xGJr/8LiLL/DIq2/w2N
+ u/8OkL//D5LD/w+Ux/8Oibj/Rllq/1RVUv9UVVL/Q0RB/0NEQf9Up/v/AAAA/z2u2/89rdr/OqvZ/zep
+ 1/8RmM3/EJbK/w+Ux/8PksT/DpDA/w2OvP8Mi7f/C4iy/wqGrv8Phqv/CoGl/wh9n/8MgaT/CYOo/wqE
+ rP8Lh7H/DIq1/w2Muf8Njr3/DpDA/w+Sw/8AAAD/T4vI/0psjf9DRED/UZfe/wAAAP81qNX/NKfU/zOm
+ 0/8xpNH/L6LP/yygzf8PksT/DpHB/w2Ovf8Njbn/DIq1/wuIsf8KhK3/CYOo/wqCpf8Ifp//AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQEB/wwMDP8PDxr/DBIU/xMU
+ FP8SGRz/HBwc/w8eJf8ZGSv/EhM7/w0kLf8WICX/GyEj/xklKv8LKjf/Eycw/xQpMf8QKjX/HSsw/xYz
+ P/8cMDn/IyMj/yUnKP8rKyv/Li49/yMxOf80NDT/ODk2/zIyPP87Ozv/QUI//xESR/8SE0j/FBVd/wc3
+ S/8MN0z/BzlP/ww5Tv8RNUX/GjVA/xg7SP8HPFL/CD5U/y4vS/8vMEn/LT1M/zE8Rv8uLlP/FBVi/xgZ
+ df8uL27/JSdw/wlDXP8QRVz/JkJO/ypCUf8qS1z/NUpd/whKZf8KTGj/Eklh/xJQa/8JVXP/HVt3/zVN
+ Zf8hUmf/KlRm/yxXaP8wV2r/OVJp/yNacf8kX3j/Pmp+/0NEQ/9LS0r/RExQ/1NTU/9ZWlf/Ulha/1tb
+ W/9GVmL/Q1dp/0FbdP9CXnj/QWB+/0hkff9QY3P/ZGRj/2doZf9sbGv/cHFv/3Nzc/93eHb/fn5+/yAh
+ lv8qK5T/ISOj/ygqr/8mKLb/Jii6/yoru/8MYYb/DGWK/xZkhP8Ocp3/B32e/wl+n/8paoT/J22I/yl2
+ l/8IfqH/D3uo/xp9pf8Qeqr/RWaG/0pqiP9KbY3/TG6O/0J0i/8qLMX/Ky3P/ywu0/8uMNT/MTPW/zM1
+ 2P8IgKP/CYGm/wyCpf8Jg6j/CoSr/w+Gq/8PgK//CoWs/w2Hr/8bhKT/EYer/xCIr/8Lh7D/C4ix/wyJ
+ s/8MirX/DI26/w2OvP8RgrP/FIqw/xqPtv8Rjbz/DpC//xuQt/89i6b/PI6q/yCUvP8lmL//LJm9/0KG
+ nf9JiKP/Vo+i/16br/9DlrH/U5u7/1uevf8RjsP/DpDB/w+SxP8PlMb/EJLC/xyXw/8Qlsr/EZjO/xKa
+ 0/8endD/E57Y/yWZwv8qm8T/IpzK/y2fyf8xm8P/FKLf/y2izv81oMb/M6PN/zmkzP8ioNP/LKTT/yWl
+ 2/8optv/M6bT/zmm0f87qdP/O6zZ/xWk4v8bpuL/F6nr/xus7/8YrfL/JKvm/zux4/9PoML/RabO/1ur
+ zf9Cq9T/T6nQ/0Ou2P9Fsdz/S7Lb/1K13f9fuN//ZqnA/3i0yP96uM//arbZ/0Wz4f9OtuH/T7jl/0m6
+ 7v9Rt+D/VLnj/1q75P9Svev/W77p/2C/5v9dwOz/TsD0/1zC8P9iwev/bcfv/2XF8P9ox/H/bcny/4KC
+ gf+Li4v/lJST/5ubm/+jo6P/qquq/7S0tP+7u7v/v8C//4O6zf+YuML/hbvQ/5HA1f+ZwtT/mcTY/7DK
+ 1v+7093/w8PD/8nJyf/Q0ND/1Nrd/9nZ2f/m5ub/6+vr//Ly8v/8/Pz/AAAA/2lugIGFi4yNoqKjpaSn
+ p6enp6enp6Whjo6OiYmEgH1pfYCEhYyNk6OjpKeoqampqampqainp6enoY6NjImEgX2AgYqMjZOjpaep
+ qampq6urq6upq6mpqaeno6KOjYuEgIGKjI2TpaepqamrqGg+NCoqO2aPq6upqainpKKOjIuEiIyTk6So
+ qampbyMISldcXV1bTx0HO6GrqamnpI6OjIqZmaakqKipqToEW+jp6+vs7OxdV1pPS2erq6inp6KOkLC1
+ xry3qakqFRtM7ff39/f39lvq509PFySrq6mnrq2ts7XIzc7ZbRUaHklZ9vf39/fo6FcWFUwbFju4vczI
+ tbC1yMzN2eAZGklJSUlN6ff39+VKFRUWTElJBsXXzMq8tLXJzNjZxwwdSUkbHUkeT+bqTFtdXVtcWE0X
+ Q9vXzMi7u8rN2Z+bF0pJSRweHRxJHRcV6ezs7Ozt7EkZ4NnMyrXIzNjFBTYaHRwaHkkdGx4VAAAAT+z2
+ 9+pJSQzc2NTIvMjMQzg2Ax5JSR4VBgYaSQAAAAAAT+nnHRodFdnZ1Mu8qKgRBSYDG0lKSUpJGgYBAAAA
+ AAABXfb+Vx0Wvr+4ubenqZKPBTUXSUlJSUlKSRoAAAAAAAAG7P7oSRS+vqupp6epqbE9vhQbAhdJSklJ
+ FQAAAAAABAEBW0xJPMCxq6mop6ixscDAPx0JMRdJSUkVAAQBAQZJHgQAAAZvvr6rqaeoqam+w93SFgh6
+ Hx1KSUlJSUlKFx1JShcBD9bAvqupqKSpscTg5KANCXteGklJSUlKSUlJBElJSReg4tq4q6mnp7bU2ODh
+ RDBge2QVSUpJSUlJSkkaBkkbdOTi29q5qai0yszY3eDkOHd6YRdJSUlKSUlJSR4EF0jh3ODa1cu3pbS8
+ y9XJQhIGM3hjHwweSUlJSklKSg1o3vCcmpWWlZ3vtLzLxgsaHR0bMnp6YSEJCAgIFRUlq8LC9f78/fz7
+ 6/6ytMhrLh5JSR4dK193fHt7emQvFwYlp8Dz+lvo6Oft/q20umtAVUkeSUkeHhocLCwcGx4eHRsFofH+
+ 5eVa5+j+l620uigZc3RLHh5J6krlSUkeSR5JHhs08v7860zo/v6Xra+0vHAqC1RLSk3n6ehJHkkeSR5L
+ Uyr0/v7mWeX+/pSXrbKuqKihDlFMTObmWUlJUHNyckALcfn+/kkAAPf+kJSXrKWnqKloN0xb9vZbSUst
+ JkFGZqGt/v7+6lfn/v2HkJSSjqKlp6cPVlv+/lxJOUbUy8SqqbDR8PDu0M+ehn+HiIqMjY6jpD5FTldY
+ SVImvb29vKqnpKWijoyLiYd+an+AhIqMjY6ijgpUdXNTELC6urq3rqOijo2MioSAfm4AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
+ AAAYAAAAMAAAAAEAIAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAHfZ//CYGl/wqEq/8Lh7H/DIq2/w2O
+ u/8OkMD/D5LE/w+Ux/8Qlcn/EJbL/xCWzP8Qlsz/EJfL/xCWyv8QlMf/D5LE/w6Rwf8Njrz/DIu3/wuH
+ sf8KhKv/CYKm/wh+oP8JgaX/CoSr/wuIsv8NjLj/Do++/w+SxP8Qlsn/EZfM/xGY0P8SmtL/EpvU/xKc
+ 1f8SnNX/EpvU/xKa0v8RmdD/EZfN/xCVyf8PksT/DpC//w2Nuf8LiLP/CoSs/wmCpv8KhKv/C4iy/w2M
+ uf8OkMD/D5TG/xCWy/8RmdD/EpzV/xOe2P8Tn9v/FKHc/xCNwf8Untn/FKHd/xOf2/8Tntj/EpzV/xGZ
+ 0f8Qlsz/D5TH/w6Rwf8Njbr/C4iz/wqErP8Lh7H/DYy4/w6QwP8PlMf/EZfN/xKa0/8Tntj/AAoM/wAA
+ AP+cnJz/nZ2d/52dnf+dnZ3/nZ2d/5ycnP8AAAD/C2yV/xOe2f8Sm9T/EZjO/xCVyP8OkcH/DY25/wuI
+ sv8vm8H/OaTK/xGUxv8Rl83/EpvU/xOf2v8AAAD/NTU1/52dnf/Jycn/ycnJ/8nJyf/Jycn/ycnJ/6io
+ qP+oqKj/qKio/6Kiov8Tn9r/EpzV/xGYzv8PlMf/DpC//ySWvv81oMf/QKnQ/0uw2P9XueD/Yb7m/wAA
+ AP81NTX/RUVF/0VFRf/Jycn/ycnJ/8nJyf/Jycn/AwMD/6ioqP8kJCT/JCQk/0JCQv8AAAD/E5/b/w2Y
+ 0/9Hrtj/O6bQ/zCfx/85pMz/Rq3V/1G03f9evOT/acTs/zU1Nf9FRUX/RUVF/0VFRf9FRUX/ycnJ/8nJ
+ yf/Jycn/p6en/yQkJP8kJCT/Gxsb/0VFRf9FRUX/AAAA/1m75P9Ns93/QqzV/zajy/8/qdD/S7HZ/1e4
+ 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
+ K/8cLTX/ES05/x8xOP8hISH/IiQj/yQkJP8nJyr/LCws/yIiOP8uMTL/KDc9/zQ0NP8wNzz/Nzc8/zk5
+ Of89Pjv/PT09/z9APf9AQT7/GBlL/xobU/8ZGln/FjVC/xs3RP8fO0z/JTpE/yM6Sf8kPkj/ID1N/yY9
+ Tf8zM0T/NT5B/zQ1SP8xMlT/IiN4/xZBVv8XSF7/IkBO/yhIVv82SFD/Mkda/zJJXv8zUFz/DUhh/xJP
+ av8MUWz/ElBq/wpUdP8LWHn/Dlp5/wtef/80TWT/KlVm/zBVav8/V23/QUJB/0NEQf9ERUL/REVF/0xN
+ Sv9OTkz/QE9c/0xSVv9FUFj/UVFR/1RUVP9YWVb/Wlpa/11dXP9GVWH/QFhu/0dcbv9GXnT/W2Bh/0hg
+ df9MZn3/YmJi/2pqav9ubm3/cXFx/3Z2dv96enr/IiOe/yosm/8jJKn/Jym2/ycpv/8pK7//DGGF/w9m
+ jf8MaI7/EWWL/wh+n/8qaIL/KHKP/z1wh/8/d47/JHKS/zF9nP8JfqD/Dnqm/xF3p/8Sfq3/R3qS/ywu
+ yv8uMM3/LzHV/zM12P8JgaX/DIOn/wqDqP8KhKv/DoWp/w+Ar/8Khaz/EIWp/xaJrv8fi6//D4Gx/wuI
+ sv8Ni7b/DIy5/w2Ovf8Qg7T/Fouw/xWNtP8OkL//HJG4/x2TvP8vhaf/MoKi/zeHqf8qkrf/I5a+/yWU
+ vv8ukbj/LJa8/0yXuP8XjsD/DpDB/w+TxP8PlMb/FJPB/xGQxf8Qlcf/FJXH/xuTwP8Qlsn/FJbI/xCX
+ zP8RmM3/FZrO/xmbzv8Ul9D/EpvT/xOe2P8hl8D/JZjB/y+cwf8qnMT/JZ/N/yyeyP8on8z/MZ/G/zCc
+ yP8Uod7/HaXf/zWhx/8woMr/NaLJ/zOjzv82o8z/NqTO/zqlzP8tptj/MaXS/zSl0P8xotb/OqbQ/zWo
+ 1f85qNP/PajR/z2q1v84q9n/ParY/z+v3f8Wpub/F6rt/zu06v8qs/L/V5/A/1qoy/9Cq9P/Q67Y/1Or
+ 0P9GsNv/S7Lc/1ix1v9Ttd7/WbXc/0Kz4/9PuOX/T7zr/1O34P9UueP/W7zk/2O84/9dwOv/Y8Pt/2rI
+ 8v9zy/P/gYGB/4SEgv+Ghob/iYmI/4yMi/+NjY3/kJCQ/5WVlf+bm5v/k7G7/6Ghof+lpaT/qKin/6qq
+ qv+0tLT/urq6/5G1wP+kwcr/rsfR/63Q3/+61N//tdTi/8PDw//FxcX/yMjI/87Pz//J2t//0NDQ/9ra
+ 2f/a4eT/3ePl//r6+v//////AAAA/2d3eoKDhZaanp6goKCgoJualoWDgnl3Z3d6goSWl56gpKWlpqWl
+ paWgnpeWhIN6eHuChIWYoKWlpXBjOjxkhqWlpaGYloSDfYiEiZukpZU2Kldc4eBbTAs6pKWknpaEgqmy
+ raKlcQRF6+319vboXORZMnGloJuZi7LLz9fBCRZCWvX29vbh3hYWHQqVucG/rLjL0dhrFkNFQk/p9vZL
+ EBBFHEIx2M/LuMDP2Nk1HUUZGxsbS1lX7Ozr5uAI0tbOuMvPzSQVHBsZRBkbEgABV+317EwWlNfPwb9t
+ JA0ORUUZEA4WAgAAAE/rXBYZjtXPwKB8NwwKRUVFRUUSAAAAABRM/lsYhqamo6ClpTlkGQUbRUUbAAAA
+ AAEC4E8UsMWlpaGlsMW8FCAeQkVCARADA0UWAQAvxbGloaGlsdXdNSBiEkVFRUVFGxJFQgPKx7CloZ65
+ 19vJB112E0VFRUVFRRAZG3Lc29OmoLvO1NrZQGF1BkVEREVFRUICa9nQ1s/Bi7vMzz8PEixzXx8RFBYW
+ QiRxyPDv7u7n+7O/jRdCQx0sXnN0YF8tDiFwxvPp7Ovl/aq1jjNVRUNDHB0pKxgaHRoSZPH15Vzp/pGz
+ u2kiPlJERuriT0NDQ0NFLvL+6Uv1/YqorKuhbyNJTeHfR0NSU0E0PPv+5BBa/YeKp5eeoT1QWfrqQ0gw
+ aGyBr/7++eP3+H6Hg4SJm4koVO3jSifDzsKhn5GTj4B/e254fYKEhZY4QVZTJZK+urqfloWEgn15bgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAA
+ AAAAAAAAAAAAAAAAAAAIf6L/CoSr/wyJtP8Njrz/D5LD/xCVyP8Ql8z/EZjO/xGYzv8Ql8z/EJbJ/w+S
+ xP8Njr3/DIq1/wqErP8IgKP/CoSr/wyKtv8OkMD/EJXI/xGZ0P8SnNX/E57Z/xOg2/8ToNv/E57Z/xKc
+ 1v8RmdD/EJXJ/w6QwP8Mirb/CoWs/xKMtf8OkMD/EJbK/xKb0/8Tn9r/RUVF/52dnf+dnZ3/nZ2d/52d
+ nf8DAwP/FKDb/xKb1P8Qlsv/DpHB/wyKtf82ocf/R63V/1e54P8DIS3/NTU1/0VFRf/Jycn/ycnJ/8nJ
+ yf+oqKj/JCQk/zw8PP8ABwn/EpzU/0Os1P8zoMf/PqjP/1C03P9iwOf/NTU1/0VFRf82Njb/RUVF/8nJ
+ yf/Jycn/JCQk/yQkJP9FRUX/RUVF/12+5/9Lstz/OaTO/0St1f9XueL/acXs/0VFRf9FRUX/RERE/zY2
+ Nv85OTn/AAAA/7u7u/+7u7v/u7u7/0NDQ/9jwer/Urji/0Cr1P8updL/EBAQ/xAQEP9FRUX/RUVF/0VF
+ Rf8AAAD/AAAA/wAAAP8AAAD/DAwM//Ly8v82Njb/Ah0p/1a65P9CrNf/EZjO/xSg3P8QERH/RUVF/0VF
+ Rf9FRUX/RUVF/xEREf8AAAD/AAAA/wAAAP/+/v7/RUVF/xan6P8Uod3/EZnP/xGYzv8UoNz/Fqfo/wAA
+ AP8qLND/RUVF/0VFRf8AAAD/RUVF/0VFRf9FRUX/JCQk/wAAAP8WqOn/FKHd/xGZz/8RmM3/Vbnk/2bF
+ 7/8AAAD/LC7W/wAAAP9FRUX/RUVF/0VFRf9FRUX/AAAA/0VFRf90zvj/Y8Tv/xOf2/8RmM7/O6nT/021
+ 4P9dwOv/bsnz/yst1f8AAAD/RUVF/0VFRf9FRUX/RUVF/05OTv8jg6z/RY6n/1q/6/9JtOD/N6fT/zSj
+ zf9Cr9v/OTo3/0NEQf85Ojf/LC7W/ywu1v8sLtb/LC7W/wAAAP8YrvT/F6vv////////////////////
+ //8qncX/OajT/0NEQf9DREH/Q0RB/0NEQf9DREH/Pj88/0NEQf9DREH/Q0RB/wAAAP///////////39/
+ f///////IJS7/yyfyf8loND/EpzV/0pukv9UVVL/Q0RB/0NEQf9DREH/Q0RB/0t1nf8AAAD/////////
+ //8AAAD//////xaKsP8glL3/DpHB/xCWyv8AAAD/VFVS//////9DREH/Q0RB/0m24/8npdr/EprS////
+ //////////////n5+f8MgaT/CoWt/wyKtv8Oj77/D5PF/1Sn+/9DREH/VKf7/zmq2P82qdb/MqbS/w+T
+ xf8OkL//DIq2/wqFrf8KgaX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAD/Dw8P/w8UFv8VFRX/FSgw/yMjI/8lJSX/KSkp/yoqKv8rKyv/Jygy/ywwMv8vMTL/LzU3/zIy
+ Mv8zMzP/MjI0/zA2OP8wMD7/ODg4/zk6Ov86Ojr/Ozs7/zw8PP8+Pzz/Pz8//z9APf9BQj//HjpF/zk6
+ SP8cHWz/Jyho/yIjdv8iI3r/GUhc/y9HWP84TFX/NkpZ/zJMXP81TFz/N0xc/z9QXv8SSmT/HU5n/xNS
+ bf8PXn//ElRx/xdcev8ZXHn/Lkxt/zNWZ/86XW3/NWBy/0BAQP9BQUH/QkJB/0NDQ/9DRkX/RERE/0VF
+ Rf9GRkb/REhJ/09PT/9JSlb/TFpf/1BQUP9TVFH/VldZ/1hYWP9bXVv/XFxc/11dXf9fX1//RVZl/1lq
+ eP9gYGD/YmJi/2RlYv9iZ2n/b29v/3Fxcf99fX3/IySE/yYno/8sLaL/Jiis/ykrtv8RYoP/DW+Y/w5x
+ m/8WcZn/LmmD/zFxjv8gd5z/MXua/wh/ov9AdYz/CICj/wuCpf8NgqX/CoSr/w2Brf8Khaz/C4au/wyG
+ rf8PgbD/DIq1/w2Ltf8Njrz/Do++/xaLsf8Qh7n/DpC//xySuf8ck7z/IoSt/y6IrP8glLz/Mpe+/0yC
+ mv91lJ//S5u8/w6QwP8PkcL/D5LD/w+SxP8PlMb/EpLB/xOTyf8Qlcn/EJbK/xCXzP8Rl8z/EZjO/xWZ
+ zv8RmdD/EprT/xKb1P8SnNX/IJfH/yKXxP8qnMX/LZ/J/zCfx/87msD/FKDc/zeiyP80pM3/OqbP/z6o
+ z/8hotf/KaLQ/yyj0v8uo9D/IqDZ/yup3v82qNX/N6nW/zmo0/8/q9T/Pa3b/xel5v8rr+r/O6/h/zyw
+ 4P9EocX/TqDD/02jxP9OpMf/RK3V/0Wt1f9Lstz/U7LY/1C03P9qstD/TbXg/1K44f9eueD/X8Lu/2fF
+ 7/+AgID/hoaG/46Ojv+SkpL/k5SS/5mZmf+ampr/n5+f/6SkpP+oqKj/s7Oz/7m5uf+8vLz/v7+//5PC
+ 0f+tyNL/vdvm/8fHx//Jycn/2tra/9/f3//L2+P/yuDq/+Tk5P/g6ez/8PDw/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/YWZqbHyBg4WFhIF9bGpnYWZqeoGHiWlYWW+Kh4J7amZxf4KKLUC0urpIJF2Jg39rkqqgMA9Q
+ xcbAtUE6LJaYj5WtsQs6GUu7t0Q+RxR5q5SprDQTFxoTEwNPwMBMYLCfmBwENTgOBwMAAEy8N1ujnIWA
+ LhEQOzsDAAABtkZakYeFkaIzHhI7CAkGNgUCmpGHhqSzMVMfOzs6Owg3d7KbhZ6vpjJWIBU7PDwMXK6o
+ paeTkA0aHVRVUiEKKqHJv8HHjXYjSTk3Qz8XGxgiyr1Ry3WOjFcnQrhNPUkpK8y+Fs1ucnyCL07IRSZe
+ c4vEw3jCY2hqbWUoSiV0nZd+cGpnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+
+
+
\ No newline at end of file
diff --git a/ABStudio/Libs/7zip/Common/CRC.cs b/ABStudio/Libs/7zip/Common/CRC.cs
new file mode 100644
index 0000000..62bb847
--- /dev/null
+++ b/ABStudio/Libs/7zip/Common/CRC.cs
@@ -0,0 +1,55 @@
+// Common/CRC.cs
+
+namespace SevenZip
+{
+ class CRC
+ {
+ public static readonly uint[] Table;
+
+ static CRC()
+ {
+ Table = new uint[256];
+ const uint kPoly = 0xEDB88320;
+ for (uint i = 0; i < 256; i++)
+ {
+ uint r = i;
+ for (int j = 0; j < 8; j++)
+ if ((r & 1) != 0)
+ r = (r >> 1) ^ kPoly;
+ else
+ r >>= 1;
+ Table[i] = r;
+ }
+ }
+
+ uint _value = 0xFFFFFFFF;
+
+ public void Init() { _value = 0xFFFFFFFF; }
+
+ public void UpdateByte(byte b)
+ {
+ _value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8);
+ }
+
+ public void Update(byte[] data, uint offset, uint size)
+ {
+ for (uint i = 0; i < size; i++)
+ _value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8);
+ }
+
+ public uint GetDigest() { return _value ^ 0xFFFFFFFF; }
+
+ static uint CalculateDigest(byte[] data, uint offset, uint size)
+ {
+ CRC crc = new CRC();
+ // crc.Init();
+ crc.Update(data, offset, size);
+ return crc.GetDigest();
+ }
+
+ static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size)
+ {
+ return (CalculateDigest(data, offset, size) == digest);
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Common/CommandLineParser.cs b/ABStudio/Libs/7zip/Common/CommandLineParser.cs
new file mode 100644
index 0000000..b46f6f2
--- /dev/null
+++ b/ABStudio/Libs/7zip/Common/CommandLineParser.cs
@@ -0,0 +1,274 @@
+// CommandLineParser.cs
+
+using System;
+using System.Collections;
+
+namespace SevenZip.CommandLineParser
+{
+ public enum SwitchType
+ {
+ Simple,
+ PostMinus,
+ LimitedPostString,
+ UnLimitedPostString,
+ PostChar
+ }
+
+ public class SwitchForm
+ {
+ public string IDString;
+ public SwitchType Type;
+ public bool Multi;
+ public int MinLen;
+ public int MaxLen;
+ public string PostCharSet;
+
+ public SwitchForm(string idString, SwitchType type, bool multi,
+ int minLen, int maxLen, string postCharSet)
+ {
+ IDString = idString;
+ Type = type;
+ Multi = multi;
+ MinLen = minLen;
+ MaxLen = maxLen;
+ PostCharSet = postCharSet;
+ }
+ public SwitchForm(string idString, SwitchType type, bool multi, int minLen):
+ this(idString, type, multi, minLen, 0, "")
+ {
+ }
+ public SwitchForm(string idString, SwitchType type, bool multi):
+ this(idString, type, multi, 0)
+ {
+ }
+ }
+
+ public class SwitchResult
+ {
+ public bool ThereIs;
+ public bool WithMinus;
+ public ArrayList PostStrings = new ArrayList();
+ public int PostCharIndex;
+ public SwitchResult()
+ {
+ ThereIs = false;
+ }
+ }
+
+ public class Parser
+ {
+ public ArrayList NonSwitchStrings = new ArrayList();
+ SwitchResult[] _switches;
+
+ public Parser(int numSwitches)
+ {
+ _switches = new SwitchResult[numSwitches];
+ for (int i = 0; i < numSwitches; i++)
+ _switches[i] = new SwitchResult();
+ }
+
+ bool ParseString(string srcString, SwitchForm[] switchForms)
+ {
+ int len = srcString.Length;
+ if (len == 0)
+ return false;
+ int pos = 0;
+ if (!IsItSwitchChar(srcString[pos]))
+ return false;
+ while (pos < len)
+ {
+ if (IsItSwitchChar(srcString[pos]))
+ pos++;
+ const int kNoLen = -1;
+ int matchedSwitchIndex = 0;
+ int maxLen = kNoLen;
+ for (int switchIndex = 0; switchIndex < _switches.Length; switchIndex++)
+ {
+ int switchLen = switchForms[switchIndex].IDString.Length;
+ if (switchLen <= maxLen || pos + switchLen > len)
+ continue;
+ if (String.Compare(switchForms[switchIndex].IDString, 0,
+ srcString, pos, switchLen, true) == 0)
+ {
+ matchedSwitchIndex = switchIndex;
+ maxLen = switchLen;
+ }
+ }
+ if (maxLen == kNoLen)
+ throw new Exception("maxLen == kNoLen");
+ SwitchResult matchedSwitch = _switches[matchedSwitchIndex];
+ SwitchForm switchForm = switchForms[matchedSwitchIndex];
+ if ((!switchForm.Multi) && matchedSwitch.ThereIs)
+ throw new Exception("switch must be single");
+ matchedSwitch.ThereIs = true;
+ pos += maxLen;
+ int tailSize = len - pos;
+ SwitchType type = switchForm.Type;
+ switch (type)
+ {
+ case SwitchType.PostMinus:
+ {
+ if (tailSize == 0)
+ matchedSwitch.WithMinus = false;
+ else
+ {
+ matchedSwitch.WithMinus = (srcString[pos] == kSwitchMinus);
+ if (matchedSwitch.WithMinus)
+ pos++;
+ }
+ break;
+ }
+ case SwitchType.PostChar:
+ {
+ if (tailSize < switchForm.MinLen)
+ throw new Exception("switch is not full");
+ string charSet = switchForm.PostCharSet;
+ const int kEmptyCharValue = -1;
+ if (tailSize == 0)
+ matchedSwitch.PostCharIndex = kEmptyCharValue;
+ else
+ {
+ int index = charSet.IndexOf(srcString[pos]);
+ if (index < 0)
+ matchedSwitch.PostCharIndex = kEmptyCharValue;
+ else
+ {
+ matchedSwitch.PostCharIndex = index;
+ pos++;
+ }
+ }
+ break;
+ }
+ case SwitchType.LimitedPostString:
+ case SwitchType.UnLimitedPostString:
+ {
+ int minLen = switchForm.MinLen;
+ if (tailSize < minLen)
+ throw new Exception("switch is not full");
+ if (type == SwitchType.UnLimitedPostString)
+ {
+ matchedSwitch.PostStrings.Add(srcString.Substring(pos));
+ return true;
+ }
+ String stringSwitch = srcString.Substring(pos, minLen);
+ pos += minLen;
+ for (int i = minLen; i < switchForm.MaxLen && pos < len; i++, pos++)
+ {
+ char c = srcString[pos];
+ if (IsItSwitchChar(c))
+ break;
+ stringSwitch += c;
+ }
+ matchedSwitch.PostStrings.Add(stringSwitch);
+ break;
+ }
+ }
+ }
+ return true;
+
+ }
+
+ public void ParseStrings(SwitchForm[] switchForms, string[] commandStrings)
+ {
+ int numCommandStrings = commandStrings.Length;
+ bool stopSwitch = false;
+ for (int i = 0; i < numCommandStrings; i++)
+ {
+ string s = commandStrings[i];
+ if (stopSwitch)
+ NonSwitchStrings.Add(s);
+ else
+ if (s == kStopSwitchParsing)
+ stopSwitch = true;
+ else
+ if (!ParseString(s, switchForms))
+ NonSwitchStrings.Add(s);
+ }
+ }
+
+ public SwitchResult this[int index] { get { return _switches[index]; } }
+
+ public static int ParseCommand(CommandForm[] commandForms, string commandString,
+ out string postString)
+ {
+ for (int i = 0; i < commandForms.Length; i++)
+ {
+ string id = commandForms[i].IDString;
+ if (commandForms[i].PostStringMode)
+ {
+ if (commandString.IndexOf(id) == 0)
+ {
+ postString = commandString.Substring(id.Length);
+ return i;
+ }
+ }
+ else
+ if (commandString == id)
+ {
+ postString = "";
+ return i;
+ }
+ }
+ postString = "";
+ return -1;
+ }
+
+ static bool ParseSubCharsCommand(int numForms, CommandSubCharsSet[] forms,
+ string commandString, ArrayList indices)
+ {
+ indices.Clear();
+ int numUsedChars = 0;
+ for (int i = 0; i < numForms; i++)
+ {
+ CommandSubCharsSet charsSet = forms[i];
+ int currentIndex = -1;
+ int len = charsSet.Chars.Length;
+ for (int j = 0; j < len; j++)
+ {
+ char c = charsSet.Chars[j];
+ int newIndex = commandString.IndexOf(c);
+ if (newIndex >= 0)
+ {
+ if (currentIndex >= 0)
+ return false;
+ if (commandString.IndexOf(c, newIndex + 1) >= 0)
+ return false;
+ currentIndex = j;
+ numUsedChars++;
+ }
+ }
+ if (currentIndex == -1 && !charsSet.EmptyAllowed)
+ return false;
+ indices.Add(currentIndex);
+ }
+ return (numUsedChars == commandString.Length);
+ }
+ const char kSwitchID1 = '-';
+ const char kSwitchID2 = '/';
+
+ const char kSwitchMinus = '-';
+ const string kStopSwitchParsing = "--";
+
+ static bool IsItSwitchChar(char c)
+ {
+ return (c == kSwitchID1 || c == kSwitchID2);
+ }
+ }
+
+ public class CommandForm
+ {
+ public string IDString = "";
+ public bool PostStringMode = false;
+ public CommandForm(string idString, bool postStringMode)
+ {
+ IDString = idString;
+ PostStringMode = postStringMode;
+ }
+ }
+
+ class CommandSubCharsSet
+ {
+ public string Chars = "";
+ public bool EmptyAllowed = false;
+ }
+}
diff --git a/ABStudio/Libs/7zip/Common/InBuffer.cs b/ABStudio/Libs/7zip/Common/InBuffer.cs
new file mode 100644
index 0000000..9c47c73
--- /dev/null
+++ b/ABStudio/Libs/7zip/Common/InBuffer.cs
@@ -0,0 +1,72 @@
+// InBuffer.cs
+
+namespace SevenZip.Buffer
+{
+ public class InBuffer
+ {
+ byte[] m_Buffer;
+ uint m_Pos;
+ uint m_Limit;
+ uint m_BufferSize;
+ System.IO.Stream m_Stream;
+ bool m_StreamWasExhausted;
+ ulong m_ProcessedSize;
+
+ public InBuffer(uint bufferSize)
+ {
+ m_Buffer = new byte[bufferSize];
+ m_BufferSize = bufferSize;
+ }
+
+ public void Init(System.IO.Stream stream)
+ {
+ m_Stream = stream;
+ m_ProcessedSize = 0;
+ m_Limit = 0;
+ m_Pos = 0;
+ m_StreamWasExhausted = false;
+ }
+
+ public bool ReadBlock()
+ {
+ if (m_StreamWasExhausted)
+ return false;
+ m_ProcessedSize += m_Pos;
+ int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize);
+ m_Pos = 0;
+ m_Limit = (uint)aNumProcessedBytes;
+ m_StreamWasExhausted = (aNumProcessedBytes == 0);
+ return (!m_StreamWasExhausted);
+ }
+
+
+ public void ReleaseStream()
+ {
+ // m_Stream.Close();
+ m_Stream = null;
+ }
+
+ public bool ReadByte(byte b) // check it
+ {
+ if (m_Pos >= m_Limit)
+ if (!ReadBlock())
+ return false;
+ b = m_Buffer[m_Pos++];
+ return true;
+ }
+
+ public byte ReadByte()
+ {
+ // return (byte)m_Stream.ReadByte();
+ if (m_Pos >= m_Limit)
+ if (!ReadBlock())
+ return 0xFF;
+ return m_Buffer[m_Pos++];
+ }
+
+ public ulong GetProcessedSize()
+ {
+ return m_ProcessedSize + m_Pos;
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Common/OutBuffer.cs b/ABStudio/Libs/7zip/Common/OutBuffer.cs
new file mode 100644
index 0000000..c205aa6
--- /dev/null
+++ b/ABStudio/Libs/7zip/Common/OutBuffer.cs
@@ -0,0 +1,47 @@
+// OutBuffer.cs
+
+namespace SevenZip.Buffer
+{
+ public class OutBuffer
+ {
+ byte[] m_Buffer;
+ uint m_Pos;
+ uint m_BufferSize;
+ System.IO.Stream m_Stream;
+ ulong m_ProcessedSize;
+
+ public OutBuffer(uint bufferSize)
+ {
+ m_Buffer = new byte[bufferSize];
+ m_BufferSize = bufferSize;
+ }
+
+ public void SetStream(System.IO.Stream stream) { m_Stream = stream; }
+ public void FlushStream() { m_Stream.Flush(); }
+ public void CloseStream() { m_Stream.Close(); }
+ public void ReleaseStream() { m_Stream = null; }
+
+ public void Init()
+ {
+ m_ProcessedSize = 0;
+ m_Pos = 0;
+ }
+
+ public void WriteByte(byte b)
+ {
+ m_Buffer[m_Pos++] = b;
+ if (m_Pos >= m_BufferSize)
+ FlushData();
+ }
+
+ public void FlushData()
+ {
+ if (m_Pos == 0)
+ return;
+ m_Stream.Write(m_Buffer, 0, (int)m_Pos);
+ m_Pos = 0;
+ }
+
+ public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs b/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs
new file mode 100644
index 0000000..30fab86
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZ/IMatchFinder.cs
@@ -0,0 +1,24 @@
+// IMatchFinder.cs
+
+using System;
+
+namespace SevenZip.Compression.LZ
+{
+ interface IInWindowStream
+ {
+ void SetStream(System.IO.Stream inStream);
+ void Init();
+ void ReleaseStream();
+ Byte GetIndexByte(Int32 index);
+ UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit);
+ UInt32 GetNumAvailableBytes();
+ }
+
+ interface IMatchFinder : IInWindowStream
+ {
+ void Create(UInt32 historySize, UInt32 keepAddBufferBefore,
+ UInt32 matchMaxLen, UInt32 keepAddBufferAfter);
+ UInt32 GetMatches(UInt32[] distances);
+ void Skip(UInt32 num);
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs b/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs
new file mode 100644
index 0000000..7a9ca20
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZ/LzBinTree.cs
@@ -0,0 +1,367 @@
+// LzBinTree.cs
+
+using System;
+
+namespace SevenZip.Compression.LZ
+{
+ public class BinTree : InWindow, IMatchFinder
+ {
+ UInt32 _cyclicBufferPos;
+ UInt32 _cyclicBufferSize = 0;
+ UInt32 _matchMaxLen;
+
+ UInt32[] _son;
+ UInt32[] _hash;
+
+ UInt32 _cutValue = 0xFF;
+ UInt32 _hashMask;
+ UInt32 _hashSizeSum = 0;
+
+ bool HASH_ARRAY = true;
+
+ const UInt32 kHash2Size = 1 << 10;
+ const UInt32 kHash3Size = 1 << 16;
+ const UInt32 kBT2HashSize = 1 << 16;
+ const UInt32 kStartMaxLen = 1;
+ const UInt32 kHash3Offset = kHash2Size;
+ const UInt32 kEmptyHashValue = 0;
+ const UInt32 kMaxValForNormalize = ((UInt32)1 << 31) - 1;
+
+ UInt32 kNumHashDirectBytes = 0;
+ UInt32 kMinMatchCheck = 4;
+ UInt32 kFixHashSize = kHash2Size + kHash3Size;
+
+ public void SetType(int numHashBytes)
+ {
+ HASH_ARRAY = (numHashBytes > 2);
+ if (HASH_ARRAY)
+ {
+ kNumHashDirectBytes = 0;
+ kMinMatchCheck = 4;
+ kFixHashSize = kHash2Size + kHash3Size;
+ }
+ else
+ {
+ kNumHashDirectBytes = 2;
+ kMinMatchCheck = 2 + 1;
+ kFixHashSize = 0;
+ }
+ }
+
+ public new void SetStream(System.IO.Stream stream) { base.SetStream(stream); }
+ public new void ReleaseStream() { base.ReleaseStream(); }
+
+ public new void Init()
+ {
+ base.Init();
+ for (UInt32 i = 0; i < _hashSizeSum; i++)
+ _hash[i] = kEmptyHashValue;
+ _cyclicBufferPos = 0;
+ ReduceOffsets(-1);
+ }
+
+ public new void MovePos()
+ {
+ if (++_cyclicBufferPos >= _cyclicBufferSize)
+ _cyclicBufferPos = 0;
+ base.MovePos();
+ if (_pos == kMaxValForNormalize)
+ Normalize();
+ }
+
+ public new Byte GetIndexByte(Int32 index) { return base.GetIndexByte(index); }
+
+ public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit)
+ { return base.GetMatchLen(index, distance, limit); }
+
+ public new UInt32 GetNumAvailableBytes() { return base.GetNumAvailableBytes(); }
+
+ public void Create(UInt32 historySize, UInt32 keepAddBufferBefore,
+ UInt32 matchMaxLen, UInt32 keepAddBufferAfter)
+ {
+ if (historySize > kMaxValForNormalize - 256)
+ throw new Exception();
+ _cutValue = 16 + (matchMaxLen >> 1);
+
+ UInt32 windowReservSize = (historySize + keepAddBufferBefore +
+ matchMaxLen + keepAddBufferAfter) / 2 + 256;
+
+ base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize);
+
+ _matchMaxLen = matchMaxLen;
+
+ UInt32 cyclicBufferSize = historySize + 1;
+ if (_cyclicBufferSize != cyclicBufferSize)
+ _son = new UInt32[(_cyclicBufferSize = cyclicBufferSize) * 2];
+
+ UInt32 hs = kBT2HashSize;
+
+ if (HASH_ARRAY)
+ {
+ hs = historySize - 1;
+ hs |= (hs >> 1);
+ hs |= (hs >> 2);
+ hs |= (hs >> 4);
+ hs |= (hs >> 8);
+ hs >>= 1;
+ hs |= 0xFFFF;
+ if (hs > (1 << 24))
+ hs >>= 1;
+ _hashMask = hs;
+ hs++;
+ hs += kFixHashSize;
+ }
+ if (hs != _hashSizeSum)
+ _hash = new UInt32[_hashSizeSum = hs];
+ }
+
+ public UInt32 GetMatches(UInt32[] distances)
+ {
+ UInt32 lenLimit;
+ if (_pos + _matchMaxLen <= _streamPos)
+ lenLimit = _matchMaxLen;
+ else
+ {
+ lenLimit = _streamPos - _pos;
+ if (lenLimit < kMinMatchCheck)
+ {
+ MovePos();
+ return 0;
+ }
+ }
+
+ UInt32 offset = 0;
+ UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
+ UInt32 cur = _bufferOffset + _pos;
+ UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize;
+ UInt32 hashValue, hash2Value = 0, hash3Value = 0;
+
+ if (HASH_ARRAY)
+ {
+ UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1];
+ hash2Value = temp & (kHash2Size - 1);
+ temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8);
+ hash3Value = temp & (kHash3Size - 1);
+ hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask;
+ }
+ else
+ hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8);
+
+ UInt32 curMatch = _hash[kFixHashSize + hashValue];
+ if (HASH_ARRAY)
+ {
+ UInt32 curMatch2 = _hash[hash2Value];
+ UInt32 curMatch3 = _hash[kHash3Offset + hash3Value];
+ _hash[hash2Value] = _pos;
+ _hash[kHash3Offset + hash3Value] = _pos;
+ if (curMatch2 > matchMinPos)
+ if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur])
+ {
+ distances[offset++] = maxLen = 2;
+ distances[offset++] = _pos - curMatch2 - 1;
+ }
+ if (curMatch3 > matchMinPos)
+ if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur])
+ {
+ if (curMatch3 == curMatch2)
+ offset -= 2;
+ distances[offset++] = maxLen = 3;
+ distances[offset++] = _pos - curMatch3 - 1;
+ curMatch2 = curMatch3;
+ }
+ if (offset != 0 && curMatch2 == curMatch)
+ {
+ offset -= 2;
+ maxLen = kStartMaxLen;
+ }
+ }
+
+ _hash[kFixHashSize + hashValue] = _pos;
+
+ UInt32 ptr0 = (_cyclicBufferPos << 1) + 1;
+ UInt32 ptr1 = (_cyclicBufferPos << 1);
+
+ UInt32 len0, len1;
+ len0 = len1 = kNumHashDirectBytes;
+
+ if (kNumHashDirectBytes != 0)
+ {
+ if (curMatch > matchMinPos)
+ {
+ if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] !=
+ _bufferBase[cur + kNumHashDirectBytes])
+ {
+ distances[offset++] = maxLen = kNumHashDirectBytes;
+ distances[offset++] = _pos - curMatch - 1;
+ }
+ }
+ }
+
+ UInt32 count = _cutValue;
+
+ while(true)
+ {
+ if(curMatch <= matchMinPos || count-- == 0)
+ {
+ _son[ptr0] = _son[ptr1] = kEmptyHashValue;
+ break;
+ }
+ UInt32 delta = _pos - curMatch;
+ UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ?
+ (_cyclicBufferPos - delta) :
+ (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
+
+ UInt32 pby1 = _bufferOffset + curMatch;
+ UInt32 len = Math.Min(len0, len1);
+ if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
+ {
+ while(++len != lenLimit)
+ if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
+ break;
+ if (maxLen < len)
+ {
+ distances[offset++] = maxLen = len;
+ distances[offset++] = delta - 1;
+ if (len == lenLimit)
+ {
+ _son[ptr1] = _son[cyclicPos];
+ _son[ptr0] = _son[cyclicPos + 1];
+ break;
+ }
+ }
+ }
+ if (_bufferBase[pby1 + len] < _bufferBase[cur + len])
+ {
+ _son[ptr1] = curMatch;
+ ptr1 = cyclicPos + 1;
+ curMatch = _son[ptr1];
+ len1 = len;
+ }
+ else
+ {
+ _son[ptr0] = curMatch;
+ ptr0 = cyclicPos;
+ curMatch = _son[ptr0];
+ len0 = len;
+ }
+ }
+ MovePos();
+ return offset;
+ }
+
+ public void Skip(UInt32 num)
+ {
+ do
+ {
+ UInt32 lenLimit;
+ if (_pos + _matchMaxLen <= _streamPos)
+ lenLimit = _matchMaxLen;
+ else
+ {
+ lenLimit = _streamPos - _pos;
+ if (lenLimit < kMinMatchCheck)
+ {
+ MovePos();
+ continue;
+ }
+ }
+
+ UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
+ UInt32 cur = _bufferOffset + _pos;
+
+ UInt32 hashValue;
+
+ if (HASH_ARRAY)
+ {
+ UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1];
+ UInt32 hash2Value = temp & (kHash2Size - 1);
+ _hash[hash2Value] = _pos;
+ temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8);
+ UInt32 hash3Value = temp & (kHash3Size - 1);
+ _hash[kHash3Offset + hash3Value] = _pos;
+ hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask;
+ }
+ else
+ hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8);
+
+ UInt32 curMatch = _hash[kFixHashSize + hashValue];
+ _hash[kFixHashSize + hashValue] = _pos;
+
+ UInt32 ptr0 = (_cyclicBufferPos << 1) + 1;
+ UInt32 ptr1 = (_cyclicBufferPos << 1);
+
+ UInt32 len0, len1;
+ len0 = len1 = kNumHashDirectBytes;
+
+ UInt32 count = _cutValue;
+ while (true)
+ {
+ if (curMatch <= matchMinPos || count-- == 0)
+ {
+ _son[ptr0] = _son[ptr1] = kEmptyHashValue;
+ break;
+ }
+
+ UInt32 delta = _pos - curMatch;
+ UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ?
+ (_cyclicBufferPos - delta) :
+ (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1;
+
+ UInt32 pby1 = _bufferOffset + curMatch;
+ UInt32 len = Math.Min(len0, len1);
+ if (_bufferBase[pby1 + len] == _bufferBase[cur + len])
+ {
+ while (++len != lenLimit)
+ if (_bufferBase[pby1 + len] != _bufferBase[cur + len])
+ break;
+ if (len == lenLimit)
+ {
+ _son[ptr1] = _son[cyclicPos];
+ _son[ptr0] = _son[cyclicPos + 1];
+ break;
+ }
+ }
+ if (_bufferBase[pby1 + len] < _bufferBase[cur + len])
+ {
+ _son[ptr1] = curMatch;
+ ptr1 = cyclicPos + 1;
+ curMatch = _son[ptr1];
+ len1 = len;
+ }
+ else
+ {
+ _son[ptr0] = curMatch;
+ ptr0 = cyclicPos;
+ curMatch = _son[ptr0];
+ len0 = len;
+ }
+ }
+ MovePos();
+ }
+ while (--num != 0);
+ }
+
+ void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue)
+ {
+ for (UInt32 i = 0; i < numItems; i++)
+ {
+ UInt32 value = items[i];
+ if (value <= subValue)
+ value = kEmptyHashValue;
+ else
+ value -= subValue;
+ items[i] = value;
+ }
+ }
+
+ void Normalize()
+ {
+ UInt32 subValue = _pos - _cyclicBufferSize;
+ NormalizeLinks(_son, _cyclicBufferSize * 2, subValue);
+ NormalizeLinks(_hash, _hashSizeSum, subValue);
+ ReduceOffsets((Int32)subValue);
+ }
+
+ public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs b/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs
new file mode 100644
index 0000000..f1974ce
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZ/LzInWindow.cs
@@ -0,0 +1,132 @@
+// LzInWindow.cs
+
+using System;
+
+namespace SevenZip.Compression.LZ
+{
+ public class InWindow
+ {
+ public Byte[] _bufferBase = null; // pointer to buffer with data
+ System.IO.Stream _stream;
+ UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done
+ bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream
+
+ UInt32 _pointerToLastSafePosition;
+
+ public UInt32 _bufferOffset;
+
+ public UInt32 _blockSize; // Size of Allocated memory block
+ public UInt32 _pos; // offset (from _buffer) of curent byte
+ UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos
+ UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos
+ public UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream
+
+ public void MoveBlock()
+ {
+ UInt32 offset = (UInt32)(_bufferOffset) + _pos - _keepSizeBefore;
+ // we need one additional byte, since MovePos moves on 1 byte.
+ if (offset > 0)
+ offset--;
+
+ UInt32 numBytes = (UInt32)(_bufferOffset) + _streamPos - offset;
+
+ // check negative offset ????
+ for (UInt32 i = 0; i < numBytes; i++)
+ _bufferBase[i] = _bufferBase[offset + i];
+ _bufferOffset -= offset;
+ }
+
+ public virtual void ReadBlock()
+ {
+ if (_streamEndWasReached)
+ return;
+ while (true)
+ {
+ int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos);
+ if (size == 0)
+ return;
+ int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size);
+ if (numReadBytes == 0)
+ {
+ _posLimit = _streamPos;
+ UInt32 pointerToPostion = _bufferOffset + _posLimit;
+ if (pointerToPostion > _pointerToLastSafePosition)
+ _posLimit = (UInt32)(_pointerToLastSafePosition - _bufferOffset);
+
+ _streamEndWasReached = true;
+ return;
+ }
+ _streamPos += (UInt32)numReadBytes;
+ if (_streamPos >= _pos + _keepSizeAfter)
+ _posLimit = _streamPos - _keepSizeAfter;
+ }
+ }
+
+ void Free() { _bufferBase = null; }
+
+ public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv)
+ {
+ _keepSizeBefore = keepSizeBefore;
+ _keepSizeAfter = keepSizeAfter;
+ UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
+ if (_bufferBase == null || _blockSize != blockSize)
+ {
+ Free();
+ _blockSize = blockSize;
+ _bufferBase = new Byte[_blockSize];
+ }
+ _pointerToLastSafePosition = _blockSize - keepSizeAfter;
+ }
+
+ public void SetStream(System.IO.Stream stream) { _stream = stream; }
+ public void ReleaseStream() { _stream = null; }
+
+ public void Init()
+ {
+ _bufferOffset = 0;
+ _pos = 0;
+ _streamPos = 0;
+ _streamEndWasReached = false;
+ ReadBlock();
+ }
+
+ public void MovePos()
+ {
+ _pos++;
+ if (_pos > _posLimit)
+ {
+ UInt32 pointerToPostion = _bufferOffset + _pos;
+ if (pointerToPostion > _pointerToLastSafePosition)
+ MoveBlock();
+ ReadBlock();
+ }
+ }
+
+ public Byte GetIndexByte(Int32 index) { return _bufferBase[_bufferOffset + _pos + index]; }
+
+ // index + limit have not to exceed _keepSizeAfter;
+ public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit)
+ {
+ if (_streamEndWasReached)
+ if ((_pos + index) + limit > _streamPos)
+ limit = _streamPos - (UInt32)(_pos + index);
+ distance++;
+ // Byte *pby = _buffer + (size_t)_pos + index;
+ UInt32 pby = _bufferOffset + _pos + (UInt32)index;
+
+ UInt32 i;
+ for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++);
+ return i;
+ }
+
+ public UInt32 GetNumAvailableBytes() { return _streamPos - _pos; }
+
+ public void ReduceOffsets(Int32 subValue)
+ {
+ _bufferOffset += (UInt32)subValue;
+ _posLimit -= (UInt32)subValue;
+ _pos -= (UInt32)subValue;
+ _streamPos -= (UInt32)subValue;
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs b/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs
new file mode 100644
index 0000000..84914f0
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZ/LzOutWindow.cs
@@ -0,0 +1,110 @@
+// LzOutWindow.cs
+
+namespace SevenZip.Compression.LZ
+{
+ public class OutWindow
+ {
+ byte[] _buffer = null;
+ uint _pos;
+ uint _windowSize = 0;
+ uint _streamPos;
+ System.IO.Stream _stream;
+
+ public uint TrainSize = 0;
+
+ public void Create(uint windowSize)
+ {
+ if (_windowSize != windowSize)
+ {
+ // System.GC.Collect();
+ _buffer = new byte[windowSize];
+ }
+ _windowSize = windowSize;
+ _pos = 0;
+ _streamPos = 0;
+ }
+
+ public void Init(System.IO.Stream stream, bool solid)
+ {
+ ReleaseStream();
+ _stream = stream;
+ if (!solid)
+ {
+ _streamPos = 0;
+ _pos = 0;
+ TrainSize = 0;
+ }
+ }
+
+ public bool Train(System.IO.Stream stream)
+ {
+ long len = stream.Length;
+ uint size = (len < _windowSize) ? (uint)len : _windowSize;
+ TrainSize = size;
+ stream.Position = len - size;
+ _streamPos = _pos = 0;
+ while (size > 0)
+ {
+ uint curSize = _windowSize - _pos;
+ if (size < curSize)
+ curSize = size;
+ int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize);
+ if (numReadBytes == 0)
+ return false;
+ size -= (uint)numReadBytes;
+ _pos += (uint)numReadBytes;
+ _streamPos += (uint)numReadBytes;
+ if (_pos == _windowSize)
+ _streamPos = _pos = 0;
+ }
+ return true;
+ }
+
+ public void ReleaseStream()
+ {
+ Flush();
+ _stream = null;
+ }
+
+ public void Flush()
+ {
+ uint size = _pos - _streamPos;
+ if (size == 0)
+ return;
+ _stream.Write(_buffer, (int)_streamPos, (int)size);
+ if (_pos >= _windowSize)
+ _pos = 0;
+ _streamPos = _pos;
+ }
+
+ public void CopyBlock(uint distance, uint len)
+ {
+ uint pos = _pos - distance - 1;
+ if (pos >= _windowSize)
+ pos += _windowSize;
+ for (; len > 0; len--)
+ {
+ if (pos >= _windowSize)
+ pos = 0;
+ _buffer[_pos++] = _buffer[pos++];
+ if (_pos >= _windowSize)
+ Flush();
+ }
+ }
+
+ public void PutByte(byte b)
+ {
+ _buffer[_pos++] = b;
+ if (_pos >= _windowSize)
+ Flush();
+ }
+
+ public byte GetByte(uint distance)
+ {
+ uint pos = _pos - distance - 1;
+ if (pos >= _windowSize)
+ pos += _windowSize;
+ return _buffer[pos];
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs
new file mode 100644
index 0000000..8447a2a
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaBase.cs
@@ -0,0 +1,76 @@
+// LzmaBase.cs
+
+namespace SevenZip.Compression.LZMA
+{
+ internal abstract class Base
+ {
+ public const uint kNumRepDistances = 4;
+ public const uint kNumStates = 12;
+
+ // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5};
+ // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
+ // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
+ // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
+
+ public struct State
+ {
+ public uint Index;
+ public void Init() { Index = 0; }
+ public void UpdateChar()
+ {
+ if (Index < 4) Index = 0;
+ else if (Index < 10) Index -= 3;
+ else Index -= 6;
+ }
+ public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); }
+ public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); }
+ public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); }
+ public bool IsCharState() { return Index < 7; }
+ }
+
+ public const int kNumPosSlotBits = 6;
+ public const int kDicLogSizeMin = 0;
+ // public const int kDicLogSizeMax = 30;
+ // public const uint kDistTableSizeMax = kDicLogSizeMax * 2;
+
+ public const int kNumLenToPosStatesBits = 2; // it's for speed optimization
+ public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits;
+
+ public const uint kMatchMinLen = 2;
+
+ public static uint GetLenToPosState(uint len)
+ {
+ len -= kMatchMinLen;
+ if (len < kNumLenToPosStates)
+ return len;
+ return (uint)(kNumLenToPosStates - 1);
+ }
+
+ public const int kNumAlignBits = 4;
+ public const uint kAlignTableSize = 1 << kNumAlignBits;
+ public const uint kAlignMask = (kAlignTableSize - 1);
+
+ public const uint kStartPosModelIndex = 4;
+ public const uint kEndPosModelIndex = 14;
+ public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
+
+ public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2);
+
+ public const uint kNumLitPosStatesBitsEncodingMax = 4;
+ public const uint kNumLitContextBitsMax = 8;
+
+ public const int kNumPosStatesBitsMax = 4;
+ public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
+ public const int kNumPosStatesBitsEncodingMax = 4;
+ public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
+
+ public const int kNumLowLenBits = 3;
+ public const int kNumMidLenBits = 3;
+ public const int kNumHighLenBits = 8;
+ public const uint kNumLowLenSymbols = 1 << kNumLowLenBits;
+ public const uint kNumMidLenSymbols = 1 << kNumMidLenBits;
+ public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols +
+ (1 << kNumHighLenBits);
+ public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1;
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs
new file mode 100644
index 0000000..00bfe63
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaDecoder.cs
@@ -0,0 +1,398 @@
+// LzmaDecoder.cs
+
+using System;
+
+namespace SevenZip.Compression.LZMA
+{
+ using RangeCoder;
+
+ public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream
+ {
+ class LenDecoder
+ {
+ BitDecoder m_Choice = new BitDecoder();
+ BitDecoder m_Choice2 = new BitDecoder();
+ BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
+ BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax];
+ BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits);
+ uint m_NumPosStates = 0;
+
+ public void Create(uint numPosStates)
+ {
+ for (uint posState = m_NumPosStates; posState < numPosStates; posState++)
+ {
+ m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits);
+ m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits);
+ }
+ m_NumPosStates = numPosStates;
+ }
+
+ public void Init()
+ {
+ m_Choice.Init();
+ for (uint posState = 0; posState < m_NumPosStates; posState++)
+ {
+ m_LowCoder[posState].Init();
+ m_MidCoder[posState].Init();
+ }
+ m_Choice2.Init();
+ m_HighCoder.Init();
+ }
+
+ public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState)
+ {
+ if (m_Choice.Decode(rangeDecoder) == 0)
+ return m_LowCoder[posState].Decode(rangeDecoder);
+ else
+ {
+ uint symbol = Base.kNumLowLenSymbols;
+ if (m_Choice2.Decode(rangeDecoder) == 0)
+ symbol += m_MidCoder[posState].Decode(rangeDecoder);
+ else
+ {
+ symbol += Base.kNumMidLenSymbols;
+ symbol += m_HighCoder.Decode(rangeDecoder);
+ }
+ return symbol;
+ }
+ }
+ }
+
+ class LiteralDecoder
+ {
+ struct Decoder2
+ {
+ BitDecoder[] m_Decoders;
+ public void Create() { m_Decoders = new BitDecoder[0x300]; }
+ public void Init() { for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); }
+
+ public byte DecodeNormal(RangeCoder.Decoder rangeDecoder)
+ {
+ uint symbol = 1;
+ do
+ symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
+ while (symbol < 0x100);
+ return (byte)symbol;
+ }
+
+ public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte)
+ {
+ uint symbol = 1;
+ do
+ {
+ uint matchBit = (uint)(matchByte >> 7) & 1;
+ matchByte <<= 1;
+ uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder);
+ symbol = (symbol << 1) | bit;
+ if (matchBit != bit)
+ {
+ while (symbol < 0x100)
+ symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
+ break;
+ }
+ }
+ while (symbol < 0x100);
+ return (byte)symbol;
+ }
+ }
+
+ Decoder2[] m_Coders;
+ int m_NumPrevBits;
+ int m_NumPosBits;
+ uint m_PosMask;
+
+ public void Create(int numPosBits, int numPrevBits)
+ {
+ if (m_Coders != null && m_NumPrevBits == numPrevBits &&
+ m_NumPosBits == numPosBits)
+ return;
+ m_NumPosBits = numPosBits;
+ m_PosMask = ((uint)1 << numPosBits) - 1;
+ m_NumPrevBits = numPrevBits;
+ uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
+ m_Coders = new Decoder2[numStates];
+ for (uint i = 0; i < numStates; i++)
+ m_Coders[i].Create();
+ }
+
+ public void Init()
+ {
+ uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
+ for (uint i = 0; i < numStates; i++)
+ m_Coders[i].Init();
+ }
+
+ uint GetState(uint pos, byte prevByte)
+ { return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); }
+
+ public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte)
+ { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); }
+
+ public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte)
+ { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); }
+ };
+
+ LZ.OutWindow m_OutWindow = new LZ.OutWindow();
+ RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder();
+
+ BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
+ BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates];
+ BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates];
+ BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates];
+ BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates];
+ BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
+
+ BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates];
+ BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex];
+
+ BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits);
+
+ LenDecoder m_LenDecoder = new LenDecoder();
+ LenDecoder m_RepLenDecoder = new LenDecoder();
+
+ LiteralDecoder m_LiteralDecoder = new LiteralDecoder();
+
+ uint m_DictionarySize;
+ uint m_DictionarySizeCheck;
+
+ uint m_PosStateMask;
+
+ public Decoder()
+ {
+ m_DictionarySize = 0xFFFFFFFF;
+ for (int i = 0; i < Base.kNumLenToPosStates; i++)
+ m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits);
+ }
+
+ void SetDictionarySize(uint dictionarySize)
+ {
+ if (m_DictionarySize != dictionarySize)
+ {
+ m_DictionarySize = dictionarySize;
+ m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1);
+ uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12));
+ m_OutWindow.Create(blockSize);
+ }
+ }
+
+ void SetLiteralProperties(int lp, int lc)
+ {
+ if (lp > 8)
+ throw new InvalidParamException();
+ if (lc > 8)
+ throw new InvalidParamException();
+ m_LiteralDecoder.Create(lp, lc);
+ }
+
+ void SetPosBitsProperties(int pb)
+ {
+ if (pb > Base.kNumPosStatesBitsMax)
+ throw new InvalidParamException();
+ uint numPosStates = (uint)1 << pb;
+ m_LenDecoder.Create(numPosStates);
+ m_RepLenDecoder.Create(numPosStates);
+ m_PosStateMask = numPosStates - 1;
+ }
+
+ bool _solid = false;
+ void Init(System.IO.Stream inStream, System.IO.Stream outStream)
+ {
+ m_RangeDecoder.Init(inStream);
+ m_OutWindow.Init(outStream, _solid);
+
+ uint i;
+ for (i = 0; i < Base.kNumStates; i++)
+ {
+ for (uint j = 0; j <= m_PosStateMask; j++)
+ {
+ uint index = (i << Base.kNumPosStatesBitsMax) + j;
+ m_IsMatchDecoders[index].Init();
+ m_IsRep0LongDecoders[index].Init();
+ }
+ m_IsRepDecoders[i].Init();
+ m_IsRepG0Decoders[i].Init();
+ m_IsRepG1Decoders[i].Init();
+ m_IsRepG2Decoders[i].Init();
+ }
+
+ m_LiteralDecoder.Init();
+ for (i = 0; i < Base.kNumLenToPosStates; i++)
+ m_PosSlotDecoder[i].Init();
+ // m_PosSpecDecoder.Init();
+ for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++)
+ m_PosDecoders[i].Init();
+
+ m_LenDecoder.Init();
+ m_RepLenDecoder.Init();
+ m_PosAlignDecoder.Init();
+ }
+
+ public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
+ Int64 inSize, Int64 outSize, ICodeProgress progress)
+ {
+ Init(inStream, outStream);
+
+ Base.State state = new Base.State();
+ state.Init();
+ uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0;
+
+ UInt64 nowPos64 = 0;
+ UInt64 outSize64 = (UInt64)outSize;
+ if (nowPos64 < outSize64)
+ {
+ if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0)
+ throw new DataErrorException();
+ state.UpdateChar();
+ byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0);
+ m_OutWindow.PutByte(b);
+ nowPos64++;
+ }
+ while (nowPos64 < outSize64)
+ {
+ // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64);
+ // while(nowPos64 < next)
+ {
+ uint posState = (uint)nowPos64 & m_PosStateMask;
+ if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
+ {
+ byte b;
+ byte prevByte = m_OutWindow.GetByte(0);
+ if (!state.IsCharState())
+ b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder,
+ (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0));
+ else
+ b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte);
+ m_OutWindow.PutByte(b);
+ state.UpdateChar();
+ nowPos64++;
+ }
+ else
+ {
+ uint len;
+ if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1)
+ {
+ if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0)
+ {
+ if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0)
+ {
+ state.UpdateShortRep();
+ m_OutWindow.PutByte(m_OutWindow.GetByte(rep0));
+ nowPos64++;
+ continue;
+ }
+ }
+ else
+ {
+ UInt32 distance;
+ if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0)
+ {
+ distance = rep1;
+ }
+ else
+ {
+ if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0)
+ distance = rep2;
+ else
+ {
+ distance = rep3;
+ rep3 = rep2;
+ }
+ rep2 = rep1;
+ }
+ rep1 = rep0;
+ rep0 = distance;
+ }
+ len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen;
+ state.UpdateRep();
+ }
+ else
+ {
+ rep3 = rep2;
+ rep2 = rep1;
+ rep1 = rep0;
+ len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState);
+ state.UpdateMatch();
+ uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder);
+ if (posSlot >= Base.kStartPosModelIndex)
+ {
+ int numDirectBits = (int)((posSlot >> 1) - 1);
+ rep0 = ((2 | (posSlot & 1)) << numDirectBits);
+ if (posSlot < Base.kEndPosModelIndex)
+ rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
+ rep0 - posSlot - 1, m_RangeDecoder, numDirectBits);
+ else
+ {
+ rep0 += (m_RangeDecoder.DecodeDirectBits(
+ numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
+ rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder);
+ }
+ }
+ else
+ rep0 = posSlot;
+ }
+ if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck)
+ {
+ if (rep0 == 0xFFFFFFFF)
+ break;
+ throw new DataErrorException();
+ }
+ m_OutWindow.CopyBlock(rep0, len);
+ nowPos64 += len;
+ }
+ }
+ }
+ m_OutWindow.Flush();
+ m_OutWindow.ReleaseStream();
+ m_RangeDecoder.ReleaseStream();
+ }
+
+ public void SetDecoderProperties(byte[] properties)
+ {
+ if (properties.Length < 5)
+ throw new InvalidParamException();
+ int lc = properties[0] % 9;
+ int remainder = properties[0] / 9;
+ int lp = remainder % 5;
+ int pb = remainder / 5;
+ if (pb > Base.kNumPosStatesBitsMax)
+ throw new InvalidParamException();
+ UInt32 dictionarySize = 0;
+ for (int i = 0; i < 4; i++)
+ dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8);
+ SetDictionarySize(dictionarySize);
+ SetLiteralProperties(lp, lc);
+ SetPosBitsProperties(pb);
+ }
+
+ public bool Train(System.IO.Stream stream)
+ {
+ _solid = true;
+ return m_OutWindow.Train(stream);
+ }
+
+ /*
+ public override bool CanRead { get { return true; }}
+ public override bool CanWrite { get { return true; }}
+ public override bool CanSeek { get { return true; }}
+ public override long Length { get { return 0; }}
+ public override long Position
+ {
+ get { return 0; }
+ set { }
+ }
+ public override void Flush() { }
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ return 0;
+ }
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ }
+ public override long Seek(long offset, System.IO.SeekOrigin origin)
+ {
+ return 0;
+ }
+ public override void SetLength(long value) {}
+ */
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs b/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs
new file mode 100644
index 0000000..6dc2708
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/LZMA/LzmaEncoder.cs
@@ -0,0 +1,1480 @@
+// LzmaEncoder.cs
+
+using System;
+
+namespace SevenZip.Compression.LZMA
+{
+ using RangeCoder;
+
+ public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties
+ {
+ enum EMatchFinderType
+ {
+ BT2,
+ BT4,
+ };
+
+ const UInt32 kIfinityPrice = 0xFFFFFFF;
+
+ static Byte[] g_FastPos = new Byte[1 << 11];
+
+ static Encoder()
+ {
+ const Byte kFastSlots = 22;
+ int c = 2;
+ g_FastPos[0] = 0;
+ g_FastPos[1] = 1;
+ for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++)
+ {
+ UInt32 k = ((UInt32)1 << ((slotFast >> 1) - 1));
+ for (UInt32 j = 0; j < k; j++, c++)
+ g_FastPos[c] = slotFast;
+ }
+ }
+
+ static UInt32 GetPosSlot(UInt32 pos)
+ {
+ if (pos < (1 << 11))
+ return g_FastPos[pos];
+ if (pos < (1 << 21))
+ return (UInt32)(g_FastPos[pos >> 10] + 20);
+ return (UInt32)(g_FastPos[pos >> 20] + 40);
+ }
+
+ static UInt32 GetPosSlot2(UInt32 pos)
+ {
+ if (pos < (1 << 17))
+ return (UInt32)(g_FastPos[pos >> 6] + 12);
+ if (pos < (1 << 27))
+ return (UInt32)(g_FastPos[pos >> 16] + 32);
+ return (UInt32)(g_FastPos[pos >> 26] + 52);
+ }
+
+ Base.State _state = new Base.State();
+ Byte _previousByte;
+ UInt32[] _repDistances = new UInt32[Base.kNumRepDistances];
+
+ void BaseInit()
+ {
+ _state.Init();
+ _previousByte = 0;
+ for (UInt32 i = 0; i < Base.kNumRepDistances; i++)
+ _repDistances[i] = 0;
+ }
+
+ const int kDefaultDictionaryLogSize = 22;
+ const UInt32 kNumFastBytesDefault = 0x20;
+
+ class LiteralEncoder
+ {
+ public struct Encoder2
+ {
+ BitEncoder[] m_Encoders;
+
+ public void Create() { m_Encoders = new BitEncoder[0x300]; }
+
+ public void Init() { for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); }
+
+ public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol)
+ {
+ uint context = 1;
+ for (int i = 7; i >= 0; i--)
+ {
+ uint bit = (uint)((symbol >> i) & 1);
+ m_Encoders[context].Encode(rangeEncoder, bit);
+ context = (context << 1) | bit;
+ }
+ }
+
+ public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol)
+ {
+ uint context = 1;
+ bool same = true;
+ for (int i = 7; i >= 0; i--)
+ {
+ uint bit = (uint)((symbol >> i) & 1);
+ uint state = context;
+ if (same)
+ {
+ uint matchBit = (uint)((matchByte >> i) & 1);
+ state += ((1 + matchBit) << 8);
+ same = (matchBit == bit);
+ }
+ m_Encoders[state].Encode(rangeEncoder, bit);
+ context = (context << 1) | bit;
+ }
+ }
+
+ public uint GetPrice(bool matchMode, byte matchByte, byte symbol)
+ {
+ uint price = 0;
+ uint context = 1;
+ int i = 7;
+ if (matchMode)
+ {
+ for (; i >= 0; i--)
+ {
+ uint matchBit = (uint)(matchByte >> i) & 1;
+ uint bit = (uint)(symbol >> i) & 1;
+ price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit);
+ context = (context << 1) | bit;
+ if (matchBit != bit)
+ {
+ i--;
+ break;
+ }
+ }
+ }
+ for (; i >= 0; i--)
+ {
+ uint bit = (uint)(symbol >> i) & 1;
+ price += m_Encoders[context].GetPrice(bit);
+ context = (context << 1) | bit;
+ }
+ return price;
+ }
+ }
+
+ Encoder2[] m_Coders;
+ int m_NumPrevBits;
+ int m_NumPosBits;
+ uint m_PosMask;
+
+ public void Create(int numPosBits, int numPrevBits)
+ {
+ if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits)
+ return;
+ m_NumPosBits = numPosBits;
+ m_PosMask = ((uint)1 << numPosBits) - 1;
+ m_NumPrevBits = numPrevBits;
+ uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
+ m_Coders = new Encoder2[numStates];
+ for (uint i = 0; i < numStates; i++)
+ m_Coders[i].Create();
+ }
+
+ public void Init()
+ {
+ uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits);
+ for (uint i = 0; i < numStates; i++)
+ m_Coders[i].Init();
+ }
+
+ public Encoder2 GetSubCoder(UInt32 pos, Byte prevByte)
+ { return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; }
+ }
+
+ class LenEncoder
+ {
+ RangeCoder.BitEncoder _choice = new RangeCoder.BitEncoder();
+ RangeCoder.BitEncoder _choice2 = new RangeCoder.BitEncoder();
+ RangeCoder.BitTreeEncoder[] _lowCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax];
+ RangeCoder.BitTreeEncoder[] _midCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax];
+ RangeCoder.BitTreeEncoder _highCoder = new RangeCoder.BitTreeEncoder(Base.kNumHighLenBits);
+
+ public LenEncoder()
+ {
+ for (UInt32 posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++)
+ {
+ _lowCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumLowLenBits);
+ _midCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumMidLenBits);
+ }
+ }
+
+ public void Init(UInt32 numPosStates)
+ {
+ _choice.Init();
+ _choice2.Init();
+ for (UInt32 posState = 0; posState < numPosStates; posState++)
+ {
+ _lowCoder[posState].Init();
+ _midCoder[posState].Init();
+ }
+ _highCoder.Init();
+ }
+
+ public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
+ {
+ if (symbol < Base.kNumLowLenSymbols)
+ {
+ _choice.Encode(rangeEncoder, 0);
+ _lowCoder[posState].Encode(rangeEncoder, symbol);
+ }
+ else
+ {
+ symbol -= Base.kNumLowLenSymbols;
+ _choice.Encode(rangeEncoder, 1);
+ if (symbol < Base.kNumMidLenSymbols)
+ {
+ _choice2.Encode(rangeEncoder, 0);
+ _midCoder[posState].Encode(rangeEncoder, symbol);
+ }
+ else
+ {
+ _choice2.Encode(rangeEncoder, 1);
+ _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols);
+ }
+ }
+ }
+
+ public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st)
+ {
+ UInt32 a0 = _choice.GetPrice0();
+ UInt32 a1 = _choice.GetPrice1();
+ UInt32 b0 = a1 + _choice2.GetPrice0();
+ UInt32 b1 = a1 + _choice2.GetPrice1();
+ UInt32 i = 0;
+ for (i = 0; i < Base.kNumLowLenSymbols; i++)
+ {
+ if (i >= numSymbols)
+ return;
+ prices[st + i] = a0 + _lowCoder[posState].GetPrice(i);
+ }
+ for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++)
+ {
+ if (i >= numSymbols)
+ return;
+ prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols);
+ }
+ for (; i < numSymbols; i++)
+ prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols);
+ }
+ };
+
+ const UInt32 kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols;
+
+ class LenPriceTableEncoder : LenEncoder
+ {
+ UInt32[] _prices = new UInt32[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax];
+ UInt32 _tableSize;
+ UInt32[] _counters = new UInt32[Base.kNumPosStatesEncodingMax];
+
+ public void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; }
+
+ public UInt32 GetPrice(UInt32 symbol, UInt32 posState)
+ {
+ return _prices[posState * Base.kNumLenSymbols + symbol];
+ }
+
+ void UpdateTable(UInt32 posState)
+ {
+ SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols);
+ _counters[posState] = _tableSize;
+ }
+
+ public void UpdateTables(UInt32 numPosStates)
+ {
+ for (UInt32 posState = 0; posState < numPosStates; posState++)
+ UpdateTable(posState);
+ }
+
+ public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
+ {
+ base.Encode(rangeEncoder, symbol, posState);
+ if (--_counters[posState] == 0)
+ UpdateTable(posState);
+ }
+ }
+
+ const UInt32 kNumOpts = 1 << 12;
+ class Optimal
+ {
+ public Base.State State;
+
+ public bool Prev1IsChar;
+ public bool Prev2;
+
+ public UInt32 PosPrev2;
+ public UInt32 BackPrev2;
+
+ public UInt32 Price;
+ public UInt32 PosPrev;
+ public UInt32 BackPrev;
+
+ public UInt32 Backs0;
+ public UInt32 Backs1;
+ public UInt32 Backs2;
+ public UInt32 Backs3;
+
+ public void MakeAsChar() { BackPrev = 0xFFFFFFFF; Prev1IsChar = false; }
+ public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; }
+ public bool IsShortRep() { return (BackPrev == 0); }
+ };
+ Optimal[] _optimum = new Optimal[kNumOpts];
+ LZ.IMatchFinder _matchFinder = null;
+ RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder();
+
+ RangeCoder.BitEncoder[] _isMatch = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
+ RangeCoder.BitEncoder[] _isRep = new RangeCoder.BitEncoder[Base.kNumStates];
+ RangeCoder.BitEncoder[] _isRepG0 = new RangeCoder.BitEncoder[Base.kNumStates];
+ RangeCoder.BitEncoder[] _isRepG1 = new RangeCoder.BitEncoder[Base.kNumStates];
+ RangeCoder.BitEncoder[] _isRepG2 = new RangeCoder.BitEncoder[Base.kNumStates];
+ RangeCoder.BitEncoder[] _isRep0Long = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax];
+
+ RangeCoder.BitTreeEncoder[] _posSlotEncoder = new RangeCoder.BitTreeEncoder[Base.kNumLenToPosStates];
+
+ RangeCoder.BitEncoder[] _posEncoders = new RangeCoder.BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex];
+ RangeCoder.BitTreeEncoder _posAlignEncoder = new RangeCoder.BitTreeEncoder(Base.kNumAlignBits);
+
+ LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder();
+ LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder();
+
+ LiteralEncoder _literalEncoder = new LiteralEncoder();
+
+ UInt32[] _matchDistances = new UInt32[Base.kMatchMaxLen * 2 + 2];
+
+ UInt32 _numFastBytes = kNumFastBytesDefault;
+ UInt32 _longestMatchLength;
+ UInt32 _numDistancePairs;
+
+ UInt32 _additionalOffset;
+
+ UInt32 _optimumEndIndex;
+ UInt32 _optimumCurrentIndex;
+
+ bool _longestMatchWasFound;
+
+ UInt32[] _posSlotPrices = new UInt32[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)];
+ UInt32[] _distancesPrices = new UInt32[Base.kNumFullDistances << Base.kNumLenToPosStatesBits];
+ UInt32[] _alignPrices = new UInt32[Base.kAlignTableSize];
+ UInt32 _alignPriceCount;
+
+ UInt32 _distTableSize = (kDefaultDictionaryLogSize * 2);
+
+ int _posStateBits = 2;
+ UInt32 _posStateMask = (4 - 1);
+ int _numLiteralPosStateBits = 0;
+ int _numLiteralContextBits = 3;
+
+ UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize);
+ UInt32 _dictionarySizePrev = 0xFFFFFFFF;
+ UInt32 _numFastBytesPrev = 0xFFFFFFFF;
+
+ Int64 nowPos64;
+ bool _finished;
+ System.IO.Stream _inStream;
+
+ EMatchFinderType _matchFinderType = EMatchFinderType.BT4;
+ bool _writeEndMark = false;
+
+ bool _needReleaseMFStream;
+
+ void Create()
+ {
+ if (_matchFinder == null)
+ {
+ LZ.BinTree bt = new LZ.BinTree();
+ int numHashBytes = 4;
+ if (_matchFinderType == EMatchFinderType.BT2)
+ numHashBytes = 2;
+ bt.SetType(numHashBytes);
+ _matchFinder = bt;
+ }
+ _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits);
+
+ if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes)
+ return;
+ _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1);
+ _dictionarySizePrev = _dictionarySize;
+ _numFastBytesPrev = _numFastBytes;
+ }
+
+ public Encoder()
+ {
+ for (int i = 0; i < kNumOpts; i++)
+ _optimum[i] = new Optimal();
+ for (int i = 0; i < Base.kNumLenToPosStates; i++)
+ _posSlotEncoder[i] = new RangeCoder.BitTreeEncoder(Base.kNumPosSlotBits);
+ }
+
+ void SetWriteEndMarkerMode(bool writeEndMarker)
+ {
+ _writeEndMark = writeEndMarker;
+ }
+
+ void Init()
+ {
+ BaseInit();
+ _rangeEncoder.Init();
+
+ uint i;
+ for (i = 0; i < Base.kNumStates; i++)
+ {
+ for (uint j = 0; j <= _posStateMask; j++)
+ {
+ uint complexState = (i << Base.kNumPosStatesBitsMax) + j;
+ _isMatch[complexState].Init();
+ _isRep0Long[complexState].Init();
+ }
+ _isRep[i].Init();
+ _isRepG0[i].Init();
+ _isRepG1[i].Init();
+ _isRepG2[i].Init();
+ }
+ _literalEncoder.Init();
+ for (i = 0; i < Base.kNumLenToPosStates; i++)
+ _posSlotEncoder[i].Init();
+ for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++)
+ _posEncoders[i].Init();
+
+ _lenEncoder.Init((UInt32)1 << _posStateBits);
+ _repMatchLenEncoder.Init((UInt32)1 << _posStateBits);
+
+ _posAlignEncoder.Init();
+
+ _longestMatchWasFound = false;
+ _optimumEndIndex = 0;
+ _optimumCurrentIndex = 0;
+ _additionalOffset = 0;
+ }
+
+ void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs)
+ {
+ lenRes = 0;
+ numDistancePairs = _matchFinder.GetMatches(_matchDistances);
+ if (numDistancePairs > 0)
+ {
+ lenRes = _matchDistances[numDistancePairs - 2];
+ if (lenRes == _numFastBytes)
+ lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1],
+ Base.kMatchMaxLen - lenRes);
+ }
+ _additionalOffset++;
+ }
+
+
+ void MovePos(UInt32 num)
+ {
+ if (num > 0)
+ {
+ _matchFinder.Skip(num);
+ _additionalOffset += num;
+ }
+ }
+
+ UInt32 GetRepLen1Price(Base.State state, UInt32 posState)
+ {
+ return _isRepG0[state.Index].GetPrice0() +
+ _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0();
+ }
+
+ UInt32 GetPureRepPrice(UInt32 repIndex, Base.State state, UInt32 posState)
+ {
+ UInt32 price;
+ if (repIndex == 0)
+ {
+ price = _isRepG0[state.Index].GetPrice0();
+ price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
+ }
+ else
+ {
+ price = _isRepG0[state.Index].GetPrice1();
+ if (repIndex == 1)
+ price += _isRepG1[state.Index].GetPrice0();
+ else
+ {
+ price += _isRepG1[state.Index].GetPrice1();
+ price += _isRepG2[state.Index].GetPrice(repIndex - 2);
+ }
+ }
+ return price;
+ }
+
+ UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, Base.State state, UInt32 posState)
+ {
+ UInt32 price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
+ return price + GetPureRepPrice(repIndex, state, posState);
+ }
+
+ UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState)
+ {
+ UInt32 price;
+ UInt32 lenToPosState = Base.GetLenToPosState(len);
+ if (pos < Base.kNumFullDistances)
+ price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos];
+ else
+ price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] +
+ _alignPrices[pos & Base.kAlignMask];
+ return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState);
+ }
+
+ UInt32 Backward(out UInt32 backRes, UInt32 cur)
+ {
+ _optimumEndIndex = cur;
+ UInt32 posMem = _optimum[cur].PosPrev;
+ UInt32 backMem = _optimum[cur].BackPrev;
+ do
+ {
+ if (_optimum[cur].Prev1IsChar)
+ {
+ _optimum[posMem].MakeAsChar();
+ _optimum[posMem].PosPrev = posMem - 1;
+ if (_optimum[cur].Prev2)
+ {
+ _optimum[posMem - 1].Prev1IsChar = false;
+ _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2;
+ _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2;
+ }
+ }
+ UInt32 posPrev = posMem;
+ UInt32 backCur = backMem;
+
+ backMem = _optimum[posPrev].BackPrev;
+ posMem = _optimum[posPrev].PosPrev;
+
+ _optimum[posPrev].BackPrev = backCur;
+ _optimum[posPrev].PosPrev = cur;
+ cur = posPrev;
+ }
+ while (cur > 0);
+ backRes = _optimum[0].BackPrev;
+ _optimumCurrentIndex = _optimum[0].PosPrev;
+ return _optimumCurrentIndex;
+ }
+
+ UInt32[] reps = new UInt32[Base.kNumRepDistances];
+ UInt32[] repLens = new UInt32[Base.kNumRepDistances];
+
+
+ UInt32 GetOptimum(UInt32 position, out UInt32 backRes)
+ {
+ if (_optimumEndIndex != _optimumCurrentIndex)
+ {
+ UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex;
+ backRes = _optimum[_optimumCurrentIndex].BackPrev;
+ _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev;
+ return lenRes;
+ }
+ _optimumCurrentIndex = _optimumEndIndex = 0;
+
+ UInt32 lenMain, numDistancePairs;
+ if (!_longestMatchWasFound)
+ {
+ ReadMatchDistances(out lenMain, out numDistancePairs);
+ }
+ else
+ {
+ lenMain = _longestMatchLength;
+ numDistancePairs = _numDistancePairs;
+ _longestMatchWasFound = false;
+ }
+
+ UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1;
+ if (numAvailableBytes < 2)
+ {
+ backRes = 0xFFFFFFFF;
+ return 1;
+ }
+ if (numAvailableBytes > Base.kMatchMaxLen)
+ numAvailableBytes = Base.kMatchMaxLen;
+
+ UInt32 repMaxIndex = 0;
+ UInt32 i;
+ for (i = 0; i < Base.kNumRepDistances; i++)
+ {
+ reps[i] = _repDistances[i];
+ repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen);
+ if (repLens[i] > repLens[repMaxIndex])
+ repMaxIndex = i;
+ }
+ if (repLens[repMaxIndex] >= _numFastBytes)
+ {
+ backRes = repMaxIndex;
+ UInt32 lenRes = repLens[repMaxIndex];
+ MovePos(lenRes - 1);
+ return lenRes;
+ }
+
+ if (lenMain >= _numFastBytes)
+ {
+ backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances;
+ MovePos(lenMain - 1);
+ return lenMain;
+ }
+
+ Byte currentByte = _matchFinder.GetIndexByte(0 - 1);
+ Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - 1));
+
+ if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2)
+ {
+ backRes = (UInt32)0xFFFFFFFF;
+ return 1;
+ }
+
+ _optimum[0].State = _state;
+
+ UInt32 posState = (position & _posStateMask);
+
+ _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() +
+ _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), matchByte, currentByte);
+ _optimum[1].MakeAsChar();
+
+ UInt32 matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
+ UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1();
+
+ if (matchByte == currentByte)
+ {
+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState);
+ if (shortRepPrice < _optimum[1].Price)
+ {
+ _optimum[1].Price = shortRepPrice;
+ _optimum[1].MakeAsShortRep();
+ }
+ }
+
+ UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]);
+
+ if(lenEnd < 2)
+ {
+ backRes = _optimum[1].BackPrev;
+ return 1;
+ }
+
+ _optimum[1].PosPrev = 0;
+
+ _optimum[0].Backs0 = reps[0];
+ _optimum[0].Backs1 = reps[1];
+ _optimum[0].Backs2 = reps[2];
+ _optimum[0].Backs3 = reps[3];
+
+ UInt32 len = lenEnd;
+ do
+ _optimum[len--].Price = kIfinityPrice;
+ while (len >= 2);
+
+ for (i = 0; i < Base.kNumRepDistances; i++)
+ {
+ UInt32 repLen = repLens[i];
+ if (repLen < 2)
+ continue;
+ UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState);
+ do
+ {
+ UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState);
+ Optimal optimum = _optimum[repLen];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = 0;
+ optimum.BackPrev = i;
+ optimum.Prev1IsChar = false;
+ }
+ }
+ while (--repLen >= 2);
+ }
+
+ UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0();
+
+ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
+ if (len <= lenMain)
+ {
+ UInt32 offs = 0;
+ while (len > _matchDistances[offs])
+ offs += 2;
+ for (; ; len++)
+ {
+ UInt32 distance = _matchDistances[offs + 1];
+ UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState);
+ Optimal optimum = _optimum[len];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = 0;
+ optimum.BackPrev = distance + Base.kNumRepDistances;
+ optimum.Prev1IsChar = false;
+ }
+ if (len == _matchDistances[offs])
+ {
+ offs += 2;
+ if (offs == numDistancePairs)
+ break;
+ }
+ }
+ }
+
+ UInt32 cur = 0;
+
+ while (true)
+ {
+ cur++;
+ if (cur == lenEnd)
+ return Backward(out backRes, cur);
+ UInt32 newLen;
+ ReadMatchDistances(out newLen, out numDistancePairs);
+ if (newLen >= _numFastBytes)
+ {
+ _numDistancePairs = numDistancePairs;
+ _longestMatchLength = newLen;
+ _longestMatchWasFound = true;
+ return Backward(out backRes, cur);
+ }
+ position++;
+ UInt32 posPrev = _optimum[cur].PosPrev;
+ Base.State state;
+ if (_optimum[cur].Prev1IsChar)
+ {
+ posPrev--;
+ if (_optimum[cur].Prev2)
+ {
+ state = _optimum[_optimum[cur].PosPrev2].State;
+ if (_optimum[cur].BackPrev2 < Base.kNumRepDistances)
+ state.UpdateRep();
+ else
+ state.UpdateMatch();
+ }
+ else
+ state = _optimum[posPrev].State;
+ state.UpdateChar();
+ }
+ else
+ state = _optimum[posPrev].State;
+ if (posPrev == cur - 1)
+ {
+ if (_optimum[cur].IsShortRep())
+ state.UpdateShortRep();
+ else
+ state.UpdateChar();
+ }
+ else
+ {
+ UInt32 pos;
+ if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2)
+ {
+ posPrev = _optimum[cur].PosPrev2;
+ pos = _optimum[cur].BackPrev2;
+ state.UpdateRep();
+ }
+ else
+ {
+ pos = _optimum[cur].BackPrev;
+ if (pos < Base.kNumRepDistances)
+ state.UpdateRep();
+ else
+ state.UpdateMatch();
+ }
+ Optimal opt = _optimum[posPrev];
+ if (pos < Base.kNumRepDistances)
+ {
+ if (pos == 0)
+ {
+ reps[0] = opt.Backs0;
+ reps[1] = opt.Backs1;
+ reps[2] = opt.Backs2;
+ reps[3] = opt.Backs3;
+ }
+ else if (pos == 1)
+ {
+ reps[0] = opt.Backs1;
+ reps[1] = opt.Backs0;
+ reps[2] = opt.Backs2;
+ reps[3] = opt.Backs3;
+ }
+ else if (pos == 2)
+ {
+ reps[0] = opt.Backs2;
+ reps[1] = opt.Backs0;
+ reps[2] = opt.Backs1;
+ reps[3] = opt.Backs3;
+ }
+ else
+ {
+ reps[0] = opt.Backs3;
+ reps[1] = opt.Backs0;
+ reps[2] = opt.Backs1;
+ reps[3] = opt.Backs2;
+ }
+ }
+ else
+ {
+ reps[0] = (pos - Base.kNumRepDistances);
+ reps[1] = opt.Backs0;
+ reps[2] = opt.Backs1;
+ reps[3] = opt.Backs2;
+ }
+ }
+ _optimum[cur].State = state;
+ _optimum[cur].Backs0 = reps[0];
+ _optimum[cur].Backs1 = reps[1];
+ _optimum[cur].Backs2 = reps[2];
+ _optimum[cur].Backs3 = reps[3];
+ UInt32 curPrice = _optimum[cur].Price;
+
+ currentByte = _matchFinder.GetIndexByte(0 - 1);
+ matchByte = _matchFinder.GetIndexByte((Int32)(0 - reps[0] - 1 - 1));
+
+ posState = (position & _posStateMask);
+
+ UInt32 curAnd1Price = curPrice +
+ _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() +
+ _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)).
+ GetPrice(!state.IsCharState(), matchByte, currentByte);
+
+ Optimal nextOptimum = _optimum[cur + 1];
+
+ bool nextIsChar = false;
+ if (curAnd1Price < nextOptimum.Price)
+ {
+ nextOptimum.Price = curAnd1Price;
+ nextOptimum.PosPrev = cur;
+ nextOptimum.MakeAsChar();
+ nextIsChar = true;
+ }
+
+ matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1();
+ repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1();
+
+ if (matchByte == currentByte &&
+ !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0))
+ {
+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState);
+ if (shortRepPrice <= nextOptimum.Price)
+ {
+ nextOptimum.Price = shortRepPrice;
+ nextOptimum.PosPrev = cur;
+ nextOptimum.MakeAsShortRep();
+ nextIsChar = true;
+ }
+ }
+
+ UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1;
+ numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull);
+ numAvailableBytes = numAvailableBytesFull;
+
+ if (numAvailableBytes < 2)
+ continue;
+ if (numAvailableBytes > _numFastBytes)
+ numAvailableBytes = _numFastBytes;
+ if (!nextIsChar && matchByte != currentByte)
+ {
+ // try Literal + rep0
+ UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes);
+ UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t);
+ if (lenTest2 >= 2)
+ {
+ Base.State state2 = state;
+ state2.UpdateChar();
+ UInt32 posStateNext = (position + 1) & _posStateMask;
+ UInt32 nextRepMatchPrice = curAnd1Price +
+ _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() +
+ _isRep[state2.Index].GetPrice1();
+ {
+ UInt32 offset = cur + 1 + lenTest2;
+ while (lenEnd < offset)
+ _optimum[++lenEnd].Price = kIfinityPrice;
+ UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(
+ 0, lenTest2, state2, posStateNext);
+ Optimal optimum = _optimum[offset];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = cur + 1;
+ optimum.BackPrev = 0;
+ optimum.Prev1IsChar = true;
+ optimum.Prev2 = false;
+ }
+ }
+ }
+ }
+
+ UInt32 startLen = 2; // speed optimization
+
+ for (UInt32 repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++)
+ {
+ UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes);
+ if (lenTest < 2)
+ continue;
+ UInt32 lenTestTemp = lenTest;
+ do
+ {
+ while (lenEnd < cur + lenTest)
+ _optimum[++lenEnd].Price = kIfinityPrice;
+ UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState);
+ Optimal optimum = _optimum[cur + lenTest];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = cur;
+ optimum.BackPrev = repIndex;
+ optimum.Prev1IsChar = false;
+ }
+ }
+ while(--lenTest >= 2);
+ lenTest = lenTestTemp;
+
+ if (repIndex == 0)
+ startLen = lenTest + 1;
+
+ // if (_maxMode)
+ if (lenTest < numAvailableBytesFull)
+ {
+ UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
+ UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, reps[repIndex], t);
+ if (lenTest2 >= 2)
+ {
+ Base.State state2 = state;
+ state2.UpdateRep();
+ UInt32 posStateNext = (position + lenTest) & _posStateMask;
+ UInt32 curAndLenCharPrice =
+ repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) +
+ _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() +
+ _literalEncoder.GetSubCoder(position + lenTest,
+ _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).GetPrice(true,
+ _matchFinder.GetIndexByte((Int32)((Int32)lenTest - 1 - (Int32)(reps[repIndex] + 1))),
+ _matchFinder.GetIndexByte((Int32)lenTest - 1));
+ state2.UpdateChar();
+ posStateNext = (position + lenTest + 1) & _posStateMask;
+ UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1();
+ UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1();
+
+ // for(; lenTest2 >= 2; lenTest2--)
+ {
+ UInt32 offset = lenTest + 1 + lenTest2;
+ while(lenEnd < cur + offset)
+ _optimum[++lenEnd].Price = kIfinityPrice;
+ UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
+ Optimal optimum = _optimum[cur + offset];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = cur + lenTest + 1;
+ optimum.BackPrev = 0;
+ optimum.Prev1IsChar = true;
+ optimum.Prev2 = true;
+ optimum.PosPrev2 = cur;
+ optimum.BackPrev2 = repIndex;
+ }
+ }
+ }
+ }
+ }
+
+ if (newLen > numAvailableBytes)
+ {
+ newLen = numAvailableBytes;
+ for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ;
+ _matchDistances[numDistancePairs] = newLen;
+ numDistancePairs += 2;
+ }
+ if (newLen >= startLen)
+ {
+ normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0();
+ while (lenEnd < cur + newLen)
+ _optimum[++lenEnd].Price = kIfinityPrice;
+
+ UInt32 offs = 0;
+ while (startLen > _matchDistances[offs])
+ offs += 2;
+
+ for (UInt32 lenTest = startLen; ; lenTest++)
+ {
+ UInt32 curBack = _matchDistances[offs + 1];
+ UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState);
+ Optimal optimum = _optimum[cur + lenTest];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = cur;
+ optimum.BackPrev = curBack + Base.kNumRepDistances;
+ optimum.Prev1IsChar = false;
+ }
+
+ if (lenTest == _matchDistances[offs])
+ {
+ if (lenTest < numAvailableBytesFull)
+ {
+ UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes);
+ UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, curBack, t);
+ if (lenTest2 >= 2)
+ {
+ Base.State state2 = state;
+ state2.UpdateMatch();
+ UInt32 posStateNext = (position + lenTest) & _posStateMask;
+ UInt32 curAndLenCharPrice = curAndLenPrice +
+ _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() +
+ _literalEncoder.GetSubCoder(position + lenTest,
+ _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).
+ GetPrice(true,
+ _matchFinder.GetIndexByte((Int32)lenTest - (Int32)(curBack + 1) - 1),
+ _matchFinder.GetIndexByte((Int32)lenTest - 1));
+ state2.UpdateChar();
+ posStateNext = (position + lenTest + 1) & _posStateMask;
+ UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1();
+ UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1();
+
+ UInt32 offset = lenTest + 1 + lenTest2;
+ while (lenEnd < cur + offset)
+ _optimum[++lenEnd].Price = kIfinityPrice;
+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
+ optimum = _optimum[cur + offset];
+ if (curAndLenPrice < optimum.Price)
+ {
+ optimum.Price = curAndLenPrice;
+ optimum.PosPrev = cur + lenTest + 1;
+ optimum.BackPrev = 0;
+ optimum.Prev1IsChar = true;
+ optimum.Prev2 = true;
+ optimum.PosPrev2 = cur;
+ optimum.BackPrev2 = curBack + Base.kNumRepDistances;
+ }
+ }
+ }
+ offs += 2;
+ if (offs == numDistancePairs)
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ bool ChangePair(UInt32 smallDist, UInt32 bigDist)
+ {
+ const int kDif = 7;
+ return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif));
+ }
+
+ void WriteEndMarker(UInt32 posState)
+ {
+ if (!_writeEndMark)
+ return;
+
+ _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1);
+ _isRep[_state.Index].Encode(_rangeEncoder, 0);
+ _state.UpdateMatch();
+ UInt32 len = Base.kMatchMinLen;
+ _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+ UInt32 posSlot = (1 << Base.kNumPosSlotBits) - 1;
+ UInt32 lenToPosState = Base.GetLenToPosState(len);
+ _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
+ int footerBits = 30;
+ UInt32 posReduced = (((UInt32)1) << footerBits) - 1;
+ _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
+ _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
+ }
+
+ void Flush(UInt32 nowPos)
+ {
+ ReleaseMFStream();
+ WriteEndMarker(nowPos & _posStateMask);
+ _rangeEncoder.FlushData();
+ _rangeEncoder.FlushStream();
+ }
+
+ public void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished)
+ {
+ inSize = 0;
+ outSize = 0;
+ finished = true;
+
+ if (_inStream != null)
+ {
+ _matchFinder.SetStream(_inStream);
+ _matchFinder.Init();
+ _needReleaseMFStream = true;
+ _inStream = null;
+ if (_trainSize > 0)
+ _matchFinder.Skip(_trainSize);
+ }
+
+ if (_finished)
+ return;
+ _finished = true;
+
+
+ Int64 progressPosValuePrev = nowPos64;
+ if (nowPos64 == 0)
+ {
+ if (_matchFinder.GetNumAvailableBytes() == 0)
+ {
+ Flush((UInt32)nowPos64);
+ return;
+ }
+ UInt32 len, numDistancePairs; // it's not used
+ ReadMatchDistances(out len, out numDistancePairs);
+ UInt32 posState = (UInt32)(nowPos64) & _posStateMask;
+ _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0);
+ _state.UpdateChar();
+ Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset));
+ _literalEncoder.GetSubCoder((UInt32)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte);
+ _previousByte = curByte;
+ _additionalOffset--;
+ nowPos64++;
+ }
+ if (_matchFinder.GetNumAvailableBytes() == 0)
+ {
+ Flush((UInt32)nowPos64);
+ return;
+ }
+ while (true)
+ {
+ UInt32 pos;
+ UInt32 len = GetOptimum((UInt32)nowPos64, out pos);
+
+ UInt32 posState = ((UInt32)nowPos64) & _posStateMask;
+ UInt32 complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState;
+ if (len == 1 && pos == 0xFFFFFFFF)
+ {
+ _isMatch[complexState].Encode(_rangeEncoder, 0);
+ Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset));
+ LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32)nowPos64, _previousByte);
+ if (!_state.IsCharState())
+ {
+ Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - _additionalOffset));
+ subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte);
+ }
+ else
+ subCoder.Encode(_rangeEncoder, curByte);
+ _previousByte = curByte;
+ _state.UpdateChar();
+ }
+ else
+ {
+ _isMatch[complexState].Encode(_rangeEncoder, 1);
+ if (pos < Base.kNumRepDistances)
+ {
+ _isRep[_state.Index].Encode(_rangeEncoder, 1);
+ if (pos == 0)
+ {
+ _isRepG0[_state.Index].Encode(_rangeEncoder, 0);
+ if (len == 1)
+ _isRep0Long[complexState].Encode(_rangeEncoder, 0);
+ else
+ _isRep0Long[complexState].Encode(_rangeEncoder, 1);
+ }
+ else
+ {
+ _isRepG0[_state.Index].Encode(_rangeEncoder, 1);
+ if (pos == 1)
+ _isRepG1[_state.Index].Encode(_rangeEncoder, 0);
+ else
+ {
+ _isRepG1[_state.Index].Encode(_rangeEncoder, 1);
+ _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2);
+ }
+ }
+ if (len == 1)
+ _state.UpdateShortRep();
+ else
+ {
+ _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+ _state.UpdateRep();
+ }
+ UInt32 distance = _repDistances[pos];
+ if (pos != 0)
+ {
+ for (UInt32 i = pos; i >= 1; i--)
+ _repDistances[i] = _repDistances[i - 1];
+ _repDistances[0] = distance;
+ }
+ }
+ else
+ {
+ _isRep[_state.Index].Encode(_rangeEncoder, 0);
+ _state.UpdateMatch();
+ _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState);
+ pos -= Base.kNumRepDistances;
+ UInt32 posSlot = GetPosSlot(pos);
+ UInt32 lenToPosState = Base.GetLenToPosState(len);
+ _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot);
+
+ if (posSlot >= Base.kStartPosModelIndex)
+ {
+ int footerBits = (int)((posSlot >> 1) - 1);
+ UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits);
+ UInt32 posReduced = pos - baseVal;
+
+ if (posSlot < Base.kEndPosModelIndex)
+ RangeCoder.BitTreeEncoder.ReverseEncode(_posEncoders,
+ baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced);
+ else
+ {
+ _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits);
+ _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask);
+ _alignPriceCount++;
+ }
+ }
+ UInt32 distance = pos;
+ for (UInt32 i = Base.kNumRepDistances - 1; i >= 1; i--)
+ _repDistances[i] = _repDistances[i - 1];
+ _repDistances[0] = distance;
+ _matchPriceCount++;
+ }
+ _previousByte = _matchFinder.GetIndexByte((Int32)(len - 1 - _additionalOffset));
+ }
+ _additionalOffset -= len;
+ nowPos64 += len;
+ if (_additionalOffset == 0)
+ {
+ // if (!_fastMode)
+ if (_matchPriceCount >= (1 << 7))
+ FillDistancesPrices();
+ if (_alignPriceCount >= Base.kAlignTableSize)
+ FillAlignPrices();
+ inSize = nowPos64;
+ outSize = _rangeEncoder.GetProcessedSizeAdd();
+ if (_matchFinder.GetNumAvailableBytes() == 0)
+ {
+ Flush((UInt32)nowPos64);
+ return;
+ }
+
+ if (nowPos64 - progressPosValuePrev >= (1 << 12))
+ {
+ _finished = false;
+ finished = false;
+ return;
+ }
+ }
+ }
+ }
+
+ void ReleaseMFStream()
+ {
+ if (_matchFinder != null && _needReleaseMFStream)
+ {
+ _matchFinder.ReleaseStream();
+ _needReleaseMFStream = false;
+ }
+ }
+
+ void SetOutStream(System.IO.Stream outStream) { _rangeEncoder.SetStream(outStream); }
+ void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); }
+
+ void ReleaseStreams()
+ {
+ ReleaseMFStream();
+ ReleaseOutStream();
+ }
+
+ void SetStreams(System.IO.Stream inStream, System.IO.Stream outStream,
+ Int64 inSize, Int64 outSize)
+ {
+ _inStream = inStream;
+ _finished = false;
+ Create();
+ SetOutStream(outStream);
+ Init();
+
+ // if (!_fastMode)
+ {
+ FillDistancesPrices();
+ FillAlignPrices();
+ }
+
+ _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
+ _lenEncoder.UpdateTables((UInt32)1 << _posStateBits);
+ _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen);
+ _repMatchLenEncoder.UpdateTables((UInt32)1 << _posStateBits);
+
+ nowPos64 = 0;
+ }
+
+
+ public void Code(System.IO.Stream inStream, System.IO.Stream outStream,
+ Int64 inSize, Int64 outSize, ICodeProgress progress)
+ {
+ _needReleaseMFStream = false;
+ try
+ {
+ SetStreams(inStream, outStream, inSize, outSize);
+ while (true)
+ {
+ Int64 processedInSize;
+ Int64 processedOutSize;
+ bool finished;
+ CodeOneBlock(out processedInSize, out processedOutSize, out finished);
+ if (finished)
+ return;
+ if (progress != null)
+ {
+ progress.SetProgress(processedInSize, processedOutSize);
+ }
+ }
+ }
+ finally
+ {
+ ReleaseStreams();
+ }
+ }
+
+ const int kPropSize = 5;
+ Byte[] properties = new Byte[kPropSize];
+
+ public void WriteCoderProperties(System.IO.Stream outStream)
+ {
+ properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits);
+ for (int i = 0; i < 4; i++)
+ properties[1 + i] = (Byte)((_dictionarySize >> (8 * i)) & 0xFF);
+ outStream.Write(properties, 0, kPropSize);
+ }
+
+ UInt32[] tempPrices = new UInt32[Base.kNumFullDistances];
+ UInt32 _matchPriceCount;
+
+ void FillDistancesPrices()
+ {
+ for (UInt32 i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++)
+ {
+ UInt32 posSlot = GetPosSlot(i);
+ int footerBits = (int)((posSlot >> 1) - 1);
+ UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits);
+ tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders,
+ baseVal - posSlot - 1, footerBits, i - baseVal);
+ }
+
+ for (UInt32 lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++)
+ {
+ UInt32 posSlot;
+ RangeCoder.BitTreeEncoder encoder = _posSlotEncoder[lenToPosState];
+
+ UInt32 st = (lenToPosState << Base.kNumPosSlotBits);
+ for (posSlot = 0; posSlot < _distTableSize; posSlot++)
+ _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot);
+ for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++)
+ _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << RangeCoder.BitEncoder.kNumBitPriceShiftBits);
+
+ UInt32 st2 = lenToPosState * Base.kNumFullDistances;
+ UInt32 i;
+ for (i = 0; i < Base.kStartPosModelIndex; i++)
+ _distancesPrices[st2 + i] = _posSlotPrices[st + i];
+ for (; i < Base.kNumFullDistances; i++)
+ _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i];
+ }
+ _matchPriceCount = 0;
+ }
+
+ void FillAlignPrices()
+ {
+ for (UInt32 i = 0; i < Base.kAlignTableSize; i++)
+ _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i);
+ _alignPriceCount = 0;
+ }
+
+
+ static string[] kMatchFinderIDs =
+ {
+ "BT2",
+ "BT4",
+ };
+
+ static int FindMatchFinder(string s)
+ {
+ for (int m = 0; m < kMatchFinderIDs.Length; m++)
+ if (s == kMatchFinderIDs[m])
+ return m;
+ return -1;
+ }
+
+ public void SetCoderProperties(CoderPropID[] propIDs, object[] properties)
+ {
+ for (UInt32 i = 0; i < properties.Length; i++)
+ {
+ object prop = properties[i];
+ switch (propIDs[i])
+ {
+ case CoderPropID.NumFastBytes:
+ {
+ if (!(prop is Int32))
+ throw new InvalidParamException();
+ Int32 numFastBytes = (Int32)prop;
+ if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen)
+ throw new InvalidParamException();
+ _numFastBytes = (UInt32)numFastBytes;
+ break;
+ }
+ case CoderPropID.Algorithm:
+ {
+ /*
+ if (!(prop is Int32))
+ throw new InvalidParamException();
+ Int32 maximize = (Int32)prop;
+ _fastMode = (maximize == 0);
+ _maxMode = (maximize >= 2);
+ */
+ break;
+ }
+ case CoderPropID.MatchFinder:
+ {
+ if (!(prop is String))
+ throw new InvalidParamException();
+ EMatchFinderType matchFinderIndexPrev = _matchFinderType;
+ int m = FindMatchFinder(((string)prop).ToUpper());
+ if (m < 0)
+ throw new InvalidParamException();
+ _matchFinderType = (EMatchFinderType)m;
+ if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType)
+ {
+ _dictionarySizePrev = 0xFFFFFFFF;
+ _matchFinder = null;
+ }
+ break;
+ }
+ case CoderPropID.DictionarySize:
+ {
+ const int kDicLogSizeMaxCompress = 30;
+ if (!(prop is Int32))
+ throw new InvalidParamException(); ;
+ Int32 dictionarySize = (Int32)prop;
+ if (dictionarySize < (UInt32)(1 << Base.kDicLogSizeMin) ||
+ dictionarySize > (UInt32)(1 << kDicLogSizeMaxCompress))
+ throw new InvalidParamException();
+ _dictionarySize = (UInt32)dictionarySize;
+ int dicLogSize;
+ for (dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++)
+ if (dictionarySize <= ((UInt32)(1) << dicLogSize))
+ break;
+ _distTableSize = (UInt32)dicLogSize * 2;
+ break;
+ }
+ case CoderPropID.PosStateBits:
+ {
+ if (!(prop is Int32))
+ throw new InvalidParamException();
+ Int32 v = (Int32)prop;
+ if (v < 0 || v > (UInt32)Base.kNumPosStatesBitsEncodingMax)
+ throw new InvalidParamException();
+ _posStateBits = (int)v;
+ _posStateMask = (((UInt32)1) << (int)_posStateBits) - 1;
+ break;
+ }
+ case CoderPropID.LitPosBits:
+ {
+ if (!(prop is Int32))
+ throw new InvalidParamException();
+ Int32 v = (Int32)prop;
+ if (v < 0 || v > (UInt32)Base.kNumLitPosStatesBitsEncodingMax)
+ throw new InvalidParamException();
+ _numLiteralPosStateBits = (int)v;
+ break;
+ }
+ case CoderPropID.LitContextBits:
+ {
+ if (!(prop is Int32))
+ throw new InvalidParamException();
+ Int32 v = (Int32)prop;
+ if (v < 0 || v > (UInt32)Base.kNumLitContextBitsMax)
+ throw new InvalidParamException(); ;
+ _numLiteralContextBits = (int)v;
+ break;
+ }
+ case CoderPropID.EndMarker:
+ {
+ if (!(prop is Boolean))
+ throw new InvalidParamException();
+ SetWriteEndMarkerMode((Boolean)prop);
+ break;
+ }
+ default:
+ throw new InvalidParamException();
+ }
+ }
+ }
+
+ uint _trainSize = 0;
+ public void SetTrainSize(uint trainSize)
+ {
+ _trainSize = trainSize;
+ }
+
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs
new file mode 100644
index 0000000..4ced247
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoder.cs
@@ -0,0 +1,234 @@
+using System;
+
+namespace SevenZip.Compression.RangeCoder
+{
+ class Encoder
+ {
+ public const uint kTopValue = (1 << 24);
+
+ System.IO.Stream Stream;
+
+ public UInt64 Low;
+ public uint Range;
+ uint _cacheSize;
+ byte _cache;
+
+ long StartPosition;
+
+ public void SetStream(System.IO.Stream stream)
+ {
+ Stream = stream;
+ }
+
+ public void ReleaseStream()
+ {
+ Stream = null;
+ }
+
+ public void Init()
+ {
+ StartPosition = Stream.Position;
+
+ Low = 0;
+ Range = 0xFFFFFFFF;
+ _cacheSize = 1;
+ _cache = 0;
+ }
+
+ public void FlushData()
+ {
+ for (int i = 0; i < 5; i++)
+ ShiftLow();
+ }
+
+ public void FlushStream()
+ {
+ Stream.Flush();
+ }
+
+ public void CloseStream()
+ {
+ Stream.Close();
+ }
+
+ public void Encode(uint start, uint size, uint total)
+ {
+ Low += start * (Range /= total);
+ Range *= size;
+ while (Range < kTopValue)
+ {
+ Range <<= 8;
+ ShiftLow();
+ }
+ }
+
+ public void ShiftLow()
+ {
+ if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1)
+ {
+ byte temp = _cache;
+ do
+ {
+ Stream.WriteByte((byte)(temp + (Low >> 32)));
+ temp = 0xFF;
+ }
+ while (--_cacheSize != 0);
+ _cache = (byte)(((uint)Low) >> 24);
+ }
+ _cacheSize++;
+ Low = ((uint)Low) << 8;
+ }
+
+ public void EncodeDirectBits(uint v, int numTotalBits)
+ {
+ for (int i = numTotalBits - 1; i >= 0; i--)
+ {
+ Range >>= 1;
+ if (((v >> i) & 1) == 1)
+ Low += Range;
+ if (Range < kTopValue)
+ {
+ Range <<= 8;
+ ShiftLow();
+ }
+ }
+ }
+
+ public void EncodeBit(uint size0, int numTotalBits, uint symbol)
+ {
+ uint newBound = (Range >> numTotalBits) * size0;
+ if (symbol == 0)
+ Range = newBound;
+ else
+ {
+ Low += newBound;
+ Range -= newBound;
+ }
+ while (Range < kTopValue)
+ {
+ Range <<= 8;
+ ShiftLow();
+ }
+ }
+
+ public long GetProcessedSizeAdd()
+ {
+ return _cacheSize +
+ Stream.Position - StartPosition + 4;
+ // (long)Stream.GetProcessedSize();
+ }
+ }
+
+ class Decoder
+ {
+ public const uint kTopValue = (1 << 24);
+ public uint Range;
+ public uint Code;
+ // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16);
+ public System.IO.Stream Stream;
+
+ public void Init(System.IO.Stream stream)
+ {
+ // Stream.Init(stream);
+ Stream = stream;
+
+ Code = 0;
+ Range = 0xFFFFFFFF;
+ for (int i = 0; i < 5; i++)
+ Code = (Code << 8) | (byte)Stream.ReadByte();
+ }
+
+ public void ReleaseStream()
+ {
+ // Stream.ReleaseStream();
+ Stream = null;
+ }
+
+ public void CloseStream()
+ {
+ Stream.Close();
+ }
+
+ public void Normalize()
+ {
+ while (Range < kTopValue)
+ {
+ Code = (Code << 8) | (byte)Stream.ReadByte();
+ Range <<= 8;
+ }
+ }
+
+ public void Normalize2()
+ {
+ if (Range < kTopValue)
+ {
+ Code = (Code << 8) | (byte)Stream.ReadByte();
+ Range <<= 8;
+ }
+ }
+
+ public uint GetThreshold(uint total)
+ {
+ return Code / (Range /= total);
+ }
+
+ public void Decode(uint start, uint size, uint total)
+ {
+ Code -= start * Range;
+ Range *= size;
+ Normalize();
+ }
+
+ public uint DecodeDirectBits(int numTotalBits)
+ {
+ uint range = Range;
+ uint code = Code;
+ uint result = 0;
+ for (int i = numTotalBits; i > 0; i--)
+ {
+ range >>= 1;
+ /*
+ result <<= 1;
+ if (code >= range)
+ {
+ code -= range;
+ result |= 1;
+ }
+ */
+ uint t = (code - range) >> 31;
+ code -= range & (t - 1);
+ result = (result << 1) | (1 - t);
+
+ if (range < kTopValue)
+ {
+ code = (code << 8) | (byte)Stream.ReadByte();
+ range <<= 8;
+ }
+ }
+ Range = range;
+ Code = code;
+ return result;
+ }
+
+ public uint DecodeBit(uint size0, int numTotalBits)
+ {
+ uint newBound = (Range >> numTotalBits) * size0;
+ uint symbol;
+ if (Code < newBound)
+ {
+ symbol = 0;
+ Range = newBound;
+ }
+ else
+ {
+ symbol = 1;
+ Code -= newBound;
+ Range -= newBound;
+ }
+ Normalize();
+ return symbol;
+ }
+
+ // ulong GetProcessedSize() {return Stream.GetProcessedSize(); }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs
new file mode 100644
index 0000000..000a5a0
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBit.cs
@@ -0,0 +1,117 @@
+using System;
+
+namespace SevenZip.Compression.RangeCoder
+{
+ struct BitEncoder
+ {
+ public const int kNumBitModelTotalBits = 11;
+ public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
+ const int kNumMoveBits = 5;
+ const int kNumMoveReducingBits = 2;
+ public const int kNumBitPriceShiftBits = 6;
+
+ uint Prob;
+
+ public void Init() { Prob = kBitModelTotal >> 1; }
+
+ public void UpdateModel(uint symbol)
+ {
+ if (symbol == 0)
+ Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
+ else
+ Prob -= (Prob) >> kNumMoveBits;
+ }
+
+ public void Encode(Encoder encoder, uint symbol)
+ {
+ // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol);
+ // UpdateModel(symbol);
+ uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob;
+ if (symbol == 0)
+ {
+ encoder.Range = newBound;
+ Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
+ }
+ else
+ {
+ encoder.Low += newBound;
+ encoder.Range -= newBound;
+ Prob -= (Prob) >> kNumMoveBits;
+ }
+ if (encoder.Range < Encoder.kTopValue)
+ {
+ encoder.Range <<= 8;
+ encoder.ShiftLow();
+ }
+ }
+
+ private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits];
+
+ static BitEncoder()
+ {
+ const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
+ for (int i = kNumBits - 1; i >= 0; i--)
+ {
+ UInt32 start = (UInt32)1 << (kNumBits - i - 1);
+ UInt32 end = (UInt32)1 << (kNumBits - i);
+ for (UInt32 j = start; j < end; j++)
+ ProbPrices[j] = ((UInt32)i << kNumBitPriceShiftBits) +
+ (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1));
+ }
+ }
+
+ public uint GetPrice(uint symbol)
+ {
+ return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];
+ }
+ public uint GetPrice0() { return ProbPrices[Prob >> kNumMoveReducingBits]; }
+ public uint GetPrice1() { return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; }
+ }
+
+ struct BitDecoder
+ {
+ public const int kNumBitModelTotalBits = 11;
+ public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
+ const int kNumMoveBits = 5;
+
+ uint Prob;
+
+ public void UpdateModel(int numMoveBits, uint symbol)
+ {
+ if (symbol == 0)
+ Prob += (kBitModelTotal - Prob) >> numMoveBits;
+ else
+ Prob -= (Prob) >> numMoveBits;
+ }
+
+ public void Init() { Prob = kBitModelTotal >> 1; }
+
+ public uint Decode(RangeCoder.Decoder rangeDecoder)
+ {
+ uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob;
+ if (rangeDecoder.Code < newBound)
+ {
+ rangeDecoder.Range = newBound;
+ Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
+ if (rangeDecoder.Range < Decoder.kTopValue)
+ {
+ rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
+ rangeDecoder.Range <<= 8;
+ }
+ return 0;
+ }
+ else
+ {
+ rangeDecoder.Range -= newBound;
+ rangeDecoder.Code -= newBound;
+ Prob -= (Prob) >> kNumMoveBits;
+ if (rangeDecoder.Range < Decoder.kTopValue)
+ {
+ rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
+ rangeDecoder.Range <<= 8;
+ }
+ return 1;
+ }
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs
new file mode 100644
index 0000000..3309c14
--- /dev/null
+++ b/ABStudio/Libs/7zip/Compress/RangeCoder/RangeCoderBitTree.cs
@@ -0,0 +1,157 @@
+using System;
+
+namespace SevenZip.Compression.RangeCoder
+{
+ struct BitTreeEncoder
+ {
+ BitEncoder[] Models;
+ int NumBitLevels;
+
+ public BitTreeEncoder(int numBitLevels)
+ {
+ NumBitLevels = numBitLevels;
+ Models = new BitEncoder[1 << numBitLevels];
+ }
+
+ public void Init()
+ {
+ for (uint i = 1; i < (1 << NumBitLevels); i++)
+ Models[i].Init();
+ }
+
+ public void Encode(Encoder rangeEncoder, UInt32 symbol)
+ {
+ UInt32 m = 1;
+ for (int bitIndex = NumBitLevels; bitIndex > 0; )
+ {
+ bitIndex--;
+ UInt32 bit = (symbol >> bitIndex) & 1;
+ Models[m].Encode(rangeEncoder, bit);
+ m = (m << 1) | bit;
+ }
+ }
+
+ public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
+ {
+ UInt32 m = 1;
+ for (UInt32 i = 0; i < NumBitLevels; i++)
+ {
+ UInt32 bit = symbol & 1;
+ Models[m].Encode(rangeEncoder, bit);
+ m = (m << 1) | bit;
+ symbol >>= 1;
+ }
+ }
+
+ public UInt32 GetPrice(UInt32 symbol)
+ {
+ UInt32 price = 0;
+ UInt32 m = 1;
+ for (int bitIndex = NumBitLevels; bitIndex > 0; )
+ {
+ bitIndex--;
+ UInt32 bit = (symbol >> bitIndex) & 1;
+ price += Models[m].GetPrice(bit);
+ m = (m << 1) + bit;
+ }
+ return price;
+ }
+
+ public UInt32 ReverseGetPrice(UInt32 symbol)
+ {
+ UInt32 price = 0;
+ UInt32 m = 1;
+ for (int i = NumBitLevels; i > 0; i--)
+ {
+ UInt32 bit = symbol & 1;
+ symbol >>= 1;
+ price += Models[m].GetPrice(bit);
+ m = (m << 1) | bit;
+ }
+ return price;
+ }
+
+ public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex,
+ int NumBitLevels, UInt32 symbol)
+ {
+ UInt32 price = 0;
+ UInt32 m = 1;
+ for (int i = NumBitLevels; i > 0; i--)
+ {
+ UInt32 bit = symbol & 1;
+ symbol >>= 1;
+ price += Models[startIndex + m].GetPrice(bit);
+ m = (m << 1) | bit;
+ }
+ return price;
+ }
+
+ public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
+ Encoder rangeEncoder, int NumBitLevels, UInt32 symbol)
+ {
+ UInt32 m = 1;
+ for (int i = 0; i < NumBitLevels; i++)
+ {
+ UInt32 bit = symbol & 1;
+ Models[startIndex + m].Encode(rangeEncoder, bit);
+ m = (m << 1) | bit;
+ symbol >>= 1;
+ }
+ }
+ }
+
+ struct BitTreeDecoder
+ {
+ BitDecoder[] Models;
+ int NumBitLevels;
+
+ public BitTreeDecoder(int numBitLevels)
+ {
+ NumBitLevels = numBitLevels;
+ Models = new BitDecoder[1 << numBitLevels];
+ }
+
+ public void Init()
+ {
+ for (uint i = 1; i < (1 << NumBitLevels); i++)
+ Models[i].Init();
+ }
+
+ public uint Decode(RangeCoder.Decoder rangeDecoder)
+ {
+ uint m = 1;
+ for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
+ m = (m << 1) + Models[m].Decode(rangeDecoder);
+ return m - ((uint)1 << NumBitLevels);
+ }
+
+ public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
+ {
+ uint m = 1;
+ uint symbol = 0;
+ for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
+ {
+ uint bit = Models[m].Decode(rangeDecoder);
+ m <<= 1;
+ m += bit;
+ symbol |= (bit << bitIndex);
+ }
+ return symbol;
+ }
+
+ public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
+ RangeCoder.Decoder rangeDecoder, int NumBitLevels)
+ {
+ uint m = 1;
+ uint symbol = 0;
+ for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
+ {
+ uint bit = Models[startIndex + m].Decode(rangeDecoder);
+ m <<= 1;
+ m += bit;
+ symbol |= (bit << bitIndex);
+ }
+ return symbol;
+ }
+ }
+}
diff --git a/ABStudio/Libs/7zip/ICoder.cs b/ABStudio/Libs/7zip/ICoder.cs
new file mode 100644
index 0000000..875cb27
--- /dev/null
+++ b/ABStudio/Libs/7zip/ICoder.cs
@@ -0,0 +1,157 @@
+// ICoder.h
+
+using System;
+
+namespace SevenZip
+{
+ ///
+ /// The exception that is thrown when an error in input stream occurs during decoding.
+ ///
+ class DataErrorException : ApplicationException
+ {
+ public DataErrorException(): base("Data Error") { }
+ }
+
+ ///
+ /// The exception that is thrown when the value of an argument is outside the allowable range.
+ ///
+ class InvalidParamException : ApplicationException
+ {
+ public InvalidParamException(): base("Invalid Parameter") { }
+ }
+
+ public interface ICodeProgress
+ {
+ ///
+ /// Callback progress.
+ ///
+ ///
+ /// input size. -1 if unknown.
+ ///
+ ///
+ /// output size. -1 if unknown.
+ ///
+ void SetProgress(Int64 inSize, Int64 outSize);
+ };
+
+ public interface ICoder
+ {
+ ///
+ /// Codes streams.
+ ///
+ ///
+ /// input Stream.
+ ///
+ ///
+ /// output Stream.
+ ///
+ ///
+ /// input Size. -1 if unknown.
+ ///
+ ///
+ /// output Size. -1 if unknown.
+ ///
+ ///
+ /// callback progress reference.
+ ///
+ ///
+ /// if input stream is not valid
+ ///
+ void Code(System.IO.Stream inStream, System.IO.Stream outStream,
+ Int64 inSize, Int64 outSize, ICodeProgress progress);
+ };
+
+ /*
+ public interface ICoder2
+ {
+ void Code(ISequentialInStream []inStreams,
+ const UInt64 []inSizes,
+ ISequentialOutStream []outStreams,
+ UInt64 []outSizes,
+ ICodeProgress progress);
+ };
+ */
+
+ ///
+ /// Provides the fields that represent properties idenitifiers for compressing.
+ ///
+ public enum CoderPropID
+ {
+ ///
+ /// Specifies default property.
+ ///
+ DefaultProp = 0,
+ ///
+ /// Specifies size of dictionary.
+ ///
+ DictionarySize,
+ ///
+ /// Specifies size of memory for PPM*.
+ ///
+ UsedMemorySize,
+ ///
+ /// Specifies order for PPM methods.
+ ///
+ Order,
+ ///
+ /// Specifies Block Size.
+ ///
+ BlockSize,
+ ///
+ /// Specifies number of postion state bits for LZMA (0 <= x <= 4).
+ ///
+ PosStateBits,
+ ///
+ /// Specifies number of literal context bits for LZMA (0 <= x <= 8).
+ ///
+ LitContextBits,
+ ///
+ /// Specifies number of literal position bits for LZMA (0 <= x <= 4).
+ ///
+ LitPosBits,
+ ///
+ /// Specifies number of fast bytes for LZ*.
+ ///
+ NumFastBytes,
+ ///
+ /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B".
+ ///
+ MatchFinder,
+ ///
+ /// Specifies the number of match finder cyckes.
+ ///
+ MatchFinderCycles,
+ ///
+ /// Specifies number of passes.
+ ///
+ NumPasses,
+ ///
+ /// Specifies number of algorithm.
+ ///
+ Algorithm,
+ ///
+ /// Specifies the number of threads.
+ ///
+ NumThreads,
+ ///
+ /// Specifies mode with end marker.
+ ///
+ EndMarker
+ };
+
+
+ public interface ISetCoderProperties
+ {
+ void SetCoderProperties(CoderPropID[] propIDs, object[] properties);
+ };
+
+ public interface IWriteCoderProperties
+ {
+ void WriteCoderProperties(System.IO.Stream outStream);
+ }
+
+ public interface ISetDecoderProperties
+ {
+ void SetDecoderProperties(byte[] properties);
+ }
+}
diff --git a/ABStudio/Libs/7zip/Source.txt b/ABStudio/Libs/7zip/Source.txt
new file mode 100644
index 0000000..e62c937
--- /dev/null
+++ b/ABStudio/Libs/7zip/Source.txt
@@ -0,0 +1 @@
+https://7-zip.org/sdk.html
\ No newline at end of file
diff --git a/ABStudio/Libs/StbRectPackSharp/CRuntime.cs b/ABStudio/Libs/StbRectPackSharp/CRuntime.cs
new file mode 100644
index 0000000..e104975
--- /dev/null
+++ b/ABStudio/Libs/StbRectPackSharp/CRuntime.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace StbRectPackSharp
+{
+ internal static unsafe class CRuntime
+ {
+ public static void* malloc(ulong size)
+ {
+ return malloc((long)size);
+ }
+
+ public static void* malloc(long size)
+ {
+ var ptr = Marshal.AllocHGlobal((int)size);
+
+ return ptr.ToPointer();
+ }
+
+ public static void free(void* a)
+ {
+ var ptr = new IntPtr(a);
+ Marshal.FreeHGlobal(ptr);
+ }
+
+ public delegate int QSortComparer(void* a, void* b);
+
+ private static void qsortSwap(byte* data, long size, long pos1, long pos2)
+ {
+ var a = data + size * pos1;
+ var b = data + size * pos2;
+
+ for (long k = 0; k < size; ++k)
+ {
+ var tmp = *a;
+ *a = *b;
+ *b = tmp;
+
+ a++;
+ b++;
+ }
+ }
+
+ private static long qsortPartition(byte* data, long size, QSortComparer comparer, long left, long right)
+ {
+ void* pivot = data + size * left;
+ var i = left - 1;
+ var j = right + 1;
+ for (; ; )
+ {
+ do
+ {
+ ++i;
+ } while (comparer(data + size * i, pivot) < 0);
+
+ do
+ {
+ --j;
+ } while (comparer(data + size * j, pivot) > 0);
+
+ if (i >= j)
+ {
+ return j;
+ }
+
+ qsortSwap(data, size, i, j);
+ }
+ }
+
+
+ private static void qsortInternal(byte* data, long size, QSortComparer comparer, long left, long right)
+ {
+ if (left < right)
+ {
+ var p = qsortPartition(data, size, comparer, left, right);
+
+ qsortInternal(data, size, comparer, left, p);
+ qsortInternal(data, size, comparer, p + 1, right);
+ }
+ }
+
+ public static void qsort(void* data, ulong count, ulong size, QSortComparer comparer)
+ {
+ qsortInternal((byte*)data, (long)size, comparer, 0, (long)count - 1);
+ }
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Libs/StbRectPackSharp/Packer.cs b/ABStudio/Libs/StbRectPackSharp/Packer.cs
new file mode 100644
index 0000000..01e90e7
--- /dev/null
+++ b/ABStudio/Libs/StbRectPackSharp/Packer.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using static StbRectPackSharp.StbRectPack;
+
+namespace StbRectPackSharp
+{
+#if !STBSHARP_INTERNAL
+ public
+#else
+ internal
+#endif
+ class PackerRectangle
+ {
+ public Rectangle Rectangle { get; private set; }
+
+ public int X => Rectangle.X;
+ public int Y => Rectangle.Y;
+ public int Width => Rectangle.Width;
+ public int Height => Rectangle.Height;
+
+ public object Data { get; private set; }
+
+ public PackerRectangle(Rectangle rect, object data)
+ {
+ Rectangle = rect;
+ Data = data;
+ }
+ }
+
+ ///
+ /// Simple Packer class that doubles size of the atlas if the place runs out
+ ///
+#if !STBSHARP_INTERNAL
+ public
+#else
+ internal
+#endif
+ unsafe class Packer : IDisposable
+ {
+ private readonly stbrp_context _context;
+ private readonly List _rectangles = new List();
+
+ public int Width => _context.width;
+ public int Height => _context.height;
+
+ public List PackRectangles => _rectangles;
+
+
+ public Packer(int width = 256, int height = 256)
+ {
+ if (width <= 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(width));
+ }
+
+ if (height <= 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(height));
+ }
+
+ // Initialize the context
+ var num_nodes = width;
+ _context = new stbrp_context(num_nodes);
+
+ fixed (stbrp_context* contextPtr = &_context)
+ {
+ stbrp_init_target(contextPtr, width, height, _context.all_nodes, num_nodes);
+ }
+ }
+
+ public void Dispose()
+ {
+ _context.Dispose();
+ }
+
+ ///
+ /// Packs a rect. Returns null, if there's no more place left.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public PackerRectangle PackRect(int width, int height, object userData)
+ {
+ var rect = new stbrp_rect
+ {
+ id = _rectangles.Count,
+ w = width,
+ h = height
+ };
+
+ int result;
+ fixed (stbrp_context* contextPtr = &_context)
+ {
+ result = stbrp_pack_rects(contextPtr, &rect, 1);
+ }
+
+ if (result == 0)
+ {
+ return null;
+ }
+
+ var packRectangle = new PackerRectangle(new Rectangle(rect.x, rect.y, rect.w, rect.h), userData);
+ _rectangles.Add(packRectangle);
+
+ return packRectangle;
+ }
+
+ ///
+ /// Packs a rect. Resizes the entire packer if there's no more space
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static PackerRectangle PackRectForce(ref Packer packer, int width, int height, object userData)
+ {
+ PackerRectangle pr = packer.PackRect(width, height, userData);
+
+ // If pr is null, it means there's no place for the new rect
+ // Double the size of the packer until the new rectangle will fit
+ while (pr == null)
+ {
+ Packer newPacker = new Packer(packer.Width + 256, packer.Height + 256);
+
+ // Place existing rectangles
+ foreach (PackerRectangle existingRect in packer.PackRectangles)
+ {
+ newPacker.PackRect(existingRect.Width, existingRect.Height, existingRect.Data);
+ }
+
+ // Now dispose old packer and assign new one
+ packer.Dispose();
+ packer = newPacker;
+
+ // Try to fit the rectangle again
+ pr = packer.PackRect(width, height, userData);
+ }
+
+ return pr;
+ }
+
+ }
+}
diff --git a/ABStudio/Libs/StbRectPackSharp/Source.txt b/ABStudio/Libs/StbRectPackSharp/Source.txt
new file mode 100644
index 0000000..43e5170
--- /dev/null
+++ b/ABStudio/Libs/StbRectPackSharp/Source.txt
@@ -0,0 +1 @@
+https://github.com/StbSharp/StbRectPackSharp
\ No newline at end of file
diff --git a/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs b/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs
new file mode 100644
index 0000000..6057bdc
--- /dev/null
+++ b/ABStudio/Libs/StbRectPackSharp/StbRectPack.Generated.cs
@@ -0,0 +1,308 @@
+// Generated by Sichem at 2/18/2021 7:29:26 PM
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace StbRectPackSharp
+{
+ unsafe partial class StbRectPack
+ {
+ public const int STBRP_HEURISTIC_Skyline_default = 0;
+ public const int STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default;
+ public const int STBRP_HEURISTIC_Skyline_BF_sortHeight = 2;
+ public const int STBRP__INIT_skyline = 1;
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct stbrp_rect
+ {
+ public int id;
+ public int w;
+ public int h;
+ public int x;
+ public int y;
+ public int was_packed;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct stbrp_node
+ {
+ public int x;
+ public int y;
+ public stbrp_node* next;
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct stbrp__findresult
+ {
+ public int x;
+ public int y;
+ public stbrp_node** prev_link;
+ }
+
+ public static void stbrp_setup_heuristic(stbrp_context* context, int heuristic)
+ {
+ switch (context->init_mode)
+ {
+ case STBRP__INIT_skyline:
+ ;
+ context->heuristic = heuristic;
+ break;
+ default:
+ throw new Exception("Mode " + context->init_mode + " is not supported.");
+ }
+ }
+
+ public static void stbrp_setup_allow_out_of_mem(stbrp_context* context, int allow_out_of_mem)
+ {
+ if (allow_out_of_mem != 0)
+ context->align = 1;
+ else
+ context->align = (context->width + context->num_nodes - 1) / context->num_nodes;
+ }
+
+ public static void stbrp_init_target(stbrp_context* context, int width, int height, stbrp_node* nodes,
+ int num_nodes)
+ {
+ var i = 0;
+ for (i = 0; i < num_nodes - 1; ++i)
+ nodes[i].next = &nodes[i + 1];
+ nodes[i].next = null;
+ context->init_mode = STBRP__INIT_skyline;
+ context->heuristic = STBRP_HEURISTIC_Skyline_default;
+ context->free_head = &nodes[0];
+ context->active_head = &context->extra[0];
+ context->width = width;
+ context->height = height;
+ context->num_nodes = num_nodes;
+ stbrp_setup_allow_out_of_mem(context, 0);
+ context->extra[0].x = 0;
+ context->extra[0].y = 0;
+ context->extra[0].next = &context->extra[1];
+ context->extra[1].x = (int)width;
+ context->extra[1].y = 65535;
+ context->extra[1].next = null;
+ }
+
+ public static int stbrp__skyline_find_min_y(stbrp_context* c, stbrp_node* first, int x0, int width, int* pwaste)
+ {
+ var node = first;
+ var x1 = x0 + width;
+ var min_y = 0;
+ var visited_width = 0;
+ var waste_area = 0;
+ min_y = 0;
+ waste_area = 0;
+ visited_width = 0;
+ while (node->x < x1)
+ {
+ if (node->y > min_y)
+ {
+ waste_area += visited_width * (node->y - min_y);
+ min_y = node->y;
+ if (node->x < x0)
+ visited_width += node->next->x - x0;
+ else
+ visited_width += node->next->x - node->x;
+ }
+ else
+ {
+ var under_width = node->next->x - node->x;
+ if (under_width + visited_width > width)
+ under_width = width - visited_width;
+ waste_area += under_width * (min_y - node->y);
+ visited_width += under_width;
+ }
+
+ node = node->next;
+ }
+
+ *pwaste = waste_area;
+ return min_y;
+ }
+
+ public static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context* c, int width, int height)
+ {
+ var best_waste = 1 << 30;
+ var best_x = 0;
+ var best_y = 1 << 30;
+ var fr = new stbrp__findresult();
+ stbrp_node** prev;
+ stbrp_node* node;
+ stbrp_node* tail;
+ stbrp_node** best = null;
+ width = width + c->align - 1;
+ width -= width % c->align;
+ if (width > c->width || height > c->height)
+ {
+ fr.prev_link = null;
+ fr.x = fr.y = 0;
+ return fr;
+ }
+
+ node = c->active_head;
+ prev = &c->active_head;
+ while (node->x + width <= c->width)
+ {
+ var y = 0;
+ var waste = 0;
+ y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
+ if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight)
+ {
+ if (y < best_y)
+ {
+ best_y = y;
+ best = prev;
+ }
+ }
+ else
+ {
+ if (y + height <= c->height)
+ if (y < best_y || y == best_y && waste < best_waste)
+ {
+ best_y = y;
+ best_waste = waste;
+ best = prev;
+ }
+ }
+
+ prev = &node->next;
+ node = node->next;
+ }
+
+ best_x = best == null ? 0 : (*best)->x;
+ if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight)
+ {
+ tail = c->active_head;
+ node = c->active_head;
+ prev = &c->active_head;
+ while (tail->x < width)
+ tail = tail->next;
+ while (tail != null)
+ {
+ var xpos = tail->x - width;
+ var y = 0;
+ var waste = 0;
+ while (node->next->x <= xpos)
+ {
+ prev = &node->next;
+ node = node->next;
+ }
+
+ y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
+ if (y + height <= c->height)
+ if (y <= best_y)
+ if (y < best_y || waste < best_waste || waste == best_waste && xpos < best_x)
+ {
+ best_x = xpos;
+ best_y = y;
+ best_waste = waste;
+ best = prev;
+ }
+
+ tail = tail->next;
+ }
+ }
+
+ fr.prev_link = best;
+ fr.x = best_x;
+ fr.y = best_y;
+ return fr;
+ }
+
+ public static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context* context, int width, int height)
+ {
+ var res = stbrp__skyline_find_best_pos(context, width, height);
+ stbrp_node* node;
+ stbrp_node* cur;
+ if (res.prev_link == null || res.y + height > context->height || context->free_head == null)
+ {
+ res.prev_link = null;
+ return res;
+ }
+
+ node = context->free_head;
+ node->x = (int)res.x;
+ node->y = (int)(res.y + height);
+ context->free_head = node->next;
+ cur = *res.prev_link;
+ if (cur->x < res.x)
+ {
+ var next = cur->next;
+ cur->next = node;
+ cur = next;
+ }
+ else
+ {
+ *res.prev_link = node;
+ }
+
+ while (cur->next != null && cur->next->x <= res.x + width)
+ {
+ var next = cur->next;
+ cur->next = context->free_head;
+ context->free_head = cur;
+ cur = next;
+ }
+
+ node->next = cur;
+ if (cur->x < res.x + width)
+ cur->x = (int)(res.x + width);
+ return res;
+ }
+
+ public static int rect_height_compare(void* a, void* b)
+ {
+ var p = (stbrp_rect*)a;
+ var q = (stbrp_rect*)b;
+ if (p->h > q->h)
+ return -1;
+ if (p->h < q->h)
+ return 1;
+ return p->w > q->w ? -1 : p->w < q->w ? 1 : 0;
+ }
+
+ public static int rect_original_order(void* a, void* b)
+ {
+ var p = (stbrp_rect*)a;
+ var q = (stbrp_rect*)b;
+ return p->was_packed < q->was_packed ? -1 : p->was_packed > q->was_packed ? 1 : 0;
+ }
+
+ public static int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int num_rects)
+ {
+ var i = 0;
+ var all_rects_packed = 1;
+ for (i = 0; i < num_rects; ++i)
+ rects[i].was_packed = i;
+ CRuntime.qsort(rects, (ulong)num_rects, (ulong)sizeof(stbrp_rect), rect_height_compare);
+ for (i = 0; i < num_rects; ++i)
+ if (rects[i].w == 0 || rects[i].h == 0)
+ {
+ rects[i].x = rects[i].y = 0;
+ }
+ else
+ {
+ var fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
+ if (fr.prev_link != null)
+ {
+ rects[i].x = (int)fr.x;
+ rects[i].y = (int)fr.y;
+ }
+ else
+ {
+ rects[i].x = rects[i].y = 0xffff;
+ }
+ }
+
+ CRuntime.qsort(rects, (ulong)num_rects, (ulong)sizeof(stbrp_rect), rect_original_order);
+ for (i = 0; i < num_rects; ++i)
+ {
+ rects[i].was_packed = rects[i].x == 0xffff && rects[i].y == 0xffff ? 0 : 1;
+ if (rects[i].was_packed == 0)
+ all_rects_packed = 0;
+ }
+
+ return all_rects_packed;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs b/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs
new file mode 100644
index 0000000..e5c7373
--- /dev/null
+++ b/ABStudio/Libs/StbRectPackSharp/StbRectPack.cs
@@ -0,0 +1,59 @@
+using System;
+
+namespace StbRectPackSharp
+{
+#if !STBSHARP_INTERNAL
+ public
+#else
+ internal
+#endif
+ static unsafe partial class StbRectPack
+ {
+ public struct stbrp_context: IDisposable
+ {
+ public int width;
+ public int height;
+ public int align;
+ public int init_mode;
+ public int heuristic;
+ public int num_nodes;
+ public stbrp_node* active_head;
+ public stbrp_node* free_head;
+ public stbrp_node* extra;
+ public stbrp_node* all_nodes;
+
+
+ public stbrp_context(int nodesCount)
+ {
+ if (nodesCount <= 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(nodesCount));
+ }
+
+ width = height = align = init_mode = heuristic = num_nodes = 0;
+ active_head = free_head = null;
+
+ // Allocate nodes
+ all_nodes = (stbrp_node*)CRuntime.malloc(sizeof(stbrp_node) * nodesCount);
+
+ // Allocate extras
+ extra = (stbrp_node*)CRuntime.malloc(sizeof(stbrp_node) * 2);
+ }
+
+ public void Dispose()
+ {
+ if (all_nodes != null)
+ {
+ CRuntime.free(all_nodes);
+ all_nodes = null;
+ }
+
+ if (extra != null)
+ {
+ CRuntime.free(extra);
+ extra = null;
+ }
+ }
+ }
+ }
+}
diff --git a/ABStudio/Misc/Common.cs b/ABStudio/Misc/Common.cs
new file mode 100644
index 0000000..b2ae81a
--- /dev/null
+++ b/ABStudio/Misc/Common.cs
@@ -0,0 +1,184 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ABStudio.FileFormats.DAT;
+using ABStudio.FileFormats.ZSTREAM;
+using ABStudio.Forms;
+
+namespace ABStudio.Misc
+{
+ public static class Common
+ {
+ /*********/
+ /* Lists */
+ /*********/
+
+ private static readonly string[] typeList = new string[] { "Sprite" };
+ private static readonly string[] displayList = new string[] { "Spritesheet" };
+ private static readonly Func[] createList = new Func[] { NewSpritesheetFile };
+ private static readonly Action[] editorList = new Action[] { NewSpritesheetEditor };
+
+ public static string[] DisplayNames { get => displayList; }
+
+
+ /**************************/
+ /* New & Editor functions */
+ /**************************/
+
+ public static DATFile NewSpritesheetFile()
+ {
+ return DATFile.NewSpriteData();
+ }
+
+ public static void NewSpritesheetEditor(string path, DATFile file)
+ {
+ SpritesheetEditor editor = new SpritesheetEditor(path, file);
+ editor.Show();
+ }
+
+
+ /*********************/
+ /* Utility functions */
+ /*********************/
+
+ public static DATFile OpenFile() { string str = ""; return OpenFile(ref str); }
+ public static DATFile OpenFile(ref string originalPath)
+ {
+ using (OpenFileDialog dialog = new OpenFileDialog())
+ {
+ dialog.Filter = "Angry Birds Classic DAT Files|*.dat|Angry Birds Classic Sheets JSON Files|*.sheet.json|All files (*.*)|*.*";
+ dialog.DefaultExt = "dat";
+ dialog.FilterIndex = 1;
+ dialog.RestoreDirectory = true;
+ if (dialog.ShowDialog() == DialogResult.OK)
+ {
+ string path = dialog.FileName;
+
+ DATFile file = null;
+ try
+ {
+ if (path.EndsWith(".sheet.json", StringComparison.OrdinalIgnoreCase))
+ {
+ ZSTREAMFile zs = new ZSTREAMFile(path);
+ file = zs.associatedDAT;
+ }
+ else
+ file = new DATFile(path);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Couldn't load:"
+ + Environment.NewLine + "\"" + path + "\""
+ + Environment.NewLine
+ + Environment.NewLine + "Error:"
+ + Environment.NewLine + ex.ToString(),
+ "Couldn't load DAT file",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+
+ return null;
+ }
+
+ originalPath = path;
+ return file;
+ }
+ }
+
+ return null;
+ }
+
+ public static void OpenFileInNewEditor()
+ {
+ string path = "";
+ DATFile file = OpenFile(ref path);
+
+ if (file != null)
+ OpenEditor(path, file);
+ }
+
+ public static void SaveFile(string path, DATFile file) => SaveFile(ref path, file);
+ public static void SaveFile(ref string path, DATFile file)
+ {
+ if (path == "")
+ SaveAsFile(ref path, file);
+ else
+ File.WriteAllBytes(path, path.EndsWith(".json", StringComparison.OrdinalIgnoreCase) ? file.AsJSONBytes : file.AsBytes);
+ }
+
+
+ public static bool SaveAsFile(DATFile file) { string str = ""; return SaveAsFile(ref str, file); }
+ public static bool SaveAsFile(ref string originalPath, DATFile file)
+ {
+ SaveFileDialog dialog;
+ dialog = new SaveFileDialog();
+ dialog.Filter = "Angry Birds Classic DAT Files|*.dat|Angry Birds Classic Sheets JSON Files|*.sheet.json|All files (*.*)|*.*";
+ dialog.DefaultExt = "dat";
+ if (dialog.ShowDialog() == DialogResult.OK)
+ {
+ originalPath = dialog.FileName;
+ SaveFile(ref originalPath, file);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static void OpenEditor(string path, DATFile file)
+ {
+ bool success = false;
+
+ for (int i = 0; i < typeList.Length; i++)
+ {
+ if (file.Type == typeList[i])
+ {
+ editorList[i].Invoke(path, file);
+ success = true;
+ break;
+ }
+ }
+
+ if (!success)
+ MessageBox.Show("No associated editor was found for DAT file type \"" + file.Type + "\".", "Couldn't open editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ public static DATFile AskForNew()
+ {
+ using (ComboAskForm comboAskForm = new ComboAskForm(displayList, "Choose the type of file you want to create"))
+ if (comboAskForm.ShowDialog() == DialogResult.OK)
+ return MakeNew(comboAskForm.ComboIndex);
+
+ return null;
+ }
+
+ private static DATFile MakeNew(int id)
+ {
+ return createList[id].Invoke();
+ }
+
+ public static DATFile MakeNew(string displayName)
+ {
+ return MakeNew(Array.IndexOf(displayList, displayName));
+ }
+
+ [DllImport("user32.dll")]
+ public static extern short GetAsyncKeyState(int key);
+
+ // https://stackoverflow.com/a/13266776/9399492
+ public static string MakeRelativePath(string filePath, string referencePath, bool useWindowsDirChar=true)
+ {
+ var fileUri = new Uri(filePath);
+ var referenceUri = new Uri(referencePath);
+ string relativePath = Uri.UnescapeDataString(referenceUri.MakeRelativeUri(fileUri).ToString());
+ if (useWindowsDirChar)
+ relativePath = relativePath.Replace('/', Path.DirectorySeparatorChar);
+
+ return relativePath;
+ }
+ }
+}
diff --git a/ABStudio/Misc/FolderPicker.cs b/ABStudio/Misc/FolderPicker.cs
new file mode 100644
index 0000000..0929316
--- /dev/null
+++ b/ABStudio/Misc/FolderPicker.cs
@@ -0,0 +1,222 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.ComTypes;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Interop;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+
+namespace ABStudio.Misc
+{
+ public class FolderPicker
+ {
+ private readonly List _resultPaths = new List();
+ private readonly List _resultNames = new List();
+
+ public IReadOnlyList ResultPaths => _resultPaths;
+ public IReadOnlyList ResultNames => _resultNames;
+ public string ResultPath => ResultPaths.FirstOrDefault();
+ public string ResultName => ResultNames.FirstOrDefault();
+ public virtual string InputPath { get; set; }
+ public virtual bool ForceFileSystem { get; set; }
+ public virtual bool Multiselect { get; set; }
+ public virtual string Title { get; set; }
+ public virtual string OkButtonLabel { get; set; }
+ public virtual string FileNameLabel { get; set; }
+
+ protected virtual int SetOptions(int options)
+ {
+ if (ForceFileSystem)
+ {
+ options |= (int)FOS.FOS_FORCEFILESYSTEM;
+ }
+
+ if (Multiselect)
+ {
+ options |= (int)FOS.FOS_ALLOWMULTISELECT;
+ }
+ return options;
+ }
+
+ // for all .NET
+ public virtual bool? ShowDialog(bool throwOnError = false) => ShowDialog(IntPtr.Zero, throwOnError);
+ public virtual bool? ShowDialog(IntPtr owner, bool throwOnError = false)
+ {
+ var dialog = (IFileOpenDialog)new FileOpenDialog();
+ if (!string.IsNullOrEmpty(InputPath))
+ {
+ if (CheckHr(SHCreateItemFromParsingName(InputPath, null, typeof(IShellItem).GUID, out var item), throwOnError) != 0)
+ return null;
+
+ dialog.SetFolder(item);
+ }
+
+ var options = FOS.FOS_PICKFOLDERS;
+ options = (FOS)SetOptions((int)options);
+ dialog.SetOptions(options);
+
+ if (Title != null)
+ {
+ dialog.SetTitle(Title);
+ }
+
+ if (OkButtonLabel != null)
+ {
+ dialog.SetOkButtonLabel(OkButtonLabel);
+ }
+
+ if (FileNameLabel != null)
+ {
+ dialog.SetFileName(FileNameLabel);
+ }
+
+ if (owner == IntPtr.Zero)
+ {
+ owner = Process.GetCurrentProcess().MainWindowHandle;
+ if (owner == IntPtr.Zero)
+ {
+ owner = GetDesktopWindow();
+ }
+ }
+
+ var hr = dialog.Show(owner);
+ if (hr == ERROR_CANCELLED)
+ return null;
+
+ if (CheckHr(hr, throwOnError) != 0)
+ return null;
+
+ if (CheckHr(dialog.GetResults(out var items), throwOnError) != 0)
+ return null;
+
+ items.GetCount(out var count);
+ for (var i = 0; i < count; i++)
+ {
+ items.GetItemAt(i, out var item);
+ CheckHr(item.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEPARSING, out var path), throwOnError);
+ CheckHr(item.GetDisplayName(SIGDN.SIGDN_DESKTOPABSOLUTEEDITING, out var name), throwOnError);
+ if (path != null || name != null)
+ {
+ _resultPaths.Add(path);
+ _resultNames.Add(name);
+ }
+ }
+ return true;
+ }
+
+ private static int CheckHr(int hr, bool throwOnError)
+ {
+ if (hr != 0 && throwOnError) Marshal.ThrowExceptionForHR(hr);
+ return hr;
+ }
+
+ [DllImport("shell32")]
+ private static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IBindCtx pbc, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, out IShellItem ppv);
+
+ [DllImport("user32")]
+ private static extern IntPtr GetDesktopWindow();
+
+ private const int ERROR_CANCELLED = unchecked((int)0x800704C7);
+
+ [ComImport, Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")] // CLSID_FileOpenDialog
+ private class FileOpenDialog { }
+
+ [ComImport, Guid("d57c7288-d4ad-4768-be02-9d969532d960"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ private interface IFileOpenDialog
+ {
+ [PreserveSig] int Show(IntPtr parent); // IModalWindow
+ [PreserveSig] int SetFileTypes(); // not fully defined
+ [PreserveSig] int SetFileTypeIndex(int iFileType);
+ [PreserveSig] int GetFileTypeIndex(out int piFileType);
+ [PreserveSig] int Advise(); // not fully defined
+ [PreserveSig] int Unadvise();
+ [PreserveSig] int SetOptions(FOS fos);
+ [PreserveSig] int GetOptions(out FOS pfos);
+ [PreserveSig] int SetDefaultFolder(IShellItem psi);
+ [PreserveSig] int SetFolder(IShellItem psi);
+ [PreserveSig] int GetFolder(out IShellItem ppsi);
+ [PreserveSig] int GetCurrentSelection(out IShellItem ppsi);
+ [PreserveSig] int SetFileName([MarshalAs(UnmanagedType.LPWStr)] string pszName);
+ [PreserveSig] int GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string pszName);
+ [PreserveSig] int SetTitle([MarshalAs(UnmanagedType.LPWStr)] string pszTitle);
+ [PreserveSig] int SetOkButtonLabel([MarshalAs(UnmanagedType.LPWStr)] string pszText);
+ [PreserveSig] int SetFileNameLabel([MarshalAs(UnmanagedType.LPWStr)] string pszLabel);
+ [PreserveSig] int GetResult(out IShellItem ppsi);
+ [PreserveSig] int AddPlace(IShellItem psi, int alignment);
+ [PreserveSig] int SetDefaultExtension([MarshalAs(UnmanagedType.LPWStr)] string pszDefaultExtension);
+ [PreserveSig] int Close(int hr);
+ [PreserveSig] int SetClientGuid(); // not fully defined
+ [PreserveSig] int ClearClientData();
+ [PreserveSig] int SetFilter([MarshalAs(UnmanagedType.IUnknown)] object pFilter);
+ [PreserveSig] int GetResults(out IShellItemArray ppenum);
+ [PreserveSig] int GetSelectedItems([MarshalAs(UnmanagedType.IUnknown)] out object ppsai);
+ }
+
+ [ComImport, Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ private interface IShellItem
+ {
+ [PreserveSig] int BindToHandler(); // not fully defined
+ [PreserveSig] int GetParent(); // not fully defined
+ [PreserveSig] int GetDisplayName(SIGDN sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName);
+ [PreserveSig] int GetAttributes(); // not fully defined
+ [PreserveSig] int Compare(); // not fully defined
+ }
+
+ [ComImport, Guid("b63ea76d-1f85-456f-a19c-48159efa858b"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ private interface IShellItemArray
+ {
+ [PreserveSig] int BindToHandler(); // not fully defined
+ [PreserveSig] int GetPropertyStore(); // not fully defined
+ [PreserveSig] int GetPropertyDescriptionList(); // not fully defined
+ [PreserveSig] int GetAttributes(); // not fully defined
+ [PreserveSig] int GetCount(out int pdwNumItems);
+ [PreserveSig] int GetItemAt(int dwIndex, out IShellItem ppsi);
+ [PreserveSig] int EnumItems(); // not fully defined
+ }
+
+ private enum SIGDN : uint
+ {
+ SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000,
+ SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000,
+ SIGDN_FILESYSPATH = 0x80058000,
+ SIGDN_NORMALDISPLAY = 0,
+ SIGDN_PARENTRELATIVE = 0x80080001,
+ SIGDN_PARENTRELATIVEEDITING = 0x80031001,
+ SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8007c001,
+ SIGDN_PARENTRELATIVEPARSING = 0x80018001,
+ SIGDN_URL = 0x80068000
+ }
+
+ [Flags]
+ private enum FOS
+ {
+ FOS_OVERWRITEPROMPT = 0x2,
+ FOS_STRICTFILETYPES = 0x4,
+ FOS_NOCHANGEDIR = 0x8,
+ FOS_PICKFOLDERS = 0x20,
+ FOS_FORCEFILESYSTEM = 0x40,
+ FOS_ALLNONSTORAGEITEMS = 0x80,
+ FOS_NOVALIDATE = 0x100,
+ FOS_ALLOWMULTISELECT = 0x200,
+ FOS_PATHMUSTEXIST = 0x800,
+ FOS_FILEMUSTEXIST = 0x1000,
+ FOS_CREATEPROMPT = 0x2000,
+ FOS_SHAREAWARE = 0x4000,
+ FOS_NOREADONLYRETURN = 0x8000,
+ FOS_NOTESTFILECREATE = 0x10000,
+ FOS_HIDEMRUPLACES = 0x20000,
+ FOS_HIDEPINNEDPLACES = 0x40000,
+ FOS_NODEREFERENCELINKS = 0x100000,
+ FOS_OKBUTTONNEEDSINTERACTION = 0x200000,
+ FOS_DONTADDTORECENT = 0x2000000,
+ FOS_FORCESHOWHIDDEN = 0x10000000,
+ FOS_DEFAULTNOMINIMODE = 0x20000000,
+ FOS_FORCEPREVIEWPANEON = 0x40000000,
+ FOS_SUPPORTSTREAMABLEITEMS = unchecked((int)0x80000000)
+ }
+ }
+}
diff --git a/ABStudio/PVRTexLib.dll b/ABStudio/PVRTexLib.dll
new file mode 100644
index 0000000..85da655
Binary files /dev/null and b/ABStudio/PVRTexLib.dll differ
diff --git a/ABStudio/Program.cs b/ABStudio/Program.cs
new file mode 100644
index 0000000..6a5a64e
--- /dev/null
+++ b/ABStudio/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ABStudio
+{
+ static class Program
+ {
+ ///
+ /// Point d'entrée principal de l'application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Forms.Main());
+ }
+ }
+}
diff --git a/ABStudio/Properties/AssemblyInfo.cs b/ABStudio/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0aa78fa
--- /dev/null
+++ b/ABStudio/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Les informations générales relatives à un assembly dépendent de
+// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
+// associées à un assembly.
+[assembly: AssemblyTitle("ABStudio")]
+[assembly: AssemblyDescription("A general purpose Angry Birds modding tool")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ABStudio")]
+[assembly: AssemblyCopyright("Copyright © 2023 RSM")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly
+// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de
+// COM, affectez la valeur true à l'attribut ComVisible sur ce type.
+[assembly: ComVisible(false)]
+
+// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM
+[assembly: Guid("30adf767-664c-47c5-89c6-60cdc84051b9")]
+
+// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
+//
+// Version principale
+// Version secondaire
+// Numéro de build
+// Révision
+//
+// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
+// en utilisant '*', comme indiqué ci-dessous :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ABStudio/Properties/Resources.Designer.cs b/ABStudio/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..c9b3c50
--- /dev/null
+++ b/ABStudio/Properties/Resources.Designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+//
+// Ce code a été généré par un outil.
+// Version du runtime :4.0.30319.42000
+//
+// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
+// le code est régénéré.
+//
+//------------------------------------------------------------------------------
+
+
+namespace ABStudio.Properties
+{
+ ///
+ /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
+ ///
+ // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
+ // à l'aide d'un outil, tel que ResGen ou Visual Studio.
+ // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
+ // avec l'option /str ou régénérez votre projet VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ ///
+ /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ABStudio.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Remplace la propriété CurrentUICulture du thread actuel pour toutes
+ /// les recherches de ressources à l'aide de cette classe de ressource fortement typée.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/ABStudio/Properties/Resources.resx b/ABStudio/Properties/Resources.resx
new file mode 100644
index 0000000..ffecec8
--- /dev/null
+++ b/ABStudio/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ABStudio/Properties/Settings.Designer.cs b/ABStudio/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..9d62b1d
--- /dev/null
+++ b/ABStudio/Properties/Settings.Designer.cs
@@ -0,0 +1,29 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+namespace ABStudio.Properties
+{
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/ABStudio/Properties/Settings.settings b/ABStudio/Properties/Settings.settings
new file mode 100644
index 0000000..abf36c5
--- /dev/null
+++ b/ABStudio/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/ABStudio/icon.ico b/ABStudio/icon.ico
new file mode 100644
index 0000000..8c6ad6d
Binary files /dev/null and b/ABStudio/icon.ico differ
diff --git a/ABStudio/packages.config b/ABStudio/packages.config
new file mode 100644
index 0000000..f8260c1
--- /dev/null
+++ b/ABStudio/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..82acda0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,39 @@
+# AB Studio
+A general purpose Angry Birds modding tool
+
+## What is this?
+AB Studio is a WIP tool that aims to be able to edit every single file format used in [Angry Birds](https://wikipedia.org/wiki/Angry_Birds) games.
+
+For now, it only edits [AB Classic](https://en.wikipedia.org/wiki/Angry_Birds_(video_game)) spritesheets (in both DAT and SHEET.JSON formats).
+Hence why windows say "AB Classic Studio" for now.
+
+But hopefully, it'll one day support:
+* Composprites
+* Fonts
+* Localization files
+* More?
+
+## Building
+
+In order to build AB Studio, follow the following steps:
+* Open the ``ABStudio.sln`` file in [Visual Studio](https://visualstudio.microsoft.com/) (both 2019 and 2022 were tested to work).
+* Depending of your usage, either run the tool in debug mode using the play icon the top, or change the building mode from ``Debug`` to ``Release`` in the combo box at the left side of the play button, and open the ``Generate`` toolbox (from the toolbar on the top) and click on ``Generate solution``.
+* You will find your built executable in the ``bin`` folder in the project's directory, in the folder that corresponds to your building mode.
+
+## Code organization
+
+The tool is split in various editors that can be opened at any time using an input file.
+
+All editors are independent and can be opened in as many instances as you wish.
+
+## Contributing
+
+Feel free to fork the repo and write editors for file formats that aren't supported yet, or to make fixes to existing ones.
+
+Then, send a pull request. If your changes are of good quality, I'll merge them into the repo.
+
+However, please be careful to keep the code's organization clean. There's no point in writing new things if it takes twice the amount of time to clean it up afterwards.
+
+## Licensing
+Check the [LICENSE](https://github.com/giroletm/ABStudio/blob/main/LICENSE) file.
+