diff --git a/DLSiteDumperCS/DLSiteDumperCS.csproj b/DLSiteDumperCS/DLSiteDumperCS.csproj
index 4c38169..6c8463f 100644
--- a/DLSiteDumperCS/DLSiteDumperCS.csproj
+++ b/DLSiteDumperCS/DLSiteDumperCS.csproj
@@ -12,6 +12,7 @@
512
true
true
+ false
publish\
true
Disk
@@ -24,7 +25,6 @@
true
0
1.1.0.%2a
- false
false
true
@@ -47,6 +47,9 @@
prompt
4
+
+ dldump_icon_kr9_icon.ico
+
@@ -99,6 +102,7 @@
True
Resources.resx
+ True
PublicResXFileCodeGenerator
@@ -135,5 +139,9 @@
false
+
+
+
+
\ No newline at end of file
diff --git a/DLSiteDumperCS/MainForm.Designer.cs b/DLSiteDumperCS/MainForm.Designer.cs
index c854222..0218a1a 100644
--- a/DLSiteDumperCS/MainForm.Designer.cs
+++ b/DLSiteDumperCS/MainForm.Designer.cs
@@ -67,8 +67,9 @@ private void InitializeComponent( )
this.label14 = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
this.groupBox3 = new System.Windows.Forms.GroupBox();
- this.label16 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
+ this.label16 = new System.Windows.Forms.Label();
+ this.label18 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.startPageInput)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.betweenPageDelay)).BeginInit();
this.groupBox1.SuspendLayout();
@@ -237,8 +238,9 @@ private void InitializeComponent( )
this.imageExtSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.imageExtSelect.FormattingEnabled = true;
this.imageExtSelect.Items.AddRange(new object[] {
- "png",
- "jpg"});
+ "jpg 80%",
+ "jpg 50%",
+ "png"});
this.imageExtSelect.Location = new System.Drawing.Point(150, 139);
this.imageExtSelect.Name = "imageExtSelect";
this.imageExtSelect.Size = new System.Drawing.Size(74, 21);
@@ -340,7 +342,7 @@ private void InitializeComponent( )
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(19, 138);
this.label13.Name = "label13";
- this.label13.Size = new System.Drawing.Size(349, 52);
+ this.label13.Size = new System.Drawing.Size(343, 52);
this.label13.TabIndex = 10;
this.label13.Text = resources.GetString("label13.Text");
//
@@ -409,13 +411,12 @@ private void InitializeComponent( )
//
// linkLabel2
//
- this.linkLabel2.AutoSize = true;
this.linkLabel2.Location = new System.Drawing.Point(13, 478);
this.linkLabel2.Name = "linkLabel2";
- this.linkLabel2.Size = new System.Drawing.Size(274, 13);
+ this.linkLabel2.Size = new System.Drawing.Size(349, 33);
this.linkLabel2.TabIndex = 12;
this.linkLabel2.TabStop = true;
- this.linkLabel2.Text = "https://forums.e-hentai.org/index.php?showtopic=92167";
+ this.linkLabel2.Text = "https://forums.e-hentai.org/index.php?s=&showtopic=92167&view=findpost&p=5878056";
this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OpenUrlFromLinkLabel);
//
// linkLabel3
@@ -431,6 +432,7 @@ private void InitializeComponent( )
//
// groupBox2
//
+ this.groupBox2.Controls.Add(this.label18);
this.groupBox2.Controls.Add(this.label2);
this.groupBox2.Controls.Add(this.linkLabel4);
this.groupBox2.Controls.Add(this.linkLabel3);
@@ -503,6 +505,16 @@ private void InitializeComponent( )
this.groupBox3.TabIndex = 14;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Dumper";
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Location = new System.Drawing.Point(15, 169);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(248, 26);
+ this.label17.TabIndex = 14;
+ this.label17.Text = "jpg 50% quality makes 2x smaller file for B&&W page.\r\n10x smaller for color page " +
+ "vs PNG!";
//
// label16
//
@@ -513,14 +525,13 @@ private void InitializeComponent( )
this.label16.TabIndex = 13;
this.label16.Text = "Viewer PID";
//
- // label17
+ // label18
//
- this.label17.AutoSize = true;
- this.label17.Location = new System.Drawing.Point(15, 169);
- this.label17.Name = "label17";
- this.label17.Size = new System.Drawing.Size(192, 26);
- this.label17.TabIndex = 14;
- this.label17.Text = "jpg makes 2x smaller file for B&&W page.\r\n10x smaller for color page!";
+ this.label18.Image = global::DLSiteDumperCS.Properties.Resources.dldump_icon;
+ this.label18.Location = new System.Drawing.Point(287, 16);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(81, 74);
+ this.label18.TabIndex = 15;
//
// MainForm
//
@@ -531,11 +542,12 @@ private void InitializeComponent( )
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.label1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "MainForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
- this.Text = "DLSite viewer dumper | by K.G. & typcn | C#GUI by Wappen | V1.1";
+ this.Text = "DLSite viewer dumper | by K.G. & typcn | C#GUI by Wappen ";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.startPageInput)).EndInit();
@@ -593,6 +605,7 @@ private void InitializeComponent( )
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Label label18;
}
}
diff --git a/DLSiteDumperCS/MainForm.cs b/DLSiteDumperCS/MainForm.cs
index 20d250d..36f1343 100644
--- a/DLSiteDumperCS/MainForm.cs
+++ b/DLSiteDumperCS/MainForm.cs
@@ -13,10 +13,11 @@ namespace DLSiteDumperCS
{
public partial class MainForm : Form
{
- const string DefaultExt = "jpg";
-
ViewerDumper m_Vd;
- string m_UsingImageExt;
+
+ OutputFormat UsingOutputImageFormat => (OutputFormat)imageExtSelect.SelectedIndex;
+
+ string UsingImageExt => Helper.GetOutputExt( UsingOutputImageFormat );
public MainForm( )
{
@@ -29,13 +30,14 @@ public MainForm( )
private void Form1_Load( object sender, EventArgs e )
{
+ this.Text += $"| V {Application.ProductVersion}";
+
// Auto detect PID on load
int foundPid = _AutoDetectProcess( );
pidTextBox.Text = foundPid.ToString( );
- // Select PNG on start
- imageExtSelect.SelectedIndex = imageExtSelect.FindString( DefaultExt );
- m_UsingImageExt = DefaultExt;
+ // Select default ext on start
+ imageExtSelect.SelectedIndex = (int)OutputFormat.Jpeg50;
// Auto pick some save path
string initialSave = Environment.GetFolderPath( Environment.SpecialFolder.MyDocuments );
@@ -97,12 +99,12 @@ void Dump( bool isBatch )
// Resetup if PID changed
if( m_Vd.TargetPid != pid )
- m_Vd.Setup( pid );
+ m_Vd.SetupTargetPid( pid );
m_Vd.BasePageOffset = (int)startPageInput.Value;
m_Vd.BaseSavePath = savePathTextBox.Text;
- m_Vd.TargetImageExt = m_UsingImageExt;
m_Vd.BetweenPageDelayMs = (int)betweenPageDelay.Value;
+ m_Vd.SetupOutputEncoder( UsingOutputImageFormat );
if( !m_Vd.IsReady )
{
@@ -156,12 +158,12 @@ private void autoDetectPidButton_Click( object sender, EventArgs e )
private void browseButton_Click( object sender, EventArgs e )
{
- string forecastFilename = ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, m_UsingImageExt );
+ string forecastFilename = ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, UsingImageExt );
var sfd = new SaveFileDialog( );
sfd.InitialDirectory = savePathTextBox.Text;
sfd.FileName = forecastFilename;
- sfd.DefaultExt = m_UsingImageExt;
+ sfd.DefaultExt = UsingImageExt;
sfd.Filter = "Image file|*.*";
sfd.ValidateNames = false;
sfd.CheckFileExists = false;
@@ -182,7 +184,6 @@ private void savePathTextBox_TextChanged( object sender, EventArgs e )
private void imageExtSelect_SelectedIndexChanged( object sender, EventArgs e )
{
- m_UsingImageExt = imageExtSelect.Text;
_UpdateEffectivePath( );
}
@@ -193,7 +194,7 @@ private void startPageInput_ValueChanged( object sender, EventArgs e )
private void _UpdateEffectivePath( )
{
- effectivePathTextBox.Text = Path.Combine( savePathTextBox.Text, ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, m_UsingImageExt ) );
+ effectivePathTextBox.Text = Path.Combine( savePathTextBox.Text, ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, UsingImageExt ) );
}
private void OpenUrlFromLinkLabel( object sender, LinkLabelLinkClickedEventArgs e )
@@ -267,7 +268,8 @@ private void BackgroundWorker1_ProgressChanged( object sender, ProgressChangedEv
private void BackgroundWorker1_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e )
{
- m_Popup.Close( );
+ m_Popup.Close( ); // Note: this will dispose, so also set null, credit to ntsa (https://forums.e-hentai.org/index.php?showuser=189943) for this finding
+ m_Popup = null;
if( e.Cancelled )
InfoMsg( "User cancelled operation. Are you joking to me?" );
@@ -326,4 +328,26 @@ private void genHtmlButton_Click( object sender, EventArgs e )
}
+ // Choice order in imageExtSelect must be by this
+ enum OutputFormat
+ {
+ Jpeg80,
+ Jpeg50,
+ Png
+ }
+
+ static class Helper
+ {
+ public static string GetOutputExt( OutputFormat f )
+ {
+ switch( f )
+ {
+ case OutputFormat.Jpeg80: // JPG 80%
+ case OutputFormat.Jpeg50: // JPG 50%
+ return "jpg";
+ default:
+ return "png";
+ }
+ }
+ }
}
diff --git a/DLSiteDumperCS/MainForm.resx b/DLSiteDumperCS/MainForm.resx
index b0377e2..0a68728 100644
--- a/DLSiteDumperCS/MainForm.resx
+++ b/DLSiteDumperCS/MainForm.resx
@@ -130,7 +130,7 @@ So adjust starting page number in the box below to get the right filename.If image zoom is 45% or below, you get multiple images per row.
- 45% is recommended for dual page view
- 30% for 3 pages per row
-Specify that you want Left2Right (Comic) reading or Right2Left (Manga)?
+Specify that you want Left-Right (Comic) reading or Right-Left (Manga)?
This will create a reader HTML inside your specified folder.
@@ -140,4 +140,584 @@ Here is what it will do:
- Generate a reader html named "_reader.html"
(under score for filename to appear first)
+
+
+
+ AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
+ IACoJQAA7h4AAEBAAAABACAAKEIAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAA
+ AAAAAAAA7N/UEtvHs4nUuqDP07mez9K4n8/SuJ/P0rifz9K4n8/SuJ/P0rifz9K4ns/VvafP18Kvz9S8
+ o8nbx7Rn8ejhBdnEr3LZwKj43czI/9/Q0f/s2cb/7djC/+/bxf/u2cP/7dfC/+zWwf/v28P/y8Dc/6mi
+ 6f/n0br/1byj7dnEr1PTuqHH59G3/5GN9P9cXP//vrjv/9rQ5f+bl/b/yMHu/+fa3v/25dP/2M/p/7y4
+ 9f+Vkvb/9OTV/+HJrv/UvKS80redz+bQt/+Sj/T/s7D3/4uK+/+Skfz/rKv8/1hY//+mpPj/oJ73/5+d
+ +v+amfr/a2r9/5KQ+f+8sNb/2MGnz9G2m8/izLb/i4n4/8zJ8v+Kif3/iYj8/+jg5/9ubfz/d3f+/1xc
+ /v9jYv7/s7H3/5KR/f/X1fv/gn/z/9jHvc/RtZrP3si1/3Z0+f+Afvv/sa73/8XB8//q4eP/qab3/4qI
+ +f+Ni/j/a2r8/9zX7/+IiPz/r67+/4+K7f/ZxrfP0LWaz9/Hr//k2+T/0sHL/+TOuv/mz7b/48qx/+3f
+ 0v/p2Mj/4824/9zKw//m0b3/ubDj/6un9P/Tv7n/1buhz9C1m8/exq//8uXY/+TJq//gw6X/38Km/97C
+ pv/r28n/59G8/97Cpf/fw6b/38Km/+fRuP/16tz/2r6j/9O5oM/RtZvP38iw//Pq4v/IvNr/1cPI/+HH
+ q//hyLL/697W/+vYwf/jyKn/4MWp/9/Eqf/lz7n/8ufc/9q/pf/TuaHP0babz+HLsv/EwPP/paP4/4eF
+ +P/gzcP/v7PZ/3p5/P+loO7/tqzf/93Kw//hx6z/5tG8//Po3v/awaf/07qhz9G2nM/izbX/mpf2/9PH
+ 2v+RjPH/v7Xc/7Sr4P+bmv3/xr7n/7Or4v/czMv/4sqw/+fTv//z6d//28Kq/9O6oc/RtpzP5M+3/4qI
+ 9/+6s+f/lJDy/7+24f/Nw9z/m5r8//Tp2P/q1r//5dC6/+TPuv/q2sr/9Ovj/9vDrP/TuqHP0bedz+PO
+ tv+gnPP/jIv9/5GQ+//s5+v/3djt/4yM/P/x6ub/9Ozk//Pr4//z6+P/9O3l/+/k2f/axKz/07qhz9K5
+ oM3gy7P/n5rw/4SC9//Uytv/6dnI/+TWzf+9t+r/49PI/+bUw//o2Mn/59fH/+XUw//k0b//2MGq/9S7
+ pMfXwauJ1L2l+tvMwv/h0ML/4M24/97Kt//ey7j/4c+7/9/LuP/ey7j/3su3/97LuP/ey7j/28ay/9O7
+ ovjZxK9y49LDE9fBq5fPtJnRzbKWz82yl8/NspfPzbKXz82yls/NspfPzbKXz82yl8/NspfPzbKWz8+2
+ nM/bxrKJ697SEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAASCwAAEgsAAAAAAAAAAAAA7uLXAPLn
+ 3hLj0sJz18CrsdK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5
+ oLDTu6Gw17+ksNO6orHbxbGn5tbHSfz29AP06uMA+O/qB+DOvZbTuqH807id/9i+pP/XvqT/172k/9e9
+ pP/XvaT/172k/9e9pP/XvaT/172k/9e9pP/XvaT/172k/9i+pP/Zxrz/zcHT/9rDrv/QtZr/1Lyl6+DN
+ vF3///8A4M++StO5oe7cxKr/6t3Y/+bd6P/z6OL/+OjX//Xi0P/249D/+ujS//jm0f/14s//9eLP//Xi
+ 0P/14tD/9uPQ//vq1f+zsPX/XFz///Tn3//s1sH/1Lqf/9O7o9rj0cEo2MKtptO4nf/w28L/vLfy/zY3
+ //9aWv//v7v1//np0//u4uH/t7L0/9LM7v/16eL/8uTc//Thy//14sv/7uLe/+Da7//RzfP/YWH+//Tn
+ 3f/04Mr/5c62/8+0mP/dyLWM07qisNW6n//w28H/savw/yws//+bmvz/X1/+/+Da7v+Eg/r/XFz//1lZ
+ //+Dg///rar1//Dl3//e1uf/2NPx/2Vl/v/Oy/T/Vlb+/8G88P/k2uL/7dzJ/9G1mf/ZxK+w07qhsNS5
+ nf/u2L//r6vz/39+/f/++e7/bm79/7Gw/P9qav7/6ef5/7a1/P8lJf//gYD9/8/N+v9ISf//0M75/19e
+ /v/Myvj/Pj7//25u//9jY///lpT2/9rFsP/Zwq2w07qhsNO2mv/t2L//q6n3/4KB/P//+u//dHT9/5SV
+ //90c/7/+/Pn/8jD8v9ISP//YmL+/8HA/P8qKv//iIj//25t/f/Y1vn/YmL///f2/P/T0fr/UVL//8m9
+ 0v/eybGw07qhsNK1mP/r2MP/bGv8/3l3+v/a1e7/aGf+/62t/v90c/z/9ejY/8S/7f9iY///Wlr//1hY
+ //9WVv//LS7//4OB+P/t5ur/WVn//9TT/P/6+Pb/Y2P//7mv2P/hzLOw07mhsNG0l//p1b//iIb6/z9A
+ //9nZ///q6r6/+3q9P/Tz/T/+PDn/9jT7/+pqfz/urj5/3Z1+v/OzPj/UFD//7m3+f/99+7/b27+/6+v
+ //+Kiv//amn8/9XFw//bxq+w07mhsNG0lv/kzbb/8evt/9XM4//bzdP/6tbA/+fRuv/o0bn/48qx/+XN
+ tv/17OL/7+DP/+nTvP/o07z/39HT/+bUyP/q18L/ubPu/25u/v+Qj/v/3M7R/9G1mP/Zw66w07mhsNG0
+ l//jzLX/9u7m/+rVvv/gw6b/38Km/9/Cpv/fwqb/38Km/+DFqv/x5tr/6dbD/97Cpf/fwqb/4MSm/9/D
+ pv/fw6b/5s6z//Hp5f/16+H/38Wp/86wk//ZxK+w07mhsNG0l//jzLX/9u7m/+fTvv/fw6b/38On/9/D
+ p//fw6f/38On/+DFq//x5tv/6dfE/9/Dp//fw6f/38On/9/Dp//fw6f/38Oo//Dk2P/y59z/3cKo/86x
+ lP/Zw6+w07mhsNG0mP/kzbf/9u7n/+3dzf/j08z/59O9/+HGq//fxKn/38Sp/+TKrv/06dz/6tfF/9/D
+ qP/fxKn/38Sp/9/Eqf/fxKn/4MWq//Hl2f/y593/3sSq/86xlP/Zw6+w07qhsNG1mP/kz7j/+fPs/8rI
+ +f9ub///k5D4/+TUzf/hx6v/5dC+/8vC4v/Y1PL/7uLY/+nSt//o0LT/4smu/+DGrP/gxqz/4cet//Hm
+ 2v/z6N7/38Ws/86ylf/Zw6+w07qhsNK2mf/o1Lv/xcL0/5OS/P/X0e//X1/+/6un8P/o0bb/39HS/01N
+ //9MTf//c3P+/5WS9P+emfL/3M/X/+PKsP/hyK7/4cmv//Lm2//z6d//38eu/86ylf/Zw6+w07qhsNK2
+ mv/q1r3/r6z2/4F/9//04sf/qaTw/25u/f/q2cn/3dDT/15e///T0vv/xsLy/5aT8v+ZlvT/1s3j/+XO
+ tf/iybH/4sqy//Ln3f/z6eD/4Miw/86ylv/Zw66w07qhsNK2m//q17//r6z2/3Ny+//v38v/vbfp/0VF
+ ///g09T/59jO/2Rj/v+9vPv/8+XP/+nUuv/p1br/5c+3/+LLs//iyrP/4suz//Lo3f/z6uH/4Mmy/86y
+ lv/Zw66w07qhsNK3nP/q2MH/sK32/zk5///p4N7/rqnu/2xs/f/r3dH/7t/K/4GA+f+ysv3/+fHk/+nZ
+ yf/l0r7/5M+6/+TOuf/k0Lz/5tPA//Ts5P/z6+L/4Mq0/86zl//Zw66w07qhsNK3nf/n1cD/0s7x/1FR
+ ///h3/j/dnX8/7Gw/P/59Or//Pjw/4WE/v+bm/3//Pjw//j08P/38uz/9e3m//Ts5P/17+j/9/Ls//r2
+ 8//x5tz/4Mu1/86zl//Zw66w07qhsNK4nv/l0bz/ysXs/zQ1//9mZ///fn38/+3m5//x593/8eXX/7az
+ 8v9wb/z/7d/R/+nay//u4tf/8efe//Ho3//v5dv/7eHV/+rbzf/m08L/4Mq1/86zmP/Zw66w1r+osNC2
+ nP/k0bv/w77r/11d//+/uu//6t7V/+XUwf/j0b7/5NG+/+HW2v/OyOv/59fH/+PPvf/j0L3/49G//+TR
+ v//j0L7/49C9/+PQvf/j0L7/3ci0/86yl//cx7Om38u5ctG3nvrWwKr/5dfK/+fe2//o2Mb/4tG//+LR
+ v//i0cD/4tHA/+TSwf/m1cL/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRv//fzLr/0rqh/9K4
+ n+7hz71K69zREtnDr53Qt5790rmg/9W9pf/UvaX/1L2m/9S9pv/Uvab/1L2m/9S9pv/Uvab/1L2m/9S9
+ pv/Uvab/1L2m/9S9pv/Uvab/1L2m/9S8pf/Qt53/0rmh/ODNvJb37+oH5dXGAOjZzBbey7iSzbOYssir
+ jbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmr
+ jrDSuaGx4tHBc/Hl3RLu4dcAgAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAKAAAACAA
+ AABAAAAAAQAgAAAAAAAAEAAAEgsAABILAAAAAAAAAAAAAAAAAADw5dsA9OvjDenazVjey7mR2MGsj9fB
+ q4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fB
+ q4/XwauP18Cqj9a/qI/XwKqP2cOukOPSwoPs39Qo+vPwA/Tq4wAAAAAA7uHXAPLn3hfm1sel18Cp886z
+ mP/NsJX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82x
+ lf/NsZX/zbGV/82xlf/Uu6H/3sqy/9O6of/MsJX/0bed/dvHs9zm18lV////AOjZzQC3i2YA5NPEf9S8
+ pP/Os5b/2sGo/+XPuf/m0bv/5s+6/+XPuf/lz7r/5c+6/+XPuv/lz7n/5c+5/+XPuv/lz7r/5c+6/+XP
+ uv/lz7r/5c+6/+XPuv/lz7n/6NTA/9rT5v+VlPv/5Nvg/+LLtP/UuZ//zLCU/9fAq+nl1shK4tHBAOfZ
+ yyfWwKraz7OY/+TNtv/06N//5+Lx//Dr8f/78+n//O/e//jm1f/45dP/+ObU//ro1v/66Nb/+ObU//jl
+ 0//45dP/+OXU//jl1P/45dT/+OXT//nn1P/+8eD/k5L9/x4f///h2/L/+ujV//Dbx//ZwKb/zbGV/9nE
+ sLDu49kN4M68g9C2nP7ZvqT/8d7I/+Lc7/9BQf//S0v//21t/v+/vfr/+uzZ//TgzP/47eH/493w/+Pd
+ 8P/47eL/+uvZ//nq2P/04c3/89/K//Pfyv/25tT/8urs//ry6P/U0Pb/NDT//97Y7//2483/89/L/+rU
+ vv/QtZj/0rif8ubWx1fYwq2PzrKX/9/Grf/w3MX/3tjt/xsb//8XF///YGD//1hY///k3u//9+zf/6em
+ +/8xMf//MDH//6qp/f+8u/z/u7n4//Xm1P/15dH/9+jT//Do6P9vcP//srD5/+Hd8v84OP//4Nrw//rs
+ 1//z4cz/7tnC/9e9ov/Nspb/49HBj9fAqo/Ospb/38Ws/+7Ywf/d1uz/KCj//6Wj+//y7/T/TU3//4iG
+ +//n4/P/MzP//6Kh/v+lpf3/PT3//1ZX//98e/3///jo/7u4+P+wr/n/+vXv/25u/f98evv/49/y/ykp
+ //9qav3/hoX8/9LO8//r4uX/3sev/82xlf/iz7+P2MGqj86ylv/dwqj/7dnC/93Y8f84OP//39v1///3
+ 6f96ev7/fn7//7Ky/v9ZWf//8e/4///99/94eP//Dg7//1FR///39fv/fn3+/yIi///m5Pn/cnH9/3x7
+ /f/l4vf/KSn//2xs//90df//OTn//15f///i2Nj/0LWa/+HPvo/YwaqPzrGV/9u/pP/s2ML/3tr1/zg4
+ ///f3fn///3y/3p6/v+AgP//gID//3p6/v/++vD//ffs/3x8/f9SUv//OTn//+Xj+v9/f/3/FRX//7+/
+ //80NP//sLD9/+Pi+/84OP//4uL9///+/P/Nzfz/Li7//6uo9f/cx6//4c68j9fBqo/NsZT/2b2h/+/e
+ yP+urfv/KCj//93X7P/78uP/dHP+/4uL//9/f///enn8//Tl0f/05dH/e3r8/2Ji//84OP//o6P+/2Fh
+ //8vL///YGD//zk5///e2fD/4t3v/zIz//+vrv7///74//768v9ycv7/eHf5/+HOt//gzbyP18Cqj82x
+ lP/YvJ//8eDK/318/f8UFP//ycf3/6Kg+v84OP//3tz7/4uK/v+IiP3/+vHk//z26v96ev7/fHz//4OD
+ //8tLf//Ojr//5iY//8VFf//KSn//+Hc7//68uj/cHD//3t7//////z/6Ob5/0lJ//+Eg/n/4M21/+DN
+ vI/XwKqPzbCU/9i7nv/t28X/srH6/ygo//8zM///WFj//7Sz/P/79/T/7er2/+zo8//38Oj/+O/l/7q4
+ +P+9vf3/5+T3/4SD+/+ysPn/8O33/1dY//+AgP///Pj0///68f97ev7/bW3//9zc//9RUv//U1T//9rS
+ 4f/UvKL/4c69j9fAqo/NsJP/17ud/+bQuv/28e7/4t7z/9fP5v/n3N7/793H/+jTv//o1L//59G7/+TM
+ tP/hyK7/7NrF//r17P/w49T/7drC/+vXv//p1b//5tze/+Xb3v/p1sL/7t3J/7279v9ZWf//PT3//39/
+ /v/g2Of/28Km/8ywlP/iz7+P18Cqj82wk//Xup3/5c+4//fv6f/z5tj/5Mqv/+HFqf/fwqb/38Km/9/C
+ pv/fwqb/38Om/9/Cpv/jy7P/9e7l/+zbyv/fw6b/38Km/9/Cpv/hxqn/4cap/9/Cpv/gxKn/6ta+/+jg
+ 5P/j4vv/9e3k/+TMs//StZf/zbGV/+LPv4/XwKqPzbCU/9e6nv/lz7j/9u/p//Dj1v/gxav/38Om/9/D
+ p//fw6f/38On/9/Dp//fw6f/38Om/+PMs//27ub/7NvK/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//ewqX/6NO9//v38f/v4dT/38Sp/9K1mP/NsZX/4s+/j9fAqo/NsJT/17ue/+XPuf/28On/8OPX/+DF
+ q//ewqb/38On/9/DqP/fw6j/38Oo/9/DqP/fw6f/48y0//bu5v/s28v/38Oo/9/Dp//fw6j/38Oo/9/D
+ qP/fw6j/38Oo/9/Cp//m0bz/+fXw/+/i1P/gxav/0rWZ/82xlf/iz7+P18Cqj82wlP/Xu5//5dC6//fw
+ 6f/x5Nj/59G5/+zZwv/lzrX/38Sp/9/Eqf/fxKn/38Sp/9/Dp//jzLT/9u7m/+zczP/fxKr/38Sp/9/E
+ qf/fxKn/38Sp/9/Eqf/fxKn/38Oo/+fSvf/69fH/7+LV/+DGrP/Stpn/zbGV/+LPv4/XwaqPzbGU/9i8
+ oP/m0bv/+PDp//fx7f/SzfD/j477/9TP7//s28v/4ces/+DFqv/hx63/6dW+//Hizf/89u3/7+DP/+HG
+ rP/gxan/4MWq/+DFqv/gxav/4MWr/+DFq//gxar/59O///r18f/w49b/4ceu/9O3mv/NsZX/4s+/j9fB
+ qo/NsZT/2L2h/+fSvf/28e7/4N/+/3l6//9qav//Ojr//7Kw+P/s2sP/4Mar/+rXwP+8ufX/eHf8/66t
+ /f/h3O//8OLT/+/dxf/u3MX/5s+3/+HHrP/hx63/4cet/+HGrP/o1MD/+vXx//Dj1//hyK//07eb/82x
+ lf/iz7+P18Gqj82xlP/ZvqL/6dXA/+Dd8/9OTv//1dLz//nx6P97ev3/TU3//+jf4P/iya//793H/317
+ +/8tLf//NDT//z9A//9zc/3/eXj8/4SD/P/c1en/5tC4/+HIrv/hyK//4ceu/+jVwv/69fH/8OTY/+HJ
+ sf/TuJz/zbGV/+LPv4/XwaqPzbGV/9m+pP/q1sH/3dr0/zg5///Z0eb/7Ne//9LN8P8xMf//0c3x/+jS
+ u//v3sj/eXj8/3h3///p6Pv/1NL5/4SD+/94d/z/e3r8/8bE9v/r2MP/4siw/+LJsf/iyLD/6dbD//r2
+ 8v/w5Nn/4sqz/9S4nf/NsZX/4s+/j9fBqo/NsZX/2b+l/+rXw//d2vT/ODn//9nS6f/o0rn/5t3k/0JC
+ //+FhPv/797I/+/eyP+GhPv/TU3///Lx+v/06Nn/79/J//Dfyv/v38r/69nF/+PMtf/iyrL/4sqy/+LK
+ sv/p18T/+vby//Hl2f/izLT/1Lme/82xlf/iz7+P18Gqj82xlf/Zv6b/6tfE/97b9P8oKP//rav4/+/f
+ yP/d1ub/KCj//4aF+//v3sn/6NS9/9HN8f80Nf//4N/7//Dj1P/izLX/4cqz/+HKsv/iyrP/4suz/+LL
+ s//iy7P/4sqz/+nXxf/69vL/8eXa/+LMtv/UuZ7/zbGV/+LPv4/XwaqPzbGV/9nAp//q2MX/39z1/xcX
+ //98e/z/9enV/9rU6/81Nf//0c7z/+rZxv/p18P/2tXt/zg4///h4P3/+vXu/+/j1//o18b/5dK//+TQ
+ u//kzrn/5M+7/+XRvf/l0r//7N7R//v49f/x5tv/4s23/9S6n//NsZX/4s+/j9fBqo/NsZb/2cGp/+jX
+ xf/u6vH/Skr//3x8/v////T/oqH8/1la///u6/T/9e3k//n17v/g3/v/NDT//9bV/f/9+vX/+/j2//r2
+ 8//28Or/9Ovi//Lo3v/z6eD/9e3m//fx6//69/P//Pr4//Dl2f/izrn/1Lqg/82xlf/iz7+P18Gqj82x
+ lv/Zwar/5NG+//bv5v9ycv//b2///6en//8pKf//s7P9//369P/49PD/9/Hq/+7q8v9MTP//hYT8//Tp
+ 2v/t4dX/8+vj//fx7f/59PH/+fXy//n18P/38+7/9vDq//Pr4//v49n/6NbG/+LNuf/Uu6H/zbGV/+LP
+ v4/YwauPzbGW/9nCq//m0r7/3dfq/yQk//8YGf//WVn//7Ox+v/y6N3/6drM/+jYyP/l08L/8eXU/4iH
+ /P+Hhvz/7+HP/+PPvP/l0sH/5tXE/+jYyf/p2sz/6NnJ/+bVxf/m1MP/5dLA/+PQvv/jz7z/4s26/9S6
+ of/NsZX/4tC/j9zItI/Os5j/1b2l/+PRvv/n4Ob/ZGX//6Gg+//r5ej/7uHQ/+TSwP/j0L7/49C+/+PQ
+ vf/n18b/5t7m/+bf5v/n18b/49C+/+PQvv/j0L7/49C+/+PQvv/j0L7/49C+/+PQvv/j0L7/49C+/+PR
+ vv/gzbn/0Lab/8+0mv7k1MWD5NTFV9S8pPLOtJr/28iz/+fZyf/s5ef/7ePa/+XUw//j0cD/49LA/+PS
+ wf/j0sH/49LB/+PSwf/l1ML/5dTC/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS
+ wf/j0sD/4M+9/9fAqv/MsJT/18Cq2ujZyyfw5NsN3su5pc+1m//PtZv/18Ks/93Kt//dyrf/3cm2/93J
+ tv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93J
+ tv/dybb/3cm2/9rHsv/UvaX/zLCU/9O7o//j08N/r4hgAOLRwQDl1sgW3cm2qdO7o/7Nspb/zbGW/82y
+ lv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82y
+ lv/Nspb/zbKW/82ylv/Nspb/zLGV/860mf/XwKrz5dTFpfDl3Bfs39QAAAAAAOrd0QDs4NUc4tLCg9C2
+ nJDIq4yPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iq
+ jI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/JrI+P2MKskefZy1j06uMN7+TbAAAAAADAAAADgAAAA4AA
+ AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABwAAAAygA
+ AAAwAAAAYAAAAAEAIAAAAAAAACQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AO7i
+ 1zfm1shM3827S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97L
+ uEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97L
+ uEvey7hL3su4S97LuEvey7lL5NHBS+ze00Tv5doG7uLXAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APDl
+ 2wDx590i697Rf+PSwdzaxLD/07uk/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5
+ oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5
+ oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaH+18Cq/uDOvPPm18mN7+PaP+/j2gD///8AAAAAAAAA
+ AAAAAAAA7eHVAPLo4Bzq3dC/3Mi1/86zmf/KrI//yauP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qs
+ j//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qs
+ j//KrI//yqyP/8qsj//KrI//yq2Q/9S8pP/j0br/3cmy/82yl//Jq47/yayO/8yvk//Vvab/49LD3erd
+ 0T7s3tIA6NnNAAAAAAAAAAAA////AOrc0K3Yw63/zbGV/8uukf/Rtpv/2sGp/+DIsf/hybL/4Mmy/+HJ
+ sv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJ
+ sv/hybL/4cmy/+HJsv/hybL/4cmy/+DJsv/hybP/59TC//Tw7v+9vfz/2tn6/+/h0//dxa3/1Lqf/8yw
+ k//JrI//0Lac/97LuePq3dFA3Me0AAAAAADp3M8A6dzPQNzHtODNspf/zrKW/9vCqP/q1cH/8+PU//bo
+ 2f/25tf/9ufY//Xj0v/14tD/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi
+ 0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Ti0P/15NT//Pbw/5eX//8CAv//f3/////6
+ 7P/04dD/7trG/+HJsv/RtZn/yqyP/9K5of/i0cG6////AP///wA1AAAA4dC/itG3nv/Mr5L/28Go/+7Z
+ xf/67eH/8/H5/+vp+v/39vn/9PP5///56//+8+T/+ura//nm1P/55tT/+ebU//nm1P/559X/+efV//nn
+ 1f/55tT/+ebT//nm0//55tP/+ebU//nm1P/55tT/+ebU//nm1P/55tT/+ebU//nm1P/56dn//fj0/05O
+ //8AAP//f3/////77f/559X/+OXS//Lfy//jzLT/z7OW/8qtkP/Vvqjy59jLXefYywDp2s1E3cm288uv
+ k//Ttpv/5s+4//PfzP//+er/ior//yEh//98fP//aWn//729/v/NzP7/+/Ps//Xiz//04Mz/9eHN//ns
+ 3v//+ev///rr///56//57N7/9eLP//bk0v/25NL/9eHN//TgzP/04cz/9OHM//TgzP/04cz/9+jZ//32
+ 6f/67uD/+/Lp/9vb/v8NDf//f3/////56v/14s7/9OHM//TgzP/u2cT/3MKp/8uukP/PtJr/38y5ofbu
+ 6A/iz75L1b6n/suukf/Zv6T/6tW+//Heyf//+Oj/gID//wAA//8AAP//AAD//wAA//9FRf///fv4//Xm
+ 1//x3cj/9+vd//Py+v+Kiv//fn7//4qK///z8fr/+/Tr//v18P/79vH/9urd//HdyP/w3Mf/8NzH//Dc
+ x//05dX/+/j1/6yt///w7vr/+vLn/+fl9/8PD///f3/////36P/x3sn/8NzH//Dcx//w3Mb/5M21/8+z
+ l//KrI7/3ci0/u7i2EveyrhL0rmh/suukf/cw6n/6tS9/+7axP//9ub/gID//wAA//8BAf//aWn//66u
+ //8eHv//lpf///r28//26tv/8/H5/2pq//8HB///Dg7//wcH//9qav//9PT//3R0//9zdP//+vTu//De
+ yv/05NL/+u3b//Tl1P/78uP/rKz//xYW//9vcP///Pbw/+fk9v8PD///f3/////86v/67tz/9ujW/+/c
+ x//u2sT/5s+3/9O4nf/IqYv/2cKt/uzg1UveyrdL0rmg/syukf/cw6n/6NG6/+zXwf/+9eX/f3///wAA
+ //9qa///9fT5//Hw+/9BQf//Cgr//8C/+///++n/ior//wIC//9ra///6ur//2tr//8CAv//ior//0ZG
+ //9AQP//+/by//bq3f/r6Pj/urn9/+vq+f/68eb/8O/6/zg4//9AQf//+/Xv/+bj9f8REf//XFz//7++
+ /f+4t/3/3Nz8///66//88uL/6tjG/9S5nf/IqYv/2MKs/uzf00veyrdL0rmg/syukf/bwaf/58+3/+zX
+ wv//9+n/f3///w8P///p6P3/9+zg//316P+6uv//AAD//7q5/f////T/f3///w8P///p6Pz//fnz//b0
+ +/9lZf//Pz///yEh//9CQv///fv6///68P+6uf3/AAD//2hp///08fb/+vXv/0BA//9AQP//+/bw/+fk
+ 9v8WFv//AAD//wAA//8AAP//QED//4CA//+iov//+fTw/93Isv/Iqov/2MKs/uzf00veyrdL0rmg/syu
+ kP/av6T/5c20/+3Zxv///PD/f3///w8P///o5/v/+PHp//737P+6uv7/AAD//76+///U1P//IiL//4yN
+ ///7+vv/+/bw////+v+7u///AAD//w0N//8QEP//oqL/////+/+6uv7/AAD//xYW///p6P3/9PL7/zk5
+ //9AQP///fr3/+jm+v8REf//XFz//7+///+/v///ZWX//wgI//8PD///oqL///Dk0//KrZD/2MKs/uzf
+ 00veyrdL0rmg/sytkP/ZvaL/5Mqx/+zZxf///fL/f3///w8P///p6P7//fr3////+P+6uv//AAD//8DA
+ ///AwP//AAD//7q6//////j/+vbw///89P+6uv7/AQH//5eX//8SEv//f3//////9/+6uv7/AAD//xYW
+ ///w8P//i4v//wIC//9wcP////78/+no/f8PD///f3///////P////3/9PT9/9XU/v8PD///XV3//+3r
+ 9v/Ywar/2MKs/uzf00veyrdL0rmg/sutj//YvKD/4smu/+3byf////f/f3///w8P///o5vr/9ezi//z0
+ 6P+6uv7/AAD//8DA///AwP//AAD//7q6/v/78+b/7+DQ//nv3/+6uf3/AQH//6Wl//8UFP//f3//////
+ +P+6uv7/AAD//wgI//+env//f3///w8P///o5/z//Pfw/+jm+v8PD///f3///////P/9+/r//Pr2//X0
+ +v9oaP//AAD//7m4+//i0Ln/2MKs/uzf00veyrdL0rmg/sutj//Xu5//4ces//Tm1P/Ozf3/IiL//xQU
+ ///m4/X/8OLR//336v+srf//Cwv//8bG//+/v///AAD//7q5/f/159P/5c62//Xo1v+6uf3/AQH//6en
+ //8nJ///IiL//8DA//9BQf//XV3//zIy//9BQf//dHT//xAQ///m4/b/9Onc/+jl9f8iIv//IiL//87O
+ /v////r/+vby//336/+6uv7/AAH//7m4+//i0Ln/2MKs/uzf00veyrdL0rmg/sqtj//Wup7/4MWr//Xo
+ 1v+6uf3/AAD//xYW///p5/j///zw/8DA/v8WFv//dHT/////+v+7uv7/AAD//7q5/f/57+D/7+HT//z2
+ 6v+6uv7/AAD//729//+ysv//AQH//3l5//8NDf//f3///3d3//8ICP//Cgr//xUW///m4/b/8eTW//z2
+ 7v+trf//AAD//7q6/v////z//Pn3//v6+f+Ojv//AAD//7m4+//j0Ln/2MKs/uzf00veyrdL0rig/sqt
+ j//WuZ3/38Sp//Xn1f+6uf3/AAD//wsL//90dP//f3///yAg//8cHP//v7/////+9f/c3P3/gID//93c
+ /v///Pf//Pn3////+/+6uv//AQH//729///l5f//QED//wAA//8fH///wMD//+3t//8WFv//AAD//2ho
+ ///19Pv/+fPs///68f+6uv7/AAD//7q6//////7//////5eX//8FBf//QED//97c+v/cx7D/2MKs/uzf
+ 00veyrdL0rig/sqsj//WuZz/38So/+7ezf/v7vv/aGj//xER//8QEP//DxD//4uM///Q0P7//fv4//r2
+ 8v/8+fT////2//r17//17OT/8ufb//To2//q6Pj/urr+/+zr/f/++/L/3Nz7/7a1/P/MzPz//Pjz//r3
+ 9/+Ulf//Fhb//8DA/////fb/+fPu///78/+6uv7/AAD//6ur///y8v//lJT//wsL//89Pf//3d38/+ve
+ zf/Lr5P/2MKs/uzf00veyrdL0rif/sqsjv/WuZv/3sOo/+fTvv/48uz/9PT9/+bk+P/m4/X/5uL0//fx
+ 7v/059b/7NvL/+rYxv/q2Mf/6tjG/+jTwP/mz7r/48qx/+HHrf/q1sH/+fDh//z59P/x5dn/7t3J//Lh
+ y//w38r/6NTA/+3byf/28O3/5uL1//Pt7f/u3s//6dbD//Tm1v/My/z/RUX//x0d//8NDf//Jyf//1JT
+ ///i4vz/8OPS/9K3m//HqYr/2MKs/uzf00veyrdL0rif/sqsjv/VuZv/3sOn/+bSvP/17OX/+/j1//Hl
+ 1//p1cH/6NO9/+TMtP/fw6j/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//gxar/7N3M//r2
+ 8f/v4tT/4cet/9/Dp//fw6f/38On/9/DqP/kzLT/6NO9/+TMtP/fw6j/38On/+PLs//z6N3/+/f0/6Gi
+ //95ef//v7////769P/w49X/3cKo/9CylP/HqYv/2MKs/uzf00veyrdL0rif/sqsjv/VuJv/3sOn/+fS
+ vP/17OX/+vby/+zayf/gxqv/38Km/9/Dpv/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//gxar/7N3M//r28f/v4tT/4cet/9/Dp//fw6f/38On/9/Dp//fw6b/38Km/9/Dpv/fw6f/38On/9/D
+ p//hxqz/6NTA//nx4/////n//Pn3/+7f0v/iyK7/276i/9Czlf/HqYv/2MKs/uzf00veyrdL0rig/sqs
+ j//VuJz/3sOo/+fSvP/17OX/+vby/+zbyv/hxqz/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//gxar/7N3M//r28f/v4tT/4cet/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6b/38On/+nXxP/59fH/+fXx/+vZyP/gxav/276i/9Czlf/HqYv/2MKs/uzf
+ 00veyrdL0rig/sqsj//VuZz/3sOo/+fSvf/17eX/+vbz/+zbyv/hxqz/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//gxar/7N3N//r28f/v4tT/4ceu/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/+nWw//59fH/+fXx/+vayf/gxqv/276i/9Cz
+ lf/HqYv/2MKs/uzf00veyrdL0rig/sqsj//VuZz/3sOp/+bSvf/17eX/+vfz/+zbyv/hxq3/38On/9/D
+ p//fw6f/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/Dp//gxav/7N3N//r28f/v4tX/4civ/9/D
+ qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/+nWw//59fH/+fXx/+va
+ yv/gxqz/27+j/9Czlv/HqYv/2MKs/uzf00veyrdL0rig/sqsj//VuZ3/3sSq/+fTvv/17eX/+vfz/+zb
+ y//hyK7/4smw/+PLs//gxqz/38Oo/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/gxqz/7d3O//r2
+ 8f/v4tb/4smw/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/+nW
+ xP/69fH/+vXx/+vbyv/hx67/27+k/9Czlv/HqYv/2MKs/uzf00veyrdL0rig/sqsj//WuZ3/38Wq/+jU
+ v//27eX/+/fz/+7h0v/s3Mv/9e3k//fw6v/x5dj/5tC6/+DGrP/fxKn/38Wp/9/Fqf/fxKn/38Sp/9/E
+ qf/hx63/7d7O//r28f/v49b/4smx/+DEqf/fxKn/38Wp/9/Fqf/fxan/38Wp/9/Fqf/fxan/38Wp/9/F
+ qf/fxan/38Sp/+rXxP/69fH/+vXx/+zby//iyK7/28Cl/9Czl//HqYv/2MKs/uzf00veyrdL0rmg/sqt
+ j//Wup7/38ar/+jUwP/27ub/+/j0//j08//q6Pj/lJX//0pK///a2fz/8u7y/+7ey//hx63/4Mar/+DG
+ q//gxqv/5M62/+/eyv/y48//+fDj//369v/x5Nf/48uz/+DFqv/gxar/4MWq/+DFqv/gxqv/4Mar/+DG
+ q//gxqv/4Mar/+DGq//gxqv/4Mar/+rYxv/69fH/+vXx/+zczP/iybD/3MGm/9C0l//HqYv/2MKs/uzf
+ 00veyrdL0rmg/sqtj//Wu5//4Met/+jVwf/37+j///75//Pz/f9TU///Jyf//zw8//8REf//aGn//+7s
+ 9//q18P/4ces/+HHrP/jy7L/9Org/8zM/f+4t/z/urn9/+3s/v///O//9ena/+fSvf/kzbb/5c63/+TN
+ tv/iybD/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+rYxv/69fH/+vby/+zczf/iybH/3MKn/9G0
+ l//IqYv/2MKs/uzf00veyrdL0rmg/sqtj//Xu5//4Meu/+jWw//99+//v7///4mJ///Ozv//wMD///r6
+ //9oaP//AAD//7q6/v/47t//48uz/+HHrP/lzrf/9/Hr/0VF//8AAP//AAD//11d//9+fv//v7////34
+ 8P/38er/9/Hr//fx6v/x5Nf/48uz/+HHrf/hyK7/4ciu/+HIrv/hyK7/4cet/+rZx//69fH/+vby/+zc
+ zf/iyrL/3MOo/9G1mP/IqYv/2MKs/uzf00veyrdL0rmg/sqtj//Xu6D/4Mev/+jXxP///fH/f3///w8P
+ ///p5vj/9ena//ft3//Av/3/Cgr//0JC///s6fT/6NTA/+DHrf/lz7n/9/Hr/0FC//8xMf//aGj//wwM
+ //8ODv//Jyf//0FB//9AQP//P0D//01O///d3Pz/8eXY/+LKsv/hyK//4civ/+HIr//hyK//4civ/+rZ
+ yP/69fL/+vby/+zdzv/iy7P/3cOp/9G1mP/IqYv/2MKs/uzf00veyrdL0rmg/sqtj//XvKH/4ciw/+nX
+ xf///fL/f3///w8P///m4/X/6tfE/+jUwP/79/P/dHT//xAQ///n5fn/7d3M/+LIsP/lz7r/9/Hr/0BA
+ //9AQP//8/P9/+jn/f/t7Pz/lZX//zs8//9AQP//QED//z8///+Fhf//9+/p/+XOuf/iyLD/4smx/+LJ
+ sf/iybH/4smx/+vayf/69vL/+vby/+zdz//jzLX/3cSq/9G1mf/IqYv/2MKs/uzf00veyrdL0rmg/sqt
+ j//XvKH/4cmx/+nXxf///fL/f3///w8P///m4/b/6tfF/+LKs//68N//gID//wIC//+XmP//9u/n/+TN
+ t//l0Lr/9/Hs/0BA//8/P////v38//37+P/38en/9/Dp//fx7P/38ev/9/Hr//fx7P/28Or/7d7P/+PL
+ s//iybH/4sqy/+LKsv/iyrL/4smx/+vayf/69vL/+vby/+zez//jzLX/3cSr/9G1mf/IqYv/2MKs/uzf
+ 00veyrdL0rmg/sqtkP/XvKL/4cmy/+nYxv///fL/f3///w8P///m5Pf/69rI/+LLs//z59j/0tL//yUl
+ //9CQv//9/Ls/+XRu//l0Lv/9/Hr/1JS//8LC///oqL/////+v/x5tr/5tO//+XRvP/l0bz/5dG8/+XR
+ vP/l0Lv/48y0/+LLsv/iy7P/4suz/+LLs//iy7P/4suz/+vbyv/69vL/+vbz/+3f0P/jzbf/3cWs/9G1
+ mf/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaP/4cqz/+nYx////fL/f3///wgI//+9vf//9ezj/+XQ
+ uv/4797/jY3//wAA//9ERf//9/Ls/+XRvP/jzbX/8ujc/9va/v8NDf//f3//////+//w5tv/5M+5/+HK
+ sv/iyrP/4sqy/+LKsv/iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+vby//69vL/+vbz/+3f
+ 0f/jzrj/3cWt/9G1mv/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaT/4cq0/+nYyP///fL/gID//wAA
+ //9FRf//9/Ls/+bTwP/58OD/f3///wIC//+XmP//9u/o/+TQu//hyrT/6trI/+bj9v8PD///f3//////
+ /P/07OT/6dnI/+XRvf/jzbf/4sy1/+LLtf/iy7X/4su1/+LLtP/iy7X/4su1/+LLtf/iy7X/4su1/+vc
+ zf/69vL/+vbz/+3f0f/jzrj/3cWt/9G2mv/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaT/4cu1/+nZ
+ yf///fL/gID//wAA//9FRf//+PTv/+nayv/78+X/f3///w8P///n5fn/7uHU/+XSvv/m1ML/7+PV/+fl
+ +f8PD///f3///////v/8+vf/9/Ls//Dm2//q28v/59XE/+bTwP/l0b3/5M+7/+TPuv/k0Lz/5dG9/+bS
+ v//m1MH/59XE/+/j2P/7+Pb/+vfz/+3g0v/jz7r/3cav/9G2m//IqYv/2MKs/uzf00veyrdL0rmg/squ
+ kP/XvqX/4cy2/+nZyv/++/L/oqL//wgI//9DQ////Pv5//n07f/x8Pv/XV3//z09///u7fn/8+rg//Ho
+ 3f/17+j/+/j0/+np/v8PD///f3///////f/8+/j//fz6//z7+f/7+PX/9/Lt//Ts4//x59z/7+PW/+7h
+ 0//v49b/8ebc//Pq4f/17ub/9/Lt//v49v/+/f3/+vby/+3g0v/j0Lv/3cew/9G2m//IqYv/2MKs/uzf
+ 00veyrdL0rmg/squkf/Xv6b/4My3/+fWxf/z7OP//fz7/0BA//8/P//////+//f2/v9oaP//AAD//7u7
+ //////z/+/j2//v59v/7+ff//fr4/+no/v8SEv//Pz///9/f/f/48un/9e7n//j08P/6+PX/+/n3//z5
+ 9//7+Pb/+/j1//v49P/7+PX/+/j2//v59//7+vf/+vn1//r39P/59fL/9e3m/+rbzP/jz7v/3cix/9G3
+ m//IqYv/2MKs/uzf00veyrdL0rmg/squkf/Xv6f/4cu3/+TQvf/w5dr/8/L9/zo6//86Ov//6en//2dn
+ //8DA///aGj///Dv/f/7+PT/+PTw//fy7f/17uf/8+vj//n29v+Ojv//AAD//7q5/f/16dr/59XE/+vc
+ zv/v5dr/8+zl//bw6//48+7/+PXx//j18f/49PD/9/Pu//bx6//07+j/8urh/+/l2v/s39P/6NjI/+TR
+ v//jzrv/3siy/9G3nP/IqYv/2MKs/uzf00veyrdL0rmg/suukf/Xv6j/4cy4/+TQvf/58eL/ior//wAA
+ //8EBP//Dw///zAw//9xcf//9PP5//Pq3v/r3M//6tzO/+jYyP/m1MT/5dPC//Xr2/+6uf3/AAD//7q5
+ /f/z59f/4867/+TQvf/l0sH/5tTD/+bVxf/o2cr/6tzP/+rcz//q283/6NjJ/+fVxf/m1cT/5dTC/+XS
+ wP/k0b7/48+8/+POu//jz7z/3siz/9G2nP/HqYv/2MKt/uzf1EvfzLlL07ui/sqtkf/VvqX/4Mu3/+TR
+ v//68uT/gID//wAA//8iIv//f3///9zc/v/79u//7uPX/+XSwf/k0b//5NG//+PQvf/jz7z/48+8/+/i
+ 0v/b2/z/gID//9vb/P/v4tL/48+8/+PPvP/jz7z/48+8/+PPvP/j0b7/5NG//+TRv//k0b//49C+/+PP
+ vP/jz7z/48+8/+PPvP/jz7z/48+8/+PQvf/j0L3/3cey/8+0mv/Iqoz/2cSv/u3g1Uvj0sJL18Gr/sqt
+ kP/RuJ7/3cm1/+PRv//x59z/3Nv9/01N//+8vP///frw//Hn3P/m1sf/5NLA/+PQvv/j0b7/49G+/+PR
+ v//j0b//49G+/+XUw//x59z/+vPl//Hn3P/l1MP/49G+/+PRv//j0b//49G//+PRv//j0b7/49G+/+PR
+ vv/j0b7/49G+/+PRv//j0b//49G//+PRv//j0b//49G//+PRv//iz73/2cKs/8yvk//KrZH/3cm28+7j
+ 2UTq3dI138y63M2xlv/MsZb/18Gr/+DOu//k1MT/9Ozi//Du+P/38ev/59jJ/+PSwf/j0cD/49HA/+PR
+ wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0sH/5NPC/+PSwf/j0cD/49HA/+PRwP/j0cD/49HA/+PR
+ wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+HQvv/cyLT/0bie/8mt
+ j//SuaD/4c+9ihMAAADl1ccA5tbHf9fAqv/Lr5P/z7ac/9jDrf/ezbr/49PD/+jbzf/l1sf/4tHA/+LR
+ wP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LR
+ wP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/h0b//4M+9/9vI
+ s//SuqL/y66S/82yl//bxrLg6tzPQOrczwDs3tMA7N/UIuHPv8HRuJ//yq6S/82yl//TvKT/2MOu/9rG
+ sv/bxrP/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vH
+ s//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vH
+ s//ZxbD/1b+o/8+2nP/KrpH/yq6R/9jDrf/q3NCt////AAAAAAAAAAAA4M69AObYyxzfzby/1b6n/8yw
+ lf/Lr5P/zbKX/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860
+ mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860
+ mf/OtJn/zrSZ/860mf/Ospj/y7CU/8uvkv/PtZv/3cm2/+nazb/x5t4c6tzPAAAAAAAAAAAA////AOfY
+ ygDo2csf5dbHvtzItf/Qtpz+yq2Q/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sir
+ jf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sir
+ jf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Jq47+zLGW/tfBq//i0cDc6tzQf/Hm3iLw5NsA////AAAA
+ AAAAAAAAAAAAAAAAAADv5dwA7+XcJeXWx03Tu6RLyq6RS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iq
+ jEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iq
+ jEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqo1Lz7SaS9/Nukzt4dY3////AAAA
+ AAAAAAAAAAAAAAAAAAD4AAAAAB8AAOAAAAAADwAAwAAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAAB
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAADAADAAAAAAAMAAOAAAAAABwAA8AAAAAAfAAAoAAAAQAAAAIAAAAABACAAAAAAAABA
+ AAASCwAAEgsAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wDt4NX/5NTF/9/Muv/cyLX/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI
+ tP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI
+ tP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI
+ tP/cyLX/3sq3/+XTxP/s39P/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////APDl2//m1sf/28Ww/9G3nv/LrpP/yKqN/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqN/8qsj//Rt53/2cOu/+PSwv/v49r/////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////APDl2//fzLr/0Lad/8iqjP/Iqoz/yKuN/8mrj//JrI//yayP/8ms
+ j//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8ms
+ j//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8ms
+ j//JrI//yayP/8msj//Xwqz/5NXH/+TVx//Xwqz/yayP/8msjv/Iq43/yKqM/8iqjP/MsJT/2sWx/+zf
+ 1P////8A////AP///wD///8A////AP///wD///8A////APDk2//axbH/z7Wa/8qtkP/Iq43/zK+S/9O4
+ nv/awan/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97F
+ rv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97F
+ rv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/n1MP//////////////////////+fUw//bwqn/07ie/8yw
+ kv/Jq47/yKuO/8ywlP/UvKX/5dXH/////wD///8A////AP///wD///8A////AP///wDi0MD/z7Wb/8qt
+ kP/NsJP/1Lqf/9/HsP/o0r3/7dnG/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/c
+ yf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/c
+ yf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/z5df///////////8AAP//AAD/////
+ ///37eT/7trG/+nUv//hybL/1ryi/8ywk//Iqoz/yq6S/9jCrf/r3tP/////AP///wD///8A////AP//
+ /wDp3M//07uj/8qtkf/NsJP/1ryh/+XPuP/y3sz/+u3g//zz6//88+v/++7i//zz6//77uL/+ujY//ro
+ 2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro
+ 2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj//PPr////
+ //8AAP//AAD//wAA/////////PPr//ro2P/66Nf/9OHP/+fRu//YvqT/zK+R/8mrjf/Os5n/3Mi1////
+ /wD///8A////AP///wD///8A3su5/8iqjf/KrI//1bqg/+XOt//14s//+evd////////////////////
+ //////////////vy6P/78uj/+uze//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl
+ 0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl
+ 0v/45dL/+OXS//vy6P//////AAD//wAA//8AAP////////vy6P/45dL/+OXS//fk0f/14s//7NfC/9S5
+ nv/LrpH/yKqM/86zmf/o2s3/////AP///wD///8A6drN/9W+p//Iqo3/z7KW/97Frf/s18L/9ODN//rw
+ 5v//////AAD//wAA////////AAD////////////////////////46dr/9eHN//Xhzf/14c3/9eHN//jp
+ 2v/68Ob/+vDm//rw5v/68Ob/+Ona//Xhzf/14c3/9eHN//Xhzf/14c3/9eHN//Xhzf/14c3/9eHN//Xh
+ zf/14c3/9eHN//Xhzf/46dr/+vDm//jp2v/46dr///////////8AAP//AAD////////68Ob/9eHN//Xh
+ zf/14c3/9ODN//Dbx//kzbX/0bWZ/8irjf/Mr5P/3ci0/////wD///8A////AOLQv//Os5n/yayO/9S4
+ nf/kzLT/79vG//Leyf/47uT//////wAA//8AAP//AAD//wAA//8AAP//AAD//wAA////////+O7k//Le
+ yf/y3sn/8t7J//Xn1//////////////////////////////////159f/9efX//ju5P/47uT/9efX//Le
+ yf/y3sn/8t7J//Leyf/y3sn/8t7J//Leyf/159f/////////////////9efX//ju5P//////AAD//wAA
+ ////////+O7k//Leyf/y3sn/8t7J//Leyf/x3Mf/7djC/9e9ov/LrpD/yqyP/9K4nv/t4NX/////AP//
+ /wDdybX/yayP/8uukf/YvqP/5tC4/+/bxf/v28X/9+3i//////8AAP//AAD//wAA//8AAP//AAD//wAA
+ //8AAP/////////////z5NT/79vF//Pk1P///////////wAA//8AAP//AAD//wAA////////////////
+ ///////////////////z5NT/79vF/+/bxf/v28X/79vF/+/bxf/z5NT///////////8AAP//////////
+ ///37eL//////wAA//8AAP////////ft4v/v28X/79vF/+/bxf/v28X/79vF/+/bxf/cw6n/zrKW/8iq
+ jP/KrI//6tvP/////wD///8A3Me0/8mrjf/Mr5P/28Go/+fQuP/t2MH/7djB//br4P//////AAD//wAA
+ //8AAP//AAD/////////////AAD//wAA//////////////Li0f///////////wAA//8AAP//AAD//wAA
+ //8AAP//AAD/////////////AAD//wAA////////9uvg/+3Ywf/y4tH/9uvg//br4P/y4tH/9uvg////
+ //8AAP//AAD//wAA////////9uvg//////8AAP//AAD////////26+D/9uvg//br4P/y4tH/7djB/+3Y
+ wf/t2MH/38eu/9K2mv/Iqoz/yKqM/+nbzv////8A////ANzHs//Jq43/zK+S/9vBp//mzrb/69W+/+zW
+ v//16t///////wAA//8AAP//AAD//////////////////wAA//8AAP//AAD////////16t7//////wAA
+ //8AAP//AAD/////////////AAD//wAA//8AAP///////wAA//8AAP////////ft4//y49P/////////
+ //////////////Dgz////////////wAA//8AAP////////Xq3v//////AAD//wAA////////////////
+ //////////////Xq3//16t7/8ODP/9/Grf/Stpr/yKqM/8iqjP/p2s3/////AP///wDcx7P/yauN/8yv
+ kv/awKb/5My0/+rTvP/s1b//9uzh//////8AAP//AAD/////////////8eHR////////////AAD//wAA
+ ////////9ene//////8AAP//AAD///////////////////////8AAP//AAD///////8AAP//AAD/////
+ ///58uz/+O/n//////8AAP//AAD/////////////9ere//////8AAP//AAD////////16t///////wAA
+ //8AAP//AAD//wAA//8AAP//AAD////////////////////////n1MH/0bWZ/8iqjP/Iqoz/6drN////
+ /wD///8A3Mez/8mrjf/Mr5L/2b+k/+PKsf/p0rr/7NfD//fw6P//////AAD//wAA////////9+7m/+7d
+ y//27uX//////wAA//8AAP//////////////////AAD//wAA////////+PHp//ft5f///////////wAA
+ //8AAP//AAD//wAA//////////////v38v//////AAD//wAA//8AAP////////Xr4f//////AAD//wAA
+ ////////9u3j//////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/////////////93I
+ s//Iqoz/yKqM/+nazf////8A////ANzHs//Jq43/zK6R/9m9ov/hyK7/6NG5/+3ax//69fD//////wAA
+ //8AAP////////v49P/37+f/+/by//////8AAP//AAD/////////////AAD//wAA//////////////v4
+ 8//8+PX//v38//////8AAP//AAD//wAA//8AAP//AAD////////+/fz//////wAA//8AAP//AAD/////
+ /////////////wAA//8AAP////////r28f//////AAD//wAA////////////////////////AAD//wAA
+ //8AAP//AAD////////o2cv/yKqM/8iqjP/p2s3/////AP///wDcx7P/yauN/8yukf/YvKH/4cas/+fP
+ t//s2cb/+vby//////8AAP//AAD////////9/Pv//Pn3//38+v//////AAD//wAA/////////////wAA
+ //8AAP////////38+v/7+fX/+/fz//z59///////AAD//wAA////////AAD//wAA/////////Pn2////
+ //8AAP//AAD//wAA/////////////wAA//8AAP//AAD////////9+/r//////wAA//8AAP////////78
+ +//+/v3/////////////////AAD//wAA/////////////9bAqv/Iqoz/6drN/////wD///8A3Mez/8mr
+ jf/MrpD/17uf/+DFqv/mzrX/69jE//r28f//////AAD//wAA////////+/j1//n07v/8+fb//////wAA
+ //8AAP////////////8AAP//AAD////////7+PX/9u7m//Tq3//48er//////wAA//8AAP///////wAA
+ //8AAP////////jx6v//////AAD//wAA//8AAP////////////8AAP//AAD//////////////Pr3////
+ //8AAP//AAD////////8+ff//fv5//7+/v/69vL//////wAA//8AAP//AAD////////j1MX/yKqM/+na
+ zf////8A////ANzHs//Jq43/zK6Q/9e6nv/fxKj/5cyz//Di0////////////wAA//8AAP////////Tr
+ 4f/q18T/9Ovh//////8AAP//AAD/////////////AAD//wAA////////9Ovg/+nVwP/o0rz/8ufb////
+ //8AAP//AAD///////8AAP//AAD//////////////////wAA//8AAP//AAD//wAA////////AAD//wAA
+ ////////9+/n//bt5P//////AAD//wAA//////////////v49f/+/v7/+PLr////////////AAD//wAA
+ ////////49TF/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukP/Wup3/3sKn/+TLsf/06uD//////wAA
+ //8AAP//AAD////////x5dj/69nF////////////AAD//wAA/////////////wAA//8AAP////////Hl
+ 2P/ky7H/5Myz//Po3f//////AAD//wAA////////AAD//wAA//8AAP///////wAA//8AAP///////wAA
+ //8AAP///////wAA//8AAP////////Ln2//y5tn//////wAA//8AAP//AAD////////8+ff//v7+//Xt
+ 5P/17OL//////wAA//8AAP///////+PUxf/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1bmd/93B
+ pv/jyrD/9Org//////8AAP//AAD//wAA////////9Orf////////////AAD//wAA////////////////
+ //8AAP//AAD////////06uD/7NrI/+7f0P/48uz//////wAA//8AAP////////////8AAP//AAD/////
+ //8AAP//AAD///////8AAP//AAD//wAA//8AAP//AAD////////y5tv/7dzM////////////AAD//wAA
+ /////////fv5//7+/v/48ev///////////8AAP//AAD////////j1MX/yKqM/+nazf////8A////ANzH
+ s//Iqo3/y66Q/9W5nP/cwKX/4siv//Pp3///////AAD//wAA//8AAP//////////////////AAD//wAA
+ //8AAP////////bt5P//////AAD//wAA////////+vXx//jy7P/7+fb//f37//////8AAP//AAD/////
+ ////////AAD//wAA//8AAP//AAD//wAA/////////////wAA//8AAP//AAD//wAA////////9u7m//Di
+ 1P/48ev//////wAA//8AAP////////79/P/+/v7///////////8AAP//AAD//wAA////////49TF/8iq
+ jP/p2s3/////AP///wDcx7P/yKqN/8utkP/VuJv/3MCj/+LIrv/z6d///////wAA//8AAP//AAD//wAA
+ //8AAP//AAD//wAA//8AAP/////////////+/Pv///////////////////////7+/f/+/f3//v39//37
+ +f//////AAD//wAA//////////////////8AAP//AAD//wAA//////////////////8AAP//AAD//wAA
+ //////////////79+//9/Pv//v39//////8AAP//AAD////////+/v7///////////8AAP//AAD//wAA
+ /////////////9bAqv/Iqoz/6drN/////wD///8A3Mez/8iqjf/LrZD/1bib/9zAo//iyK7/7d/Q////
+ ////////AAD//wAA//8AAP//AAD//wAA///////////////////79/P/+fTv//v38//8+ff/+/j2//jw
+ 6v/z6N7/8eTY/+3dzP/v4dP///////////////////////fw6P////////////////////////////fv
+ 5////////////wAA//8AAP////////z59//48+3/9+/o//r18f//////AAD//wAA////////////////
+ //8AAP//AAD//wAA/////////////9vFsP/Iqoz/yKqM/+nazf////8A////ANzHs//Iqoz/y62P/9W4
+ mv/cv6P/4cet/+fTvv/38Or///////////////////////////////////////Xs4//x5dn/7d3O/+3d
+ zv/t3c7/7d3O/+zczP/p1cP/6NO//+XPuP/iyK7/4MSp/+fTvv/y5tv/+fXw//37+f/y59z/69nI/+/h
+ 0//v4dP/8OPV/+vayP/o1L//79/R///////////////////////y5tv/7NzM/+vZyP/06uH//////wAA
+ //8AAP//AAD//wAA//8AAP//AAD//wAA/////////////+LMt//OsZT/yKqM/8iqjP/p2s3/////AP//
+ /wDcx7P/yKqM/8utj//UuJr/27+i/+HHrf/n077/9Ori//z6+P/8+fb/8+ne//Dj1v/v4dP/7+HT/+fT
+ vv/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/5M63//Tr
+ 4f/8+vf/8ufc/+TMtP/fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/7+HT/+/h0//n077/38On/9/D
+ p//fw6f/59O+/////////////////wAA//8AAP//AAD//////////////////+fTvv/Xup3/zrGT/8iq
+ jP/Iqoz/6drN/////wD///8A3Mez/8iqjP/LrY//1Lia/9u/ov/hx63/59O+//Tq4v/7+Pb/+fTu/+jT
+ vv/hx63/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/+TOt//06+H//Pr3//Ln3P/kzLT/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/7+HT////////////////////////////9Orh/+jU
+ wP/fw6f/17qd/86xk//Iqoz/yKqM/+nazf////8A////ANzHs//Iqoz/y62P/9S3mv/bv6L/4cet/+fT
+ vv/06uL/+/j2//n07v/o077/4cet/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//kzrf/9Ovh//z69//y59z/5My0/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/9ezk//v5
+ 9v/+/v7/9/Dq/+nVw//gxar/38On/9e6nf/OsZP/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8ut
+ kP/Ut5v/27+j/+HHrf/n077/9Ori//v49v/59O7/6NO+/+HHrf/fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/5M63//Tr4f/8+vf/8ufc/+TM
+ tP/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/+vayf/48+7//v7+//Tr4//p1cP/4MWq/9/Dp//Xup3/zrGT/8iqjP/Iqoz/6drN////
+ /wD///8A3Mez/8iqjf/LrZD/1Lib/9u/o//hx63/59O+//Tq4v/7+Pb/+fTv/+jTv//hx63/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/+TO
+ t//06+H//Pr3//Ln3P/kzLT/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//r2sn/+PPu//7+/v/06+P/6dbD/+DFqv/fw6f/17qd/86x
+ k//Iqoz/yKqM/+nazf////8A////ANzHs//Iqo3/y62Q/9S4m//bv6P/4ceu/+fTv//06+L/+/n2//n0
+ 7//o07//4ceu/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//kzrj/9Ovi//z69//y59z/5My1/9/DqP/fw6f/38On/9/Dp//fw6f/38On/9/D
+ p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/69rJ//jz7v/+/v7/9Ozj/+nW
+ xP/gxav/38On/9e6nv/OsZT/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8utkP/UuJv/27+k/+HH
+ rv/n07//9Ovi//v59v/59O//6NO//+HHrv/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/D
+ qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/5M64//Tr4v/8+vf/8ufd/+TMtv/fw6j/38Oo/9/D
+ qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/+va
+ yf/48+7//v7+//Ts4//p1sT/4MWs/9/DqP/Xup//zrGU/8iqjP/Iqoz/6drN/////wD///8A3Mez/8iq
+ jf/LrZD/1Lic/9vApP/hyK//59S///Tr4v/7+fb/+fTv/+jUwP/hyK//38Sp/9/Eqf/fxKn/38Sp/9/E
+ qf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/+XPuf/06+L//Pr3//Ln
+ 3f/kzbb/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E
+ qf/fxKn/38Sp/9/Eqf/r2sr/+fPu//7+/v/17OP/6dfE/+DGrf/fxKn/17uf/86xlP/Iqoz/yKqM/+na
+ zf////8A////ANzHs//Iqo3/y62Q/9W4nP/cwKX/4smw/+jVwP/16+L//Pn2//n07//o1cH/4smw/+fU
+ wP/v4dT/7+HU/+fUwP/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E
+ qf/lz7n/9ezi//z69//y6N3/5M63/+DFqv/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E
+ qf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/7NvK//nz7v/+/v7/9ezk/+rXxf/hx63/4MWq/9e7
+ oP/OsZT/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8utkP/VuJz/3MGl/+LJsP/o1cH/9evj//z5
+ 9v/59O//7uDS//Dk1///////////////////////7+LU/+jUwP/gxar/4MWq/+DFqv/gxar/4MWq/+DF
+ qv/gxar/4MWq/+DFqv/gxar/5dC6//Xs4//8+vj/8ujd/+XOt//gxav/4MWq/+DFqv/gxar/4MWq/+DF
+ qv/gxar/4MWq/+DFqv/gxar/4MWq/+DFqv/gxar/4MWq/+DFqv/gxar/4MWq/+zcy//58+7//v7+//Xs
+ 5P/q2Mb/4ciu/+DFqv/XvKD/zrKV/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1bmd/9zC
+ pv/iyrH/6NXC//Xs4//8+fb/+/fz/////////////////wAA//8AAP//////////////////6NXB/+DG
+ q//gxqv/4Mar/+DGq//gxqv/4Mar/+jVwf/v4tX/7+LV//Ln3f/69fH//fv6//Po3f/lz7j/4Mas/+DG
+ q//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DG
+ q//s3Mz/+fPu//7+/v/17eT/6tjG/+HIr//gxqz/2L2h/86ylf/Iqoz/yKqM/+nazf////8A////ANzH
+ s//Iq43/y66Q/9W6nf/dwqf/48uz/+jWwv/17OP//fv4//z59///////AAD//wAA//8AAP//AAD//wAA
+ //8AAP/////////////p1sP/4cet/+HHrf/hx63/4cet/+nWw///////////////////////////////
+ ///58+7/8ufc/+nWw//hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+HH
+ rf/hx63/4cet/+HHrf/hx63/7NzM//nz7v/+/v7/9e3l/+rYx//iyLD/4cet/9i9of/PspX/yKqM/8iq
+ jP/p2s3/////AP///wDcx7P/yKuN/8uukP/Wup7/3cOo/+PLs//o1sP/+PHr////////////////////
+ //8AAP////////////8AAP//AAD//wAA////////8OPW/+HHrf/hx63/4cet/+HHrf/w49b//////wAA
+ //8AAP//AAD//wAA////////////////////////8OPW//Dj1v/w49b/8OPW//Dj1v/p1sP/4cet/+HH
+ rf/hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+zdzf/58+7//v7+//Xt5f/q2Mj/4smw/+HH
+ rv/YvqL/z7KW/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1rqe/93Dqf/jzLT/6NbE//r1
+ 8f//////AAD//wAA/////////////////////////////wAA//8AAP/////////////p1sP/4ciu/+HI
+ rv/hyK7/8OPW//////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//////////////////////////
+ /////////////+nWw//hyK7/4ciu/+HIrv/hyK7/4ciu/+HIrv/hyK7/4ciu/+HIrv/s3c3/+fPv//7+
+ /v/17eX/6tnI/+LKsf/hyK7/2L6i/8+zlv/Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66Q/9a6
+ nv/dw6n/48y1/+jXxP/69vH//////wAA//8AAP////////Dj1//p1sT/8OPX//////8AAP//AAD//wAA
+ ////////8OPX/+HIr//hyK//4civ//Dj1///////AAD//wAA////////AAD//wAA//8AAP//AAD//wAA
+ //8AAP//AAD//wAA//8AAP//AAD/////////////6dbE/+HIr//hyK//4civ/+HIr//hyK//4civ/+HI
+ r//hyK//7N3O//n07//+/v7/9e3l/+rayf/iyrL/4civ/9i+o//Ps5b/yKqM/8iqjP/p2s3/////AP//
+ /wDcx7P/yKuN/8uukP/Wu5//3sSq/+TMtv/p18X/+vby//////8AAP//AAD////////w5Nj/4smx/+rX
+ xf///////////wAA//8AAP////////Dk2P/iybH/4smx/+LJsf/w5Nj//////wAA//8AAP//////////
+ //////////////////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP////////Dk2P/iybH/4smx/+LJ
+ sf/iybH/4smx/+LJsf/iybH/4smx/+3ez//59O///v7+//Xt5v/q2sr/4su0/+LJsf/YvqT/z7OW/8iq
+ jP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1rug/97Eq//kzbb/6dfF//r28v//////AAD//wAA
+ ////////8OTY/+LJsf/iybH/8OTY//////8AAP//AAD/////////////6tfF/+LJsf/iybH/8OTY////
+ //8AAP//AAD////////69vL//fz7//n07///////////////////////////////////////////////
+ ///q18X/4smx/+LJsf/iybH/4smx/+LJsf/iybH/4smx/+LJsf/t3s//+fTv//7+/v/17eb/6trK/+LM
+ tP/iybH/2L+k/8+zl//Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66Q/9a7oP/exaz/5M63/+nY
+ xv/69vL//////wAA//8AAP////////Dk2P/iyrL/4sqy//Dk2P//////AAD//wAA//8AAP////////Dk
+ 2P/iyrL/4sqy//Dk2P//////AAD//wAA//////////////37+v/z6uD/7d7P//Dk2P/w5Nj/8OTY//Dk
+ 2P/w5Nj/8OTY//Dk2P/q2Mb/4sqy/+LKsv/iyrL/4sqy/+LKsv/iyrL/4sqy/+LKsv/iyrL/7d7P//n0
+ 7//+/v7/9e7m/+vbyv/jzLX/4sqy/9i/pf/Ps5f/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uu
+ kf/Wu6H/3sWt/+TOuP/p2Mf/+vby//////8AAP//AAD////////w5dn/4suz/+LLs//q2cf/////////
+ //8AAP//AAD////////w5dn/4suz/+LLs//w5dn//////wAA//8AAP//AAD////////9/Pv/8+rh/+bT
+ v//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LL
+ s//iy7P/4suz/+3f0P/59PD//v7+//bu5//r28v/4822/+LLs//Yv6X/z7OX/8iqjP/Iqoz/6drN////
+ /wD///8A3Mez/8irjf/LrpH/1rui/97Frf/kzrn/6djH//r28v//////AAD//wAA/////////////+rZ
+ x//iy7P/8OXZ//////8AAP//AAD//wAA////////8OXZ/+LLs//iy7P/6tnH////////////AAD//wAA
+ /////////fz7//Pq4f/m07//4su0/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LL
+ s//iy7P/4suz/+LLs//iy7P/4suz/+LLs//t39H/+fTw//7+/v/27uf/69vM/+PNt//iy7T/2L+m/8+z
+ l//Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66R/9a8ov/exq7/5M66/+nYyP/69vL//////wAA
+ //8AAP//AAD////////w5dn/4su0//Dl2f//////AAD//wAA//8AAP////////Dl2f/iy7T/4su0/+LL
+ tP/w5dn//////wAA//8AAP////////38/P/06+P/59XD/+LMtv/iy7X/4su1/+LLtP/iy7T/4su0/+LL
+ tP/iy7T/4su0/+LLtP/iy7T/4su0/+LLtP/iy7T/4su0/+LLtP/iy7T/7d/R//n08P/+/v7/9u7n/+vb
+ zP/jzbf/4su0/9jApv/Ps5f/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukf/WvKL/3sau/+TP
+ uv/p2cj/+vby//////8AAP//AAD//wAA////////8OXa/+LMtv/w5dr//////wAA//8AAP//////////
+ ///q2cn/4sy2/+LMt//izbj/8efc//////8AAP//AAD////////+/f3/+fTv//Hm2//r3c7/59XD/+TP
+ u//izbf/4sy2/+LMtv/izLb/4su2/+LLtf/iy7X/4su2/+LLtv/izLb/4sy2/+LMtv/izLf/4sy3/+3g
+ 0//59fD//v7+//bu5//r3M3/4824/+LLtf/YwKf/z7SY/8iqjP/Iqoz/6drN/////wD///8A3Mez/8ir
+ jf/LrpH/1ryj/97Gr//kz7v/6dnJ//r28v//////AAD//wAA//8AAP////////Lp4P/l08D/8ujf////
+ //8AAP//AAD////////x593/5NC9/+XSv//m1ML/6NfG//Tt5f//////AAD//wAA/////////v7+//79
+ /P/8+vf/9/Lt//Dm2//r3c7/6NfG/+bUwv/m08D/5dK+/+XQvf/k0Lv/5NC7/+TQvP/l0b3/5dK+/+bT
+ wP/m1MH/5tTD/+jWxf/x5tz/+vf0//7+/v/27+f/693N/+POuf/izLb/2MCo/8+0mP/Iqoz/yKqM/+na
+ zf////8A////ANzHs//Iq43/y66R/9a9o//ex7D/5NC8/+nZyv/69vP//////wAA//8AAP//AAD/////
+ ///59vL/9e3m////////////AAD//wAA////////9e7m/+zg0v/w5tv/9O3l//jz7//9/Pv//////wAA
+ //8AAP////////79/P/9/fv//v38//79/f/9/Pv//Pr4//n28//17uj/8unf//Dk2P/t4NP/693N/+vc
+ zP/s3s//7uHV//Dl2v/y6N7/9Ozj//bw6f/59fH//Pr5//7+/f/+/v7/9u/n/+vdzv/jz7r/4s23/9jB
+ qP/PtJj/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukv/WvaT/3six/+PQvf/o2cn/9vHq////
+ ////////AAD//wAA/////////fz7////////////AAD//wAA//////////////r28v/49PD/+vfz//v5
+ 9//8+/n//v39//////8AAP//AAD/////////////9/Ls//j07//8+ff//Pv6//38+//9/Pv//Pn3//v3
+ 9P/69vL/+fTw//jz7v/48+3/+PPu//n18f/69vP/+vf0//v59v/7+vf//Pv5//38+//9/Pv//fv5//Ts
+ 5P/q3M3/48+6/+LNuP/Ywqn/z7SY/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpL/1r2k/97I
+ sv/jz7z/5tTD/+3h1P/49PD//////wAA//8AAP//////////////////AAD//wAA//8AAP////////79
+ /f/9/Pv//fv7//z7+f/7+ff/+vb0//v49v//////AAD//wAA//8AAP////////Xt5v/u4tf/8ujg//Xu
+ 5//38u3/+fby//v59//8+vn//fv6//38+//9/Pv//fz7//38+//9+/r//Pv5//z7+f/7+vj/+vj0//j1
+ 8P/38u3/9u/q//Ts5f/u4dX/59bF/+LOuv/izrn/2cKp/8+0mf/Iqoz/yKqM/+nazf////8A////ANzH
+ s//Iq43/y66S/9a9pf/eyLP/4866/+POuv/r3M////////////8AAP//AAD/////////////AAD//wAA
+ //8AAP/////////////69/T/+PTw//jz7//38ez/9e7n//Lp4P/y6eH///////////8AAP//AAD/////
+ ///x5tz/4867/+TRv//p2cr/7eDU//Hn3v/07ef/9vDq//fy7f/49PD/+PTw//j08P/49O//9/Pu//bx
+ 7P/28Or/9O7o//Lr4v/w5dv/7eHV/+rczv/n1sb/5NC+/+POu//jzrr/4866/9nCqv/PtJn/yKqM/8iq
+ jP/p2s3/////AP///wDcx7P/yKuN/8uukv/Wvqb/3sm0/+POu//jzrv/8efd//////8AAP//AAD//wAA
+ //8AAP//AAD//wAA//8AAP/////////////w5tz/693Q/+vdz//q3M7/59bG/+bUxP/l08L/5dLA//Ho
+ 3v//////AAD//wAA////////8ebd/+POu//jz7z/5NC+/+TSwP/l08L/5tTE/+bVxP/o2Mn/693Q/+vd
+ 0P/r3dD/6tzO/+nay//n1sb/5tXE/+bUxP/l1MP/5dPB/+TSwP/k0b//49C9/+PPvP/jzrv/4867/+PO
+ u//Zwqv/z7SZ/8iqjP/Iqoz/6drN/////wD///8A3Mi0/8mrjv/LrpL/1b2k/97JtP/jz7z/48+8//Hn
+ 3f//////AAD//wAA//8AAP//AAD//wAA///////////////////s39H/5dPC/+XTwv/l08L/5NPB/+PQ
+ vf/jz7z/48+8/+PPvP/x593//////wAA//8AAP////////Hn3f/jz7z/48+8/+PPvP/jz7z/48+8/+PP
+ vP/jz7z/49G+/+XTwv/l08L/5dPC/+XTwf/k0cD/48+9/+PPvP/jz7z/48+8/+PPvP/jz7z/48+8/+PP
+ vP/jz7z/48+8/+PPvP/jz7z/2MGq/86zmP/Iqoz/yKqN/+nbzv////8A////AN7Kt//KrpH/yq2Q/9O6
+ oP/cx7L/4s+8/+PQvf/x597//////wAA//8AAP//AAD///////////////////Hn3v/q3M7/49C9/+PQ
+ vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/6tzO///////////////////////q3M7/49C9/+PQ
+ vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQ
+ vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/i0L3/4s+8/9a+pv/NsZX/yKqN/8uukv/q3ND/////AP//
+ /wDhz77/zrOY/8mrjv/PtJn/2cOt/+HOvP/i0b//6t3Q////////////AAD/////////////8ejf/+rd
+ 0P/j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//q3dD/8ejf//Ho
+ 3//q3dD/49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PR
+ v//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//i0b//4tC9/9/Muf/Rt57/yqyP/8ms
+ j//Qt57/7ODU/////wD///8A6dvP/9bAqf/Iqoz/y6+T/9S8pf/dybX/4tG//+LRwP/q3dH/////////
+ ////////6t3R/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PR
+ wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PR
+ wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/4tG//9/N
+ uv/XwKr/zbKW/8irjf/MsJT/3sq2/////wD///8A////AP///wDgzr3/zbGW/8qtkf/OtZr/1sCp/93L
+ uP/h0L7/4tLB/+re0f/x6OD/6t7R/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS
+ wf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS
+ wf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS
+ wf/i0sH/4dC//97Muf/Yw63/z7Wb/8qtkP/KrpH/07uj/+rcz/////8A////AP///wD///8A693R/9a/
+ qf/LsJT/yq6S/861mv/WwKn/28m1/9/Nu//g0L7/4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ
+ v//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ
+ v//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ
+ v//h0L//4dC//+HQv//g0L7/38+8/9zKtv/Xwav/0Led/8msj//JrI7/0Led/9/Mu/////8A////AP//
+ /wD///8A////AP///wDm1sn/0bif/8qtkf/JrI//y7CU/9C3nv/Vvqf/2cOv/9rFsf/axbH/2sWx/9rF
+ sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rF
+ sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rF
+ sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2cSv/9W/qP/RuJ//zLGW/8msj//Iqoz/y7CU/9zI
+ tP/w5dz/////AP///wD///8A////AP///wD///8A////AOPTxP/XwKr/zbKX/8mrjv/KrpH/zbGW/860
+ mf/PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1
+ m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1
+ m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+0mv/MsZb/yq6S/8ms
+ jv/KrpH/07qi/+DNu//t4NX/////AP///wD///8A////AP///wD///8A////AP///wD///8A59jK/9zH
+ tP/SuaH/zbKW/8qukf/JrI//yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms
+ jv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms
+ jv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms
+ jv/JrI//yayP/8yxlf/RuJ//2cOu/+TUxf/w5Nv/////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wDt4tj/4dC//9S8pf/MsZX/yKuN/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq
+ jP/Iqoz/yKqM/8iqjP/Iqoz/yKqN/8qtkP/Tu6P/4M67/+zg1f////8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///////////gAAAAAAAP/4AAAAAAAAP/AAAAAAAAAf4AAAAAAA
+ AA/gAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAOAAAAAAAAAA4AAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA
+ AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA
+ AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA
+ AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA
+ AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA
+ AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA
+ AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAA8AA
+ AAAAAAADwAAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/8AAAAAAAAf///////////
+
+
\ No newline at end of file
diff --git a/DLSiteDumperCS/Properties/AssemblyInfo.cs b/DLSiteDumperCS/Properties/AssemblyInfo.cs
index 5645abe..235fb1b 100644
--- a/DLSiteDumperCS/Properties/AssemblyInfo.cs
+++ b/DLSiteDumperCS/Properties/AssemblyInfo.cs
@@ -10,7 +10,7 @@
[assembly: AssemblyConfiguration( "" )]
[assembly: AssemblyCompany( "" )]
[assembly: AssemblyProduct( "DLSiteDumperCS" )]
-[assembly: AssemblyCopyright( "Copyright © 2021" )]
+[assembly: AssemblyCopyright( "Copyright © Wappen 2021" )]
[assembly: AssemblyTrademark( "" )]
[assembly: AssemblyCulture( "" )]
@@ -32,5 +32,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion( "1.0.0.0" )]
-[assembly: AssemblyFileVersion( "1.0.0.0" )]
+[assembly: AssemblyVersion( "1.2.0.0" )]
+[assembly: AssemblyFileVersion( "1.2.0.0" )]
diff --git a/DLSiteDumperCS/Properties/Resources.Designer.cs b/DLSiteDumperCS/Properties/Resources.Designer.cs
index 8a6bfb0..2f00fc0 100644
--- a/DLSiteDumperCS/Properties/Resources.Designer.cs
+++ b/DLSiteDumperCS/Properties/Resources.Designer.cs
@@ -8,9 +8,10 @@
//
//------------------------------------------------------------------------------
-
-namespace DLSiteDumperCS.Properties
-{
+namespace DLSiteDumperCS.Properties {
+ using System;
+
+
///
/// A strongly-typed resource class, for looking up localized strings, etc.
///
@@ -18,53 +19,55 @@ namespace DLSiteDumperCS.Properties
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute( "System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0" )]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute( )]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute( )]
- internal class Resources
- {
-
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.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( )
- {
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
}
-
+
///
/// Returns the cached ResourceManager instance used by this class.
///
- [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if( (resourceMan == null) )
- {
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DLSiteDumperCS.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
-
+
///
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
///
- [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
return resourceCulture;
}
- set
- {
+ set {
resourceCulture = value;
}
}
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap dldump_icon {
+ get {
+ object obj = ResourceManager.GetObject("dldump_icon", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
}
}
diff --git a/DLSiteDumperCS/Properties/Resources.resx b/DLSiteDumperCS/Properties/Resources.resx
index af7dbeb..6132ead 100644
--- a/DLSiteDumperCS/Properties/Resources.resx
+++ b/DLSiteDumperCS/Properties/Resources.resx
@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
- : System.Serialization.Formatters.Binary.BinaryFormatter
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
+
@@ -68,9 +69,10 @@
-
+
+
@@ -85,9 +87,10 @@
-
+
+
@@ -109,9 +112,13 @@
2.0
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\Resources\dldump_icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/DLSiteDumperCS/Resources/dldump_icon.png b/DLSiteDumperCS/Resources/dldump_icon.png
new file mode 100644
index 0000000..c35dd33
Binary files /dev/null and b/DLSiteDumperCS/Resources/dldump_icon.png differ
diff --git a/DLSiteDumperCS/ViewerDumper.cs b/DLSiteDumperCS/ViewerDumper.cs
index 83a137a..d2abe4c 100644
--- a/DLSiteDumperCS/ViewerDumper.cs
+++ b/DLSiteDumperCS/ViewerDumper.cs
@@ -4,6 +4,7 @@
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using static Gdi32;
@@ -11,72 +12,79 @@
using static User32;
using HWND = System.IntPtr;
-class ViewerDumper : IDisposable
+namespace DLSiteDumperCS
{
- readonly DLSiteDumperCS.MainForm parentDialog;
-
- public string BaseSavePath { get; set; }
- public int TargetPid { get; set; }
- public int BasePageOffset { get; set; } = 1;
- public string TargetImageExt { get; set; } = "png";
- public int BetweenPageDelayMs { get; set; } = 1000;
-
- public ViewerDumper( DLSiteDumperCS.MainForm parentDialog )
+ class ViewerDumper : IDisposable
{
- this.parentDialog = parentDialog;
- }
+ readonly MainForm parentDialog;
- ///
- /// Indicates that PID is valid and we can open process.
- ///
- public bool IsReady => viewer_process != HWND.Zero && viewer_area_main != HWND.Zero;
-
- Process viewerProcess;
- HWND viewer_process;
- HWND viewer_window_main;
-
- const int VIEWER_BUTTON_PARENT_CODE = 0xE805;
- const int VIEWER_BUTTON_FIRST_CODE = 0x8023;
- const int VIEWER_BUTTON_NEXT_CODE = 0x8020;
- const int VIEWER_BUTTON_ZOOM_CODE = 0x800A;
- const int VIEWER_AREA_PARENT_CODE = 0xE900;
- const int VIEWER_AREA_MAIN_CODE = 0xE900;
- const int STATUS_BAR = 59393;
-
- HWND viewer_button_parent;
- HWND viewer_button_first;
- HWND viewer_button_next;
- HWND viewer_button_zoom;
- HWND viewer_area_parent;
- HWND viewer_area_main;
- //Win32StatusBar m_ViewerStatusBar;
-
- public void Dispose( )
- {
- if( viewer_process != IntPtr.Zero )
- CloseHandle( viewer_process );
- if( m_BmpMemoryStream != null )
- m_BmpMemoryStream.Dispose( );
- }
+ /* Configuration zone ////////////////////////*/
- public void Setup( int processId )
- {
- TargetPid = processId;
- viewerProcess = Process.GetProcessById( processId );
- viewer_process = OpenProcess( viewerProcess, ProcessAccessTypes.PROCESS_VM_READ | ProcessAccessTypes.PROCESS_QUERY_INFORMATION );
-
- viewer_window_main = WndSearcher.SearchForWindowWithPid( viewerProcess.Id );
-
- // Find all the subwindow by control ID
- viewer_button_parent = GetDlgItem( viewer_window_main, VIEWER_BUTTON_PARENT_CODE );
- viewer_button_first = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_FIRST_CODE );
- viewer_button_next = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_NEXT_CODE );
- viewer_button_zoom = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_ZOOM_CODE );
- viewer_area_parent = GetDlgItem( viewer_window_main, VIEWER_AREA_PARENT_CODE );
- viewer_area_main = GetDlgItem( viewer_area_parent, VIEWER_AREA_MAIN_CODE );
-
- // Note: I tried to read status bar that displaying page number,
- // but looks like its text is hidden. So no auto page detection for now
+ public string BaseSavePath { get; set; }
+ public int TargetPid { get; set; }
+ public int BasePageOffset { get; set; } = 1;
+ public int BetweenPageDelayMs { get; set; } = 1000;
+
+ OutputFormat m_TargetImageFormat = OutputFormat.Png;
+
+ public ViewerDumper( DLSiteDumperCS.MainForm parentDialog )
+ {
+ this.parentDialog = parentDialog;
+ }
+
+ ///
+ /// Indicates that PID is valid and we can open process.
+ ///
+ public bool IsReady => viewer_process != HWND.Zero && viewer_area_main != HWND.Zero;
+
+ Process viewerProcess;
+ HWND viewer_process;
+ HWND viewer_window_main;
+
+ const int VIEWER_BUTTON_PARENT_CODE = 0xE805;
+ const int VIEWER_BUTTON_FIRST_CODE = 0x8023;
+ const int VIEWER_BUTTON_NEXT_CODE = 0x8020;
+ const int VIEWER_BUTTON_ZOOM_CODE = 0x800A;
+ const int VIEWER_AREA_PARENT_CODE = 0xE900;
+ const int VIEWER_AREA_MAIN_CODE = 0xE900;
+ const int STATUS_BAR = 59393;
+
+ HWND viewer_button_parent;
+ HWND viewer_button_first;
+ HWND viewer_button_next;
+ HWND viewer_button_zoom;
+ HWND viewer_area_parent;
+ HWND viewer_area_main;
+ //Win32StatusBar m_ViewerStatusBar;
+
+ public void Dispose( )
+ {
+ if( viewer_process != IntPtr.Zero )
+ CloseHandle( viewer_process );
+ if( m_BmpMemoryStream != null )
+ m_BmpMemoryStream.Dispose( );
+ if( m_JpegEncoderParams != null )
+ m_JpegEncoderParams.Dispose( );
+ }
+
+ public void SetupTargetPid( int processId )
+ {
+ TargetPid = processId;
+ viewerProcess = Process.GetProcessById( processId );
+ viewer_process = OpenProcess( viewerProcess, ProcessAccessTypes.PROCESS_VM_READ | ProcessAccessTypes.PROCESS_QUERY_INFORMATION );
+
+ viewer_window_main = WndSearcher.SearchForWindowWithPid( viewerProcess.Id );
+
+ // Find all the subwindow by control ID
+ viewer_button_parent = GetDlgItem( viewer_window_main, VIEWER_BUTTON_PARENT_CODE );
+ viewer_button_first = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_FIRST_CODE );
+ viewer_button_next = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_NEXT_CODE );
+ viewer_button_zoom = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_ZOOM_CODE );
+ viewer_area_parent = GetDlgItem( viewer_window_main, VIEWER_AREA_PARENT_CODE );
+ viewer_area_main = GetDlgItem( viewer_area_parent, VIEWER_AREA_MAIN_CODE );
+
+ // Note: I tried to read status bar that displaying page number,
+ // but looks like its text is hidden. So no auto page detection for now
#if false
HWND statusBarHwnd = GetDlgItem( viewer_window_main, STATUS_BAR );
m_ViewerStatusBar = new Win32StatusBar( viewer_process, statusBarHwnd );
@@ -88,204 +96,228 @@ public void Setup( int processId )
Debug.Print( $"caption {i} = {caption}" );
}
#endif
- }
-
- BackgroundWorker worker;
- DoWorkEventArgs workerArg;
- public void SetupBackgroundWorker( BackgroundWorker worker, DoWorkEventArgs e )
- {
- this.worker = worker;
- workerArg = e;
- }
+ }
- struct ViewerState
- {
- public bool hasData;
- public WINDOWPLACEMENT original_window_placement;
- public WINDOWPLACEMENT temp_window_placement;
- public RECT original_window_rect;
- public int original_zoom_selection;
+ ImageCodecInfo m_JpegEncoder;
+ EncoderParameters m_JpegEncoderParams;
- public void SaveSnapshot( HWND viewer_window_main, HWND viewer_button_zoom )
+ public void SetupOutputEncoder( OutputFormat usingOutputImageFormat )
{
- hasData = true;
+ m_TargetImageFormat = usingOutputImageFormat;
- // Current placement
- original_window_placement = default;
- original_window_placement.Length = Marshal.SizeOf( original_window_placement );
- GetWindowPlacement( viewer_window_main, ref original_window_placement );
+ if( m_JpegEncoder == null )
+ m_JpegEncoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == ImageFormat.Jpeg.Guid);
- // Current zoom state
- original_zoom_selection = (int)SendMessage( viewer_button_zoom, CB_GETCURSEL );
+ int quality = 100;
+ switch( m_TargetImageFormat )
+ {
+ case OutputFormat.Jpeg80:
+ quality = 80; break;
+ case OutputFormat.Jpeg50:
+ quality = 50; break;
+ }
- GetWindowRect( viewer_window_main, ref original_window_rect );
+ if( m_JpegEncoderParams == null )
+ m_JpegEncoderParams = new EncoderParameters(1);
+ m_JpegEncoderParams.Param[0] = new EncoderParameter( Encoder.Quality, quality );
}
- public void Restore( HWND viewer_window_main, HWND viewer_button_zoom )
+ BackgroundWorker worker;
+ DoWorkEventArgs workerArg;
+ public void SetupBackgroundWorker( BackgroundWorker worker, DoWorkEventArgs e )
{
- // Restore window size and state
- var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate;
- SetWindowPos( viewer_window_main, IntPtr.Zero, 0, 0, original_window_rect.Right - original_window_rect.Left, original_window_rect.Top - original_window_rect.Bottom, targetWindowPosFlags );
- SetWindowPlacement( viewer_window_main, ref original_window_placement );
+ this.worker = worker;
+ workerArg = e;
+ }
+
+ struct ViewerState
+ {
+ public bool hasData;
+ public WINDOWPLACEMENT original_window_placement;
+ public WINDOWPLACEMENT temp_window_placement;
+ public RECT original_window_rect;
+ public int original_zoom_selection;
+
+ public void SaveSnapshot( HWND viewer_window_main, HWND viewer_button_zoom )
+ {
+ hasData = true;
+
+ // Current placement
+ original_window_placement = default;
+ original_window_placement.Length = Marshal.SizeOf( original_window_placement );
+ GetWindowPlacement( viewer_window_main, ref original_window_placement );
- // Restore zoom level
- //ComboBox_SetCurSel( viewer_button_zoom, original_zoom_selection );
- //SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), (LPARAM)viewer_button_zoom );
+ // Current zoom state
+ original_zoom_selection = (int)SendMessage( viewer_button_zoom, CB_GETCURSEL );
+
+ GetWindowRect( viewer_window_main, ref original_window_rect );
+ }
+
+ public void Restore( HWND viewer_window_main, HWND viewer_button_zoom )
+ {
+ // Restore window size and state
+ var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate;
+ SetWindowPos( viewer_window_main, IntPtr.Zero, 0, 0, original_window_rect.Right - original_window_rect.Left, original_window_rect.Top - original_window_rect.Bottom, targetWindowPosFlags );
+ SetWindowPlacement( viewer_window_main, ref original_window_placement );
+
+ // Restore zoom level
+ //ComboBox_SetCurSel( viewer_button_zoom, original_zoom_selection );
+ //SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), (LPARAM)viewer_button_zoom );
+ }
}
- }
- ViewerState m_ViewerState;
+ ViewerState m_ViewerState;
- void PrepareViewerForDump( )
- {
- // Store original window position and state
- // Window will be shrunken to ensure window size is smaller than the image
- // This is necessary so that the immage in memory will not be padded
- if( !m_ViewerState.hasData )
- m_ViewerState.SaveSnapshot( viewer_window_main, viewer_button_zoom );
+ void PrepareViewerForDump( )
+ {
+ // Store original window position and state
+ // Window will be shrunken to ensure window size is smaller than the image
+ // This is necessary so that the immage in memory will not be padded
+ if( !m_ViewerState.hasData )
+ m_ViewerState.SaveSnapshot( viewer_window_main, viewer_button_zoom );
- WINDOWPLACEMENT temp_window_placement = m_ViewerState.original_window_placement;
- temp_window_placement.ShowCmd = ShowWindowCommands.Show;
- SetWindowPlacement( viewer_window_main, ref temp_window_placement );
+ WINDOWPLACEMENT temp_window_placement = m_ViewerState.original_window_placement;
+ temp_window_placement.ShowCmd = ShowWindowCommands.Show;
+ SetWindowPlacement( viewer_window_main, ref temp_window_placement );
- // Set zoom level to 100%
- SendMessage( viewer_button_zoom, CB_SELECTSTRING, -1, "100%" );
+ // Set zoom level to 100%
+ SendMessage( viewer_button_zoom, CB_SELECTSTRING, -1, "100%" );
- // Programatically selecting a ComboBox option will not send a selection change message to the parent, so do that manually
- SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), viewer_button_zoom );
+ // Programatically selecting a ComboBox option will not send a selection change message to the parent, so do that manually
+ SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), viewer_button_zoom );
- var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate;
- SetWindowPos( viewer_window_main, HWND.Zero, 0, 0, 256, 256, targetWindowPosFlags );
+ var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate;
+ SetWindowPos( viewer_window_main, HWND.Zero, 0, 0, 256, 256, targetWindowPosFlags );
- // Send a virtual click to the first page button
- // Note: This was removed because original author lets user specify first page to capture in case of crash
- // SendMessage(viewer_button_first, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(1, 1));
- // SendMessage(viewer_button_first, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(1, 1));
+ // Send a virtual click to the first page button
+ // Note: This was removed because original author lets user specify first page to capture in case of crash
+ // SendMessage(viewer_button_first, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(1, 1));
+ // SendMessage(viewer_button_first, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(1, 1));
- // It seems it takes some time for messages to propagate to other buttons, so wait until the next button is enabled
- // This will prevent the bug where if the Viewer was opened to the last page, it would only export the first image
- Thread.Sleep( 1000 );
- }
+ // It seems it takes some time for messages to propagate to other buttons, so wait until the next button is enabled
+ // This will prevent the bug where if the Viewer was opened to the last page, it would only export the first image
+ Thread.Sleep( 1000 );
+ }
-
- void RestoreViewerState( )
- {
- if( m_ViewerState.hasData )
- m_ViewerState.Restore( viewer_window_main, viewer_button_zoom );
- }
- byte[] m_ImageDumpBuffer;
+ void RestoreViewerState( )
+ {
+ if( m_ViewerState.hasData )
+ m_ViewerState.Restore( viewer_window_main, viewer_button_zoom );
+ }
- public void DumpBatch( )
- {
- PrepareViewerForDump( );
+ byte[] m_ImageDumpBuffer;
- // Beginning RIP
- // Continue until the next button becomes disabled, indicating the last image
- bool ending = false;
- for( int pages = BasePageOffset; ; pages++ )
+ public void DumpBatch( )
{
- if( worker.CancellationPending )
- {
- workerArg.Cancel = true;
- break;
- }
+ PrepareViewerForDump( );
- // If the next button is disabled, we reached the end; grab one last image and finish
- if( GetWindowLongHasFlag( viewer_button_next, GWL.GWL_STYLE, WindowStyles.WS_DISABLED ) )
+ // Beginning RIP
+ // Continue until the next button becomes disabled, indicating the last image
+ bool ending = false;
+ for( int pages = BasePageOffset; ; pages++ )
{
- ending = true;
- workerArg.Result = "Capture operation completed successfully.";
- }
+ if( worker.CancellationPending )
+ {
+ workerArg.Cancel = true;
+ break;
+ }
- _DumpOneImpl( pages );
- if( ending )
- break;
+ // If the next button is disabled, we reached the end; grab one last image and finish
+ if( GetWindowLongHasFlag( viewer_button_next, GWL.GWL_STYLE, WindowStyles.WS_DISABLED ) )
+ {
+ ending = true;
+ workerArg.Result = "Capture operation completed successfully.";
+ }
- _NextPage( );
- }
+ _DumpOneImpl( pages );
+ if( ending )
+ break;
- }
+ _NextPage( );
+ }
- public void DumpOne( )
- {
- PrepareViewerForDump( );
+ }
- _DumpOneImpl( BasePageOffset );
- }
+ public void DumpOne( )
+ {
+ PrepareViewerForDump( );
- void _DumpOneImpl( int pageNumber )
- {
- // As a hack, the dimensions of the images are determined by
- // looking at the size of the scroll area
- // This requires that the image area be smaller than the image
- SCROLLINFO sih = default, siv = default;
-
- sih.cbSize = (uint)Marshal.SizeOf( sih );
- sih.fMask = (uint)ScrollInfoMask.SIF_ALL;
- siv.cbSize = (uint)Marshal.SizeOf( siv );
- siv.fMask = (uint)ScrollInfoMask.SIF_ALL;
-
- GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_HORZ, ref sih );
- GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_VERT, ref siv );
-
- int w = sih.nMax - sih.nMin + 1;
- int h = siv.nMax - siv.nMin + 1;
-
- int imageSize = (((w * 32 + 31) & ~31) >> 3) * h;
- if( m_ImageDumpBuffer == null || m_ImageDumpBuffer.Length < imageSize )
- m_ImageDumpBuffer = new byte[imageSize];
-
- // Prepare BMP header for hijacking
- BITMAPFILEHEADER bmf = default;
- BITMAPINFOHEADER bmi = default;
-
- bmf.bfType = 0x4d42;
- bmf.bfSize = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ) + imageSize);
- bmf.bfOffBits = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ));
-
- bmi.biSize = 40; // Size of info header, must be 40
- bmi.biWidth = w;
- bmi.biHeight = -h;
- bmi.biPlanes = 1;
- bmi.biBitCount = 32; // Data dumped from mem is 32bpp
- bmi.biCompression = 0;
- //bmi.biSizeImage = (uint)imageSize; // biSizeImage is not required if there is no compression
-
- byte[] bmfHeaderBytes = StructToBytes( bmf );
- byte[] bmiHeaderBytes = StructToBytes( bmi );
-
- for( IntPtr address = default; ; )
+ _DumpOneImpl( BasePageOffset );
+ }
+
+ void _DumpOneImpl( int pageNumber )
{
- MEMORY_BASIC_INFORMATION mbi = default;
- int actualByteRead = -1;
- while( VirtualQueryEx( viewer_process, address, out mbi, (uint)Marshal.SizeOf( mbi ) ) != 0 )
+ // As a hack, the dimensions of the images are determined by
+ // looking at the size of the scroll area
+ // This requires that the image area be smaller than the image
+ SCROLLINFO sih = default, siv = default;
+
+ sih.cbSize = (uint)Marshal.SizeOf( sih );
+ sih.fMask = (uint)ScrollInfoMask.SIF_ALL;
+ siv.cbSize = (uint)Marshal.SizeOf( siv );
+ siv.fMask = (uint)ScrollInfoMask.SIF_ALL;
+
+ GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_HORZ, ref sih );
+ GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_VERT, ref siv );
+
+ int w = sih.nMax - sih.nMin + 1;
+ int h = siv.nMax - siv.nMin + 1;
+
+ int imageSize = (((w * 32 + 31) & ~31) >> 3) * h;
+ if( m_ImageDumpBuffer == null || m_ImageDumpBuffer.Length < imageSize )
+ m_ImageDumpBuffer = new byte[imageSize];
+
+ // Prepare BMP header for hijacking
+ BITMAPFILEHEADER bmf = default;
+ BITMAPINFOHEADER bmi = default;
+
+ bmf.bfType = 0x4d42;
+ bmf.bfSize = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ) + imageSize);
+ bmf.bfOffBits = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ));
+
+ bmi.biSize = 40; // Size of info header, must be 40
+ bmi.biWidth = w;
+ bmi.biHeight = -h;
+ bmi.biPlanes = 1;
+ bmi.biBitCount = 32; // Data dumped from mem is 32bpp
+ bmi.biCompression = 0;
+ //bmi.biSizeImage = (uint)imageSize; // biSizeImage is not required if there is no compression
+
+ byte[] bmfHeaderBytes = StructToBytes( bmf );
+ byte[] bmiHeaderBytes = StructToBytes( bmi );
+
+ for( IntPtr address = default; ; )
{
- if( mbi.State == (uint)MemState.MEM_COMMIT && mbi.Type == (uint)MemType.MEM_PRIVATE && mbi.Protect == (uint)PageAllocationProtect.PAGE_READWRITE && mbi.RegionSize.ToInt32( ) >= imageSize )
+ MEMORY_BASIC_INFORMATION mbi = default;
+ int actualByteRead = -1;
+ while( VirtualQueryEx( viewer_process, address, out mbi, (uint)Marshal.SizeOf( mbi ) ) != 0 )
{
- IntPtr byteRead;
- if( !ReadProcessMemory( viewer_process, mbi.BaseAddress, m_ImageDumpBuffer, imageSize, out byteRead ) )
+ if( mbi.State == (uint)MemState.MEM_COMMIT && mbi.Type == (uint)MemType.MEM_PRIVATE && mbi.Protect == (uint)PageAllocationProtect.PAGE_READWRITE && mbi.RegionSize.ToInt32( ) >= imageSize )
{
- Debug.Print( $"ReadProcessMemory failed at PID {viewer_process} addess 0x{mbi.BaseAddress:X} size {imageSize}. But it will continue..." );
- continue;
+ IntPtr byteRead;
+ if( !ReadProcessMemory( viewer_process, mbi.BaseAddress, m_ImageDumpBuffer, imageSize, out byteRead ) )
+ {
+ Debug.Print( $"ReadProcessMemory failed at PID {viewer_process} addess 0x{mbi.BaseAddress:X} size {imageSize}. But it will continue..." );
+ continue;
+ }
+
+ actualByteRead = byteRead.ToInt32( );
+ Debug.Print( "ReadProcessMemory success\n" );
}
- actualByteRead = byteRead.ToInt32( );
- Debug.Print( "ReadProcessMemory success\n" );
+ // Iterate to see next memory page
+ address = IntPtr.Add( mbi.BaseAddress, mbi.RegionSize.ToInt32( ) );
}
- // Iterate to see next memory page
- address = IntPtr.Add( mbi.BaseAddress, mbi.RegionSize.ToInt32( ) );
- }
-
- // Write to file
- // Three digit decimal with padding
- if( actualByteRead > 0 )
- {
- string filename = GetFileNameForPage( pageNumber, TargetImageExt );
- string outputPath = Path.Combine( BaseSavePath, filename );
+ // Write to file
+ if( actualByteRead > 0 )
+ {
+ string fileExt = Helper.GetOutputExt( m_TargetImageFormat );
+ string filename = GetFileNameForPage( pageNumber, fileExt );
+ string outputPath = Path.Combine( BaseSavePath, filename );
- worker.ReportProgress( 0, $"Dumping page {pageNumber}\nto {outputPath}" );
+ worker.ReportProgress( 0, $"Dumping page {pageNumber}\nto {outputPath}" );
#if false // This was saving plain BMP file
try
@@ -302,45 +334,55 @@ void _DumpOneImpl( int pageNumber )
Debug.Print( $"Failed to write to {outputPath}\n{e.Message}" );
}
#endif
- // Transfer to in-memory BMP file and convert
- {
- if( m_BmpMemoryStream == null )
- m_BmpMemoryStream = new MemoryStream( );
- m_BmpMemoryStream.SetLength( 0 ); // Reset and reuse it
-
- m_BmpMemoryStream.Write( bmfHeaderBytes, 0, bmfHeaderBytes.Length );
- m_BmpMemoryStream.Write( bmiHeaderBytes, 0, bmiHeaderBytes.Length );
- m_BmpMemoryStream.Write( m_ImageDumpBuffer, 0, actualByteRead );
-
- Image bmp = Image.FromStream( m_BmpMemoryStream );
-
- if( TargetImageExt == "png" )
- bmp.Save( outputPath, ImageFormat.Png );
- else if( TargetImageExt == "jpg" )
- bmp.Save( outputPath, ImageFormat.Jpeg );
+ // Transfer to in-memory BMP file and convert
+ {
+ if( m_BmpMemoryStream == null )
+ m_BmpMemoryStream = new MemoryStream( );
+ m_BmpMemoryStream.SetLength( 0 ); // Reset and reuse it
+
+ m_BmpMemoryStream.Write( bmfHeaderBytes, 0, bmfHeaderBytes.Length );
+ m_BmpMemoryStream.Write( bmiHeaderBytes, 0, bmiHeaderBytes.Length );
+ m_BmpMemoryStream.Write( m_ImageDumpBuffer, 0, actualByteRead );
+
+ Image bmp = Image.FromStream( m_BmpMemoryStream );
+
+ switch( m_TargetImageFormat )
+ {
+ case OutputFormat.Jpeg80:
+ case OutputFormat.Jpeg50:
+ bmp.Save( outputPath, m_JpegEncoder, m_JpegEncoderParams );
+ break;
+ default:
+ case OutputFormat.Png:
+ bmp.Save( outputPath, ImageFormat.Png );
+ break;
+ }
+ }
}
- }
- Debug.Print( "Image dump ok, switch page." );
- break;
+ Debug.Print( "Image dump ok, switch page." );
+ break;
+ }
}
- }
- MemoryStream m_BmpMemoryStream;
-
- void _NextPage( )
- {
- // Once image memory is ours, 'click' to the next image
- SendMessage( viewer_button_next, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM( 1, 1 ) );
- SendMessage( viewer_button_next, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM( 1, 1 ) );
+ MemoryStream m_BmpMemoryStream;
- // There is delay for DLS to decode-display an image
- // So wait a bit
- Thread.Sleep( BetweenPageDelayMs );
- }
+ void _NextPage( )
+ {
+ // Once image memory is ours, 'click' to the next image
+ SendMessage( viewer_button_next, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM( 1, 1 ) );
+ SendMessage( viewer_button_next, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM( 1, 1 ) );
- public static string GetFileNameForPage( int page, string ext )
- {
- return $"{page:D3}.{ext}";
+ // There is delay for DLS to decode-display an image
+ // So wait a bit
+ Thread.Sleep( BetweenPageDelayMs );
+ }
+
+ public static string GetFileNameForPage( int page, string ext )
+ {
+ // Three digit decimal with padding
+ // e.g., 001.png 002.png
+ return $"{page:D3}.{ext}";
+ }
}
}
\ No newline at end of file
diff --git a/DLSiteDumperCS/dldump_icon_kr9_icon.ico b/DLSiteDumperCS/dldump_icon_kr9_icon.ico
new file mode 100644
index 0000000..572160f
Binary files /dev/null and b/DLSiteDumperCS/dldump_icon_kr9_icon.ico differ
diff --git a/README.md b/README.md
index b4f0dfb..2bc71e1 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ Open EXE file and follow my messy GUI instruction.
* Auto detection of DLSiteViewer.exe process ID
* A GUI, what could you asked more?
* Option to convert to PNG/JPG
-* Ability to generate a reader HTML.
+* Ability to generate a reader HTML, an one-page-scroll that we all love.
# Reader HTML
@@ -27,12 +27,13 @@ Allows you to choose
* DLSite viewer version that I tested with will [lockup system when launching new application](https://superuser.com/a/1636040/1099925). This is doing from Cypherguard, the DRM system that it is using, not doing of my program.
* While it is running and loaded a manga, it will start locking the system. The locking goes away if you close it.
+* For safe measurement, open ripper first, then viewer, then use auto detect PID later.
# Warning
To use this tool you must agree that you are **legitimate buyer of DLSite content**. And only use this for your **personal viewing purpose**, in your own fap cave. Do not share the pirated content or your fap cave will burn down!
# [Download EXE](https://github.com/wappenull/DLSiteDumperGUI/releases/download/v1.1/DLSiteDumperCS.exe)
-Now V1.1.
+Now V1.2
It is using .NET framework 4.7.2 Get the runtime if you dont have it yet:
https://dotnet.microsoft.com/download/dotnet-framework/net472
\ No newline at end of file
diff --git a/dldump_icon.png b/dldump_icon.png
new file mode 100644
index 0000000..c35dd33
Binary files /dev/null and b/dldump_icon.png differ
diff --git a/dldump_icon_kr9_icon.ico b/dldump_icon_kr9_icon.ico
new file mode 100644
index 0000000..572160f
Binary files /dev/null and b/dldump_icon_kr9_icon.ico differ