Browse Source

【会员系统】补充超出设备时相关逻辑

wangshuai 3 months ago
parent
commit
0615e8471a

+ 8 - 0
PDF Office/PDF Master/MemberCenter/Assets/en.lproj/MemberCenterLocalizable.strings

@@ -89,3 +89,11 @@
 "Use all functions without restrictions" = "Use all functions without restrictions";
 "Get 7-Day VIP Free" = "Get 7-Day VIP Free";
 "Already have an account? %@" = "Already have an account? %@";
+
+"Device Management" = "Device Management";
+"Device name" = "Device name";
+"Action" = "Action";
+"Can keep %d devices online at the same time" = "Can keep %d devices online at the same time";
+"Do not log in to the current device" = "Do not log in to the current device";
+"Log in to the current device" = "Log in to the current device";
+"Unbind" = "Unbind";

+ 9 - 0
PDF Office/PDF Master/MemberCenter/Assets/zh-Hans.lproj/MemberCenterLocalizable.strings

@@ -85,3 +85,12 @@
 "Use all functions without restrictions" = "无限制地使用所有功能";
 "Get 7-Day VIP Free" = "免费领取7天VIP";
 "Already have an account? %@" = "已经有账户了? %@";
+
+"Device Management" = "设备管理";
+"Device name" = "设备名称";
+"Action" = "操作";
+"Can keep %d devices online at the same time" = "可以保持%d台设备同时在线";
+"Do not log in to the current device" = "暂不登录当前设备";
+"Log in to the current device" = "登录当前设备";
+"Unbind" = "解绑";
+

+ 8 - 0
PDF Office/PDF Master/MemberCenter/Assets/zh-Hant.lproj/MemberCenterLocalizable.strings

@@ -85,3 +85,11 @@
 "Use all functions without restrictions" = "無限制地使用所有功能";
 "Get 7-Day VIP Free" = "免費領取7天VIP";
 "Already have an account? %@" = "已經有帳戶了? %@";
+
+"Device Management" = "設備管理";
+"Device name" = "設備名稱";
+"Action" = "操作";
+"Can keep %d devices online at the same time" = "可保持%d台設備同時在線";
+"Do not log in to the current device" = "暫不登入目前設備";
+"Log in to the current device" = "登入目前設備";
+"Unbind" = "解绑";

+ 25 - 11
PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterManager.swift

