     @IBOutlet weak var preferencesToolbar: NSToolbar!
     @IBOutlet weak var preferencesGeneral: NSView!
     @IBOutlet weak var preferencesCoin: NSView!
+    @IBOutlet weak var preferencesDonation: NSView!
+    
+    struct Coin {
+        let unit: String
+        let name: String
+        let tag: Int
+        let mark: String
+        let marketParams: [String: String]
+        let markets: [Market]
+        
+        init(_ key: String, _ value: NSMutableDictionary, _ markets: [Market]) {
+            self.unit = key
+            self.name = value["name"] as! String
+            self.tag = value["tag"] as! Int
+            self.mark = String(Character(UnicodeScalar(Int(value["mark"] as! String, radix: 16)!)!))
+            
+            let marketParams: [String: String] = value["marketParams"] as! [String: String]
+            self.marketParams = marketParams
+            
+            var hasMarkets: [Market] = []
+            for market in markets {
+                if (marketParams[market.name] != nil) {
+                    hasMarkets.append(market)
+                }
+            }
+            
+            self.markets = hasMarkets
+        }
+    }
+    
+    struct Api {
+        let url: String
+        let first: [String]
+        let last: [String]
+        let change: [String]
+        let isCompare: Bool
+        
+        init(_ data: NSMutableDictionary) {
+            self.url = data["url"] as! String
+            
+            let first: String? = data["first"] as? String
+            self.first = first == nil ? [] : first!.characters.split(separator: ".").map{ String($0) }
+            
+            let last: String! = data["last"] as! String
+            self.last = last == nil ? [] : last!.characters.split(separator: ".").map{ String($0) }
+            
+            let change: String? = data["change"] as? String
+            self.change = change == nil ? [] : change!.characters.split(separator: ".").map{ String($0) }
+            
+            self.isCompare = first != nil || change != nil
+        }
+    }
+    
+    struct Market {
+        let name: String
+        let tag: Int
+        let currency: String
+        let isCombination: Bool
+        let isBtcMarket: Bool
+        let api: Api
+        
+        init(_ key: String,_ value: NSMutableDictionary) {
+            self.name = key
+            self.tag = value["tag"] as! Int
+            self.currency = value["currency"] as! String
+            self.isCombination = value["isCombination"] as! Bool
+            self.isBtcMarket = value["isBtcMarket"] as! Bool
+            self.api = Api(value["api"] as! NSMutableDictionary)
+        }
+        
+        func paddingName() -> String {
+            return self.name + "".padding(toLength: Int((20 - self.name.characters.count) / 4), withPad: "\t", startingAt: 0)
+        }
+    }
     
     let statusMenu: NSMenu = NSMenu()
     
     let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)
     
-    var costs: [[Double]] = []
-    var btcCosts: [[Double]] = []
+    var costs: [String: [String: Double]] = [:]
+    var costChanges: [String: [String: Double?]] = [:]
     
     let currencyName: [String] = ["", "KRW", "USD", "JPY", "CNY", "EUR"]
     let currencyMark: [String] = ["", "₩", "$", "¥", "¥", "€"]
     var currencyLatestTime: Double = 0
     
-    let coinUnit: [String] = ["", "BTC", "ETH", "ETC", "XRP", "STRAT", "DGB", "SC" ,"XMR", "ZEC", "LTC"]
-    let coinName: [String] = ["", "Bitcoin", "Ethereum", "Ethereum Classic", "Ripple", "Stratis", "DigiByte", "Siacoin", "Monero", "Zcash", "Litecoin"]
-    let coinMark: [String] = ["", "\u{e9a7}", "\u{e9c4}", "\u{e9c2}", "\u{e93a}", "\u{e916}", "\u{e9b6}", "\u{e906}", "\u{e936}", "\u{e9cf}", "\u{e990}"]
-    let marketName: [String] = ["", "Korbit", "Bithumb", "Coinone", "", "", "", "", "", "", "Poloniex", "Bittrex", "", "", "", "", "", "", "", "", "Coincheck", "Bitflyer", "", "", "", "", "", "", "", "", "Okcoin"]
+    var plist: NSMutableDictionary = [:]
+    var markets: [Market] = []
+    var coins: [Coin] = []
     
     var tickerTimer = Timer()
-    var timer = Timer()
+    var updaterTimer: [String: Timer] = [:]
+    
+    var timer: Timer = Timer()
     
     func applicationDidFinishLaunching(_ aNotification: Notification) {
         self.killLauncher()
-        self.initStorage()
+        
+        self.initPlist()
+        self.initCosts()
         self.initAboutWindow()
         self.initPreferencesWindow()
         self.initMenus()
+        
         self.statusItem.menu = self.statusMenu
         
         self.updateTicker()
+        self.startTicker()
+        
+        self.updateData()
+//        self.timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(AppDelegate.updateData), userInfo: nil, repeats: true)
+        
+        //self.timer.
+        
+//        self.timer = Timer.scheduledTimer(timeInterval: Double(self.getOptionsRefreshTime()), target: self, selector: #selector(AppDelegate.updateData), userInfo: nil, repeats: true)
+        
+        
+        /*
+        self.initVisible()
+        
+        self.initOptions()
+        
+        
+        
+        self.updateTicker()
+        
         self.updateData()
         self.timer = Timer.scheduledTimer(timeInterval: Double(self.getOptionsRefreshTime()), target: self, selector: #selector(AppDelegate.updateData), userInfo: nil, repeats: true)
-        self.startTicker()
-        
-        /*
-        self.initVisible()
-        
-        self.initOptions()
-        
-        
-        
-        self.updateTicker()
-        
-        self.updateData()
-        self.timer = Timer.scheduledTimer(timeInterval: Double(self.getOptionsRefreshTime()), target: self, selector: #selector(AppDelegate.updateData), userInfo: nil, repeats: true)
         
         self.startTicker()
         */

                }
            }
        }
    }
    
    func startTicker() {
        self.stopTicker()
        self.tickerTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(AppDelegate.updateTicker), userInfo: nil, repeats: true)
    }
    
    func stopTicker() {
        self.tickerTimer.invalidate()
    }
    
    func getCurrency(_ from: Int, _ to: Int) -> Double {

//        self.checkUpdate()
    }
    
    /**
     * Kill start at login launcher process
     *
     * @return nil
     */
    func killLauncher() {
        let launcherAppIdentifier = "com.moimz.iCoinTickerLauncher"
        
