[
  {
    "path": ".gitignore",
    "content": "## OS X\n.DS_Store\n\n## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n\n## Other\n*.xccheckout\n*.moved-aside\n*.xcuserstate\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n\n## Dependency Managers\nPods/\nCarthage/Build\n\n## AppCode\n.idea/\n"
  },
  {
    "path": ".travis.yml",
    "content": "branches:\n  only:\n    - master\nlanguage: objective-c\nos: osx\nosx_image: xcode8.2\nenv:\n  matrix:\n    - TEST_TYPE=iOS\n    - TEST_TYPE=CocoaPods\n    - TEST_TYPE=Carthage\ninstall:\n- |\n  if [ \"$TEST_TYPE\" = \"iOS\" ]; then\n    gem install xcpretty -N --no-ri --no-rdoc\n    gem update cocoapods\n    pod install\n  elif [ \"$TEST_TYPE\" = Carthage ]; then    \n    brew install carthage || brew upgrade carthage\n  fi\nscript:\n- |\n  if [ \"$TEST_TYPE\" = \"iOS\" ]; then\n    set -o pipefail\n    xcodebuild test -workspace FBKVOController.xcworkspace -scheme FBKVOController -sdk iphonesimulator -destination \"platform=iOS Simulator,OS=latest,name=iPhone 4s\" -destination \"platform=iOS Simulator,OS=latest,name=iPad Air 2\" GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES | xcpretty -c\n  elif [ \"$TEST_TYPE\" = CocoaPods ]; then\n    pod lib lint KVOController.podspec\n    pod lib lint --use-libraries KVOController.podspec\n  elif [ \"$TEST_TYPE\" = Carthage ]; then\n    carthage build --no-skip-current\n  fi\nafter_success:\n- |\n  if [ \"$TEST_TYPE\" = \"iOS\" ]; then\n    bash <(curl -s https://codecov.io/bash)\n  fi\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\nWe want to make contributing to KVOController as easy and transparent as\npossible. If you run into problems, please open an issue. We also actively welcome pull requests.\n\n## Pull Requests\n1. Fork the repo and create your branch from `master`.\n2. If you've added code that should be tested, add tests\n3. If you've changed APIs, update the documentation. \n4. Ensure the test suite passes. \n5. Make sure your code lints. \n6. If you haven't already, complete the Contributor License Agreement (\"CLA\").\n\n## Contributor License Agreement (\"CLA\")\nIn order to accept your pull request, we need you to submit a CLA. You only need\nto do this once to work on any of Facebook's open source projects.\n\nComplete your CLA here: <https://developers.facebook.com/opensource/cla>\n\n## Issues  \nWe use GitHub issues to track public bugs. Please ensure your description is\nclear and has sufficient instructions to be able to reproduce the issue.\n\n## Coding Style  \n* 2 spaces for indentation rather than tabs\n\n## License\nBy contributing to KVOController, you agree that your contributions will be licensed\nunder its BSD license.\n"
  },
  {
    "path": "Examples/Clock-OSX/AppDelegate.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Cocoa/Cocoa.h>\n\n@interface AppDelegate : NSObject <NSApplicationDelegate>\n\n@property (assign) IBOutlet NSWindow *window;\n\n@end\n"
  },
  {
    "path": "Examples/Clock-OSX/AppDelegate.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"AppDelegate.h\"\n#import \"Clock.h\"\n#import \"ClockView.h\"\n\n@interface AppDelegate()\n@end\n\n#define CLOCK_VIEW_MAX_COUNT 10\n#define CLOCK_VIEW_TIME_DELAY 3.0\n\n@implementation AppDelegate\n{\n  NSMutableArray *_clockViews;\n  dispatch_source_t _timer;\n}\n\n- (void)dealloc\n{\n  if (NULL != _timer) {\n    dispatch_source_cancel(_timer);\n  }\n}\n\n- (void)_addClockView\n{\n  if (!_clockViews) {\n    _clockViews = [NSMutableArray array];\n  }\n\n  ClockView *clockView = [[ClockView alloc] initWithClock:[Clock clock]];\n  [_clockViews addObject:clockView];\n  [_window.contentView addSubview:clockView];\n\n  NSSize clockSize = clockView.bounds.size;\n  NSRect contentBounds = [_window.contentView bounds];\n\n  [clockView setFrameOrigin:NSMakePoint(arc4random_uniform(contentBounds.size.width) - (clockSize.width / 2.), arc4random_uniform(contentBounds.size.height) - (clockSize.height / 2.))];\n}\n\n- (void)_removeClockView\n{\n  if (0 == _clockViews.count) {\n    return;\n  }\n\n  [_clockViews[0] removeFromSuperview];\n  [_clockViews removeObjectAtIndex:0];\n}\n\n- (void)_removeAddClockView\n{\n  [self _removeClockView];\n  [self _addClockView];\n}\n\n- (void)_scheduleTimer\n{\n  dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());\n  dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, CLOCK_VIEW_TIME_DELAY * NSEC_PER_SEC), CLOCK_VIEW_TIME_DELAY * NSEC_PER_SEC, 1.0);\n  \n  __weak id weakSelf = self;\n  dispatch_source_set_event_handler(timer, ^{\n    [weakSelf _removeAddClockView];\n  });\n\n  _timer = timer;\n  dispatch_resume(timer);\n}\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification\n{\n  while (_clockViews.count < CLOCK_VIEW_MAX_COUNT) {\n    [self _addClockView];\n  }\n  \n  [self _scheduleTimer];\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-OSX/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"4514\" systemVersion=\"13B3116\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"4514\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"494\" id=\"495\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\"/>\n        <menu title=\"AMainMenu\" systemMenu=\"main\" id=\"29\">\n            <items>\n                <menuItem title=\"Clock-OSX\" id=\"56\">\n                    <menu key=\"submenu\" title=\"Clock-OSX\" systemMenu=\"apple\" id=\"57\">\n                        <items>\n                            <menuItem title=\"About Clock-OSX\" id=\"58\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-2\" id=\"142\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"236\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"129\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"143\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Services\" id=\"131\">\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"130\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"144\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Hide Clock-OSX\" keyEquivalent=\"h\" id=\"134\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"367\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"145\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"368\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"150\">\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"370\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"149\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Quit Clock-OSX\" keyEquivalent=\"q\" id=\"136\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-3\" id=\"449\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"File\" id=\"83\">\n                    <menu key=\"submenu\" title=\"File\" id=\"81\">\n                        <items>\n                            <menuItem title=\"New\" keyEquivalent=\"n\" id=\"82\">\n                                <connections>\n                                    <action selector=\"newDocument:\" target=\"-1\" id=\"373\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"72\">\n                                <connections>\n                                    <action selector=\"openDocument:\" target=\"-1\" id=\"374\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open Recent\" id=\"124\">\n                                <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"125\">\n                                    <items>\n                                        <menuItem title=\"Clear Menu\" id=\"126\">\n                                            <connections>\n                                                <action selector=\"clearRecentDocuments:\" target=\"-1\" id=\"127\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"79\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"73\">\n                                <connections>\n                                    <action selector=\"performClose:\" target=\"-1\" id=\"193\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"75\">\n                                <connections>\n                                    <action selector=\"saveDocument:\" target=\"-1\" id=\"362\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Revert to Saved\" id=\"112\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"revertDocumentToSaved:\" target=\"-1\" id=\"364\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"74\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Page Setup...\" keyEquivalent=\"P\" id=\"77\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"runPageLayout:\" target=\"-1\" id=\"87\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"78\">\n                                <connections>\n                                    <action selector=\"print:\" target=\"-1\" id=\"86\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"217\">\n                    <menu key=\"submenu\" title=\"Edit\" id=\"205\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"207\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"223\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"215\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"231\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"206\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"199\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"228\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"197\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"224\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"203\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"226\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"485\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"486\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"202\">\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"235\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"198\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"232\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"214\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Find\" id=\"218\">\n                                <menu key=\"submenu\" title=\"Find\" id=\"220\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"209\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"241\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"534\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"535\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"208\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"487\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"213\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"488\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"221\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"489\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"210\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"245\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"216\">\n                                <menu key=\"submenu\" title=\"Spelling and Grammar\" id=\"200\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"204\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"230\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"201\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"225\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"453\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"219\">\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"222\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"346\">\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"347\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"454\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"456\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"348\">\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"349\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"457\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"458\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"459\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" tag=\"1\" keyEquivalent=\"f\" id=\"350\">\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"355\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" tag=\"2\" keyEquivalent=\"g\" id=\"351\">\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"356\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"460\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"461\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" tag=\"3\" keyEquivalent=\"G\" id=\"354\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"357\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"462\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"463\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"450\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"451\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"452\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"464\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"465\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"468\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"466\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"467\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"211\">\n                                <menu key=\"submenu\" title=\"Speech\" id=\"212\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"196\">\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"233\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"195\">\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"227\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Format\" id=\"375\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Format\" id=\"376\">\n                        <items>\n                            <menuItem title=\"Font\" id=\"377\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"388\">\n                                    <items>\n                                        <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"389\">\n                                            <connections>\n                                                <action selector=\"orderFrontFontPanel:\" target=\"420\" id=\"424\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"390\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"420\" id=\"421\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"391\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"420\" id=\"422\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"392\">\n                                            <connections>\n                                                <action selector=\"underline:\" target=\"-1\" id=\"432\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"393\"/>\n                                        <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"394\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"420\" id=\"425\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"395\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"420\" id=\"423\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"396\"/>\n                                        <menuItem title=\"Kern\" id=\"397\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Kern\" id=\"415\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"416\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardKerning:\" target=\"-1\" id=\"438\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"417\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffKerning:\" target=\"-1\" id=\"441\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Tighten\" id=\"418\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"tightenKerning:\" target=\"-1\" id=\"431\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Loosen\" id=\"419\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"loosenKerning:\" target=\"-1\" id=\"435\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Ligatures\" id=\"398\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Ligatures\" id=\"411\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"412\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardLigatures:\" target=\"-1\" id=\"439\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"413\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffLigatures:\" target=\"-1\" id=\"440\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use All\" id=\"414\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useAllLigatures:\" target=\"-1\" id=\"434\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Baseline\" id=\"399\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Baseline\" id=\"405\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"406\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"unscript:\" target=\"-1\" id=\"437\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Superscript\" id=\"407\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"superscript:\" target=\"-1\" id=\"430\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Subscript\" id=\"408\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"subscript:\" target=\"-1\" id=\"429\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Raise\" id=\"409\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"raiseBaseline:\" target=\"-1\" id=\"426\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Lower\" id=\"410\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowerBaseline:\" target=\"-1\" id=\"427\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"400\"/>\n                                        <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"401\">\n                                            <connections>\n                                                <action selector=\"orderFrontColorPanel:\" target=\"-1\" id=\"433\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"402\"/>\n                                        <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"403\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyFont:\" target=\"-1\" id=\"428\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"404\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteFont:\" target=\"-1\" id=\"436\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Text\" id=\"496\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Text\" id=\"497\">\n                                    <items>\n                                        <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"498\">\n                                            <connections>\n                                                <action selector=\"alignLeft:\" target=\"-1\" id=\"524\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"499\">\n                                            <connections>\n                                                <action selector=\"alignCenter:\" target=\"-1\" id=\"518\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Justify\" id=\"500\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"alignJustified:\" target=\"-1\" id=\"523\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"501\">\n                                            <connections>\n                                                <action selector=\"alignRight:\" target=\"-1\" id=\"521\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"502\"/>\n                                        <menuItem title=\"Writing Direction\" id=\"503\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Writing Direction\" id=\"508\">\n                                                <items>\n                                                    <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"509\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"510\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionNatural:\" target=\"-1\" id=\"525\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"511\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"-1\" id=\"526\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"512\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"-1\" id=\"527\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"513\"/>\n                                                    <menuItem title=\"Selection\" enabled=\"NO\" id=\"514\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"515\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionNatural:\" target=\"-1\" id=\"528\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"516\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"-1\" id=\"529\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"517\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"-1\" id=\"530\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"504\"/>\n                                        <menuItem title=\"Show Ruler\" id=\"505\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleRuler:\" target=\"-1\" id=\"520\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"506\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyRuler:\" target=\"-1\" id=\"522\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"507\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteRuler:\" target=\"-1\" id=\"519\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"295\">\n                    <menu key=\"submenu\" title=\"View\" id=\"296\">\n                        <items>\n                            <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"297\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleToolbarShown:\" target=\"-1\" id=\"366\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Customize Toolbar…\" id=\"298\">\n                                <connections>\n                                    <action selector=\"runToolbarCustomizationPalette:\" target=\"-1\" id=\"365\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"19\">\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"24\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"23\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"37\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"239\">\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"240\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"92\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                            </menuItem>\n                            <menuItem title=\"Bring All to Front\" id=\"5\">\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"39\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"490\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"491\">\n                        <items>\n                            <menuItem title=\"Clock-OSX Help\" keyEquivalent=\"?\" id=\"492\">\n                                <connections>\n                                    <action selector=\"showHelp:\" target=\"-1\" id=\"493\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n            </items>\n        </menu>\n        <window title=\"Clock-OSX\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"371\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"335\" y=\"390\" width=\"480\" height=\"360\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1440\" height=\"900\"/>\n            <view key=\"contentView\" id=\"372\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"360\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n        <customObject id=\"494\" customClass=\"AppDelegate\">\n            <connections>\n                <outlet property=\"window\" destination=\"371\" id=\"532\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"420\" customClass=\"NSFontManager\"/>\n    </objects>\n</document>"
  },
  {
    "path": "Examples/Clock-OSX/Clock-OSX-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>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.facebook.${PRODUCT_NAME:rfc1034identifier}</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>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>${MACOSX_DEPLOYMENT_TARGET}</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Clock-OSX/Clock-OSX-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#ifdef __OBJC__\n  #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "Examples/Clock-OSX/ClockView.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Cocoa/Cocoa.h>\n\n@class Clock;\n\n@interface ClockView : NSDatePicker\n- (instancetype)initWithClock:(Clock *)clock;\n@end\n"
  },
  {
    "path": "Examples/Clock-OSX/ClockView.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"ClockView.h\"\n#import \"Clock.h\"\n#import \"FBKVOController.h\"\n\n@implementation ClockView\n{\n  FBKVOController *_KVOController;\n}\n\n- (instancetype)initWithFrame:(NSRect)frameRect\n{\n  self = [super initWithFrame:frameRect];\n  if (nil != self) {\n    self.datePickerStyle = NSClockAndCalendarDatePickerStyle;\n    self.datePickerElements = NSHourMinuteSecondDatePickerElementFlag;\n    [self sizeToFit];\n  }\n  return self;\n}\n\n- (instancetype)initWithClock:(Clock *)clock\n{\n  self = [self init];\n  if (nil != self) {\n    // create KVO controller instance\n    _KVOController = [FBKVOController controllerWithObserver:self];\n\n    // handle clock change, including initial value\n    [_KVOController observe:clock keyPath:@\"date\" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew block:^(ClockView *clockView, Clock *clock, NSDictionary *change) {\n\n      // update observer with new value\n      clockView.dateValue = change[NSKeyValueChangeNewKey];\n    }];\n  }\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-OSX/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Clock-OSX/en.lproj/Credits.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1265\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\fnil\\fcharset128 HiraKakuProN-W3;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\vieww9600\\viewh8400\\viewkind0\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\n\\f0\\b\\fs24 \\cf0 Engineering:\n\\b0 \\\n\tKimon Tsinteris\\\n\\\n\n\\b Testing:\n\\b0 \\\n\tKimon Tsinteris\\\n\\\n\n\\b Documentation:\n\\b0 \\\n\tKimon Tsinteris\\\n\\\n\n\\b With special thanks to:\n\\b0 \\\n\t\n\\f1\\fs60 \\uc0\\u9731 \n\\f0\\fs24 \\\n}"
  },
  {
    "path": "Examples/Clock-OSX/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Examples/Clock-OSX/main.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, const char * argv[])\n{\n  return NSApplicationMain(argc, argv);\n}\n"
  },
  {
    "path": "Examples/Clock-iOS/AppDelegate.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/AppDelegate.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"AppDelegate.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/Base.lproj/Main_iPad.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10112\" systemVersion=\"15D21\" targetRuntime=\"iOS.CocoaTouch.iPad\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10083\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Udy-qk-fWK\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"IVD-gd-LhQ\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"768\" height=\"1024\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <nil key=\"simulatedStatusBarMetrics\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\" statusBarStyle=\"blackOpaque\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\"/>\n    </simulatedMetricsContainer>\n</document>\n"
  },
  {
    "path": "Examples/Clock-iOS/Base.lproj/Main_iPhone.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10112\" systemVersion=\"15D21\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"vXZ-lx-hvc\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10083\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"ufC-wZ-h7g\">\n            <objects>\n                <viewController id=\"vXZ-lx-hvc\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Zp7-iv-QNL\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"Rd3-tm-V1t\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"kh9-bI-dsS\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <nil key=\"simulatedStatusBarMetrics\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"x5A-6p-PRh\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Examples/Clock-iOS/Clock-iOS-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>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.facebook.${PRODUCT_NAME:rfc1034identifier}</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>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main_iPhone</string>\n\t<key>UIMainStoryboardFile~ipad</key>\n\t<string>Main_iPad</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\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIStatusBarHidden</key>\n\t<true/>\n\t<key>UIStatusBarStyle</key>\n\t<string></string>\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": "Examples/Clock-iOS/Clock-iOS-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_5_0\n#warning \"This project uses features only available in iOS SDK 5.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n  #import <UIKit/UIKit.h>\n  #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "Examples/Clock-iOS/Clock.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Foundation/Foundation.h>\n\n@interface Clock : NSObject\n\n/// The shared clock instance.\n+ (instancetype)clock;\n\n/// The curent date and time. Observable.\n@property (strong, readonly, nonatomic) NSDate *date;\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/Clock.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"Clock.h\"\n\n@interface Clock ()\n@property (strong, readwrite, nonatomic) NSDate *date;\n@end\n\n@implementation Clock\n{\n  dispatch_source_t _timer;\n}\n\n+ (instancetype)clock\n{\n  static Clock *_clock = nil;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    _clock = [[Clock alloc] init];\n  });\n  return _clock;\n}\n\n- (id)init\n{\n  self = [super init];\n  if (self) {\n    [self _updateDate];\n\n    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());\n    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.0);\n\n    __weak Clock *weakSelf = self;\n    dispatch_source_set_event_handler(timer, ^{\n      [weakSelf _updateDate];\n    });\n\n    _timer = timer;\n    dispatch_resume(timer);\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  if (NULL != _timer) {\n    dispatch_source_cancel(_timer);\n  }\n}\n\n- (void)_updateDate\n{\n  self.date = [NSDate date];\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/ClockLayer.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <QuartzCore/QuartzCore.h>\n\n@interface ClockLayer : CALayer\n\n+ (NSDictionary *)darkStyle;\n\n+ (NSDictionary *)lightStyle;\n\n@property (strong, nonatomic) NSDate *date;\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/ClockLayer.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"ClockLayer.h\"\n#import <CoreText/CoreText.h>\n\n// number layer attributes\n#define NUMBER_LAYER_COUNT 12\n#define NUMBER_FONT_NAME @\"HelveticaNeue\"\n#define NUMBER_FONT_SIZE 16.0\n\n// normalized hand length, ratio of clock radius\n#define SECOND_HAND_LENGTH 0.57\n#define MINUTE_HAND_LENGTH 0.65\n#define HOUR_HAND_LENGTH 0.5\n\n@interface ElipseLayer : CAShapeLayer\n@end\n\n@implementation ElipseLayer\n\n- (void)setBounds:(CGRect)bounds\n{\n  if (!CGRectEqualToRect(self.bounds, bounds)) {\n    super.bounds = bounds;\n    if (CGRectEqualToRect(CGRectZero, bounds)) {\n      self.path = NULL;\n    } else {\n      CGMutablePathRef path = CGPathCreateMutable();\n      CGPathAddEllipseInRect(path, nil, bounds);\n      self.path = path;\n      CGPathRelease(path);\n    }\n  }\n}\n\n@end\n\nstatic CALayer *hand_layer(CGFloat contentsScale)\n{\n  CALayer *layer = [CALayer layer];\n  layer.contentsScale = contentsScale;\n  layer.shouldRasterize = YES;\n  return layer;\n}\n\nstatic ElipseLayer *elipse_layer(CGFloat contentsScale)\n{\n  ElipseLayer *layer = [ElipseLayer layer];\n  layer.contentsScale = contentsScale;\n  layer.shouldRasterize = YES;\n  return layer;\n}\n\nstatic CATextLayer *number_layer(CGFloat contentsScale, CTFontRef font, NSUInteger number)\n{\n  CATextLayer *layer = [CATextLayer layer];\n  layer.string = [NSString stringWithFormat:@\"%lu\", (unsigned long)number];\n  layer.alignmentMode = kCAAlignmentCenter;\n  layer.fontSize = NUMBER_FONT_SIZE;\n  layer.font = font;\n  layer.contentsScale = contentsScale;\n  return layer;\n}\n\n// clock style keys\nstatic NSString * const kClockBackgroundColorKey = @\"clockBackgroundColor\";\nstatic NSString * const kClockForegroundColorKey = @\"clockForegroundColor\";\nstatic NSString * const kClockAccentColorKey = @\"clockAccentColor\";\n\n// clock style properties\n@interface ClockLayer ()\n@property (readonly) UIColor *clockBackgroundColor;\n@property (readonly) UIColor *clockForegroundColor;\n@property (readonly) UIColor *clockAccentColor;\n@end\n\n@implementation ClockLayer\n{\n  ElipseLayer *_faceLayer;\n  ElipseLayer *_largeDotLayer;\n  ElipseLayer *_smallDotLayer;\n  CALayer *_secondHandLayer;\n  CALayer *_minuteHandLayer;\n  CALayer *_hourHandLayer;\n  NSArray *_numberLayers;\n  CGFloat _radius;\n  BOOL _needsFullLayout;\n}\n\n#pragma mark - Class\n\n// dark style definition\n+ (NSDictionary *)darkStyle\n{\n  return @{kClockBackgroundColorKey: [UIColor blackColor],\n           kClockForegroundColorKey: [UIColor whiteColor],\n           kClockAccentColorKey: [UIColor redColor]};\n}\n\n// light style definition\n+ (NSDictionary *)lightStyle\n{\n  return @{kClockBackgroundColorKey: [UIColor whiteColor],\n           kClockForegroundColorKey: [UIColor blackColor],\n           kClockAccentColorKey: [UIColor redColor]};\n}\n\n// default style definition\n+ (id)defaultValueForKey:(NSString *)key\n{\n  id value = [self darkStyle][key];\n  if (nil != value) {\n    return value;\n  }\n  return [super defaultValueForKey:key];\n}\n\n#pragma mark - Lifecycle\n\n- (id)init\n{\n  self = [super init];\n  if (self) {\n    // default contents scale\n    CGFloat contentsScale = [UIScreen mainScreen].scale;\n    \n    // elipse layers\n    _faceLayer = elipse_layer(contentsScale);\n    _largeDotLayer = elipse_layer(contentsScale);\n    _smallDotLayer = elipse_layer(contentsScale);\n    \n    // number layers\n    CTFontRef font = CTFontCreateWithName((CFStringRef)NUMBER_FONT_NAME, NUMBER_FONT_SIZE, NULL);\n    NSMutableArray *numberLayers = [NSMutableArray arrayWithCapacity:NUMBER_LAYER_COUNT];\n    for (NSUInteger i=1; i <= NUMBER_LAYER_COUNT; ++i) {\n      [numberLayers addObject:number_layer(contentsScale, font, i)];\n    }\n    _numberLayers = numberLayers;\n    \n    // hand layers\n    _hourHandLayer = hand_layer(contentsScale);\n    _minuteHandLayer = hand_layer(contentsScale);\n    _secondHandLayer = hand_layer(contentsScale);\n    \n    // update sublayers\n    NSMutableArray *sublayers = [NSMutableArray arrayWithObjects:_faceLayer, nil];\n    [sublayers addObjectsFromArray:_numberLayers];\n    [sublayers addObjectsFromArray:@[_largeDotLayer, _minuteHandLayer, _hourHandLayer, _secondHandLayer, _smallDotLayer]];\n    self.sublayers = sublayers;\n    \n    if (NULL != font) {\n      CFRelease(font);\n    }\n  }\n  return self;\n}\n\n#pragma mark - Properties\n\n@dynamic clockBackgroundColor;\n@dynamic clockForegroundColor;\n@dynamic clockAccentColor;\n\n- (void)setStyle:(NSDictionary *)style\n{\n  super.style = style;\n  [self _updatedStyle];\n}\n\n- (void)setBounds:(CGRect)bounds\n{\n  if (!CGRectEqualToRect(bounds, self.bounds)) {\n    _radius = MIN(CGRectGetWidth(bounds), CGRectGetHeight(bounds)) / 2.;\n    _needsFullLayout = YES;\n    super.bounds = bounds;\n  }\n}\n\n- (void)setDate:(NSDate *)date\n{\n  if (_date != date && ![_date isEqualToDate:date]) {\n    _date = date;\n    [self setNeedsLayout];\n  }\n}\n\n#pragma mark - Utilities\n\n- (void)_updatedStyle\n{\n  CGColorRef backgroundColor = self.clockBackgroundColor.CGColor;\n  CGColorRef foregroundColor = self.clockForegroundColor.CGColor;\n  CGColorRef accentColor = self.clockAccentColor.CGColor;\n  \n  _faceLayer.fillColor = backgroundColor;\n  _largeDotLayer.fillColor = foregroundColor;\n  _smallDotLayer.fillColor = accentColor;\n\n  [_numberLayers enumerateObjectsUsingBlock:^(CATextLayer *numberLayer, NSUInteger idx, BOOL *stop) {\n    numberLayer.foregroundColor = foregroundColor;\n  }];\n  \n  _hourHandLayer.backgroundColor = foregroundColor;\n  _minuteHandLayer.backgroundColor = foregroundColor;\n  _secondHandLayer.backgroundColor = accentColor;\n}\n\n- (void)_rotateHandLayers\n{\n  NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:_date];\n  NSInteger minutesIntoDay = dateComponents.hour * 60 + dateComponents.minute;\n  CGFloat percentMinutesIntoDay = (CGFloat)minutesIntoDay / (12.0 * 60.0);\n  CGFloat percentMinutesIntoHour = (CGFloat)dateComponents.minute / 60.0;\n  CGFloat percentSecondsIntoMinute = (CGFloat)dateComponents.second / 60.0;\n  \n  // XXX set fixed time\n  //  percentMinutesIntoDay = (10 * 60 + 12) / (12 * 60.);\n  //  percentMinutesIntoHour = 12.0 / 60.0;\n  //  percentSecondsIntoMinute = 47.0 / 60.0;\n  \n  _secondHandLayer.transform = CATransform3DMakeRotation(M_PI * 2 * percentSecondsIntoMinute, 0, 0, 1);\n  _hourHandLayer.transform = CATransform3DMakeRotation(M_PI * 2 * percentMinutesIntoDay, 0, 0, 1);\n  _minuteHandLayer.transform = CATransform3DMakeRotation(M_PI * 2 * percentMinutesIntoHour, 0, 0, 1);\n}\n\n- (void)_layoutElipseLayers\n{\n  CGRect bounds = self.bounds;\n  CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));\n  \n  _faceLayer.bounds = bounds;\n  _faceLayer.position = center;\n\n  _smallDotLayer.bounds = CGRectMake(0, 0, 3.0, 3.0);\n  _smallDotLayer.position = center;\n  \n  _largeDotLayer.bounds = CGRectMake(0, 0, 9.0, 9.0);\n  _largeDotLayer.position = center;\n}\n\n- (void)_layoutNumberLayers\n{\n  // XXX document\n  CGRect bounds = self.bounds;\n  CGPoint p = CGPointMake(0, _radius - 14);\n  CGFloat tickAngle = 2 * M_PI / NUMBER_LAYER_COUNT;\n  \n  [_numberLayers enumerateObjectsUsingBlock:^(CALayer *numberLayer, NSUInteger idx, BOOL *stop) {\n    CGAffineTransform t = CGAffineTransformMakeRotation(7 * tickAngle + idx * tickAngle);\n    CGPoint pp = CGPointApplyAffineTransform(p, t);\n    pp.x += bounds.size.width / 2;\n    pp.y += bounds.size.height / 2;\n    numberLayer.position = pp;\n    numberLayer.bounds = CGRectMake(0.0, 0.0, 18.0, 18.0);\n  }];\n}\n\n- (void)_layoutHandLayers\n{\n  CGRect bounds = self.bounds;\n  CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));\n  \n  _secondHandLayer.bounds = CGRectMake(0, 0, 1.0, SECOND_HAND_LENGTH * _radius);\n  _secondHandLayer.anchorPoint = CGPointMake(0.5, 1);\n  _secondHandLayer.position = center;\n  \n  _minuteHandLayer.bounds = CGRectMake(0, 0, 2.0, MINUTE_HAND_LENGTH * _radius);\n  _minuteHandLayer.anchorPoint = CGPointMake(0.5, 1);\n  _minuteHandLayer.position = center;\n  _minuteHandLayer.cornerRadius = 1.5;\n  \n  _hourHandLayer.bounds = CGRectMake(0, 0, 3.0, HOUR_HAND_LENGTH * _radius);\n  _hourHandLayer.anchorPoint = CGPointMake(0.5, 1);\n  _hourHandLayer.position = center;\n  _hourHandLayer.cornerRadius = 1.5;\n  \n  [self _rotateHandLayers];\n}\n\n#pragma mark - Overides\n\n- (void)layoutSublayers\n{\n  if (!_needsFullLayout) {\n    [self _rotateHandLayers];\n  } else {\n    [self _layoutElipseLayers];\n    [self _layoutNumberLayers];\n    [self _layoutHandLayers];\n    _needsFullLayout = NO;\n  }\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/ClockView.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <UIKit/UIKit.h>\n\n@class Clock;\n\nenum\n{\n  kClockViewStyleLight,\n  kClockViewStyleDark,\n};\ntypedef NSUInteger ClockViewStyle;\n\n@interface ClockView : UIView\n\n- (instancetype)initWithClock:(Clock *)clock style:(ClockViewStyle)style;\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/ClockView.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"ClockView.h\"\n#import \"ClockLayer.h\"\n#import <FBKVOController/FBKVOController.h>\n\n#define CLOCK_LAYER(VIEW) ((ClockLayer *)VIEW.layer)\n\nstatic NSDictionary *layer_style(ClockViewStyle viewStyle)\n{\n  NSDictionary *dict = nil;\n  switch (viewStyle) {\n    case kClockViewStyleLight:\n      dict = [ClockLayer lightStyle];\n      break;\n    case kClockViewStyleDark:\n      dict = [ClockLayer darkStyle];\n      break;\n    default:\n      break;\n  }\n  return dict;\n}\n\n@implementation ClockView\n{\n  FBKVOController *_KVOController;\n}\n\n+ (Class)layerClass\n{\n  return [ClockLayer class];\n}\n\n- (instancetype)initWithClock:(Clock *)clock style:(ClockViewStyle)style\n{\n  self = [super init];\n  if (nil != self) {\n    CLOCK_LAYER(self).style = layer_style(style);\n    \n    // create KVO controller instance\n    _KVOController = [FBKVOController controllerWithObserver:self];\n    \n    // handle clock change, including initial value\n    [_KVOController observe:clock keyPath:@\"date\" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew block:^(ClockView *clockView, Clock *clock, NSDictionary *change) {\n      \n      // update observer with new value\n      CLOCK_LAYER(clockView).date = change[NSKeyValueChangeNewKey];\n    }];\n  }\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\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  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Clock-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Clock-iOS/ViewController.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface ViewController : UIViewController\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/ViewController.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"ViewController.h\"\n#import \"Clock.h\"\n#import \"ClockView.h\"\n\n#define CLOCK_VIEW_MAX_COUNT 10\n#define CLOCK_VIEW_TIME_DELAY 3.0\n#define RANDOM_ENABLED 1\n\n@interface ViewController ()\n\n@end\n\n@implementation ViewController\n{\n  NSMutableArray *_clockViews;\n  dispatch_source_t _timer;\n}\n\n- (void)dealloc\n{\n  if (NULL != _timer) {\n    dispatch_source_cancel(_timer);\n  }\n}\n\n- (BOOL)prefersStatusBarHidden\n{\n  return YES;\n}\n\n- (void)_addClockView\n{\n  if (!_clockViews) {\n    _clockViews = [NSMutableArray array];\n  }\n  \n  ClockView *clockView = [[ClockView alloc] initWithClock:[Clock clock] style:arc4random_uniform(kClockViewStyleDark+1)];\n  [_clockViews addObject:clockView];\n  [self.view addSubview:clockView];\n\n  clockView.bounds = CGRectMake(0, 0, 132, 132);\n\n  CGRect contentBounds = self.view.bounds;\n#if RANDOM_ENABLED\n  clockView.center = CGPointMake(arc4random_uniform(contentBounds.size.width), arc4random_uniform(contentBounds.size.height));\n#else\n  clockView.center = CGPointMake(contentBounds.size.width / 2., contentBounds.size.height / 2.);\n#endif\n}\n\n- (void)_removeClockView\n{\n  if (0 == _clockViews.count) {\n    return;\n  }\n\n  [_clockViews[0] removeFromSuperview];\n  [_clockViews removeObjectAtIndex:0];\n}\n\n- (void)_removeAddClockView\n{\n  [self _removeClockView];\n  [self _addClockView];\n}\n\n- (void)_scheduleTimer\n{\n  dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());\n  dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, CLOCK_VIEW_TIME_DELAY * NSEC_PER_SEC), CLOCK_VIEW_TIME_DELAY * NSEC_PER_SEC, 1.0);\n  \n  __weak id weakSelf = self;\n  dispatch_source_set_event_handler(timer, ^{\n    [weakSelf _removeAddClockView];\n  });\n  \n  _timer = timer;\n#if RANDOM_ENABLED\n  dispatch_resume(timer);\n#endif\n}\n\n- (void)viewDidLoad\n{\n  [super viewDidLoad];\n  self.view.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0];\n\n  while (_clockViews.count < CLOCK_VIEW_MAX_COUNT) {\n    [self _addClockView];\n  }\n\n  [self _scheduleTimer];\n}\n\n@end\n"
  },
  {
    "path": "Examples/Clock-iOS/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Examples/Clock-iOS/main.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n  @autoreleasepool {\n      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "Examples/Examples.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\tEC45CACE18ADC7CE0063DD11 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC45CACD18ADC7CE0063DD11 /* Foundation.framework */; };\n\t\tEC45CAD018ADC7CE0063DD11 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC45CACF18ADC7CE0063DD11 /* CoreGraphics.framework */; };\n\t\tEC45CAD218ADC7CE0063DD11 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC45CAD118ADC7CE0063DD11 /* UIKit.framework */; };\n\t\tEC45CAD818ADC7CE0063DD11 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EC45CAD618ADC7CE0063DD11 /* InfoPlist.strings */; };\n\t\tEC45CADA18ADC7CE0063DD11 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CAD918ADC7CE0063DD11 /* main.m */; };\n\t\tEC45CADE18ADC7CE0063DD11 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CADD18ADC7CE0063DD11 /* AppDelegate.m */; };\n\t\tEC45CAE118ADC7CE0063DD11 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EC45CADF18ADC7CE0063DD11 /* Main_iPhone.storyboard */; };\n\t\tEC45CAE418ADC7CE0063DD11 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EC45CAE218ADC7CE0063DD11 /* Main_iPad.storyboard */; };\n\t\tEC45CAE718ADC7CE0063DD11 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CAE618ADC7CE0063DD11 /* ViewController.m */; };\n\t\tEC45CAE918ADC7CE0063DD11 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC45CAE818ADC7CE0063DD11 /* Images.xcassets */; };\n\t\tEC45CB0418ADC7E80063DD11 /* libFBKVOController.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EC45CB0318ADC7E80063DD11 /* libFBKVOController.a */; };\n\t\tEC45CB7718ADD0B80063DD11 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC45CB0A18ADC8570063DD11 /* Cocoa.framework */; };\n\t\tEC45CB7D18ADD0B80063DD11 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EC45CB7B18ADD0B80063DD11 /* InfoPlist.strings */; };\n\t\tEC45CB7F18ADD0B80063DD11 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CB7E18ADD0B80063DD11 /* main.m */; };\n\t\tEC45CB8318ADD0B80063DD11 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = EC45CB8118ADD0B80063DD11 /* Credits.rtf */; };\n\t\tEC45CB8618ADD0B80063DD11 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CB8518ADD0B80063DD11 /* AppDelegate.m */; };\n\t\tEC45CB8918ADD0B80063DD11 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = EC45CB8718ADD0B80063DD11 /* MainMenu.xib */; };\n\t\tEC45CB8B18ADD0B80063DD11 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC45CB8A18ADD0B80063DD11 /* Images.xcassets */; };\n\t\tEC45CBA518ADD0F60063DD11 /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CBA418ADD0F60063DD11 /* FBKVOController.m */; };\n\t\tEC45CBA918ADD1A00063DD11 /* Clock.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CBA818ADD1A00063DD11 /* Clock.m */; };\n\t\tEC45CBAA18ADD6BB0063DD11 /* Clock.m in Sources */ = {isa = PBXBuildFile; fileRef = EC45CBA818ADD1A00063DD11 /* Clock.m */; };\n\t\tECC5760818ADDE4E00C2BFB8 /* ClockView.m in Sources */ = {isa = PBXBuildFile; fileRef = ECC5760718ADDE4E00C2BFB8 /* ClockView.m */; };\n\t\tECC5761818ADF2F100C2BFB8 /* ClockView.m in Sources */ = {isa = PBXBuildFile; fileRef = ECC5761718ADF2F100C2BFB8 /* ClockView.m */; };\n\t\tECC5761B18ADF76500C2BFB8 /* ClockLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = ECC5761A18ADF76500C2BFB8 /* ClockLayer.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tEC45CACA18ADC7CE0063DD11 /* Clock-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Clock-iOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEC45CACD18ADC7CE0063DD11 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tEC45CACF18ADC7CE0063DD11 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\tEC45CAD118ADC7CE0063DD11 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEC45CAD518ADC7CE0063DD11 /* Clock-iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Clock-iOS-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tEC45CAD718ADC7CE0063DD11 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tEC45CAD918ADC7CE0063DD11 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\tEC45CADB18ADC7CE0063DD11 /* Clock-iOS-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Clock-iOS-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tEC45CADC18ADC7CE0063DD11 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\tEC45CADD18ADC7CE0063DD11 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\tEC45CAE018ADC7CE0063DD11 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = \"<group>\"; };\n\t\tEC45CAE318ADC7CE0063DD11 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPad.storyboard; sourceTree = \"<group>\"; };\n\t\tEC45CAE518ADC7CE0063DD11 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = \"<group>\"; };\n\t\tEC45CAE618ADC7CE0063DD11 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = \"<group>\"; };\n\t\tEC45CAE818ADC7CE0063DD11 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\tEC45CAEF18ADC7CE0063DD11 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEC45CB0318ADC7E80063DD11 /* libFBKVOController.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libFBKVOController.a; path = \"../../../Library/Developer/Xcode/DerivedData/FBKVOController-amnevtoymcgzwwazjmzbwvbeduoi/Build/Products/Debug-iphoneos/libFBKVOController.a\"; sourceTree = \"<group>\"; };\n\t\tEC45CB0A18ADC8570063DD11 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\tEC45CB0D18ADC8570063DD11 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\tEC45CB0E18ADC8570063DD11 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\tEC45CB0F18ADC8570063DD11 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tEC45CB7618ADD0B80063DD11 /* Clock-OSX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Clock-OSX.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEC45CB7A18ADD0B80063DD11 /* Clock-OSX-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Clock-OSX-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tEC45CB7C18ADD0B80063DD11 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tEC45CB7E18ADD0B80063DD11 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\tEC45CB8018ADD0B80063DD11 /* Clock-OSX-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Clock-OSX-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tEC45CB8218ADD0B80063DD11 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = \"<group>\"; };\n\t\tEC45CB8418ADD0B80063DD11 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\tEC45CB8518ADD0B80063DD11 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\tEC45CB8818ADD0B80063DD11 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\tEC45CB8A18ADD0B80063DD11 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\tEC45CBA318ADD0F60063DD11 /* FBKVOController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FBKVOController.h; path = ../../FBKVOController/FBKVOController.h; sourceTree = \"<group>\"; };\n\t\tEC45CBA418ADD0F60063DD11 /* FBKVOController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FBKVOController.m; path = ../../FBKVOController/FBKVOController.m; sourceTree = \"<group>\"; };\n\t\tEC45CBA718ADD1A00063DD11 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Clock.h; path = \"Clock-iOS/Clock.h\"; sourceTree = \"<group>\"; };\n\t\tEC45CBA818ADD1A00063DD11 /* Clock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Clock.m; path = \"Clock-iOS/Clock.m\"; sourceTree = \"<group>\"; };\n\t\tECC5760618ADDE4E00C2BFB8 /* ClockView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClockView.h; sourceTree = \"<group>\"; };\n\t\tECC5760718ADDE4E00C2BFB8 /* ClockView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ClockView.m; sourceTree = \"<group>\"; };\n\t\tECC5761618ADF2F100C2BFB8 /* ClockView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClockView.h; sourceTree = \"<group>\"; };\n\t\tECC5761718ADF2F100C2BFB8 /* ClockView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ClockView.m; sourceTree = \"<group>\"; };\n\t\tECC5761918ADF76500C2BFB8 /* ClockLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClockLayer.h; sourceTree = \"<group>\"; };\n\t\tECC5761A18ADF76500C2BFB8 /* ClockLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ClockLayer.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tEC45CAC718ADC7CE0063DD11 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEC45CB0418ADC7E80063DD11 /* libFBKVOController.a in Frameworks */,\n\t\t\t\tEC45CAD018ADC7CE0063DD11 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tEC45CAD218ADC7CE0063DD11 /* UIKit.framework in Frameworks */,\n\t\t\t\tEC45CACE18ADC7CE0063DD11 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEC45CB7318ADD0B80063DD11 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEC45CB7718ADD0B80063DD11 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tEC45CABF18ADC7920063DD11 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tECC5761518ADEDFC00C2BFB8 /* Clock */,\n\t\t\t\tEC45CACC18ADC7CE0063DD11 /* Frameworks */,\n\t\t\t\tEC45CACB18ADC7CE0063DD11 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CACB18ADC7CE0063DD11 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CACA18ADC7CE0063DD11 /* Clock-iOS.app */,\n\t\t\t\tEC45CB7618ADD0B80063DD11 /* Clock-OSX.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CACC18ADC7CE0063DD11 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB0318ADC7E80063DD11 /* libFBKVOController.a */,\n\t\t\t\tEC45CACD18ADC7CE0063DD11 /* Foundation.framework */,\n\t\t\t\tEC45CACF18ADC7CE0063DD11 /* CoreGraphics.framework */,\n\t\t\t\tEC45CAD118ADC7CE0063DD11 /* UIKit.framework */,\n\t\t\t\tEC45CAEF18ADC7CE0063DD11 /* XCTest.framework */,\n\t\t\t\tEC45CB0A18ADC8570063DD11 /* Cocoa.framework */,\n\t\t\t\tEC45CB0C18ADC8570063DD11 /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CAD318ADC7CE0063DD11 /* Clock-iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CADC18ADC7CE0063DD11 /* AppDelegate.h */,\n\t\t\t\tEC45CADD18ADC7CE0063DD11 /* AppDelegate.m */,\n\t\t\t\tEC45CADF18ADC7CE0063DD11 /* Main_iPhone.storyboard */,\n\t\t\t\tEC45CAE218ADC7CE0063DD11 /* Main_iPad.storyboard */,\n\t\t\t\tEC45CAE518ADC7CE0063DD11 /* ViewController.h */,\n\t\t\t\tEC45CAE618ADC7CE0063DD11 /* ViewController.m */,\n\t\t\t\tECC5761618ADF2F100C2BFB8 /* ClockView.h */,\n\t\t\t\tECC5761718ADF2F100C2BFB8 /* ClockView.m */,\n\t\t\t\tECC5761918ADF76500C2BFB8 /* ClockLayer.h */,\n\t\t\t\tECC5761A18ADF76500C2BFB8 /* ClockLayer.m */,\n\t\t\t\tEC45CAE818ADC7CE0063DD11 /* Images.xcassets */,\n\t\t\t\tEC45CAD418ADC7CE0063DD11 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"Clock-iOS\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CAD418ADC7CE0063DD11 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CAD518ADC7CE0063DD11 /* Clock-iOS-Info.plist */,\n\t\t\t\tEC45CAD618ADC7CE0063DD11 /* InfoPlist.strings */,\n\t\t\t\tEC45CAD918ADC7CE0063DD11 /* main.m */,\n\t\t\t\tEC45CADB18ADC7CE0063DD11 /* Clock-iOS-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB0C18ADC8570063DD11 /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB0D18ADC8570063DD11 /* AppKit.framework */,\n\t\t\t\tEC45CB0E18ADC8570063DD11 /* CoreData.framework */,\n\t\t\t\tEC45CB0F18ADC8570063DD11 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB7818ADD0B80063DD11 /* Clock-OSX */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB8418ADD0B80063DD11 /* AppDelegate.h */,\n\t\t\t\tEC45CB8518ADD0B80063DD11 /* AppDelegate.m */,\n\t\t\t\tECC5760618ADDE4E00C2BFB8 /* ClockView.h */,\n\t\t\t\tECC5760718ADDE4E00C2BFB8 /* ClockView.m */,\n\t\t\t\tEC45CBA318ADD0F60063DD11 /* FBKVOController.h */,\n\t\t\t\tEC45CBA418ADD0F60063DD11 /* FBKVOController.m */,\n\t\t\t\tEC45CB8718ADD0B80063DD11 /* MainMenu.xib */,\n\t\t\t\tEC45CB8A18ADD0B80063DD11 /* Images.xcassets */,\n\t\t\t\tEC45CB7918ADD0B80063DD11 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"Clock-OSX\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB7918ADD0B80063DD11 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB7A18ADD0B80063DD11 /* Clock-OSX-Info.plist */,\n\t\t\t\tEC45CB7B18ADD0B80063DD11 /* InfoPlist.strings */,\n\t\t\t\tEC45CB7E18ADD0B80063DD11 /* main.m */,\n\t\t\t\tEC45CB8018ADD0B80063DD11 /* Clock-OSX-Prefix.pch */,\n\t\t\t\tEC45CB8118ADD0B80063DD11 /* Credits.rtf */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECC5761518ADEDFC00C2BFB8 /* Clock */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CBA718ADD1A00063DD11 /* Clock.h */,\n\t\t\t\tEC45CBA818ADD1A00063DD11 /* Clock.m */,\n\t\t\t\tEC45CAD318ADC7CE0063DD11 /* Clock-iOS */,\n\t\t\t\tEC45CB7818ADD0B80063DD11 /* Clock-OSX */,\n\t\t\t);\n\t\t\tname = Clock;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tEC45CAC918ADC7CE0063DD11 /* Clock-iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = EC45CAFD18ADC7CE0063DD11 /* Build configuration list for PBXNativeTarget \"Clock-iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEC45CAC618ADC7CE0063DD11 /* Sources */,\n\t\t\t\tEC45CAC718ADC7CE0063DD11 /* Frameworks */,\n\t\t\t\tEC45CAC818ADC7CE0063DD11 /* 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 = \"Clock-iOS\";\n\t\t\tproductName = \"Clock-iOS\";\n\t\t\tproductReference = EC45CACA18ADC7CE0063DD11 /* Clock-iOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tEC45CB7518ADD0B80063DD11 /* Clock-OSX */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = EC45CB9D18ADD0B80063DD11 /* Build configuration list for PBXNativeTarget \"Clock-OSX\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEC45CB7218ADD0B80063DD11 /* Sources */,\n\t\t\t\tEC45CB7318ADD0B80063DD11 /* Frameworks */,\n\t\t\t\tEC45CB7418ADD0B80063DD11 /* 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 = \"Clock-OSX\";\n\t\t\tproductName = \"Clock-OSX\";\n\t\t\tproductReference = EC45CB7618ADD0B80063DD11 /* Clock-OSX.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tEC45CAC018ADC7920063DD11 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0730;\n\t\t\t};\n\t\t\tbuildConfigurationList = EC45CAC318ADC7920063DD11 /* Build configuration list for PBXProject \"Examples\" */;\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 = EC45CABF18ADC7920063DD11;\n\t\t\tproductRefGroup = EC45CACB18ADC7CE0063DD11 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tEC45CAC918ADC7CE0063DD11 /* Clock-iOS */,\n\t\t\t\tEC45CB7518ADD0B80063DD11 /* Clock-OSX */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tEC45CAC818ADC7CE0063DD11 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEC45CAE418ADC7CE0063DD11 /* Main_iPad.storyboard in Resources */,\n\t\t\t\tEC45CAE918ADC7CE0063DD11 /* Images.xcassets in Resources */,\n\t\t\t\tEC45CAE118ADC7CE0063DD11 /* Main_iPhone.storyboard in Resources */,\n\t\t\t\tEC45CAD818ADC7CE0063DD11 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEC45CB7418ADD0B80063DD11 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEC45CB7D18ADD0B80063DD11 /* InfoPlist.strings in Resources */,\n\t\t\t\tEC45CB8B18ADD0B80063DD11 /* Images.xcassets in Resources */,\n\t\t\t\tEC45CB8318ADD0B80063DD11 /* Credits.rtf in Resources */,\n\t\t\t\tEC45CB8918ADD0B80063DD11 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tEC45CAC618ADC7CE0063DD11 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tECC5761B18ADF76500C2BFB8 /* ClockLayer.m in Sources */,\n\t\t\t\tEC45CAE718ADC7CE0063DD11 /* ViewController.m in Sources */,\n\t\t\t\tECC5761818ADF2F100C2BFB8 /* ClockView.m in Sources */,\n\t\t\t\tEC45CADE18ADC7CE0063DD11 /* AppDelegate.m in Sources */,\n\t\t\t\tEC45CBA918ADD1A00063DD11 /* Clock.m in Sources */,\n\t\t\t\tEC45CADA18ADC7CE0063DD11 /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEC45CB7218ADD0B80063DD11 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEC45CB8618ADD0B80063DD11 /* AppDelegate.m in Sources */,\n\t\t\t\tECC5760818ADDE4E00C2BFB8 /* ClockView.m in Sources */,\n\t\t\t\tEC45CBA518ADD0F60063DD11 /* FBKVOController.m in Sources */,\n\t\t\t\tEC45CBAA18ADD6BB0063DD11 /* Clock.m in Sources */,\n\t\t\t\tEC45CB7F18ADD0B80063DD11 /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\tEC45CAD618ADC7CE0063DD11 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CAD718ADC7CE0063DD11 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CADF18ADC7CE0063DD11 /* Main_iPhone.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CAE018ADC7CE0063DD11 /* Base */,\n\t\t\t);\n\t\t\tname = Main_iPhone.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CAE218ADC7CE0063DD11 /* Main_iPad.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CAE318ADC7CE0063DD11 /* Base */,\n\t\t\t);\n\t\t\tname = Main_iPad.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB7B18ADD0B80063DD11 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB7C18ADD0B80063DD11 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB8118ADD0B80063DD11 /* Credits.rtf */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB8218ADD0B80063DD11 /* en */,\n\t\t\t);\n\t\t\tname = Credits.rtf;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC45CB8718ADD0B80063DD11 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEC45CB8818ADD0B80063DD11 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tEC45CAC418ADC7920063DD11 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEC45CAC518ADC7920063DD11 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEC45CAFE18ADC7CE0063DD11 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = 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__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\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Clock-iOS/Clock-iOS-Prefix.pch\";\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_SYMBOLS_PRIVATE_EXTERN = NO;\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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"Clock-iOS/Clock-iOS-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(BUILT_PRODUCTS_DIR)\",\n\t\t\t\t);\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEC45CAFF18ADC7CE0063DD11 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = 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__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Clock-iOS/Clock-iOS-Prefix.pch\";\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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"Clock-iOS/Clock-iOS-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 7.0;\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(BUILT_PRODUCTS_DIR)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEC45CB9E18ADD0B80063DD11 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = 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__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Clock-OSX/Clock-OSX-Prefix.pch\";\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_SYMBOLS_PRIVATE_EXTERN = NO;\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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"Clock-OSX/Clock-OSX-Info.plist\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEC45CB9F18ADD0B80063DD11 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\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_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = 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__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Clock-OSX/Clock-OSX-Prefix.pch\";\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;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = \"Clock-OSX/Clock-OSX-Info.plist\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tEC45CAC318ADC7920063DD11 /* Build configuration list for PBXProject \"Examples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEC45CAC418ADC7920063DD11 /* Debug */,\n\t\t\t\tEC45CAC518ADC7920063DD11 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tEC45CAFD18ADC7CE0063DD11 /* Build configuration list for PBXNativeTarget \"Clock-iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEC45CAFE18ADC7CE0063DD11 /* Debug */,\n\t\t\t\tEC45CAFF18ADC7CE0063DD11 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tEC45CB9D18ADD0B80063DD11 /* Build configuration list for PBXNativeTarget \"Clock-OSX\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEC45CB9E18ADD0B80063DD11 /* Debug */,\n\t\t\t\tEC45CB9F18ADD0B80063DD11 /* 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 = EC45CAC018ADC7920063DD11 /* Project object */;\n}\n"
  },
  {
    "path": "FBKVOController/FBKVOController.h",
    "content": "/**\n Copyright (c) 2014-present, Facebook, Inc.\n All rights reserved.\n\n This source code is licensed under the BSD-style license found in the\n LICENSE file in the root directory of this source tree. An additional grant\n of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n This macro ensures that key path exists at compile time.\n Given a real receiver with a key path as you would call it, it verifies at compile time that the key path exists, without calling it.\n\n For example:\n\n FBKVOKeyPath(string.length) => @\"length\"\n\n Or even the complex case:\n\n FBKVOKeyPath(string.lowercaseString.length) => @\"lowercaseString.length\".\n */\n#define FBKVOKeyPath(KEYPATH) \\\n@(((void)(NO && ((void)KEYPATH, NO)), \\\n({ const char *fbkvokeypath = strchr(#KEYPATH, '.'); NSCAssert(fbkvokeypath, @\"Provided key path is invalid.\"); fbkvokeypath + 1; })))\n\n/**\n This macro ensures that key path exists at compile time.\n Given a receiver type and a key path, it verifies at compile time that the key path exists, without calling it.\n\n For example:\n\n FBKVOClassKeyPath(NSString, length) => @\"length\"\n FBKVOClassKeyPath(NSString, lowercaseString.length) => @\"lowercaseString.length\"\n */\n#define FBKVOClassKeyPath(CLASS, KEYPATH) \\\n@(((void)(NO && ((void)((CLASS *)(nil)).KEYPATH, NO)), #KEYPATH))\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Key provided in the @c change dictionary of @c FBKVONotificationBlock that's value represents the key-path being observed\n */\nextern NSString *const FBKVONotificationKeyPathKey;\n\n/**\n @abstract Block called on key-value change notification.\n @param observer The observer of the change.\n @param object The object changed.\n @param change The change dictionary which also includes @c FBKVONotificationKeyPathKey\n */\ntypedef void (^FBKVONotificationBlock)(id _Nullable observer, id object, NSDictionary<NSKeyValueChangeKey, id> *change);\n\n/**\n @abstract FBKVOController makes Key-Value Observing simpler and safer.\n @discussion FBKVOController adds support for handling key-value changes with blocks and custom actions, as well as the NSKeyValueObserving callback. Notification will never message a deallocated observer. Observer removal never throws exceptions, and observers are removed implicitly on controller deallocation. FBKVOController is also thread safe. When used in a concurrent environment, it protects observers from possible resurrection and avoids ensuing crash. By default, the controller maintains a strong reference to objects observed.\n */\n@interface FBKVOController : NSObject\n\n///--------------------------------------\n#pragma mark - Initialize\n///--------------------------------------\n\n/**\n @abstract Creates and returns an initialized KVO controller instance.\n @param observer The object notified on key-value change.\n @return The initialized KVO controller instance.\n */\n+ (instancetype)controllerWithObserver:(nullable id)observer;\n\n/**\n @abstract The designated initializer.\n @param observer The object notified on key-value change. The specified observer must support weak references.\n @param retainObserved Flag indicating whether observed objects should be retained.\n @return The initialized KVO controller instance.\n @discussion Use retainObserved = NO when a strong reference between controller and observee would create a retain loop. When not retaining observees, special care must be taken to remove observation info prior to observee dealloc.\n */\n- (instancetype)initWithObserver:(nullable id)observer retainObserved:(BOOL)retainObserved NS_DESIGNATED_INITIALIZER;\n\n/**\n @abstract Convenience initializer.\n @param observer The object notified on key-value change. The specified observer must support weak references.\n @return The initialized KVO controller instance.\n @discussion By default, KVO controller retains objects observed.\n */\n- (instancetype)initWithObserver:(nullable id)observer;\n\n/**\n @abstract Initializes a new instance.\n\n @warning This method is unavaialble. Please use `initWithObserver:` instead.\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n @abstract Allocates memory and initializes a new instance into it.\n\n @warning This method is unavaialble. Please use `controllerWithObserver:` instead.\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n///--------------------------------------\n#pragma mark - Observe\n///--------------------------------------\n\n/**\n The observer notified on key-value change. Specified on initialization.\n */\n@property (nullable, nonatomic, weak, readonly) id observer;\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPath The key path to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param block The block to execute on notification.\n @discussion On key-value change, the specified block is called. In order to avoid retain loops, the block must avoid referencing the KVO controller or an owner thereof. Observing an already observed object key path or nil results in no operation.\n */\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block;\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPath The key path to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param action The observer selector called on key-value change.\n @discussion On key-value change, the observer's action selector is called. The selector provided should take the form of -propertyDidChange, -propertyDidChange: or -propertyDidChange:object:, where optional parameters delivered will be KVO change dictionary and object observed. Observing nil or observing an already observed object's key path results in no operation.\n */\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options action:(SEL)action;\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPath The key path to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param context The context specified.\n @discussion On key-value change, the observer's -observeValueForKeyPath:ofObject:change:context: method is called. Observing an already observed object key path or nil results in no operation.\n */\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;\n\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPaths The key paths to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param block The block to execute on notification.\n @discussion On key-value change, the specified block is called. Inorder to avoid retain loops, the block must avoid referencing the KVO controller or an owner thereof. Observing an already observed object key path or nil results in no operation.\n */\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block;\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPaths The key paths to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param action The observer selector called on key-value change.\n @discussion On key-value change, the observer's action selector is called. The selector provided should take the form of -propertyDidChange, -propertyDidChange: or -propertyDidChange:object:, where optional parameters delivered will be KVO change dictionary and object observed. Observing nil or observing an already observed object's key path results in no operation.\n */\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options action:(SEL)action;\n\n/**\n @abstract Registers observer for key-value change notification.\n @param object The object to observe.\n @param keyPaths The key paths to observe.\n @param options The NSKeyValueObservingOptions to use for observation.\n @param context The context specified.\n @discussion On key-value change, the observer's -observeValueForKeyPath:ofObject:change:context: method is called. Observing an already observed object key path or nil results in no operation.\n */\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options context:(nullable void *)context;\n\n///--------------------------------------\n#pragma mark - Unobserve\n///--------------------------------------\n\n/**\n @abstract Unobserve object key path.\n @param object The object to unobserve.\n @param keyPath The key path to observe.\n @discussion If not observing object key path, or unobserving nil, this method results in no operation.\n */\n- (void)unobserve:(nullable id)object keyPath:(NSString *)keyPath;\n\n/**\n @abstract Unobserve all object key paths.\n @param object The object to unobserve.\n @discussion If not observing object, or unobserving nil, this method results in no operation.\n */\n- (void)unobserve:(nullable id)object;\n\n/**\n @abstract Unobserve all objects.\n @discussion If not observing any objects, this method results in no operation.\n */\n- (void)unobserveAll;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FBKVOController/FBKVOController.m",
    "content": "/**\n Copyright (c) 2014-present, Facebook, Inc.\n All rights reserved.\n\n This source code is licensed under the BSD-style license found in the\n LICENSE file in the root directory of this source tree. An additional grant\n of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"FBKVOController.h\"\n\n#import <objc/message.h>\n#import <pthread.h>\n\n#if !__has_feature(objc_arc)\n#error This file must be compiled with ARC. Convert your project to ARC or specify the -fobjc-arc flag.\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n#pragma mark Utilities -\n\nstatic NSString *describe_option(NSKeyValueObservingOptions option)\n{\n  switch (option) {\n    case NSKeyValueObservingOptionNew:\n      return @\"NSKeyValueObservingOptionNew\";\n      break;\n    case NSKeyValueObservingOptionOld:\n      return @\"NSKeyValueObservingOptionOld\";\n      break;\n    case NSKeyValueObservingOptionInitial:\n      return @\"NSKeyValueObservingOptionInitial\";\n      break;\n    case NSKeyValueObservingOptionPrior:\n      return @\"NSKeyValueObservingOptionPrior\";\n      break;\n    default:\n      NSCAssert(NO, @\"unexpected option %tu\", option);\n      break;\n  }\n  return nil;\n}\n\nstatic void append_option_description(NSMutableString *s, NSUInteger option)\n{\n  if (0 == s.length) {\n    [s appendString:describe_option(option)];\n  } else {\n    [s appendString:@\"|\"];\n    [s appendString:describe_option(option)];\n  }\n}\n\nstatic NSUInteger enumerate_flags(NSUInteger *ptrFlags)\n{\n  NSCAssert(ptrFlags, @\"expected ptrFlags\");\n  if (!ptrFlags) {\n    return 0;\n  }\n\n  NSUInteger flags = *ptrFlags;\n  if (!flags) {\n    return 0;\n  }\n\n  NSUInteger flag = 1 << __builtin_ctzl(flags);\n  flags &= ~flag;\n  *ptrFlags = flags;\n  return flag;\n}\n\nstatic NSString *describe_options(NSKeyValueObservingOptions options)\n{\n  NSMutableString *s = [NSMutableString string];\n  NSUInteger option;\n  while (0 != (option = enumerate_flags(&options))) {\n    append_option_description(s, option);\n  }\n  return s;\n}\n\n#pragma mark _FBKVOInfo -\n\ntypedef NS_ENUM(uint8_t, _FBKVOInfoState) {\n  _FBKVOInfoStateInitial = 0,\n\n  // whether the observer registration in Foundation has completed\n  _FBKVOInfoStateObserving,\n\n  // whether `unobserve` was called before observer registration in Foundation has completed\n  // this could happen when `NSKeyValueObservingOptionInitial` is one of the NSKeyValueObservingOptions\n  _FBKVOInfoStateNotObserving,\n};\n\nNSString *const FBKVONotificationKeyPathKey = @\"FBKVONotificationKeyPathKey\";\n\n/**\n @abstract The key-value observation info.\n @discussion Object equality is only used within the scope of a controller instance. Safely omit controller from equality definition.\n */\n@interface _FBKVOInfo : NSObject\n@end\n\n@implementation _FBKVOInfo\n{\n@public\n  __weak FBKVOController *_controller;\n  NSString *_keyPath;\n  NSKeyValueObservingOptions _options;\n  SEL _action;\n  void *_context;\n  FBKVONotificationBlock _block;\n  _FBKVOInfoState _state;\n}\n\n- (instancetype)initWithController:(FBKVOController *)controller\n                           keyPath:(NSString *)keyPath\n                           options:(NSKeyValueObservingOptions)options\n                             block:(nullable FBKVONotificationBlock)block\n                            action:(nullable SEL)action\n                           context:(nullable void *)context\n{\n  self = [super init];\n  if (nil != self) {\n    _controller = controller;\n    _block = [block copy];\n    _keyPath = [keyPath copy];\n    _options = options;\n    _action = action;\n    _context = context;\n  }\n  return self;\n}\n\n- (instancetype)initWithController:(FBKVOController *)controller keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block\n{\n  return [self initWithController:controller keyPath:keyPath options:options block:block action:NULL context:NULL];\n}\n\n- (instancetype)initWithController:(FBKVOController *)controller keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options action:(SEL)action\n{\n  return [self initWithController:controller keyPath:keyPath options:options block:NULL action:action context:NULL];\n}\n\n- (instancetype)initWithController:(FBKVOController *)controller keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context\n{\n  return [self initWithController:controller keyPath:keyPath options:options block:NULL action:NULL context:context];\n}\n\n- (instancetype)initWithController:(FBKVOController *)controller keyPath:(NSString *)keyPath\n{\n  return [self initWithController:controller keyPath:keyPath options:0 block:NULL action:NULL context:NULL];\n}\n\n- (NSUInteger)hash\n{\n  return [_keyPath hash];\n}\n\n- (BOOL)isEqual:(id)object\n{\n  if (nil == object) {\n    return NO;\n  }\n  if (self == object) {\n    return YES;\n  }\n  if (![object isKindOfClass:[self class]]) {\n    return NO;\n  }\n  return [_keyPath isEqualToString:((_FBKVOInfo *)object)->_keyPath];\n}\n\n- (NSString *)debugDescription\n{\n  NSMutableString *s = [NSMutableString stringWithFormat:@\"<%@:%p keyPath:%@\", NSStringFromClass([self class]), self, _keyPath];\n  if (0 != _options) {\n    [s appendFormat:@\" options:%@\", describe_options(_options)];\n  }\n  if (NULL != _action) {\n    [s appendFormat:@\" action:%@\", NSStringFromSelector(_action)];\n  }\n  if (NULL != _context) {\n    [s appendFormat:@\" context:%p\", _context];\n  }\n  if (NULL != _block) {\n    [s appendFormat:@\" block:%p\", _block];\n  }\n  [s appendString:@\">\"];\n  return s;\n}\n\n@end\n\n#pragma mark _FBKVOSharedController -\n\n/**\n @abstract The shared KVO controller instance.\n @discussion Acts as a receptionist, receiving and forwarding KVO notifications.\n */\n@interface _FBKVOSharedController : NSObject\n\n/** A shared instance that never deallocates. */\n+ (instancetype)sharedController;\n\n/** observe an object, info pair */\n- (void)observe:(id)object info:(nullable _FBKVOInfo *)info;\n\n/** unobserve an object, info pair */\n- (void)unobserve:(id)object info:(nullable _FBKVOInfo *)info;\n\n/** unobserve an object with a set of infos */\n- (void)unobserve:(id)object infos:(nullable NSSet *)infos;\n\n@end\n\n@implementation _FBKVOSharedController\n{\n  NSHashTable<_FBKVOInfo *> *_infos;\n  pthread_mutex_t _mutex;\n}\n\n+ (instancetype)sharedController\n{\n  static _FBKVOSharedController *_controller = nil;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    _controller = [[_FBKVOSharedController alloc] init];\n  });\n  return _controller;\n}\n\n- (instancetype)init\n{\n  self = [super init];\n  if (nil != self) {\n    NSHashTable *infos = [NSHashTable alloc];\n#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED\n    _infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];\n#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)\n    if ([NSHashTable respondsToSelector:@selector(weakObjectsHashTable)]) {\n      _infos = [infos initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];\n    } else {\n      // silence deprecated warnings\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n      _infos = [infos initWithOptions:NSPointerFunctionsZeroingWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];\n#pragma clang diagnostic pop\n    }\n\n#endif\n    pthread_mutex_init(&_mutex, NULL);\n  }\n  return self;\n}\n\n- (void)dealloc\n{\n  pthread_mutex_destroy(&_mutex);\n}\n\n- (NSString *)debugDescription\n{\n  NSMutableString *s = [NSMutableString stringWithFormat:@\"<%@:%p\", NSStringFromClass([self class]), self];\n\n  // lock\n  pthread_mutex_lock(&_mutex);\n\n  NSMutableArray *infoDescriptions = [NSMutableArray arrayWithCapacity:_infos.count];\n  for (_FBKVOInfo *info in _infos) {\n    [infoDescriptions addObject:info.debugDescription];\n  }\n\n  [s appendFormat:@\" contexts:%@\", infoDescriptions];\n\n  // unlock\n  pthread_mutex_unlock(&_mutex);\n\n  [s appendString:@\">\"];\n  return s;\n}\n\n- (void)observe:(id)object info:(nullable _FBKVOInfo *)info\n{\n  if (nil == info) {\n    return;\n  }\n\n  // register info\n  pthread_mutex_lock(&_mutex);\n  [_infos addObject:info];\n  pthread_mutex_unlock(&_mutex);\n\n  // add observer\n  [object addObserver:self forKeyPath:info->_keyPath options:info->_options context:(void *)info];\n\n  if (info->_state == _FBKVOInfoStateInitial) {\n    info->_state = _FBKVOInfoStateObserving;\n  } else if (info->_state == _FBKVOInfoStateNotObserving) {\n    // this could happen when `NSKeyValueObservingOptionInitial` is one of the NSKeyValueObservingOptions,\n    // and the observer is unregistered within the callback block.\n    // at this time the object has been registered as an observer (in Foundation KVO),\n    // so we can safely unobserve it.\n    [object removeObserver:self forKeyPath:info->_keyPath context:(void *)info];\n  }\n}\n\n- (void)unobserve:(id)object info:(nullable _FBKVOInfo *)info\n{\n  if (nil == info) {\n    return;\n  }\n\n  // unregister info\n  pthread_mutex_lock(&_mutex);\n  [_infos removeObject:info];\n  pthread_mutex_unlock(&_mutex);\n\n  // remove observer\n  if (info->_state == _FBKVOInfoStateObserving) {\n    [object removeObserver:self forKeyPath:info->_keyPath context:(void *)info];\n  }\n  info->_state = _FBKVOInfoStateNotObserving;\n}\n\n- (void)unobserve:(id)object infos:(nullable NSSet<_FBKVOInfo *> *)infos\n{\n  if (0 == infos.count) {\n    return;\n  }\n\n  // unregister info\n  pthread_mutex_lock(&_mutex);\n  for (_FBKVOInfo *info in infos) {\n    [_infos removeObject:info];\n  }\n  pthread_mutex_unlock(&_mutex);\n\n  // remove observer\n  for (_FBKVOInfo *info in infos) {\n    if (info->_state == _FBKVOInfoStateObserving) {\n      [object removeObserver:self forKeyPath:info->_keyPath context:(void *)info];\n    }\n    info->_state = _FBKVOInfoStateNotObserving;\n  }\n}\n\n- (void)observeValueForKeyPath:(nullable NSString *)keyPath\n                      ofObject:(nullable id)object\n                        change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change\n                       context:(nullable void *)context\n{\n  NSAssert(context, @\"missing context keyPath:%@ object:%@ change:%@\", keyPath, object, change);\n\n  _FBKVOInfo *info;\n\n  {\n    // lookup context in registered infos, taking out a strong reference only if it exists\n    pthread_mutex_lock(&_mutex);\n    info = [_infos member:(__bridge id)context];\n    pthread_mutex_unlock(&_mutex);\n  }\n\n  if (nil != info) {\n\n    // take strong reference to controller\n    FBKVOController *controller = info->_controller;\n    if (nil != controller) {\n\n      // take strong reference to observer\n      id observer = controller.observer;\n      if (nil != observer) {\n\n        // dispatch custom block or action, fall back to default action\n        if (info->_block) {\n          NSDictionary<NSKeyValueChangeKey, id> *changeWithKeyPath = change;\n          // add the keyPath to the change dictionary for clarity when mulitple keyPaths are being observed\n          if (keyPath) {\n            NSMutableDictionary<NSString *, id> *mChange = [NSMutableDictionary dictionaryWithObject:keyPath forKey:FBKVONotificationKeyPathKey];\n            [mChange addEntriesFromDictionary:change];\n            changeWithKeyPath = [mChange copy];\n          }\n          info->_block(observer, object, changeWithKeyPath);\n        } else if (info->_action) {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n          [observer performSelector:info->_action withObject:change withObject:object];\n#pragma clang diagnostic pop\n        } else {\n          [observer observeValueForKeyPath:keyPath ofObject:object change:change context:info->_context];\n        }\n      }\n    }\n  }\n}\n\n@end\n\n#pragma mark FBKVOController -\n\n@implementation FBKVOController\n{\n  NSMapTable<id, NSMutableSet<_FBKVOInfo *> *> *_objectInfosMap;\n  pthread_mutex_t _lock;\n}\n\n#pragma mark Lifecycle -\n\n+ (instancetype)controllerWithObserver:(nullable id)observer\n{\n  return [[self alloc] initWithObserver:observer];\n}\n\n- (instancetype)initWithObserver:(nullable id)observer retainObserved:(BOOL)retainObserved\n{\n  self = [super init];\n  if (nil != self) {\n    _observer = observer;\n    NSPointerFunctionsOptions keyOptions = retainObserved ? NSPointerFunctionsStrongMemory|NSPointerFunctionsObjectPointerPersonality : NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality;\n    _objectInfosMap = [[NSMapTable alloc] initWithKeyOptions:keyOptions valueOptions:NSPointerFunctionsStrongMemory|NSPointerFunctionsObjectPersonality capacity:0];\n    pthread_mutex_init(&_lock, NULL);\n  }\n  return self;\n}\n\n- (instancetype)initWithObserver:(nullable id)observer\n{\n  return [self initWithObserver:observer retainObserved:YES];\n}\n\n- (void)dealloc\n{\n  [self unobserveAll];\n  pthread_mutex_destroy(&_lock);\n}\n\n#pragma mark Properties -\n\n- (NSString *)debugDescription\n{\n  NSMutableString *s = [NSMutableString stringWithFormat:@\"<%@:%p\", NSStringFromClass([self class]), self];\n  [s appendFormat:@\" observer:<%@:%p>\", NSStringFromClass([_observer class]), _observer];\n\n  // lock\n  pthread_mutex_lock(&_lock);\n\n  if (0 != _objectInfosMap.count) {\n    [s appendString:@\"\\n  \"];\n  }\n\n  for (id object in _objectInfosMap) {\n    NSMutableSet *infos = [_objectInfosMap objectForKey:object];\n    NSMutableArray *infoDescriptions = [NSMutableArray arrayWithCapacity:infos.count];\n    [infos enumerateObjectsUsingBlock:^(_FBKVOInfo *info, BOOL *stop) {\n      [infoDescriptions addObject:info.debugDescription];\n    }];\n    [s appendFormat:@\"%@ -> %@\", object, infoDescriptions];\n  }\n\n  // unlock\n  pthread_mutex_unlock(&_lock);\n\n  [s appendString:@\">\"];\n  return s;\n}\n\n#pragma mark Utilities -\n\n- (void)_observe:(id)object info:(_FBKVOInfo *)info\n{\n  // lock\n  pthread_mutex_lock(&_lock);\n\n  NSMutableSet *infos = [_objectInfosMap objectForKey:object];\n\n  // check for info existence\n  _FBKVOInfo *existingInfo = [infos member:info];\n  if (nil != existingInfo) {\n    // observation info already exists; do not observe it again\n\n    // unlock and return\n    pthread_mutex_unlock(&_lock);\n    return;\n  }\n\n  // lazilly create set of infos\n  if (nil == infos) {\n    infos = [NSMutableSet set];\n    [_objectInfosMap setObject:infos forKey:object];\n  }\n\n  // add info and oberve\n  [infos addObject:info];\n\n  // unlock prior to callout\n  pthread_mutex_unlock(&_lock);\n\n  [[_FBKVOSharedController sharedController] observe:object info:info];\n}\n\n- (void)_unobserve:(id)object info:(_FBKVOInfo *)info\n{\n  // lock\n  pthread_mutex_lock(&_lock);\n\n  // get observation infos\n  NSMutableSet *infos = [_objectInfosMap objectForKey:object];\n\n  // lookup registered info instance\n  _FBKVOInfo *registeredInfo = [infos member:info];\n\n  if (nil != registeredInfo) {\n    [infos removeObject:registeredInfo];\n\n    // remove no longer used infos\n    if (0 == infos.count) {\n      [_objectInfosMap removeObjectForKey:object];\n    }\n  }\n\n  // unlock\n  pthread_mutex_unlock(&_lock);\n\n  // unobserve\n  [[_FBKVOSharedController sharedController] unobserve:object info:registeredInfo];\n}\n\n- (void)_unobserve:(id)object\n{\n  // lock\n  pthread_mutex_lock(&_lock);\n\n  NSMutableSet *infos = [_objectInfosMap objectForKey:object];\n\n  // remove infos\n  [_objectInfosMap removeObjectForKey:object];\n\n  // unlock\n  pthread_mutex_unlock(&_lock);\n\n  // unobserve\n  [[_FBKVOSharedController sharedController] unobserve:object infos:infos];\n}\n\n- (void)_unobserveAll\n{\n  // lock\n  pthread_mutex_lock(&_lock);\n\n  NSMapTable *objectInfoMaps = [_objectInfosMap copy];\n\n  // clear table and map\n  [_objectInfosMap removeAllObjects];\n\n  // unlock\n  pthread_mutex_unlock(&_lock);\n\n  _FBKVOSharedController *shareController = [_FBKVOSharedController sharedController];\n\n  for (id object in objectInfoMaps) {\n    // unobserve each registered object and infos\n    NSSet *infos = [objectInfoMaps objectForKey:object];\n    [shareController unobserve:object infos:infos];\n  }\n}\n\n#pragma mark API -\n\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block\n{\n  NSAssert(0 != keyPath.length && NULL != block, @\"missing required parameters observe:%@ keyPath:%@ block:%p\", object, keyPath, block);\n  if (nil == object || 0 == keyPath.length || NULL == block) {\n    return;\n  }\n\n  // create info\n  _FBKVOInfo *info = [[_FBKVOInfo alloc] initWithController:self keyPath:keyPath options:options block:block];\n\n  // observe object with info\n  [self _observe:object info:info];\n}\n\n\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block\n{\n  NSAssert(0 != keyPaths.count && NULL != block, @\"missing required parameters observe:%@ keyPath:%@ block:%p\", object, keyPaths, block);\n  if (nil == object || 0 == keyPaths.count || NULL == block) {\n    return;\n  }\n\n  for (NSString *keyPath in keyPaths) {\n    [self observe:object keyPath:keyPath options:options block:block];\n  }\n}\n\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options action:(SEL)action\n{\n  NSAssert(0 != keyPath.length && NULL != action, @\"missing required parameters observe:%@ keyPath:%@ action:%@\", object, keyPath, NSStringFromSelector(action));\n  NSAssert([_observer respondsToSelector:action], @\"%@ does not respond to %@\", _observer, NSStringFromSelector(action));\n  if (nil == object || 0 == keyPath.length || NULL == action) {\n    return;\n  }\n\n  // create info\n  _FBKVOInfo *info = [[_FBKVOInfo alloc] initWithController:self keyPath:keyPath options:options action:action];\n\n  // observe object with info\n  [self _observe:object info:info];\n}\n\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options action:(SEL)action\n{\n  NSAssert(0 != keyPaths.count && NULL != action, @\"missing required parameters observe:%@ keyPath:%@ action:%@\", object, keyPaths, NSStringFromSelector(action));\n  NSAssert([_observer respondsToSelector:action], @\"%@ does not respond to %@\", _observer, NSStringFromSelector(action));\n  if (nil == object || 0 == keyPaths.count || NULL == action) {\n    return;\n  }\n\n  for (NSString *keyPath in keyPaths) {\n    [self observe:object keyPath:keyPath options:options action:action];\n  }\n}\n\n- (void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context\n{\n  NSAssert(0 != keyPath.length, @\"missing required parameters observe:%@ keyPath:%@\", object, keyPath);\n  if (nil == object || 0 == keyPath.length) {\n    return;\n  }\n\n  // create info\n  _FBKVOInfo *info = [[_FBKVOInfo alloc] initWithController:self keyPath:keyPath options:options context:context];\n\n  // observe object with info\n  [self _observe:object info:info];\n}\n\n- (void)observe:(nullable id)object keyPaths:(NSArray<NSString *> *)keyPaths options:(NSKeyValueObservingOptions)options context:(nullable void *)context\n{\n  NSAssert(0 != keyPaths.count, @\"missing required parameters observe:%@ keyPath:%@\", object, keyPaths);\n  if (nil == object || 0 == keyPaths.count) {\n    return;\n  }\n\n  for (NSString *keyPath in keyPaths) {\n    [self observe:object keyPath:keyPath options:options context:context];\n  }\n}\n\n- (void)unobserve:(nullable id)object keyPath:(NSString *)keyPath\n{\n  // create representative info\n  _FBKVOInfo *info = [[_FBKVOInfo alloc] initWithController:self keyPath:keyPath];\n\n  // unobserve object property\n  [self _unobserve:object info:info];\n}\n\n- (void)unobserve:(nullable id)object\n{\n  if (nil == object) {\n    return;\n  }\n\n  [self _unobserve:object];\n}\n\n- (void)unobserveAll\n{\n  [self _unobserveAll];\n}\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FBKVOController/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>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.2.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.2.0</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "FBKVOController/KVOController.h",
    "content": "/**\n Copyright (c) 2014-present, Facebook, Inc.\n All rights reserved.\n\n This source code is licensed under the BSD-style license found in the\n LICENSE file in the root directory of this source tree. An additional grant\n of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <KVOController/FBKVOController.h>\n#import <KVOController/NSObject+FBKVOController.h>\n"
  },
  {
    "path": "FBKVOController/NSObject+FBKVOController.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"FBKVOController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Category that adds built-in `KVOController` and `KVOControllerNonRetaining` on any instance of `NSObject`.\n\n This makes it convenient to simply create and forget a `FBKVOController`, \n and when this object gets dealloc'd, so will the associated controller and the observation info.\n */\n@interface NSObject (FBKVOController)\n\n/**\n @abstract Lazy-loaded FBKVOController for use with any object\n @return FBKVOController associated with this object, creating one if necessary\n @discussion This makes it convenient to simply create and forget a FBKVOController, and when this object gets dealloc'd, so will the associated controller and the observation info.\n */\n@property (nonatomic, strong) FBKVOController *KVOController;\n\n/**\n @abstract Lazy-loaded FBKVOController for use with any object\n @return FBKVOController associated with this object, creating one if necessary\n @discussion This makes it convenient to simply create and forget a FBKVOController.\n Use this version when a strong reference between controller and observed object would create a retain cycle.\n When not retaining observed objects, special care must be taken to remove observation info prior to deallocation of the observed object.\n */\n@property (nonatomic, strong) FBKVOController *KVOControllerNonRetaining;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FBKVOController/NSObject+FBKVOController.m",
    "content": "/**\n Copyright (c) 2014-present, Facebook, Inc.\n All rights reserved.\n \n This source code is licensed under the BSD-style license found in the\n LICENSE file in the root directory of this source tree. An additional grant\n of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"NSObject+FBKVOController.h\"\n\n#import <objc/message.h>\n\n#if !__has_feature(objc_arc)\n#error This file must be compiled with ARC. Convert your project to ARC or specify the -fobjc-arc flag.\n#endif\n\n#pragma mark NSObject Category -\n\nNS_ASSUME_NONNULL_BEGIN\n\nstatic void *NSObjectKVOControllerKey = &NSObjectKVOControllerKey;\nstatic void *NSObjectKVOControllerNonRetainingKey = &NSObjectKVOControllerNonRetainingKey;\n\n@implementation NSObject (FBKVOController)\n\n- (FBKVOController *)KVOController\n{\n  id controller = objc_getAssociatedObject(self, NSObjectKVOControllerKey);\n  \n  // lazily create the KVOController\n  if (nil == controller) {\n    controller = [FBKVOController controllerWithObserver:self];\n    self.KVOController = controller;\n  }\n  \n  return controller;\n}\n\n- (void)setKVOController:(FBKVOController *)KVOController\n{\n  objc_setAssociatedObject(self, NSObjectKVOControllerKey, KVOController, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n- (FBKVOController *)KVOControllerNonRetaining\n{\n  id controller = objc_getAssociatedObject(self, NSObjectKVOControllerNonRetainingKey);\n  \n  if (nil == controller) {\n    controller = [[FBKVOController alloc] initWithObserver:self retainObserved:NO];\n    self.KVOControllerNonRetaining = controller;\n  }\n  \n  return controller;\n}\n\n- (void)setKVOControllerNonRetaining:(FBKVOController *)KVOControllerNonRetaining\n{\n  objc_setAssociatedObject(self, NSObjectKVOControllerNonRetainingKey, KVOControllerNonRetaining, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n@end\n\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FBKVOController.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\tECEA612C18A4A7360064AFF4 /* Framework */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = ECEA612D18A4A7360064AFF4 /* Build configuration list for PBXAggregateTarget \"Framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tECEA613218A4A76E0064AFF4 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tECEA613118A4A73D0064AFF4 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Framework;\n\t\t\tproductName = Framework;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t46B05A2E1A076AD70022AB70 /* NSObject+FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = 46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */; };\n\t\t46B05A301A076CC40022AB70 /* NSObject+FBKVOController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */; };\n\t\t81BD70BD1CA4B57F00FB8E4D /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA610818A49C620064AFF4 /* FBKVOController.m */; };\n\t\t81BD70BE1CA4B57F00FB8E4D /* NSObject+FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = 46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */; };\n\t\t81BD70C11CA4B57F00FB8E4D /* KVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EC40D81CA3623D00BD9226 /* KVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD70C21CA4B57F00FB8E4D /* FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = ECEA610618A49C620064AFF4 /* FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD70C31CA4B57F00FB8E4D /* NSObject+FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD70FE1CA607F500FB8E4D /* KVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EC40D81CA3623D00BD9226 /* KVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD70FF1CA607F500FB8E4D /* NSObject+FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD71001CA607F500FB8E4D /* NSObject+FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = 46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */; };\n\t\t81BD71011CA607F500FB8E4D /* FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = ECEA610618A49C620064AFF4 /* FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81BD71021CA607F500FB8E4D /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA610818A49C620064AFF4 /* FBKVOController.m */; };\n\t\t81EC40D01CA3621E00BD9226 /* NSObject+FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC40D11CA3621E00BD9226 /* NSObject+FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = 46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */; };\n\t\t81EC40D21CA3621E00BD9226 /* FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = ECEA610618A49C620064AFF4 /* FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC40D31CA3621E00BD9226 /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA610818A49C620064AFF4 /* FBKVOController.m */; };\n\t\t81EC40D91CA3623D00BD9226 /* KVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EC40D81CA3623D00BD9226 /* KVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC410C1CA363FC00BD9226 /* KVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EC40D81CA3623D00BD9226 /* KVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC41101CA3640600BD9226 /* NSObject+FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC41111CA3640600BD9226 /* FBKVOController.h in Headers */ = {isa = PBXBuildFile; fileRef = ECEA610618A49C620064AFF4 /* FBKVOController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t81EC41151CA3640B00BD9226 /* NSObject+FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = 46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */; };\n\t\t81EC41161CA3640B00BD9226 /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA610818A49C620064AFF4 /* FBKVOController.m */; };\n\t\tEC8BB5AE18A5792D00EB2793 /* FBKVOTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = EC8BB5AD18A5792D00EB2793 /* FBKVOTesting.m */; };\n\t\tECEA610218A49C620064AFF4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECEA610118A49C620064AFF4 /* Foundation.framework */; };\n\t\tECEA610718A49C620064AFF4 /* FBKVOController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = ECEA610618A49C620064AFF4 /* FBKVOController.h */; };\n\t\tECEA610918A49C620064AFF4 /* FBKVOController.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA610818A49C620064AFF4 /* FBKVOController.m */; };\n\t\tECEA611018A49C620064AFF4 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECEA610F18A49C620064AFF4 /* XCTest.framework */; };\n\t\tECEA611118A49C620064AFF4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECEA610118A49C620064AFF4 /* Foundation.framework */; };\n\t\tECEA611318A49C620064AFF4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECEA611218A49C620064AFF4 /* UIKit.framework */; };\n\t\tECEA611618A49C620064AFF4 /* libFBKVOController.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ECEA60FE18A49C620064AFF4 /* libFBKVOController.a */; };\n\t\tECEA611C18A49C620064AFF4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ECEA611A18A49C620064AFF4 /* InfoPlist.strings */; };\n\t\tECEA611E18A49C620064AFF4 /* FBKVOControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ECEA611D18A49C620064AFF4 /* FBKVOControllerTests.m */; };\n\t\tF2755F5F5CED1DAAAFED68B2 /* libPods-FBKVOControllerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 044A6FECA9893D2B98CA99B7 /* libPods-FBKVOControllerTests.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tECEA611418A49C620064AFF4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ECEA60F618A49C620064AFF4 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = ECEA60FD18A49C620064AFF4;\n\t\t\tremoteInfo = FBKVOController;\n\t\t};\n\t\tECEA613018A4A73D0064AFF4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ECEA60F618A49C620064AFF4 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = ECEA60FD18A49C620064AFF4;\n\t\t\tremoteInfo = FBKVOController;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tECEA60FC18A49C620064AFF4 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"$(PRODUCT_NAME)Headers\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t\t46B05A301A076CC40022AB70 /* NSObject+FBKVOController.h in CopyFiles */,\n\t\t\t\tECEA610718A49C620064AFF4 /* FBKVOController.h in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t044A6FECA9893D2B98CA99B7 /* libPods-FBKVOControllerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-FBKVOControllerTests.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2316F70E2DD4D80B87440A05 /* Pods-FBKVOControllerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FBKVOControllerTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-FBKVOControllerTests/Pods-FBKVOControllerTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3E0BB792112F905E950F2AE4 /* Pods-FBKVOControllerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FBKVOControllerTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-FBKVOControllerTests/Pods-FBKVOControllerTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSObject+FBKVOController.m\"; sourceTree = \"<group>\"; };\n\t\t46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSObject+FBKVOController.h\"; sourceTree = \"<group>\"; };\n\t\t81BD70C81CA4B57F00FB8E4D /* KVOController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KVOController.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t81BD70EA1CA4B98D00FB8E4D /* KVOController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KVOController.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t81EC40C61CA3620A00BD9226 /* KVOController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KVOController.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t81EC40D81CA3623D00BD9226 /* KVOController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVOController.h; sourceTree = \"<group>\"; };\n\t\t81EC40EE1CA3630200BD9226 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t81EC40F81CA3639C00BD9226 /* KVOController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KVOController.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEC8BB5AC18A5792D00EB2793 /* FBKVOTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBKVOTesting.h; sourceTree = \"<group>\"; };\n\t\tEC8BB5AD18A5792D00EB2793 /* FBKVOTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBKVOTesting.m; sourceTree = \"<group>\"; };\n\t\tEC8BB5B318A5A1EE00EB2793 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = \"<group>\"; };\n\t\tEC8BB5B418A5A1F500EB2793 /* PATENTS */ = {isa = PBXFileReference; lastKnownFileType = text; path = PATENTS; sourceTree = \"<group>\"; };\n\t\tEC8BB5B518A5A30700EB2793 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = CONTRIBUTING.md; sourceTree = \"<group>\"; };\n\t\tEC8BB5B618A5A30F00EB2793 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = \"<group>\"; };\n\t\tECAFBD5E18BD47BE009B4EC6 /* KVOController.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = KVOController.podspec; sourceTree = \"<group>\"; };\n\t\tECEA60FE18A49C620064AFF4 /* libFBKVOController.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBKVOController.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tECEA610118A49C620064AFF4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tECEA610618A49C620064AFF4 /* FBKVOController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBKVOController.h; sourceTree = \"<group>\"; };\n\t\tECEA610818A49C620064AFF4 /* FBKVOController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBKVOController.m; sourceTree = \"<group>\"; tabWidth = 4; };\n\t\tECEA610E18A49C620064AFF4 /* FBKVOControllerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FBKVOControllerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tECEA610F18A49C620064AFF4 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\tECEA611218A49C620064AFF4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tECEA611918A49C620064AFF4 /* FBKVOControllerTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"FBKVOControllerTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tECEA611B18A49C620064AFF4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tECEA611D18A49C620064AFF4 /* FBKVOControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBKVOControllerTests.m; sourceTree = \"<group>\"; tabWidth = 4; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t81BD70BF1CA4B57F00FB8E4D /* 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\t81BD70E61CA4B98D00FB8E4D /* 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\t81EC40C21CA3620A00BD9226 /* 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\t81EC40F41CA3639C00BD9226 /* 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\tECEA60FB18A49C620064AFF4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tECEA610218A49C620064AFF4 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tECEA610B18A49C620064AFF4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tECEA611018A49C620064AFF4 /* XCTest.framework in Frameworks */,\n\t\t\t\tECEA611318A49C620064AFF4 /* UIKit.framework in Frameworks */,\n\t\t\t\tECEA611618A49C620064AFF4 /* libFBKVOController.a in Frameworks */,\n\t\t\t\tECEA611118A49C620064AFF4 /* Foundation.framework in Frameworks */,\n\t\t\t\tF2755F5F5CED1DAAAFED68B2 /* libPods-FBKVOControllerTests.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tDE977FB840686E597267F657 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2316F70E2DD4D80B87440A05 /* Pods-FBKVOControllerTests.debug.xcconfig */,\n\t\t\t\t3E0BB792112F905E950F2AE4 /* Pods-FBKVOControllerTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA60F518A49C620064AFF4 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEC8BB5B618A5A30F00EB2793 /* README.md */,\n\t\t\t\tEC8BB5B518A5A30700EB2793 /* CONTRIBUTING.md */,\n\t\t\t\tEC8BB5B318A5A1EE00EB2793 /* LICENSE */,\n\t\t\t\tEC8BB5B418A5A1F500EB2793 /* PATENTS */,\n\t\t\t\tECAFBD5E18BD47BE009B4EC6 /* KVOController.podspec */,\n\t\t\t\tECEA610318A49C620064AFF4 /* FBKVOController */,\n\t\t\t\tECEA611718A49C620064AFF4 /* FBKVOControllerTests */,\n\t\t\t\tECEA610018A49C620064AFF4 /* Frameworks */,\n\t\t\t\tECEA60FF18A49C620064AFF4 /* Products */,\n\t\t\t\tDE977FB840686E597267F657 /* Pods */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t};\n\t\tECEA60FF18A49C620064AFF4 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tECEA60FE18A49C620064AFF4 /* libFBKVOController.a */,\n\t\t\t\tECEA610E18A49C620064AFF4 /* FBKVOControllerTests.xctest */,\n\t\t\t\t81EC40C61CA3620A00BD9226 /* KVOController.framework */,\n\t\t\t\t81EC40F81CA3639C00BD9226 /* KVOController.framework */,\n\t\t\t\t81BD70C81CA4B57F00FB8E4D /* KVOController.framework */,\n\t\t\t\t81BD70EA1CA4B98D00FB8E4D /* KVOController.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA610018A49C620064AFF4 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tECEA610118A49C620064AFF4 /* Foundation.framework */,\n\t\t\t\tECEA610F18A49C620064AFF4 /* XCTest.framework */,\n\t\t\t\tECEA611218A49C620064AFF4 /* UIKit.framework */,\n\t\t\t\t044A6FECA9893D2B98CA99B7 /* libPods-FBKVOControllerTests.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA610318A49C620064AFF4 /* FBKVOController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t81EC40D81CA3623D00BD9226 /* KVOController.h */,\n\t\t\t\t46B05A2F1A076ADD0022AB70 /* NSObject+FBKVOController.h */,\n\t\t\t\t46B05A2D1A076AD70022AB70 /* NSObject+FBKVOController.m */,\n\t\t\t\tECEA610618A49C620064AFF4 /* FBKVOController.h */,\n\t\t\t\tECEA610818A49C620064AFF4 /* FBKVOController.m */,\n\t\t\t\tECEA610418A49C620064AFF4 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = FBKVOController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA610418A49C620064AFF4 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t81EC40EE1CA3630200BD9226 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA611718A49C620064AFF4 /* FBKVOControllerTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tECEA611D18A49C620064AFF4 /* FBKVOControllerTests.m */,\n\t\t\t\tEC8BB5AC18A5792D00EB2793 /* FBKVOTesting.h */,\n\t\t\t\tEC8BB5AD18A5792D00EB2793 /* FBKVOTesting.m */,\n\t\t\t\tECEA611818A49C620064AFF4 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = FBKVOControllerTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECEA611818A49C620064AFF4 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tECEA611918A49C620064AFF4 /* FBKVOControllerTests-Info.plist */,\n\t\t\t\tECEA611A18A49C620064AFF4 /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t81BD70C01CA4B57F00FB8E4D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81BD70C11CA4B57F00FB8E4D /* KVOController.h in Headers */,\n\t\t\t\t81BD70C21CA4B57F00FB8E4D /* FBKVOController.h in Headers */,\n\t\t\t\t81BD70C31CA4B57F00FB8E4D /* NSObject+FBKVOController.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81BD70E71CA4B98D00FB8E4D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81BD70FE1CA607F500FB8E4D /* KVOController.h in Headers */,\n\t\t\t\t81BD71011CA607F500FB8E4D /* FBKVOController.h in Headers */,\n\t\t\t\t81BD70FF1CA607F500FB8E4D /* NSObject+FBKVOController.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81EC40C31CA3620A00BD9226 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81EC40D91CA3623D00BD9226 /* KVOController.h in Headers */,\n\t\t\t\t81EC40D21CA3621E00BD9226 /* FBKVOController.h in Headers */,\n\t\t\t\t81EC40D01CA3621E00BD9226 /* NSObject+FBKVOController.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81EC40F51CA3639C00BD9226 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81EC410C1CA363FC00BD9226 /* KVOController.h in Headers */,\n\t\t\t\t81EC41101CA3640600BD9226 /* NSObject+FBKVOController.h in Headers */,\n\t\t\t\t81EC41111CA3640600BD9226 /* FBKVOController.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t81BD70BB1CA4B57F00FB8E4D /* FBKVOController-tvOS-Dynamic */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 81BD70C51CA4B57F00FB8E4D /* Build configuration list for PBXNativeTarget \"FBKVOController-tvOS-Dynamic\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t81BD70BC1CA4B57F00FB8E4D /* Sources */,\n\t\t\t\t81BD70BF1CA4B57F00FB8E4D /* Frameworks */,\n\t\t\t\t81BD70C01CA4B57F00FB8E4D /* Headers */,\n\t\t\t\t81BD70C41CA4B57F00FB8E4D /* 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 = \"FBKVOController-tvOS-Dynamic\";\n\t\t\tproductName = KVOController;\n\t\t\tproductReference = 81BD70C81CA4B57F00FB8E4D /* KVOController.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t81BD70E91CA4B98D00FB8E4D /* FBKVOController-watchOS-Dynamic */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 81BD70EF1CA4B98D00FB8E4D /* Build configuration list for PBXNativeTarget \"FBKVOController-watchOS-Dynamic\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t81BD70E51CA4B98D00FB8E4D /* Sources */,\n\t\t\t\t81BD70E61CA4B98D00FB8E4D /* Frameworks */,\n\t\t\t\t81BD70E71CA4B98D00FB8E4D /* Headers */,\n\t\t\t\t81BD70E81CA4B98D00FB8E4D /* 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 = \"FBKVOController-watchOS-Dynamic\";\n\t\t\tproductName = \"FBKVOController-watchOS-Dynamic\";\n\t\t\tproductReference = 81BD70EA1CA4B98D00FB8E4D /* KVOController.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t81EC40C51CA3620A00BD9226 /* FBKVOController-iOS-Dynamic */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 81EC40CD1CA3620A00BD9226 /* Build configuration list for PBXNativeTarget \"FBKVOController-iOS-Dynamic\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t81EC40C11CA3620A00BD9226 /* Sources */,\n\t\t\t\t81EC40C21CA3620A00BD9226 /* Frameworks */,\n\t\t\t\t81EC40C31CA3620A00BD9226 /* Headers */,\n\t\t\t\t81EC40C41CA3620A00BD9226 /* 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 = \"FBKVOController-iOS-Dynamic\";\n\t\t\tproductName = KVOController;\n\t\t\tproductReference = 81EC40C61CA3620A00BD9226 /* KVOController.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t81EC40F71CA3639C00BD9226 /* FBKVOController-OSX-Dynamic */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 81EC40FD1CA3639C00BD9226 /* Build configuration list for PBXNativeTarget \"FBKVOController-OSX-Dynamic\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t81EC40F31CA3639C00BD9226 /* Sources */,\n\t\t\t\t81EC40F41CA3639C00BD9226 /* Frameworks */,\n\t\t\t\t81EC40F51CA3639C00BD9226 /* Headers */,\n\t\t\t\t81EC40F61CA3639C00BD9226 /* 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 = \"FBKVOController-OSX-Dynamic\";\n\t\t\tproductName = \"KVOController-OSX-Dynamic\";\n\t\t\tproductReference = 81EC40F81CA3639C00BD9226 /* KVOController.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tECEA60FD18A49C620064AFF4 /* FBKVOController */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = ECEA612118A49C620064AFF4 /* Build configuration list for PBXNativeTarget \"FBKVOController\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tECEA60FA18A49C620064AFF4 /* Sources */,\n\t\t\t\tECEA60FB18A49C620064AFF4 /* Frameworks */,\n\t\t\t\tECEA60FC18A49C620064AFF4 /* CopyFiles */,\n\t\t\t\tECEA612718A49DDD0064AFF4 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FBKVOController;\n\t\t\tproductName = FBKVOController;\n\t\t\tproductReference = ECEA60FE18A49C620064AFF4 /* libFBKVOController.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tECEA610D18A49C620064AFF4 /* FBKVOControllerTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = ECEA612418A49C620064AFF4 /* Build configuration list for PBXNativeTarget \"FBKVOControllerTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tBEB3825BB272703E7F8D5FAD /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tECEA610A18A49C620064AFF4 /* Sources */,\n\t\t\t\tECEA610B18A49C620064AFF4 /* Frameworks */,\n\t\t\t\tECEA610C18A49C620064AFF4 /* Resources */,\n\t\t\t\tEC1E7A550C7FEF37584E8438 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t4815293B1AA905E7D81CAD3F /* [CP] Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tECEA611518A49C620064AFF4 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = FBKVOControllerTests;\n\t\t\tproductName = FBKVOControllerTests;\n\t\t\tproductReference = ECEA610E18A49C620064AFF4 /* FBKVOControllerTests.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\tECEA60F618A49C620064AFF4 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Kimon Tsinteris\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t81BD70E91CA4B98D00FB8E4D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t};\n\t\t\t\t\t81EC40C51CA3620A00BD9226 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t};\n\t\t\t\t\t81EC40F71CA3639C00BD9226 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = ECEA60F918A49C620064AFF4 /* Build configuration list for PBXProject \"FBKVOController\" */;\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);\n\t\t\tmainGroup = ECEA60F518A49C620064AFF4;\n\t\t\tproductRefGroup = ECEA60FF18A49C620064AFF4 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tECEA60FD18A49C620064AFF4 /* FBKVOController */,\n\t\t\t\tECEA610D18A49C620064AFF4 /* FBKVOControllerTests */,\n\t\t\t\tECEA612C18A4A7360064AFF4 /* Framework */,\n\t\t\t\t81EC40C51CA3620A00BD9226 /* FBKVOController-iOS-Dynamic */,\n\t\t\t\t81EC40F71CA3639C00BD9226 /* FBKVOController-OSX-Dynamic */,\n\t\t\t\t81BD70BB1CA4B57F00FB8E4D /* FBKVOController-tvOS-Dynamic */,\n\t\t\t\t81BD70E91CA4B98D00FB8E4D /* FBKVOController-watchOS-Dynamic */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t81BD70C41CA4B57F00FB8E4D /* 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\t\t81BD70E81CA4B98D00FB8E4D /* 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\t\t81EC40C41CA3620A00BD9226 /* 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\t\t81EC40F61CA3639C00BD9226 /* 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\t\tECEA610C18A49C620064AFF4 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tECEA611C18A49C620064AFF4 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t4815293B1AA905E7D81CAD3F /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FBKVOControllerTests/Pods-FBKVOControllerTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tBEB3825BB272703E7F8D5FAD /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tEC1E7A550C7FEF37584E8438 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FBKVOControllerTests/Pods-FBKVOControllerTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tECEA612718A49DDD0064AFF4 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"set -e\\n\\nmkdir -p \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\\\"\\n\\n# Link the \\\"Current\\\" version to \\\"A\\\"\\n/bin/ln -sfh A \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/Current\\\"\\n/bin/ln -sfh Versions/Current/Headers \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Headers\\\"\\n/bin/ln -sfh \\\"Versions/Current/${PRODUCT_NAME}\\\" \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/${PRODUCT_NAME}\\\"\\n\\n# The -a ensures that the headers maintain the source modification date so that we don't constantly\\n# cause propagating rebuilds of files that import these headers.\\n/bin/cp -a \\\"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\\\" \\\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework/Versions/A/Headers\\\"\";\n\t\t};\n\t\tECEA613218A4A76E0064AFF4 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"set -e\\nset +u\\n# Avoid recursively calling this script.\\nif [[ $SF_MASTER_SCRIPT_RUNNING ]]\\nthen\\nexit 0\\nfi\\nset -u\\nexport SF_MASTER_SCRIPT_RUNNING=1\\n\\nSF_TARGET_NAME=${PROJECT_NAME}\\nSF_EXECUTABLE_PATH=\\\"lib${SF_TARGET_NAME}.a\\\"\\nSF_WRAPPER_NAME=\\\"${SF_TARGET_NAME}.framework\\\"\\n\\n# The following conditionals come from\\n# https://github.com/kstenerud/iOS-Universal-Framework\\n\\nif [[ \\\"$SDK_NAME\\\" =~ ([A-Za-z]+) ]]\\nthen\\nSF_SDK_PLATFORM=${BASH_REMATCH[1]}\\nelse\\necho \\\"Could not find platform name from SDK_NAME: $SDK_NAME\\\"\\nexit 1\\nfi\\n\\nif [[ \\\"$SDK_NAME\\\" =~ ([0-9]+.*$) ]]\\nthen\\nSF_SDK_VERSION=${BASH_REMATCH[1]}\\nelse\\necho \\\"Could not find sdk version from SDK_NAME: $SDK_NAME\\\"\\nexit 1\\nfi\\n\\nif [[ \\\"$SF_SDK_PLATFORM\\\" = \\\"iphoneos\\\" ]]\\nthen\\nSF_OTHER_PLATFORM=iphonesimulator\\nelse\\nSF_OTHER_PLATFORM=iphoneos\\nfi\\n\\nif [[ \\\"$BUILT_PRODUCTS_DIR\\\" =~ (.*)$SF_SDK_PLATFORM$ ]]\\nthen\\nSF_OTHER_BUILT_PRODUCTS_DIR=\\\"${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}\\\"\\nelse\\necho \\\"Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR\\\"\\nexit 1\\nfi\\n\\n# Build the other platform.\\nxcodebuild -project \\\"${PROJECT_FILE_PATH}\\\" -target \\\"${TARGET_NAME}\\\" -configuration \\\"${CONFIGURATION}\\\" -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR=\\\"${BUILD_DIR}\\\" OBJROOT=\\\"${OBJROOT}\\\" BUILD_ROOT=\\\"${BUILD_ROOT}\\\" SYMROOT=\\\"${SYMROOT}\\\" $ACTION\\n\\n# Smash the two static libraries into one fat binary and store it in the .framework\\nlipo -create \\\"${BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}\\\" \\\"${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_EXECUTABLE_PATH}\\\" -output \\\"${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}\\\"\\n\\n# Copy the binary to the other architecture folder to have a complete framework in both.\\ncp -a \\\"${BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}\\\" \\\"${SF_OTHER_BUILT_PRODUCTS_DIR}/${SF_WRAPPER_NAME}/Versions/${FRAMEWORK_VERSION}/${SF_TARGET_NAME}\\\"\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t81BD70BC1CA4B57F00FB8E4D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81BD70BD1CA4B57F00FB8E4D /* FBKVOController.m in Sources */,\n\t\t\t\t81BD70BE1CA4B57F00FB8E4D /* NSObject+FBKVOController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81BD70E51CA4B98D00FB8E4D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81BD71021CA607F500FB8E4D /* FBKVOController.m in Sources */,\n\t\t\t\t81BD71001CA607F500FB8E4D /* NSObject+FBKVOController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81EC40C11CA3620A00BD9226 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81EC40D31CA3621E00BD9226 /* FBKVOController.m in Sources */,\n\t\t\t\t81EC40D11CA3621E00BD9226 /* NSObject+FBKVOController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81EC40F31CA3639C00BD9226 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81EC41161CA3640B00BD9226 /* FBKVOController.m in Sources */,\n\t\t\t\t81EC41151CA3640B00BD9226 /* NSObject+FBKVOController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tECEA60FA18A49C620064AFF4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t46B05A2E1A076AD70022AB70 /* NSObject+FBKVOController.m in Sources */,\n\t\t\t\tECEA610918A49C620064AFF4 /* FBKVOController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tECEA610A18A49C620064AFF4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tECEA611E18A49C620064AFF4 /* FBKVOControllerTests.m in Sources */,\n\t\t\t\tEC8BB5AE18A5792D00EB2793 /* FBKVOTesting.m 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\tECEA611518A49C620064AFF4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = ECEA60FD18A49C620064AFF4 /* FBKVOController */;\n\t\t\ttargetProxy = ECEA611418A49C620064AFF4 /* PBXContainerItemProxy */;\n\t\t};\n\t\tECEA613118A4A73D0064AFF4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = ECEA60FD18A49C620064AFF4 /* FBKVOController */;\n\t\t\ttargetProxy = ECEA613018A4A73D0064AFF4 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tECEA611A18A49C620064AFF4 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tECEA611B18A49C620064AFF4 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t81BD70C61CA4B57F00FB8E4D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.tvos;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t81BD70C71CA4B57F00FB8E4D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.tvos;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t81BD70F01CA4B98D00FB8E4D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.watchos;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t81BD70F11CA4B98D00FB8E4D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.watchos;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 4;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t81EC40CB1CA3620A00BD9226 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.ios;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t81EC40CC1CA3620A00BD9226 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.ios;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t81EC40FE1CA3639C00BD9226 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.osx;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t81EC40FF1CA3639C00BD9226 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/FBKVOController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.facebook.kvocontroller.osx;\n\t\t\t\tPRODUCT_NAME = KVOController;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tECEA611F18A49C620064AFF4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\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_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\tCOPY_PHASE_STRIP = NO;\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_SYMBOLS_PRIVATE_EXTERN = NO;\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;\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 = 8.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tECEA612018A49C620064AFF4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\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_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\tCOPY_PHASE_STRIP = YES;\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;\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 = 8.0;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tECEA612218A49C620064AFF4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tDSTROOT = /tmp/FBKVOController.dst;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(PROJECT_NAME)Headers\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_STYLE = \"non-global\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tECEA612318A49C620064AFF4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tDSTROOT = /tmp/FBKVOController.dst;\n\t\t\t\tOTHER_LDFLAGS = \"-ObjC\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"$(PROJECT_NAME)Headers\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRIP_STYLE = \"non-global\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tECEA612518A49C620064AFF4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2316F70E2DD4D80B87440A05 /* Pods-FBKVOControllerTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\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\tINFOPLIST_FILE = \"FBKVOControllerTests/FBKVOControllerTests-Info.plist\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.facebook.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tECEA612618A49C620064AFF4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3E0BB792112F905E950F2AE4 /* Pods-FBKVOControllerTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = \"FBKVOControllerTests/FBKVOControllerTests-Info.plist\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.facebook.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tECEA612E18A4A7360064AFF4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tECEA612F18A4A7360064AFF4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t81BD70C51CA4B57F00FB8E4D /* Build configuration list for PBXNativeTarget \"FBKVOController-tvOS-Dynamic\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t81BD70C61CA4B57F00FB8E4D /* Debug */,\n\t\t\t\t81BD70C71CA4B57F00FB8E4D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t81BD70EF1CA4B98D00FB8E4D /* Build configuration list for PBXNativeTarget \"FBKVOController-watchOS-Dynamic\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t81BD70F01CA4B98D00FB8E4D /* Debug */,\n\t\t\t\t81BD70F11CA4B98D00FB8E4D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t81EC40CD1CA3620A00BD9226 /* Build configuration list for PBXNativeTarget \"FBKVOController-iOS-Dynamic\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t81EC40CB1CA3620A00BD9226 /* Debug */,\n\t\t\t\t81EC40CC1CA3620A00BD9226 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t81EC40FD1CA3639C00BD9226 /* Build configuration list for PBXNativeTarget \"FBKVOController-OSX-Dynamic\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t81EC40FE1CA3639C00BD9226 /* Debug */,\n\t\t\t\t81EC40FF1CA3639C00BD9226 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tECEA60F918A49C620064AFF4 /* Build configuration list for PBXProject \"FBKVOController\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tECEA611F18A49C620064AFF4 /* Debug */,\n\t\t\t\tECEA612018A49C620064AFF4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tECEA612118A49C620064AFF4 /* Build configuration list for PBXNativeTarget \"FBKVOController\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tECEA612218A49C620064AFF4 /* Debug */,\n\t\t\t\tECEA612318A49C620064AFF4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tECEA612418A49C620064AFF4 /* Build configuration list for PBXNativeTarget \"FBKVOControllerTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tECEA612518A49C620064AFF4 /* Debug */,\n\t\t\t\tECEA612618A49C620064AFF4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tECEA612D18A4A7360064AFF4 /* Build configuration list for PBXAggregateTarget \"Framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tECEA612E18A4A7360064AFF4 /* Debug */,\n\t\t\t\tECEA612F18A4A7360064AFF4 /* 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 = ECEA60F618A49C620064AFF4 /* Project object */;\n}\n"
  },
  {
    "path": "FBKVOController.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:FBKVOController.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "FBKVOController.xcodeproj/xcshareddata/xcschemes/FBKVOController-OSX-Dynamic.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"81EC40F71CA3639C00BD9226\"\n               BuildableName = \"KVOController.framework\"\n               BlueprintName = \"FBKVOController-OSX-Dynamic\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81EC40F71CA3639C00BD9226\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-OSX-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81EC40F71CA3639C00BD9226\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-OSX-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "FBKVOController.xcodeproj/xcshareddata/xcschemes/FBKVOController-iOS-Dynamic.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"81EC40C51CA3620A00BD9226\"\n               BuildableName = \"KVOController.framework\"\n               BlueprintName = \"FBKVOController-iOS-Dynamic\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81EC40C51CA3620A00BD9226\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-iOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81EC40C51CA3620A00BD9226\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-iOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "FBKVOController.xcodeproj/xcshareddata/xcschemes/FBKVOController-tvOS-Dynamic.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"81BD70BB1CA4B57F00FB8E4D\"\n               BuildableName = \"KVOController.framework\"\n               BlueprintName = \"FBKVOController-tvOS-Dynamic\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81BD70BB1CA4B57F00FB8E4D\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-tvOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81BD70BB1CA4B57F00FB8E4D\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-tvOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "FBKVOController.xcodeproj/xcshareddata/xcschemes/FBKVOController-watchOS-Dynamic.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"81BD70E91CA4B98D00FB8E4D\"\n               BuildableName = \"KVOController.framework\"\n               BlueprintName = \"FBKVOController-watchOS-Dynamic\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81BD70E91CA4B98D00FB8E4D\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-watchOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"81BD70E91CA4B98D00FB8E4D\"\n            BuildableName = \"KVOController.framework\"\n            BlueprintName = \"FBKVOController-watchOS-Dynamic\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "FBKVOController.xcodeproj/xcshareddata/xcschemes/FBKVOController.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"ECEA60FD18A49C620064AFF4\"\n               BuildableName = \"libFBKVOController.a\"\n               BlueprintName = \"FBKVOController\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"ECEA610D18A49C620064AFF4\"\n               BuildableName = \"FBKVOControllerTests.xctest\"\n               BlueprintName = \"FBKVOControllerTests\"\n               ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"ECEA60FD18A49C620064AFF4\"\n            BuildableName = \"libFBKVOController.a\"\n            BlueprintName = \"FBKVOController\"\n            ReferencedContainer = \"container:FBKVOController.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "FBKVOController.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:FBKVOController.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Examples/Examples.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "FBKVOControllerTests/FBKVOControllerTests-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>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "FBKVOControllerTests/FBKVOControllerTests.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <XCTest/XCTest.h>\n\n#define HC_SHORTHAND\n#import <OCHamcrest/OCHamcrest.h>\n\n#define MOCKITO_SHORTHAND\n#import <OCMockito/OCMockito.h>\n\n#import <FBKVOController/FBKVOController.h>\n#import <FBKVOController/NSObject+FBKVOController.h>\n\n#import \"FBKVOTesting.h\"\n\n@interface FBKVOControllerTests : XCTestCase\n@end\n\n@implementation FBKVOControllerTests\n\nstatic NSString *radius = @\"radius\";\nstatic NSString *borderWidth = @\"borderWidth\";\nstatic void *context = (void *)@\"context\";\nstatic NSKeyValueObservingOptions const optionsNone = 0;\nstatic NSKeyValueObservingOptions const optionsBasic = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial;\nstatic NSKeyValueObservingOptions const optionsAll = optionsBasic | NSKeyValueObservingOptionPrior;\n\n- (void)testDebugDescriptionContainsClassName\n{\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  [controller observe:circle keyPaths:@[radius, borderWidth] options:optionsAll context:context];\n  assertThat([controller debugDescription], containsSubstring(@\"FBKVOController\"));\n}\n\n- (void)testBlockOptionsBasic\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n  \n  // add reference observe\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsBasic context:context];\n  \n  __block NSUInteger blockCallCount = 0;\n  __block id blockObserver = nil;\n  __block id blockObject = nil;\n  __block NSString *blockKeyPath = nil;\n  __block NSDictionary *blockChange = nil;\n  \n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic block:^(id observer, id object, NSDictionary *change) {\n    blockObserver = observer;\n    blockObject = object;\n    NSMutableDictionary *mChange = [change mutableCopy];\n    [mChange removeObjectForKey:FBKVONotificationKeyPathKey];\n    blockChange = [mChange copy];\n    blockKeyPath = change[FBKVONotificationKeyPathKey];\n    blockCallCount++;\n  }];\n  \n  XCTAssert(1 == blockCallCount, @\"unexpected block call count:%lu expected:%d\", (unsigned long)blockCallCount, 1);\n  XCTAssert(blockObserver == observer, @\"value:%@ expected:%@\", blockObserver, observer);\n  XCTAssert(blockObject == referenceObserver.lastObject, @\"value:%@ expected:%@\", blockObject, referenceObserver.lastObject);\n  XCTAssert([blockKeyPath isEqualToString:radius], @\"value:%@ expected:%@\", blockKeyPath, radius);\n  XCTAssertEqualObjects(blockChange, referenceObserver.lastChange, @\"value:%@ expected:%@\", blockChange, referenceObserver.lastChange);\n  \n  circle.radius = 1.0;\n  XCTAssert(2 == blockCallCount, @\"unexpected block call count:%lu expected:%d\", (unsigned long)blockCallCount, 2);\n  XCTAssert(blockObserver == observer, @\"value:%@ expected:%@\", blockObserver, observer);\n  XCTAssert(blockObject == referenceObserver.lastObject, @\"value:%@ expected:%@\", blockObject, referenceObserver.lastObject);\n  XCTAssert([blockKeyPath isEqualToString:radius], @\"value:%@ expected:%@\", blockKeyPath, radius);\n  XCTAssertEqualObjects(blockChange, referenceObserver.lastChange, @\"value:%@ expected:%@\", blockChange, referenceObserver.lastChange);\n  \n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testNSKeyValueObservingOptionsNone\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n\n  // add observers\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsNone context:context];\n  [controller observe:circle keyPath:radius options:optionsNone context:context];\n\n  // mutate\n  circle.radius = 1.0;\n\n  // verify\n  [verify(observer) observeValueForKeyPath:referenceObserver.lastKeyPath ofObject:referenceObserver.lastObject change:referenceObserver.lastChange context:referenceObserver.lastContext];\n  \n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testNSKeyValueObservingOptionsBasic\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n\n  // initial value\n  circle.radius = 1.0;\n\n  // add reference observe\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsBasic context:context];\n  \n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic context:context];\n\n  // verify \n  [verify(observer) observeValueForKeyPath:referenceObserver.lastKeyPath ofObject:referenceObserver.lastObject change:referenceObserver.lastChange context:referenceObserver.lastContext];\n  \n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testNSKeyValueObservingOptionsAll\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n\n  // initial value\n  circle.radius = 1.0;\n  \n  // add reference observe\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsAll context:context];\n  \n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsAll context:context];\n\n  // verify initial\n  [verify(observer) observeValueForKeyPath:referenceObserver.lastKeyPath ofObject:referenceObserver.lastObject change:referenceObserver.lastChange context:referenceObserver.lastContext];\n  \n  circle.radius = 2.0;\n\n  // verify mutation\n  [verify(observer) observeValueForKeyPath:referenceObserver.lastKeyPath ofObject:referenceObserver.lastObject change:referenceObserver.lastChange context:referenceObserver.lastContext];\n\n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testObserveKeyPathsOptionsBlockWhenKeyPathsIsNilRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  FBKVONotificationBlock arbitraryBlock = ^(id observer, id object, NSDictionary *change) { /* noop */ };\n  XCTAssertThrows([controller observe:nil keyPaths:(id _Nonnull)nil options:0 block:arbitraryBlock]);\n}\n\n- (void)testObserveKeyPathsOptionsBlockWhenKeyPathsIsEmptyRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *emptyKeyPaths = @[];\n  FBKVONotificationBlock arbitraryBlock = ^(id observer, id object, NSDictionary *change) { /* noop */ };\n  XCTAssertThrows([controller observe:nil keyPaths:emptyKeyPaths options:0 block:arbitraryBlock]);\n}\n\n- (void)testObserveKeyPathsOptionsBlockWhenBlockIsNilRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"ante\", @\"bellum\"];\n  XCTAssertThrows([controller observe:nil keyPaths:arbitraryKeyPaths options:0 block:(id _Nonnull)nil]);\n}\n\n- (void)testObserveKeyPathsOptionsBlockWhenObjectIsNilDoesNothing\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"ante\", @\"bellum\"];\n  FBKVONotificationBlock arbitraryBlock = ^(id observer, id object, NSDictionary *change) { /* noop */ };\n  XCTAssertNoThrow([controller observe:nil keyPaths:arbitraryKeyPaths options:0 block:arbitraryBlock]);\n}\n\n- (void)testObserveKeyPathsOptionsBlockObservesEachOfTheKeyPaths\n{\n  // Arrange 1: Create a controller to observe changes to a circle.\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n\n  // Arrange 2: Observe the key paths \"radius\" and \"borderWidth\" on the circle.\n  //            Aggregate the new values in an array.\n  NSMutableArray *newValues = [NSMutableArray array];\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  [controller observe:circle keyPaths:@[radius, borderWidth] options:NSKeyValueObservingOptionNew block:^(id observer, FBKVOTestCircle *circle, NSDictionary *change) {\n    [newValues addObject:change[NSKeyValueChangeNewKey]];\n  }];\n\n  // Act: Change the values to trigger the KVO notification block.\n  circle.radius = 1.f;\n  circle.borderWidth = 10.f;\n\n  // Assert: Changes to the radius and borderWidth should have been observed.\n  assertThat(newValues, equalTo(@[@1, @10]));\n}\n\n- (void)testObserveKeyPathsOptionsActionWhenKeyPathsIsNilRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  SEL arbitrarySelector = @selector(cookies);\n  XCTAssertThrows([controller observe:nil keyPaths:(id _Nonnull)nil options:0 action:arbitrarySelector]);\n}\n\n- (void)testObserveKeyPathsOptionsActionWhenKeyPathsIsEmptyRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *emptyKeyPaths = @[];\n  SEL arbitrarySelector = @selector(cookies);\n  XCTAssertThrows([controller observe:nil keyPaths:emptyKeyPaths options:0 action:arbitrarySelector]);\n}\n\n- (void)testObserveKeyPathsOptionsActionWhenActionIsNullRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"carpe\", @\"diem\"];\n  XCTAssertThrows([controller observe:nil keyPaths:arbitraryKeyPaths options:0 action:(SEL _Nonnull)NULL]);\n}\n\n- (void)testObserveKeyPathsOptionsActionWhenObjectIsNilRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"ante\", @\"bellum\"];\n  XCTAssertThrows([controller observe:nil keyPaths:arbitraryKeyPaths options:0 action:@selector(debugDescription)]);\n}\n\n- (void)testObserveKeyPathsOptionsActionWhenObjectDoesNotRespondToSelectorRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"caveat\", @\"emptor\"];\n  XCTAssertThrows([controller observe:[NSObject new] keyPaths:arbitraryKeyPaths options:0 action:@selector(cookies)]);\n}\n\n- (void)testObserveKeyPathsOptionsActionObservesEachOfTheKeyPaths\n{\n  // Arrange 1: Create a controller to observe changes to a circle.\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n\n  // Arrange 2: Observe the key paths \"radius\" and \"borderWidth\" on the circle.\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  [controller observe:circle\n             keyPaths:@[radius, borderWidth]\n              options:NSKeyValueObservingOptionNew\n               action:@selector(propertyDidChange)];\n\n  // Act: Change the values to trigger the KVO action selector.\n  circle.radius = 1.f;\n  circle.borderWidth = 10.f;\n\n  // Assert: Changes to the radius and borderWidth should have been observed.\n  [verifyCount(observer, times(2)) propertyDidChange];\n}\n\n- (void)testObserveKeyPathsOptionsContextWhenKeyPathsIsNilRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  XCTAssertThrows([controller observe:nil keyPaths:(id _Nonnull)nil options:0 context:NULL]);\n}\n\n- (void)testObserveKeyPathsOptionsContextWhenKeyPathsIsEmptyRaises\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *emptyKeyPaths = @[];\n  XCTAssertThrows([controller observe:nil keyPaths:emptyKeyPaths options:0 context:NULL]);\n}\n\n- (void)testObserveKeyPathsOptionsContextWhenObjectIsNilDoesNothing\n{\n  FBKVOController *controller = [FBKVOController controllerWithObserver:nil];\n  NSArray *arbitraryKeyPaths = @[@\"terra\", @\"firma\"];\n  XCTAssertNoThrow([controller observe:nil keyPaths:arbitraryKeyPaths options:0 context:NULL]);\n}\n\n- (void)testObserveKeyPathsOptionsContextObservesEachOfTheKeyPaths\n{\n  // Arrange 1: Create a controller to observe changes to a circle.\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n\n  // Arrange 2: Observe the key paths \"radius\" and \"borderWidth\" on the circle.\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  [controller observe:circle\n             keyPaths:@[radius, borderWidth]\n              options:NSKeyValueObservingOptionNew\n              context:NULL];\n\n  // Act: Change the values to trigger the KVO action selector.\n  circle.radius = 1.f;\n  circle.borderWidth = 10.f;\n\n  // Assert: Changes to the radius and borderWidth should have been observed.\n  [verifyCount(observer, times(1)) observeValueForKeyPath:radius\n                                                 ofObject:circle\n                                                   change:anything()\n                                                  context:NULL];\n  [verifyCount(observer, times(1)) observeValueForKeyPath:borderWidth\n                                                 ofObject:circle\n                                                   change:anything()\n                                                  context:NULL];\n}\n\n- (void)testObserveKeyPathsOptionsContextUnobserveWithinBlockWithOptionInitial\n{\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n\n  circle.radius = 1.0;\n  __block float lastObservedRadius = 0.f;\n  [controller observe:circle\n              keyPath:radius\n              options:NSKeyValueObservingOptionInitial\n                block:^(id observer, id object, NSDictionary *change) {\n                  lastObservedRadius = circle.radius;\n                  [controller unobserve:circle];\n                }];\n\n  XCTAssertNoThrow(circle.radius = 2.f);\n  XCTAssertEqual(lastObservedRadius, 1.f);\n}\n\n- (void)testCustomActionOptionsBasic\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  \n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic action:@selector(propertyDidChange)];\n\n  // verify initial\n  [verifyCount(observer, times(1)) propertyDidChange];\n\n  // verify mutation\n  circle.radius = 1.0;\n  [verifyCount(observer, times(2)) propertyDidChange];\n}\n\n- (void)testCustomActionWithChangeOptionsBasic\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n\n  // add reference observe\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsBasic context:context];\n\n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic action:@selector(propertyDidChange:)];\n\n  // verify initial\n  [verify(observer) propertyDidChange:referenceObserver.lastChange];\n  \n  circle.radius = 2.0;\n  \n  // verify mutation\n  [verify(observer) propertyDidChange:referenceObserver.lastChange];\n  \n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testCustomActionWithChangeObjectOptionsBasic\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n  \n  // add reference observe\n  [circle addObserver:referenceObserver forKeyPath:radius options:optionsBasic context:context];\n  \n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic action:@selector(propertyDidChange:object:)];\n  \n  // verify initial\n  [verify(observer) propertyDidChange:referenceObserver.lastChange object:referenceObserver.lastObject];\n  \n  circle.radius = 2.0;\n  \n  // verify mutation\n  [verify(observer) propertyDidChange:referenceObserver.lastChange object:referenceObserver.lastObject];\n  \n  // cleanup\n  [circle removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testUnobserveKeyPath\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n\n  // observe radius and borderWidth\n  [controller observe:circle keyPath:radius options:optionsNone context:context];\n  [controller observe:circle keyPath:borderWidth options:optionsNone context:context];\n\n  // mutate both properties\n  circle.radius = 1.0;\n  circle.borderWidth = 1.0;\n  \n  // verify\n  [verifyCount(observer, times(2)) observeValueForKeyPath:anything() ofObject:circle change:anything() context:context];\n  \n  // unobserve borderWidth\n  [controller unobserve:circle keyPath:borderWidth];\n\n  // mutate both properties\n  circle.radius = 2.0;\n  circle.borderWidth = 2.0;\n  \n  // verify\n  [verifyCount(observer, times(3)) observeValueForKeyPath:anything() ofObject:circle change:anything() context:context];\n}\n\n- (void)testUnobserveObject\n{\n  FBKVOTestCircle *circle1 = [FBKVOTestCircle circle];\n  FBKVOTestCircle *circle2 = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n  FBKVOTestObserver *referenceObserver = [FBKVOTestObserver observer];\n\n  // observe circle1 and circle2\n  [controller observe:circle1 keyPath:radius options:optionsNone action:@selector(propertyDidChange:object:)];\n  [controller observe:circle2 keyPath:radius options:optionsNone action:@selector(propertyDidChange:object:)];\n\n  // unobserve circle2\n  [controller unobserve:circle2];\n\n  // add reference observer\n  [circle1 addObserver:referenceObserver forKeyPath:radius options:optionsNone context:context];\n\n  // mutate circle1 and circle2\n  circle1.radius = 1.0;\n  circle2.radius = 1.0;\n\n  // verify mutation\n  [verifyCount(observer, times(1)) propertyDidChange:referenceObserver.lastChange object:referenceObserver.lastObject];\n  \n  // cleanup\n  [circle1 removeObserver:referenceObserver forKeyPath:radius];\n}\n\n- (void)testDeallocatedController\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  __attribute__((objc_precise_lifetime)) FBKVOController *controller = nil;\n  \n  @autoreleasepool {\n    controller = [FBKVOController controllerWithObserver:observer];\n  \n    // add mock observer\n    [controller observe:circle keyPath:radius options:optionsBasic action:@selector(propertyDidChange)];\n    \n    // verify initial\n    [verifyCount(observer, times(1)) propertyDidChange];\n    \n    // dealloc controller\n    controller = nil;\n  }\n  \n  // mutate\n  circle.radius = 1.0;\n  \n  // verify unobserve all\n  [verifyCount(observer, times(1)) propertyDidChange];\n}\n\n- (void)testDeallocatedObserver\n{\n  FBKVOTestCircle *circle = [FBKVOTestCircle circle];\n  __attribute__((objc_precise_lifetime)) id<FBKVOTestObserving> observer = mockProtocol(@protocol(FBKVOTestObserving));\n  FBKVOController *controller = [FBKVOController controllerWithObserver:observer];\n\n  // add mock observer\n  [controller observe:circle keyPath:radius options:optionsBasic action:@selector(propertyDidChange)];\n  \n  // verify initial\n  [verifyCount(observer, times(1)) propertyDidChange];\n  \n  // dealloc observer\n  observer = nil;\n\n  // mutate witout throwing exception\n  circle.radius = 1.0;\n}\n\n- (void)testTravisContinuousIntegrationHappyDance\n{\n  // happy dance\n  return;\n}\n\n@end\n"
  },
  {
    "path": "FBKVOControllerTests/FBKVOTesting.h",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n Circle test object.\n */\n@interface FBKVOTestCircle : NSObject\n+ (instancetype)circle;\n@property (assign, nonatomic) float radius;\n@property (assign, nonatomic) float borderWidth;\n@end\n\n/**\n Observer protocol for mocking.\n */\n@protocol FBKVOTestObserving <NSObject>\n- (void)propertyDidChange;\n- (void)propertyDidChange:(NSDictionary *)change;\n- (void)propertyDidChange:(NSDictionary *)change object:(id)object;\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;\n@end\n\n/**\n Observer test object that records the last set of values of an NSKeyValueObserving notification.\n */\n@interface FBKVOTestObserver : NSObject\n+ (instancetype)observer;\n@property (strong, nonatomic) id lastObject;\n@property (copy, nonatomic) NSString *lastKeyPath;\n@property (copy, nonatomic) NSDictionary *lastChange;\n@property (assign, nonatomic) void *lastContext;\n@end\n"
  },
  {
    "path": "FBKVOControllerTests/FBKVOTesting.m",
    "content": "/**\n  Copyright (c) 2014-present, Facebook, Inc.\n  All rights reserved.\n\n  This source code is licensed under the BSD-style license found in the\n  LICENSE file in the root directory of this source tree. An additional grant\n  of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"FBKVOTesting.h\"\n\n@implementation FBKVOTestCircle\n\n+ (instancetype)circle\n{\n  return [[self alloc] init];\n}\n\n- (NSString *)debugDescription\n{\n  return [NSString stringWithFormat:@\"<%@:%p radius:%f borderWidth:%f>\", self, self.class, _radius, _borderWidth];\n}\n\n@end\n\n@implementation FBKVOTestObserver\n\n+ (instancetype)observer\n{\n  return [[self alloc] init];\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context\n{\n  self.lastKeyPath = keyPath;\n  self.lastObject = object;\n  self.lastChange = change;\n  self.lastContext = context;\n}\n\n- (NSString *)debugDescription\n{\n  return [NSString stringWithFormat:@\"<%@:%p lastKeyPath:%@ lastObject:%@ lastChange:%@ lastContext:%p>\", self, self.class, _lastKeyPath, _lastObject, _lastChange, _lastContext];\n}\n\n@end\n"
  },
  {
    "path": "FBKVOControllerTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "KVOController.podspec",
    "content": "Pod::Spec.new do |spec|\n  spec.name         = 'KVOController'\n  spec.version      = '1.2.0'\n  spec.license      =  { :type => 'BSD' }\n  spec.homepage     = 'https://github.com/facebook/KVOController'\n  spec.authors      = { 'Kimon Tsinteris' => 'kimon@mac.com', 'Nikita Lutsenko' => 'nlutsenko@me.com' }\n  spec.summary      = 'Simple, modern, thread-safe key-value observing.'\n  spec.description  = <<-DESC\n                      KVOController builds on Cocoa's time-tested key-value observing implementation. It offers a simple, modern API, that is also thread safe.\n                      Benefits include:\n                      Notification using blocks, custom actions, or NSKeyValueObserving callback.\n                      No exceptions on observer removal.\n                      Implicit observer removal on controller dealloc.\n                      Thread-safety with special guards against observer resurrection.\n                      DESC\n  spec.source       = { :git => 'https://github.com/facebook/KVOController.git', :tag => \"v#{spec.version.to_s}\" }\n  spec.source_files = 'FBKVOController/*.{h,m}'\n  spec.requires_arc = true\n\n  spec.ios.deployment_target = '6.0'\n  spec.osx.deployment_target = '10.7'\n  spec.tvos.deployment_target = '9.0'\n  spec.watchos.deployment_target = '2.0'\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD License\n\nFor KVOController software\n\nCopyright (c) 2014, Facebook, Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n * Neither the name Facebook nor the names of its contributors may be used to\n   endorse or promote products derived from this software without specific\n   prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "PATENTS",
    "content": "Additional Grant of Patent Rights Version 2\n\n\"Software\" means the KVOController software distributed by Facebook, Inc.\n\nFacebook, Inc. (\"Facebook\") hereby grants to each recipient of the Software\n(\"you\") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable\n(subject to the termination provision below) license under any Necessary\nClaims, to make, have made, use, sell, offer to sell, import, and otherwise\ntransfer the Software. For avoidance of doubt, no license is granted under\nFacebook’s rights in any patent claims that are infringed by (i) modifications\nto the Software made by you or any third party or (ii) the Software in\ncombination with any software or other technology.\n\nThe license granted hereunder will terminate, automatically and without notice,\nif you (or any of your subsidiaries, corporate affiliates or agents) initiate\ndirectly or indirectly, or take a direct financial interest in, any Patent\nAssertion: (i) against Facebook or any of its subsidiaries or corporate\naffiliates, (ii) against any party if such Patent Assertion arises in whole or\nin part from any software, technology, product or service of Facebook or any of\nits subsidiaries or corporate affiliates, or (iii) against any party relating\nto the Software. Notwithstanding the foregoing, if Facebook or any of its\nsubsidiaries or corporate affiliates files a lawsuit alleging patent\ninfringement against you in the first instance, and you respond by filing a\npatent infringement counterclaim in that lawsuit against that party that is\nunrelated to the Software, the license granted hereunder will not terminate\nunder section (i) of this paragraph due to such counterclaim.\n\nA \"Necessary Claim\" is a claim of a patent owned by Facebook that is\nnecessarily infringed by the Software standing alone.\n\nA \"Patent Assertion\" is any lawsuit or other action alleging direct, indirect,\nor contributory infringement or inducement to infringe any patent, including a\ncross-claim or counterclaim.\n"
  },
  {
    "path": "Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nproject 'FBKVOController.xcodeproj'\n\ntarget :FBKVOControllerTests do\n  pod 'OCMockito', '~> 1.0'\nend\n"
  },
  {
    "path": "README.md",
    "content": "# [KVOController](https://github.com/facebook/KVOController)\n[![Build Status](https://img.shields.io/travis/facebook/KVOController/master.svg?style=flat)](https://travis-ci.org/facebook/KVOController)\n[![Coverage Status](https://img.shields.io/codecov/c/github/facebook/KVOController/master.svg)](https://codecov.io/github/facebook/KVOController)\n[![Version](https://img.shields.io/cocoapods/v/KVOController.svg?style=flat)](http://cocoadocs.org/docsets/KVOController)\n[![Platform](https://img.shields.io/cocoapods/p/KVOController.svg?style=flat)](http://cocoadocs.org/docsets/KVOController)\n\nKey-value observing is a particularly useful technique for communicating between layers in a Model-View-Controller application. KVOController builds on Cocoa's time-tested key-value observing implementation. It offers a simple, modern API, that is also thread safe. Benefits include:\n\n- Notification using blocks, custom actions, or NSKeyValueObserving callback.\n- No exceptions on observer removal.\n- Implicit observer removal on controller dealloc.\n- Thread-safety with special guards against observer resurrection – [rdar://15985376](http://openradar.appspot.com/radar?id=5305010728468480).\n\nFor more information on KVO, see Apple's [Introduction to Key-Value Observing](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html).\n\n## Usage\n\nExample apps for iOS and OS X are included with the project. Here is one simple usage pattern:\n\n```objective-c\n// create KVO controller with observer\nFBKVOController *KVOController = [FBKVOController controllerWithObserver:self];\nself.KVOController = KVOController;\n\n// observe clock date property\n[self.KVOController observe:clock keyPath:@\"date\" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew block:^(ClockView *clockView, Clock *clock, NSDictionary *change) {\n\n  // update clock view with new value\n  clockView.date = change[NSKeyValueChangeNewKey];\n}];\n```\n\nWhile simple, the above example is complete. A clock view creates a KVO controller to observe the clock date property. A block callback is used to handle initial and change notification. Unobservation happens implicitly on controller deallocation, since a strong reference to the `KVOController` is kept. \n\nNote: the observer specified must support weak references. The zeroing weak reference guards against notification of a deallocated observer instance.\n\n#### NSObject Category\nFor an even easier usage, just `#import <KVOController/NSObject+FBKVOController.h>` for an automatic `KVOController` property on all objects.\n\n```objc\n[self.KVOController observe:clock keyPath:@\"date\" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew action:@selector(updateClockWithDateChange:)];\n```\n\n## Swift\n\nKVOController works great in Swift but there are few requirements:\n\n- Your observer should subclass `NSObject`.\n- Properties that you observe must be marked as `dynamic`.\n\nCheck the following example:\n\n```Swift\nclass TasksListViewModel: NSObject {\n\n  dynamic var tasksList: [TaskList] = []\n}\n\n/// In ViewController.swift\n\nimport KVOController\n\nkvoController.observe(viewModel,\n                      keyPath: \"listsDidChange\",\n                      options: [.new, .initial]) { (viewController, viewModel, change) in\n    \n  self.taskListsTableView.reloadData()\n}\n```\n\n## Prerequisites\n\nKVOController takes advantage of recent Objective-C runtime advances, including ARC and weak collections. It requires:\n\n- iOS 6 or later.\n- OS X 10.7 or later.\n\n## Installation\n\nTo install using [CocoaPods](https://github.com/cocoapods/cocoapods), add the following to your project Podfile:\n\n```ruby\npod 'KVOController'\n```\n\nTo install using [Carthage](https://github.com/carthage/carthage), add the following to your project Cartfile:\n\n```\ngithub \"facebook/KVOController\"\n```\n\nAlternatively, drag and drop FBKVOController.h and FBKVOController.m into your Xcode project, agreeing to copy files if needed. For iOS applications, you can choose to link against the static library target of the KVOController project.\n\nHaving installed using CocoaPods or Carthage, add the following to import in Objective-C:\n```objective-c\n#import <KVOController/KVOController.h>\n```\n\n## Testing\n\nThe unit tests included use CocoaPods for managing dependencies. Install CocoaPods if you haven't already done so. Then, at the command line, navigate to the root KVOController directory and type:\n\n```sh\npod install\n```\n\nThis will install and add test dependencies on OCHamcrest and OCMockito. Re-open the Xcode KVOController workspace and Test, ⌘U.\n\n## License\n\nKVOController is released under a BSD License. See LICENSE file for details.\n"
  },
  {
    "path": "Rakefile",
    "content": "#\n# Copyright (c) 2016-present, Facebook, Inc.\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n#\n\ncarthage_archive_name = 'KVOController.framework.zip'\nversion_plist_path = File.join(File.dirname(__FILE__), 'FBKVOController', 'Info.plist')\n\ndesc 'Build release archive.'\ntask :archive do\n  `rm -rf Carthage build`\n  \n  unless system('which carthage > /dev/null')\n    abort 'Failed to find Carthage. Make sure it is installed first.'\n  end\n  \n  puts 'Building release package.'\n  unless system('carthage build --no-skip-current')\n    abort 'Failed to build with Carthage.'\n  end\n  \n  puts 'Archiving release package.'\n  unless system('carthage archive')\n    abort 'Failed to archive package'\n  end\n  \n  system(\"mv #{carthage_archive_name} Carthage/\")\n  puts \"Created release archive at Carthage/#{carthage_archive_name}\"\nend\n\ndesc 'Update version for next release.'\ntask :version, [:version] do |_, args|\n  version = args[:version]\n  if version.nil?\n    return\n  end\n  \n  require 'plist'\n  \n  info_plist = Plist.parse_xml(version_plist_path)\n  info_plist['CFBundleShortVersionString'] = version\n  info_plist['CFBundleVersion'] = version\n  File.open(version_plist_path, 'w') { |f| f.write(info_plist.to_plist) }\nend\n\ndesc 'Build and archive a release.'\ntask :release, [:version] => [:version, :archive]\n"
  },
  {
    "path": "codecov.yml",
    "content": "coverage:\n  ignore:\n    - FBKVOControllerTests/*\n  status:\n    patch: false\n    changes: false\n    project:\n      default:\n        target: 60\ncomment: false\n"
  }
]