@@ -345,10 +345,8 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func getUserDeviceList(email: String, _ complete: @escaping KMMemberCenterComplete) {
-        let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/getLoginDeviceList"
-        let params: [String: Any] = ["email": email,
-                                     "appId": "1"]
-        KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
+        let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/getLoginDeviceList?email=\(email)&appId=1"
+        KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: [:]) { requestSerializer in
             
         } completion: { [weak self] (task, responseObject, error) in
             var dic: NSDictionary = [:]
@@ -376,11 +374,27 @@ class KMMemberCenterManager: NSObject {
                 var productId = ""
                 var uniqueSn = ""
                 var deviceName = ""
-                if let token = dict["device_id"] { device_id = token as! String }
-                if let token = dict["productId"] { productId = token as! String }
-                if let token = dict["uniqueSn"] { uniqueSn = token as! String }
-                if let token = dict["deviceName"] { deviceName = token as! String }
-                let list = KMMemberDeviceList(deviceId: device_id, productId: productId, uniqueSn: uniqueSn, appId: deviceName)
+                var id = ""
+
+                if let token = dict["device_id"] {
+                    device_id = token as? String ?? ""
+                }
+                if let token = dict["productId"] {
+                    productId = token as? String ?? ""
+                }
+                if let token = dict["uniqueSn"] {
+                    uniqueSn = token as? String ?? ""
+                }
+                if let token = dict["deviceName"] {
+                    deviceName = token as? String ?? ""
+                }
+                
+                if let token = dict["id"] {
+                    id = token as? String ?? ""
+                }
+                
+                let list = KMMemberDeviceList(deviceId: device_id, productId: productId, uniqueSn: uniqueSn, appId: "", deviceName: deviceName)
+                list.id = id
                 deviceLists.append(list)
             }
             var maxDeviceNum = 0
@@ -402,9 +416,9 @@ class KMMemberCenterManager: NSObject {
      @param complete 回调
      */
     func logoutDevice(deviceId: String, complete: @escaping KMMemberCenterComplete) {
-        let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/logoutDevice"
+        let urlString = configuration.activityBaseURL() + "/member-system-sso/auth/logoutDevice?deviceId=\(deviceId)"
         let params: [String: Any] = ["deviceId": deviceId]
-        KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: params) { requestSerializer in
+        KMRequestServer.requestServer.request(urlString: urlString, method: .post, params: [:]) { requestSerializer in
             
         } completion: { [weak self] (task, responseObject, error) in
             var dic: NSDictionary = [:]

+ 1 - 0
PDF Office/PDF Master/MemberCenter/Model/KMMemberCenterResult.swift

@@ -122,6 +122,7 @@ class KMMemberLoginResult: NSObject {
 }
 
 class KMMemberDeviceList: NSObject {
+    var id: String? // 解绑时需要
     var deviceId: String? // 设备Id
     var productId: String? // 产品Id
     var uniqueSn: String? // 设备唯一标识

+ 3 - 3
PDF Office/PDF Master/MemberCenter/ViewController/KMUserInfoViewController.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23504"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -721,7 +721,7 @@
                                             <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TDh-Xw-OR7">
                                                 <rect key="frame" x="-2" y="0.0" width="14" height="19"/>
                                                 <textFieldCell key="cell" lineBreakMode="clipping" title="2" id="HNY-qj-sOt">
-                                                    <font key="font" metaFont="system" size="16"/>
+                                                    <font key="font" metaFont="systemBold" size="16"/>
                                                     <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>

+ 17 - 5
PDF Office/PDF Master/MemberCenter/ViewModel/KMSignUpViewModel.swift

@@ -234,11 +234,23 @@ class KMSignUpViewModel: ObservableObject {
                 self.sendContent = NSLocalizedString("Resend", tableName: "MemberCenterLocalizable", comment: "")
 
             } else {
-                print("错误信息:%@", msg as Any)
-                let alert = NSAlert()
-                alert.messageText = NSLocalizedString(msg!, comment: "")
-                alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
-                alert.beginSheetModal(for: NSApp.mainWindow!)
+                if(resultDict.code == 305) {
+                    KMMemberCenterManager.manager.getUserDeviceList(email: email) { [weak self] success, result in
+                        guard self != nil else { return }
+                        if success {
+                            KMMemberCenterWindowController.shared.showWindow(nil)
+                            KMMemberCenterWindowController.shared.memberCenterdeviceResult = result ?? KMMemberCenterResult(loginResult: KMMemberLoginResult(refreshToken: "", accessToken: "", tokenType: "", expiresIn: ""))
+                        }
+                    }
+                } else {
+                    print("错误信息:%@", msg as Any)
+                    let alert = NSAlert()
+                    alert.messageText = NSLocalizedString(msg!, comment: "")
+                    alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
+                    if(NSApp.mainWindow != nil) {
+                        alert.beginSheetModal(for: NSApp.mainWindow!)
+                    }
+                }
             }
         }
     }

+ 202 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMMemberCenterWindowController.swift

@@ -0,0 +1,202 @@
+//
+//  KMMemberCenterWindowController.swift
+//  PDF Reader Pro
+//
+//  Created by 王帅 on 2024/11/12.
+//
+
+import Cocoa
+
+class KMMemberCenterWindowController: NSWindowController {
+    
+    @IBOutlet weak var productBox: NSBox!
+    @IBOutlet weak var productView: NSView!
+    @IBOutlet weak var productLabel: NSTextField!
+    @IBOutlet weak var typeLabel: NSTextField!
+
+    @IBOutlet weak var device1View: NSView!
+    @IBOutlet weak var device1Label: NSTextField!
+    @IBOutlet weak var device1Button: NSButton!
+    
+    @IBOutlet weak var device2View: NSView!
+    @IBOutlet weak var device2Label: NSTextField!
+    @IBOutlet weak var device2Button: NSButton!
+
+    @IBOutlet weak var device3View: NSView!
+    @IBOutlet weak var device3Label: NSTextField!
+    @IBOutlet weak var device3Button: NSButton!
+    
+    @IBOutlet weak var device4View: NSView!
+    @IBOutlet weak var device4Label: NSTextField!
+    @IBOutlet weak var device4Button: NSButton!
+    
+    @IBOutlet var bottomoffset:NSLayoutConstraint!
+    
+    @IBOutlet weak var tipLabel: NSTextField!
+
+    @IBOutlet weak var cancelButton: NSButton!
+    @IBOutlet weak var loginButton: NSButton!
+    
+    static let shared: KMMemberCenterWindowController = {
+        let windowC = KMMemberCenterWindowController(windowNibName: "KMMemberCenterWindowController")
+        return windowC
+    }()
+    
+    public var memberCenterdeviceResult: KMMemberCenterResult = KMMemberCenterResult(loginResult: KMMemberLoginResult(refreshToken: "", accessToken: "", tokenType: "", expiresIn: "")) {
+        didSet {
+            refreshData()
+        }
+    }
+
+    override func windowDidLoad() {
+        super.windowDidLoad()
+        
+        self.window?.title = NSLocalizedString("Device Management", tableName: "MemberCenterLocalizable", comment: "")
+        productLabel.stringValue = NSLocalizedString("Device name", tableName: "MemberCenterLocalizable", comment: "")
+        typeLabel.stringValue = NSLocalizedString("Action", tableName: "MemberCenterLocalizable", comment: "")
+
+        device1Button.title = NSLocalizedString("Unbind", tableName: "MemberCenterLocalizable", comment: "")
+        device2Button.title = NSLocalizedString("Unbind", tableName: "MemberCenterLocalizable", comment: "")
+        device3Button.title = NSLocalizedString("Unbind", tableName: "MemberCenterLocalizable", comment: "")
+        device4Button.title = NSLocalizedString("Unbind", tableName: "MemberCenterLocalizable", comment: "")
+        
+        cancelButton.title = NSLocalizedString("Do not log in to the current device", tableName: "MemberCenterLocalizable", comment: "")
+        loginButton.title = NSLocalizedString("Log in to the current device", tableName: "MemberCenterLocalizable", comment: "")
+
+        initializeUI()
+        
+        DistributedNotificationCenter.default.addObserver(self, selector: #selector(themeChanged(_:)), name: NSNotification.Name("AppleInterfaceThemeChangedNotification"), object: nil)
+    }
+    
+    @objc func themeChanged(_ notification: Notification) {
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
+            self.initializeUI()
+        }
+    }
+    
+    private func initializeUI() -> Void {
+        self.window?.contentView?.wantsLayer = true
+        let isDarkModel = KMAdvertisementConfig.isDarkModel()
+        if  isDarkModel {
+            self.window?.contentView?.layer?.backgroundColor = NSColor(hex: "282828").cgColor;
+        } else {
+            self.window?.contentView?.layer?.backgroundColor = NSColor(hex: "f6f6f6").cgColor;
+        }
+        productBox.borderColor = NSColor(named: "DADBDE") ?? .gray
+
+        productLabel.textColor = NSColor(named: "42464D")
+        typeLabel.textColor = NSColor(named: "42464D")
+        device1Label.textColor = NSColor(named: "42464D")
+        device2Label.textColor = NSColor(named: "42464D")
+        device3Label.textColor = NSColor(named: "42464D")
+        device4Label.textColor = NSColor(named: "42464D")
+        tipLabel.textColor = NSColor(named: "4982E6")
+
+        cancelButton.setTitleColor(color: NSColor(named: "000000") ?? NSColor.white, font: NSFont.SFProTextRegularFont(13))
+        
+        productView.wantsLayer = true
+        productView.layer?.backgroundColor = NSColor(named: "000000_0.05")?.cgColor
+        
+        device1View.wantsLayer = true
+        device1View.layer?.backgroundColor = NSColor(named: "000000_0.76")?.cgColor
+
+        device2View.wantsLayer = true
+        device2View.layer?.backgroundColor = NSColor(named: "000000_0.76")?.cgColor
+
+        device3View.wantsLayer = true
+        device3View.layer?.backgroundColor = NSColor(named: "000000_0.76")?.cgColor
+
+        device4View.wantsLayer = true
+        device4View.layer?.backgroundColor = NSColor(named: "000000_0.76")?.cgColor
+        device1Button.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.blue, font: NSFont.SFProTextRegularFont(13))
+        device2Button.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.blue, font: NSFont.SFProTextRegularFont(13))
+        device3Button.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.blue, font: NSFont.SFProTextRegularFont(13))
+        device4Button.setTitleColor(color: NSColor(named: "4982E6") ?? NSColor.blue, font: NSFont.SFProTextRegularFont(13))
+    }
+    
+    private func refreshData() {
+        let deviceList_Result:[KMMemberDeviceList] = memberCenterdeviceResult.deviceList_Result ?? []
+        bottomoffset.constant = CGFloat(Int(deviceList_Result.count) * 32)
+        
+        if(deviceList_Result.count == 4) {
+            
+        } else if (deviceList_Result.count == 3) {
+            device4View.isHidden = true
+            device3View.isHidden = false
+            device2View.isHidden = false
+            device1View.isHidden = false
+        } else if (deviceList_Result.count == 2) {
+            device4View.isHidden = true
+            device3View.isHidden = true
+            device2View.isHidden = false
+            device1View.isHidden = false
+        } else if (deviceList_Result.count == 1) {
+            device4View.isHidden = true
+            device3View.isHidden = true
+            device2View.isHidden = true
+            device1View.isHidden = false
+        } else if (deviceList_Result.count == 0) {
+            device4View.isHidden = true
+            device3View.isHidden = true
+            device2View.isHidden = true
+            device1View.isHidden = true
+        }
+        
+        for i in 0 ..< deviceList_Result.count {
+            let device = deviceList_Result[i]
+            if i == 0 {
+                device1Label.stringValue = device.deviceName ?? "PDF Reader Pro User"
+            } else if i == 1 {
+                device2Label.stringValue = device.deviceName ?? "PDF Reader Pro User"
+            }  else if i == 2 {
+                device3Label.stringValue = device.deviceName ?? "PDF Reader Pro User"
+            } else if i == 3 {
+                device4Label.stringValue = device.deviceName ?? "PDF Reader Pro User"
+            }
+        }
+        
+        tipLabel.stringValue = String(format: NSLocalizedString("Can keep %d devices online at the same time", tableName: "MemberCenterLocalizable", comment: ""), memberCenterdeviceResult.maxDeviceNum ?? 1)
+        
+        if deviceList_Result.count == memberCenterdeviceResult.maxDeviceNum {
+            loginButton.isEnabled = false
+        } else {
+            loginButton.isEnabled = true
+        }
+    }
+    
+    // MARK: Button Actions
+    @IBAction func buttonItemClicked_UntieDevice(_ sender: NSButton) {
+        let tag = sender.tag
+        var deviceList_Result:[KMMemberDeviceList] = memberCenterdeviceResult.deviceList_Result ?? []
+        if(deviceList_Result.count > tag) {
+            let device = deviceList_Result[tag]
+            if(device.id?.isEmpty == true) {
+                return
+            }
+            
+            KMMemberCenterManager.manager.logoutDevice(deviceId: device.id!, complete: {[weak self] success, result in
+                guard let result = result else { return }
+                let resultDict = result as KMMemberCenterResult
+                let msg = resultDict.msg
+                if success {
+                    deviceList_Result.remove(at: Int(tag))
+                    self?.memberCenterdeviceResult.deviceList_Result = deviceList_Result
+                    self?.refreshData()
+                } else {
+                    print(msg as Any)
+                }
+            })
+        }
+    }
+    
+    @IBAction func buttonItemClicked_Cancel(_ sender: NSButton) {
+        window?.close()
+    }
+    
+    @IBAction func buttonItemClicked_Login(_ sender: NSButton) {
+        window?.close()
+
+        KMLoginWindowsController.shared.showWindow(nil)
+    }
+    
+}

