dvdInfoWindow.Hide();\r
// **********************************************************************************************\r
\r
+\r
// Set the Version number lable to the corect version.\r
Version.Text = "Version " + Properties.Settings.Default.GuiVersion;\r
\r
\r
// Now load the users default if required.\r
loadUserDefaults();\r
+\r
+ // Display the quick start window if required.\r
+ quickStart();\r
}\r
\r
public void showSplash(object sender)\r
Thread.Sleep(3000);\r
splash.Close();\r
}\r
+\r
public void loadUserDefaults()\r
{ \r
try\r
{\r
check_2PassEncode.CheckState = CheckState.Checked;\r
}\r
- if (Properties.Settings.Default.DeInterlace == "Checked")\r
+ \r
+ drp_deInterlace_option.Text = Properties.Settings.Default.DeInterlace;\r
+ drp_deNoise.Text = Properties.Settings.Default.denoise;\r
+\r
+ if (Properties.Settings.Default.detelecine == "Checked")\r
+ {\r
+ check_detelecine.CheckState = CheckState.Checked;\r
+ }\r
+\r
+ if (Properties.Settings.Default.detelecine == "Checked")\r
{\r
- check_DeInterlace.CheckState = CheckState.Checked;\r
+ check_deblock.CheckState = CheckState.Checked;\r
}\r
+\r
+\r
if (Properties.Settings.Default.Grayscale == "Checked")\r
{\r
check_grayscale.CheckState = CheckState.Checked;\r
}\r
}\r
\r
+ public void quickStart()\r
+ {\r
+ if ((Properties.Settings.Default.QuickStartWindow == "Checked") || (Properties.Settings.Default.QuickStartWindow == ""))\r
+ {\r
+ frmQuickStart quickstart = new frmQuickStart();\r
+ quickstart.ShowDialog();\r
+ }\r
+ }\r
+\r
+\r
// -------------------------------------------------------------- \r
// The main Menu bar.\r
// -------------------------------------------------------------- \r
check_2PassEncode.CheckState = CheckState.Checked;\r
}\r
\r
- temporyLine = line.ReadLine();\r
- if (temporyLine == "Checked")\r
- {\r
- check_DeInterlace.CheckState = CheckState.Checked;\r
- }\r
+ drp_deInterlace_option.Text = line.ReadLine();\r
\r
temporyLine = line.ReadLine();\r
if (temporyLine == "Checked")\r
line.WriteLine(text_filesize.Text);\r
line.WriteLine(slider_videoQuality.Value.ToString());\r
line.WriteLine(check_2PassEncode.CheckState.ToString());\r
- line.WriteLine(check_DeInterlace.CheckState.ToString());\r
+ line.WriteLine(drp_deInterlace_option.Text);\r
line.WriteLine(check_grayscale.CheckState.ToString());\r
line.WriteLine(drp_videoFramerate.Text);\r
line.WriteLine(Check_ChapterMarkers.CheckState.ToString());\r
{\r
CheckPixelRatio.CheckState = CheckState.Unchecked;\r
text_width.Text = "640";\r
- text_height.Text = "480";\r
+ text_height.Text = "Auto";\r
drp_videoEncoder.Text = "H.264 (iPod)";\r
text_bitrate.Text = "1000";\r
text_filesize.Text = "";\r
drp_crop.Text = "No Crop";\r
}\r
\r
- private void mnu_preset_ipod178_Click(object sender, EventArgs e)\r
+\r
+\r
+ private void mnu_appleTv_Click(object sender, EventArgs e)\r
+ {\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
+ text_filesize.Text = "";\r
+ slider_videoQuality.Value = 0;\r
+ SliderValue.Text = "0%";\r
+ drp_audioBitrate.Text = "160";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";\r
+ drp_crop.Text = "No Crop";\r
+ \r
+ }\r
+\r
+ private void mnu_presetPS3_Click(object sender, EventArgs e)\r
{\r
CheckPixelRatio.CheckState = CheckState.Unchecked;\r
- text_width.Text = "640";\r
- text_height.Text = "352";\r
- drp_videoEncoder.Text = "H.264 (iPod)";\r
- text_bitrate.Text = "1000";\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
text_filesize.Text = "";\r
slider_videoQuality.Value = 0;\r
SliderValue.Text = "0%";\r
drp_audioBitrate.Text = "160";\r
- rtf_h264advanced.Text = "";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "level=41";\r
drp_crop.Text = "No Crop";\r
}\r
\r
- private void mnu_preset_ipod235_Click(object sender, EventArgs e)\r
+ //------------------------------NEW PRESETS START HERE---------------------------\r
+ private void mnu_normal_Click(object sender, EventArgs e)\r
{\r
CheckPixelRatio.CheckState = CheckState.Unchecked;\r
- text_width.Text = "640";\r
- text_height.Text = "272";\r
- drp_videoEncoder.Text = "H.264 (iPod)";\r
- text_bitrate.Text = "1000";\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
text_filesize.Text = "";\r
slider_videoQuality.Value = 0;\r
SliderValue.Text = "0%";\r
drp_audioBitrate.Text = "160";\r
- rtf_h264advanced.Text = "";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "level=41";\r
drp_crop.Text = "No Crop";\r
}\r
\r
- private void mnu_appleTv_Click(object sender, EventArgs e)\r
+ private void mnu_Classic_Click(object sender, EventArgs e)\r
{\r
+ CheckPixelRatio.CheckState = CheckState.Unchecked;\r
text_width.Text = "";\r
text_height.Text = "";\r
drp_videoEncoder.Text = "H.264";\r
drp_audioBitrate.Text = "160";\r
CheckPixelRatio.CheckState = CheckState.Checked;\r
drp_audioSampleRate.Text = "48";\r
- rtf_h264advanced.Text = "bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";\r
+ rtf_h264advanced.Text = "level=41";\r
drp_crop.Text = "No Crop";\r
- \r
}\r
\r
- private void mnu_presetPS3_Click(object sender, EventArgs e)\r
+ private void mnu_film_Click(object sender, EventArgs e)\r
+ {\r
+ CheckPixelRatio.CheckState = CheckState.Unchecked;\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
+ text_filesize.Text = "";\r
+ slider_videoQuality.Value = 0;\r
+ SliderValue.Text = "0%";\r
+ drp_audioBitrate.Text = "160";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "level=41";\r
+ drp_crop.Text = "No Crop";\r
+ }\r
+\r
+ private void mnu_television_Click(object sender, EventArgs e)\r
+ {\r
+ CheckPixelRatio.CheckState = CheckState.Unchecked;\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
+ text_filesize.Text = "";\r
+ slider_videoQuality.Value = 0;\r
+ SliderValue.Text = "0%";\r
+ drp_audioBitrate.Text = "160";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "level=41";\r
+ drp_crop.Text = "No Crop";\r
+ }\r
+\r
+ private void mnu_qt_Click(object sender, EventArgs e)\r
{\r
CheckPixelRatio.CheckState = CheckState.Unchecked;\r
text_width.Text = "";\r
drp_crop.Text = "No Crop";\r
}\r
\r
+ private void mnu_psp_Click(object sender, EventArgs e)\r
+ {\r
+ CheckPixelRatio.CheckState = CheckState.Unchecked;\r
+ text_width.Text = "";\r
+ text_height.Text = "";\r
+ drp_videoEncoder.Text = "H.264";\r
+ text_bitrate.Text = "3000";\r
+ text_filesize.Text = "";\r
+ slider_videoQuality.Value = 0;\r
+ SliderValue.Text = "0%";\r
+ drp_audioBitrate.Text = "160";\r
+ CheckPixelRatio.CheckState = CheckState.Checked;\r
+ drp_audioSampleRate.Text = "48";\r
+ rtf_h264advanced.Text = "level=41";\r
+ drp_crop.Text = "No Crop";\r
+ }\r
+\r
+\r
private void mnu_ProgramDefaultOptions_Click(object sender, EventArgs e)\r
{\r
//Source\r
Properties.Settings.Default.VideoFilesize = text_filesize.Text;\r
Properties.Settings.Default.VideoQuality = slider_videoQuality.Value;\r
Properties.Settings.Default.TwoPass = check_2PassEncode.CheckState.ToString();\r
- Properties.Settings.Default.DeInterlace = check_DeInterlace.CheckState.ToString();\r
+ Properties.Settings.Default.DeInterlace = drp_deInterlace_option.Text;\r
Properties.Settings.Default.Grayscale = check_grayscale.CheckState.ToString();\r
Properties.Settings.Default.Framerate = drp_videoFramerate.Text;\r
Properties.Settings.Default.PixelRatio = CheckPixelRatio.CheckState.ToString();\r
Properties.Settings.Default.turboFirstPass = check_turbo.CheckState.ToString();\r
Properties.Settings.Default.largeFile = check_largeFile.CheckState.ToString();\r
+ Properties.Settings.Default.detelecine = check_detelecine.CheckState.ToString();\r
+ Properties.Settings.Default.denoise = drp_deNoise.Text;\r
+ Properties.Settings.Default.deblock = check_deblock.CheckState.ToString();\r
//Audio Settings Tab\r
Properties.Settings.Default.AudioBitrate = drp_audioBitrate.Text;\r
Properties.Settings.Default.AudioSampleRate = drp_audioSampleRate.Text;\r
// -------------------------------------------------------------- \r
// Buttons on the main Window\r
// --------------------------------------------------------------\r
+\r
+ #region Buttons\r
private void btn_Browse_Click(object sender, EventArgs e)\r
{\r
- \r
- String filename ="";\r
- text_source.Text = "";\r
-\r
- if (RadioDVD.Checked)\r
- {\r
- DVD_Open.ShowDialog();\r
- filename = DVD_Open.SelectedPath;\r
- if (filename != "")\r
- {\r
- text_source.Text = filename;\r
- Form frmReadDVD = new frmReadDVD(filename, this, dvdInfoWindow);\r
- frmReadDVD.ShowDialog();\r
- }\r
- }\r
- else\r
- {\r
- ISO_Open.ShowDialog();\r
- filename = ISO_Open.FileName;\r
- if (filename != "")\r
- {\r
- text_source.Text = filename;\r
- Form frmReadDVD = new frmReadDVD(filename, this, dvdInfoWindow);\r
- frmReadDVD.ShowDialog();\r
- }\r
- } \r
-\r
- // Quick check to make sure some titles were found.\r
- if (filename != "")\r
- {\r
- if (drp_dvdtitle.Items.Count == 0)\r
- {\r
- MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source. Please refer to the FAQ for details..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
- }\r
- }\r
- else\r
- {\r
- text_source.Text = "Click 'Browse' to continue";\r
- }\r
-\r
+ String filename =""; \r
+ text_source.Text = ""; \r
+ \r
+ if (RadioDVD.Checked) \r
+ { \r
+ DVD_Open.ShowDialog(); \r
+ filename = DVD_Open.SelectedPath; \r
+ if (filename != "") \r
+ { \r
+ Form frmRD = new frmReadDVD(filename, this, dvdInfoWindow); \r
+ text_source.Text = filename; \r
+ frmRD.ShowDialog(); \r
+ } \r
+ } \r
+ else \r
+ { \r
+ ISO_Open.ShowDialog(); \r
+ filename = ISO_Open.FileName; \r
+ if (filename != "") \r
+ { \r
+ Form frmRD = new frmReadDVD(filename, this, dvdInfoWindow); \r
+ text_source.Text = filename; \r
+ frmRD.ShowDialog(); \r
+ } \r
+ } \r
+ \r
+ // Check if there was titles in the dvd title dropdown \r
+ if (filename == "") \r
+ { \r
+ text_source.Text = "Click 'Browse' to continue"; \r
+ } \r
+ \r
+ if (drp_dvdtitle.Items.Count == 0) \r
+ { \r
+ MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source. Please refer to the FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand); \r
+ } \r
}\r
\r
private void btn_destBrowse_Click(object sender, EventArgs e)\r
{\r
if (text_destination.Text != "" && text_source.Text != "")\r
{\r
-\r
- String query = GenerateTheQuery();\r
+ string query;\r
+ if (QueryEditorText.Text == "")\r
+ {\r
+ query = GenerateTheQuery();\r
+ }\r
+ else\r
+ {\r
+ query = QueryEditorText.Text;\r
+ }\r
queueWindow.list_queue.Items.Add(query);\r
queueWindow.Show();\r
} \r
queueWindow.Show();\r
}\r
\r
-\r
-\r
-\r
+ #endregion\r
\r
//---------------------------------------------------\r
// Encode / Cancel Buttons\r
// Encode Progress Text Handler\r
//---------------------------------------------------\r
+\r
+ #region Encode/CLI\r
+\r
Functions.CLI process = new Functions.CLI();\r
\r
private void btn_encode_Click(object sender, EventArgs e)\r
{\r
btn_eCancel.Enabled = true;\r
String query = "";\r
- lbl_encode.Visible = true;\r
+ lbl_encode.Visible = false;\r
\r
if (QueryEditorText.Text == "")\r
{\r
}\r
\r
ThreadPool.QueueUserWorkItem(procMonitor, query);\r
+ lbl_encode.Text = "Encoding Started";\r
}\r
\r
private void btn_eCancel_Click(object sender, EventArgs e)\r
\r
private void procMonitor(object state)\r
{\r
- \r
- hbProc = process.runCli(this, (string)state, true, true, false, true);\r
+ // Make sure we are not already encoding and if we are then display an error.\r
+ if (hbProc != null)\r
+ {\r
+ MessageBox.Show("Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+ }\r
+ else\r
+ {\r
+ hbProc = process.runCli(this, (string)state, false, false, false, false);\r
+ MessageBox.Show("The encode process has now started.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
+ hbProc.WaitForExit();\r
+\r
+ try\r
+ {\r
\r
- MessageBox.Show("The encode process has now started.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
+ //*****************************************************************************************\r
+ // BUG!\r
+ // When the below code is used and standard error is set to true, hbcli is outputing a\r
+ // video stream which has mild corruption issues every few seconds.\r
+ // Maybe an issue with the Parser cauing the CLI to hickup/pause?\r
+ //*****************************************************************************************\r
\r
- try\r
- {\r
- Parsing.Parser encode = new Parsing.Parser(hbProc.StandardError.BaseStream);\r
- encode.OnEncodeProgress += encode_OnEncodeProgress;\r
- while (!encode.EndOfStream)\r
+ \r
+ /*Parsing.Parser encode = new Parsing.Parser(hbProc.StandardError.BaseStream);\r
+ encode.OnEncodeProgress += encode_OnEncodeProgress;\r
+ while (!encode.EndOfStream)\r
+ {\r
+ encode.ReadLine();\r
+ }\r
+\r
+ hbProc.WaitForExit();\r
+ process.closeCLI();\r
+ */\r
+ }\r
+ catch (Exception)\r
{\r
- encode.ReadLine();\r
+ // Do nothing\r
}\r
\r
- hbProc.WaitForExit();\r
- process.closeCLI();\r
+ MessageBox.Show("The encode process has now ended.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
hbProc = null;\r
}\r
- catch (Exception)\r
- { \r
- // Do Nothing\r
- }\r
-\r
- //TODO: prevent this event from being subscribed more than once\r
-\r
- \r
- MessageBox.Show("The encode process has now ended.", "Status", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
}\r
\r
-\r
-\r
-\r
private void encode_OnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)\r
{\r
if (this.InvokeRequired)\r
}\r
lbl_encode.Text = string.Format("Encode Progress: {0}%, FPS: {1}, Avg FPS: {2}, Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);\r
}\r
- \r
+\r
+ #endregion\r
+\r
//---------------------------------------------------\r
// Items that require actions on frmMain\r
//---------------------------------------------------\r
\r
+ #region frmMain Actions\r
+\r
private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)\r
{\r
lbl_chptWarn.Visible = false;\r
{\r
try\r
{\r
- if (CheckPixelRatio.Checked)\r
+ if (text_height.Text != "Auto")\r
{\r
- text_height.Text = "";\r
- text_width.BackColor = Color.White;\r
- }\r
- else\r
- {\r
- if ((int.Parse(text_height.Text) % 16) != 0)\r
+ if (CheckPixelRatio.Checked)\r
{\r
- text_height.BackColor = Color.LightCoral;\r
+ text_height.Text = "";\r
+ text_width.BackColor = Color.White;\r
}\r
else\r
{\r
- text_height.BackColor = Color.LightGreen;\r
+ if ((int.Parse(text_height.Text) % 16) != 0)\r
+ {\r
+ text_height.BackColor = Color.LightCoral;\r
+ }\r
+ else\r
+ {\r
+ text_height.BackColor = Color.LightGreen;\r
+ }\r
}\r
}\r
} catch(Exception){\r
}\r
}\r
\r
- //---------------------------------------------------\r
- // The query Generation function.\r
- //---------------------------------------------------\r
+ #endregion\r
+\r
+ /* \r
+ * ---------------------------------------------------\r
+ * \r
+ * The query Generation function.\r
+ * \r
+ * ---------------------------------------------------\r
+ */\r
+\r
+ #region Program Functions\r
+\r
public string GenerateTheQuery()\r
{\r
string source = text_source.Text;\r
\r
if (width != "")\r
width = " -w "+ width;\r
- \r
\r
- if (height != "")\r
- height = " -l "+ height;\r
+\r
+ if (height == "Auto")\r
+ {\r
+ height = "";\r
+ }\r
+ else if (height != "")\r
+ {\r
+ height = " -l " + height;\r
+ }\r
\r
\r
string queryDestination = destination+ videoEncoder+ audioEncoder+ width+ height;\r
string cropRight = text_right.Text;\r
string subtitles = drp_subtitle.Text;\r
string cropOut = "";\r
+ string deInterlace_Option = drp_deInterlace_option.Text;\r
+ string deinterlace = "";\r
+ string grayscale = "";\r
+ string pixelRatio = "";\r
+ string ChapterMarkers = "";\r
// Returns Crop Query\r
\r
if (cropSetting == "Auto Crop")\r
subtitles = " -s "+ tempSub[0];\r
}\r
\r
- string queryPictureSettings = cropOut+ subtitles;\r
+ switch (deInterlace_Option)\r
+ {\r
+ case "None":\r
+ deinterlace = "";\r
+ break;\r
+ case "Origional (Fast)":\r
+ deinterlace = " --deinterlace";\r
+ break;\r
+ case "yadif (Slow)":\r
+ deinterlace = " --deinterlace=" + '"' + "1" + '"';\r
+ break;\r
+ case "yadif + mcdeint (Slower)":\r
+ deinterlace = " --deinterlace=" + '"' + "1:-1:1" + '"';\r
+ break;\r
+ case "yadif + mcdeint (Slowest)":\r
+ deinterlace = " --deinterlace=" + '"' + "3:-1:2" + '"';\r
+ break;\r
+ default:\r
+ deinterlace = " --deinterlace=";\r
+ break;\r
+ }\r
+\r
+ if (check_grayscale.Checked)\r
+ grayscale = " -g ";\r
+\r
+ if (CheckPixelRatio.Checked)\r
+ pixelRatio = " -p ";\r
+\r
+ if (Check_ChapterMarkers.Checked)\r
+ ChapterMarkers = " -m ";\r
+\r
+ string queryPictureSettings = cropOut + subtitles + deinterlace + grayscale + pixelRatio + ChapterMarkers;\r
// ----------------------------------------------------------------------\r
\r
// Video Settings Tab\r
int videoQuality = slider_videoQuality.Value;\r
string vidQSetting = "";\r
string twoPassEncoding = "";\r
- string deinterlace = "";\r
- string grayscale = "";\r
string videoFramerate = drp_videoFramerate.Text;\r
- string pixelRatio = "";\r
- string ChapterMarkers = "";\r
string turboH264 = "";\r
string largeFile = "";\r
+ string deblock = "";\r
+ string detelecine = "";\r
+ string denoise = "";\r
\r
if (videoBitrate != "")\r
videoBitrate = " -b "+ videoBitrate;\r
if (check_2PassEncode.Checked)\r
twoPassEncoding = " -2 ";\r
\r
- if (check_DeInterlace.Checked)\r
- deinterlace = " -d ";\r
-\r
- if (check_grayscale.Checked)\r
- grayscale = " -g ";\r
-\r
if (videoFramerate == "Automatic")\r
videoFramerate = "";\r
else\r
videoFramerate = " -r "+ videoFramerate;\r
\r
- if (CheckPixelRatio.Checked)\r
- pixelRatio = " -p ";\r
-\r
- if (Check_ChapterMarkers.Checked)\r
- ChapterMarkers = " -m ";\r
-\r
if (check_turbo.Checked)\r
turboH264 = " -T ";\r
\r
if (check_largeFile.Checked)\r
largeFile = " -4 ";\r
\r
- string queryVideoSettings = videoBitrate + videoFilesize + vidQSetting + twoPassEncoding + deinterlace + grayscale + videoFramerate + pixelRatio + ChapterMarkers + turboH264 + largeFile;\r
+ if (check_deblock.Checked)\r
+ deblock = " --deblock";\r
+\r
+ if (check_detelecine.Checked)\r
+ detelecine = " --detelecine";\r
+\r
+ switch (drp_deNoise.Text)\r
+ {\r
+ case "None":\r
+ denoise = "";\r
+ break;\r
+ case "Weak":\r
+ denoise = " --denoise=3:2:3:3";\r
+ break;\r
+ case "Strong":\r
+ denoise = " --denoise=7:7:5:5";\r
+ break;\r
+ default:\r
+ denoise = "";\r
+ break;\r
+ }\r
+\r
+ string queryVideoSettings = videoBitrate + videoFilesize + vidQSetting + twoPassEncoding + videoFramerate + turboH264 + largeFile + deblock + detelecine + denoise;\r
// ----------------------------------------------------------------------\r
\r
// Audio Settings Tab\r
return querySource+ queryDestination+ queryPictureSettings+ queryVideoSettings+ h264Settings+ queryAudioSettings+ queryAdvancedSettings+ verbose;\r
}\r
\r
+ #endregion\r
+\r
\r
\r
+\r
// This is the END of the road ------------------------------------------------------------------------------\r
}\r
}
\ No newline at end of file