[
  {
    "path": ".gitignore",
    "content": "# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control?\n#\n# Pods/\n\n.DS_Store\nxcuserdata"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nscript:\n- xcodebuild -project AspectsDemo/AspectsDemo.xcodeproj -scheme AspectsDemo -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO test\n- xcodebuild -project AspectsDemo/AspectsDemo.xcodeproj -scheme AspectsDemo -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPad Retina (64-bit),OS=8.1' test\n- xcodebuild -project AspectsDemoOSX/AspectsDemoOSX.xcodeproj -scheme AspectsDemoOSX test\n"
  },
  {
    "path": "Aspects.h",
    "content": "//\n//  Aspects.h\n//  Aspects - A delightful, simple library for aspect oriented programming.\n//\n//  Copyright (c) 2014 Peter Steinberger. Licensed under the MIT license.\n//\n\n#import <Foundation/Foundation.h>\n\ntypedef NS_OPTIONS(NSUInteger, AspectOptions) {\n    AspectPositionAfter   = 0,            /// Called after the original implementation (default)\n    AspectPositionInstead = 1,            /// Will replace the original implementation.\n    AspectPositionBefore  = 2,            /// Called before the original implementation.\n    \n    AspectOptionAutomaticRemoval = 1 << 3 /// Will remove the hook after the first execution.\n};\n\n/// Opaque Aspect Token that allows to deregister the hook.\n@protocol AspectToken <NSObject>\n\n/// Deregisters an aspect.\n/// @return YES if deregistration is successful, otherwise NO.\n- (BOOL)remove;\n\n@end\n\n/// The AspectInfo protocol is the first parameter of our block syntax.\n@protocol AspectInfo <NSObject>\n\n/// The instance that is currently hooked.\n- (id)instance;\n\n/// The original invocation of the hooked method.\n- (NSInvocation *)originalInvocation;\n\n/// All method arguments, boxed. This is lazily evaluated.\n- (NSArray *)arguments;\n\n@end\n\n/**\n Aspects uses Objective-C message forwarding to hook into messages. This will create some overhead. Don't add aspects to methods that are called a lot. Aspects is meant for view/controller code that is not called a 1000 times per second.\n\n Adding aspects returns an opaque token which can be used to deregister again. All calls are thread safe.\n */\n@interface NSObject (Aspects)\n\n/// Adds a block of code before/instead/after the current `selector` for a specific class.\n///\n/// @param block Aspects replicates the type signature of the method being hooked.\n/// The first parameter will be `id<AspectInfo>`, followed by all parameters of the method.\n/// These parameters are optional and will be filled to match the block signature.\n/// You can even use an empty block, or one that simple gets `id<AspectInfo>`.\n///\n/// @note Hooking static methods is not supported.\n/// @return A token which allows to later deregister the aspect.\n+ (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                           withOptions:(AspectOptions)options\n                            usingBlock:(id)block\n                                 error:(NSError **)error;\n\n/// Adds a block of code before/instead/after the current `selector` for a specific instance.\n- (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                           withOptions:(AspectOptions)options\n                            usingBlock:(id)block\n                                 error:(NSError **)error;\n\n@end\n\n\ntypedef NS_ENUM(NSUInteger, AspectErrorCode) {\n    AspectErrorSelectorBlacklisted,                   /// Selectors like release, retain, autorelease are blacklisted.\n    AspectErrorDoesNotRespondToSelector,              /// Selector could not be found.\n    AspectErrorSelectorDeallocPosition,               /// When hooking dealloc, only AspectPositionBefore is allowed.\n    AspectErrorSelectorAlreadyHookedInClassHierarchy, /// Statically hooking the same method in subclasses is not allowed.\n    AspectErrorFailedToAllocateClassPair,             /// The runtime failed creating a class pair.\n    AspectErrorMissingBlockSignature,                 /// The block misses compile time signature info and can't be called.\n    AspectErrorIncompatibleBlockSignature,            /// The block signature does not match the method or is too large.\n\n    AspectErrorRemoveObjectAlreadyDeallocated = 100   /// (for removing) The object hooked is already deallocated.\n};\n\nextern NSString *const AspectErrorDomain;\n"
  },
  {
    "path": "Aspects.m",
    "content": "//\n//  Aspects.m\n//  Aspects - A delightful, simple library for aspect oriented programming.\n//\n//  Copyright (c) 2014 Peter Steinberger. Licensed under the MIT license.\n//\n\n#import \"Aspects.h\"\n#import <libkern/OSAtomic.h>\n#import <objc/runtime.h>\n#import <objc/message.h>\n\n#define AspectLog(...)\n//#define AspectLog(...) do { NSLog(__VA_ARGS__); }while(0)\n#define AspectLogError(...) do { NSLog(__VA_ARGS__); }while(0)\n\n// Block internals.\ntypedef NS_OPTIONS(int, AspectBlockFlags) {\n\tAspectBlockFlagsHasCopyDisposeHelpers = (1 << 25),\n\tAspectBlockFlagsHasSignature          = (1 << 30)\n};\ntypedef struct _AspectBlock {\n\t__unused Class isa;\n\tAspectBlockFlags flags;\n\t__unused int reserved;\n\tvoid (__unused *invoke)(struct _AspectBlock *block, ...);\n\tstruct {\n\t\tunsigned long int reserved;\n\t\tunsigned long int size;\n\t\t// requires AspectBlockFlagsHasCopyDisposeHelpers\n\t\tvoid (*copy)(void *dst, const void *src);\n\t\tvoid (*dispose)(const void *);\n\t\t// requires AspectBlockFlagsHasSignature\n\t\tconst char *signature;\n\t\tconst char *layout;\n\t} *descriptor;\n\t// imported variables\n} *AspectBlockRef;\n\n@interface AspectInfo : NSObject <AspectInfo>\n- (id)initWithInstance:(__unsafe_unretained id)instance invocation:(NSInvocation *)invocation;\n@property (nonatomic, unsafe_unretained, readonly) id instance;\n@property (nonatomic, strong, readonly) NSArray *arguments;\n@property (nonatomic, strong, readonly) NSInvocation *originalInvocation;\n@end\n\n// Tracks a single aspect.\n@interface AspectIdentifier : NSObject\n+ (instancetype)identifierWithSelector:(SEL)selector object:(id)object options:(AspectOptions)options block:(id)block error:(NSError **)error;\n- (BOOL)invokeWithInfo:(id<AspectInfo>)info;\n@property (nonatomic, assign) SEL selector;\n@property (nonatomic, strong) id block;\n@property (nonatomic, strong) NSMethodSignature *blockSignature;\n@property (nonatomic, weak) id object;\n@property (nonatomic, assign) AspectOptions options;\n@end\n\n// Tracks all aspects for an object/class.\n@interface AspectsContainer : NSObject\n- (void)addAspect:(AspectIdentifier *)aspect withOptions:(AspectOptions)injectPosition;\n- (BOOL)removeAspect:(id)aspect;\n- (BOOL)hasAspects;\n@property (atomic, copy) NSArray *beforeAspects;\n@property (atomic, copy) NSArray *insteadAspects;\n@property (atomic, copy) NSArray *afterAspects;\n@end\n\n@interface AspectTracker : NSObject\n- (id)initWithTrackedClass:(Class)trackedClass;\n@property (nonatomic, strong) Class trackedClass;\n@property (nonatomic, readonly) NSString *trackedClassName;\n@property (nonatomic, strong) NSMutableSet *selectorNames;\n@property (nonatomic, strong) NSMutableDictionary *selectorNamesToSubclassTrackers;\n- (void)addSubclassTracker:(AspectTracker *)subclassTracker hookingSelectorName:(NSString *)selectorName;\n- (void)removeSubclassTracker:(AspectTracker *)subclassTracker hookingSelectorName:(NSString *)selectorName;\n- (BOOL)subclassHasHookedSelectorName:(NSString *)selectorName;\n- (NSSet *)subclassTrackersHookingSelectorName:(NSString *)selectorName;\n@end\n\n@interface NSInvocation (Aspects)\n- (NSArray *)aspects_arguments;\n@end\n\n#define AspectPositionFilter 0x07\n\n#define AspectError(errorCode, errorDescription) do { \\\nAspectLogError(@\"Aspects: %@\", errorDescription); \\\nif (error) { *error = [NSError errorWithDomain:AspectErrorDomain code:errorCode userInfo:@{NSLocalizedDescriptionKey: errorDescription}]; }}while(0)\n\nNSString *const AspectErrorDomain = @\"AspectErrorDomain\";\nstatic NSString *const AspectsSubclassSuffix = @\"_Aspects_\";\nstatic NSString *const AspectsMessagePrefix = @\"aspects_\";\n\n@implementation NSObject (Aspects)\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Public Aspects API\n\n+ (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                      withOptions:(AspectOptions)options\n                       usingBlock:(id)block\n                            error:(NSError **)error {\n    return aspect_add((id)self, selector, options, block, error);\n}\n\n/// @return A token which allows to later deregister the aspect.\n- (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                      withOptions:(AspectOptions)options\n                       usingBlock:(id)block\n                            error:(NSError **)error {\n    return aspect_add(self, selector, options, block, error);\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Private Helper\n\nstatic id aspect_add(id self, SEL selector, AspectOptions options, id block, NSError **error) {\n    NSCParameterAssert(self);\n    NSCParameterAssert(selector);\n    NSCParameterAssert(block);\n\n    __block AspectIdentifier *identifier = nil;\n    aspect_performLocked(^{\n        if (aspect_isSelectorAllowedAndTrack(self, selector, options, error)) {\n            AspectsContainer *aspectContainer = aspect_getContainerForObject(self, selector);\n            identifier = [AspectIdentifier identifierWithSelector:selector object:self options:options block:block error:error];\n            if (identifier) {\n                [aspectContainer addAspect:identifier withOptions:options];\n\n                // Modify the class to allow message interception.\n                aspect_prepareClassAndHookSelector(self, selector, error);\n            }\n        }\n    });\n    return identifier;\n}\n\nstatic BOOL aspect_remove(AspectIdentifier *aspect, NSError **error) {\n    NSCAssert([aspect isKindOfClass:AspectIdentifier.class], @\"Must have correct type.\");\n\n    __block BOOL success = NO;\n    aspect_performLocked(^{\n        id self = aspect.object; // strongify\n        if (self) {\n            AspectsContainer *aspectContainer = aspect_getContainerForObject(self, aspect.selector);\n            success = [aspectContainer removeAspect:aspect];\n\n            aspect_cleanupHookedClassAndSelector(self, aspect.selector);\n            // destroy token\n            aspect.object = nil;\n            aspect.block = nil;\n            aspect.selector = NULL;\n        }else {\n            NSString *errrorDesc = [NSString stringWithFormat:@\"Unable to deregister hook. Object already deallocated: %@\", aspect];\n            AspectError(AspectErrorRemoveObjectAlreadyDeallocated, errrorDesc);\n        }\n    });\n    return success;\n}\n\nstatic void aspect_performLocked(dispatch_block_t block) {\n    static OSSpinLock aspect_lock = OS_SPINLOCK_INIT;\n    OSSpinLockLock(&aspect_lock);\n    block();\n    OSSpinLockUnlock(&aspect_lock);\n}\n\nstatic SEL aspect_aliasForSelector(SEL selector) {\n    NSCParameterAssert(selector);\n\treturn NSSelectorFromString([AspectsMessagePrefix stringByAppendingFormat:@\"_%@\", NSStringFromSelector(selector)]);\n}\n\nstatic NSMethodSignature *aspect_blockMethodSignature(id block, NSError **error) {\n    AspectBlockRef layout = (__bridge void *)block;\n\tif (!(layout->flags & AspectBlockFlagsHasSignature)) {\n        NSString *description = [NSString stringWithFormat:@\"The block %@ doesn't contain a type signature.\", block];\n        AspectError(AspectErrorMissingBlockSignature, description);\n        return nil;\n    }\n\tvoid *desc = layout->descriptor;\n\tdesc += 2 * sizeof(unsigned long int);\n\tif (layout->flags & AspectBlockFlagsHasCopyDisposeHelpers) {\n\t\tdesc += 2 * sizeof(void *);\n    }\n\tif (!desc) {\n        NSString *description = [NSString stringWithFormat:@\"The block %@ doesn't has a type signature.\", block];\n        AspectError(AspectErrorMissingBlockSignature, description);\n        return nil;\n    }\n\tconst char *signature = (*(const char **)desc);\n\treturn [NSMethodSignature signatureWithObjCTypes:signature];\n}\n\nstatic BOOL aspect_isCompatibleBlockSignature(NSMethodSignature *blockSignature, id object, SEL selector, NSError **error) {\n    NSCParameterAssert(blockSignature);\n    NSCParameterAssert(object);\n    NSCParameterAssert(selector);\n\n    BOOL signaturesMatch = YES;\n    NSMethodSignature *methodSignature = [[object class] instanceMethodSignatureForSelector:selector];\n    if (blockSignature.numberOfArguments > methodSignature.numberOfArguments) {\n        signaturesMatch = NO;\n    }else {\n        if (blockSignature.numberOfArguments > 1) {\n            const char *blockType = [blockSignature getArgumentTypeAtIndex:1];\n            if (blockType[0] != '@') {\n                signaturesMatch = NO;\n            }\n        }\n        // Argument 0 is self/block, argument 1 is SEL or id<AspectInfo>. We start comparing at argument 2.\n        // The block can have less arguments than the method, that's ok.\n        if (signaturesMatch) {\n            for (NSUInteger idx = 2; idx < blockSignature.numberOfArguments; idx++) {\n                const char *methodType = [methodSignature getArgumentTypeAtIndex:idx];\n                const char *blockType = [blockSignature getArgumentTypeAtIndex:idx];\n                // Only compare parameter, not the optional type data.\n                if (!methodType || !blockType || methodType[0] != blockType[0]) {\n                    signaturesMatch = NO; break;\n                }\n            }\n        }\n    }\n\n    if (!signaturesMatch) {\n        NSString *description = [NSString stringWithFormat:@\"Block signature %@ doesn't match %@.\", blockSignature, methodSignature];\n        AspectError(AspectErrorIncompatibleBlockSignature, description);\n        return NO;\n    }\n    return YES;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Class + Selector Preparation\n\nstatic BOOL aspect_isMsgForwardIMP(IMP impl) {\n    return impl == _objc_msgForward\n#if !defined(__arm64__)\n    || impl == (IMP)_objc_msgForward_stret\n#endif\n    ;\n}\n\nstatic IMP aspect_getMsgForwardIMP(NSObject *self, SEL selector) {\n    IMP msgForwardIMP = _objc_msgForward;\n#if !defined(__arm64__)\n    // As an ugly internal runtime implementation detail in the 32bit runtime, we need to determine of the method we hook returns a struct or anything larger than id.\n    // https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html\n    // https://github.com/ReactiveCocoa/ReactiveCocoa/issues/783\n    // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf (Section 5.4)\n    Method method = class_getInstanceMethod(self.class, selector);\n    const char *encoding = method_getTypeEncoding(method);\n    BOOL methodReturnsStructValue = encoding[0] == _C_STRUCT_B;\n    if (methodReturnsStructValue) {\n        @try {\n            NSUInteger valueSize = 0;\n            NSGetSizeAndAlignment(encoding, &valueSize, NULL);\n\n            if (valueSize == 1 || valueSize == 2 || valueSize == 4 || valueSize == 8) {\n                methodReturnsStructValue = NO;\n            }\n        } @catch (__unused NSException *e) {}\n    }\n    if (methodReturnsStructValue) {\n        msgForwardIMP = (IMP)_objc_msgForward_stret;\n    }\n#endif\n    return msgForwardIMP;\n}\n\nstatic void aspect_prepareClassAndHookSelector(NSObject *self, SEL selector, NSError **error) {\n    NSCParameterAssert(selector);\n    Class klass = aspect_hookClass(self, error);\n    Method targetMethod = class_getInstanceMethod(klass, selector);\n    IMP targetMethodIMP = method_getImplementation(targetMethod);\n    if (!aspect_isMsgForwardIMP(targetMethodIMP)) {\n        // Make a method alias for the existing method implementation, it not already copied.\n        const char *typeEncoding = method_getTypeEncoding(targetMethod);\n        SEL aliasSelector = aspect_aliasForSelector(selector);\n        if (![klass instancesRespondToSelector:aliasSelector]) {\n            __unused BOOL addedAlias = class_addMethod(klass, aliasSelector, method_getImplementation(targetMethod), typeEncoding);\n            NSCAssert(addedAlias, @\"Original implementation for %@ is already copied to %@ on %@\", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), klass);\n        }\n\n        // We use forwardInvocation to hook in.\n        class_replaceMethod(klass, selector, aspect_getMsgForwardIMP(self, selector), typeEncoding);\n        AspectLog(@\"Aspects: Installed hook for -[%@ %@].\", klass, NSStringFromSelector(selector));\n    }\n}\n\n// Will undo the runtime changes made.\nstatic void aspect_cleanupHookedClassAndSelector(NSObject *self, SEL selector) {\n    NSCParameterAssert(self);\n    NSCParameterAssert(selector);\n\n\tClass klass = object_getClass(self);\n    BOOL isMetaClass = class_isMetaClass(klass);\n    if (isMetaClass) {\n        klass = (Class)self;\n    }\n\n    // Check if the method is marked as forwarded and undo that.\n    Method targetMethod = class_getInstanceMethod(klass, selector);\n    IMP targetMethodIMP = method_getImplementation(targetMethod);\n    if (aspect_isMsgForwardIMP(targetMethodIMP)) {\n        // Restore the original method implementation.\n        const char *typeEncoding = method_getTypeEncoding(targetMethod);\n        SEL aliasSelector = aspect_aliasForSelector(selector);\n        Method originalMethod = class_getInstanceMethod(klass, aliasSelector);\n        IMP originalIMP = method_getImplementation(originalMethod);\n        NSCAssert(originalMethod, @\"Original implementation for %@ not found %@ on %@\", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), klass);\n\n        class_replaceMethod(klass, selector, originalIMP, typeEncoding);\n        AspectLog(@\"Aspects: Removed hook for -[%@ %@].\", klass, NSStringFromSelector(selector));\n    }\n\n    // Deregister global tracked selector\n    aspect_deregisterTrackedSelector(self, selector);\n\n    // Get the aspect container and check if there are any hooks remaining. Clean up if there are not.\n    AspectsContainer *container = aspect_getContainerForObject(self, selector);\n    if (!container.hasAspects) {\n        // Destroy the container\n        aspect_destroyContainerForObject(self, selector);\n\n        // Figure out how the class was modified to undo the changes.\n        NSString *className = NSStringFromClass(klass);\n        if ([className hasSuffix:AspectsSubclassSuffix]) {\n            Class originalClass = NSClassFromString([className stringByReplacingOccurrencesOfString:AspectsSubclassSuffix withString:@\"\"]);\n            NSCAssert(originalClass != nil, @\"Original class must exist\");\n            object_setClass(self, originalClass);\n            AspectLog(@\"Aspects: %@ has been restored.\", NSStringFromClass(originalClass));\n\n            // We can only dispose the class pair if we can ensure that no instances exist using our subclass.\n            // Since we don't globally track this, we can't ensure this - but there's also not much overhead in keeping it around.\n            //objc_disposeClassPair(object.class);\n        }else {\n            // Class is most likely swizzled in place. Undo that.\n            if (isMetaClass) {\n                aspect_undoSwizzleClassInPlace((Class)self);\n            }else if (self.class != klass) {\n            \taspect_undoSwizzleClassInPlace(klass);\n            }\n        }\n    }\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Hook Class\n\nstatic Class aspect_hookClass(NSObject *self, NSError **error) {\n    NSCParameterAssert(self);\n\tClass statedClass = self.class;\n\tClass baseClass = object_getClass(self);\n\tNSString *className = NSStringFromClass(baseClass);\n\n    // Already subclassed\n\tif ([className hasSuffix:AspectsSubclassSuffix]) {\n\t\treturn baseClass;\n\n        // We swizzle a class object, not a single object.\n\t}else if (class_isMetaClass(baseClass)) {\n        return aspect_swizzleClassInPlace((Class)self);\n        // Probably a KVO'ed class. Swizzle in place. Also swizzle meta classes in place.\n    }else if (statedClass != baseClass) {\n        return aspect_swizzleClassInPlace(baseClass);\n    }\n\n    // Default case. Create dynamic subclass.\n\tconst char *subclassName = [className stringByAppendingString:AspectsSubclassSuffix].UTF8String;\n\tClass subclass = objc_getClass(subclassName);\n\n\tif (subclass == nil) {\n\t\tsubclass = objc_allocateClassPair(baseClass, subclassName, 0);\n\t\tif (subclass == nil) {\n            NSString *errrorDesc = [NSString stringWithFormat:@\"objc_allocateClassPair failed to allocate class %s.\", subclassName];\n            AspectError(AspectErrorFailedToAllocateClassPair, errrorDesc);\n            return nil;\n        }\n\n\t\taspect_swizzleForwardInvocation(subclass);\n\t\taspect_hookedGetClass(subclass, statedClass);\n\t\taspect_hookedGetClass(object_getClass(subclass), statedClass);\n\t\tobjc_registerClassPair(subclass);\n\t}\n\n\tobject_setClass(self, subclass);\n\treturn subclass;\n}\n\nstatic NSString *const AspectsForwardInvocationSelectorName = @\"__aspects_forwardInvocation:\";\nstatic void aspect_swizzleForwardInvocation(Class klass) {\n    NSCParameterAssert(klass);\n    // If there is no method, replace will act like class_addMethod.\n    IMP originalImplementation = class_replaceMethod(klass, @selector(forwardInvocation:), (IMP)__ASPECTS_ARE_BEING_CALLED__, \"v@:@\");\n    if (originalImplementation) {\n        class_addMethod(klass, NSSelectorFromString(AspectsForwardInvocationSelectorName), originalImplementation, \"v@:@\");\n    }\n    AspectLog(@\"Aspects: %@ is now aspect aware.\", NSStringFromClass(klass));\n}\n\nstatic void aspect_undoSwizzleForwardInvocation(Class klass) {\n    NSCParameterAssert(klass);\n    Method originalMethod = class_getInstanceMethod(klass, NSSelectorFromString(AspectsForwardInvocationSelectorName));\n    Method objectMethod = class_getInstanceMethod(NSObject.class, @selector(forwardInvocation:));\n    // There is no class_removeMethod, so the best we can do is to retore the original implementation, or use a dummy.\n    IMP originalImplementation = method_getImplementation(originalMethod ?: objectMethod);\n    class_replaceMethod(klass, @selector(forwardInvocation:), originalImplementation, \"v@:@\");\n\n    AspectLog(@\"Aspects: %@ has been restored.\", NSStringFromClass(klass));\n}\n\nstatic void aspect_hookedGetClass(Class class, Class statedClass) {\n    NSCParameterAssert(class);\n    NSCParameterAssert(statedClass);\n\tMethod method = class_getInstanceMethod(class, @selector(class));\n\tIMP newIMP = imp_implementationWithBlock(^(id self) {\n\t\treturn statedClass;\n\t});\n\tclass_replaceMethod(class, @selector(class), newIMP, method_getTypeEncoding(method));\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Swizzle Class In Place\n\nstatic void _aspect_modifySwizzledClasses(void (^block)(NSMutableSet *swizzledClasses)) {\n    static NSMutableSet *swizzledClasses;\n    static dispatch_once_t pred;\n    dispatch_once(&pred, ^{\n        swizzledClasses = [NSMutableSet new];\n    });\n    @synchronized(swizzledClasses) {\n        block(swizzledClasses);\n    }\n}\n\nstatic Class aspect_swizzleClassInPlace(Class klass) {\n    NSCParameterAssert(klass);\n    NSString *className = NSStringFromClass(klass);\n\n    _aspect_modifySwizzledClasses(^(NSMutableSet *swizzledClasses) {\n        if (![swizzledClasses containsObject:className]) {\n            aspect_swizzleForwardInvocation(klass);\n            [swizzledClasses addObject:className];\n        }\n    });\n    return klass;\n}\n\nstatic void aspect_undoSwizzleClassInPlace(Class klass) {\n    NSCParameterAssert(klass);\n    NSString *className = NSStringFromClass(klass);\n\n    _aspect_modifySwizzledClasses(^(NSMutableSet *swizzledClasses) {\n        if ([swizzledClasses containsObject:className]) {\n            aspect_undoSwizzleForwardInvocation(klass);\n            [swizzledClasses removeObject:className];\n        }\n    });\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Aspect Invoke Point\n\n// This is a macro so we get a cleaner stack trace.\n#define aspect_invoke(aspects, info) \\\nfor (AspectIdentifier *aspect in aspects) {\\\n    [aspect invokeWithInfo:info];\\\n    if (aspect.options & AspectOptionAutomaticRemoval) { \\\n        aspectsToRemove = [aspectsToRemove?:@[] arrayByAddingObject:aspect]; \\\n    } \\\n}\n\n// This is the swizzled forwardInvocation: method.\nstatic void __ASPECTS_ARE_BEING_CALLED__(__unsafe_unretained NSObject *self, SEL selector, NSInvocation *invocation) {\n    NSCParameterAssert(self);\n    NSCParameterAssert(invocation);\n    SEL originalSelector = invocation.selector;\n\tSEL aliasSelector = aspect_aliasForSelector(invocation.selector);\n    invocation.selector = aliasSelector;\n    AspectsContainer *objectContainer = objc_getAssociatedObject(self, aliasSelector);\n    AspectsContainer *classContainer = aspect_getContainerForClass(object_getClass(self), aliasSelector);\n    AspectInfo *info = [[AspectInfo alloc] initWithInstance:self invocation:invocation];\n    NSArray *aspectsToRemove = nil;\n\n    // Before hooks.\n    aspect_invoke(classContainer.beforeAspects, info);\n    aspect_invoke(objectContainer.beforeAspects, info);\n\n    // Instead hooks.\n    BOOL respondsToAlias = YES;\n    if (objectContainer.insteadAspects.count || classContainer.insteadAspects.count) {\n        aspect_invoke(classContainer.insteadAspects, info);\n        aspect_invoke(objectContainer.insteadAspects, info);\n    }else {\n        Class klass = object_getClass(invocation.target);\n        do {\n            if ((respondsToAlias = [klass instancesRespondToSelector:aliasSelector])) {\n                [invocation invoke];\n                break;\n            }\n        }while (!respondsToAlias && (klass = class_getSuperclass(klass)));\n    }\n\n    // After hooks.\n    aspect_invoke(classContainer.afterAspects, info);\n    aspect_invoke(objectContainer.afterAspects, info);\n\n    // If no hooks are installed, call original implementation (usually to throw an exception)\n    if (!respondsToAlias) {\n        invocation.selector = originalSelector;\n        SEL originalForwardInvocationSEL = NSSelectorFromString(AspectsForwardInvocationSelectorName);\n        if ([self respondsToSelector:originalForwardInvocationSEL]) {\n            ((void( *)(id, SEL, NSInvocation *))objc_msgSend)(self, originalForwardInvocationSEL, invocation);\n        }else {\n            [self doesNotRecognizeSelector:invocation.selector];\n        }\n    }\n\n    // Remove any hooks that are queued for deregistration.\n    [aspectsToRemove makeObjectsPerformSelector:@selector(remove)];\n}\n#undef aspect_invoke\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Aspect Container Management\n\n// Loads or creates the aspect container.\nstatic AspectsContainer *aspect_getContainerForObject(NSObject *self, SEL selector) {\n    NSCParameterAssert(self);\n    SEL aliasSelector = aspect_aliasForSelector(selector);\n    AspectsContainer *aspectContainer = objc_getAssociatedObject(self, aliasSelector);\n    if (!aspectContainer) {\n        aspectContainer = [AspectsContainer new];\n        objc_setAssociatedObject(self, aliasSelector, aspectContainer, OBJC_ASSOCIATION_RETAIN);\n    }\n    return aspectContainer;\n}\n\nstatic AspectsContainer *aspect_getContainerForClass(Class klass, SEL selector) {\n    NSCParameterAssert(klass);\n    AspectsContainer *classContainer = nil;\n    do {\n        classContainer = objc_getAssociatedObject(klass, selector);\n        if (classContainer.hasAspects) break;\n    }while ((klass = class_getSuperclass(klass)));\n\n    return classContainer;\n}\n\nstatic void aspect_destroyContainerForObject(id<NSObject> self, SEL selector) {\n    NSCParameterAssert(self);\n    SEL aliasSelector = aspect_aliasForSelector(selector);\n    objc_setAssociatedObject(self, aliasSelector, nil, OBJC_ASSOCIATION_RETAIN);\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Selector Blacklist Checking\n\nstatic NSMutableDictionary *aspect_getSwizzledClassesDict() {\n    static NSMutableDictionary *swizzledClassesDict;\n    static dispatch_once_t pred;\n    dispatch_once(&pred, ^{\n        swizzledClassesDict = [NSMutableDictionary new];\n    });\n    return swizzledClassesDict;\n}\n\nstatic BOOL aspect_isSelectorAllowedAndTrack(NSObject *self, SEL selector, AspectOptions options, NSError **error) {\n    static NSSet *disallowedSelectorList;\n    static dispatch_once_t pred;\n    dispatch_once(&pred, ^{\n        disallowedSelectorList = [NSSet setWithObjects:@\"retain\", @\"release\", @\"autorelease\", @\"forwardInvocation:\", nil];\n    });\n\n    // Check against the blacklist.\n    NSString *selectorName = NSStringFromSelector(selector);\n    if ([disallowedSelectorList containsObject:selectorName]) {\n        NSString *errorDescription = [NSString stringWithFormat:@\"Selector %@ is blacklisted.\", selectorName];\n        AspectError(AspectErrorSelectorBlacklisted, errorDescription);\n        return NO;\n    }\n\n    // Additional checks.\n    AspectOptions position = options&AspectPositionFilter;\n    if ([selectorName isEqualToString:@\"dealloc\"] && position != AspectPositionBefore) {\n        NSString *errorDesc = @\"AspectPositionBefore is the only valid position when hooking dealloc.\";\n        AspectError(AspectErrorSelectorDeallocPosition, errorDesc);\n        return NO;\n    }\n\n    if (![self respondsToSelector:selector] && ![self.class instancesRespondToSelector:selector]) {\n        NSString *errorDesc = [NSString stringWithFormat:@\"Unable to find selector -[%@ %@].\", NSStringFromClass(self.class), selectorName];\n        AspectError(AspectErrorDoesNotRespondToSelector, errorDesc);\n        return NO;\n    }\n\n    // Search for the current class and the class hierarchy IF we are modifying a class object\n    if (class_isMetaClass(object_getClass(self))) {\n        Class klass = [self class];\n        NSMutableDictionary *swizzledClassesDict = aspect_getSwizzledClassesDict();\n        Class currentClass = [self class];\n\n        AspectTracker *tracker = swizzledClassesDict[currentClass];\n        if ([tracker subclassHasHookedSelectorName:selectorName]) {\n            NSSet *subclassTracker = [tracker subclassTrackersHookingSelectorName:selectorName];\n            NSSet *subclassNames = [subclassTracker valueForKey:@\"trackedClassName\"];\n            NSString *errorDescription = [NSString stringWithFormat:@\"Error: %@ already hooked subclasses: %@. A method can only be hooked once per class hierarchy.\", selectorName, subclassNames];\n            AspectError(AspectErrorSelectorAlreadyHookedInClassHierarchy, errorDescription);\n            return NO;\n        }\n\n        do {\n            tracker = swizzledClassesDict[currentClass];\n            if ([tracker.selectorNames containsObject:selectorName]) {\n                if (klass == currentClass) {\n                    // Already modified and topmost!\n                    return YES;\n                }\n                NSString *errorDescription = [NSString stringWithFormat:@\"Error: %@ already hooked in %@. A method can only be hooked once per class hierarchy.\", selectorName, NSStringFromClass(currentClass)];\n                AspectError(AspectErrorSelectorAlreadyHookedInClassHierarchy, errorDescription);\n                return NO;\n            }\n        } while ((currentClass = class_getSuperclass(currentClass)));\n\n        // Add the selector as being modified.\n        currentClass = klass;\n        AspectTracker *subclassTracker = nil;\n        do {\n            tracker = swizzledClassesDict[currentClass];\n            if (!tracker) {\n                tracker = [[AspectTracker alloc] initWithTrackedClass:currentClass];\n                swizzledClassesDict[(id<NSCopying>)currentClass] = tracker;\n            }\n            if (subclassTracker) {\n                [tracker addSubclassTracker:subclassTracker hookingSelectorName:selectorName];\n            } else {\n                [tracker.selectorNames addObject:selectorName];\n            }\n\n            // All superclasses get marked as having a subclass that is modified.\n            subclassTracker = tracker;\n        }while ((currentClass = class_getSuperclass(currentClass)));\n\t} else {\n\t\treturn YES;\n\t}\n\n    return YES;\n}\n\nstatic void aspect_deregisterTrackedSelector(id self, SEL selector) {\n    if (!class_isMetaClass(object_getClass(self))) return;\n\n    NSMutableDictionary *swizzledClassesDict = aspect_getSwizzledClassesDict();\n    NSString *selectorName = NSStringFromSelector(selector);\n    Class currentClass = [self class];\n    AspectTracker *subclassTracker = nil;\n    do {\n        AspectTracker *tracker = swizzledClassesDict[currentClass];\n        if (subclassTracker) {\n            [tracker removeSubclassTracker:subclassTracker hookingSelectorName:selectorName];\n        } else {\n            [tracker.selectorNames removeObject:selectorName];\n        }\n        if (tracker.selectorNames.count == 0 && tracker.selectorNamesToSubclassTrackers) {\n            [swizzledClassesDict removeObjectForKey:currentClass];\n        }\n        subclassTracker = tracker;\n    }while ((currentClass = class_getSuperclass(currentClass)));\n}\n\n@end\n\n@implementation AspectTracker\n\n- (id)initWithTrackedClass:(Class)trackedClass {\n    if (self = [super init]) {\n        _trackedClass = trackedClass;\n        _selectorNames = [NSMutableSet new];\n        _selectorNamesToSubclassTrackers = [NSMutableDictionary new];\n    }\n    return self;\n}\n\n- (BOOL)subclassHasHookedSelectorName:(NSString *)selectorName {\n    return self.selectorNamesToSubclassTrackers[selectorName] != nil;\n}\n\n- (void)addSubclassTracker:(AspectTracker *)subclassTracker hookingSelectorName:(NSString *)selectorName {\n    NSMutableSet *trackerSet = self.selectorNamesToSubclassTrackers[selectorName];\n    if (!trackerSet) {\n        trackerSet = [NSMutableSet new];\n        self.selectorNamesToSubclassTrackers[selectorName] = trackerSet;\n    }\n    [trackerSet addObject:subclassTracker];\n}\n- (void)removeSubclassTracker:(AspectTracker *)subclassTracker hookingSelectorName:(NSString *)selectorName {\n    NSMutableSet *trackerSet = self.selectorNamesToSubclassTrackers[selectorName];\n    [trackerSet removeObject:subclassTracker];\n    if (trackerSet.count == 0) {\n        [self.selectorNamesToSubclassTrackers removeObjectForKey:selectorName];\n    }\n}\n- (NSSet *)subclassTrackersHookingSelectorName:(NSString *)selectorName {\n    NSMutableSet *hookingSubclassTrackers = [NSMutableSet new];\n    for (AspectTracker *tracker in self.selectorNamesToSubclassTrackers[selectorName]) {\n        if ([tracker.selectorNames containsObject:selectorName]) {\n            [hookingSubclassTrackers addObject:tracker];\n        }\n        [hookingSubclassTrackers unionSet:[tracker subclassTrackersHookingSelectorName:selectorName]];\n    }\n    return hookingSubclassTrackers;\n}\n- (NSString *)trackedClassName {\n    return NSStringFromClass(self.trackedClass);\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %@, trackedClass: %@, selectorNames:%@, subclass selector names: %@>\", self.class, self, NSStringFromClass(self.trackedClass), self.selectorNames, self.selectorNamesToSubclassTrackers.allKeys];\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - NSInvocation (Aspects)\n\n@implementation NSInvocation (Aspects)\n\n// Thanks to the ReactiveCocoa team for providing a generic solution for this.\n- (id)aspect_argumentAtIndex:(NSUInteger)index {\n\tconst char *argType = [self.methodSignature getArgumentTypeAtIndex:index];\n\t// Skip const type qualifier.\n\tif (argType[0] == _C_CONST) argType++;\n\n#define WRAP_AND_RETURN(type) do { type val = 0; [self getArgument:&val atIndex:(NSInteger)index]; return @(val); } while (0)\n\tif (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) {\n\t\t__autoreleasing id returnObj;\n\t\t[self getArgument:&returnObj atIndex:(NSInteger)index];\n\t\treturn returnObj;\n\t} else if (strcmp(argType, @encode(SEL)) == 0) {\n        SEL selector = 0;\n        [self getArgument:&selector atIndex:(NSInteger)index];\n        return NSStringFromSelector(selector);\n    } else if (strcmp(argType, @encode(Class)) == 0) {\n        __autoreleasing Class theClass = Nil;\n        [self getArgument:&theClass atIndex:(NSInteger)index];\n        return theClass;\n        // Using this list will box the number with the appropriate constructor, instead of the generic NSValue.\n\t} else if (strcmp(argType, @encode(char)) == 0) {\n\t\tWRAP_AND_RETURN(char);\n\t} else if (strcmp(argType, @encode(int)) == 0) {\n\t\tWRAP_AND_RETURN(int);\n\t} else if (strcmp(argType, @encode(short)) == 0) {\n\t\tWRAP_AND_RETURN(short);\n\t} else if (strcmp(argType, @encode(long)) == 0) {\n\t\tWRAP_AND_RETURN(long);\n\t} else if (strcmp(argType, @encode(long long)) == 0) {\n\t\tWRAP_AND_RETURN(long long);\n\t} else if (strcmp(argType, @encode(unsigned char)) == 0) {\n\t\tWRAP_AND_RETURN(unsigned char);\n\t} else if (strcmp(argType, @encode(unsigned int)) == 0) {\n\t\tWRAP_AND_RETURN(unsigned int);\n\t} else if (strcmp(argType, @encode(unsigned short)) == 0) {\n\t\tWRAP_AND_RETURN(unsigned short);\n\t} else if (strcmp(argType, @encode(unsigned long)) == 0) {\n\t\tWRAP_AND_RETURN(unsigned long);\n\t} else if (strcmp(argType, @encode(unsigned long long)) == 0) {\n\t\tWRAP_AND_RETURN(unsigned long long);\n\t} else if (strcmp(argType, @encode(float)) == 0) {\n\t\tWRAP_AND_RETURN(float);\n\t} else if (strcmp(argType, @encode(double)) == 0) {\n\t\tWRAP_AND_RETURN(double);\n\t} else if (strcmp(argType, @encode(BOOL)) == 0) {\n\t\tWRAP_AND_RETURN(BOOL);\n\t} else if (strcmp(argType, @encode(bool)) == 0) {\n\t\tWRAP_AND_RETURN(BOOL);\n\t} else if (strcmp(argType, @encode(char *)) == 0) {\n\t\tWRAP_AND_RETURN(const char *);\n\t} else if (strcmp(argType, @encode(void (^)(void))) == 0) {\n\t\t__unsafe_unretained id block = nil;\n\t\t[self getArgument:&block atIndex:(NSInteger)index];\n\t\treturn [block copy];\n\t} else {\n\t\tNSUInteger valueSize = 0;\n\t\tNSGetSizeAndAlignment(argType, &valueSize, NULL);\n\n\t\tunsigned char valueBytes[valueSize];\n\t\t[self getArgument:valueBytes atIndex:(NSInteger)index];\n\n\t\treturn [NSValue valueWithBytes:valueBytes objCType:argType];\n\t}\n\treturn nil;\n#undef WRAP_AND_RETURN\n}\n\n- (NSArray *)aspects_arguments {\n\tNSMutableArray *argumentsArray = [NSMutableArray array];\n\tfor (NSUInteger idx = 2; idx < self.methodSignature.numberOfArguments; idx++) {\n\t\t[argumentsArray addObject:[self aspect_argumentAtIndex:idx] ?: NSNull.null];\n\t}\n\treturn [argumentsArray copy];\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - AspectIdentifier\n\n@implementation AspectIdentifier\n\n+ (instancetype)identifierWithSelector:(SEL)selector object:(id)object options:(AspectOptions)options block:(id)block error:(NSError **)error {\n    NSCParameterAssert(block);\n    NSCParameterAssert(selector);\n    NSMethodSignature *blockSignature = aspect_blockMethodSignature(block, error); // TODO: check signature compatibility, etc.\n    if (!aspect_isCompatibleBlockSignature(blockSignature, object, selector, error)) {\n        return nil;\n    }\n\n    AspectIdentifier *identifier = nil;\n    if (blockSignature) {\n        identifier = [AspectIdentifier new];\n        identifier.selector = selector;\n        identifier.block = block;\n        identifier.blockSignature = blockSignature;\n        identifier.options = options;\n        identifier.object = object; // weak\n    }\n    return identifier;\n}\n\n- (BOOL)invokeWithInfo:(id<AspectInfo>)info {\n    NSInvocation *blockInvocation = [NSInvocation invocationWithMethodSignature:self.blockSignature];\n    NSInvocation *originalInvocation = info.originalInvocation;\n    NSUInteger numberOfArguments = self.blockSignature.numberOfArguments;\n\n    // Be extra paranoid. We already check that on hook registration.\n    if (numberOfArguments > originalInvocation.methodSignature.numberOfArguments) {\n        AspectLogError(@\"Block has too many arguments. Not calling %@\", info);\n        return NO;\n    }\n\n    // The `self` of the block will be the AspectInfo. Optional.\n    if (numberOfArguments > 1) {\n        [blockInvocation setArgument:&info atIndex:1];\n    }\n    \n\tvoid *argBuf = NULL;\n    for (NSUInteger idx = 2; idx < numberOfArguments; idx++) {\n        const char *type = [originalInvocation.methodSignature getArgumentTypeAtIndex:idx];\n\t\tNSUInteger argSize;\n\t\tNSGetSizeAndAlignment(type, &argSize, NULL);\n        \n\t\tif (!(argBuf = reallocf(argBuf, argSize))) {\n            AspectLogError(@\"Failed to allocate memory for block invocation.\");\n\t\t\treturn NO;\n\t\t}\n        \n\t\t[originalInvocation getArgument:argBuf atIndex:idx];\n\t\t[blockInvocation setArgument:argBuf atIndex:idx];\n    }\n    \n    [blockInvocation invokeWithTarget:self.block];\n    \n    if (argBuf != NULL) {\n        free(argBuf);\n    }\n    return YES;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %p, SEL:%@ object:%@ options:%tu block:%@ (#%tu args)>\", self.class, self, NSStringFromSelector(self.selector), self.object, self.options, self.block, self.blockSignature.numberOfArguments];\n}\n\n- (BOOL)remove {\n    return aspect_remove(self, NULL);\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - AspectsContainer\n\n@implementation AspectsContainer\n\n- (BOOL)hasAspects {\n    return self.beforeAspects.count > 0 || self.insteadAspects.count > 0 || self.afterAspects.count > 0;\n}\n\n- (void)addAspect:(AspectIdentifier *)aspect withOptions:(AspectOptions)options {\n    NSParameterAssert(aspect);\n    NSUInteger position = options&AspectPositionFilter;\n    switch (position) {\n        case AspectPositionBefore:  self.beforeAspects  = [(self.beforeAspects ?:@[]) arrayByAddingObject:aspect]; break;\n        case AspectPositionInstead: self.insteadAspects = [(self.insteadAspects?:@[]) arrayByAddingObject:aspect]; break;\n        case AspectPositionAfter:   self.afterAspects   = [(self.afterAspects  ?:@[]) arrayByAddingObject:aspect]; break;\n    }\n}\n\n- (BOOL)removeAspect:(id)aspect {\n    for (NSString *aspectArrayName in @[NSStringFromSelector(@selector(beforeAspects)),\n                                        NSStringFromSelector(@selector(insteadAspects)),\n                                        NSStringFromSelector(@selector(afterAspects))]) {\n        NSArray *array = [self valueForKey:aspectArrayName];\n        NSUInteger index = [array indexOfObjectIdenticalTo:aspect];\n        if (array && index != NSNotFound) {\n            NSMutableArray *newArray = [NSMutableArray arrayWithArray:array];\n            [newArray removeObjectAtIndex:index];\n            [self setValue:newArray forKey:aspectArrayName];\n            return YES;\n        }\n    }\n    return NO;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %p, before:%@, instead:%@, after:%@>\", self.class, self, self.beforeAspects, self.insteadAspects, self.afterAspects];\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - AspectInfo\n\n@implementation AspectInfo\n\n@synthesize arguments = _arguments;\n\n- (id)initWithInstance:(__unsafe_unretained id)instance invocation:(NSInvocation *)invocation {\n    NSCParameterAssert(instance);\n    NSCParameterAssert(invocation);\n    if (self = [super init]) {\n        _instance = instance;\n        _originalInvocation = invocation;\n    }\n    return self;\n}\n\n- (NSArray *)arguments {\n    // Lazily evaluate arguments, boxing is expensive.\n    if (!_arguments) {\n        _arguments = self.originalInvocation.aspects_arguments;\n    }\n    return _arguments;\n}\n\n@end\n"
  },
  {
    "path": "Aspects.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name         = \"Aspects\"\n  s.version      = \"1.4.1\"\n  s.summary      = \"Delightful, simple library for aspect oriented programming.\"\n  s.homepage     = \"https://github.com/steipete/Aspects\"\n  s.license      = { :type => 'MIT', :file => 'LICENSE' }\n  s.author       = { \"Peter Steinberger\" => \"steipete@gmail.com\" }\n  s.ios.deployment_target = '6.0'\n  s.osx.deployment_target = '10.7'\n  s.source       = { :git => \"https://github.com/steipete/Aspects.git\", :tag => \"#{s.version}\" }\n  s.source_files  = 'Aspects.{h,m}'\n  s.requires_arc = true;\n  s.social_media_url = \"https://twitter.com/steipete\"\nend\n"
  },
  {
    "path": "Aspects.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\t34B986851B1DE2BE00DE719D /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B986841B1DE2BE00DE719D /* Aspects.m */; };\n\t\t34B986861B1DE2E300DE719D /* Aspects.h in Headers */ = {isa = PBXBuildFile; fileRef = 34B9866C1B1DE0CE00DE719D /* Aspects.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t34B986A51B1E491000DE719D /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B986841B1DE2BE00DE719D /* Aspects.m */; };\n\t\t34B986A61B1E491300DE719D /* Aspects.h in Headers */ = {isa = PBXBuildFile; fileRef = 34B9866C1B1DE0CE00DE719D /* Aspects.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7376F8CD1B8EA767009CAB74 /* Aspects.h in Headers */ = {isa = PBXBuildFile; fileRef = 34B9866C1B1DE0CE00DE719D /* Aspects.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7376F8D61B8EB1FA009CAB74 /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B986841B1DE2BE00DE719D /* Aspects.m */; settings = {ASSET_TAGS = (); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t34B986671B1DE0CE00DE719D /* Aspects.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Aspects.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t34B9866B1B1DE0CE00DE719D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t34B9866C1B1DE0CE00DE719D /* Aspects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Aspects.h; sourceTree = \"<group>\"; };\n\t\t34B986841B1DE2BE00DE719D /* Aspects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Aspects.m; sourceTree = \"<group>\"; };\n\t\t34B9868C1B1E48CD00DE719D /* Aspects.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Aspects.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7376F8C31B8EA670009CAB74 /* Aspects.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Aspects.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7376F8C71B8EA670009CAB74 /* Info-watch.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Info-watch.plist\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t34B986631B1DE0CE00DE719D /* 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\t34B986881B1E48CD00DE719D /* 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\t7376F8BF1B8EA670009CAB74 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t34B9865D1B1DE0CE00DE719D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B986691B1DE0CE00DE719D /* Aspects */,\n\t\t\t\t34B986681B1DE0CE00DE719D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34B986681B1DE0CE00DE719D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B986671B1DE0CE00DE719D /* Aspects.framework */,\n\t\t\t\t34B9868C1B1E48CD00DE719D /* Aspects.framework */,\n\t\t\t\t7376F8C31B8EA670009CAB74 /* Aspects.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34B986691B1DE0CE00DE719D /* Aspects */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B9866C1B1DE0CE00DE719D /* Aspects.h */,\n\t\t\t\t34B986841B1DE2BE00DE719D /* Aspects.m */,\n\t\t\t\t34B9866A1B1DE0CE00DE719D /* Supporting Files */,\n\t\t\t);\n\t\t\tname = Aspects;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34B9866A1B1DE0CE00DE719D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B9866B1B1DE0CE00DE719D /* Info.plist */,\n\t\t\t\t7376F8C71B8EA670009CAB74 /* Info-watch.plist */,\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\t34B986641B1DE0CE00DE719D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34B986861B1DE2E300DE719D /* Aspects.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t34B986891B1E48CD00DE719D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34B986A61B1E491300DE719D /* Aspects.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7376F8C01B8EA670009CAB74 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7376F8CD1B8EA767009CAB74 /* Aspects.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\t34B986661B1DE0CE00DE719D /* Aspects-iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 34B9867D1B1DE0CE00DE719D /* Build configuration list for PBXNativeTarget \"Aspects-iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t34B986621B1DE0CE00DE719D /* Sources */,\n\t\t\t\t34B986631B1DE0CE00DE719D /* Frameworks */,\n\t\t\t\t34B986641B1DE0CE00DE719D /* Headers */,\n\t\t\t\t34B986651B1DE0CE00DE719D /* 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 = \"Aspects-iOS\";\n\t\t\tproductName = Aspects;\n\t\t\tproductReference = 34B986671B1DE0CE00DE719D /* Aspects.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t34B9868B1B1E48CD00DE719D /* Aspects-Mac */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 34B9869F1B1E48CE00DE719D /* Build configuration list for PBXNativeTarget \"Aspects-Mac\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t34B986871B1E48CD00DE719D /* Sources */,\n\t\t\t\t34B986881B1E48CD00DE719D /* Frameworks */,\n\t\t\t\t34B986891B1E48CD00DE719D /* Headers */,\n\t\t\t\t34B9868A1B1E48CD00DE719D /* 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 = \"Aspects-Mac\";\n\t\t\tproductName = Aspects;\n\t\t\tproductReference = 34B9868C1B1E48CD00DE719D /* Aspects.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t7376F8C21B8EA670009CAB74 /* Aspects-watchOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7376F8CA1B8EA670009CAB74 /* Build configuration list for PBXNativeTarget \"Aspects-watchOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7376F8BE1B8EA670009CAB74 /* Sources */,\n\t\t\t\t7376F8BF1B8EA670009CAB74 /* Frameworks */,\n\t\t\t\t7376F8C01B8EA670009CAB74 /* Headers */,\n\t\t\t\t7376F8C11B8EA670009CAB74 /* 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 = \"Aspects-watchOS\";\n\t\t\tproductName = \"Aspects-watchOS\";\n\t\t\tproductReference = 7376F8C31B8EA670009CAB74 /* Aspects.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t34B9865E1B1DE0CE00DE719D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0630;\n\t\t\t\tORGANIZATIONNAME = \"Peter Steinberger\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t34B986661B1DE0CE00DE719D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.1;\n\t\t\t\t\t};\n\t\t\t\t\t34B9868B1B1E48CD00DE719D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.1;\n\t\t\t\t\t};\n\t\t\t\t\t7376F8C21B8EA670009CAB74 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 34B986611B1DE0CE00DE719D /* Build configuration list for PBXProject \"Aspects\" */;\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 = 34B9865D1B1DE0CE00DE719D;\n\t\t\tproductRefGroup = 34B986681B1DE0CE00DE719D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t34B986661B1DE0CE00DE719D /* Aspects-iOS */,\n\t\t\t\t34B9868B1B1E48CD00DE719D /* Aspects-Mac */,\n\t\t\t\t7376F8C21B8EA670009CAB74 /* Aspects-watchOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t34B986651B1DE0CE00DE719D /* 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\t34B9868A1B1E48CD00DE719D /* 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\t7376F8C11B8EA670009CAB74 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t34B986621B1DE0CE00DE719D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34B986851B1DE2BE00DE719D /* Aspects.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t34B986871B1E48CD00DE719D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34B986A51B1E491000DE719D /* Aspects.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7376F8BE1B8EA670009CAB74 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7376F8D61B8EB1FA009CAB74 /* Aspects.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t34B9867B1B1DE0CE00DE719D /* 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_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = 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_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\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\t34B9867C1B1DE0CE00DE719D /* 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_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\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\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\t34B9867E1B1DE0CE00DE719D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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\tINFOPLIST_FILE = \"$(SRCROOT)/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\tPRODUCT_NAME = Aspects;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t34B9867F1B1DE0CE00DE719D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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\tINFOPLIST_FILE = \"$(SRCROOT)/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\tPRODUCT_NAME = Aspects;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t34B986A01B1E48CE00DE719D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\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\tFRAMEWORK_VERSION = A;\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 = \"$(SRCROOT)/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\tPRODUCT_NAME = Aspects;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t34B986A11B1E48CE00DE719D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\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\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/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\tPRODUCT_NAME = Aspects;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7376F8C81B8EA670009CAB74 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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_TESTABILITY = YES;\n\t\t\t\tINFOPLIST_FILE = \"Info-watch.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\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pspdfkit.Aspects-watchOS\";\n\t\t\t\tPRODUCT_NAME = Aspects;\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\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7376F8C91B8EA670009CAB74 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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\tINFOPLIST_FILE = \"Info-watch.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\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pspdfkit.Aspects-watchOS\";\n\t\t\t\tPRODUCT_NAME = Aspects;\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\tWATCHOS_DEPLOYMENT_TARGET = 2.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t34B986611B1DE0CE00DE719D /* Build configuration list for PBXProject \"Aspects\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t34B9867B1B1DE0CE00DE719D /* Debug */,\n\t\t\t\t34B9867C1B1DE0CE00DE719D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t34B9867D1B1DE0CE00DE719D /* Build configuration list for PBXNativeTarget \"Aspects-iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t34B9867E1B1DE0CE00DE719D /* Debug */,\n\t\t\t\t34B9867F1B1DE0CE00DE719D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t34B9869F1B1E48CE00DE719D /* Build configuration list for PBXNativeTarget \"Aspects-Mac\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t34B986A01B1E48CE00DE719D /* Debug */,\n\t\t\t\t34B986A11B1E48CE00DE719D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7376F8CA1B8EA670009CAB74 /* Build configuration list for PBXNativeTarget \"Aspects-watchOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7376F8C81B8EA670009CAB74 /* Debug */,\n\t\t\t\t7376F8C91B8EA670009CAB74 /* 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 = 34B9865E1B1DE0CE00DE719D /* Project object */;\n}\n"
  },
  {
    "path": "Aspects.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Aspects.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Aspects.xcodeproj/project.xcworkspace/xcshareddata/Aspects.xccheckout",
    "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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>4228F3E1-0517-43F3-919E-B521720D6F24</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>Aspects</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>8B3366FBF9699A8CCB764F44E854D1F695C54A83</key>\n\t\t<string>https://github.com/steipete/Aspects.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>Aspects.xcodeproj</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>8B3366FBF9699A8CCB764F44E854D1F695C54A83</key>\n\t\t<string>../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/steipete/Aspects.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>8B3366FBF9699A8CCB764F44E854D1F695C54A83</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>8B3366FBF9699A8CCB764F44E854D1F695C54A83</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Aspects</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Aspects.xcodeproj/xcshareddata/xcschemes/Aspects-Mac.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0630\"\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 = \"34B9868B1B1E48CD00DE719D\"\n               BuildableName = \"Aspects.framework\"\n               BlueprintName = \"Aspects-Mac\"\n               ReferencedContainer = \"container:Aspects.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"34B9868B1B1E48CD00DE719D\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-Mac\"\n            ReferencedContainer = \"container:Aspects.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"34B9868B1B1E48CD00DE719D\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-Mac\"\n            ReferencedContainer = \"container:Aspects.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": "Aspects.xcodeproj/xcshareddata/xcschemes/Aspects-iOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0630\"\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 = \"34B986661B1DE0CE00DE719D\"\n               BuildableName = \"Aspects.framework\"\n               BlueprintName = \"Aspects-iOS\"\n               ReferencedContainer = \"container:Aspects.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"34B986661B1DE0CE00DE719D\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-iOS\"\n            ReferencedContainer = \"container:Aspects.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"34B986661B1DE0CE00DE719D\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-iOS\"\n            ReferencedContainer = \"container:Aspects.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": "Aspects.xcodeproj/xcshareddata/xcschemes/Aspects-watchOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0700\"\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 = \"7376F8C21B8EA670009CAB74\"\n               BuildableName = \"Aspects.framework\"\n               BlueprintName = \"Aspects-watchOS\"\n               ReferencedContainer = \"container:Aspects.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 = \"7376F8C21B8EA670009CAB74\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-watchOS\"\n            ReferencedContainer = \"container:Aspects.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 = \"7376F8C21B8EA670009CAB74\"\n            BuildableName = \"Aspects.framework\"\n            BlueprintName = \"Aspects-watchOS\"\n            ReferencedContainer = \"container:Aspects.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": "AspectsDemo/AspectsDemo/AspectsAppDelegate.h",
    "content": "//\n//  AspectsAppDelegate.h\n//  AspectsDemo\n//\n//  Created by Peter Steinberger on 03/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n@import UIKit;\n\n@interface AspectsAppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/AspectsAppDelegate.m",
    "content": "//\n//  AspectsAppDelegate.m\n//  AspectsDemo\n//\n//  Created by Peter Steinberger on 03/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import \"AspectsAppDelegate.h\"\n#import \"AspectsViewController.h\"\n#import \"Aspects.h\"\n\n@implementation AspectsAppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n    AspectsViewController *aspectsController = [AspectsViewController new];\n    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n    self.window.backgroundColor = [UIColor whiteColor];\n    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:aspectsController];\n    [self.window makeKeyAndVisible];\n\n    // Ignore hooks when we are testing.\n    if (!NSClassFromString(@\"XCTestCase\")) {\n        [aspectsController aspect_hookSelector:@selector(buttonPressed:) withOptions:0 usingBlock:^(id info, id sender) {\n            NSLog(@\"Button was pressed by: %@\", sender);\n        } error:NULL];\n\n        [aspectsController aspect_hookSelector:@selector(viewWillLayoutSubviews) withOptions:0 usingBlock:^{\n            NSLog(@\"Controller is layouting!\");\n        } error:NULL];\n    }\n\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/AspectsDemo-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.pspdfkit.aspects.${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>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>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": "AspectsDemo/AspectsDemo/AspectsDemo-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_3_0\n#warning \"This project uses features only available in iOS SDK 3.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#endif\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/AspectsViewController.h",
    "content": "//\n//  AspectsViewController.h\n//  AspectsDemo\n//\n//  Created by Peter Steinberger on 05/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface AspectsViewController : UIViewController\n\n- (IBAction)buttonPressed:(id)sender;\n\n@end\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/AspectsViewController.m",
    "content": "//\n//  AspectsViewController.m\n//  AspectsDemo\n//\n//  Created by Peter Steinberger on 05/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import \"AspectsViewController.h\"\n#import \"Aspects.h\"\n\n@implementation AspectsViewController\n\n- (IBAction)buttonPressed:(id)sender {\n    UIViewController *testController = [[UIImagePickerController alloc] init];\n\n    testController.modalPresentationStyle = UIModalPresentationFormSheet;\n    [self presentViewController:testController animated:YES completion:NULL];\n\n    // We are interested in being notified when the controller is being dismissed.\n    [testController aspect_hookSelector:@selector(viewWillDisappear:) withOptions:0 usingBlock:^(id<AspectInfo> info, BOOL animated) {\n        UIViewController *controller = [info instance];\n        if (controller.isBeingDismissed || controller.isMovingFromParentViewController) {\n            [[[UIAlertView alloc] initWithTitle:@\"Popped\" message:@\"Hello from Aspects\" delegate:nil cancelButtonTitle:nil otherButtonTitles:@\"Ok\", nil] show];\n        }\n    } error:NULL];\n\n    // Hooking dealloc is delicate, only AspectPositionBefore will work here.\n    [testController aspect_hookSelector:NSSelectorFromString(@\"dealloc\") withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"Controller is about to be deallocated: %@\", [info instance]);\n    } error:NULL];\n}\n\n@end\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/AspectsViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"5056\" systemVersion=\"13C1021\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment defaultVersion=\"1536\" identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"3733\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"AspectsViewController\">\n            <connections>\n                <outlet property=\"view\" destination=\"i5M-Pr-FkT\" id=\"sfx-zR-JGt\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"i5M-Pr-FkT\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"568\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gKX-p5-Qxl\">\n                    <rect key=\"frame\" x=\"43\" y=\"269\" width=\"235\" height=\"30\"/>\n                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                    <state key=\"normal\" title=\"Present hooked System Controller\">\n                        <color key=\"titleShadowColor\" white=\"0.5\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </state>\n                    <connections>\n                        <action selector=\"buttonPressed:\" destination=\"-2\" eventType=\"touchUpInside\" id=\"GAj-Jc-g4a\"/>\n                    </connections>\n                </button>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"gKX-p5-Qxl\" secondAttribute=\"trailing\" constant=\"42\" id=\"2Xt-SA-Rbc\"/>\n                <constraint firstItem=\"gKX-p5-Qxl\" firstAttribute=\"leading\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"leading\" constant=\"43\" id=\"93u-8g-6Sl\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"gKX-p5-Qxl\" secondAttribute=\"bottom\" constant=\"269\" id=\"9Ns-Ri-BGy\"/>\n                <constraint firstItem=\"gKX-p5-Qxl\" firstAttribute=\"top\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"top\" constant=\"269\" id=\"gRf-at-BdM\"/>\n            </constraints>\n            <simulatedStatusBarMetrics key=\"simulatedStatusBarMetrics\"/>\n            <simulatedScreenMetrics key=\"simulatedDestinationMetrics\" type=\"retina4\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/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": "AspectsDemo/AspectsDemo/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": "AspectsDemo/AspectsDemo/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo/main.m",
    "content": "//\n//  main.m\n//  AspectsDemo\n//\n//  Created by Peter Steinberger on 03/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import \"AspectsAppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AspectsAppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo.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\t78573EF519155A2E000D3B00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573EF419155A2E000D3B00 /* Foundation.framework */; };\n\t\t78573EF719155A2E000D3B00 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573EF619155A2E000D3B00 /* CoreGraphics.framework */; };\n\t\t78573EF919155A2E000D3B00 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573EF819155A2E000D3B00 /* UIKit.framework */; };\n\t\t78573EFF19155A2E000D3B00 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 78573EFD19155A2E000D3B00 /* InfoPlist.strings */; };\n\t\t78573F0119155A2E000D3B00 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 78573F0019155A2E000D3B00 /* main.m */; };\n\t\t78573F0519155A2E000D3B00 /* AspectsAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 78573F0419155A2E000D3B00 /* AspectsAppDelegate.m */; };\n\t\t78573F0719155A2E000D3B00 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78573F0619155A2E000D3B00 /* Images.xcassets */; };\n\t\t78573F0E19155A2E000D3B00 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573F0D19155A2E000D3B00 /* XCTest.framework */; };\n\t\t78573F0F19155A2E000D3B00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573EF419155A2E000D3B00 /* Foundation.framework */; };\n\t\t78573F1019155A2E000D3B00 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78573EF819155A2E000D3B00 /* UIKit.framework */; };\n\t\t78573F1819155A2E000D3B00 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 78573F1619155A2E000D3B00 /* InfoPlist.strings */; };\n\t\t78573F1A19155A2E000D3B00 /* AspectsDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 78573F1919155A2E000D3B00 /* AspectsDemoTests.m */; };\n\t\t78573F2519155A74000D3B00 /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 78573F2319155A74000D3B00 /* Aspects.m */; };\n\t\t78D7D77119177C8E002EB314 /* AspectsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 78D7D76F19177C8E002EB314 /* AspectsViewController.m */; };\n\t\t78D7D77219177C8E002EB314 /* AspectsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 78D7D77019177C8E002EB314 /* AspectsViewController.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t78573F1119155A2E000D3B00 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78573EE919155A2E000D3B00 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 78573EF019155A2E000D3B00;\n\t\t\tremoteInfo = AspectsDemo;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t78573EF119155A2E000D3B00 /* AspectsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AspectsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t78573EF419155A2E000D3B00 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t78573EF619155A2E000D3B00 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t78573EF819155A2E000D3B00 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t78573EFC19155A2E000D3B00 /* AspectsDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"AspectsDemo-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t78573EFE19155A2E000D3B00 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t78573F0019155A2E000D3B00 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t78573F0219155A2E000D3B00 /* AspectsDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"AspectsDemo-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t78573F0319155A2E000D3B00 /* AspectsAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AspectsAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t78573F0419155A2E000D3B00 /* AspectsAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AspectsAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t78573F0619155A2E000D3B00 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t78573F0C19155A2E000D3B00 /* AspectsDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AspectsDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t78573F0D19155A2E000D3B00 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t78573F1519155A2E000D3B00 /* AspectsDemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"AspectsDemoTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t78573F1719155A2E000D3B00 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t78573F1919155A2E000D3B00 /* AspectsDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AspectsDemoTests.m; sourceTree = \"<group>\"; };\n\t\t78573F2319155A74000D3B00 /* Aspects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Aspects.m; path = ../../Aspects.m; sourceTree = \"<group>\"; };\n\t\t78573F2419155A74000D3B00 /* Aspects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Aspects.h; path = ../../Aspects.h; sourceTree = \"<group>\"; };\n\t\t78D7D76E19177C8E002EB314 /* AspectsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AspectsViewController.h; sourceTree = \"<group>\"; };\n\t\t78D7D76F19177C8E002EB314 /* AspectsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AspectsViewController.m; sourceTree = \"<group>\"; };\n\t\t78D7D77019177C8E002EB314 /* AspectsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AspectsViewController.xib; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t78573EEE19155A2E000D3B00 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78573EF719155A2E000D3B00 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t78573EF919155A2E000D3B00 /* UIKit.framework in Frameworks */,\n\t\t\t\t78573EF519155A2E000D3B00 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t78573F0919155A2E000D3B00 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78573F0E19155A2E000D3B00 /* XCTest.framework in Frameworks */,\n\t\t\t\t78573F1019155A2E000D3B00 /* UIKit.framework in Frameworks */,\n\t\t\t\t78573F0F19155A2E000D3B00 /* Foundation.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\t78573EE819155A2E000D3B00 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573EFA19155A2E000D3B00 /* AspectsDemo */,\n\t\t\t\t78573F1319155A2E000D3B00 /* AspectsDemoTests */,\n\t\t\t\t78573EF319155A2E000D3B00 /* Frameworks */,\n\t\t\t\t78573EF219155A2E000D3B00 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573EF219155A2E000D3B00 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573EF119155A2E000D3B00 /* AspectsDemo.app */,\n\t\t\t\t78573F0C19155A2E000D3B00 /* AspectsDemoTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573EF319155A2E000D3B00 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573EF419155A2E000D3B00 /* Foundation.framework */,\n\t\t\t\t78573EF619155A2E000D3B00 /* CoreGraphics.framework */,\n\t\t\t\t78573EF819155A2E000D3B00 /* UIKit.framework */,\n\t\t\t\t78573F0D19155A2E000D3B00 /* XCTest.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573EFA19155A2E000D3B00 /* AspectsDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573F2419155A74000D3B00 /* Aspects.h */,\n\t\t\t\t78573F2319155A74000D3B00 /* Aspects.m */,\n\t\t\t\t78573F0319155A2E000D3B00 /* AspectsAppDelegate.h */,\n\t\t\t\t78573F0419155A2E000D3B00 /* AspectsAppDelegate.m */,\n\t\t\t\t78573F0619155A2E000D3B00 /* Images.xcassets */,\n\t\t\t\t78573EFB19155A2E000D3B00 /* Supporting Files */,\n\t\t\t\t78D7D76E19177C8E002EB314 /* AspectsViewController.h */,\n\t\t\t\t78D7D76F19177C8E002EB314 /* AspectsViewController.m */,\n\t\t\t\t78D7D77019177C8E002EB314 /* AspectsViewController.xib */,\n\t\t\t);\n\t\t\tpath = AspectsDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573EFB19155A2E000D3B00 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573EFC19155A2E000D3B00 /* AspectsDemo-Info.plist */,\n\t\t\t\t78573EFD19155A2E000D3B00 /* InfoPlist.strings */,\n\t\t\t\t78573F0019155A2E000D3B00 /* main.m */,\n\t\t\t\t78573F0219155A2E000D3B00 /* AspectsDemo-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573F1319155A2E000D3B00 /* AspectsDemoTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573F1919155A2E000D3B00 /* AspectsDemoTests.m */,\n\t\t\t\t78573F1419155A2E000D3B00 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = AspectsDemoTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573F1419155A2E000D3B00 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78573F1519155A2E000D3B00 /* AspectsDemoTests-Info.plist */,\n\t\t\t\t78573F1619155A2E000D3B00 /* 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 PBXNativeTarget section */\n\t\t78573EF019155A2E000D3B00 /* AspectsDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 78573F1D19155A2E000D3B00 /* Build configuration list for PBXNativeTarget \"AspectsDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t78573EED19155A2E000D3B00 /* Sources */,\n\t\t\t\t78573EEE19155A2E000D3B00 /* Frameworks */,\n\t\t\t\t78573EEF19155A2E000D3B00 /* 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 = AspectsDemo;\n\t\t\tproductName = AspectsDemo;\n\t\t\tproductReference = 78573EF119155A2E000D3B00 /* AspectsDemo.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t78573F0B19155A2E000D3B00 /* AspectsDemoTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 78573F2019155A2E000D3B00 /* Build configuration list for PBXNativeTarget \"AspectsDemoTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t78573F0819155A2E000D3B00 /* Sources */,\n\t\t\t\t78573F0919155A2E000D3B00 /* Frameworks */,\n\t\t\t\t78573F0A19155A2E000D3B00 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t78573F1219155A2E000D3B00 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = AspectsDemoTests;\n\t\t\tproductName = AspectsDemoTests;\n\t\t\tproductReference = 78573F0C19155A2E000D3B00 /* AspectsDemoTests.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\t78573EE919155A2E000D3B00 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = Aspects;\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t\tORGANIZATIONNAME = \"PSPDFKit GmbH\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t78573F0B19155A2E000D3B00 = {\n\t\t\t\t\t\tTestTargetID = 78573EF019155A2E000D3B00;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 78573EEC19155A2E000D3B00 /* Build configuration list for PBXProject \"AspectsDemo\" */;\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 = 78573EE819155A2E000D3B00;\n\t\t\tproductRefGroup = 78573EF219155A2E000D3B00 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t78573EF019155A2E000D3B00 /* AspectsDemo */,\n\t\t\t\t78573F0B19155A2E000D3B00 /* AspectsDemoTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t78573EEF19155A2E000D3B00 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78573EFF19155A2E000D3B00 /* InfoPlist.strings in Resources */,\n\t\t\t\t78573F0719155A2E000D3B00 /* Images.xcassets in Resources */,\n\t\t\t\t78D7D77219177C8E002EB314 /* AspectsViewController.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t78573F0A19155A2E000D3B00 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78573F1819155A2E000D3B00 /* InfoPlist.strings 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\t78573EED19155A2E000D3B00 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78D7D77119177C8E002EB314 /* AspectsViewController.m in Sources */,\n\t\t\t\t78573F0519155A2E000D3B00 /* AspectsAppDelegate.m in Sources */,\n\t\t\t\t78573F2519155A74000D3B00 /* Aspects.m in Sources */,\n\t\t\t\t78573F0119155A2E000D3B00 /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t78573F0819155A2E000D3B00 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78573F1A19155A2E000D3B00 /* AspectsDemoTests.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\t78573F1219155A2E000D3B00 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 78573EF019155A2E000D3B00 /* AspectsDemo */;\n\t\t\ttargetProxy = 78573F1119155A2E000D3B00 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t78573EFD19155A2E000D3B00 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t78573EFE19155A2E000D3B00 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78573F1619155A2E000D3B00 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t78573F1719155A2E000D3B00 /* 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\t78573F1B19155A2E000D3B00 /* 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_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\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_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_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wall\",\n\t\t\t\t\t\"-Wextra\",\n\t\t\t\t\t\"-Wno-unused-parameter\",\n\t\t\t\t\t\"-Wno-sign-compare\",\n\t\t\t\t\t\"-Wdocumentation\",\n\t\t\t\t\t\"-Wno-static-in-inline\",\n\t\t\t\t\t\"-Wno-objc-missing-property-synthesis\",\n\t\t\t\t\t\"-Wcast-align\",\n\t\t\t\t\t\"-Wmissing-declarations\",\n\t\t\t\t\t\"-Wmissing-prototypes\",\n\t\t\t\t\t\"-Woverlength-strings\",\n\t\t\t\t\t\"-Wshadow\",\n\t\t\t\t\t\"-Wundeclared-selector\",\n\t\t\t\t\t\"-Wunreachable-code\",\n\t\t\t\t\t\"-Wformat=2\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t78573F1C19155A2E000D3B00 /* 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_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\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 6.0;\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\tWARNING_CFLAGS = (\n\t\t\t\t\t\"-Wall\",\n\t\t\t\t\t\"-Wextra\",\n\t\t\t\t\t\"-Wno-unused-parameter\",\n\t\t\t\t\t\"-Wno-sign-compare\",\n\t\t\t\t\t\"-Wdocumentation\",\n\t\t\t\t\t\"-Wno-static-in-inline\",\n\t\t\t\t\t\"-Wno-objc-missing-property-synthesis\",\n\t\t\t\t\t\"-Wcast-align\",\n\t\t\t\t\t\"-Wmissing-declarations\",\n\t\t\t\t\t\"-Wmissing-prototypes\",\n\t\t\t\t\t\"-Woverlength-strings\",\n\t\t\t\t\t\"-Wshadow\",\n\t\t\t\t\t\"-Wundeclared-selector\",\n\t\t\t\t\t\"-Wunreachable-code\",\n\t\t\t\t\t\"-Wformat=2\",\n\t\t\t\t);\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t78573F1E19155A2E000D3B00 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemo/AspectsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemo/AspectsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t78573F1F19155A2E000D3B00 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemo/AspectsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemo/AspectsDemo-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t78573F2119155A2E000D3B00 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/AspectsDemo.app/AspectsDemo\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\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_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemo/AspectsDemo-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\tINFOPLIST_FILE = \"AspectsDemoTests/AspectsDemoTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t78573F2219155A2E000D3B00 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/AspectsDemo.app/AspectsDemo\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\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_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemo/AspectsDemo-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemoTests/AspectsDemoTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t78573EEC19155A2E000D3B00 /* Build configuration list for PBXProject \"AspectsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t78573F1B19155A2E000D3B00 /* Debug */,\n\t\t\t\t78573F1C19155A2E000D3B00 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t78573F1D19155A2E000D3B00 /* Build configuration list for PBXNativeTarget \"AspectsDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t78573F1E19155A2E000D3B00 /* Debug */,\n\t\t\t\t78573F1F19155A2E000D3B00 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t78573F2019155A2E000D3B00 /* Build configuration list for PBXNativeTarget \"AspectsDemoTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t78573F2119155A2E000D3B00 /* Debug */,\n\t\t\t\t78573F2219155A2E000D3B00 /* 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 = 78573EE919155A2E000D3B00 /* Project object */;\n}\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:AspectsDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo.xcodeproj/project.xcworkspace/xcshareddata/AspectsDemo.xccheckout",
    "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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>AEBB4B3B-FCA8-4B2C-A364-473DA52FD1F1</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>AspectsDemo</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</key>\n\t\t<string>https://github.com/steipete/Aspects.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>AspectsDemo/AspectsDemo.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</key>\n\t\t<string>../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/steipete/Aspects.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Aspects</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "AspectsDemo/AspectsDemo.xcodeproj/xcshareddata/xcschemes/AspectsDemo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0510\"\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 = \"78573EF019155A2E000D3B00\"\n               BuildableName = \"AspectsDemo.app\"\n               BlueprintName = \"AspectsDemo\"\n               ReferencedContainer = \"container:AspectsDemo.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"78573F0B19155A2E000D3B00\"\n               BuildableName = \"AspectsDemoTests.xctest\"\n               BlueprintName = \"AspectsDemoTests\"\n               ReferencedContainer = \"container:AspectsDemo.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"78573EF019155A2E000D3B00\"\n            BuildableName = \"AspectsDemo.app\"\n            BlueprintName = \"AspectsDemo\"\n            ReferencedContainer = \"container:AspectsDemo.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"78573EF019155A2E000D3B00\"\n            BuildableName = \"AspectsDemo.app\"\n            BlueprintName = \"AspectsDemo\"\n            ReferencedContainer = \"container:AspectsDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n         <AdditionalOption\n            key = \"NSZombieEnabled\"\n            value = \"YES\"\n            isEnabled = \"YES\">\n         </AdditionalOption>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"78573EF019155A2E000D3B00\"\n            BuildableName = \"AspectsDemo.app\"\n            BlueprintName = \"AspectsDemo\"\n            ReferencedContainer = \"container:AspectsDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "AspectsDemo/AspectsDemoTests/AspectsDemoTests-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>com.pspdfkit.aspects.${PRODUCT_NAME:rfc1034identifier}</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": "AspectsDemo/AspectsDemoTests/AspectsDemoTests.m",
    "content": "//\n//  AspectsDemoTests.m\n//  AspectsDemoTests\n//\n//  Created by Peter Steinberger on 03/05/14.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import <XCTest/XCTest.h>\n#import <objc/runtime.h>\n#import \"Aspects.h\"\n\n@interface TestClass : NSObject\n@property (nonatomic, copy) NSString *string;\n@property (nonatomic, assign) BOOL kvoTestCalled;\n- (void)testCall;\n- (void)testCallAndExecuteBlock:(dispatch_block_t)block;\n- (double)callReturnsDouble;\n- (long long)callReturnsLongLong;\n@end\n\n@implementation TestClass\n\n- (void)testCall {\n    NSLog(@\"Original call\");\n}\n\n- (void)testCallAndExecuteBlock:(dispatch_block_t)block {\n    if (block) block();\n}\n\n- (CGRect)testThatReturnsAStruct {\n    return CGRectMake(100, 100, 100, 100);\n}\n\n- (double)callReturnsDouble {\n    return 1.5;\n}\n\n- (long long)callReturnsLongLong {\n    return 99;\n}\n\n@end\n\n@interface TestWithCustomForwardInvocation : NSObject\n@property (nonatomic, assign) BOOL forwardInvocationCalled;\n- (void)test;\n@end\n\n@implementation TestWithCustomForwardInvocation\n\n- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {\n    if (aSelector == NSSelectorFromString(@\"non_existing_selector\")) {\n        return [NSMethodSignature signatureWithObjCTypes:\"v@:\"];\n    }\n    return [super methodSignatureForSelector:aSelector];\n}\n\n- (void)forwardInvocation:(NSInvocation *)anInvocation {\n    NSLog(@\"Custom!!!\");\n    self.forwardInvocationCalled = YES;\n    if (anInvocation.selector != NSSelectorFromString(@\"non_existing_selector\")) {\n        [super forwardInvocation:anInvocation];\n    }\n}\n\n- (void)test {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n}\n\n@end\n\n@interface AspectsTests : XCTestCase @end\n\n@implementation AspectsTests\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test Block Signature\n\n- (void)testMatchingBlockSignature {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL called = NO;\n    id aspect = [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        called = YES;\n    } error:NULL];\n    [testClass testCall];\n    XCTAssertTrue(called, @\"Flag must have been set.\");\n\n    TestClass *testClass2 = [TestClass new];\n    called = NO;\n    [testClass2 testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testMatchingBlockSignature2 {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL called = NO;\n    id<AspectToken> aspect = [testClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionAfter usingBlock:^{\n        called = YES;\n    } error:NULL];\n    [testClass testCallAndExecuteBlock:NULL];\n    XCTAssertTrue(called, @\"Flag must have been set.\");\n\n    TestClass *testClass2 = [TestClass new];\n    called = NO;\n    [testClass2 testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testTooLargeBlockSignature {\n    TestClass *testClass = [TestClass new];\n\n    NSError *error = nil;\n    __block BOOL called = NO;\n    id<AspectToken> aspect = [testClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, id test, id foo, id bar) {\n        called = YES;\n    } error:&error];\n    [testClass testCallAndExecuteBlock:NULL];\n    XCTAssertNil(aspect);\n    XCTAssertTrue(error.code == AspectErrorIncompatibleBlockSignature);\n    XCTAssertFalse(called, @\"Flag must have not been set.\");\n\n    TestClass *testClass2 = [TestClass new];\n    called = NO;\n    [testClass2 testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n}\n\n- (void)testMismatchingSignature {\n    TestClass *testClass = [TestClass new];\n\n    NSError *error = nil;\n    __block BOOL called = NO;\n    id<AspectToken> aspect = [testClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionAfter usingBlock:^(NSUInteger foobar) {\n        called = YES;\n    } error:&error];\n    [testClass testCallAndExecuteBlock:NULL];\n    XCTAssertNil(aspect);\n    XCTAssertTrue(error.code == AspectErrorIncompatibleBlockSignature);\n    XCTAssertFalse(called, @\"Flag must have not been set.\");\n\n    TestClass *testClass2 = [TestClass new];\n    called = NO;\n    [testClass2 testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Generic Hook Tests\n\n- (void)testCALayerExploding {\n    __block BOOL called = NO;\n    id globalAspect = [CALayer aspect_hookSelector:@selector(name) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"Hello from %@\", info.instance);\n        called = YES;\n    } error:NULL];\n\n    // We had some branches where this blew up already.\n    CALayer *test = [CALayer new];\n    XCTAssertNotNil(test);\n    [test name];\n    XCTAssertTrue(called, @\"Flag needs to be called.\");\n\n    XCTAssertTrue([globalAspect remove]);\n}\n\n- (void)testInsteadHook {\n    // Test object replacement.\n    CALayer *testObject = [CALayer new];\n    testObject.name = @\"Default text\";\n    XCTAssertEqualObjects(testObject.name, @\"Default text\", @\"Must match\");\n    id aspect = [testObject aspect_hookSelector:@selector(name) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        NSString *customText = @\"Custom Text\";\n        [[info originalInvocation] setReturnValue:&customText];\n    } error:NULL];\n    XCTAssertEqualObjects(testObject.name, @\"Custom Text\", @\"Must match\");\n\n    // Test second object, and ensure that this doesn't change the override of the first object.\n    CALayer *testObject2 = [CALayer new];\n    testObject2.name = @\"Default text2\";\n    XCTAssertEqualObjects(testObject2.name, @\"Default text2\", @\"Must match\");\n    id aspect2 = [testObject2 aspect_hookSelector:@selector(name) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        NSString *customText = @\"Custom Text2\";\n        [[info originalInvocation] setReturnValue:&customText];\n    } error:NULL];\n    XCTAssertEqualObjects(testObject2.name, @\"Custom Text2\", @\"Must match\");\n\n    // Globally override.\n    id globalAspect = [CALayer aspect_hookSelector:@selector(name) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        NSString *customText = @\"Global\";\n        [[info originalInvocation] setReturnValue:&customText];\n    } error:NULL];\n    XCTAssertEqualObjects(testObject2.name, @\"Global\", @\"Must match\");\n\n    CALayer *testObject3 = [CALayer new];\n    XCTAssertEqualObjects(testObject3.name, @\"Global\", @\"Must match\");\n    testObject3.name = @\"Test\";\n    XCTAssertEqualObjects(testObject3.name, @\"Global\", @\"Must match\");\n    XCTAssertTrue([globalAspect remove], @\"Must work\");\n    XCTAssertEqualObjects(testObject3.name, @\"Test\", @\"Must match\");\n\n    // Test that removing an aspect returns the original.\n    XCTAssertEqualObjects(testObject.name, @\"Custom Text\", @\"Must match\");\n    XCTAssertTrue([aspect remove], @\"Must return YES\");\n    XCTAssertEqualObjects(testObject.name, @\"Default text\", @\"Must match\");\n    XCTAssertFalse([aspect remove], @\"Must return NO\");\n\n    XCTAssertTrue([aspect2 remove], @\"Must be able to deregister\");\n}\n\n- (void)testAspectsCalledPerObject {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL called = NO;\n    id aspect = [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        called = YES;\n    } error:NULL];\n    [testClass testCall];\n    XCTAssertTrue(called, @\"Flag must have been set.\");\n\n    TestClass *testClass2 = [TestClass new];\n    called = NO;\n    [testClass2 testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testExecutionOrderAndMultipleRegistation {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL called_before = NO;\n    __block BOOL called_after  = NO;\n    __block BOOL called_after2 = NO;\n    id aspect_before = [TestClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info, id block) {\n        called_before = YES;\n    } error:NULL];\n    id aspect_after = [TestClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, id block) {\n        called_after2 = YES;\n    } error:NULL];\n    id aspect_after2 = [TestClass aspect_hookSelector:@selector(testCallAndExecuteBlock:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, id block) {\n        called_after = YES;\n    } error:NULL];\n    [testClass testCallAndExecuteBlock:^{\n        XCTAssertTrue(called_before, @\"Flag must have been set.\");\n        XCTAssertFalse(called_after, @\"Flag must have not been set.\");\n        XCTAssertFalse(called_after2, @\"Flag must have not been set.\");\n    }];\n\n    XCTAssertTrue(called_before, @\"Flag must have been set.\");\n    XCTAssertTrue(called_after, @\"Flag must have been set.\");\n    XCTAssertTrue(called_after2, @\"Flag must have been set.\");\n\n    XCTAssertTrue([aspect_after remove], @\"Must be able to deregister\");\n    XCTAssertTrue([aspect_before remove], @\"Must be able to deregister\");\n    XCTAssertTrue([aspect_after2 remove], @\"Must be able to deregister\");\n    XCTAssertFalse([aspect_after remove], @\"Must not be able to deregister twice\");\n    XCTAssertFalse([aspect_before remove], @\"Must not be able to deregister twice\");\n    XCTAssertFalse([aspect_after2 remove], @\"Must not be able to deregister twice\");\n}\n\n- (void)testExample {\n    TestClass *testClass = [TestClass new];\n    TestClass *testClass2 = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n\n    [testClass2 testCallAndExecuteBlock:^{\n        [testClass testCall];\n    }];\n    XCTAssertTrue(testCallCalled, @\"Calling testCallAndExecuteBlock must call testCall\");\n    XCTAssertTrue([aspectToken remove], @\"Must be able to deregister\");\n}\n\n- (void)testStructReturn {\n    TestClass *testClass = [TestClass new];\n    CGRect rect = [testClass testThatReturnsAStruct];\n    id aspect = [testClass aspect_hookSelector:@selector(testThatReturnsAStruct) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n    } error:NULL];\n\n    CGRect rectHooked = [testClass testThatReturnsAStruct];\n    XCTAssertTrue(CGRectEqualToRect(rect, rectHooked), @\"Must be equal\");\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testDoubleReturn {\n    TestClass *testClass = [TestClass new];\n    double d1 = [testClass callReturnsDouble];\n    __block BOOL testCallCalled = NO;\n    id aspect = [testClass aspect_hookSelector:@selector(callReturnsDouble) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n    double d2 = [testClass callReturnsDouble];\n\n    XCTAssertEqual(d1, d2, @\"Must be equal\");\n    XCTAssertTrue(testCallCalled, @\"Must call hook\");\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testDoubleReturnInstead {\n    TestClass *testClass = [TestClass new];\n    double previousExpectedValue = [testClass callReturnsDouble];\n    double expectedValue = 3.5;\n    \n    id aspect = [testClass aspect_hookSelector:@selector(callReturnsDouble) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info){\n        double toReturn = 3.5;\n        void *ptr = &toReturn;\n        [info.originalInvocation setReturnValue:ptr];\n    }error:NULL];\n    double actualValue = [testClass callReturnsDouble];\n    \n    XCTAssertNotEqual(previousExpectedValue, actualValue, @\"Must not return what it returned before we called our Instead\");\n    XCTAssertEqual(expectedValue, actualValue, @\"Must be equal\");\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testLongLongReturn {\n    TestClass *testClass = [TestClass new];\n    long long d1 = [testClass callReturnsLongLong];\n    __block BOOL testCallCalled = NO;\n    id aspect = [testClass aspect_hookSelector:@selector(callReturnsLongLong) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n    long long d2 = [testClass callReturnsLongLong];\n\n    XCTAssertEqual(d1, d2, @\"Must be equal\");\n    XCTAssertTrue(testCallCalled, @\"Must call hook\");\n    XCTAssertTrue([aspect remove], @\"Must be able to deregister\");\n}\n\n- (void)testHookReleaseIsNotAllowed {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:NSSelectorFromString(@\"release\") withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n    XCTAssertNil(aspectToken, @\"Token must be nil\");\n\n    [testClass testCall];\n    XCTAssertFalse(testCallCalled, @\"Release should not be hookable\");\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test dealloc hooking\n\n// Hooking for deallic is delicate, but should work for AspectPositionBefore and AspectPositionAfter.\n- (void)testDeallocHooking {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    __block id aspectToken = [testClass aspect_hookSelector:NSSelectorFromString(@\"dealloc\") withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n        NSLog(@\"called from dealloc\");\n    } error:NULL];\n    XCTAssertNotNil(aspectToken, @\"Must return a token.\");\n\n    testClass = nil;\n    XCTAssertTrue(testCallCalled, @\"Dealloc-hook must work.\");\n}\n\n// Replacing dealloc should not work.\n- (void)testDeallocReplacing {\n    TestClass *testClass = [TestClass new];\n\n    NSError *error;\n    __block BOOL deallocCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:NSSelectorFromString(@\"dealloc\") withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        deallocCalled = YES;\n        NSLog(@\"called from dealloc\");\n    } error:&error];\n    XCTAssertNil(aspectToken, @\"Must NOT return a token.\");\n    XCTAssertEqual(error.code, AspectErrorSelectorDeallocPosition, @\"Error must be correct\");\n\n    testClass = nil;\n    XCTAssertFalse(deallocCalled, @\"Dealloc-hook must not work.\");\n}\n\n- (void)testInvalidSelectorHooking {\n    TestClass *testClass = [TestClass new];\n    NSError *error;\n    __block id aspectToken = [testClass aspect_hookSelector:NSSelectorFromString(@\"fakeSelector\") withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n    } error:&error];\n    XCTAssertNil(aspectToken, @\"Must return nil token.\");\n    XCTAssertEqual(error.code, AspectErrorDoesNotRespondToSelector, @\"Error code must match\");\n}\n\n- (void)testInvalidGlobalSelectorHooking {\n    NSError *error;\n    __block id aspectToken = [TestClass aspect_hookSelector:NSSelectorFromString(@\"fakeSelector2\") withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n    } error:&error];\n    XCTAssertNil(aspectToken, @\"Must return nil token.\");\n    XCTAssertEqual(error.code, AspectErrorDoesNotRespondToSelector, @\"Error code must match\");\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test Deregistration\n\n- (void)testInstanceTokenDeregistration {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n    XCTAssertNotNil(aspectToken, @\"Must return a token.\");\n\n    [testClass testCall];\n    XCTAssertTrue(testCallCalled, @\"Hook must work.\");\n\n    XCTAssertNotEqualObjects(testClass.class, object_getClass(testClass), @\"Object must have a custom subclass.\");\n\n    XCTAssertTrue([aspectToken remove], @\"Deregistration must work\");\n    XCTAssertEqualObjects(testClass.class, object_getClass(testClass), @\"Object must not have a custom subclass.\");\n\n    testCallCalled = NO;\n    [testClass testCall];\n    XCTAssertFalse(testCallCalled, @\"Hook must no longer work.\");\n\n    XCTAssertFalse([aspectToken remove], @\"Deregistration must not work twice\");\n}\n\n- (void)testGlobalTokenDeregistrationWithCustomForwardInvocation {\n    TestWithCustomForwardInvocation *testClass = [TestWithCustomForwardInvocation new];\n    Method originalForwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n    IMP originalForwardInvocationIMP = method_getImplementation(originalForwardInvocationMethod);\n\n    // Test that forwardInvocation points to NSObject.\n    {\n        Method objectMethod = class_getInstanceMethod(TestWithCustomForwardInvocation.class, @selector(forwardInvocation:));\n        XCTAssertEqual(method_getImplementation(originalForwardInvocationMethod), method_getImplementation(objectMethod), @\"Implementations must be equal\");\n    }\n\n    __block BOOL testCalled = NO;\n    id token = [TestWithCustomForwardInvocation aspect_hookSelector:@selector(test) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        testCalled = YES;\n    } error:NULL];\n    XCTAssertNotNil(token, @\"Must return a token.\");\n\n    [testClass test];\n    XCTAssertTrue(testCalled, @\"Hook must work.\");\n\n    XCTAssertEqualObjects(testClass.class, object_getClass(testClass), @\"Object must not have a custom subclass.\");\n\n    // Test that forwardInvocation points to our own implementation.\n    {\n        Method forwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n        XCTAssertNotEqual(method_getImplementation(forwardInvocationMethod), originalForwardInvocationIMP, @\"Implementations must not be equal\");\n    }\n\n    XCTAssertTrue([token remove], @\"Deregistration must work\");\n\n    // Test that forwardInvocation (again) points to NSObject and thus is correctly restored.\n    {\n        Method forwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n        XCTAssertEqual(method_getImplementation(forwardInvocationMethod), originalForwardInvocationIMP, @\"Implementations must be equal\");\n    }\n\n    testCalled = NO;\n    [testClass test];\n    XCTAssertFalse(testCalled, @\"Hook must no longer work.\");\n\n    XCTAssertFalse([token remove], @\"Deregistration must not work twice\");\n}\n\n- (void)testGlobalTokenDeregistration {\n    TestClass *testClass = [TestClass new];\n\n    // Test that forwardInvocation points to NSObject.\n    {\n        Method forwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n        Method objectMethod = class_getInstanceMethod(NSObject.class, @selector(forwardInvocation:));\n        XCTAssertEqual(method_getImplementation(forwardInvocationMethod), method_getImplementation(objectMethod), @\"Implementations must be equal\");\n    }\n\n    __block BOOL testCallCalled = NO;\n    id token = [TestClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n    XCTAssertNotNil(token, @\"Must return a token.\");\n\n    [testClass testCall];\n    XCTAssertTrue(testCallCalled, @\"Hook must work.\");\n\n    XCTAssertEqualObjects(testClass.class, object_getClass(testClass), @\"Object must not have a custom subclass.\");\n\n    // Test that forwardInvocation points to our own implementation.\n    {\n        Method forwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n        Method objectMethod = class_getInstanceMethod(NSObject.class, @selector(forwardInvocation:));\n        XCTAssertNotEqual(method_getImplementation(forwardInvocationMethod), method_getImplementation(objectMethod), @\"Implementations must not be equal\");\n    }\n\n    XCTAssertTrue([token remove], @\"Deregistration must work\");\n\n    // Test that forwardInvocation (again) points to NSObject and thus is correctly restored.\n    {\n        Method forwardInvocationMethod = class_getInstanceMethod(testClass.class, @selector(forwardInvocation:));\n        Method objectMethod = class_getInstanceMethod(NSObject.class, @selector(forwardInvocation:));\n        XCTAssertEqual(method_getImplementation(forwardInvocationMethod), method_getImplementation(objectMethod), @\"Implementations must be equal\");\n    }\n\n    testCallCalled = NO;\n    [testClass testCall];\n    XCTAssertFalse(testCallCalled, @\"Hook must no longer work.\");\n\n    XCTAssertFalse([token remove], @\"Deregistration must not work twice\");\n}\n\n- (void)testSimpleDeregistration {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL called = NO;\n    id aspectToken = [TestClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info) {\n        called = YES;\n    } error:NULL];\n    [testClass testCall];\n    XCTAssertTrue(called, @\"Flag must have been set.\");\n\n    called = NO;\n    XCTAssertTrue([aspectToken remove], @\"Must allow deregistration\");\n    [testClass testCall];\n    XCTAssertFalse(called, @\"Flag must have been NOT set.\");\n}\n\n- (void)testAutoDeregistration {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter|AspectOptionAutomaticRemoval usingBlock:^(id<AspectInfo> info) {\n        testCallCalled = YES;\n    } error:NULL];\n\n    [testClass testCall];\n    XCTAssertTrue(testCallCalled, @\"Must be set to YES\");\n\n    testCallCalled = NO;\n    [testClass testCall];\n    XCTAssertFalse(testCallCalled, @\"Must be set to NO\");\n\n    XCTAssertFalse([aspectToken remove], @\"Must not able to deregister again\");\n}\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test KVO\n\n- (void)testKVOCoexistance {\n    TestClass *testClass = [TestClass new];\n\n    __block BOOL hookCalled = NO;\n    id aspectToken = [testClass aspect_hookSelector:@selector(setString:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, NSString *string) {\n        NSLog(@\"Aspect hook!\");\n        hookCalled = YES;\n    } error:NULL];\n    [testClass addObserver:self forKeyPath:NSStringFromSelector(@selector(string)) options:0 context:_cmd];\n\n    XCTAssertFalse(testClass.kvoTestCalled, @\"KVO must be not set\");\n    testClass.string = @\"test\";\n    XCTAssertTrue(hookCalled, @\"Hook must be called\");\n    XCTAssertTrue(testClass.kvoTestCalled, @\"KVO must work\");\n    [testClass removeObserver:self forKeyPath:NSStringFromSelector(@selector(string)) context:_cmd];\n    hookCalled = NO;\n    testClass.kvoTestCalled = NO;\n    testClass.string = @\"test2\";\n    XCTAssertTrue(hookCalled, @\"Hook must be called\");\n    XCTAssertFalse(testClass.kvoTestCalled, @\"KVO must no longer work\");\n\n    XCTAssertTrue([aspectToken remove], @\"Must be able to deregister\");\n}\n\n// TODO: Pre-registeded KVO is currently not working.\n//- (void)testKVOCoexistanceWithPreregisteredKVO {\n//    TestClass *testClass = [TestClass new];\n//    XCTAssertFalse(testClass.kvoTestCalled, @\"KVO must be not set\");\n//    [testClass addObserver:self forKeyPath:NSStringFromSelector(@selector(string)) options:0 context:_cmd];\n//    testClass.string = @\"test\";\n//    XCTAssertTrue(testClass.kvoTestCalled, @\"KVO must work\");\n//\n//    __block BOOL hookCalled = NO;\n//    [testClass aspect_hookSelector:@selector(setString:) withOptions:AspectPositionAfter usingBlock:^(id instance, NSArray *arguments) {\n//        NSLog(@\"Aspect hook!\");\n//        hookCalled = YES;\n//    }];\n//\n//    XCTAssertFalse(testClass.kvoTestCalled, @\"KVO must be not set\");\n//    testClass.string = @\"test\";\n//    XCTAssertTrue(hookCalled, @\"Hook must be called\");\n//    XCTAssertTrue(testClass.kvoTestCalled, @\"KVO must work\");\n//    [testClass removeObserver:self forKeyPath:NSStringFromSelector(@selector(string)) context:_cmd];\n//    hookCalled = NO;\n//    testClass.kvoTestCalled = NO;\n//    testClass.string = @\"test2\";\n//    XCTAssertTrue(hookCalled, @\"Hook must be called\");\n//    XCTAssertFalse(testClass.kvoTestCalled, @\"KVO must no longer work\");\n//}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {\n    NSLog(@\"KVO!\");\n    ((TestClass *)object).kvoTestCalled = YES;\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test that a custom forwardInvocation: is being called.\n\n@interface AspectsForwardInvocationTests : XCTestCase @end\n@implementation AspectsForwardInvocationTests\n\n- (void)testEnsureForwardInvocationIsCalled {\n    TestWithCustomForwardInvocation *testClass = [TestWithCustomForwardInvocation new];\n    XCTAssertFalse(testClass.forwardInvocationCalled, @\"Must have not called custom forwardInvocation:\");\n    id aspectToken = [TestWithCustomForwardInvocation aspect_hookSelector:@selector(test) withOptions:AspectPositionInstead usingBlock:^(id info) {\n        NSLog(@\"Aspect hook called\");\n    } error:NULL];\n    [testClass test];\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n    [testClass performSelector:NSSelectorFromString(@\"non_existing_selector\")];\n#pragma clang diagnostic pop\n    XCTAssertTrue(testClass.forwardInvocationCalled, @\"Must have called custom forwardInvocation:\");\n\n    XCTAssertTrue([aspectToken remove], @\"Must be able to deregister\");\n}\n\n@end\n\n///////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark - Test Selector Mangling\n\n@interface A : NSObject\n- (void)foo;\n@end\n\n@implementation A\n- (void)foo {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n}\n- (void)bar {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n}\n@end\n\n@interface B : A @end\n\n@implementation B\n- (void)foo {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n    [super foo];\n}\n- (void)bar {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n    [super bar];\n}\n@end\n\n@interface C : NSObject\n- (void)foo;\n@end\n\n@implementation C\n- (void)foo {\n    NSLog(@\"%s\", __PRETTY_FUNCTION__);\n}\n@end\n\n@interface AspectsSelectorTests : XCTestCase @end\n@implementation AspectsSelectorTests\n\n//- (void)testSelectorMangling {\n//    __block BOOL A_aspect_called = NO;\n//    __block BOOL B_aspect_called = NO;\n//    [B aspect_hookSelector:@selector(foo) withOptions:AspectPositionBefore usingBlock:^(id instance, NSArray *arguments) {\n//        NSLog(@\"before -[B foo]\");\n//        B_aspect_called = YES;\n//    }];\n//    [A aspect_hookSelector:@selector(foo) withOptions:AspectPositionBefore usingBlock:^(id instance, NSArray *arguments) {\n//        NSLog(@\"before -[A foo]\");\n//        A_aspect_called = YES;\n//    }];\n//\n//    B *b = [B new];\n//    [b foo];\n//\n//    XCTAssertTrue(B_aspect_called, @\"B aspect should be called\");\n//    XCTAssertFalse(A_aspect_called, @\"A aspect should not be called\");\n//}\n\n// TODO: Since tests change the runtime, it's hard to clean up.\n- (void)testSelectorMangling2 {\n    __block BOOL A_aspect_called = NO;\n    __block BOOL B_aspect_called = NO;\n    __block BOOL C_aspect_called = NO;\n\n    id aspectToken1 = [A aspect_hookSelector:@selector(foo) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"before -[A foo]\");\n        A_aspect_called = YES;\n    } error:NULL];\n    XCTAssertNotNil(aspectToken1, @\"Must return a token\");\n\n    id aspectToken2 = [B aspect_hookSelector:@selector(foo) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"before -[B foo]\");\n        B_aspect_called = YES;\n    } error:NULL];\n    XCTAssertNil(aspectToken2, @\"Must not return a token\");\n\n    // a sibling and it's subclasses should be able to hook the same selector\n    id aspectToken3 = [C aspect_hookSelector:@selector(foo) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"before -[C foo]\");\n        C_aspect_called = YES;\n    } error:NULL];\n    XCTAssertNotNil(aspectToken3, @\"Must return a token\");\n\n    B *b = [B new];\n    [b foo];\n\n    // TODO: A is not yet called, we can't detect the target IMP for an invocation.\n    XCTAssertTrue(A_aspect_called, @\"A aspect should be called\");\n    XCTAssertFalse(B_aspect_called, @\"B aspect should not be called\");\n    XCTAssertFalse(C_aspect_called, @\"C aspect should not be called\");\n\n    C *c = [C new];\n    [c foo];\n    XCTAssertTrue(C_aspect_called, @\"C aspect should be called\");\n\n    XCTAssertTrue([aspectToken1 remove], @\"Must be able to deregister\");\n    XCTAssertTrue([aspectToken3 remove], @\"Must be able to deregister\");\n}\n- (void)testSelectorMangling3 {\n    __block BOOL A_aspect_called = NO;\n    __block BOOL B_aspect_called = NO;\n\n    id aspectToken1 = [B aspect_hookSelector:@selector(bar) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"before -[B bar]\");\n        B_aspect_called = YES;\n    } error:NULL];\n    XCTAssertNotNil(aspectToken1, @\"Must return a token\");\n\n    // if a subclass already hooks this selector we shouldn't be able to hook it in a superclass\n    id aspectToken2 = [A aspect_hookSelector:@selector(bar) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info) {\n        NSLog(@\"before -[A bar]\");\n        A_aspect_called = YES;\n    } error:NULL];\n    XCTAssertNil(aspectToken2, @\"Must not return a token\");\n\n    B *b = [B new];\n    [b bar];\n\n    XCTAssertFalse(A_aspect_called, @\"A aspect should not be called\");\n    XCTAssertTrue(B_aspect_called, @\"B aspect should be called\");\n\n    XCTAssertTrue([aspectToken1 remove], @\"Must be able to deregister\");\n}\n\n@end\n"
  },
  {
    "path": "AspectsDemo/AspectsDemoTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/AspectsAppDelegate.h",
    "content": "//\n//  AspectsAppDelegate.h\n//  AspectsDemoOSX\n//\n//  Created by Ash Furrow on 2014-05-05.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface AspectsAppDelegate : NSObject <NSApplicationDelegate>\n\n@property (assign) IBOutlet NSWindow *window;\n\n@end\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/AspectsAppDelegate.m",
    "content": "//\n//  AspectsAppDelegate.m\n//  AspectsDemoOSX\n//\n//  Created by Ash Furrow on 2014-05-05.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import \"AspectsAppDelegate.h\"\n#import \"Aspects.h\"\n\n@implementation AspectsAppDelegate\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification\n{\n    // Ignore hooks when we are testing.\n    if (!NSClassFromString(@\"XCTestCase\")) {\n        [self.window aspect_hookSelector:@selector(displayIfNeeded) withOptions:0 usingBlock:^(id instance, NSArray *arguments) {\n            NSLog(@\"Window is displayed!\");\n        } error:NULL];\n    }\n}\n\n@end\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/AspectsDemoOSX-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.pspdfkit.aspects.${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>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2014 PSPDFKit GmbH. All rights reserved.</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": "AspectsDemoOSX/AspectsDemoOSX/AspectsDemoOSX-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": "AspectsDemoOSX/AspectsDemoOSX/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=\"5023\" systemVersion=\"13A603\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"5023\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AspectsAppDelegate\">\n            <connections>\n                <outlet property=\"window\" destination=\"QvC-M9-y7g\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n            <items>\n                <menuItem title=\"AspectsDemoOSX\" id=\"1Xt-HY-uBw\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"AspectsDemoOSX\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                        <items>\n                            <menuItem title=\"About AspectsDemoOSX\" id=\"5kV-Vb-QxS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"orderFrontStandardAboutPanel:\" target=\"-1\" id=\"Exp-CZ-Vem\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                            <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                            <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                            <menuItem title=\"Hide AspectsDemoOSX\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                <connections>\n                                    <action selector=\"hide:\" target=\"-1\" id=\"PnN-Uc-m68\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"hideOtherApplications:\" target=\"-1\" id=\"VT4-aY-XCT\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"unhideAllApplications:\" target=\"-1\" id=\"Dhg-Le-xox\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                            <menuItem title=\"Quit AspectsDemoOSX\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                <connections>\n                                    <action selector=\"terminate:\" target=\"-1\" id=\"Te7-pn-YzF\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                        <items>\n                            <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                <connections>\n                                    <action selector=\"newDocument:\" target=\"-1\" id=\"4Si-XN-c54\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                <connections>\n                                    <action selector=\"openDocument:\" target=\"-1\" id=\"bVn-NM-KNZ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                    <items>\n                                        <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"clearRecentDocuments:\" target=\"-1\" id=\"Daa-9d-B3U\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                            <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                <connections>\n                                    <action selector=\"performClose:\" target=\"-1\" id=\"HmO-Ls-i7Q\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                <connections>\n                                    <action selector=\"saveDocument:\" target=\"-1\" id=\"teZ-XB-qJY\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                <connections>\n                                    <action selector=\"saveDocumentAs:\" target=\"-1\" id=\"mDf-zr-I0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Revert to Saved\" id=\"KaW-ft-85H\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"revertDocumentToSaved:\" target=\"-1\" id=\"iJ3-Pv-kwq\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                            <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"runPageLayout:\" target=\"-1\" id=\"Din-rz-gC5\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                <connections>\n                                    <action selector=\"print:\" target=\"-1\" id=\"qaZ-4w-aoO\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                        <items>\n                            <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                <connections>\n                                    <action selector=\"undo:\" target=\"-1\" id=\"M6e-cu-g7V\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                <connections>\n                                    <action selector=\"redo:\" target=\"-1\" id=\"oIA-Rs-6OD\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                            <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                <connections>\n                                    <action selector=\"cut:\" target=\"-1\" id=\"YJe-68-I9s\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                <connections>\n                                    <action selector=\"copy:\" target=\"-1\" id=\"G1f-GL-Joy\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                <connections>\n                                    <action selector=\"paste:\" target=\"-1\" id=\"UvS-8e-Qdg\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"pasteAsPlainText:\" target=\"-1\" id=\"cEh-KX-wJQ\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"delete:\" target=\"-1\" id=\"0Mk-Ml-PaM\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                <connections>\n                                    <action selector=\"selectAll:\" target=\"-1\" id=\"VNm-Mi-diN\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                            <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                    <items>\n                                        <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"cD7-Qs-BN4\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"WD3-Gg-5AJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"NDo-RZ-v9R\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"HOh-sY-3ay\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                            <connections>\n                                                <action selector=\"performFindPanelAction:\" target=\"-1\" id=\"U76-nv-p5D\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                            <connections>\n                                                <action selector=\"centerSelectionInVisibleArea:\" target=\"-1\" id=\"IOG-6D-g5B\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                    <items>\n                                        <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                            <connections>\n                                                <action selector=\"showGuessPanel:\" target=\"-1\" id=\"vFj-Ks-hy3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                            <connections>\n                                                <action selector=\"checkSpelling:\" target=\"-1\" id=\"fz7-VC-reM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                        <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleContinuousSpellChecking:\" target=\"-1\" id=\"7w6-Qz-0kB\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleGrammarChecking:\" target=\"-1\" id=\"muD-Qn-j4w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"-1\" id=\"2lM-Qi-WAP\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                    <items>\n                                        <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontSubstitutionsPanel:\" target=\"-1\" id=\"oku-mr-iSq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                        <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleSmartInsertDelete:\" target=\"-1\" id=\"3IJ-Se-DZD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"-1\" id=\"ptq-xd-QOA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDashSubstitution:\" target=\"-1\" id=\"oCt-pO-9gS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticLinkDetection:\" target=\"-1\" id=\"Gip-E3-Fov\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticDataDetection:\" target=\"-1\" id=\"R1I-Nq-Kbl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleAutomaticTextReplacement:\" target=\"-1\" id=\"DvP-Fe-Py6\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                    <items>\n                                        <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"uppercaseWord:\" target=\"-1\" id=\"sPh-Tk-edu\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"lowercaseWord:\" target=\"-1\" id=\"iUZ-b5-hil\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"capitalizeWord:\" target=\"-1\" id=\"26H-TL-nsh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                    <items>\n                                        <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"startSpeaking:\" target=\"-1\" id=\"654-Ng-kyl\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"stopSpeaking:\" target=\"-1\" id=\"dX8-6p-jy9\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                        <items>\n                            <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                    <items>\n                                        <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                            <connections>\n                                                <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                            <connections>\n                                                <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                            <connections>\n                                                <action selector=\"underline:\" target=\"-1\" id=\"FYS-2b-JAY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                        <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                            <connections>\n                                                <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                        <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardKerning:\" target=\"-1\" id=\"6dk-9l-Ckg\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffKerning:\" target=\"-1\" id=\"U8a-gz-Maa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"tightenKerning:\" target=\"-1\" id=\"hr7-Nz-8ro\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"loosenKerning:\" target=\"-1\" id=\"8i4-f9-FKE\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useStandardLigatures:\" target=\"-1\" id=\"7uR-wd-Dx6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"turnOffLigatures:\" target=\"-1\" id=\"iX2-gA-Ilz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"useAllLigatures:\" target=\"-1\" id=\"KcB-kA-TuK\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                <items>\n                                                    <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"unscript:\" target=\"-1\" id=\"0vZ-95-Ywn\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"superscript:\" target=\"-1\" id=\"3qV-fo-wpU\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"subscript:\" target=\"-1\" id=\"Q6W-4W-IGz\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"raiseBaseline:\" target=\"-1\" id=\"4sk-31-7Q9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowerBaseline:\" target=\"-1\" id=\"OF1-bc-KW4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                        <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                            <connections>\n                                                <action selector=\"orderFrontColorPanel:\" target=\"-1\" id=\"mSX-Xz-DV3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                        <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyFont:\" target=\"-1\" id=\"GJO-xA-L4q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteFont:\" target=\"-1\" id=\"JfD-CL-leO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                    <items>\n                                        <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                            <connections>\n                                                <action selector=\"alignLeft:\" target=\"-1\" id=\"zUv-R1-uAa\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                            <connections>\n                                                <action selector=\"alignCenter:\" target=\"-1\" id=\"spX-mk-kcS\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"alignJustified:\" target=\"-1\" id=\"ljL-7U-jND\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                            <connections>\n                                                <action selector=\"alignRight:\" target=\"-1\" id=\"r48-bG-YeY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                        <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                <items>\n                                                    <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"YGs-j5-SAR\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionNatural:\" target=\"-1\" id=\"qtV-5e-UBP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"Lbh-J2-qVU\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"-1\" id=\"S0X-9S-QSf\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"jFq-tB-4Kx\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"-1\" id=\"5fk-qB-AqJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                    <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                    </menuItem>\n                                                    <menuItem id=\"Nop-cj-93Q\">\n                                                        <string key=\"title\">\tDefault</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionNatural:\" target=\"-1\" id=\"lPI-Se-ZHp\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"BgM-ve-c93\">\n                                                        <string key=\"title\">\tLeft to Right</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"-1\" id=\"caW-Bv-w94\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem id=\"RB4-Sm-HuC\">\n                                                        <string key=\"title\">\tRight to Left</string>\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"-1\" id=\"EXD-6r-ZUu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                        <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"toggleRuler:\" target=\"-1\" id=\"FOx-HJ-KwY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"copyRuler:\" target=\"-1\" id=\"71i-fW-3W2\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteRuler:\" target=\"-1\" id=\"cSh-wd-qM2\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                        <items>\n                            <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                <connections>\n                                    <action selector=\"toggleToolbarShown:\" target=\"-1\" id=\"BXY-wc-z0C\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"runToolbarCustomizationPalette:\" target=\"-1\" id=\"pQI-g3-MTW\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                        <items>\n                            <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                <connections>\n                                    <action selector=\"performMiniaturize:\" target=\"-1\" id=\"VwT-WD-YPe\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"performZoom:\" target=\"-1\" id=\"DIl-cC-cCs\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                            <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <connections>\n                                    <action selector=\"arrangeInFront:\" target=\"-1\" id=\"DRN-fu-gQh\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                        <items>\n                            <menuItem title=\"AspectsDemoOSX Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                <connections>\n                                    <action selector=\"showHelp:\" target=\"-1\" id=\"y7X-2Q-9no\"/>\n                                </connections>\n                            </menuItem>\n                        </items>\n                    </menu>\n                </menuItem>\n            </items>\n        </menu>\n        <window title=\"AspectsDemoOSX\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"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=\"1680\" height=\"1028\"/>\n            <view key=\"contentView\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"360\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n            </view>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/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": "AspectsDemoOSX/AspectsDemoOSX/en.lproj/Credits.rtf",
    "content": "{\\rtf0\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\paperw9840\\paperh8400\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\ql\\qnatural\n\n\\f0\\b\\fs24 \\cf0 Engineering:\n\\b0 \\\n\tSome people\\\n\\\n\n\\b Human Interface Design:\n\\b0 \\\n\tSome other people\\\n\\\n\n\\b Testing:\n\\b0 \\\n\tHopefully not nobody\\\n\\\n\n\\b Documentation:\n\\b0 \\\n\tWhoever\\\n\\\n\n\\b With special thanks to:\n\\b0 \\\n\tMom\\\n}\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX/main.m",
    "content": "//\n//  main.m\n//  AspectsDemoOSX\n//\n//  Created by Ash Furrow on 2014-05-05.\n//  Copyright (c) 2014 PSPDFKit GmbH. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, const char * argv[])\n{\n    return NSApplicationMain(argc, argv);\n}\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX.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\t5E435B8E1917A2910028B862 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E435B8D1917A2910028B862 /* Cocoa.framework */; };\n\t\t5E435B981917A2910028B862 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5E435B961917A2910028B862 /* InfoPlist.strings */; };\n\t\t5E435B9A1917A2910028B862 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E435B991917A2910028B862 /* main.m */; };\n\t\t5E435B9E1917A2910028B862 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 5E435B9C1917A2910028B862 /* Credits.rtf */; };\n\t\t5E435BA11917A2910028B862 /* AspectsAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E435BA01917A2910028B862 /* AspectsAppDelegate.m */; };\n\t\t5E435BA41917A2910028B862 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5E435BA21917A2910028B862 /* MainMenu.xib */; };\n\t\t5E435BA61917A2910028B862 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5E435BA51917A2910028B862 /* Images.xcassets */; };\n\t\t5E435BAD1917A2920028B862 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E435BAC1917A2920028B862 /* XCTest.framework */; };\n\t\t5E435BAE1917A2920028B862 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E435B8D1917A2910028B862 /* Cocoa.framework */; };\n\t\t5E435BB61917A2920028B862 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5E435BB41917A2920028B862 /* InfoPlist.strings */; };\n\t\t5E435BC31917A2BE0028B862 /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E435BC21917A2BE0028B862 /* Aspects.m */; };\n\t\t78BAEF4C191E3AD5006DABAF /* AspectsDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 78BAEF4B191E3AD5006DABAF /* AspectsDemoTests.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t5E435BAF1917A2920028B862 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E435B821917A2910028B862 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 5E435B891917A2910028B862;\n\t\t\tremoteInfo = AspectsDemoOSX;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t5E435B8A1917A2910028B862 /* AspectsDemoOSX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AspectsDemoOSX.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E435B8D1917A2910028B862 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\t5E435B901917A2910028B862 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\t5E435B911917A2910028B862 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\t5E435B921917A2910028B862 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t5E435B951917A2910028B862 /* AspectsDemoOSX-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"AspectsDemoOSX-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t5E435B971917A2910028B862 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t5E435B991917A2910028B862 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t5E435B9B1917A2910028B862 /* AspectsDemoOSX-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"AspectsDemoOSX-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t5E435B9D1917A2910028B862 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = \"<group>\"; };\n\t\t5E435B9F1917A2910028B862 /* AspectsAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AspectsAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t5E435BA01917A2910028B862 /* AspectsAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AspectsAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t5E435BA31917A2910028B862 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t5E435BA51917A2910028B862 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t5E435BAB1917A2920028B862 /* AspectsDemoOSXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AspectsDemoOSXTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E435BAC1917A2920028B862 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t5E435BB31917A2920028B862 /* AspectsDemoOSXTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"AspectsDemoOSXTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t5E435BB51917A2920028B862 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t5E435BC11917A2BE0028B862 /* Aspects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Aspects.h; path = ../../Aspects.h; sourceTree = \"<group>\"; };\n\t\t5E435BC21917A2BE0028B862 /* Aspects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Aspects.m; path = ../../Aspects.m; sourceTree = \"<group>\"; };\n\t\t78BAEF4B191E3AD5006DABAF /* AspectsDemoTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AspectsDemoTests.m; path = ../../AspectsDemo/AspectsDemoTests/AspectsDemoTests.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t5E435B871917A2910028B862 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E435B8E1917A2910028B862 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5E435BA81917A2920028B862 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E435BAE1917A2920028B862 /* Cocoa.framework in Frameworks */,\n\t\t\t\t5E435BAD1917A2920028B862 /* XCTest.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\t5E435B811917A2910028B862 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B931917A2910028B862 /* AspectsDemoOSX */,\n\t\t\t\t5E435BB11917A2920028B862 /* AspectsDemoOSXTests */,\n\t\t\t\t5E435B8C1917A2910028B862 /* Frameworks */,\n\t\t\t\t5E435B8B1917A2910028B862 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B8B1917A2910028B862 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B8A1917A2910028B862 /* AspectsDemoOSX.app */,\n\t\t\t\t5E435BAB1917A2920028B862 /* AspectsDemoOSXTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B8C1917A2910028B862 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B8D1917A2910028B862 /* Cocoa.framework */,\n\t\t\t\t5E435BAC1917A2920028B862 /* XCTest.framework */,\n\t\t\t\t5E435B8F1917A2910028B862 /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B8F1917A2910028B862 /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B901917A2910028B862 /* AppKit.framework */,\n\t\t\t\t5E435B911917A2910028B862 /* CoreData.framework */,\n\t\t\t\t5E435B921917A2910028B862 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B931917A2910028B862 /* AspectsDemoOSX */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435BC11917A2BE0028B862 /* Aspects.h */,\n\t\t\t\t5E435BC21917A2BE0028B862 /* Aspects.m */,\n\t\t\t\t5E435B9F1917A2910028B862 /* AspectsAppDelegate.h */,\n\t\t\t\t5E435BA01917A2910028B862 /* AspectsAppDelegate.m */,\n\t\t\t\t5E435BA21917A2910028B862 /* MainMenu.xib */,\n\t\t\t\t5E435BA51917A2910028B862 /* Images.xcassets */,\n\t\t\t\t5E435B941917A2910028B862 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = AspectsDemoOSX;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B941917A2910028B862 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B951917A2910028B862 /* AspectsDemoOSX-Info.plist */,\n\t\t\t\t5E435B961917A2910028B862 /* InfoPlist.strings */,\n\t\t\t\t5E435B991917A2910028B862 /* main.m */,\n\t\t\t\t5E435B9B1917A2910028B862 /* AspectsDemoOSX-Prefix.pch */,\n\t\t\t\t5E435B9C1917A2910028B862 /* Credits.rtf */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435BB11917A2920028B862 /* AspectsDemoOSXTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78BAEF4B191E3AD5006DABAF /* AspectsDemoTests.m */,\n\t\t\t\t5E435BB21917A2920028B862 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = AspectsDemoOSXTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435BB21917A2920028B862 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435BB31917A2920028B862 /* AspectsDemoOSXTests-Info.plist */,\n\t\t\t\t5E435BB41917A2920028B862 /* 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 PBXNativeTarget section */\n\t\t5E435B891917A2910028B862 /* AspectsDemoOSX */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5E435BBB1917A2920028B862 /* Build configuration list for PBXNativeTarget \"AspectsDemoOSX\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5E435B861917A2910028B862 /* Sources */,\n\t\t\t\t5E435B871917A2910028B862 /* Frameworks */,\n\t\t\t\t5E435B881917A2910028B862 /* 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 = AspectsDemoOSX;\n\t\t\tproductName = AspectsDemoOSX;\n\t\t\tproductReference = 5E435B8A1917A2910028B862 /* AspectsDemoOSX.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t5E435BAA1917A2920028B862 /* AspectsDemoOSXTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5E435BBE1917A2920028B862 /* Build configuration list for PBXNativeTarget \"AspectsDemoOSXTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5E435BA71917A2920028B862 /* Sources */,\n\t\t\t\t5E435BA81917A2920028B862 /* Frameworks */,\n\t\t\t\t5E435BA91917A2920028B862 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t5E435BB01917A2920028B862 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = AspectsDemoOSXTests;\n\t\t\tproductName = AspectsDemoOSXTests;\n\t\t\tproductReference = 5E435BAB1917A2920028B862 /* AspectsDemoOSXTests.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\t5E435B821917A2910028B862 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = Aspects;\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t\tORGANIZATIONNAME = \"PSPDFKit GmbH\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t5E435BAA1917A2920028B862 = {\n\t\t\t\t\t\tTestTargetID = 5E435B891917A2910028B862;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 5E435B851917A2910028B862 /* Build configuration list for PBXProject \"AspectsDemoOSX\" */;\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 = 5E435B811917A2910028B862;\n\t\t\tproductRefGroup = 5E435B8B1917A2910028B862 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t5E435B891917A2910028B862 /* AspectsDemoOSX */,\n\t\t\t\t5E435BAA1917A2920028B862 /* AspectsDemoOSXTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t5E435B881917A2910028B862 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E435B981917A2910028B862 /* InfoPlist.strings in Resources */,\n\t\t\t\t5E435BA61917A2910028B862 /* Images.xcassets in Resources */,\n\t\t\t\t5E435B9E1917A2910028B862 /* Credits.rtf in Resources */,\n\t\t\t\t5E435BA41917A2910028B862 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5E435BA91917A2920028B862 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E435BB61917A2920028B862 /* InfoPlist.strings 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\t5E435B861917A2910028B862 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5E435BA11917A2910028B862 /* AspectsAppDelegate.m in Sources */,\n\t\t\t\t5E435B9A1917A2910028B862 /* main.m in Sources */,\n\t\t\t\t5E435BC31917A2BE0028B862 /* Aspects.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5E435BA71917A2920028B862 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78BAEF4C191E3AD5006DABAF /* AspectsDemoTests.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\t5E435BB01917A2920028B862 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 5E435B891917A2910028B862 /* AspectsDemoOSX */;\n\t\t\ttargetProxy = 5E435BAF1917A2920028B862 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t5E435B961917A2910028B862 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B971917A2910028B862 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435B9C1917A2910028B862 /* Credits.rtf */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435B9D1917A2910028B862 /* en */,\n\t\t\t);\n\t\t\tname = Credits.rtf;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435BA21917A2910028B862 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435BA31917A2910028B862 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E435BB41917A2920028B862 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5E435BB51917A2920028B862 /* 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\t5E435BB91917A2920028B862 /* 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_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\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_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_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5E435BBA1917A2920028B862 /* 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_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\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.9;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5E435BBC1917A2920028B862 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemoOSX/AspectsDemoOSX-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemoOSX/AspectsDemoOSX-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5E435BBD1917A2920028B862 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemoOSX/AspectsDemoOSX-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemoOSX/AspectsDemoOSX-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5E435BBF1917A2920028B862 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/AspectsDemoOSX.app/Contents/MacOS/AspectsDemoOSX\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemoOSX/AspectsDemoOSX-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\tINFOPLIST_FILE = \"AspectsDemoOSXTests/AspectsDemoOSXTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5E435BC01917A2920028B862 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/AspectsDemoOSX.app/Contents/MacOS/AspectsDemoOSX\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"AspectsDemoOSX/AspectsDemoOSX-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"AspectsDemoOSXTests/AspectsDemoOSXTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t5E435B851917A2910028B862 /* Build configuration list for PBXProject \"AspectsDemoOSX\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5E435BB91917A2920028B862 /* Debug */,\n\t\t\t\t5E435BBA1917A2920028B862 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5E435BBB1917A2920028B862 /* Build configuration list for PBXNativeTarget \"AspectsDemoOSX\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5E435BBC1917A2920028B862 /* Debug */,\n\t\t\t\t5E435BBD1917A2920028B862 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5E435BBE1917A2920028B862 /* Build configuration list for PBXNativeTarget \"AspectsDemoOSXTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5E435BBF1917A2920028B862 /* Debug */,\n\t\t\t\t5E435BC01917A2920028B862 /* 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 = 5E435B821917A2910028B862 /* Project object */;\n}\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:AspectsDemoOSX.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX.xcodeproj/project.xcworkspace/xcshareddata/AspectsDemoOSX.xccheckout",
    "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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>BE9DB880-2611-435A-9782-57D047D30C1A</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>AspectsDemoOSX</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</key>\n\t\t<string>https://github.com/steipete/Aspects.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>AspectsDemoOSX/AspectsDemoOSX.xcodeproj/project.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</key>\n\t\t<string>../../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>https://github.com/steipete/Aspects.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>110</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</string>\n\t<key>IDESourceControlProjectWCConfigurations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IDESourceControlRepositoryExtensionIdentifierKey</key>\n\t\t\t<string>public.vcs.git</string>\n\t\t\t<key>IDESourceControlWCCIdentifierKey</key>\n\t\t\t<string>BFDD7EB6-262A-4289-BF40-2E5B677EEC58</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Aspects</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSX.xcodeproj/xcshareddata/xcschemes/AspectsDemoOSX.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0510\"\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 = \"5E435B891917A2910028B862\"\n               BuildableName = \"AspectsDemoOSX.app\"\n               BlueprintName = \"AspectsDemoOSX\"\n               ReferencedContainer = \"container:AspectsDemoOSX.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      buildConfiguration = \"Debug\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"5E435BAA1917A2920028B862\"\n               BuildableName = \"AspectsDemoOSXTests.xctest\"\n               BlueprintName = \"AspectsDemoOSXTests\"\n               ReferencedContainer = \"container:AspectsDemoOSX.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"5E435B891917A2910028B862\"\n            BuildableName = \"AspectsDemoOSX.app\"\n            BlueprintName = \"AspectsDemoOSX\"\n            ReferencedContainer = \"container:AspectsDemoOSX.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </TestAction>\n   <LaunchAction\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Debug\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"5E435B891917A2910028B862\"\n            BuildableName = \"AspectsDemoOSX.app\"\n            BlueprintName = \"AspectsDemoOSX\"\n            ReferencedContainer = \"container:AspectsDemoOSX.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"5E435B891917A2910028B862\"\n            BuildableName = \"AspectsDemoOSX.app\"\n            BlueprintName = \"AspectsDemoOSX\"\n            ReferencedContainer = \"container:AspectsDemoOSX.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "AspectsDemoOSX/AspectsDemoOSXTests/AspectsDemoOSXTests-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>com.pspdfkit.aspects.${PRODUCT_NAME:rfc1034identifier}</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": "AspectsDemoOSX/AspectsDemoOSXTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Info-watch.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.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "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>com.pspdfkit.$(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>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.4.1</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright (c) 2014 Peter Steinberger. Licensed under the MIT license.</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2015 Peter Steinberger, steipete@gmail.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "Aspects v1.4.2 🪝 - AOP for Objective-C (10k+ stars) [![Build Status](https://travis-ci.org/steipete/Aspects.svg?branch=master)](https://travis-ci.org/steipete/Aspects) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n==============\n\nA delightful, simple library for aspect oriented programming by [@steipete](http://twitter.com/steipete).\n\n**Think of Aspects as method swizzling on steroids. It allows you to add code to existing methods per class or per instance**, whilst thinking of the insertion point e.g. before/instead/after. Aspects automatically deals with calling super and is easier to use than regular method swizzling.\n\nAspects hooks deep into the class hierarchy and creates dynamic subclasses, much like KVO. There's known issues with this approach, and to this date (February 2019) **I STRICTLY DO NOT RECOMMEND TO USE Aspects IN PRODUCTION CODE**. We use it for partial test mocks in, [PSPDFKit, an iOS PDF framework that ships with apps like Dropbox or Evernote](http://pspdfkit.com), it's also very useful for quickly hacking something up.\n\nAspects uses `_objc_msgForward` which causes issues with other code that uses message forwarding.\n\nAspects extends `NSObject` with the following methods:\n\n``` objc\n/// Adds a block of code before/instead/after the current `selector` for a specific class.\n///\n/// @param block Aspects replicates the type signature of the method being hooked.\n/// The first parameter will be `id<AspectInfo>`, followed by all parameters of the method.\n/// These parameters are optional and will be filled to match the block signature.\n/// You can even use an empty block, or one that simple gets `id<AspectInfo>`.\n///\n/// @note Hooking static methods is not supported.\n/// @return A token which allows to later deregister the aspect.\n+ (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                      withOptions:(AspectOptions)options\n                       usingBlock:(id)block\n                            error:(NSError **)error;\n\n/// Adds a block of code before/instead/after the current `selector` for a specific instance.\n- (id<AspectToken>)aspect_hookSelector:(SEL)selector\n                      withOptions:(AspectOptions)options\n                       usingBlock:(id)block\n                            error:(NSError **)error;\n\n/// Deregister an aspect.\n/// @return YES if deregistration is successful, otherwise NO.\nid<AspectToken> aspect = ...;\n[aspect remove];\n```\n\nAdding aspects returns an opaque token of type `AspectToken` which can be used to deregister again. All calls are thread-safe.\n\nAspects uses Objective-C message forwarding to hook into messages. This will create some overhead. Don't add aspects to methods that are called a lot. Aspects is meant for view/controller code that is not called 1000 times per second.\n\nAspects calls and matches block arguments. Blocks without arguments are supported as well. The first block argument will be of type `id<AspectInfo>`.\n\nWhen to use Aspects\n-------------------\nAspect-oriented programming (AOP) is used to encapsulate \"cross-cutting\" concerns. These are the kind of requirements that *cut-across* many modules in your system, and so cannot be encapsulated using normal object oriented programming. Some examples of these kinds of requirements: \n\n* *Whenever* a user invokes a method on the service client, security should be checked. \n* *Whenever* a user interacts with the store, a genius suggestion should be presented, based on their interaction. \n* *All* calls should be logged. \n\nIf we implemented the above requirements using regular OOP there'd be some drawbacks: \n\nGood OOP says a class should have a single responsibility, however adding on extra *cross-cutting* requirements means a class that is taking on other responsibilites. For example you might have a **StoreClient** that is supposed to be all about making purchases from an online store. Add in some cross-cutting requirements and it might also have to take on the roles of logging, security and recommendations. This is not great because: \n\n* Our StoreClient is now harder to understand and maintain.\n* These cross-cutting requirements are duplicated and spread throughout our app. \n\nAOP lets us modularize these cross-cutting requirements, and then cleanly identify all of the places they should be applied. As shown in the examples above cross-cutting requirements can be either technical or business focused in nature.  \n\n## Here are some concrete examples: \n\n\nAspects can be used to **dynamically add logging** for debug builds only:\n\n``` objc\n[UIViewController aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo, BOOL animated) {\n    NSLog(@\"View Controller %@ will appear animated: %tu\", aspectInfo.instance, animated);\n} error:NULL];\n```\n\n-------------------\nIt can be used to greatly simplify your analytics setup:\nhttps://github.com/orta/ARAnalytics\n\n-------------------\nYou can check if methods are really being called in your test cases:\n``` objc\n- (void)testExample {\n    TestClass *testClass = [TestClass new];\n    TestClass *testClass2 = [TestClass new];\n\n    __block BOOL testCallCalled = NO;\n    [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^{\n        testCallCalled = YES;\n    } error:NULL];\n\n    [testClass2 testCallAndExecuteBlock:^{\n        [testClass testCall];\n    } error:NULL];\n    XCTAssertTrue(testCallCalled, @\"Calling testCallAndExecuteBlock must call testCall\");\n}\n```\n-------------------\nIt can be really useful for debugging. Here I was curious when exactly the tap gesture changed state:\n\n``` objc\n[_singleTapGesture aspect_hookSelector:@selector(setState:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {\n    NSLog(@\"%@: %@\", aspectInfo.instance, aspectInfo.arguments);\n} error:NULL];\n```\n\n-------------------\nAnother convenient use case is adding handlers for classes that you don't own. I've written it for use in [PSPDFKit](http://pspdfkit.com), where we require notifications when a view controller is being dismissed modally. This includes UIKit view controllers like `MFMailComposeViewController` and `UIImagePickerController`. We could have created subclasses for each of these controllers, but this would be quite a lot of unnecessary code. Aspects gives you a simpler solution for this problem:\n\n``` objc\n@implementation UIViewController (DismissActionHook)\n\n// Will add a dismiss action once the controller gets dismissed.\n- (void)pspdf_addWillDismissAction:(void (^)(void))action {\n    PSPDFAssert(action != NULL);\n\n    [self aspect_hookSelector:@selector(viewWillDisappear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> aspectInfo) {\n        if ([aspectInfo.instance isBeingDismissed]) {\n            action();\n        }\n    } error:NULL];\n}\n\n@end\n```\n\nDebugging\n---------\nAspects identifies itself nicely in the stack trace, so it's easy to see if a method has been hooked:\n\n<img src=\"https://raw.githubusercontent.com/steipete/Aspects/master/stacktrace@2x.png?token=58493__eyJzY29wZSI6IlJhd0Jsb2I6c3RlaXBldGUvQXNwZWN0cy9tYXN0ZXIvc3RhY2t0cmFjZUAyeC5wbmciLCJleHBpcmVzIjoxMzk5NzQ3OTI3fQ%3D%3D--97cf7e7bac491149eb8db3d1b9a562ab88154a3c\" width=\"75%\">\n\nUsing Aspects with non-void return types\n----------------------------------------\n\nYou can use the invocation object to customize the return value:\n\n``` objc\n    [PSPDFDrawView aspect_hookSelector:@selector(shouldProcessTouches:withEvent:) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> info, NSSet *touches, UIEvent *event) {\n        // Call original implementation.\n        BOOL processTouches;\n        NSInvocation *invocation = info.originalInvocation;\n        [invocation invoke];\n        [invocation getReturnValue:&processTouches];\n\n        if (processTouches) {\n            processTouches = pspdf_stylusShouldProcessTouches(touches, event);\n            [invocation setReturnValue:&processTouches];\n        }\n    } error:NULL];\n```\n\nInstallation\n------------\nThe simplest option is to use `pod \"Aspects\"`.\n\nYou can also add the two files `Aspects.h/m` to your project. There are no further requirements.\n\nCompatibility and Limitations\n-----------------------------\nAspects uses quite some runtime trickery to achieve what it does. You can mostly mix this with regular method swizzling.\n\nAn important limitation is that for class-based hooking, a method can only be hooked once within the subclass hierarchy. [See #2](https://github.com/steipete/Aspects/issues/2)\nThis does not apply for objects that are hooked. Aspects creates a dynamic subclass here and has full control.\n\nKVO works if observers are created after your calls `aspect_hookSelector:` It most likely will crash the other way around. Still looking for workarounds here - any help appreciated.\n\nBecause of ugly implementation details on the ObjC runtime, methods that return unions that also contain structs might not work correctly unless this code runs on the arm64 runtime.\n\nCredits\n-------\nThe idea to use `_objc_msgForward` and parts of the `NSInvocation` argument selection is from the excellent [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa) from the GitHub guys. [This article](http://codeshaker.blogspot.co.at/2012/01/aop-delivered.html) explains how it works under the hood.\n\n\nSupported iOS & SDK Versions\n-----------------------------\n\n* Aspects requires ARC.\n* Aspects is tested with iOS 7+ and OS X 10.7 or higher.\n\nLicense\n-------\nMIT licensed, Copyright (c) 2014 Peter Steinberger, steipete@gmail.com, [@steipete](http://twitter.com/steipete)\n\n\nRelease Notes\n-----------------\n\nVersion 1.4.2\n\n- Allow to hook different subclasses.\n- Smaller tweaks.\n\nVersion 1.4.1\n\n- Rename error codes.\n\nVersion 1.4.0\n\n- Add support for block signatures that match method signatures. (thanks to @nickynick)\n\nVersion 1.3.1\n\n- Add support for OS X 10.7 or higher. (thanks to @ashfurrow)\n\nVersion 1.3.0\n\n- Add automatic deregistration.\n- Checks if the selector exists before trying to hook.\n- Improved dealloc hooking. (no more unsafe_unretained needed)\n- Better examples.\n- Always log errors.\n\nVersion 1.2.0\n\n- Adds error parameter.\n- Improvements in subclassing registration tracking.\n\nVersion 1.1.0\n\n- Renamed the files from NSObject+Aspects.m/h to just Aspects.m/h.\n- Removing now works via calling `remove` on the aspect token.\n- Allow hooking dealloc.\n- Fixes infinite loop if the same method is hooked for multiple classes. Hooking will only work for one class in the hierarchy.\n- Additional checks to prevent things like hooking retain/release/autorelease or forwardInvocation:\n- The original implementation of forwardInvocation is now correctly preserved.\n- Classes are properly cleaned up and restored to the original state after the last hook is deregistered.\n- Lots and lots of new test cases!\n\nVersion 1.0.1\n\n- Minor tweaks and documentation improvements.\n\nVersion 1.0.0\n\n- Initial release\n"
  }
]