+ 350 - 0
PDF Office/PDF Master/MemberCenter/WindowsController/KMMemberCenterWindowController.xib

@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23504"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMMemberCenterWindowController" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="bottomoffset" destination="UPm-ji-bRT" id="yeT-J8-gKJ"/>
+                <outlet property="cancelButton" destination="o7T-ep-nAB" id="RqR-gv-ehN"/>
+                <outlet property="device1Button" destination="JcL-a1-uju" id="KUe-Te-sAU"/>
+                <outlet property="device1Label" destination="Wan-3h-JVv" id="TEt-XY-U1v"/>
+                <outlet property="device1View" destination="OHg-6E-afT" id="2wj-Hi-NVU"/>
+                <outlet property="device2Button" destination="5aT-oq-Uqv" id="sz2-Am-tU5"/>
+                <outlet property="device2Label" destination="6zt-vZ-9wC" id="0fp-Yd-CIs"/>
+                <outlet property="device2View" destination="vS4-8H-f0m" id="WBa-cH-tOf"/>
+                <outlet property="device3Button" destination="Kge-OI-LmY" id="gSN-88-Fls"/>
+                <outlet property="device3Label" destination="0nq-7L-m9q" id="L1B-KO-tSx"/>
+                <outlet property="device3View" destination="PzA-Dl-wAU" id="bnm-r7-WwF"/>
+                <outlet property="device4Button" destination="yGV-Xc-wgR" id="0PU-V8-cc9"/>
+                <outlet property="device4Label" destination="gY3-sn-FqD" id="Loq-4W-5Pe"/>
+                <outlet property="device4View" destination="8ol-uC-3wd" id="9tt-Hf-fzN"/>
+                <outlet property="loginButton" destination="DkR-wO-1gm" id="B7f-Lr-eyz"/>
+                <outlet property="productBox" destination="taS-Oo-Ijv" id="rur-6B-Z3x"/>
+                <outlet property="productLabel" destination="kR4-gi-Zu1" id="SaZ-Xx-B3s"/>
+                <outlet property="productView" destination="SgO-vS-hmk" id="hDk-np-WtW"/>
+                <outlet property="tipLabel" destination="8Fh-gG-iGb" id="Rb3-84-gxR"/>
+                <outlet property="typeLabel" destination="9ki-Xc-eOT" id="uGa-Lm-pL5"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Device Management" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES"/>
+            <rect key="contentRect" x="196" y="240" width="600" height="290"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1512" height="944"/>
+            <value key="minSize" type="size" width="600" height="290"/>
+            <value key="maxSize" type="size" width="600" height="322"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="600" height="290"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <box boxType="custom" cornerRadius="7" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="taS-Oo-Ijv">
+                        <rect key="frame" x="20" y="88" width="560" height="162"/>
+                        <view key="contentView" id="z1h-qn-QRk">
+                            <rect key="frame" x="1" y="1" width="558" height="160"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="SgO-vS-hmk">
+                                    <rect key="frame" x="0.0" y="128" width="558" height="32"/>
+                                    <subviews>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kR4-gi-Zu1">
+                                            <rect key="frame" x="14" y="8" width="408" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="404" id="i1Z-5f-gwB"/>
+                                            </constraints>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="hEt-No-EPZ">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                        <box horizontalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="RfH-DX-1Mk">
+                                            <rect key="frame" x="438" y="0.0" width="5" height="32"/>
+                                        </box>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9ki-Xc-eOT">
+                                            <rect key="frame" x="455" y="8" width="89" height="16"/>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Label" id="fk5-K5-230">
+                                                <font key="font" metaFont="system"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstItem="RfH-DX-1Mk" firstAttribute="leading" secondItem="kR4-gi-Zu1" secondAttribute="trailing" constant="20" id="KXB-dE-SfK"/>
+                                        <constraint firstItem="9ki-Xc-eOT" firstAttribute="leading" secondItem="RfH-DX-1Mk" secondAttribute="trailing" constant="16" id="Q8c-5W-4dr"/>
+                                        <constraint firstItem="9ki-Xc-eOT" firstAttribute="centerY" secondItem="SgO-vS-hmk" secondAttribute="centerY" id="Rq0-EA-3rF"/>
+                                        <constraint firstAttribute="height" constant="32" id="Ub4-Pw-Hrp"/>
+                                        <constraint firstAttribute="trailing" secondItem="9ki-Xc-eOT" secondAttribute="trailing" constant="16" id="WvP-Qc-6DR"/>
+                                        <constraint firstItem="RfH-DX-1Mk" firstAttribute="top" secondItem="SgO-vS-hmk" secondAttribute="top" id="X8F-jV-sdZ"/>
+                                        <constraint firstItem="kR4-gi-Zu1" firstAttribute="centerY" secondItem="SgO-vS-hmk" secondAttribute="centerY" id="hMw-Sy-8og"/>
+                                        <constraint firstAttribute="bottom" secondItem="RfH-DX-1Mk" secondAttribute="bottom" id="hmo-1c-idO"/>
+                                        <constraint firstItem="kR4-gi-Zu1" firstAttribute="leading" secondItem="SgO-vS-hmk" secondAttribute="leading" constant="16" id="upE-CA-hvw"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="OHg-6E-afT">
+                                    <rect key="frame" x="0.0" y="96" width="558" height="32"/>
+                                    <subviews>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Wan-3h-JVv">
+                                            <rect key="frame" x="14" y="8" width="408" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="404" id="X7S-W6-y5f"/>
+                                            </constraints>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="KyN-ip-2n8">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                        <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="iLZ-hG-iaL">
+                                            <rect key="frame" x="0.0" y="-2" width="558" height="5"/>
+                                        </box>
+                                        <box horizontalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="TS9-6l-U98">
+                                            <rect key="frame" x="438" y="0.0" width="5" height="32"/>
+                                        </box>
+                                        <button translatesAutoresizingMaskIntoConstraints="NO" id="JcL-a1-uju">
+                                            <rect key="frame" x="457" y="8" width="85" height="16"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="wb1-X8-xGW">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="buttonItemClicked_UntieDevice:" target="-2" id="lyi-oK-UlH"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstItem="JcL-a1-uju" firstAttribute="leading" secondItem="TS9-6l-U98" secondAttribute="trailing" constant="16" id="4G6-l0-a6N"/>
+                                        <constraint firstAttribute="trailing" secondItem="JcL-a1-uju" secondAttribute="trailing" constant="16" id="APa-rR-Ydf"/>
+                                        <constraint firstItem="Wan-3h-JVv" firstAttribute="centerY" secondItem="OHg-6E-afT" secondAttribute="centerY" id="IF3-9V-L0v"/>
+                                        <constraint firstAttribute="trailing" secondItem="iLZ-hG-iaL" secondAttribute="trailing" id="K8k-HM-Qm9"/>
+                                        <constraint firstAttribute="height" constant="32" id="MUp-lU-EF6"/>
+                                        <constraint firstItem="TS9-6l-U98" firstAttribute="top" secondItem="OHg-6E-afT" secondAttribute="top" id="R2F-4R-iY4"/>
+                                        <constraint firstItem="JcL-a1-uju" firstAttribute="centerY" secondItem="OHg-6E-afT" secondAttribute="centerY" id="VJC-EQ-aG7"/>
+                                        <constraint firstAttribute="bottom" secondItem="TS9-6l-U98" secondAttribute="bottom" id="dcg-UN-eFi"/>
+                                        <constraint firstItem="Wan-3h-JVv" firstAttribute="leading" secondItem="OHg-6E-afT" secondAttribute="leading" constant="16" id="hqx-1s-kah"/>
+                                        <constraint firstItem="iLZ-hG-iaL" firstAttribute="leading" secondItem="OHg-6E-afT" secondAttribute="leading" id="jJ9-Kc-I7o"/>
+                                        <constraint firstItem="TS9-6l-U98" firstAttribute="leading" secondItem="Wan-3h-JVv" secondAttribute="trailing" constant="20" id="lxd-uV-hrq"/>
+                                        <constraint firstAttribute="bottom" secondItem="iLZ-hG-iaL" secondAttribute="bottom" id="oA3-Mx-5kF"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="vS4-8H-f0m">
+                                    <rect key="frame" x="0.0" y="64" width="558" height="32"/>
+                                    <subviews>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6zt-vZ-9wC">
+                                            <rect key="frame" x="14" y="8" width="408" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="404" id="Amx-eb-0Da"/>
+                                            </constraints>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="8k2-qE-Pym">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                        <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="DTV-nP-wGi">
+                                            <rect key="frame" x="0.0" y="-2" width="558" height="5"/>
+                                        </box>
+                                        <box horizontalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="I9t-0M-ES5">
+                                            <rect key="frame" x="438" y="0.0" width="5" height="32"/>
+                                        </box>
+                                        <button tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="5aT-oq-Uqv">
+                                            <rect key="frame" x="457" y="8" width="85" height="16"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="g02-tI-5tQ">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="buttonItemClicked_UntieDevice:" target="-2" id="Vtz-dD-D51"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstAttribute="bottom" secondItem="I9t-0M-ES5" secondAttribute="bottom" id="5Je-ST-yoG"/>
+                                        <constraint firstItem="6zt-vZ-9wC" firstAttribute="centerY" secondItem="vS4-8H-f0m" secondAttribute="centerY" id="CxH-zy-7Cw"/>
+                                        <constraint firstAttribute="trailing" secondItem="5aT-oq-Uqv" secondAttribute="trailing" constant="16" id="MQz-Bp-joV"/>
+                                        <constraint firstItem="I9t-0M-ES5" firstAttribute="leading" secondItem="6zt-vZ-9wC" secondAttribute="trailing" constant="20" id="RfE-6Z-eLj"/>
+                                        <constraint firstAttribute="height" constant="32" id="WJC-Pi-kB3"/>
+                                        <constraint firstItem="5aT-oq-Uqv" firstAttribute="leading" secondItem="I9t-0M-ES5" secondAttribute="trailing" constant="16" id="XeW-73-MSb"/>
+                                        <constraint firstItem="6zt-vZ-9wC" firstAttribute="leading" secondItem="vS4-8H-f0m" secondAttribute="leading" constant="16" id="esh-kg-mTD"/>
+                                        <constraint firstAttribute="trailing" secondItem="DTV-nP-wGi" secondAttribute="trailing" id="fU4-G6-Qao"/>
+                                        <constraint firstItem="DTV-nP-wGi" firstAttribute="leading" secondItem="vS4-8H-f0m" secondAttribute="leading" id="iFs-un-dKz"/>
+                                        <constraint firstAttribute="bottom" secondItem="DTV-nP-wGi" secondAttribute="bottom" id="mzR-qz-Hmr"/>
+                                        <constraint firstItem="5aT-oq-Uqv" firstAttribute="centerY" secondItem="vS4-8H-f0m" secondAttribute="centerY" id="nl9-GO-nHA"/>
+                                        <constraint firstItem="I9t-0M-ES5" firstAttribute="top" secondItem="vS4-8H-f0m" secondAttribute="top" id="qSi-aX-cQy"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="PzA-Dl-wAU">
+                                    <rect key="frame" x="0.0" y="32" width="558" height="32"/>
+                                    <subviews>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0nq-7L-m9q">
+                                            <rect key="frame" x="14" y="8" width="408" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="404" id="O10-wD-leM"/>
+                                            </constraints>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="tiC-eL-Ua5">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                        <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="ixW-DR-K5m">
+                                            <rect key="frame" x="0.0" y="-2" width="558" height="5"/>
+                                        </box>
+                                        <box horizontalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="HAK-Ca-phV">
+                                            <rect key="frame" x="438" y="0.0" width="5" height="32"/>
+                                        </box>
+                                        <button tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="Kge-OI-LmY">
+                                            <rect key="frame" x="457" y="8" width="85" height="16"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="IV6-tt-6zC">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="buttonItemClicked_UntieDevice:" target="-2" id="rfQ-ec-lLj"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstAttribute="bottom" secondItem="HAK-Ca-phV" secondAttribute="bottom" id="1Dt-p8-mzu"/>
+                                        <constraint firstAttribute="trailing" secondItem="ixW-DR-K5m" secondAttribute="trailing" id="2Ht-jZ-dVD"/>
+                                        <constraint firstItem="0nq-7L-m9q" firstAttribute="centerY" secondItem="PzA-Dl-wAU" secondAttribute="centerY" id="2Vo-sI-i0H"/>
+                                        <constraint firstAttribute="height" constant="32" id="BfZ-xM-oMQ"/>
+                                        <constraint firstItem="0nq-7L-m9q" firstAttribute="leading" secondItem="PzA-Dl-wAU" secondAttribute="leading" constant="16" id="Et4-qU-OV3"/>
+                                        <constraint firstItem="ixW-DR-K5m" firstAttribute="leading" secondItem="PzA-Dl-wAU" secondAttribute="leading" id="GAy-a9-cGu"/>
+                                        <constraint firstItem="HAK-Ca-phV" firstAttribute="leading" secondItem="0nq-7L-m9q" secondAttribute="trailing" constant="20" id="MAl-BQ-kb0"/>
+                                        <constraint firstAttribute="trailing" secondItem="Kge-OI-LmY" secondAttribute="trailing" constant="16" id="fvx-Mr-uIF"/>
+                                        <constraint firstAttribute="bottom" secondItem="ixW-DR-K5m" secondAttribute="bottom" id="hFt-a7-gnW"/>
+                                        <constraint firstItem="HAK-Ca-phV" firstAttribute="top" secondItem="PzA-Dl-wAU" secondAttribute="top" id="k4D-XZ-ngg"/>
+                                        <constraint firstItem="Kge-OI-LmY" firstAttribute="leading" secondItem="HAK-Ca-phV" secondAttribute="trailing" constant="16" id="x0r-4E-aqB"/>
+                                        <constraint firstItem="Kge-OI-LmY" firstAttribute="centerY" secondItem="PzA-Dl-wAU" secondAttribute="centerY" id="xuY-cE-gun"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="8ol-uC-3wd">
+                                    <rect key="frame" x="0.0" y="0.0" width="558" height="32"/>
+                                    <subviews>
+                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gY3-sn-FqD">
+                                            <rect key="frame" x="14" y="8" width="408" height="16"/>
+                                            <constraints>
+                                                <constraint firstAttribute="width" constant="404" id="Rk3-Mb-njg"/>
+                                            </constraints>
+                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="v10-qZ-kJH">
+                                                <font key="font" usesAppearanceFont="YES"/>
+                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            </textFieldCell>
+                                        </textField>
+                                        <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="Tpp-gW-aFI">
+                                            <rect key="frame" x="0.0" y="-2" width="558" height="5"/>
+                                        </box>
+                                        <box horizontalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="9UX-jN-5h5">
+                                            <rect key="frame" x="438" y="0.0" width="5" height="32"/>
+                                        </box>
+                                        <button tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="yGV-Xc-wgR">
+                                            <rect key="frame" x="457" y="8" width="85" height="16"/>
+                                            <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="Vgc-jS-ps0">
+                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                <font key="font" metaFont="system"/>
+                                            </buttonCell>
+                                            <connections>
+                                                <action selector="buttonItemClicked_UntieDevice:" target="-2" id="A5U-CZ-aTr"/>
+                                            </connections>
+                                        </button>
+                                    </subviews>
+                                    <constraints>
+                                        <constraint firstItem="gY3-sn-FqD" firstAttribute="leading" secondItem="8ol-uC-3wd" secondAttribute="leading" constant="16" id="0Oh-DR-ouH"/>
+                                        <constraint firstItem="yGV-Xc-wgR" firstAttribute="centerY" secondItem="8ol-uC-3wd" secondAttribute="centerY" id="0cA-yh-o7s"/>
+                                        <constraint firstAttribute="trailing" secondItem="yGV-Xc-wgR" secondAttribute="trailing" constant="16" id="G2S-Ho-KB6"/>
+                                        <constraint firstItem="9UX-jN-5h5" firstAttribute="leading" secondItem="gY3-sn-FqD" secondAttribute="trailing" constant="20" id="KZj-oE-Zep"/>
+                                        <constraint firstItem="9UX-jN-5h5" firstAttribute="top" secondItem="8ol-uC-3wd" secondAttribute="top" id="Rtj-zl-GHc"/>
+                                        <constraint firstAttribute="bottom" secondItem="Tpp-gW-aFI" secondAttribute="bottom" id="WHD-ve-Gzf"/>
+                                        <constraint firstAttribute="height" constant="32" id="XCv-oA-ItM"/>
+                                        <constraint firstItem="Tpp-gW-aFI" firstAttribute="leading" secondItem="8ol-uC-3wd" secondAttribute="leading" id="YMy-cu-GKi"/>
+                                        <constraint firstAttribute="trailing" secondItem="Tpp-gW-aFI" secondAttribute="trailing" id="eOv-Np-sWS"/>
+                                        <constraint firstItem="gY3-sn-FqD" firstAttribute="centerY" secondItem="8ol-uC-3wd" secondAttribute="centerY" id="ixh-GM-vMn"/>
+                                        <constraint firstAttribute="bottom" secondItem="9UX-jN-5h5" secondAttribute="bottom" id="k7n-T6-w1z"/>
+                                        <constraint firstItem="yGV-Xc-wgR" firstAttribute="leading" secondItem="9UX-jN-5h5" secondAttribute="trailing" constant="16" id="vbQ-Z1-2Hn"/>
+                                    </constraints>
+                                </customView>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="vS4-8H-f0m" firstAttribute="top" secondItem="OHg-6E-afT" secondAttribute="bottom" id="1O7-gC-pcd"/>
+                                <constraint firstItem="PzA-Dl-wAU" firstAttribute="leading" secondItem="z1h-qn-QRk" secondAttribute="leading" id="8hI-SB-nj2"/>
+                                <constraint firstAttribute="trailing" secondItem="SgO-vS-hmk" secondAttribute="trailing" id="AAc-lU-yOF"/>
+                                <constraint firstItem="vS4-8H-f0m" firstAttribute="leading" secondItem="z1h-qn-QRk" secondAttribute="leading" id="Doe-E6-1Pb"/>
+                                <constraint firstAttribute="trailing" secondItem="OHg-6E-afT" secondAttribute="trailing" id="E3r-YO-ZvB"/>
+                                <constraint firstAttribute="trailing" secondItem="8ol-uC-3wd" secondAttribute="trailing" id="HCF-h7-PRp"/>
+                                <constraint firstItem="8ol-uC-3wd" firstAttribute="leading" secondItem="z1h-qn-QRk" secondAttribute="leading" id="LCb-cP-H5o"/>
+                                <constraint firstItem="PzA-Dl-wAU" firstAttribute="top" secondItem="vS4-8H-f0m" secondAttribute="bottom" id="Rzb-U7-hwx"/>
+                                <constraint firstAttribute="bottom" secondItem="SgO-vS-hmk" secondAttribute="bottom" constant="128" id="UPm-ji-bRT"/>
+                                <constraint firstItem="8ol-uC-3wd" firstAttribute="top" secondItem="PzA-Dl-wAU" secondAttribute="bottom" id="VyF-fo-ayi"/>
+                                <constraint firstItem="8ol-uC-3wd" firstAttribute="top" secondItem="PzA-Dl-wAU" secondAttribute="bottom" id="cj0-nU-dSq"/>
+                                <constraint firstAttribute="trailing" secondItem="PzA-Dl-wAU" secondAttribute="trailing" id="fMw-wr-tNf"/>
+                                <constraint firstItem="SgO-vS-hmk" firstAttribute="top" secondItem="z1h-qn-QRk" secondAttribute="top" id="gHw-5W-Dub"/>
+                                <constraint firstAttribute="trailing" secondItem="vS4-8H-f0m" secondAttribute="trailing" id="hb9-Cq-VMC"/>
+                                <constraint firstItem="OHg-6E-afT" firstAttribute="top" secondItem="SgO-vS-hmk" secondAttribute="bottom" id="hgN-qf-uP4"/>
+                                <constraint firstItem="SgO-vS-hmk" firstAttribute="leading" secondItem="z1h-qn-QRk" secondAttribute="leading" id="rS7-Lt-G4P"/>
+                                <constraint firstItem="OHg-6E-afT" firstAttribute="leading" secondItem="z1h-qn-QRk" secondAttribute="leading" id="v8u-hl-hcM"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="width" constant="560" id="zTX-LT-T6b"/>
+                        </constraints>
+                        <font key="titleFont" metaFont="smallSystem"/>
+                    </box>
+                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8Fh-gG-iGb">
+                        <rect key="frame" x="18" y="61" width="35" height="15"/>
+                        <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="SBN-aT-Hkc">
+                            <font key="font" metaFont="system" size="12"/>
+                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                        </textFieldCell>
+                    </textField>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="o7T-ep-nAB">
+                        <rect key="frame" x="443" y="13" width="75" height="32"/>
+                        <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="j9X-Go-Q4Q">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_Cancel:" target="-2" id="ln1-gh-Lfo"/>
+                        </connections>
+                    </button>
+                    <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="DkR-wO-1gm">
+                        <rect key="frame" x="512" y="13" width="75" height="32"/>
+                        <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="mrZ-FD-4c3">
+                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                            <font key="font" metaFont="system"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+                        </buttonCell>
+                        <connections>
+                            <action selector="buttonItemClicked_Login:" target="-2" id="eGY-9D-WZ4"/>
+                        </connections>
+                    </button>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="DkR-wO-1gm" firstAttribute="trailing" secondItem="taS-Oo-Ijv" secondAttribute="trailing" id="1va-Kx-Pw5"/>
+                    <constraint firstAttribute="bottom" secondItem="DkR-wO-1gm" secondAttribute="bottom" constant="20" id="5SX-07-sWh"/>
+                    <constraint firstItem="DkR-wO-1gm" firstAttribute="leading" secondItem="o7T-ep-nAB" secondAttribute="trailing" constant="8" id="6Id-dg-QEU"/>
+                    <constraint firstItem="taS-Oo-Ijv" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" id="7Dm-5w-7nz"/>
+                    <constraint firstAttribute="trailing" secondItem="taS-Oo-Ijv" secondAttribute="trailing" constant="20" id="DIs-uj-lck"/>
+                    <constraint firstItem="taS-Oo-Ijv" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="40" id="eFV-ck-tn2"/>
+                    <constraint firstItem="DkR-wO-1gm" firstAttribute="centerY" secondItem="o7T-ep-nAB" secondAttribute="centerY" id="eRw-HX-3so"/>
+                    <constraint firstItem="8Fh-gG-iGb" firstAttribute="leading" secondItem="taS-Oo-Ijv" secondAttribute="leading" id="f9U-Fd-Lqo"/>
+                    <constraint firstItem="8Fh-gG-iGb" firstAttribute="top" secondItem="taS-Oo-Ijv" secondAttribute="bottom" constant="12" id="ydh-FC-hIL"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="10" y="141.5"/>
+        </window>
+    </objects>
+</document>

