[
  {
    "path": ".gitignore",
    "content": "# Xcode\n.DS_Store\n*/build/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\nprofile\n*.moved-aside\nDerivedData\n.idea/\n*.hmap\n*.xccheckout\n\n#CocoaPods\nPods\n"
  },
  {
    "path": ".travis.yml",
    "content": "branches:\n  only:\n  - master\n\nlanguage: objective-c\nosx_image: xcode10\n\nscript:\n- xcodebuild -project BeeTee.xcodeproj -target BeeTee -sdk iphonesimulator\n\nafter_success:\n- bash <(curl -s https://codecov.io/bash)\n"
  },
  {
    "path": "BeeTee/BeeTee-Bridging-Header.h",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n#import \"BluetoothManagerHandler.h\"\n#import \"BluetoothDeviceHandler.h\"\n"
  },
  {
    "path": "BeeTee/BeeTee.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport Foundation\n\n\npublic enum BeeTeeNotification: String {\n    case PowerChanged               = \"BluetoothPowerChangedNotification\"\n    case AvailabilityChanged        = \"BluetoothAvailabilityChangedNotification\"\n    case DeviceDiscovered           = \"BluetoothDeviceDiscoveredNotification\"\n    case DeviceRemoved              = \"BluetoothDeviceRemovedNotification\"\n    case ConnectabilityChanged      = \"BluetoothConnectabilityChangedNotification\"\n    case DeviceUpdated              = \"BluetoothDeviceUpdatedNotification\"\n    case DiscoveryStateChanged      = \"BluetoothDiscoveryStateChangedNotification\"\n    case DeviceConnectSuccess       = \"BluetoothDeviceConnectSuccessNotification\"\n    case ConnectionStatusChanged    = \"BluetoothConnectionStatusChangedNotification\"\n    case DeviceDisconnectSuccess    = \"BluetoothDeviceDisconnectSuccessNotification\"\n    \n    public static let allNotifications: [BeeTeeNotification] = [.PowerChanged, .AvailabilityChanged, .DeviceDiscovered, .DeviceRemoved, .ConnectabilityChanged, .DeviceUpdated, .DiscoveryStateChanged, .DeviceConnectSuccess, .ConnectionStatusChanged, .DeviceDisconnectSuccess]\n}\n\n\n\npublic protocol BeeTeeDelegate {\n    func receivedBeeTeeNotification(notification: BeeTeeNotification)\n}\n\n\n\npublic class BeeTee {\n    \n    public var delegate: BeeTeeDelegate? = nil\n    public var availableDevices: [BeeTeeDevice] {\n        get {\n            return Array(_availableDevices)\n        }\n    }\n    \n    private let bluetoothManagerHandler = BluetoothManagerHandler.sharedInstance()!\n    private var _availableDevices = Set<BeeTeeDevice>()\n    private var tokenCache = [BeeTeeNotification: NSObjectProtocol]()\n    \n    public init() {\n        \n        for beeTeeNotification in BeeTeeNotification.allNotifications {\n            print(\"Registered \\(beeTeeNotification)\")\n            \n            let notification = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: beeTeeNotification.rawValue), object: nil, queue: OperationQueue.main) { [unowned self] (notification) in\n                let beeTeeNotification = BeeTeeNotification.init(rawValue: notification.name.rawValue)!\n                switch beeTeeNotification {\n                case .DeviceDiscovered:\n                    let beeTeeDevice = self.extractBeeTeeDevice(from: notification)\n                    self._availableDevices.insert(beeTeeDevice)\n                case .DeviceRemoved:\n                    let beeTeeDevice = self.extractBeeTeeDevice(from: notification)\n                    self._availableDevices.remove(beeTeeDevice)\n                default:\n                    break\n                }\n                if (self.delegate != nil) {\n                    self.delegate?.receivedBeeTeeNotification(notification: beeTeeNotification)\n                }\n            }\n            self.tokenCache[beeTeeNotification] = notification\n        }\n    }\n    \n    deinit {\n        for key in tokenCache.keys {\n            NotificationCenter.default.removeObserver(tokenCache[key]!)\n        }\n    }\n    \n    public func enableBluetooth() {\n        bluetoothManagerHandler.enable()\n    }\n    \n    public func disableBluetooth() {\n        bluetoothManagerHandler.disable()\n    }\n\n    public func bluetoothIsEnabled() -> Bool {\n        return bluetoothManagerHandler.enabled()\n    }\n    \n    public func startScanForDevices() {\n        bluetoothManagerHandler.startScan()\n    }\n    \n    public func stopScan() {\n        bluetoothManagerHandler.stopScan()\n        resetAvailableDevices()\n    }\n    \n    public func isScanning() -> Bool {\n        return bluetoothManagerHandler.isScanning()\n    }\n    \n    public static func debugLowLevel() {\n        print(\"This is a dirty C hack and only for demonstration and deep debugging, but not for production.\") // credits to http://stackoverflow.com/a/3738387/1864294\n        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),\n                                        nil,\n                                        { (_, observer, name, _, _) in\n                                            let n = name?.rawValue as! String\n                                            if n.hasPrefix(\"B\") { // notice only notification they are associated with the BluetoothManager.framework\n                                               print(\"Received notification: \\(name)\")\n                                            }\n                                        },\n                                        nil,\n                                        nil,\n                                        .deliverImmediately)\n    }\n    \n    private func resetAvailableDevices() {\n        _availableDevices.removeAll()\n    }\n    \n    private func extractBeeTeeDevice(from notification: Notification) -> BeeTeeDevice {\n        let bluetoothDevice = BluetoothDeviceHandler(notification: notification)!\n        let beeTeeDevice = BeeTeeDevice(name: bluetoothDevice.name, address: bluetoothDevice.address, majorClass: bluetoothDevice.majorClass, minorClass: bluetoothDevice.minorClass, type: bluetoothDevice.type, supportsBatteryLevel: bluetoothDevice.supportsBatteryLevel, detectingDate: Date())\n        return beeTeeDevice\n    }\n}\n\n"
  },
  {
    "path": "BeeTee/BeeTeeDevice.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport Foundation\n\n\npublic class BeeTeeDevice: Hashable, CustomStringConvertible {\n    let name: String\n    let address: String\n    let majorClass: UInt\n    let minorCass: UInt\n    let type: Int\n    let supportsBatteryLevel: Bool\n    let detectingDate: Date\n    \n    convenience init(notification: Notification) {\n        let bluetoothDevice = BluetoothDeviceHandler(notification: notification)!\n        self.init(name: bluetoothDevice.name, address: bluetoothDevice.address, majorClass: bluetoothDevice.majorClass, minorClass: bluetoothDevice.minorClass, type: bluetoothDevice.type, supportsBatteryLevel: bluetoothDevice.supportsBatteryLevel, detectingDate: Date())\n    }\n    \n    init(name: String, address: String, majorClass: UInt, minorClass: UInt, type: Int, supportsBatteryLevel: Bool, detectingDate: Date) {\n        self.name = name\n        self.address = address\n        self.majorClass = majorClass\n        self.minorCass = minorClass\n        self.type = type\n        self.supportsBatteryLevel = supportsBatteryLevel\n        self.detectingDate = detectingDate\n    }\n    \n    public var description: String {\n        return \"\\(name) (\\(address)) @ \\(detectingDate))\"\n    }\n    \n    public var hashValue: Int {\n        return address.hashValue\n    }\n    \n    public static func ==(lhs: BeeTeeDevice, rhs: BeeTeeDevice) -> Bool {\n        return lhs.address == rhs.address\n    }\n}\n"
  },
  {
    "path": "BeeTee/BeeTeeModel.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport Foundation\n\nclass BeeTeeModel: BeeTeeDelegate {\n\n    static let sharedInstance = BeeTeeModel()\n\n    private let beeTee = BeeTee()\n    private var subscribers = [BeeTeeDelegate]()\n        \n    public var availableDevices: [BeeTeeDevice] {\n        get {\n            return beeTee.availableDevices\n        }\n    }\n    \n    private init() {\n        beeTee.delegate = self\n    }\n    \n    func receivedBeeTeeNotification(notification: BeeTeeNotification) {\n        for subscriber in subscribers {\n            subscriber.receivedBeeTeeNotification(notification: notification)\n        }\n        print(\"BeeTeeNotification: \" + String(describing: notification))\n    }\n    \n    public func turnBluetoothOn() {\n        beeTee.enableBluetooth()\n        print(\"Bluetooth turned on\")\n\n    }\n    \n    public func turnBluetoothOff() {\n        beeTee.disableBluetooth()\n        print(\"Bluetooth turned off\")\n\n    }\n    \n    public func bluetoothIsOn() -> Bool {\n        return beeTee.bluetoothIsEnabled()\n    }\n    \n    public func startScanForDevices() {\n        beeTee.startScanForDevices()\n        print(\"Bluetooth started scanning for new devices\")\n\n    }\n    \n    public func stopScan() {\n        beeTee.stopScan()\n        print(\"Bluetooth stopped scanning\")\n    }\n    \n    public func isScanning() -> Bool {\n        return beeTee.isScanning()\n    }\n    \n    public func subscribe(subscriber: BeeTeeDelegate) {\n        subscribers.append(subscriber)\n    }\n    \n    public func unsubscribe(subscriber: BeeTeeDelegate) {\n        //todo: add remove\n    }\n    \n}\n"
  },
  {
    "path": "BeeTee/BluetoothDevice.h",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n/* Generated by RuntimeBrowser\n   Image: /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager\n */\n\n@interface BluetoothDevice : NSObject {\n    NSString * _address;\n    struct BTDeviceImpl { } * _device;\n    NSString * _name;\n}\n\n- (void)_clearName;\n- (BOOL)_isNameCached;\n- (void)acceptSSP:(int)arg1;\n- (id)address;\n- (int)batteryLevel;\n- (BOOL)cloudPaired;\n- (int)compare:(id)arg1;\n- (void)connect;\n- (void)connectWithServices:(unsigned int)arg1;\n- (BOOL)connected;\n- (unsigned int)connectedServices;\n- (unsigned int)connectedServicesCount;\n- (id)copyWithZone:(struct _NSZone { }*)arg1;\n- (void)dealloc;\n- (id)description;\n- (struct BTDeviceImpl*)device;\n- (void)disconnect;\n- (unsigned int)doubleTapAction;\n- (void)endVoiceCommand;\n- (id)getServiceSetting:(unsigned int)arg1 key:(id)arg2;\n- (BOOL)inEarDetectEnabled;\n- (id)initWithDevice:(struct BTDeviceImpl { }*)arg1 address:(id)arg2;\n- (BOOL)isAccessory;\n- (BOOL)isAppleAudioDevice;\n- (BOOL)isServiceSupported:(unsigned int)arg1;\n- (BOOL)magicPaired;\n- (BOOL)magicPairedDeviceNameUpdated;\n- (unsigned int)majorClass;\n- (unsigned int)micMode;\n- (unsigned int)minorClass;\n- (id)name;\n- (BOOL)paired;\n- (unsigned int)productId;\n- (id)scoUID;\n- (void)setDevice:(struct BTDeviceImpl { }*)arg1;\n- (BOOL)setDoubleTapAction:(unsigned int)arg1;\n- (BOOL)setInEarDetectEnabled:(BOOL)arg1;\n- (BOOL)setMicMode:(unsigned int)arg1;\n- (void)setPIN:(id)arg1;\n- (void)setServiceSetting:(unsigned int)arg1 key:(id)arg2 value:(id)arg3;\n- (void)setSyncGroup:(int)arg1 enabled:(BOOL)arg2;\n- (void)setSyncSettings:(struct { BOOL x1; BOOL x2; BOOL x3; BOOL x4; })arg1;\n- (BOOL)setUserName:(id)arg1;\n- (void)startVoiceCommand;\n- (BOOL)supportsBatteryLevel;\n- (id)syncGroups;\n- (struct { BOOL x1; BOOL x2; BOOL x3; BOOL x4; })syncSettings;\n- (int)type;\n- (void)unpair;\n- (unsigned int)vendorId;\n\n@end\n"
  },
  {
    "path": "BeeTee/BluetoothDeviceHandler.h",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n#import <Foundation/Foundation.h>\n\n@interface BluetoothDeviceHandler : NSObject\n\n@property (strong, nonatomic, readonly) NSString* name;\n@property (strong, nonatomic, readonly) NSString* address;\n@property (assign, nonatomic, readonly) NSUInteger majorClass;\n@property (assign, nonatomic, readonly) NSUInteger minorClass;\n@property (assign, nonatomic, readonly) NSInteger type;\n@property (assign, nonatomic, readonly) BOOL supportsBatteryLevel;\n\n- (instancetype)initWithNotification:(NSNotification*) notification;\n\n@end\n"
  },
  {
    "path": "BeeTee/BluetoothDeviceHandler.m",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n#import \"BluetoothDeviceHandler.h\"\n#import \"BluetoothDevice.h\"\n\n\n@interface BluetoothDeviceHandler ()\n\n@property (strong, nonatomic, readwrite) NSString* name;\n@property (strong, nonatomic, readwrite) NSString* address;\n@property (assign, nonatomic, readwrite) NSUInteger majorClass;\n@property (assign, nonatomic, readwrite) NSUInteger minorClass;\n@property (assign, nonatomic, readwrite) NSInteger type;\n@property (assign, nonatomic, readwrite) BOOL supportsBatteryLevel;\n\n@end\n\n\n@implementation BluetoothDeviceHandler\n\n- (instancetype)initWithNotification:(NSNotification*) notification {\n    BluetoothDevice *bluetoothDevice = [notification object];\n    \n    self = [super init];\n    if (self) {\n        self.name = bluetoothDevice.name;\n        self.address = bluetoothDevice.address;\n        self.majorClass = bluetoothDevice.majorClass;\n        self.minorClass = bluetoothDevice.minorClass;\n        self.type = bluetoothDevice.type;\n        self.supportsBatteryLevel = bluetoothDevice.supportsBatteryLevel;\n    }\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "BeeTee/BluetoothManager.h",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n/* Generated by RuntimeBrowser\n   Image: /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager\n */\n\n@interface BluetoothManager : NSObject {\n    struct BTAccessoryManagerImpl { } * _accessoryManager;\n    BOOL  _audioConnected;\n    int  _available;\n    NSMutableDictionary * _btAddrDict;\n    NSMutableDictionary * _btDeviceDict;\n    struct BTDiscoveryAgentImpl { } * _discoveryAgent;\n    struct BTLocalDeviceImpl { } * _localDevice;\n    struct BTPairingAgentImpl { } * _pairingAgent;\n    BOOL  _scanningEnabled;\n    BOOL  _scanningInProgress;\n    unsigned int  _scanningServiceMask;\n    struct BTSessionImpl { } * _session;\n}\n\n// Image: /System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager\n\n+ (int)lastInitError;\n+ (void)setSharedInstanceQueue:(id)arg1;\n+ (id)sharedInstance;\n\n- (struct BTAccessoryManagerImpl*)_accessoryManager;\n- (void)_advertisingChanged;\n- (BOOL)_attach;\n- (void)_cleanup:(BOOL)arg1;\n- (void)_connectabilityChanged;\n- (void)_connectedStatusChanged;\n- (void)_discoveryStateChanged;\n- (void)_pairedStatusChanged;\n- (void)_postNotification:(id)arg1;\n- (void)_postNotificationWithArray:(id)arg1;\n- (void)_powerChanged;\n- (void)_removeDevice:(id)arg1;\n- (void)_restartScan;\n- (void)_scanForServices:(unsigned int)arg1 withMode:(int)arg2;\n- (void)_setScanState:(int)arg1;\n- (BOOL)_setup:(struct BTSessionImpl { }*)arg1;\n- (void)acceptSSP:(int)arg1 forDevice:(id)arg2;\n- (id)addDeviceIfNeeded:(struct BTDeviceImpl { }*)arg1;\n- (BOOL)audioConnected;\n- (BOOL)available;\n- (void)cancelPairing;\n- (void)connectDevice:(id)arg1;\n- (void)connectDevice:(id)arg1 withServices:(unsigned int)arg2;\n- (BOOL)connectable;\n- (BOOL)connected;\n- (id)connectedDevices;\n- (id)connectingDevices;\n- (void)dealloc;\n- (BOOL)devicePairingEnabled;\n- (BOOL)deviceScanningEnabled;\n- (BOOL)deviceScanningInProgress;\n- (void)disconnectDevice:(id)arg1;\n- (void)enableTestMode;\n- (BOOL)enabled;\n- (void)endVoiceCommand:(id)arg1;\n- (id)init;\n- (BOOL)isAnyoneAdvertising;\n- (BOOL)isAnyoneScanning;\n- (BOOL)isDiscoverable;\n- (BOOL)isServiceSupported:(unsigned int)arg1;\n- (id)localAddress;\n- (id)pairedDevices;\n- (void)postNotification:(id)arg1;\n- (void)postNotificationName:(id)arg1 object:(id)arg2;\n- (void)postNotificationName:(id)arg1 object:(id)arg2 error:(id)arg3;\n- (int)powerState;\n- (BOOL)powered;\n- (void)resetDeviceScanning;\n- (void)scanForConnectableDevices:(unsigned int)arg1;\n- (void)scanForServices:(unsigned int)arg1;\n- (void)setAudioConnected:(BOOL)arg1;\n- (void)setConnectable:(BOOL)arg1;\n- (void)setDevicePairingEnabled:(BOOL)arg1;\n- (void)setDeviceScanningEnabled:(BOOL)arg1;\n- (void)setDiscoverable:(BOOL)arg1;\n- (BOOL)setEnabled:(BOOL)arg1;\n- (void)setPincode:(id)arg1 forDevice:(id)arg2;\n- (BOOL)setPowered:(BOOL)arg1;\n- (void)showPowerPrompt;\n- (void)startVoiceCommand:(id)arg1;\n- (void)unpairDevice:(id)arg1;\n- (BOOL)wasDeviceDiscovered:(id)arg1;\n\n// Image: /System/Library/PrivateFrameworks/GameKitServices.framework/GameKitServices\n\n- (int)localDeviceSupportsService:(unsigned int)arg1;\n\n@end\n"
  },
  {
    "path": "BeeTee/BluetoothManagerHandler.h",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n#import <Foundation/Foundation.h>\n\n\n@interface BluetoothManagerHandler : NSObject\n\n+ (BluetoothManagerHandler*) sharedInstance;\n\n- (bool) powered;\n- (void) setPower: (bool)powerStatus;\n- (void) startScan;\n- (void) stopScan;\n- (bool) isScanning;\n- (bool) enabled;\n- (void) disable;\n- (void) enable;\n\n@end\n"
  },
  {
    "path": "BeeTee/BluetoothManagerHandler.m",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\n#import \"BluetoothManagerHandler.h\"\n#import \"BluetoothManager.h\"\n\nstatic BluetoothManager *_bluetoothManager = nil;\nstatic BluetoothManagerHandler *_handler = nil;\n\n@implementation BluetoothManagerHandler\n\n\n+ (BluetoothManagerHandler*) sharedInstance {\n\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        NSBundle *b = [NSBundle bundleWithPath:@\"/System/Library/PrivateFrameworks/BluetoothManager.framework\"];\n        if (![b load]) {\n            NSLog(@\"Error\"); // maybe throw an exception\n        } else {\n            _bluetoothManager = [NSClassFromString(@\"BluetoothManager\") valueForKey:@\"sharedInstance\"];\n            _handler = [[BluetoothManagerHandler alloc] init];\n        }\n    });\n    return _handler;\n}\n\n\n- (bool) powered {\n    return [_bluetoothManager powered];\n}\n\n\n- (void) setPower: (bool)powerStatus {\n    [_bluetoothManager setPowered:powerStatus];\n}\n\n\n- (void) startScan {\n    [_bluetoothManager setDeviceScanningEnabled: true];\n    [_bluetoothManager scanForServices: 0xFFFFFFFF];\n}\n\n\n- (void) stopScan {\n    [_bluetoothManager setDeviceScanningEnabled: false];\n}\n\n\n- (bool)isScanning {\n    return [_bluetoothManager deviceScanningEnabled];\n}\n\n\n- (bool)enabled {\n    return [_bluetoothManager enabled];\n}\n\n- (void)disable {\n    [_bluetoothManager setEnabled:false];\n}\n\n- (void)enable {\n    [_bluetoothManager setEnabled:true];\n}\n\n@end\n"
  },
  {
    "path": "BeeTee/DeviceDetailViewController.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport UIKit\n\n\nclass DeviceDetailViewController: UITableViewController {\n    \n    var device: BeeTeeDevice? = nil\n    let attributes = [\"Name\", \"Address\", \"Major Class\", \"Minor Class\", \"Type\", \"Battery\"]\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return attributes.count\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        var value: String = \"\"\n        if (device != nil) {\n            switch indexPath.row {\n            case 0:\n                value = device!.name\n            case 1:\n                value = device!.address\n            case 2:\n                value = String(device!.majorClass)\n            case 3:\n                value = String(device!.minorCass)\n            case 4:\n                value = String(device!.type)\n            case 5:\n                value = device!.supportsBatteryLevel ? \"Yes\" : \"No\"\n            default: break\n            }\n        }\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"DeviceDetailCellIdentifier\")!\n        cell.textLabel?.text = attributes[indexPath.row]\n        cell.detailTextLabel?.text = value\n        \n        return cell\n    }\n    \n    override func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {\n        return (tableView.cellForRow(at: indexPath)?.detailTextLabel?.text) != nil\n    }\n    \n    override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {\n        return action == #selector(copy(_:))\n    }\n    \n    override func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {\n        if action == #selector(copy(_:)) {\n            let cell = tableView.cellForRow(at: indexPath)\n            let pasteboard = UIPasteboard.general\n            pasteboard.string = cell?.detailTextLabel?.text\n        }\n    }\n    \n    \n    \n}\n"
  },
  {
    "path": "BeeTee/DeviceListingViewController.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport UIKit\n\nclass DeviceListingViewController: UITableViewController, BeeTeeDelegate {\n    let beeTeeModel = BeeTeeModel.sharedInstance\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        beeTeeModel.subscribe(subscriber: self)\n    }\n    \n    func receivedBeeTeeNotification(notification: BeeTeeNotification) {\n        tableView.reloadData()\n    }\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return beeTeeModel.availableDevices.count\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let beeTeeDevice = beeTeeModel.availableDevices[indexPath.row]\n        \n        let cell = tableView.dequeueReusableCell(withIdentifier: \"DeviceCellIdentifier\")!\n        cell.textLabel?.text = beeTeeDevice.name\n        cell.detailTextLabel?.text = beeTeeDevice.address\n        \n        return cell\n    }\n    \n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        let indexPath = tableView.indexPath(for: sender as! UITableViewCell)!\n        let selectedDevice = beeTeeModel.availableDevices[indexPath.row]\n\n        let deviceDetailViewController: DeviceDetailViewController = segue.destination as! DeviceDetailViewController\n        deviceDetailViewController.device = selectedDevice\n    }\n}\n"
  },
  {
    "path": "BeeTee Demo/AppDelegate.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport UIKit\nimport CoreLocation\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n}\n\n"
  },
  {
    "path": "BeeTee Demo/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "BeeTee Demo/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "BeeTee Demo/Assets.xcassets/DeviceListing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_18353-2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_18353-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_18353.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "BeeTee Demo/Assets.xcassets/MissionControl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_655374_cc-2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_655374_cc-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noun_655374_cc.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "BeeTee Demo/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11134\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11106\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "BeeTee Demo/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11762\" systemVersion=\"16C67\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"xHc-kc-34a\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11757\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Available Devices-->\n        <scene sceneID=\"HH2-jY-xzd\">\n            <objects>\n                <tableViewController id=\"TsF-5F-cgi\" customClass=\"DeviceListingViewController\" customModule=\"BeeTee\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"9xF-RZ-fRr\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" reuseIdentifier=\"DeviceCellIdentifier\" textLabel=\"iug-kI-3XO\" detailTextLabel=\"abr-Dm-LY2\" style=\"IBUITableViewCellStyleSubtitle\" id=\"dmk-tp-LaW\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"375\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"dmk-tp-LaW\" id=\"rFy-eZ-28k\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"342\" height=\"43\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"iug-kI-3XO\">\n                                            <rect key=\"frame\" x=\"15\" y=\"4\" width=\"34\" height=\"21\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Subtitle\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"abr-Dm-LY2\">\n                                            <rect key=\"frame\" x=\"15\" y=\"25\" width=\"44\" height=\"15\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <segue destination=\"5TA-Ix-vPu\" kind=\"show\" id=\"kDR-Wq-g2n\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"TsF-5F-cgi\" id=\"uaY-He-PhK\"/>\n                            <outlet property=\"delegate\" destination=\"TsF-5F-cgi\" id=\"9Qm-2Z-Pdf\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Available Devices\" id=\"280-gc-yOW\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"DPM-11-kJf\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1420\" y=\"-348\"/>\n        </scene>\n        <!--Available Devices-->\n        <scene sceneID=\"rcb-3O-ext\">\n            <objects>\n                <navigationController id=\"VNV-Qq-KCB\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Available Devices\" image=\"DeviceListing\" selectedImage=\"DeviceListing\" id=\"ocy-CZ-wvo\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"iOT-9T-MhV\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"TsF-5F-cgi\" kind=\"relationship\" relationship=\"rootViewController\" id=\"6eB-Qw-Lqt\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"kAm-LY-Hg8\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"666\" y=\"-347\"/>\n        </scene>\n        <!--Device Detail View Controller-->\n        <scene sceneID=\"52t-EE-eng\">\n            <objects>\n                <tableViewController id=\"5TA-Ix-vPu\" customClass=\"DeviceDetailViewController\" customModule=\"BeeTee\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"18\" sectionFooterHeight=\"18\" id=\"8Zo-gy-HEA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" cocoaTouchSystemColor=\"groupTableViewBackgroundColor\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"DeviceDetailCellIdentifier\" textLabel=\"Vqg-q7-c2s\" detailTextLabel=\"fr6-aL-aq6\" style=\"IBUITableViewCellStyleValue2\" id=\"do9-3x-Dlr\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"56\" width=\"375\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"do9-3x-Dlr\" id=\"L1U-5Q-4ab\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Vqg-q7-c2s\">\n                                            <rect key=\"frame\" x=\"15\" y=\"14\" width=\"91\" height=\"16\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Detail\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"fr6-aL-aq6\">\n                                            <rect key=\"frame\" x=\"112\" y=\"14\" width=\"35\" height=\"16\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <sections/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"5TA-Ix-vPu\" id=\"oLS-ao-ysc\"/>\n                            <outlet property=\"delegate\" destination=\"5TA-Ix-vPu\" id=\"oxJ-a7-bjy\"/>\n                        </connections>\n                    </tableView>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"6js-V9-RDK\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2167\" y=\"-348\"/>\n        </scene>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"qe4-Se-N6W\">\n            <objects>\n                <tabBarController id=\"xHc-kc-34a\" sceneMemberID=\"viewController\">\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" id=\"CTN-Ye-6Yb\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"49\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"ZfG-JE-bog\" kind=\"relationship\" relationship=\"viewControllers\" id=\"Rav-B4-nBh\"/>\n                        <segue destination=\"VNV-Qq-KCB\" kind=\"relationship\" relationship=\"viewControllers\" id=\"buX-QH-cXp\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"gjt-1t-U8j\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-310\" y=\"7\"/>\n        </scene>\n        <!--Mission Control-->\n        <scene sceneID=\"WJS-H0-eeD\">\n            <objects>\n                <navigationController id=\"ZfG-JE-bog\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Mission Control\" id=\"SjI-Rp-Y8P\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"r35-rj-mYK\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"To5-CM-11h\" kind=\"relationship\" relationship=\"rootViewController\" id=\"x4x-F7-MUN\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"0kZ-di-AJi\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"665\" y=\"322\"/>\n        </scene>\n        <!--Mission Control-->\n        <scene sceneID=\"Rds-kC-Pw5\">\n            <objects>\n                <tableViewController id=\"To5-CM-11h\" customClass=\"MissionControlViewController\" customModule=\"BeeTee\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"18\" sectionFooterHeight=\"18\" id=\"5CV-P7-yu6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" cocoaTouchSystemColor=\"groupTableViewBackgroundColor\"/>\n                        <sections>\n                            <tableViewSection id=\"hSf-U8-TQa\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"5Z3-dQ-JQO\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"35\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"5Z3-dQ-JQO\" id=\"3uE-sw-9uL\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"Bluetooth Power\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l0H-g9-rqU\">\n                                                    <rect key=\"frame\" x=\"8\" y=\"11\" width=\"126\" height=\"21\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jok-JS-aLg\">\n                                                    <rect key=\"frame\" x=\"318\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <connections>\n                                                        <action selector=\"switchBluetoothPower\" destination=\"To5-CM-11h\" eventType=\"valueChanged\" id=\"tjT-tA-2qx\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"lhU-XG-7Jy\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"79\" width=\"375\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"lhU-XG-7Jy\" id=\"Vlc-ml-3jV\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OuI-qn-KPi\">\n                                                    <rect key=\"frame\" x=\"318\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <connections>\n                                                        <action selector=\"switchBluetoothScanStatus\" destination=\"To5-CM-11h\" eventType=\"valueChanged\" id=\"DzG-oJ-XxE\"/>\n                                                    </connections>\n                                                </switch>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"Scan for new Devices\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TRc-dc-AKL\">\n                                                    <rect key=\"frame\" x=\"8\" y=\"11\" width=\"165\" height=\"21\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"To5-CM-11h\" id=\"HLZ-3K-9Sj\"/>\n                            <outlet property=\"delegate\" destination=\"To5-CM-11h\" id=\"x0Z-Ix-JH0\"/>\n                        </connections>\n                    </tableView>\n                    <tabBarItem key=\"tabBarItem\" title=\"Mission Control\" image=\"MissionControl\" selectedImage=\"MissionControl\" id=\"jqF-To-HJq\"/>\n                    <navigationItem key=\"navigationItem\" title=\"Mission Control\" id=\"zi5-Wx-1w1\"/>\n                    <connections>\n                        <outlet property=\"bluetoothPowerSwitch\" destination=\"jok-JS-aLg\" id=\"Ag9-T7-d8X\"/>\n                        <outlet property=\"bluetoothScanSwitch\" destination=\"OuI-qn-KPi\" id=\"VM5-Ay-EHV\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"NfO-K2-ccY\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1420\" y=\"322\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"DeviceListing\" width=\"25\" height=\"25\"/>\n        <image name=\"MissionControl\" width=\"25\" height=\"25\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "BeeTee Demo/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>3.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "BeeTee Demo/MissionControlViewController.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport UIKit\n\n\nclass MissionControlViewController: UITableViewController, BeeTeeDelegate {\n    \n    private let beeTeeModel = BeeTeeModel.sharedInstance\n    \n    @IBOutlet weak var bluetoothPowerSwitch: UISwitch!\n    @IBOutlet weak var bluetoothScanSwitch: UISwitch!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        beeTeeModel.subscribe(subscriber: self)\n        bluetoothPowerSwitch.setOn(beeTeeModel.bluetoothIsOn(), animated: false)\n        bluetoothScanSwitch.setOn(beeTeeModel.isScanning(), animated: false)\n    }\n\n    @IBAction func switchBluetoothPower() {\n        if beeTeeModel.bluetoothIsOn() {\n            beeTeeModel.turnBluetoothOff()\n        } else {\n            beeTeeModel.turnBluetoothOn()\n        }\n    }\n    \n    @IBAction func switchBluetoothScanStatus() {\n        if beeTeeModel.isScanning() {\n            beeTeeModel.stopScan()\n        } else {\n            beeTeeModel.startScanForDevices()\n        }\n    }\n    \n    func receivedBeeTeeNotification(notification: BeeTeeNotification) {\n        tableView.reloadData()\n        bluetoothPowerSwitch.setOn(beeTeeModel.bluetoothIsOn(), animated: true)\n        bluetoothScanSwitch.setOn(beeTeeModel.isScanning(), animated: true)\n    }\n}\n"
  },
  {
    "path": "BeeTee.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t5F0893721E17F82500197FAD /* MissionControlViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F0893711E17F82500197FAD /* MissionControlViewController.swift */; };\n\t\t5F0893761E181C7B00197FAD /* BeeTeeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F0893751E181C7B00197FAD /* BeeTeeModel.swift */; };\n\t\t5F08937D1E19021500197FAD /* DeviceListingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F08937C1E19021500197FAD /* DeviceListingViewController.swift */; };\n\t\t5F08937F1E19071800197FAD /* DeviceDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F08937E1E19071800197FAD /* DeviceDetailViewController.swift */; };\n\t\t5F1764F71E0EBFB0003F888A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F1764F61E0EBFB0003F888A /* AppDelegate.swift */; };\n\t\t5F1764F91E0EBFBA003F888A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5F1764F81E0EBFBA003F888A /* Assets.xcassets */; };\n\t\t5F1764FE1E0EBFC2003F888A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5F1764FA1E0EBFC2003F888A /* LaunchScreen.storyboard */; };\n\t\t5F1764FF1E0EBFC2003F888A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5F1764FC1E0EBFC2003F888A /* Main.storyboard */; };\n\t\t5F2409071E0C0134004AF90F /* BeeTeeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F2409061E0C0134004AF90F /* BeeTeeTests.swift */; };\n\t\t5F9F63371E0EB9300014A043 /* BeeTee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F9F632F1E0EB9300014A043 /* BeeTee.swift */; };\n\t\t5F9F63381E0EB9300014A043 /* BeeTeeDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F9F63301E0EB9300014A043 /* BeeTeeDevice.swift */; };\n\t\t5F9F63391E0EB9300014A043 /* BluetoothDeviceHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F9F63331E0EB9300014A043 /* BluetoothDeviceHandler.m */; };\n\t\t5F9F633A1E0EB9300014A043 /* BluetoothManagerHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F9F63361E0EB9300014A043 /* BluetoothManagerHandler.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t5F2409031E0C0134004AF90F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5F2408E61E0C0134004AF90F /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 5F2408ED1E0C0134004AF90F;\n\t\t\tremoteInfo = BeeTee;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t5F0893711E17F82500197FAD /* MissionControlViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MissionControlViewController.swift; path = \"BeeTee Demo/MissionControlViewController.swift\"; sourceTree = SOURCE_ROOT; };\n\t\t5F0893751E181C7B00197FAD /* BeeTeeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeeTeeModel.swift; sourceTree = \"<group>\"; };\n\t\t5F08937C1E19021500197FAD /* DeviceListingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceListingViewController.swift; sourceTree = \"<group>\"; };\n\t\t5F08937E1E19071800197FAD /* DeviceDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeviceDetailViewController.swift; sourceTree = \"<group>\"; };\n\t\t5F1764F61E0EBFB0003F888A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = \"BeeTee Demo/AppDelegate.swift\"; sourceTree = SOURCE_ROOT; };\n\t\t5F1764F81E0EBFBA003F888A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = \"BeeTee Demo/Assets.xcassets\"; sourceTree = SOURCE_ROOT; };\n\t\t5F1764FB1E0EBFC2003F888A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = \"BeeTee Demo/Base.lproj/LaunchScreen.storyboard\"; sourceTree = SOURCE_ROOT; };\n\t\t5F1764FD1E0EBFC2003F888A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = \"BeeTee Demo/Base.lproj/Main.storyboard\"; sourceTree = SOURCE_ROOT; };\n\t\t5F1765001E0EBFD2003F888A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = \"BeeTee Demo/Info.plist\"; sourceTree = SOURCE_ROOT; };\n\t\t5F2408EE1E0C0134004AF90F /* BeeTee.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BeeTee.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5F2409021E0C0134004AF90F /* BeeTeeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BeeTeeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5F2409061E0C0134004AF90F /* BeeTeeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeeTeeTests.swift; sourceTree = \"<group>\"; };\n\t\t5F2409081E0C0134004AF90F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t5F9F632E1E0EB9300014A043 /* BeeTee-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"BeeTee-Bridging-Header.h\"; path = \"BeeTee/BeeTee-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t5F9F632F1E0EB9300014A043 /* BeeTee.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BeeTee.swift; path = BeeTee/BeeTee.swift; sourceTree = \"<group>\"; };\n\t\t5F9F63301E0EB9300014A043 /* BeeTeeDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BeeTeeDevice.swift; path = BeeTee/BeeTeeDevice.swift; sourceTree = \"<group>\"; };\n\t\t5F9F63311E0EB9300014A043 /* BluetoothDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BluetoothDevice.h; path = BeeTee/BluetoothDevice.h; sourceTree = \"<group>\"; };\n\t\t5F9F63321E0EB9300014A043 /* BluetoothDeviceHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BluetoothDeviceHandler.h; path = BeeTee/BluetoothDeviceHandler.h; sourceTree = \"<group>\"; };\n\t\t5F9F63331E0EB9300014A043 /* BluetoothDeviceHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BluetoothDeviceHandler.m; path = BeeTee/BluetoothDeviceHandler.m; sourceTree = \"<group>\"; };\n\t\t5F9F63341E0EB9300014A043 /* BluetoothManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BluetoothManager.h; path = BeeTee/BluetoothManager.h; sourceTree = \"<group>\"; };\n\t\t5F9F63351E0EB9300014A043 /* BluetoothManagerHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BluetoothManagerHandler.h; path = BeeTee/BluetoothManagerHandler.h; sourceTree = \"<group>\"; };\n\t\t5F9F63361E0EB9300014A043 /* BluetoothManagerHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BluetoothManagerHandler.m; path = BeeTee/BluetoothManagerHandler.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t5F2408EB1E0C0134004AF90F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5F2408FF1E0C0134004AF90F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t5F0893791E18F95B00197FAD /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F1764F81E0EBFBA003F888A /* Assets.xcassets */,\n\t\t\t\t5F1764FA1E0EBFC2003F888A /* LaunchScreen.storyboard */,\n\t\t\t\t5F1764FC1E0EBFC2003F888A /* Main.storyboard */,\n\t\t\t);\n\t\t\tname = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F08937A1E18F96900197FAD /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F0893711E17F82500197FAD /* MissionControlViewController.swift */,\n\t\t\t\t5F08937C1E19021500197FAD /* DeviceListingViewController.swift */,\n\t\t\t\t5F08937E1E19071800197FAD /* DeviceDetailViewController.swift */,\n\t\t\t);\n\t\t\tname = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F08937B1E18F97000197FAD /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F0893751E181C7B00197FAD /* BeeTeeModel.swift */,\n\t\t\t);\n\t\t\tname = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F2408E51E0C0134004AF90F = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F9F632D1E0EB60A0014A043 /* BeeTee */,\n\t\t\t\t5F2408F01E0C0134004AF90F /* BeeTee Demo */,\n\t\t\t\t5F2409051E0C0134004AF90F /* BeeTeeTests */,\n\t\t\t\t5F2408EF1E0C0134004AF90F /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F2408EF1E0C0134004AF90F /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F2408EE1E0C0134004AF90F /* BeeTee.app */,\n\t\t\t\t5F2409021E0C0134004AF90F /* BeeTeeTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F2408F01E0C0134004AF90F /* BeeTee Demo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F1765001E0EBFD2003F888A /* Info.plist */,\n\t\t\t\t5F1764F61E0EBFB0003F888A /* AppDelegate.swift */,\n\t\t\t\t5F0893791E18F95B00197FAD /* View */,\n\t\t\t\t5F08937A1E18F96900197FAD /* Controller */,\n\t\t\t\t5F08937B1E18F97000197FAD /* Model */,\n\t\t\t);\n\t\t\tname = \"BeeTee Demo\";\n\t\t\tpath = BeeTee;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F2409051E0C0134004AF90F /* BeeTeeTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F2409061E0C0134004AF90F /* BeeTeeTests.swift */,\n\t\t\t\t5F2409081E0C0134004AF90F /* Info.plist */,\n\t\t\t);\n\t\t\tpath = BeeTeeTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F9F63281E0D75EC0014A043 /* Objective-C */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F9F632E1E0EB9300014A043 /* BeeTee-Bridging-Header.h */,\n\t\t\t\t5F9F63321E0EB9300014A043 /* BluetoothDeviceHandler.h */,\n\t\t\t\t5F9F63331E0EB9300014A043 /* BluetoothDeviceHandler.m */,\n\t\t\t\t5F9F63351E0EB9300014A043 /* BluetoothManagerHandler.h */,\n\t\t\t\t5F9F63361E0EB9300014A043 /* BluetoothManagerHandler.m */,\n\t\t\t\t5F9F63291E0D75F70014A043 /* Private Headers */,\n\t\t\t);\n\t\t\tname = \"Objective-C\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F9F63291E0D75F70014A043 /* Private Headers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F9F63311E0EB9300014A043 /* BluetoothDevice.h */,\n\t\t\t\t5F9F63341E0EB9300014A043 /* BluetoothManager.h */,\n\t\t\t);\n\t\t\tname = \"Private Headers\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F9F632D1E0EB60A0014A043 /* BeeTee */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5F9F632F1E0EB9300014A043 /* BeeTee.swift */,\n\t\t\t\t5F9F63301E0EB9300014A043 /* BeeTeeDevice.swift */,\n\t\t\t\t5F9F63281E0D75EC0014A043 /* Objective-C */,\n\t\t\t);\n\t\t\tname = BeeTee;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t5F2408ED1E0C0134004AF90F /* BeeTee */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5F24090B1E0C0134004AF90F /* Build configuration list for PBXNativeTarget \"BeeTee\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5F2408EA1E0C0134004AF90F /* Sources */,\n\t\t\t\t5F2408EB1E0C0134004AF90F /* Frameworks */,\n\t\t\t\t5F2408EC1E0C0134004AF90F /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = BeeTee;\n\t\t\tproductName = BeeTee;\n\t\t\tproductReference = 5F2408EE1E0C0134004AF90F /* BeeTee.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t5F2409011E0C0134004AF90F /* BeeTeeTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5F24090E1E0C0134004AF90F /* Build configuration list for PBXNativeTarget \"BeeTeeTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5F2408FE1E0C0134004AF90F /* Sources */,\n\t\t\t\t5F2408FF1E0C0134004AF90F /* Frameworks */,\n\t\t\t\t5F2409001E0C0134004AF90F /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t5F2409041E0C0134004AF90F /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = BeeTeeTests;\n\t\t\tproductName = BeeTeeTests;\n\t\t\tproductReference = 5F2409021E0C0134004AF90F /* BeeTeeTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t5F2408E61E0C0134004AF90F /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Michael Dorner\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t5F2408ED1E0C0134004AF90F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t5F2409011E0C0134004AF90F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 5F2408ED1E0C0134004AF90F;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 5F2408E91E0C0134004AF90F /* Build configuration list for PBXProject \"BeeTee\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 5F2408E51E0C0134004AF90F;\n\t\t\tproductRefGroup = 5F2408EF1E0C0134004AF90F /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t5F2408ED1E0C0134004AF90F /* BeeTee */,\n\t\t\t\t5F2409011E0C0134004AF90F /* BeeTeeTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t5F2408EC1E0C0134004AF90F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5F1764F91E0EBFBA003F888A /* Assets.xcassets in Resources */,\n\t\t\t\t5F1764FF1E0EBFC2003F888A /* Main.storyboard in Resources */,\n\t\t\t\t5F1764FE1E0EBFC2003F888A /* LaunchScreen.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5F2409001E0C0134004AF90F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t5F2408EA1E0C0134004AF90F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5F9F633A1E0EB9300014A043 /* BluetoothManagerHandler.m in Sources */,\n\t\t\t\t5F9F63371E0EB9300014A043 /* BeeTee.swift in Sources */,\n\t\t\t\t5F1764F71E0EBFB0003F888A /* AppDelegate.swift in Sources */,\n\t\t\t\t5F08937D1E19021500197FAD /* DeviceListingViewController.swift in Sources */,\n\t\t\t\t5F9F63381E0EB9300014A043 /* BeeTeeDevice.swift in Sources */,\n\t\t\t\t5F08937F1E19071800197FAD /* DeviceDetailViewController.swift in Sources */,\n\t\t\t\t5F0893761E181C7B00197FAD /* BeeTeeModel.swift in Sources */,\n\t\t\t\t5F9F63391E0EB9300014A043 /* BluetoothDeviceHandler.m in Sources */,\n\t\t\t\t5F0893721E17F82500197FAD /* MissionControlViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5F2408FE1E0C0134004AF90F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5F2409071E0C0134004AF90F /* BeeTeeTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t5F2409041E0C0134004AF90F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 5F2408ED1E0C0134004AF90F /* BeeTee */;\n\t\t\ttargetProxy = 5F2409031E0C0134004AF90F /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t5F1764FA1E0EBFC2003F888A /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5F1764FB1E0EBFC2003F888A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5F1764FC1E0EBFC2003F888A /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5F1764FD1E0EBFC2003F888A /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t5F2409091E0C0134004AF90F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5F24090A1E0C0134004AF90F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5F24090C1E0C0134004AF90F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/BeeTee Demo/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.michaeldorner.BeeTee;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"BeeTee/BeeTee-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5F24090D1E0C0134004AF90F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/BeeTee Demo/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.michaeldorner.BeeTee;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"BeeTee/BeeTee-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5F24090F1E0C0134004AF90F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tINFOPLIST_FILE = BeeTeeTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.michaeldorner.BeeTeeTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/BeeTee.app/BeeTee\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5F2409101E0C0134004AF90F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tINFOPLIST_FILE = BeeTeeTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.michaeldorner.BeeTeeTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/BeeTee.app/BeeTee\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t5F2408E91E0C0134004AF90F /* Build configuration list for PBXProject \"BeeTee\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5F2409091E0C0134004AF90F /* Debug */,\n\t\t\t\t5F24090A1E0C0134004AF90F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5F24090B1E0C0134004AF90F /* Build configuration list for PBXNativeTarget \"BeeTee\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5F24090C1E0C0134004AF90F /* Debug */,\n\t\t\t\t5F24090D1E0C0134004AF90F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5F24090E1E0C0134004AF90F /* Build configuration list for PBXNativeTarget \"BeeTeeTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5F24090F1E0C0134004AF90F /* Debug */,\n\t\t\t\t5F2409101E0C0134004AF90F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 5F2408E61E0C0134004AF90F /* Project object */;\n}\n"
  },
  {
    "path": "BeeTee.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:BeeTee.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "BeeTeeTests/BeeTeeTests.swift",
    "content": "/*\n This file is part of BeeTee Project. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at https://github.com/michaeldorner/BeeTee/blob/master/LICENSE. No part of BeeTee Project, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.\n */\n\nimport XCTest\n@testable import BeeTee\n\nclass BeeTeeTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        let beeTee = BeeTee()\n        for device in beeTee.availableDevices {\n            print(device)\n        }\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n    \n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n}\n"
  },
  {
    "path": "BeeTeeTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Michael Dorner\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://travis-ci.org/michaeldorner/BeeTee.svg?branch=master)](https://travis-ci.org/michaeldorner/BeeTee)\n[![codebeat badge](https://codebeat.co/badges/65bf4b44-cbbc-4807-a9e9-b3cd68c4378d)](https://codebeat.co/projects/github-com-michaeldorner-beetee)\n[![codecov](https://codecov.io/gh/michaeldorner/BeeTee/branch/master/graph/badge.svg)](https://codecov.io/gh/michaeldorner/BeeTee)\n[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n\n\n# BeeTee\n\n> BeeTee is an easy to use Swift framework, that allows simple access to the Bluetooth classic in iOS for turning on/off and scanning for Bluetooth devices. \n\nBesides BeeTee demonstrates how to access the private `BluetoothManager.framework` in iOS. \n\n\n## Table of Contents\n\n- [Limitations](#limitations)\n- [Installation](#installation)\n- [Usage](#usage)\n- [API](#api)\n- [Known Issues](#known-issues)\n- [Contributions](#contributions)\n- [Versions](#versions)\n- [License](#license)\n\n\n## Limitations\n\nBased on the [AppStore guideline §2.5](https://developer.apple.com/appstore/resources/approval/guidelines.html) on private (undocumented) functions it is not possible to publish apps with the _BeeTee_ and `BluetoothManager.framework` in the AppStore. \n\nYou need a valid membership of the [iOS Developer Program](https://developer.apple.com/programs/ios/), because the _BeeTee_ does not work in the iOS simulator.\n\nConnecting to devices is not possible in most cases and, therefore, not yet supported. \n\nThere are currently no known limitations on iOS versions. \n\n\n## Installation\n\nCopy all files in the _BeeTee_ folder to your project and done. That means there are 9 files to copy:\n\n* `BluetoothDevice.h`\n* `BluetoothManager.h`\n* `BluetoothDeviceHandler.h`\n* `BluetoothDeviceHandler.m`\n* `BluetoothManagerHandler.h`\n* `BluetoothManagerHandler.m`\n* `BeeTee-Bridge-Header.h`\n* `BeeTee.swift`\n* `BeeTeeDevice.swift`\n\n\n## Usage\n\nHere is a small code snippet, how easily you can use _BeeTee_:\n\n\tclass Demo: BeeTeeDelegate {\n\t    let beeTee = BeeTee()\n\t    \n\t   init() {\n\t        beeTee.delegate = self\n\t        beeTee.enableBluetooth()\n\t        beeTee.startScanForDevices()\n\t    }\n\t    \n\t    func receivedBeeTeeNotification(notification: BeeTeeNotification) {\n\t        switch notification {\n\t        case .DeviceDiscovered:\n\t            for device in beeTee.availableDevices {\n\t                print(device)\n\t            }\n\t        default:\n\t            print(notification)\n\t        }\n\t    }\n\t}\n\n\n## API\n\n### BeeTee\n\nThe API is based on the other hardware managers, such as [`CLLocationManager`](https://developer.apple.com/reference/corelocation/cllocationmanager) or the underlaying `BluetoothManager.framework`. \n\nI focused on a clear distinction between the different layers, also by using different programming languages:\n\n![Layer architecture of BeeTee](landingPage/BeeTeeLayer.png)\n\n#### `BeeTeeNotification`\n\n\tpublic enum BeeTeeNotification {\n\t    case PowerChanged\n\t    case AvailabilityChanged\n\t    case DeviceDiscovered\n\t    case DeviceRemoved\n\t    case ConnectabilityChanged\n\t    case DeviceUpdated\n\t    case DiscoveryStateChanged\n\t    case DeviceConnectSuccess\n\t    case ConnectionStatusChanged\n\t    case DeviceDisconnectSuccess\n\t    \n\t    static let allNotifications: [BeeTeeNotification]\n\t}\n\nSo all known notification from `BluetoothManager.framework` are passed through (see next section). I used only `PowerChanged`, `DeviceDiscovered`, `DeviceRemoved` in my demo application.\n\n#### `BeeTeeDelegate`\n\n\tpublic protocol BeeTeeDelegate {\n\t    func receivedBeeTeeNotification(notification: BeeTeeNotification)\n\t}\n\n#### `BeeTee`\n\n\tpublic class BeeTee {\n\t\tpublic var delegate: BeeTeeDelegate?\n\t\tpublic var availableDevices: [BeeTeeDevice]\n\t\tconvenience init(delegate: BeeTeeDelegate)\n\t\tpublic func enableBluetooth()\n\t\tpublic func disableBluetooth()\n\t\tpublic func bluetoothIsEnabled() -> Bool\n\t\tpublic func startScanForDevices()\n\t\tpublic func stopScan()\n\t\tpublic func isScanning() -> Bool\n\t\tpublic static func debugLowLevel() // see section BluetoothManager.framework/Available Notification\n\t}\n\n\n### `BluetoothManager.framework`\n\nIf you want to dive deeper into `BluetoothManager.framework` this section is interesting for you. \n\n#### Available Notifications\n\nI found the following notification regarding Bluetooth\n\n    BluetoothAvailabilityChangedNotification\n    BluetoothDiscoveryStateChangedNotification\n    BluetoothDeviceDiscoveredNotification\n    BluetoothDeviceRemovedNotification\n    BluetoothPowerChangedNotification\n    BluetoothConnectabilityChangedNotification\n    BluetoothDeviceUpdatedNotification\n    BluetoothDeviceConnectSuccessNotification\n    BluetoothConnectionStatusChangedNotification\n    BluetoothDeviceDisconnectSuccessNotification\n    \nMaybe the list is not complete. You can look for them yourself using\n\n\tCFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),\n\t        nil,\n\t        { (_, observer, name, _, _) in\n\t            let n = name?.rawValue as! String\n\t            if n.hasPrefix(\"B\") { // notice only notification they are associated with the BluetoothManager.framework\n\t                print(\"Received notification: \\(name)\")\n\t            }\n\t        },\n\t        nil,\n\t        nil,\n\t        .deliverImmediately)\nor with in `BeeTee`:\n\n\tBeeTee.debugLowLevel()\n\n\n## Known Issues\n\n* Actually I wanted to encapsulate BeeTee in a formal framework. But it seems that [Swift does not allow framework-internal (protected) Objective-C code](http://stackoverflow.com/questions/41303716/objective-c-code-swift-framework-internal). \n\n* Some notifications are sent multiple times ([issue](https://github.com/michaeldorner/BeeTee/issues/13)). I am not sure how to deal with it. \n\nIf you have problems make this project running have a look at [Stackoverflow](http://stackoverflow.com/search?q=beetee). If you have other questions or suggestions, feel free to contact me here in GitHub or somehow else. :-)\n\n\n## Contributions\n\nHelp is welcome! If you do not know what to do, just pick one item and send me a pull request.\n\n- [ ] Fix issue with multiple notifications\n- [ ] Restructure BeeTee in a framework (`BeeTee.framework`, see [discussion on stackoverflow](http://stackoverflow.com/questions/41303716/objective-c-code-swift-framework-internal))\n- [ ] Write test cases\n- [ ] Support Cocoapods\n- [ ] Improve documentation, especially inline documentation\n- [ ] Provide app icons\n- [x] Support Travis support\n\n\n## Versions\n\n### 3.0\n* Rewritten in Swift 3\n* New API\n* Clear separation of Objective-C and Swift code\n* Dynamically loading of `Bluetooth.framework` (so no more header and import trouble)\n* Released now under MIT license \n\n### 2.0\n* Wrapper classes `MDBluetoothManager` and `MDBluetoothDevice` introduced \n* Updated to ARC\n* Extented GUI\n\n### 1.0\n* Initial Commit as demo project for `BluetoothManager.framework`, Non-ARC\n\n\n## License \n\nBeeTee is released under the MIT license. See [LICENSE](LICENSE) for more details.\nThe list icon was created by Aya Sofya (thenounproject.com).\n"
  },
  {
    "path": "landingPage/BeeTeeLayer.graphml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:java=\"http://www.yworks.com/xml/yfiles-common/1.0/java\" xmlns:sys=\"http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0\" xmlns:x=\"http://www.yworks.com/xml/yfiles-common/markup/2.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:y=\"http://www.yworks.com/xml/graphml\" xmlns:yed=\"http://www.yworks.com/xml/yed/3\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd\">\n  <!--Created by yEd 3.16-->\n  <key attr.name=\"Beschreibung\" attr.type=\"string\" for=\"graph\" id=\"d0\"/>\n  <key for=\"port\" id=\"d1\" yfiles.type=\"portgraphics\"/>\n  <key for=\"port\" id=\"d2\" yfiles.type=\"portgeometry\"/>\n  <key for=\"port\" id=\"d3\" yfiles.type=\"portuserdata\"/>\n  <key attr.name=\"url\" attr.type=\"string\" for=\"node\" id=\"d4\"/>\n  <key attr.name=\"description\" attr.type=\"string\" for=\"node\" id=\"d5\"/>\n  <key for=\"node\" id=\"d6\" yfiles.type=\"nodegraphics\"/>\n  <key for=\"graphml\" id=\"d7\" yfiles.type=\"resources\"/>\n  <key attr.name=\"url\" attr.type=\"string\" for=\"edge\" id=\"d8\"/>\n  <key attr.name=\"description\" attr.type=\"string\" for=\"edge\" id=\"d9\"/>\n  <key for=\"edge\" id=\"d10\" yfiles.type=\"edgegraphics\"/>\n  <graph edgedefault=\"directed\" id=\"G\">\n    <data key=\"d0\"/>\n    <node id=\"n0\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"487.0\" y=\"255.0\"/>\n          <y:Fill color=\"#CCFFCC\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"76.76171875\" x=\"50.119140625\" y=\"5.93359375\">BeeTee.swift<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n1\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"487.0\" y=\"315.0\"/>\n          <y:Fill color=\"#FFCC99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"121.029296875\" x=\"27.9853515625\" y=\"5.93359375\">BluetoothManager.h<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n2\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"664.0\" y=\"315.0\"/>\n          <y:Fill color=\"#FFCC99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"109.099609375\" x=\"33.9501953125\" y=\"5.93359375\">BluetoothDevice.h<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n3\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"487.0\" y=\"285.0\"/>\n          <y:Fill color=\"#FFFF99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"166.5390625\" x=\"5.23046875\" y=\"5.93359375\">BluetoothManagerHandler.h<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n4\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"664.0\" y=\"285.0\"/>\n          <y:Fill color=\"#FFFF99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"154.609375\" x=\"11.1953125\" y=\"5.93359375\">BluetoothDeviceHandler.h<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n5\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"664.0\" y=\"255.0\"/>\n          <y:Fill color=\"#CCFFCC\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"114.947265625\" x=\"31.0263671875\" y=\"5.93359375\">BeeTeeDevice.swift<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n6\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"70.0\" x=\"851.0\" y=\"255.0\"/>\n          <y:Fill color=\"#CCFFCC\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"39.63671875\" x=\"15.181640625\" y=\"5.93359375\">public<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n7\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"70.0\" x=\"851.0\" y=\"285.0\"/>\n          <y:Fill color=\"#FFFF99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"59.880859375\" x=\"5.0595703125\" y=\"5.93359375\">protected<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n8\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"70.0\" x=\"851.0\" y=\"315.0\"/>\n          <y:Fill color=\"#FFCC99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"43.943359375\" x=\"13.0283203125\" y=\"5.93359375\">private<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n9\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"931.0\" y=\"255.0\"/>\n          <y:Fill color=\"#CCFFCC\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"151.087890625\" x=\"12.9560546875\" y=\"5.93359375\">BeeTee framework (Swift)<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n10\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"931.0\" y=\"285.0\"/>\n          <y:Fill color=\"#FFFF99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"124.73828125\" x=\"26.130859375\" y=\"5.93359375\">Objective-C wrapper<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n11\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"931.0\" y=\"315.0\"/>\n          <y:Fill color=\"#FFCC99\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"dotted\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"plain\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"175.9609375\" x=\"0.51953125\" y=\"5.93359375\">BluetoothManager.framework<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n12\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"177.0\" x=\"931.0\" y=\"213.0\"/>\n          <y:Fill hasColor=\"false\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"line\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"bold\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"75.337890625\" x=\"50.8310546875\" y=\"4.0\">Description<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"-0.5\" nodeRatioX=\"0.0\" nodeRatioY=\"-0.5\" offsetX=\"0.0\" offsetY=\"4.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n13\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"70.0\" x=\"851.0\" y=\"213.0\"/>\n          <y:Fill hasColor=\"false\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"line\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"bold\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"32.265625\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"82.228515625\" x=\"-6.1142578125\" y=\"-1.1328125\">Framework\nAccess Level<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n    <node id=\"n14\">\n      <data key=\"d6\">\n        <y:ShapeNode>\n          <y:Geometry height=\"30.0\" width=\"354.0\" x=\"487.0\" y=\"213.0\"/>\n          <y:Fill hasColor=\"false\" transparent=\"false\"/>\n          <y:BorderStyle hasColor=\"false\" raised=\"false\" type=\"line\" width=\"1.0\"/>\n          <y:NodeLabel alignment=\"center\" autoSizePolicy=\"content\" fontFamily=\"Dialog\" fontSize=\"12\" fontStyle=\"bold\" hasBackgroundColor=\"false\" hasLineColor=\"false\" height=\"18.1328125\" horizontalTextPosition=\"center\" iconTextGap=\"4\" modelName=\"custom\" textColor=\"#000000\" verticalTextPosition=\"bottom\" visible=\"true\" width=\"101.27734375\" x=\"126.361328125\" y=\"5.93359375\">Implementation<y:LabelModel>\n              <y:SmartNodeLabelModel distance=\"4.0\"/>\n            </y:LabelModel>\n            <y:ModelParameter>\n              <y:SmartNodeLabelModelParameter labelRatioX=\"0.0\" labelRatioY=\"0.0\" nodeRatioX=\"0.0\" nodeRatioY=\"0.0\" offsetX=\"0.0\" offsetY=\"0.0\" upX=\"0.0\" upY=\"-1.0\"/>\n            </y:ModelParameter>\n          </y:NodeLabel>\n          <y:Shape type=\"rectangle\"/>\n        </y:ShapeNode>\n      </data>\n    </node>\n  </graph>\n  <data key=\"d7\">\n    <y:Resources/>\n  </data>\n</graphml>\n"
  }
]