DLS복본검사기능 데모 판 완료.
This commit is contained in:
		| @@ -202,7 +202,7 @@ | |||||||
|             } |             } | ||||||
|             "{3C67513D-01DD-4637-8A68-80971EB9504F}:_A364675CFF7847C09ACEC7EAA54B96DD" |             "{3C67513D-01DD-4637-8A68-80971EB9504F}:_A364675CFF7847C09ACEC7EAA54B96DD" | ||||||
|             { |             { | ||||||
|             "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]" |             "DefaultLocation" = "8:c:\\[Manufacturer]\\[ProductName]" | ||||||
|             "Name" = "8:#1925" |             "Name" = "8:#1925" | ||||||
|             "AlwaysCreate" = "11:FALSE" |             "AlwaysCreate" = "11:FALSE" | ||||||
|             "Condition" = "8:" |             "Condition" = "8:" | ||||||
|   | |||||||
| @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | |||||||
| // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를 | ||||||
| // 기본값으로 할 수 있습니다. | // 기본값으로 할 수 있습니다. | ||||||
| // [assembly: AssemblyVersion("1.0.*")] | // [assembly: AssemblyVersion("1.0.*")] | ||||||
| [assembly: AssemblyVersion("1.0.187.3")] | [assembly: AssemblyVersion("1.0.187.4")] | ||||||
| [assembly: AssemblyFileVersion("1.0.187.3")] | [assembly: AssemblyFileVersion("1.0.187.4")] | ||||||
|   | |||||||
							
								
								
									
										498
									
								
								unimarc/unimarc/SearchModel/DLSSearcher.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										498
									
								
								unimarc/unimarc/SearchModel/DLSSearcher.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,498 @@ | |||||||
|  | using System; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using OpenQA.Selenium; | ||||||
|  | using OpenQA.Selenium.Chrome; | ||||||
|  | using OpenQA.Selenium.Support.UI; | ||||||
|  | using System.Text.RegularExpressions; | ||||||
|  | using WebDriverManager; | ||||||
|  | using WebDriverManager.DriverConfigs.Impl; | ||||||
|  | using System.IO; | ||||||
|  | using System.Runtime.InteropServices; | ||||||
|  | using System.Threading; | ||||||
|  | using UniMarc.마크; | ||||||
|  | using OpenQA.Selenium.Chromium; | ||||||
|  | using UniMarc.SearchModel; | ||||||
|  | using System.Runtime.CompilerServices; | ||||||
|  |  | ||||||
|  | namespace BokBonCheck | ||||||
|  | { | ||||||
|  |     public class DLSSearcher : ILibrarySearcher | ||||||
|  |     { | ||||||
|  |         public string SiteName { get; protected set; } = "DLS"; | ||||||
|  |         public string SiteUrl => "https://dls1.edunet.net/DLS/bookMng/bookMain"; | ||||||
|  |  | ||||||
|  |         public int No { get; set; } | ||||||
|  |  | ||||||
|  |         private ChromiumDriver _driver; | ||||||
|  |  | ||||||
|  |         public DLSSearcher(int no) | ||||||
|  |         { | ||||||
|  |             this.No = no; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void StopDriver() | ||||||
|  |         { | ||||||
|  |             if (_driver != null) | ||||||
|  |             { | ||||||
|  |                 _driver.Quit(); | ||||||
|  |                 _driver.Dispose(); | ||||||
|  |                 _driver = null; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task StartDriver(bool showBrowser = false) | ||||||
|  |         { | ||||||
|  |             if (_driver == null) | ||||||
|  |             { | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     if (SeleniumHelper.IsReady == false) await SeleniumHelper.Download(); | ||||||
|  |                     _driver = await SeleniumHelper.CreateDriver(ShowBrowser: showBrowser); | ||||||
|  |                     Console.WriteLine("DLSSearcher Driver 초기화 완료"); | ||||||
|  |                 } | ||||||
|  |                 catch (Exception ex) | ||||||
|  |                 { | ||||||
|  |                     Console.WriteLine($"DLSSearcher Driver 초기화 실패: {ex.Message}"); | ||||||
|  |                     throw new InvalidOperationException($"DLSSearcher Driver 초기화에 실패했습니다: {ex.Message}", ex); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         virtual protected bool SelectLibrary(WebDriverWait wait) | ||||||
|  |         { | ||||||
|  |             IWebElement searchBox = null; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var selector = "#clickAll"; | ||||||
|  |                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||||
|  |                 if (searchBox == null) return false; | ||||||
|  |                 if (searchBox.Selected == false) | ||||||
|  |                 { | ||||||
|  |                     SafeClick(searchBox); | ||||||
|  |                 } | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 Console.WriteLine(ex.Message); | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected void SafeClick(IWebElement searchBox) | ||||||
|  |         { | ||||||
|  |             // 안정적인 클릭을 위한 여러 방법 시도 | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 // 1. JavaScript로 클릭 시도 | ||||||
|  |                 var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||||
|  |                 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", searchBox); | ||||||
|  |             } | ||||||
|  |             catch | ||||||
|  |             { | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     // 2. 요소가 보이도록 스크롤 후 클릭 | ||||||
|  |                     var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||||
|  |                     ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", searchBox); | ||||||
|  |                     Thread.Sleep(500); | ||||||
|  |                     searchBox.Click(); | ||||||
|  |                 } | ||||||
|  |                 catch | ||||||
|  |                 { | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         // 3. Actions 클래스 사용 | ||||||
|  |                         var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||||
|  |                         var actions = new OpenQA.Selenium.Interactions.Actions(driver); | ||||||
|  |                         actions.MoveToElement(searchBox).Click().Perform(); | ||||||
|  |                     } | ||||||
|  |                     catch | ||||||
|  |                     { | ||||||
|  |                         // 4. 마지막 방법: JavaScript로 직접 체크 해제 | ||||||
|  |                         var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||||
|  |                         ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].checked = false;", searchBox); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<(Boolean, string)> Login(string id, string pw, bool showBrowser = false) | ||||||
|  |         { | ||||||
|  |             // 드라이버가 없으면 자동으로 시작 | ||||||
|  |             if (_driver == null) | ||||||
|  |             { | ||||||
|  |                 await StartDriver(showBrowser); | ||||||
|  |             } | ||||||
|  |             if (_driver.Url.StartsWith("data:")) | ||||||
|  |             { | ||||||
|  |                 _driver.Navigate().GoToUrl(SiteUrl); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |  | ||||||
|  |             if (_driver.Url.EndsWith("loginMain")) | ||||||
|  |             { | ||||||
|  |                 IWebElement idBox = wait.Until(d => d.FindElement(By.CssSelector("#lgID"))); | ||||||
|  |                 if (idBox == null) | ||||||
|  |                 { | ||||||
|  |                     return (false, "로그인화면(ID찾기실패)"); | ||||||
|  |                 } | ||||||
|  |                 idBox.Clear(); | ||||||
|  |                 idBox.SendKeys(id); | ||||||
|  |  | ||||||
|  |                 IWebElement pwBox = wait.Until(t => t.FindElement(By.CssSelector("#lgPW"))); | ||||||
|  |                 if (idBox == null) | ||||||
|  |                 { | ||||||
|  |                     return (false, "로그인화면(PW찾기실패)"); | ||||||
|  |                 } | ||||||
|  |                 pwBox.Clear(); | ||||||
|  |                 pwBox.SendKeys(pw); | ||||||
|  |  | ||||||
|  |                 //로그인버튼찾기 | ||||||
|  |                 IWebElement btLogin = wait.Until(t => t.FindElement(By.CssSelector("#loginBtn"))); | ||||||
|  |                 if (idBox == null) | ||||||
|  |                 { | ||||||
|  |                     return (false, "로그인화면(로그인버튼찾기실패)"); | ||||||
|  |                 } | ||||||
|  |                 SafeClick(btLogin); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |             var retrycnt = 0; | ||||||
|  |             while (true) | ||||||
|  |             { | ||||||
|  |                 if (_driver.Url.EndsWith("/bookMain") == false) | ||||||
|  |                 { | ||||||
|  |                     retrycnt += 1; | ||||||
|  |                     Console.WriteLine($"도서검색화면으로 이동({retrycnt})"); | ||||||
|  |                     _driver.Navigate().GoToUrl(this.SiteUrl); | ||||||
|  |                     wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |                     await Task.Delay(1000); | ||||||
|  |                 } | ||||||
|  |                 else break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             Console.WriteLine("DLS 로그인 완료"); | ||||||
|  |             return (true, ""); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         string ID, PW, SCHOOL, STYPE; | ||||||
|  |         public void SetParameter(string id, string pw, string schoolname, string searchtype) | ||||||
|  |         { | ||||||
|  |             this.ID = id; | ||||||
|  |             this.PW = pw; | ||||||
|  |             this.SCHOOL = schoolname; | ||||||
|  |             this.STYPE = searchtype; | ||||||
|  |         } | ||||||
|  |         public async Task<BookSearchResult> SearchAsync(string searchTerm) | ||||||
|  |         { | ||||||
|  |             var result = new BookSearchResult | ||||||
|  |             { | ||||||
|  |                 SiteName = SiteName, | ||||||
|  |                 SearchTerm = searchTerm, | ||||||
|  |                 SearchTime = DateTime.Now | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 // 드라이버가 없으면 자동으로 시작 | ||||||
|  |                 if (_driver == null) | ||||||
|  |                 { | ||||||
|  |                     await StartDriver(); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(searchTerm.Trim())) | ||||||
|  |                 { | ||||||
|  |                     result.ErrorMessage = "검색어없음"; | ||||||
|  |                     result.BookCount = -1; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     return result; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 //현재url이 로그인 uRL이라면 로그인을 먼저한다 | ||||||
|  |                 //https://dls1.edunet.net/DLS/loginMain | ||||||
|  |                 //ID : #lgID , PW: #lgPW, Button : #loginBtn | ||||||
|  |                 if (_driver.Url.EndsWith("loginMain")) | ||||||
|  |                 { | ||||||
|  |                     result.ErrorMessage = "로그인안됨"; | ||||||
|  |                     result.BookCount = -1; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     return result; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 var retcnt = 0; | ||||||
|  |                 while (_driver.Url.EndsWith("/bookMain") == false) | ||||||
|  |                 { | ||||||
|  |                     retcnt += 1; | ||||||
|  |                     if (retcnt > 3) | ||||||
|  |                     { | ||||||
|  |                         //3회이상 실패하면 오류 처리한다. | ||||||
|  |                         result.ErrorMessage = "검색페이지이동불가"; | ||||||
|  |                         result.BookCount = -1; | ||||||
|  |                         result.IsSuccess = false; | ||||||
|  |                         return result; | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         //검색페이지로 이동시키고 | ||||||
|  |                         _driver.Navigate().GoToUrl(this.SiteUrl); | ||||||
|  |                         new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |                         await Task.Delay(1000); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // 페이지 로딩 대기 | ||||||
|  |                 var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |  | ||||||
|  |                 //초등학교명 일치 확인 | ||||||
|  |                 var selectSchool = wait.Until(t => t.FindElement(By.CssSelector("#current_school_select"))); | ||||||
|  |                 if (selectSchool == null) | ||||||
|  |                 { | ||||||
|  |                     result.ErrorMessage = "학교선택칸없음"; | ||||||
|  |                     result.BookCount = -1; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     return result; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     Console.WriteLine($"학교명:{this.SCHOOL}"); | ||||||
|  |                     var select = new SelectElement(selectSchool); | ||||||
|  |  | ||||||
|  |                     var curTxt = select.SelectedOption.Text; | ||||||
|  |                     var curVal = select.SelectedOption.GetAttribute("value"); | ||||||
|  |                     if (curTxt.Contains(this.SCHOOL) == false && this.SCHOOL.Contains(curTxt) == false) | ||||||
|  |                     { | ||||||
|  |                         select.SelectByText(this.SCHOOL); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         //이름이 포함되어있다. | ||||||
|  |                         Console.WriteLine($"지정학교:{this.SCHOOL}, 현재선택학교:{curTxt}"); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 //검색방법(ISBN,서명) 확인 #search_field_first,  title, ea_isbn | ||||||
|  |                 var selectType = wait.Until(t => t.FindElement(By.CssSelector("#search_field_first"))); | ||||||
|  |                 if (selectType == null) | ||||||
|  |                 { | ||||||
|  |                     result.ErrorMessage = "검색방법없음"; | ||||||
|  |                     result.BookCount = -1; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     return result; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |  | ||||||
|  |                     var select = new SelectElement(selectType); | ||||||
|  |                     var curTxt = select.SelectedOption.Text; | ||||||
|  |                     var curVal = select.SelectedOption.GetAttribute("value"); | ||||||
|  |                     Console.WriteLine($"지정방법:{this.STYPE}, 현재선택방법:{curVal}"); | ||||||
|  |                     if (this.STYPE.Equals(curVal) == false) | ||||||
|  |                         select.SelectByValue(this.STYPE); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 //검색어입력 | ||||||
|  |                 var tbSearch = wait.Until(t => t.FindElement(By.CssSelector("#search_first"))); | ||||||
|  |                 if (tbSearch == null) | ||||||
|  |                 { | ||||||
|  |                     result.ErrorMessage = "검색어입력칸없음"; | ||||||
|  |                     result.BookCount = -1; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     return result; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     tbSearch.Clear(); | ||||||
|  |                     tbSearch.SendKeys(searchTerm); | ||||||
|  |                 } | ||||||
|  |                 wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15)); | ||||||
|  |                 await Task.Delay(200); | ||||||
|  |  | ||||||
|  |                 //검색실행 | ||||||
|  |                 var butSearch = wait.Until(t => t.FindElement(By.CssSelector("#book_search_btn"))); | ||||||
|  |                 SafeClick(butSearch); | ||||||
|  |  | ||||||
|  |                 // 페이지 변경을 감지하는 메서드 | ||||||
|  |                 await WaitForPageChange(new WebDriverWait(_driver, TimeSpan.FromSeconds(15))); | ||||||
|  |  | ||||||
|  |                 // 검색 결과 수 추출 | ||||||
|  |                 var resultCount = ExtractBookCount(_driver, searchTerm, out string ermsg); | ||||||
|  |                 if (resultCount == -1) | ||||||
|  |                 { | ||||||
|  |                     result.BookCount = 0; | ||||||
|  |                     result.IsSuccess = false; | ||||||
|  |                     result.ErrorMessage = ermsg; | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     result.BookCount = resultCount; | ||||||
|  |                     result.IsSuccess = true; | ||||||
|  |                     result.ErrorMessage = ermsg; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 result.IsSuccess = false; | ||||||
|  |                 result.ErrorMessage = ex.Message; | ||||||
|  |                 result.BookCount = 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return result; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private int ExtractBookCount(IWebDriver driver, string searchTerm, out string errmessage) | ||||||
|  |         { | ||||||
|  |             errmessage = string.Empty; | ||||||
|  |  | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var msgElement = driver.FindElement(By.CssSelector(".modal-body[name='msg_txt']")); | ||||||
|  |                 if (msgElement != null) | ||||||
|  |                 { | ||||||
|  |                     string messageText = msgElement.Text; | ||||||
|  |                     bool hasNoDataMessage = messageText.Contains("검색된 자료가 없습니다"); | ||||||
|  |                     if (hasNoDataMessage) | ||||||
|  |                     { | ||||||
|  |                         errmessage = "검색결과없음"; | ||||||
|  |                         return 0; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 | ||||||
|  |             } | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 // result 클래스 div에서 텍스트 추출 | ||||||
|  |                 var resultElement = driver.FindElement(By.CssSelector("div.result")); | ||||||
|  |                 if (resultElement != null) | ||||||
|  |                 { | ||||||
|  |                     string resultText = resultElement.Text; // "1 - 30 of 684" | ||||||
|  |  | ||||||
|  |                     // 정규식으로 마지막 숫자 추출 | ||||||
|  |                     var match = System.Text.RegularExpressions.Regex.Match(resultText, @"of\s+(\d+)"); | ||||||
|  |                     if (match.Success) | ||||||
|  |                     { | ||||||
|  |                         int totalCount = int.Parse(match.Groups[1].Value); | ||||||
|  |                         Console.WriteLine($"전체 책 개수: {totalCount}"); | ||||||
|  |                         errmessage = ""; | ||||||
|  |                         return totalCount; | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         errmessage = "수량추출실패"; | ||||||
|  |                         return -1; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |            | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             errmessage = "결과확인실패"; | ||||||
|  |             return -1; | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // 페이지 변경을 감지하는 메서드 | ||||||
|  |         public async Task WaitForPageChange(WebDriverWait wait) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 await Task.Delay(500); | ||||||
|  |  | ||||||
|  |                 // 방법 4: 페이지 로딩 상태 확인 | ||||||
|  |                 wait.Until(d => | ||||||
|  |                 { | ||||||
|  |                     var readyState = ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState"); | ||||||
|  |                     return readyState.Equals("complete"); | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|  |                 // 방법 5: 특정 텍스트가 페이지에 나타날 때까지 대기 | ||||||
|  |                 wait.Until(d => | ||||||
|  |                 { | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         var elm = d.FindElement(By.CssSelector(".modal-body[name='msg_txt']")); | ||||||
|  |                         if (elm == null) | ||||||
|  |                         { | ||||||
|  |                             //모달창이 없을때 | ||||||
|  |                             //#pagersearch_book_grid > div > div:nth-child(1) > div | ||||||
|  |                             var byclassnameRlt = By.CssSelector("#pagersearch_book_grid > div > div:nth-child(1) > div > strong:nth-child(2)"); | ||||||
|  |                             var elmRlt = d.FindElement(byclassnameRlt); | ||||||
|  |                             if (elmRlt == null) | ||||||
|  |                             { | ||||||
|  |                                 return false; | ||||||
|  |                             } | ||||||
|  |                             else | ||||||
|  |                             { | ||||||
|  |                                 Console.WriteLine($"찾은갯수:{elmRlt.Text}"); | ||||||
|  |                                 return true; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             var pageText = elm.Text; | ||||||
|  |                             if (pageText.Contains("검색된 자료가 없습니다")) return true; | ||||||
|  |                             else return false; | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         //return pageText.Contains("에 대하여") && pageText.Contains("검색되었습니다"); | ||||||
|  |                     } | ||||||
|  |                     catch (Exception ex) | ||||||
|  |                     { | ||||||
|  |                         //Console.WriteLine(ex.Message); | ||||||
|  |                         //return false; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |  | ||||||
|  |                         //모달창이 없을때 | ||||||
|  |                         //#pagersearch_book_grid > div > div:nth-child(1) > div | ||||||
|  |                         var byclassnameRlt = By.CssSelector("#pagersearch_book_grid > div > div:nth-child(1) > div > strong:nth-child(2)"); | ||||||
|  |                         var elmRlt = d.FindElement(byclassnameRlt); | ||||||
|  |                         if (elmRlt == null) | ||||||
|  |                         { | ||||||
|  |                             return false; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             Console.WriteLine($"찾은갯수:{elmRlt.Text}"); | ||||||
|  |                             return true; | ||||||
|  |                         } | ||||||
|  |                         //return pageText.Contains("에 대하여") && pageText.Contains("검색되었습니다"); | ||||||
|  |                     } | ||||||
|  |                     catch (Exception ex) | ||||||
|  |                     { | ||||||
|  |                         //Console.WriteLine(ex.Message); | ||||||
|  |                         //return false; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     return false; | ||||||
|  |  | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 // 모든 감지 방법이 실패하면 최소한의 대기 시간 적용 | ||||||
|  |                 await Task.Delay(2000); | ||||||
|  |                 throw new Exception($"페이지 변경 감지 실패: {ex.Message}"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -16,6 +16,8 @@ using System.Runtime.CompilerServices; | |||||||
|  |  | ||||||
| namespace BokBonCheck | namespace BokBonCheck | ||||||
| { | { | ||||||
|  |  | ||||||
|  |  | ||||||
|     public class NamguLibrarySearcher_Munhwa : NamguLibrarySearcher |     public class NamguLibrarySearcher_Munhwa : NamguLibrarySearcher | ||||||
|     { |     { | ||||||
|         public NamguLibrarySearcher_Munhwa(int no) : base(no) |         public NamguLibrarySearcher_Munhwa(int no) : base(no) | ||||||
|   | |||||||
| @@ -206,7 +206,7 @@ namespace UniMarc.SearchModel | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static async Task<ChromiumDriver> CreateDriver(ChromiumOptions options = null, DownloadProgressForm progressForm = null) |         public static async Task<ChromiumDriver> CreateDriver(ChromiumOptions options = null, DownloadProgressForm progressForm = null, bool ShowBrowser=false) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|             if (progressForm != null) |             if (progressForm != null) | ||||||
| @@ -218,7 +218,7 @@ namespace UniMarc.SearchModel | |||||||
|                 if (options == null) |                 if (options == null) | ||||||
|                 { |                 { | ||||||
|                     Console.WriteLine("브라우저 옵션을 기본으로 설정합니다"); |                     Console.WriteLine("브라우저 옵션을 기본으로 설정합니다"); | ||||||
|                     options = CreateBaseBrowserOption(); |                     options = CreateBaseBrowserOption(!ShowBrowser); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (Browser == eBrowserType.edge) |                 if (Browser == eBrowserType.edge) | ||||||
|   | |||||||
| @@ -226,6 +226,7 @@ | |||||||
|     </Compile> |     </Compile> | ||||||
|     <Compile Include="PUB.cs" /> |     <Compile Include="PUB.cs" /> | ||||||
|     <Compile Include="SearchModel\BookSearchService.cs" /> |     <Compile Include="SearchModel\BookSearchService.cs" /> | ||||||
|  |     <Compile Include="SearchModel\DLSSearcher.cs" /> | ||||||
|     <Compile Include="SearchModel\DownloadProgressForm.cs"> |     <Compile Include="SearchModel\DownloadProgressForm.cs"> | ||||||
|       <SubType>Form</SubType> |       <SubType>Form</SubType> | ||||||
|     </Compile> |     </Compile> | ||||||
|   | |||||||
| @@ -190,7 +190,7 @@ namespace WindowsFormsApp1.Delivery | |||||||
|                 dc.lbl_ID.Text = dataGridView1.Rows[idx].Cells["DLS_ID"].Value.ToString(); |                 dc.lbl_ID.Text = dataGridView1.Rows[idx].Cells["DLS_ID"].Value.ToString(); | ||||||
|                 dc.lbl_PW.Text = dataGridView1.Rows[idx].Cells["DLS_PW"].Value.ToString(); |                 dc.lbl_PW.Text = dataGridView1.Rows[idx].Cells["DLS_PW"].Value.ToString(); | ||||||
|                 dc.lbl_Area.Text = dataGridView1.Rows[idx].Cells["DLS_Area"].Value.ToString(); |                 dc.lbl_Area.Text = dataGridView1.Rows[idx].Cells["DLS_Area"].Value.ToString(); | ||||||
|                 dc.SetArea(dataGridView1.Rows[idx].Cells["DLS_Area"].Value.ToString(), true); |                 //dc.SetArea(dataGridView1.Rows[idx].Cells["DLS_Area"].Value.ToString(), true); | ||||||
|             } |             } | ||||||
|             if (sl != null) {  |             if (sl != null) {  | ||||||
|                 sl.tb_SearchClient.Text = value; |                 sl.tb_SearchClient.Text = value; | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								unimarc/unimarc/마크/DLS_Copy.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								unimarc/unimarc/마크/DLS_Copy.Designer.cs
									
									
									
										generated
									
									
									
								
							| @@ -154,6 +154,8 @@ | |||||||
|             //  |             //  | ||||||
|             this.chkShowBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); |             this.chkShowBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); | ||||||
|             this.chkShowBrowser.AutoSize = true; |             this.chkShowBrowser.AutoSize = true; | ||||||
|  |             this.chkShowBrowser.Checked = true; | ||||||
|  |             this.chkShowBrowser.CheckState = System.Windows.Forms.CheckState.Checked; | ||||||
|             this.chkShowBrowser.Location = new System.Drawing.Point(395, 7); |             this.chkShowBrowser.Location = new System.Drawing.Point(395, 7); | ||||||
|             this.chkShowBrowser.Name = "chkShowBrowser"; |             this.chkShowBrowser.Name = "chkShowBrowser"; | ||||||
|             this.chkShowBrowser.Size = new System.Drawing.Size(96, 16); |             this.chkShowBrowser.Size = new System.Drawing.Size(96, 16); | ||||||
|   | |||||||
| @@ -16,18 +16,27 @@ namespace WindowsFormsApp1.Mac | |||||||
|     { |     { | ||||||
|         Main main; |         Main main; | ||||||
|         public string compidx; |         public string compidx; | ||||||
|         string URL = "https://reading.jnei.go.kr"; |         string URL = "https://dls1.edunet.net/DLS/bookMng/bookMain"; | ||||||
|         public DLS_Copy(Main _main) |         public DLS_Copy(Main _main) | ||||||
|         { |         { | ||||||
|             InitializeComponent(); |             InitializeComponent(); | ||||||
|             main = _main; |             main = _main; | ||||||
|             compidx = main.com_idx; |             compidx = main.com_idx; | ||||||
|  |  | ||||||
|  |             //https://dls.edunet.net/DLS/totalLoginMain | ||||||
|             URL = "https://dls.edunet.net/DLS/totalLoginMain"; |             //아이디: yudeok5530 비번: YUDEOK6578 | ||||||
|             //url = "https://read365.edunet.net/TotalSearch"; |             //url = "https://read365.edunet.net/TotalSearch"; | ||||||
|  |  | ||||||
|             //변경된 홈페이지: https://dls.edunet.net/DLS/totalLoginMain사용 ID / 비번 : t5191774 / tb5191774 |             this.FormClosed += DLS_Copy_FormClosed; | ||||||
|  |             btn_Search.Enabled = false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private void DLS_Copy_FormClosed(object sender, FormClosedEventArgs e) | ||||||
|  |         { | ||||||
|  |             if (_searcher != null) | ||||||
|  |             { | ||||||
|  |                 _searcher.StopDriver(); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void DLS_Copy_Load(object sender, EventArgs e) |         private void DLS_Copy_Load(object sender, EventArgs e) | ||||||
| @@ -154,7 +163,7 @@ namespace WindowsFormsApp1.Mac | |||||||
|         } |         } | ||||||
|         #endregion |         #endregion | ||||||
|  |  | ||||||
|         private void btn_Connect_Click(object sender, EventArgs e) |         async private void btn_Connect_Click(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             if (lbl_Client.Text == "Client") |             if (lbl_Client.Text == "Client") | ||||||
|             { |             { | ||||||
| @@ -166,13 +175,21 @@ namespace WindowsFormsApp1.Mac | |||||||
|                 MessageBox.Show("설정된 지역이 없습니다. 납품처 관리에서 확인해주세요."); |                 MessageBox.Show("설정된 지역이 없습니다. 납품처 관리에서 확인해주세요."); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             btn_Search.Enabled = true; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             //로그인 | ||||||
|  |             _searcher = new DLSSearcher(50); | ||||||
|  |             var ret = await _searcher.Login(this.lbl_ID.Text, this.lbl_PW.Text, this.chkShowBrowser.Checked); | ||||||
|  |             if (ret.Item1 == false) | ||||||
|  |                 AR.UTIL.MsgE(ret.Item2); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private bool tStop = false; |         DLSSearcher _searcher = null; | ||||||
|         private int tSearchIDX = 0; |  | ||||||
|         private void btn_Search_Click(object sender, EventArgs e) |         async private void btn_Search_Click(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             tStop = false; |  | ||||||
|             if (dataGridView1.Rows[0].Cells["ISBN"].Value == null && rBtn_ISBN.Checked) |             if (dataGridView1.Rows[0].Cells["ISBN"].Value == null && rBtn_ISBN.Checked) | ||||||
|             { |             { | ||||||
|                 MessageBox.Show("ISBN이 입력되지않았습니다!"); |                 MessageBox.Show("ISBN이 입력되지않았습니다!"); | ||||||
| @@ -183,6 +200,29 @@ namespace WindowsFormsApp1.Mac | |||||||
|                 MessageBox.Show("도서명이 입력되지않았습니다!"); |                 MessageBox.Show("도서명이 입력되지않았습니다!"); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |             if (_searcher == null) | ||||||
|  |             { | ||||||
|  |                 AR.UTIL.MsgE("접속버튼을 눌러 사이트 로그인을 완료 하세요"); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             var sType = rBtn_ISBN.Checked ? "ea_isbn" : "title"; | ||||||
|  |             _searcher.SetParameter(this.lbl_ID.Text, lbl_PW.Text, "유덕초등학교", sType); | ||||||
|  |  | ||||||
|  |             foreach (DataGridViewRow dr in this.dataGridView1.Rows) | ||||||
|  |             { | ||||||
|  |                 var title = dr.Cells[0].Value?.ToString() ?? string.Empty; | ||||||
|  |                 var isbn = dr.Cells[1].Value?.ToString() ?? string.Empty; | ||||||
|  |                 var search = rBtn_ISBN.Checked ? isbn : title; | ||||||
|  |                 var rlt = await _searcher.SearchAsync(search); | ||||||
|  |                 if(rlt.IsSuccess==false) | ||||||
|  |                 { | ||||||
|  |                     dr.Cells[2].Value = rlt.ErrorMessage; | ||||||
|  |                 }else | ||||||
|  |                 { | ||||||
|  |                     if (rlt.BookCount > 0) dr.Cells[2].Value = "Y"; | ||||||
|  |                     else dr.Cells[2].Value = "N"; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|              |              | ||||||
|  |  | ||||||
|             MessageBox.Show("완료되었습니다."); |             MessageBox.Show("완료되었습니다."); | ||||||
| @@ -242,7 +282,6 @@ namespace WindowsFormsApp1.Mac | |||||||
|  |  | ||||||
|         private void btn_Reflesh008_Click(object sender, EventArgs e) |         private void btn_Reflesh008_Click(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             tSearchIDX = 0; |  | ||||||
|             for (int a = 0; a < dataGridView1.Rows.Count; a++) |             for (int a = 0; a < dataGridView1.Rows.Count; a++) | ||||||
|             { |             { | ||||||
|                 dataGridView1.Rows[a].Cells["Check"].Value = ""; |                 dataGridView1.Rows[a].Cells["Check"].Value = ""; | ||||||
| @@ -253,7 +292,6 @@ namespace WindowsFormsApp1.Mac | |||||||
|  |  | ||||||
|         private void btnStop_Click(object sender, EventArgs e) |         private void btnStop_Click(object sender, EventArgs e) | ||||||
|         { |         { | ||||||
|             tStop = true; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void btn_SiteDenote_Click(object sender, EventArgs e) |         private void btn_SiteDenote_Click(object sender, EventArgs e) | ||||||
|   | |||||||
| @@ -132,38 +132,37 @@ | |||||||
|         iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAIFQTFRF//// |         iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAIFQTFRF//// | ||||||
|         AAAAlJSU4ODgU1NT6enp+Pj4w8PDxMTEkpKS/Pz81tbW5eXlRERE3NzcmZmZzMzMZGRkTU1Nb29vg4OD |         AAAAlJSU4ODgU1NT6enp+Pj4w8PDxMTEkpKS/Pz81tbW5eXlRERE3NzcmZmZzMzMZGRkTU1Nb29vg4OD | ||||||
|         urq6KioqW1tb8vLyf39/sbGxEhISPz8/i4uL0NDQZmZmIyMjoqKiNTU1tLS0GRkZp6end3d3Li4uOjo6 |         urq6KioqW1tb8vLyf39/sbGxEhISPz8/i4uL0NDQZmZmIyMjoqKiNTU1tLS0GRkZp6end3d3Li4uOjo6 | ||||||
|         Dg4OJSUlLUB5vgAABzdJREFUeF7tne12ojAQhosuIqBiRa212q7dult7/xe4R6wKwwRCMhMoZ56fPSnj |         Dg4OJSUlLUB5vgAABwxJREFUeF7tnX97ojAMx6ceIqDi/DXndJ47vZt7/y/wFOMUSKG0SWE8+fxz9zxl | ||||||
|         K8l8BeLDgyAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIQt/Y+JNZsD0ekkFyOG6D2cTfwCGNGcI/tMQoDvaP |         ZN8BaZq26ZMgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCELrWHnDsb8+7uNuvD+u/fHQW0GLOT34t276kb99 | ||||||
|         iy8Psl687YN4BIfrs9/Dv7TAKAinL1BagZddGETw37QIvQH8k2OiWbKDehTskhn871oGXssK4/0/qKOS |         nn51siynu60f9eEqA7Zb+E+d9P1g9AaKcN42gR/C1dUIOl34X12E43gDMsrYxGP4IX26nZoVRtt/8Ovr | ||||||
|         z30zkQOvVYWbwydUoMHuqO98zgLbUxg/ws+uTap5IzOBbSkMFvBjN2IxhhdEuAhsR+FK17moqdf4LbAN |         8bmtJvIssE6Fq/3n9feuxOao73wuAutTGD0nv7AJM80HmQisS6E/TaybMh3AfYq4CqxH4ULXuagp1wgC | ||||||
|         hWOT5Vdm8QovXOAq0L3Cya/iB7XgzYcXv3MT6FrhaF/4jLYkqjTgLtCxwnmz8FfPZwxNZOQEulX4N2eY |         61A4MPn88kzf4X44N4HuFQ5/gWV7dh7cE+FboGuF/S3YpSFWhQF3gY4VTqp1f+V8RnDnNA8C3Sr8C0Yp | ||||||
|         CiztzAt0qTA+5Q2TsS4VDwWBDhUmBbuUbIuGigKdKYzMU5h6/uYtAYGuFE5+A7u0fN5zVSjQkcI5NEvN |         wcLOR4EuFUYnsEnLMjd4SAl0qDAGi/SswQKQFuhMYWgewpTzF4wkZAS6Ujj8DfZ4+LzHqlmBjhROwBob | ||||||
|         6ZqqlgS6UbiFVpVM02WyDebxLJ4Hx8Ey1U/vLllcWaAThQdoFOU9XPmlbkU0mvzZv8OhKCtcoAuFmFnA |         p1uomhPoRuEajJUzms3jtT+JxtHEP3bnM/3w7hrF5QU6UbgHW8V8BAsvl60I+8M/2w+4opjF+XJEoAuF | ||||||
|         elmZSEerVGMdH3FL/ApDaBLytccTkyLztLqV43ke7q7ZFaLfa46noDQ1FWy2etMVwK2wZg2mpYSkkvEU |         mNkMy3lhIB0uZhrf8RG3xK8wAEtKvrZ4YJJmMitO5ZzB3TW7wrIn+OLrJtJWa73XNQO3wpJvcFYtmzkY | ||||||
|         XqAeZoV/oL0CaUX5o2DeWCOvwldoLs+TZrsFsGpYn7Aq9KG1HKdK71lFVOu7CnAqjMpN+hvPqtpVh6F+ |         wc9VgFnhHzCDMysY/iiYVNbIq/AdrKC8VE8OXlhUHJ+wKvTACMZJJ9WCEpb6rhScCsN8kv6bV7MU9pVe | ||||||
|         IsCrMIXGbnzM4diG1HnoHIwK1W70Ub+pq2JeGx2v8CmcQVM3QjjUhI2uU+VTqMyzjF0MQLMnwqbwGVr6 |         lTwPp8IZ2MhzmMAlpmj0sTcYFard6LP9jNKktHe8wadwDBbyBHCFFStdp8qnUBlnGbuYDJo5ETaFr2Ag | ||||||
|         5kUnRdNDz6dyKVRFwo8JHGmBeqXnYFIYKVLID3sfk6c6ZbrApFDhzYkFanW3eBQqkpkXyimq/h6L8Ch8 |         y5tOiKaHnk/lUqjqCQ9DuIACrUELk8JQEUIe7H3MI8Uh0xUmhQpvTixQK7vFo1ARzLxRvqJntHpFHoU7 | ||||||
|         g2Yu0DmZDC2BPAoVbiaA4+zQE8ijEN/+JDalKZDabAbeO3yEw+zQFciiEL2FxG5UWyCHQvwW2lYTRfQF |         uHsGOieToNftsyhUuBkfmonQjGtYFOLTn8SmdAM3DoV47vAZWonQFciiEH2ExG5UWyCHQvwR2o4m0ugL | ||||||
|         cih8gjbOPMNRVjQQyKBwCE2cOdkUvCWaCGRQiKb8VPVERiOB9ApH0MKZJzjKhmYC6RWiuzBmXTWchgLp |         5FD4ArdO8QqNNFQQyKCwB3dOcbIZ8OaoIpBBIRryU40nEioJpFfYhxuneIFGEqoJpFeIzsKYZdVwKgqk | ||||||
|         FWKhIoWDLGgqkFwh6meaN36V6FW9eagVYvUM4S1sfAfpFWL9oWZ7E1UYCKRWiBWGdI7URCC1wiO8PmXR |         V4h1FTNoo6CqQHKFqJ+pnvhVUi2TeIFaITaeIXyElZ8gvUIsP0S30tpAILVCbGBI50hNBFIrPMJtHyEb | ||||||
|         ZCSQWiGSsa119wfrMBNIrRBeXvFYlgmGAokVYsU9UevCVCCxQmQZ/oNjzDAWSKwQWYZLOMYIc4HECpG9 |         NBkJpFaIRGxLi4X2KcwEUiuEuz5CtRvAUCCxQmxwT5S6MBVIrBD5DP9BkyXGAokVIp/hHJrsMBdIrBCZ | ||||||
|         CpKqonkmc4dU4QRe3fM8OMYEG4G0ChFHs4NjDLCYotQKEUdDsFdoJ5BWIVLen582s8NqilIrRFypdeFk |         qyAZVVSPZO6QKhzCTR+BJitsBNIqRBzNBppssHhFz5AqRBwNwVyhnUBahcjw/rLazA6rV/QMqULElVoP | ||||||
|         K5BiFt1BCgvblC2aDS2h7NNuPqA+bwrH/GyQ0omw+O0CSDikyWg6A9KjSeCYnw2yYQFehfjprKA+wvq+ |         nGwF0sw430AGFrYhWzjuWUKZp10dQNadETS1BGToRJm/aABId0gT0TQGJEcTQ1NLQCYsMlshfjoLkPUA | ||||||
|         GyAKaXecWgdpdxOVv10BSUsp2/kdoP/3sP/rEFHYM1/a/3jY/5ym/3lp/2uL/teHHDV+x+Do03QLll5b |         8aRo3SAKaWecagdJdxPP3NcNEpZSpvMbQPufYfu/w/b70vb3h+2Padofl7Z/bNH+8SHHGL9hcORpmgVL | ||||||
|         p0ASU9JOV/sw9bw7BBIQSfYtOgTX3lN3QJxpz7IaxNWs4ZifDeJq+lYEQ3lOp2m4+FUCjrEGeemf7Hma |         rq1R8ORLmwRTzrtBcM1bNAiuuafmwDZ/2BgQV7OEppbAOI/fFEDVI+5e02D6Kwc00YFs+idbT1PGCqnw | ||||||
|         OjbICT+Fc11IQBaiszofe82LPqVCCijC59qqQfJ+jsQfe4CW7tnEKmJolv4tlgzm50srQGIxS5sI6dW4 |         k6rrQgLyITob52PbvOhDKt51bcVgiwYZ3h9sAa2bKrARWHuEeBdLAvP60gKQvpglTcS9RliJO8Pc67xV | ||||||
|         KaHcGcamqYubiHhx7w0OIgFpfLto7mO5BlNOzP++BQp23uQJDiICKfT5YyLSbudr1mJFIvF7TyXQieNR |         YKVbdtBGC/tafRx0QyBPTMy/3wIFqzd5gjZq0D0z3H0ikm7nS9Zig0TifU850BenQ7yt+g7mton3rmVB | ||||||
|         PmdSAHPbxO+uQdB5Q5+xXUG2L5h3ocbQWAZjooEFDOp3SPNgKTdXqLiA30SODOoCuix4IxR6E9kai/jB |         3xv6iO2Gi/2HaQZgIw1joOFiD+kjWMjN1VVccbIP+AH0s+DtodCHyJZYxAv3cj5CRffL1WWgHUWnQ1y+ | ||||||
|         vZy3UBF+uUIGGig8j/j4BoibMxUyFN8md2cBKxPPUZH+i0UTbp7CsIjiyWVyh+orjoviKJuKRIpz14kl |         IYubmgoJir8md2ZBURfjRP+HRQPuM+yJBcXKZXKH6inKRfHProeKuuvEEhXvSmcK7ZwoPg/aAi69/JTs | ||||||
|         KuaKt4ADGVAsD9oDXIblLdkLjMH+joNzopTHZ3Ol3ABkD+MCVdAI4IWvuNrvUp/XRvN+gPohfpbeBYb6 |         FSdZBQd1opTlsx2tj1DW+qLqNHy4Xw5X813qem00+wPUi/idzTuz1txb4aHaBYfTzuq6iW+2I42Jysdw | ||||||
|         JC6CM/c2eKp2hr5HqkR9buKLbaUxV/kY7joNsIbW71idfRmp3Jjz51tU4erMydzhBCofeg647MlMEVVU |         j9MyLMEoglXty1Dlxs64Xd+i6q4unMwdjl9wBMHB8fIWVa+YYFiDdqz+As84X7JLXkfYQxMW39Qwp05b | ||||||
|         zDA8g3amXoHcNRMGtltyx+AcYR9tWNzg6R9WonaoGQ3Pgh6qnVeGQzd6R5GD39A/zzsKKudndip7K6gj |         C7qndl4JtazeKds9qF/PO/QL388zR7jSMaXb677mOoFcNC+tAb2HS52jsQe0pK7+02Be0PHcqOkJXtAq | ||||||
|         8zdfS51ELl7WngF9gP/jirq7WH+u/sN4WRF4rrR0B8/UrMVvPrHfRngY+atQ7+Rn/pKwAnS3BmWaLgfH |         M9r5xM5GeOp7i0Cv8nOtC64rnW/RPSbnW7z763g+0y0WXPua+cJ+kYTa17R4BcXLCfjgSzdrEyrSbyQ0 | ||||||
|         7PctXoNtskyxfV0c8/BKQmVcJEFnKbPiVxxeTsC7fSpvTaRov5HgYgdWA2yHn4YWnWiRWF3x2PDbeSpa |         ZDU533lPNTrRNJF6xGPD7ybtHiuOKc1wOhwsh/zsvI/GbR0jPv8w4J1aNmNYFj7r88I8+2LMwP6c1Quj | ||||||
|         QXVOaYbTcrAe8t/Oe7ctpckh/v3D0KaO5mJSlz7r80TZe6VkrJeF1THt3ATNQfBbstNWSsEGBPoJJ8a0 |         Ju9tJDhLdtT0jRy+fsCJMao5CtXC5kznn7Kw2tubvKyb+EdtpYo0z8W7sdRKBzSLcBzrfpIf8biJ3Z8O | ||||||
|         5SxUC5vfdG49CdXEP5hM1l3SvLnTIrHm7+JdWWu1A7pFNEt0l+R7Muti+NNhFIRTxV7uNx+7ULth1VVG |         fT8YFR/9c9gE2gmrptKP/O3zNJ+N+Zrutovop6u7s/KG48H6uI+78X6/9qOh14ChrSAIgiAIgiAIgiAI | ||||||
|         cbB/XJS7MV+Lt/0q/unq7mz8yWy8PR6SQXI4bIN44negtBUEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQSDm |         giAIgiAIgiAIgiAIAilPT/8BzuZT5uV+S2QAAAAASUVORK5CYII= | ||||||
|         P87mU+ZvyRQDAAAAAElFTkSuQmCC |  | ||||||
| </value> | </value> | ||||||
|   </data> |   </data> | ||||||
|   <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> |   <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 SeungHo Yang
					SeungHo Yang