+ 16 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -7,6 +7,12 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		03063B5D2CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */; };
+		03063B5E2CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */; };
+		03063B5F2CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */; };
+		03063B602CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */; };
+		03063B612CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */; };
+		03063B622CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */; };
 		651A59822C8EA20F005A35FB /* KMPurchaseEmbeddedWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */; };
 		651A59832C8EA210005A35FB /* KMPurchaseEmbeddedWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */; };
 		652E953D2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */; };
@@ -5753,6 +5759,8 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMemberCenterWindowController.swift; sourceTree = "<group>"; };
+		03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMMemberCenterWindowController.xib; sourceTree = "<group>"; };
 		652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFreehandAnnotationController.swift; sourceTree = "<group>"; };
 		652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLineAndBorderItemView.swift; sourceTree = "<group>"; };
 		652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLineAndBorderItemView.xib; sourceTree = "<group>"; };
@@ -9126,6 +9134,8 @@
 				9F93494C2CE25F8900BC3E1C /* KMFreeGetAIWC.xib */,
 				9F33C9EE2CDB34A50080D3C2 /* KMProductCompareWC.swift */,
 				9F33C9EF2CDB34A50080D3C2 /* KMProductCompareWC.xib */,
+				03063B5B2CE3908C006DB603 /* KMMemberCenterWindowController.swift */,
+				03063B5C2CE3908C006DB603 /* KMMemberCenterWindowController.xib */,
 				9F33C9DF2CDB04460080D3C2 /* DMG */,
 			);
 			path = WindowsController;
@@ -15403,6 +15413,7 @@
 				ADDF83622B391A5C00A81A4E /* DSignatureFromFileViewController.xib in Resources */,
 				9F0CB46A2967E5CB00007028 /* KMPropertiesPanelSubViewController.xib in Resources */,
 				9F0CB4722967E63100007028 /* KMPropertiesPanelNameSubVC.xib in Resources */,
+				03063B5F2CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */,
 				ADE8BC2A29F7CDB000570F89 /* KMPageNumberDisplayView.xib in Resources */,
 				ADF6B8812A485A8F0090CB78 /* KMComparativeViewCollectionItemItem.xib in Resources */,
 				AD2D74B929F0D3A100EDC5E4 /* KMCancellationSuccessView.xib in Resources */,
@@ -15986,6 +15997,7 @@
 				BBA8B7B4293635D80097D183 /* KMPasswordInputWindow.xib in Resources */,
 				BBBAECF92B57672C00266BD3 /* TransitionSheet.xib in Resources */,
 				BBD8EE912B8EC86900EB05FE /* AutoSavePopController.xib in Resources */,
+				03063B5D2CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */,
 				9F78EFBF28F7C1CC001E66F4 /* KMHomeViewController.xib in Resources */,
 				9FDCD8122B6C904900E22166 /* KMFormListMenuPopWindowController.xib in Resources */,
 				BBB376A52B10A7FD009539CC /* a_4b.png in Resources */,
@@ -16564,6 +16576,7 @@
 				AD85D1892AEF46DF000F4D28 /* KMHomeNOFileView.xib in Resources */,
 				8997011328F40842009AF911 /* KMOutlineViewController.xib in Resources */,
 				896933D629AEEE3D0055327F /* PageSheet.xib in Resources */,
+				03063B612CE3908C006DB603 /* KMMemberCenterWindowController.xib in Resources */,
 				BBAFC8412985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				BBA19F3829ADACC5001A285A /* signPicture_nor.pdf in Resources */,
 				9FBA0EE628FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
@@ -18095,6 +18108,7 @@
 				BB67EE1A2B54FFEF00573BF0 /* ASIHTTPRequest.m in Sources */,
 				BB1B0AFB2B4FC6E900889528 /* KMCustomColorGuideView.swift in Sources */,
 				BB948CFE2BFF63C9000FBA01 /* KMToolbarConfigViewController.swift in Sources */,
+				03063B602CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */,
 				9F33C9F72CDB3FB40080D3C2 /* KMProductModel.swift in Sources */,
 				BBB789872BE8BF2300F7E09C /* AINewConfigWindowController.swift in Sources */,
 				9F0CB4D92986553600007028 /* KMDesignToken+VerticalPadding.swift in Sources */,
@@ -18339,6 +18353,7 @@
 				BB146FC7299DC0D100784A6A /* GTMSessionFetcherService.m in Sources */,
 				BB8B17332907B63D001C5EA5 /* CipherTextView.swift in Sources */,
 				89E9B407295D268E00AEFA61 /* KMEditImagePropertyViewController.swift in Sources */,
+				03063B5E2CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */,
 				BB89722F294B08DE0045787C /* KMWatermarkViewController.swift in Sources */,
 				ADDF83812B391A5D00A81A4E /* DSignatureSaveFolderViewController.swift in Sources */,
 				BB9599C42B31647B0062D346 /* KMRedactPropertiesWindowController.swift in Sources */,
@@ -19633,6 +19648,7 @@
 				BBB789922BE8BF2300F7E09C /* AITypeItemChooseView.swift in Sources */,
 				BBEFD0262AFA065F003FABD8 /* KMBatchAddHeaderFooterOperation.swift in Sources */,
 				BB8F4580295B00130037EA22 /* KMWatermarkAdjectiveTools.swift in Sources */,
+				03063B622CE3908C006DB603 /* KMMemberCenterWindowController.swift in Sources */,
 				BBB9B312299A5D6D004F3235 /* KMCloudDownloadOperationQueue.m in Sources */,
 				BB147046299DC0D200784A6A /* OIDURLQueryComponent.m in Sources */,
 				BB67EE2B2B54FFEF00573BF0 /* ASIDownloadCache.m in Sources */,