6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 4901ddcd

AuthorNKL<nikolaj.king@gmail.com>
Date2025-06-12 10:14:07 +0200
before push

Changed files

comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.h    |   32 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.m    |  114 --
 comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.h    |   35 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.m    |  110 --
 .../ios/Pods/BerTlv/BerTlv/BerTlv.modulemap        |    6 -
 .../ios/Pods/BerTlv/BerTlv/BerTlvBuilder.h         |   45 -
 .../ios/Pods/BerTlv/BerTlv/BerTlvBuilder.m         |  260 ---
 .../ios/Pods/BerTlv/BerTlv/BerTlvErrors.h          |   18 -
 .../ios/Pods/BerTlv/BerTlv/BerTlvErrors.m          |   29 -
 .../ios/Pods/BerTlv/BerTlv/BerTlvParser.h          |   23 -
 .../ios/Pods/BerTlv/BerTlv/BerTlvParser.m          |  273 ---
 .../ios/Pods/BerTlv/BerTlv/BerTlvUmbrella.h        |   11 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.h   |   25 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.m   |   52 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.h   |   19 -
 comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.m   |  116 --
 comwell_key_app/ios/Pods/BerTlv/LICENSE.txt        |  202 ---
 comwell_key_app/ios/Pods/BerTlv/README.md          |   87 -
 .../ios/Pods/CocoaLumberjack/CHANGELOG.md          |  638 -------
 comwell_key_app/ios/Pods/CocoaLumberjack/LICENSE   |   14 -
 comwell_key_app/ios/Pods/CocoaLumberjack/README.md |  301 ----
 .../Sources/CocoaLumberjack/CLI/CLIColor.m         |   57 -
 .../Sources/CocoaLumberjack/DDASLLogCapture.m      |  205 ---
 .../Sources/CocoaLumberjack/DDASLLogger.m          |  133 --
 .../CocoaLumberjack/DDAbstractDatabaseLogger.m     |  636 -------
 .../CocoaLumberjack/DDFileLogger+Internal.h        |   31 -
 .../Sources/CocoaLumberjack/DDFileLogger.m         | 1865 --------------------
 .../Sources/CocoaLumberjack/DDLog.m                | 1321 --------------
 .../Sources/CocoaLumberjack/DDLoggerNames.m        |   21 -
 .../Sources/CocoaLumberjack/DDOSLogger.m           |  158 --
 .../Sources/CocoaLumberjack/DDTTYLogger.m          | 1446 ---------------
 .../DDContextFilterLogFormatter+Deprecated.m       |   57 -
 .../Extensions/DDContextFilterLogFormatter.m       |  185 --
 .../Extensions/DDDispatchQueueLogFormatter.m       |  240 ---
 .../Extensions/DDFileLogger+Buffering.m            |  202 ---
 .../CocoaLumberjack/Extensions/DDMultiFormatter.m  |  110 --
 .../Sources/CocoaLumberjack/PrivacyInfo.xcprivacy  |   30 -
 .../Supporting Files/CocoaLumberjack.h             |  104 --
 .../Supporting Files/DDLegacyMacros.h              |   75 -
 .../include/CocoaLumberjack/CLIColor.h             |   54 -
 .../include/CocoaLumberjack/DDASLLogCapture.h      |   46 -
 .../include/CocoaLumberjack/DDASLLogger.h          |   63 -
 .../CocoaLumberjack/DDAbstractDatabaseLogger.h     |  127 --
 .../include/CocoaLumberjack/DDAssertMacros.h       |   30 -
 .../DDContextFilterLogFormatter+Deprecated.h       |  119 --
 .../CocoaLumberjack/DDContextFilterLogFormatter.h  |  117 --
 .../CocoaLumberjack/DDDispatchQueueLogFormatter.h  |  223 ---
 .../CocoaLumberjack/DDFileLogger+Buffering.h       |   27 -
 .../include/CocoaLumberjack/DDFileLogger.h         |  571 ------
 .../include/CocoaLumberjack/DDLog+LOGV.h           |   82 -
 .../include/CocoaLumberjack/DDLog.h                | 1024 -----------
 .../include/CocoaLumberjack/DDLogMacros.h          |  101 --
 .../include/CocoaLumberjack/DDLoggerNames.h        |   30 -
 .../include/CocoaLumberjack/DDMultiFormatter.h     |   60 -
 .../include/CocoaLumberjack/DDOSLogger.h           |  106 --
 .../include/CocoaLumberjack/DDTTYLogger.h          |  186 --
 .../Pods/JSONModel/JSONModel/JSONModel/JSONModel.h |  284 ---
 .../Pods/JSONModel/JSONModel/JSONModel/JSONModel.m | 1387 ---------------
 .../JSONModel/JSONModel/JSONModelClassProperty.h   |   48 -
 .../JSONModel/JSONModel/JSONModelClassProperty.m   |   53 -
 .../JSONModel/JSONModel/JSONModel/JSONModelError.h |  103 --
 .../JSONModel/JSONModel/JSONModel/JSONModelError.m |   82 -
 .../ios/Pods/JSONModel/JSONModel/JSONModelLib.h    |   19 -
 .../JSONModel/JSONModelNetworking/JSONAPI.h        |   19 -
 .../JSONModel/JSONModelNetworking/JSONAPI.m        |  145 --
 .../JSONModel/JSONModelNetworking/JSONHTTPClient.h |   33 -
 .../JSONModel/JSONModelNetworking/JSONHTTPClient.m |  361 ----
 .../JSONModelNetworking/JSONModel+networking.h     |   18 -
 .../JSONModelNetworking/JSONModel+networking.m     |  101 --
 .../JSONModelTransformations/JSONKeyMapper.h       |   96 -
 .../JSONModelTransformations/JSONKeyMapper.m       |  146 --
 .../JSONValueTransformer.h                         |  209 ---
 .../JSONValueTransformer.m                         |  246 ---
 comwell_key_app/ios/Pods/JSONModel/LICENSE         |   18 -
 comwell_key_app/ios/Pods/JSONModel/README.md       |  395 -----
 comwell_key_app/ios/Runner/Runner.entitlements     |    5 +-
 .../ios/Runner/RunnerDebug-develop.entitlements    |    2 -
 .../ios/Runner/RunnerRelease.entitlements          |    5 +-
 78 files changed, 2 insertions(+), 16025 deletions(-)

Diff

diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.h
deleted file mode 100644
index f9012ed8..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@interface BerTag : NSObject
-
-@property(nonatomic, copy) NSData *data;;
-
-- (id __nullable) init:(NSData *)aData
- offset:(uint)aOffset
- length:(uint)aLength;
-
-- (id) init:(uint8_t)aFirstByte;
-- (id) init:(uint8_t)aFirstByte secondByte:(uint8_t)aSecondByte;
-- (id) init:(uint8_t)aFirstByte secondByte:(uint8_t)aSecondByte thirdByte:(uint8_t)aThirdByte;
-
-- (BOOL)isConstructed;
-
-- (BOOL)isEqual:(id __nullable)object;
-- (BOOL)isEqualToTag:(BerTag *)tag;
-- (NSUInteger)hash;
-- (NSString *)description;
-
-- (NSString *)hex;
-
-+ (BerTag *)parse:(NSString *)aHexString;
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.m
deleted file mode 100644
index 8d8f63ab..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTag.m
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTag.h"
-#import "HexUtil.h"
-
-
-@implementation BerTag {
-}
-
-@synthesize data;
-
-- (id)init:(NSData *)aData offset:(uint)aOffset length:(uint)aLength {
- self = [super init];
- if(self) {
- if (aOffset + aLength <= aData.length) {
- NSRange range = {aOffset, aLength};
- data = [aData subdataWithRange:range];
- } else {
- return nil;
- }
- }
- return self;
-}
-
-- (id)init:(uint8_t)aFirstByte {
- self = [super init];
- if(self) {
- data = [NSData dataWithBytes:&aFirstByte length:1];
- }
- return self;
-}
-
-- (id)init:(uint8_t)aFirstByte secondByte:(uint8_t)aSecondByte {
- self = [super init];
- if(self) {
- uint8_t bytes[2];
- bytes[0] = aFirstByte;
- bytes[1] = aSecondByte;
- data = [NSData dataWithBytes:bytes length:2];
- }
- return self;
-}
-
-- (id)init:(uint8_t)aFirstByte secondByte:(uint8_t)aSecondByte thirdByte:(uint8_t)aThirdByte {
- self = [super init];
- if(self) {
- uint8_t bytes[3];
- bytes[0] = aFirstByte;
- bytes[1] = aSecondByte;
- bytes[2] = aThirdByte;
- data = [NSData dataWithBytes:bytes length:3];
- }
- return self;
-}
-
-- (BOOL)isConstructed {
- if (!data) return true;
- uint8_t *bytes = (uint8_t *) data.bytes;
- // 0x20
- return (bytes[0] & 0b00100000) != 0;
-}
-
-- (BOOL)isEqual:(id)other {
- if (other == self) {
- return YES;
- }
-
- if (!other || ![[other class] isEqual:[self class]]) {
- return NO;
- }
-
- return [self isEqualToTag:other];
-}
-
-- (BOOL)isEqualToTag:(BerTag *)tag {
- if (self == tag) {
- return YES;
- }
-
- if (tag == nil) {
- return NO;
- }
-
- return !(data != tag->data && ![data isEqualToData:tag->data]);
-}
-
-- (NSUInteger)hash {
- return [data hash];
-}
-
-- (NSString *)description {
- NSMutableString *description = [NSMutableString stringWithCapacity:data.length+2];
- if(self.isConstructed) {
- [description appendFormat:@"+ "];
- } else {
- [description appendFormat:@"- "];
- }
- [description appendFormat:@"%@", [HexUtil format:data]];
- return [description copy];
-}
-
-+ (BerTag *)parse:(NSString *)aHexString {
- NSData *data = [HexUtil parse:aHexString error:nil];
- return [[BerTag alloc] init:data offset:0 length:(uint)data.length];
-}
-
-- (NSString *)hex {
- return [HexUtil format:data];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.h
deleted file mode 100644
index 320f7b53..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// BerTlv.h
-// BerTlv
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@class BerTag;
-
-@interface BerTlv : NSObject
-
-@property(copy, nonatomic, readonly) BerTag * tag ;
-@property(copy, nonatomic, readonly, nullable) NSData * value ;
-@property(copy, nonatomic, readonly, nullable) NSArray * list ;
-@property(nonatomic, readonly) BOOL primitive ;
-@property(nonatomic, readonly) BOOL constructed ;
-
-- (id)init:(BerTag *)aTag value:(NSData *)aValue;
-- (id)init:(BerTag *)aTag array:(NSArray *)aArray;
-
-- (BOOL) hasTag:(BerTag *)aTag;
-- (BerTlv * _Nullable) find:(BerTag *)aTag;
-- (NSArray *) findAll:(BerTag *)aTag;
-
-- (NSString * _Nullable) hexValue;
-- (NSString * _Nullable) textValue;
-
-- (NSString *) dump:(NSString *)aPadding;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.m
deleted file mode 100644
index 186f7de8..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.m
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// BerTlv.m
-// BerTlv
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTlv.h"
-#import "BerTag.h"
-#import "HexUtil.h"
-#import "BerTlvErrors.h"
-
-@implementation BerTlv
-
-@synthesize tag, value, list, constructed, primitive;
-
-- (id)init:(BerTag *)aTag array:(NSArray *)aArray {
- self = [super init];
- if(self) {
- tag = aTag;
- list = aArray;
- constructed = aTag.isConstructed;
- primitive = !constructed;
- }
- return self;
-}
-
-- (id)init:(BerTag *)aTag value:(NSData *)aValue {
- self = [super init];
- if(self) {
- tag = aTag;
- value = aValue;
- constructed = aTag.isConstructed;
- primitive = !constructed;
- }
- return self;
-}
-
-- (BOOL)hasTag:(BerTag *)aTag {
- return [self find:aTag] != nil;
-}
-
-- (BerTlv *)find:(BerTag *)aTag {
- if([aTag isEqualToTag:tag]) {
- return self;
- }
-
- if(primitive) {
- return nil;
- }
-
- for(BerTlv *tlv in list) {
- BerTlv *found = [tlv find:aTag];
- if(found!=nil) {
- return found;
- }
- }
-
- return nil;
-}
-
-- (NSArray *)findAll:(BerTag *)aTag {
- NSMutableArray *array = [[NSMutableArray alloc] init];
- if([aTag isEqualToTag:tag]) {
- [array addObject:self];
- }
-
- if(constructed) {
- for( BerTlv * tlv in list) {
- NSArray *found = [tlv findAll:aTag];
- [array addObjectsFromArray:found];
- }
- }
-
- return [array copy];
-}
-
-- (NSString *)hexValue {
- if (constructed) {
- NSLog(@"Tag %@ is constructed", tag);
- return nil;
- } else {
- return [HexUtil format:value];
- }
-}
-
-- (NSString *)textValue {
- return [[NSString alloc] initWithData:self.value encoding:NSASCIIStringEncoding];
-}
-
-- (NSString *)dump:(NSString *)aPadding {
- NSMutableString *sb = [[NSMutableString alloc] init];
-
- if(primitive) {
- [sb appendFormat:@"%@ - [%@] %@\n", aPadding, tag.hex, [self hexValue]];
- } else {
- [sb appendFormat:@"%@ + [%@]\n", aPadding, tag.hex];
- NSMutableString *childPadding = [[NSMutableString alloc] init];
- [childPadding appendString:aPadding];
- [childPadding appendString:aPadding];
- for (BerTlv *tlv in list) {
- [sb appendString:[tlv dump:childPadding]];
- }
- }
- return [sb copy];
-}
-
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.modulemap b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.modulemap
deleted file mode 100644
index 1e712bca..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlv.modulemap
+++ /dev/null
@@ -1,6 +0,0 @@
-framework module BerTlv {
- umbrella header "BerTlvUmbrella.h"
-
- export *
- module * { export * }
-}
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.h
deleted file mode 100644
index 832f1cfb..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// Created by Evgeniy Sinev on 06/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@class BerTlv;
-@class BerTlvs;
-@class BerTag;
-
-
-NS_ASSUME_NONNULL_BEGIN
-@interface BerTlvBuilder : NSObject
-
-// initialize
-- (id)init;
-- (id)initWithTlv :(BerTlv * ) aTlv ;
-- (id)initWithTlvs :(BerTlvs * ) aTlvs ;
-- (id)initWithTemplate :(BerTag * ) aTag ;
-
-// build
-- (NSData *) buildData __deprecated NS_SWIFT_UNAVAILABLE("");
-- (NSData * _Nullable) buildDataWithError:(NSError **)error;
-
-- (BerTlvs *) buildTlvs __deprecated NS_SWIFT_UNAVAILABLE("");
-- (BerTlvs * _Nullable) buildTlvsWithError:(NSError **)error;
-
-- (BerTlv *) buildTlv __deprecated NS_SWIFT_UNAVAILABLE("");
-- (BerTlv * _Nullable) buildTlvWithError:(NSError **)error;
-
-// add values
-// return BOOL indicates success
-- (BOOL) addBerTlv :(BerTlv *) aTlv ;
-- (BOOL) addBerTlvs :(BerTlvs *) aTlvs;
-- (BOOL) addAmount :(NSDecimalNumber *) aAmount tag:(BerTag *)aTag;
-- (void) addDate :(NSDate *) aDate tag:(BerTag *)aTag;
-- (void) addTime :(NSDate *) aTime tag:(BerTag *)aTag;
-- (BOOL) addText :(NSString *) aText tag:(BerTag *)aTag;
-- (BOOL) addBcd :(NSUInteger ) aValue tag:(BerTag *)aTag length :(NSUInteger )aLength;
-- (BOOL) addBytes :(NSData *) aBuf tag:(BerTag *)aTag;
-- (BOOL) addHex :(NSString *) aHex tag:(BerTag *)aTag;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.m
deleted file mode 100644
index e20f5893..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvBuilder.m
+++ /dev/null
@@ -1,260 +0,0 @@
-//
-// Created by Evgeniy Sinev on 06/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTlvBuilder.h"
-#import "BerTlv.h"
-#import "BerTlvs.h"
-#import "BerTag.h"
-#import "HexUtil.h"
-#import "BerTlvParser.h"
-#import "BerTlvErrors.h"
-
-
-@implementation BerTlvBuilder {
- NSMutableData *data;
- BerTag *templateTag;
-}
-
-- (id)init {
- self = [super init];
- if (self) {
- data = [[NSMutableData alloc] initWithCapacity:0xff];
- }
-
- return self;
-}
-
-- (id)initWithTemplate:(BerTag *)aTag {
- self = [super init];
- if (self) {
- data = [[NSMutableData alloc] initWithCapacity:0xff];
- templateTag = aTag;
- }
- return self;
-}
-
-- (id)initWithTlv:(BerTlv *)aTlv {
- self = [super init];
- if (self) {
- data = [[NSMutableData alloc] initWithCapacity:0xff];
- if(aTlv.primitive) {
- [self addBytes:aTlv.value tag:aTlv.tag];
- } else {
- templateTag = aTlv.tag;
- for (BerTlv *tlv in aTlv.list) {
- [self addBerTlv:tlv];
- }
- }
- }
- return self;
-}
-
-- (id)initWithTlvs:(BerTlvs *)aTlvs {
- self = [super init];
- if (self) {
- data = [[NSMutableData alloc] initWithCapacity:0xff];
- [self addBerTlvs:aTlvs];
- }
- return self;
-}
-
-- (BOOL)addBcd:(NSUInteger )aValue tag:(BerTag *)aTag length:(NSUInteger )aLength {
- NSMutableString *hex = [NSMutableString stringWithFormat:@"%@", @(aValue)];
- for(int i=0; hex.length < aLength*2 && i<100; i++) {
- [hex insertString:@"0" atIndex:0];
- }
- return [self addHex:[hex copy] tag:aTag];
-}
-
-- (BOOL)addAmount:(NSDecimalNumber *)aAmount tag:(BerTag *)aTag {
- NSUInteger cents = [aAmount decimalNumberByMultiplyingBy:[[NSDecimalNumber alloc] initWithInt:100]].unsignedIntegerValue;
- return [self addBcd:cents tag:aTag length:6];
-}
-
-- (void)addDate:(NSDate *)aDate tag:(BerTag *)aTag {
- NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
- [dateFormat setDateFormat: @"yyMMdd"];
- NSString *hex = [dateFormat stringFromDate:aDate];
- [self addHex:hex tag:aTag];
-}
-
-- (void)addTime:(NSDate *)aTime tag:(BerTag *)aTag {
- NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
- [dateFormat setDateFormat: @"HHmmss"];
- NSString *hex = [dateFormat stringFromDate:aTime];
- [self addHex:hex tag:aTag];
-}
-
-- (BOOL)addBytes:(NSData *)aBuf tag:(BerTag *)aTag {
- NSData * lenData = [self createLengthData:aBuf.length error:nil];
- if (lenData == nil) {
- return NO;
- }
-
- // TYPE
- [data appendData:aTag.data];
-
- // LEN
- [data appendData:lenData];
-
- // VALUE
- [data appendData:aBuf];
- return YES;
-}
-
-- (BOOL)addText:(NSString *)aText tag:(BerTag *)aTag {
- NSData *buf = [aText dataUsingEncoding:NSASCIIStringEncoding];
- return [self addBytes:buf tag:aTag];
-}
-
-- (BOOL)addHex:(NSString *)aHex tag:(BerTag *)aTag {
- NSData *buf = [HexUtil parse:aHex error:nil];
- return [self addBytes:buf tag:aTag];
-}
-
-- (NSData *) buildData __deprecated {
- return [self buildDataWithError: nil];
-}
-
-- (NSData *)buildDataWithError:(NSError **)error {
- // no template tag so can simply return data buffer
- if (templateTag == nil) {
- return data;
- }
-
- // calculates bytes count for TYPE and LENGTH
- NSUInteger typeBytesCount = templateTag.data.length;
- NSUInteger lengthBytesCount = [self calcBytesCountForLength:data.length error:error];
- if (lengthBytesCount == 0) {
- return nil;
- }
-
- NSMutableData *ret = [[NSMutableData alloc] initWithCapacity:
- + typeBytesCount
- + lengthBytesCount
- + data.length
- ];
-
- // TYPE
- [ret appendData:templateTag.data];
-
- // LENGTH
- NSData *lengthData = [self createLengthData:data.length error:error];
- if (lengthData == nil) {
- return nil;
- }
- [ret appendData:lengthData];
-
- // VALUE
- [ret appendData:data];
-
- return [ret copy];
-}
-
-- (NSData *)createLengthData:(NSUInteger)aLength error:(NSError **)error {
- if(aLength < 0x80) {
- uint8_t buf[1];
- buf[0] = (uint8_t) aLength;
- return [NSData dataWithBytes:buf length:1];
-
- } else if (aLength <0x100) {
- uint8_t buf[2];
- buf[0] = 0x81;
- buf[1] = (uint8_t) aLength;
- return [NSData dataWithBytes:buf length:2];
-
- } else if( aLength < 0x10000) {
- uint8_t buf[3];
- buf[0] = 0x82;
- buf[1] = (uint8_t) (aLength / 0x100);
- buf[2] = (uint8_t) (aLength % 0x100);
- return [NSData dataWithBytes:buf length:3];
-
- } else if( aLength < 0x1000000 ) {
- uint8_t buf[4];
- buf[0] = 0x83;
- buf[1] = (uint8_t) (aLength / 0x10000);
- buf[2] = (uint8_t) (aLength / 0x100);
- buf[3] = (uint8_t) (aLength % 0x100);
- return [NSData dataWithBytes:buf length:4];
-
- } else {
- NSLog(@"Length [%lu] is out of range ( > 0x1000000)", (unsigned long) aLength);
- return nil;
- }
-}
-
-- (BerTlv *) buildTlv __deprecated {
- return [self buildTlvWithError:nil];
-}
-
-- (BerTlv *)buildTlvWithError:(NSError **)error {
- BerTlvParser * parser = [[BerTlvParser alloc] init];
- NSData *builtData = [self buildDataWithError:error];
- return builtData ? [parser parseConstructed:builtData error:error] : nil;
-}
-
-- (BerTlvs *) buildTlvs __deprecated {
- return [self buildTlvsWithError:nil];
-}
-
-- (BerTlvs *)buildTlvsWithError:(NSError **)error {
- BerTlvParser * parser = [[BerTlvParser alloc] init];
- NSData *builtData = [self buildDataWithError:error];
- return builtData ? [parser parseTlvs:builtData error:error] : nil;
-}
-
-- (NSUInteger) calcBytesCountForLength:(NSUInteger)aLength error:(NSError **)error {
- NSUInteger ret;
- if(aLength < 0x80) {
- ret = 1;
- } else if (aLength <0x100) {
- ret = 2;
- } else if( aLength < 0x10000) {
- ret = 3;
- } else if( aLength < 0x1000000 ) {
- ret = 4;
- } else {
- ret = 0;
- if (error) {
- *error = [BerTlvErrors lengthOutOfRange:(unsigned long) aLength];
- }
- }
- return ret;
-}
-
-
-- (BOOL)addBerTlv:(BerTlv *)aTlv {
- // primitive
- if(aTlv.primitive) {
- return [self addBytes:aTlv.value tag:aTlv.tag];
-
- // constructed
- } else {
- BerTlvBuilder *builder = [[BerTlvBuilder alloc] initWithTemplate:aTlv.tag];
- for (BerTlv *tlv in aTlv.list) {
- [builder addBerTlv:tlv];
- }
- NSData *builtData = [builder buildDataWithError:nil];
- if (builtData) {
- [data appendData:builtData];
- return YES;
- }
- return NO;
- }
-}
-
-- (BOOL)addBerTlvs:(BerTlvs *)aTlvs {
- for (BerTlv *tlv in aTlvs.list) {
- BOOL success = [self addBerTlv:tlv];
- if (!success) {
- return NO;
- }
- }
- return YES;
-}
-
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.h
deleted file mode 100644
index 5d153e86..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// Created by Alex Kent on 2017-08-30.
-// Copyright © 2017 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "BerTag.h"
-
-NS_ASSUME_NONNULL_BEGIN
-@interface BerTlvErrors : NSObject
-
-+ (NSError *)invalidHexString;
-+ (NSError *)outOfRangeAtOffset:(uint)aOffset length:(NSUInteger)aLen bufferLength:(NSUInteger)aBufLen level:(NSUInteger)aLevel;
-+ (NSError *)badLengthAtOffset:(uint)aOffset numberOfBytes:(NSUInteger)numberOfBytes;
-+ (NSError *)lengthOutOfRange:(unsigned long)aLength;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.m
deleted file mode 100644
index a76ddde2..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvErrors.m
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Created by Alex Kent on 2017-08-30.
-// Copyright © 2017 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTlvErrors.h"
-
-#define kBerTlvErrorDomain @"com.payneteasy.BerTlvFramework"
-
-@implementation BerTlvErrors
-
-+ (NSError *)invalidHexString {
- return [[NSError alloc] initWithDomain:kBerTlvErrorDomain code:0 userInfo: @{NSLocalizedDescriptionKey : NSLocalizedString(@"Invalid Hex string", "")}];
-}
-
-+ (NSError *)outOfRangeAtOffset:(uint)aOffset length:(NSUInteger)aLen bufferLength:(NSUInteger)aBufLen level:(NSUInteger)aLevel {
- return [[NSError alloc] initWithDomain:kBerTlvErrorDomain code:1 userInfo: @{NSLocalizedDescriptionKey : [NSString stringWithFormat:NSLocalizedString(@"Length is out of the range [offset=%d, len=%d, array.length=%lu, level=%d]", ""), aOffset, aLen, aBufLen, aLevel] }];
-}
-
-
-+ (NSError *)badLengthAtOffset:(uint)aOffset numberOfBytes:(NSUInteger)numberOfBytes {
- return [[NSError alloc] initWithDomain:kBerTlvErrorDomain code:2 userInfo: @{NSLocalizedDescriptionKey : [NSString stringWithFormat:NSLocalizedString(@"At position %d the len is more then 3 [%d]", ""), aOffset, numberOfBytes]}];
-}
-
-+ (NSError *)lengthOutOfRange:(unsigned long)aLength {
- return [[NSError alloc] initWithDomain:kBerTlvErrorDomain code:2 userInfo: @{NSLocalizedDescriptionKey : [NSString stringWithFormat:NSLocalizedString(@"Length [%lu] is out of range ( > 0x1000000)", ""), aLength]}];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.h
deleted file mode 100644
index b1812aaa..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Created by Evgeniy Sinev on 05/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@class BerTlv;
-@class BerTlvs;
-
-NS_ASSUME_NONNULL_BEGIN
-@interface BerTlvParser : NSObject
-
-- (BerTlv *)parseConstructed:(NSData *)aData __deprecated NS_SWIFT_UNAVAILABLE("");
-- (BerTlv * _Nullable)parseConstructed:(NSData *)aData error:(NSError **)error;
-
-- (BerTlvs *)parseTlvs:(NSData *)aData __deprecated NS_SWIFT_UNAVAILABLE("");
-- (BerTlvs * _Nullable)parseTlvs:(NSData *)aData error:(NSError **)error;
-
-- (BerTlvs *)parseTlvs:(NSData *)aData numberOfTags:(NSUInteger)numberOfTags __deprecated NS_SWIFT_UNAVAILABLE("");
-- (BerTlvs * _Nullable)parseTlvs:(NSData *)aData numberOfTags:(NSUInteger)numberOfTags error:(NSError **)error;
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.m
deleted file mode 100644
index 494f9592..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvParser.m
+++ /dev/null
@@ -1,273 +0,0 @@
-//
-// Created by Evgeniy Sinev on 05/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTlvParser.h"
-#import "BerTlv.h"
-#import "HexUtil.h"
-#import "BerTag.h"
-#import "BerTlvs.h"
-#import "BerTlvErrors.h"
-
-
-static int IS_DEBUG_ENABLED = 0; // note, running the testFuzzer unit test with this enabled may take a long time.
-
-@implementation BerTlvParser
-
-- (BerTlv *)parseConstructed:(NSData *)aData __deprecated {
- return [self parseConstructed:aData error:nil];
-}
-
-- (BerTlv *)parseConstructed:(NSData *)aData error:(NSError **)error {
- uint result=0;
- BerTlv * ret = [self parseWithResult:&result data:aData offset:0 len:(uint)aData.length level:0 error: error];
- return ret;
-}
-
-- (BerTlvs *)parseTlvs:(NSData *)aData __deprecated {
- return [self parseTlvs:aData error:nil];
-}
-
-- (BerTlvs *)parseTlvs:(NSData *)aData error:(NSError **)error {
- return [self parseTlvs:aData numberOfTags:100 error:error];
-}
-
-- (BerTlvs *)parseTlvs:(NSData *)aData numberOfTags:(NSUInteger)numberOfTags __deprecated {
- return [self parseTlvs:aData numberOfTags:numberOfTags error:nil];
-}
-
-- (BerTlvs *)parseTlvs:(NSData *)aData numberOfTags:(NSUInteger) numberOfTags error:(NSError **)error {
- if(aData.length==0) {
- return [[BerTlvs alloc] init:[[NSArray alloc] init]];
- }
-
- NSMutableArray *list = [[NSMutableArray alloc] init];
- uint offset = 0;
- NSError * parseError = nil;
- for(uint i=0; i<numberOfTags; i++) {
- uint result=0;
- BerTlv * ret = [self parseWithResult:&result data:aData offset:offset len:(uint)aData.length-offset level:0 error:&parseError];
-
- if (ret != nil) {
- [list addObject:ret];
- } else
- {
- break;
- }
-
- if (result >= aData.length) {
- break;
- }
-
- offset = result;
- }
- if(parseError){
- if(error){
- *error=parseError;
- }
- return nil;
- }
- return [[BerTlvs alloc] init:list];
-}
-
-- (BerTlv *)parseWithResult:(uint*)aOutResult data:(NSData *)aBuf offset:(uint)aOffset len:(uint)aLen level:(uint)aLevel __deprecated {
- return [self parseWithResult:aOutResult data:aBuf offset:aOffset len:aLen level:aLevel error:nil];
-}
-
-- (BerTlv *)parseWithResult:(uint*)aOutResult
- data:(NSData *)aBuf
- offset:(uint)aOffset
- len:(uint)aLen
- level:(uint)aLevel
- error:(NSError **)error
-{
- NSString *levelPadding = IS_DEBUG_ENABLED ? [self createLevelPadding:aLevel] : @"";
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@parseWithResult( level=%d, offset=%d, len=%d, buf=%@)"
- , levelPadding, aLevel, aOffset, aLen, [HexUtil format:aBuf]
- );
- }
-
- // TAG
- uint tagBytesCount = [self calcTagBytesCount:aBuf offset:aOffset];
- BerTag *tag = [self createTag:aBuf offset:aOffset len:tagBytesCount pad:levelPadding];
-
- // LENGTH
- uint lengthBytesCount = [self calcLengthBytesCount:aBuf offset:aOffset + tagBytesCount];
- NSError *lengthErr;
- uint valueLength = [self calcDataLength:aBuf offset:aOffset + tagBytesCount error:&lengthErr];
- if (lengthErr && error) {
- *error = lengthErr;
- return nil;
- }
-
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@lenBytesCount = %d, len = %d, lenBuf = %@"
- , levelPadding, lengthBytesCount, valueLength, [HexUtil format:aBuf offset:aOffset + tagBytesCount len:lengthBytesCount]);
- }
-
- // VALUE
- NSError * childError =nil;
- if(tag.isConstructed) {
- NSMutableArray *array = [[NSMutableArray alloc] init];
- [self addChildren:aBuf
- offset:aOffset
- level:aLevel
- levelPadding:levelPadding
- tagBytesCount:tagBytesCount
- dataBytesCount:lengthBytesCount
- valueLength:valueLength
- array:array
- error:&childError
- ];
- if (childError && error) {
- *error = childError;
- return nil;
- }
- uint resultOffset = aOffset + tagBytesCount + lengthBytesCount + valueLength;
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@Returning constructed offset = %d", levelPadding, resultOffset );
- }
- *aOutResult = resultOffset;
- return [[BerTlv alloc] init:tag array:[array copy]];
- } else {
- NSRange range = {aOffset+tagBytesCount+lengthBytesCount, valueLength};
- uint resultOffset = aOffset + tagBytesCount + lengthBytesCount + valueLength;
- *aOutResult = resultOffset;
-
- if (range.location + range.length > aBuf.length) {
- if(error){
- *error=[BerTlvErrors badLengthAtOffset:(uint)range.location numberOfBytes:range.length];
- }
- return nil;
- }
- NSData *value = [aBuf subdataWithRange:range];;
-
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@Primitive value = %@", levelPadding, [HexUtil format:value]);
- NSLog(@"%@Returning primitive offset = %d", levelPadding, resultOffset );
- }
- return [[BerTlv alloc] init:tag value:value];
- }
-}
-
-- (uint)calcTagBytesCount:(NSData *)aBuf offset:(uint)aOffset {
- if (!aBuf || aOffset > aBuf.length) {
- return 1;
- }
-
- uint8_t const *bytes = aBuf.bytes;
- if((bytes[aOffset] & 0x1F) == 0x1F) { // see subsequent bytes
- uint len = 2;
- for(int i=aOffset+1; i<aOffset+10; i++) {
- if( (bytes[i] & 0x80) != 0x80) {
- break;
- }
- len++;
- }
- return len;
- } else {
- return 1;
- }
-}
-
-- (BerTag *) createTag:(NSData *)aBuf offset:(uint)aOffset len:(uint)aLen pad:(NSString *)aLevelPadding {
- BerTag *tag = [[BerTag alloc] init:aBuf offset:aOffset length:aLen];
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@Created tag %@ from buffer %@", aLevelPadding, tag, [HexUtil format:aBuf offset:aOffset len:aLen]);
- }
- return tag;
-}
-
-- (NSString *)createLevelPadding:(NSUInteger)aLevel {
- NSMutableString *sb = [NSMutableString stringWithCapacity:aLevel];
- for(int i=0; i<aLevel*4; i++) {
- [sb appendString:@" "];
- }
- return [sb copy];
-}
-
-- (uint) calcLengthBytesCount:(NSData *)aBuf offset:(uint)aOffset {
- if (!aBuf || aOffset > aBuf.length) {
- return 1;
- }
-
- uint8_t const *bytes = aBuf.bytes;
- uint len = (uint) bytes[aOffset];
- if( (len & 0x80) == 0x80) {
- return (uint) (1 + (len & 0x7f));
- } else {
- return 1;
- }
-}
-
--(uint) calcDataLength:(NSData *)aBuf offset:(uint) aOffset error:(NSError **)error {
- if (!aBuf || aOffset > aBuf.length) {
- return 1;
- }
-
- uint8_t const *bytes = aBuf.bytes;
- uint length = bytes[aOffset];
-
- if((length & 0x80) == 0x80) {
- int numberOfBytes = length & 0x7f;
- if(numberOfBytes>3) {
- if (error) {
- *error = [BerTlvErrors badLengthAtOffset:aOffset numberOfBytes:numberOfBytes];
- }
- }
-
- length = 0;
- for(int i=aOffset+1; i<aOffset+1+numberOfBytes; i++) {
- length = length * 0x100 + bytes[i];
- }
-
- }
- return length;
-}
-
-- (void) addChildren:(NSData *)aBuf
- offset:(uint)aOffset
- level:(uint)aLevel
- levelPadding:(NSString *)aLevelPadding
- tagBytesCount:(uint)aTagBytesCount
- dataBytesCount:(uint)aDataBytesCount
- valueLength:(uint)aValueLength
- array:(NSMutableArray *)aList
- error:(NSError **)error
-{
-
- uint startPosition = aOffset + aTagBytesCount + aDataBytesCount;
- uint len = aValueLength;
-
- if (!aBuf || startPosition + len > aBuf.length) {
- if (error) {
- *error = [BerTlvErrors outOfRangeAtOffset:aOffset length:aValueLength bufferLength:aBuf.length level:aLevel];
- }
- return;
- }
-
- while (startPosition < aOffset + aValueLength + aTagBytesCount + aDataBytesCount) {
- uint result = 0;
- BerTlv *tlv = [self parseWithResult:&result data:aBuf offset:startPosition len:len level:aLevel+1 error:error];
- if(*error){
- break;
- }
- if (tlv != nil) {
- [aList addObject:tlv];
- }
-
- startPosition = result;
- len = aValueLength - startPosition;
-
- if(IS_DEBUG_ENABLED) {
- NSLog(@"%@level %d: adding %@ with offset %d, startPosition=%d, aDataBytesCount=%d, valueLength=%u"
- , aLevelPadding, aLevel, tlv.tag, result, startPosition, aDataBytesCount, aValueLength
- );
- }
- }
-
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvUmbrella.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvUmbrella.h
deleted file mode 100644
index 0b026587..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvUmbrella.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#import <Foundation/Foundation.h>
-
-FOUNDATION_EXPORT double BerTlvVersionNumber;
-FOUNDATION_EXPORT const unsigned char BerTlvVersionString[];
-
-#import <BerTlv/BerTag.h>
-#import <BerTlv/BerTlv.h>
-#import <BerTlv/BerTlvBuilder.h>
-#import <BerTlv/BerTlvParser.h>
-#import <BerTlv/BerTlvs.h>
-#import <BerTlv/HexUtil.h>
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.h
deleted file mode 100644
index dbd0c82b..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Created by Evgeniy Sinev on 06/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-@class BerTag;
-@class BerTlv;
-
-NS_ASSUME_NONNULL_BEGIN
-@interface BerTlvs : NSObject
-
-@property(copy, nonatomic, readonly) NSArray * list;
-
-- (id)init:(NSArray *)aList;
-
-- (BerTlv * _Nullable) find:(BerTag *)aTag;
-- (NSArray *) findAll:(BerTag *)aTag;
-
-- (NSString *) dump:(NSString *)aPadding;
-
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.m
deleted file mode 100644
index 73da514e..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/BerTlvs.m
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Created by Evgeniy Sinev on 06/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "BerTlvs.h"
-#import "BerTag.h"
-#import "BerTlv.h"
-
-
-@implementation BerTlvs {
-
-}
-
-@synthesize list;
-
-- (id)init:(NSArray *)aList {
- self = [super init];
- if (self) {
- list = aList;
- }
- return self;
-}
-
-- (BerTlv *)find:(BerTag *)aTag {
- for (BerTlv *tlv in list) {
- BerTlv *found = [tlv find:aTag];
- if(found!=nil) {
- return found;
- }
- }
- return nil;
-}
-
-- (NSArray *)findAll:(BerTag *)aTag {
- NSMutableArray *ret = [[NSMutableArray alloc] init];
- for (BerTlv *tlv in list) {
- [ret addObjectsFromArray:[tlv findAll:aTag]];
- }
- return [ret copy];
-}
-
-- (NSString *) dump:(NSString *)aPadding {
- NSMutableString *sb = [[NSMutableString alloc] init];
- for (BerTlv *tlv in list) {
- [sb appendString:[tlv dump:aPadding]];
- }
-
- return [sb copy];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.h b/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.h
deleted file mode 100644
index 534c090f..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-@interface HexUtil : NSObject
-
-+ (NSString *) format:(NSData *)aData;
-+ (NSString *) prettyFormat:(NSData *)aData;
-
-+ (NSData * _Nullable) parse:(NSString *)aHex __deprecated NS_SWIFT_UNAVAILABLE("");
-+ (NSData *) parse:(NSString *)aHex error:(NSError **)error;
-
-+ (NSString *)format:(NSData *)data offset:(uint)offset len:(NSUInteger)len;
-@end
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.m b/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.m
deleted file mode 100644
index 639c2432..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/BerTlv/HexUtil.m
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// Created by Evgeniy Sinev on 04/08/14.
-// Copyright (c) 2014 Evgeniy Sinev. All rights reserved.
-//
-
-#import "HexUtil.h"
-#import "BerTlvErrors.h"
-
-static uint8_t HEX_BYTES[] = {
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 0 */, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 1 */, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 2 */, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 99, 99, 99, 99, 99, 99
-/* 3 */, 99, 10, 11, 12, 13, 14, 15, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 4 */, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 5 */, 99, 10, 11, 12, 13, 14, 15, 99, 99, 99, 99, 99, 99, 99, 99, 99
-/* 6 */, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
-};
-
-static uint8_t HEX_BYTES_LEN = 128;
-static uint8_t HEX_BYTE_SKIP = 99;
-
-
-@implementation HexUtil
-
-+ (NSString *)prettyFormat:(NSData *)aData {
- NSMutableString *sb = [[NSMutableString alloc] initWithCapacity:aData.length*2];
- uint8_t const *bytes = aData.bytes;
- [sb appendFormat:@"[%@]", @(aData.length)];
- for(NSUInteger i=0; i < aData.length; i++) {
- uint8_t b = bytes[i];
- [sb appendFormat:@" %02X", b];
- }
- return [sb copy];
-}
-
-+ (NSString *)format:(NSData *)aData {
- return [HexUtil format:aData offset:0 len:aData.length];
-}
-
-+ (NSData * _Nullable) parse:(NSString *)aHex __deprecated {
- return [self parse:aHex error:nil];
-}
-
-+ (NSData *) parse:(NSString *)aHex error:(NSError **)error {
- char const *text = [aHex cStringUsingEncoding:NSASCIIStringEncoding];
- size_t len = strnlen(text, aHex.length);
-
- uint8_t high = 0;
- BOOL highPassed = NO;
-
- NSMutableData *data = [[NSMutableData alloc] initWithCapacity:len/2];
-
- for(int i=0; i< len; i++) {
- char index = text[i];
-
- // checks if value out of 127 (ASCII must contains from 0 to 127)
- if(index >= HEX_BYTES_LEN ) {
- continue;
- }
-
- uint8_t nibble = HEX_BYTES[index];
-
- // checks if not HEX chars
- if(nibble == HEX_BYTE_SKIP) {
- continue;
- }
-
- if(highPassed) {
- // fills right nibble, creates byte and adds it
- uint8_t low = (uint8_t) (nibble & 0x7f);
- highPassed = NO;
- uint8_t currentByte = ((high << 4) + low);
- [data appendBytes:&currentByte length:1];
-
- } else {
- // fills left nibble
- high = (uint8_t) (nibble & 0x7f);
- highPassed = YES;
- }
- }
-
- if(highPassed) {
- if (error) {
- *error = [BerTlvErrors invalidHexString];
- }
- return nil;
- }
-
- if ([data length] == 0) {
- if (error) {
- *error = [BerTlvErrors invalidHexString];
- }
- return nil;
- } else {
- // returns immutable
- return [data copy];
- }
-}
-
-
-+ (NSString *)format:(NSData *)aData offset:(uint)aOffset len:(NSUInteger)aLen {
- NSMutableString *sb = [[NSMutableString alloc] initWithCapacity:aData.length*2];
- uint8_t const *bytes = aData.bytes;
- NSUInteger max = aOffset+aLen;
- if (max <= aData.length) {
- for(NSUInteger i=aOffset; i < max; i++) {
- uint8_t b = bytes[i];
- [sb appendFormat:@"%02X", b];
- }
- }
- return [sb copy];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/BerTlv/LICENSE.txt b/comwell_key_app/ios/Pods/BerTlv/LICENSE.txt
deleted file mode 100644
index d6456956..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/comwell_key_app/ios/Pods/BerTlv/README.md b/comwell_key_app/ios/Pods/BerTlv/README.md
deleted file mode 100644
index 89cdb662..00000000
--- a/comwell_key_app/ios/Pods/BerTlv/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# BER-TLV parser and builder
-
-[![CircleCI](https://circleci.com/gh/evsinev/BerTlv.svg?style=svg)](https://circleci.com/gh/evsinev/BerTlv)
-[![Build Status](https://travis-ci.org/evsinev/BerTlv.svg?branch=master)](https://travis-ci.org/evsinev/BerTlv)
-
-BerTlv is an Objective-C framework for parsing and building BER TLV encoded data.
-
-## Features
-
-* supported types: amount, date, time, text, BCD, bytes
-* thread safe (provides immutable container BerTlv)
-* production ready (uses in several projects published at appstore)
-* lightweight (no external dependencies)
-
-## Setup with dependency managers
-
-### Cocoapods
-
- pod 'BerTlv', '0.2.3'
-
-or
-
- pod "BerTlv", :git => 'git@github.com:evsinev/BerTlv.git', :tag => '0.2.3'
-
-### Carthage
-
- github "evsinev/BerTlv" "0.2.3"
-
-## Examples
-
-### Parsing
-
-```obj-c
-NSString * hex =
- /* 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123 4567 89ab cdef */
- /* 0 */ @"e1 35 9f 1e 08 31 36 30 32 31 34 33 37 ef 12 df" // .5.. .160 2143 7...
- /* 10 */ @"0d 08 4d 30 30 30 2d 4d 50 49 df 7f 04 31 2d 32" // ..M0 00-M PI.. .1-2
- /* 20 */ @"32 ef 14 df 0d 0b 4d 30 30 30 2d 54 45 53 54 4f" // 2... ..M0 00-T ESTO
- /* 30 */ @"53 df 7f 03 36 2d 35 " // S... 6-5;
-
-NSData * data = [HexUtil parse:hex];
-BerTlvParser * parser = [[BerTlvParser alloc] init];
-BerTlv * tlv = [parser parseConstructed:data];
-
-NSLog(@"%@", [tlv dump:@" "]);
-```
-
-The output is:
-
-```
-+ [E1]
- - [9F1E] 3136303231343337
- + [EF]
- - [DF0D] 4D3030302D4D5049
- - [DF7F] 312D3232
- + [EF]
- - [DF0D] 4D3030302D544553544F53
- - [DF7F] 362D35
-```
-
-### Building
-
-```obj-c
- BerTlvBuilder *builder = [[BerTlvBuilder alloc] initWithTemplate:TAG_E0];
- for(int i=0; i<5; i++) {
- [builder addHex:@"F9128478E28F860D8424000008514C8F" tag:TAG_86];
- }
-
- BerTlvs * tlvs = builder.buildTlvs;
-
- NSLog(@"%@", [builder.buildTlvs dump:@" "]);
-```
-
-The output is:
-
-```
-+ [E0]
- - [86] F9128478E28F860D8424000008514C8F
- - [86] F9128478E28F860D8424000008514C8F
- - [86] F9128478E28F860D8424000008514C8F
- - [86] F9128478E28F860D8424000008514C8F
- - [86] F9128478E28F860D8424000008514C8F
-```
-
-## License
-
-The BerTlv framework is licensed under the Apache License 2.0
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/CHANGELOG.md b/comwell_key_app/ios/Pods/CocoaLumberjack/CHANGELOG.md
deleted file mode 100644
index 7a519a3f..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/CHANGELOG.md
+++ /dev/null
@@ -1,638 +0,0 @@
-# [3.8.5 - Xcode 15.3 on Mar 8th, 2024](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tags/3.8.5)
-
-### Public
-
-- Fix build failure due to privacy manifest when using static linking with CocoaPods (#1408)
-- Allow custom mapping of `DDLogFlag` to `os_log_type_t`, fix default mapping for `DDLogFlagWarn` (#1410)
-
-
-# [3.8.4 - Xcode 15.2 on Feb 8th, 2024](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tags/3.8.4)
-
-### Public
-
-- Extend privacy manifest to fulfill validation criteria (#1403)
-- Fix crash when fetching registered classes (#1406)
-
-
-# [3.8.3 - Xcode 15.2 on Feb 5th, 2024](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tags/3.8.3)
-
-### Public
-
-- Add privacy manifest (#1403)
-- Update doc from DDLogLevelWarn to DDLogLevelWarning to match library (#1383)
-- Only cleanup files on configuration change if the manager is used by a file logger (#1398)
-- Fix #1386 again by adding a missing return and adjusting the preprocessor conditionals
-- Fix some C++ warnings
-
-### Internal
-
-- Update copyright for 2024 (#1400)
-- Improve asserts (#1385)
-
-
-# [3.8.2 - Xcode 15.0 on Oct 31st, 2023](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.8.2)
-
-### Public
-
-- App background-mode not correctly detected in app extensions (#1359)
-- Fix DDFileLogger rollingFrequency and maximumFileSize not being honored (#1361)
-- Fix potential crashes when using the new `DDLogMessageFormat` with messages that contain '%'
-- Fix simulator issues when using dynamic registered logging on iOS 17 (#1386)
-- Allow `DDFileLogger` to write in different file formats (#1380)
-
-### Internal
-
-- Generate Podspec (#1360)
-
-
-# [3.8.1 - Xcode 14.3 on Aug 21st, 2023](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.8.1)
-
-### Public
-
-- Silence double conversion warnings for 32-bit watchOS (#1320)
-- Enable ALLOW_TARGET_PLATFORM_SPECIALIZATION (#1321)
-- Update to swift-log 1.5.2, implement metadata providers (#1329)
-- Preserve `messageFormat` in `DDLogMessage` (#1347)
-
-### Internal
-
-- Update copyright for 2023
-
-
-## [3.8.0 - Xcode 14.1 on Nov 2nd, 2022](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.8.0)
-
-### Public
-
-- Add support for Xcode 14 / Swift 5.7 - drop support for Swift < 5.5, iOS/tvOS < 11, macOS < 10.13, watchOS < 4 (#1316)
-- Update README about swift-log usage (#1275)
-- Use dispatch_walltime for scheduling log file rolling timer (#1309)
-
-### Internal
-
-- Add consistent newline to file endings (#1272)
-- Fix error checking in DDFileLogger (#1274)
-- Avoid using NSString format (#1280)
-- Prevent logging to symlink files (#1314)
-
-
-## [3.7.4 - Xcode 13.2 on Dec 16, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.4)
-
-### Public
-
-- Fix swift-tools-version in Package@swift-5.3.swift
-
-
-## [3.7.3 - Xcode 13.2 on Dec 16, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.3)
-
-### Public
-
-- Fix "DDFileLogger: Failed to get offset" when setting maximumFileSize (#1234)
-- Follow-up to add annotations to DDOSLogger (#1248)
-- Fixed nullability conflict in DDDispatchQueueLogFormatter.h (#1252)
-- Add Swift 5.5 support, fix archive build on Xcode 13 (#1253)
-- Fix file access issue in Catalyst apps (#1257)
-- Fix excluded archs in debug build when not mac catalyst (#1260)
-- Bump Xcode last upgraded version to 13.2 (#1265)
-- Don't log warnings for CLI apps in DDTTYLogger (#1269)
-
-
-## [3.7.2 - Xcode 12.4 on Apr 9th, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.2)
-
-### Public
-
-- Re-introduce (and deprecate) `_tag` field to fix breakage in 3.7.1 (#1224)
-
-
-## [3.7.1 - Xcode 12.4 on Apr 7th, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.1)
-
-### Public
-
-- Deprecate `tag` property of `DDLogMessage`, use `representedObject` instead. (#1177, #532)
-- Add per-message synchronous logging control for messages logged via SwiftLog using `DDLogHandler` (#1209)
-- Add TargetConditionals import for Xcode 12.5 (#1210)
-- Prevent logging an error when archiving an already deleted file (#1212)
-- Use inclusive words - denylist / allowlist (#1218)
-- Add `DDAssertionFailure` macro for Objective-C (#1220)
-
-### Internal
-
-- Use setter to replace kvo for `NSFileLogger` (#1180)
-- Use new API for `NSFileHandle` on supported platforms (#1181)
-- Remove unnecessary checks in `DDFileLogger` (#1182)
-- Add an assertion to avoid potential deadlock issues for `flushLog` (#1183)
-
-
-## [3.7.0 - Xcode 12 on Oct 2nd, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.0)
-
-### Public
-
-- **Breaking change**: Dropped support for iOS 8 (#1153)
-- Update SPM tools-version to 5.3 to enable Swift 5.3 support (#1148)
-- Add backend for swift-log (#1164)
-- Specify CocoaPods version to ensure `swift_version` attribute works (#1167)
-- Simplify `DDLogFileManager` callbacks for archived log files (#1166)
-
-
-## [3.6.2 - Xcode 11.6 on July 31st, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.2)
-
-### Public
-- Fix warnings when building with SPM bundled with Swift 5.2 / Xcode 11.4 (#1132)
-- Added Swift name for DDQualityOfServiceName constants.
-- Don't localize timestamps in `DDefaultFileLogFormatter` (#1151)
-- Allow logging arbitrary objects via Swift log functions (#1146)
-
-### Repository
-- Switch from Travis to GitHub Actions (#1135, #1140, #1150, #1152)
-
-
-## [3.6.1 - Xcode 11.3.1 on Jan 25th, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.1)
-
-### Public
-- Improve error handling during log file creation in DDFileLogger & DDLogFileManager (#1103 / #1111)
-- Improve nullability annotations in public headers (#1111 / #1112 / #1119)
-- Added support for thread QOS in DDLogMessage class (#1124)
-
-### Internal
-- Fix rolling timer being rescheduled rapidly due to leeway (#1106 / #1107)
-- Fix -didArchiveLogFile: returning the file name instead of the file path (#1078)
-- Fix setxattr() function usage (#1118)
-- Fix NSDateFormatter thread safety (#1121)
-- Fix -lt_dataForMessage: duplicated code (#1122)
-
-
-## [3.6.0 - Xcode 11 on October 2nd, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.0)
-
-### Public
-- Swift Package Manager Support (#1083)
-- New `willLogMessage:` and `didLogMessage:` methods on `DDFileLogger` which provide access to the current log file info.
-
-### Internal
-- Fix issue with log archiving in the simulator (#1098)
-- Limit assertion to non-simulator build (#1100)
-
-
-## [3.5.3 - Xcode 10.2 on Apr 24th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.3)
-
-### Public
-- Additional compatibility with Swift 5 (backwards compatible with Swift 4) (#1043)
-- Fix warning building with Xcode 10.2 (#1059)
-- Set Xcode 10.2 and Swift 5.0 as a default (#1064)
-- Fix format string crash (#1066)
-
-### Internal
-- Fix warning about syntax (#1054) (#1065)
-- Remove banned APIs (#1056) (#1057)
-- Add CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER & fix warnings (#1059)
-- Use LLONG_MAX instead of LONG_LONG_MAX (#1062)
-
-
-## [3.5.2 - Xcode 10.1 on Mar 15th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.2)
-
-### Public
-- Fix reusing of log files after rolling (#1042)
-- Fix creation of too many log files (#1049)
-- Preliminary compatibility with Swift 5 (backwards compatible with Swift 4) (#1044)
-- core: loggers os logger variations have been added (#1039)
-
-### Internal
-- Sync internal queues to prevent cleaning up log files too soon in tests (#1053)
-- DDLog checks for NULL values and for global queue dispatching has been added (#1045)
-
-
-## [3.5.1 - Xcode 10 on Feb 4th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.1)
-
-### Public
-- Fix high CPU usage because of empty fileAttributes and / or too high rollingFrequceny (#1028)
-
-
-## [3.5.0 - Xcode 10 on Jan 25th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.0)
-
-### Public
-- Added `logFileHeader` property to `DDLogFileManagerDefault`. Override to set header for each created file. #998
-- `DDFileLogger` now accepts a `dispatch_queue_t` which it uses to run callbacks. If not provided, the default global queue is used. #1003
-- Added opt-in buffering to `DDFileLogger`. Call `wrapWithBuffer` to create a file logger which buffers. #1001, #1012
-- Add `DDAssert` and `DDAssertionFailure` functions for Swift #934
-- Add `DD_LOG_LEVEL` define (which can be set in `GCC_PREPROCESSOR_DEFINITIONS`) for Swift to set default log level (enables stripping for strings that are not logged). #952
-- Add `asyncLoggingEnabled` global variable to control asynchronous logging. #1019
-
-### Internal
-- Prevent memory access errors caused by a failed fetch #944
-- Fix common warnings emitted by `-Wall`, `-Wconversion`, `-Wextra`, etc #943, #931
-- Fixes issue that could cause log messages to become interleaved when there are multiple `DDFileLogger`s #985
-- `DispatchQueueFormatter` knows about `com.apple.root.default-qos.overcommit` now #932
-- Fix thread safety issues in `DDFileLogger`. Makes it a little harder to deadlock in some cases. #986, #1003, #946
-- Fix availability checks and memory leak #996
-
-### Repository
-- Reduce podspec to two subspecs and remove customized modulemap #976
-- Add danger support for PR checks #962 - fixes #956
-- Merged framework targets + using `xcconfig` + deployment target `iOS 8` and `Mac OS 10.10` #959 e97da34
-- Documentation update #955 e7414ae 0239196 #933
-- Full links to Docs and other resources so they are resolved on external pages (i.e. https://cocoapods.org/pods/CocoaLumberjack) e9d6971
-- Replace `OSAtomic` with `stdatomic` in `DDDispatchQueueLogFormatter` #957 #958
-- Add Stale Bot + configuration #953
-- Update to Xcode 10 and Swift 4.2 compiler #950
-- Xcode 10 scheme changes #949
-- Update incomplete BSD 3-Clause License #942
-- Updated to CocoaPods 1.5.3 2d0590f
-- Use Xcode 9.4 image for tests #939
-- Xcode (schemes) version bumps #938
-- Update demo and documentation about CustomLogLevels #1023
-
-
-## [3.4.2 - Xcode 9.3 on Apr 17th, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.2)
-- Update README.md #912
-- Fixed typo in pull request template #913
-- Fix `-Wimplicit-retain-self` warnings #915
-- Update memory management in dynamic logging #916
-- Xcode 9.3 support #921 #923 #926 #927
-- Add extern "C" for Objective-C++ #922
-- Add `flush` method to the `DDFileLogger` #928
-
-
-## [3.4.1 - Xcode 9.1 on Jan 26th, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.1)
-- Fix `DDLogFileManagerDefault` `-isLogFile` #909
-- Fix locking the main thread #911
-
-
-## [3.4.0 - Xcode 9.1 on Jan 3rd, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.0)
-- Fix Travis CI #895
-- Fix typos #896
-- Fix schemes and link errors #897 #899 #903 #907
-
-
-## [3.3.0 - Xcode 9 on Oct 3rd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.3.0)
-- Xcode 9 support and Swift 4 support #890 #893
-- Replace `OSSpinLock` with `pthread_mutex` #889
-
-
-## [3.2.1 - Xcode 9 beta on Aug 21st, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.2.1)
-- Xcode 9 beta support #874 #873 #884 #883 #882
-- Fixed some issues around deleting log files #868 #879
-- update 'Use Log Level per Logger' doc #888
-- Remove empty asset catalogs so that they don't show up in Open Quickly #877
-- Fixed typo in pull request template #880
-
-
-## [3.2.0 - Swift 3.0.0, Xcode 8.3 on May 3rd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.2.0)
-- Xcode 8.3 support #860 #853
-- added a very basic `os_log` (unified logging) logger #850 #856
-- Use `NSFileProtectionType` instead of `NSString` #866
-- Optimized timestamp calculation in `DDTTYLogger` #851
-- Updated docs #864
-- Fix Travis #863
-- Fixed nullability of `DDLogMessage.function` #849 `DDExtractFileNameWithoutExtension` #845
-- Ignore `Carthage/Build` directory #862
-- Updated schemes #859 #857
-
-
-## [3.1.0 - Swift 3.0.1, Xcode 8.1 on Feb 22nd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.1.0)
-- Swift 3.0.1 and Xcode 8.1 support via #816
-- Fix Carthage build and updated the podspec structure #819 #818 #784 #790 #782 #778 #815
-- Fix CLIColor.h not included in umbrella header #781 #796 #813 #783
-- Fix crash in `[DDLog log:level:flag:context:file:function:line:tag:format:]` #831 #830
-- Code improvements:
- - using class properties #779
- - nullability #803 #809 #776
- - fix static analyzer issues #822 #828
- - optimized `USE_DISPATCH_CURRENT_QUEUE_LABEL` and `USE_DISPATCH_GET_CURRENT_QUEUE` macros #829
- - fixed dispatch_source_set_timer() usage #834
- - fixed misuse of non null parameter in `DDFileLogger fileAttributes` #835
- - store calendar in logger queue specifics for multi-thread safety #837
- - reenable default `init` method for `DDLogMessage` class #838
-- Added option to not copy messages #832
-- Added new hooks when adding loggers and formatters #836
-- Ability to create new log files every day #736
-- Skip messages in ASL logger which are filtered out by the formatter #786 #742
-- Fixed #823 by adding a `hash` implementation for `DDFileLogger` - same as `isEqual`, it only considers the `filePath` 7ceed08
-- Fix Travis CI build #807
-- Updated docs #798 #808 #811 #810 #820
-
-
-## [3.0.0 - Swift 3.0, Xcode 8 on Sep 21st, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.0.0)
-- Swift 3.0 and Xcode 8 support via #769, fixes #771 and #772. Many thanks to @ffried @max-potapov @chrisdoc @BarakRL @devxoul and the others who contributed
-
-
-## [2.4.0 - Swift 2.3 on Sep 19th, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.4.0)
-- Swift 2.3 explicit so that the project compiles on Xcode 8 - #747 #773 fix #762 #763 #766
-- CocoaPods 1.0.0 fully adopted - 0f5a793 637dfc1 70439fe #729
-- Fix CLIColor.h not found for non-AppKit binaries w/o clang modules #745
-- Retrieve the `DDLogLevel` of each logger associated to `DDLog` #753
-- updated doc: #727 a9f54c9 #741, diagrams in 8bd128d
-- Added CONTRIBUTING, ISSUE and PULL_REQUEST TEMPLATE and added a small Communication section to the Readme
-- Fixed an issue with one demo #760
-
-
-## [2.3.0 - Swift 2.2, Xcode7.3 on May 2nd, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.3.0)
-- Updated to Swift 2.2 - #704
-- replaced deprecated `__FUNCTION__`, `__FILE__`, `__LINE__` with newly added to Swift 2.2: `#function`, `#file`, `#line`
-- Xcode 7.3 update - #692 #662
-- simplify usage and integration of the static library target - #657
-- DDLog usable via instances - #679
-- Swift cleanup - #649
-- Enable Application extension API only for tvOS - #701
-- Added `appletvos` and `appletvsimulator` to `SUPPORTED_PLATFORMS` and set `TVOS_DEPLOYMENT_TARGET` - #707
-- fixed `OSSpinLock` init issue - #653
-- Added check to prevent duplicate loggers - #682
-- fixed typo in import - #693
-- updated the docs - #646 #650 #656 #655 #661 #664 #667 #684 #724
-
-
-## [2.2.0 - TVOS, Xcode7.1 on Oct 28th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.2.0)
-- added `tvOS` support (thanks [@sinoru](https://github.com/sinoru)) - [#634](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/634) [#640](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/640) [#630](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/630) [#628](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/628) [#618](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/618) [#611](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/611)
-- Remove `(escaping)` from the Swift `@autoclosure` parameters - [#642](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/642)
-
-
-## [2.1.0 - Swift 2.0, WatchOS, Xcode7 on Oct 23rd, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0)
-- Fixed the version for the Carthage builds - see [#633](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/633)
-- Improved documentation
-
-
-## [2.1.0 RC - Swift 2.0, WatchOS, Xcode7 on Oct 22nd, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0-rc)
-- Refactored the `NSDateFormatter` related code to fix a bunch of issues: [#621](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/621)
-- Fix Issue [#488](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/488): Support `DDLog` without `AppKit Dependency` (`#define DD_CLI`): [#627](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/627)
-- Re-add `NS_DESIGNATED_INITIALIZER` [#619](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/619)
-
-
-## [2.1.0 Beta - Swift 2.0, WatchOS, Xcode7 on Oct 12th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0-beta)
-- Updated the library to use Swift 2.0 and Xcode 7 [#617](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/617) [#545](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/545) [#534](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/534)
-- WatchOS support (2.0) [#583](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/583) [#581](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/581) [#579](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/579)
-
-
-## [2.0.3 Patch for 2.0.0 on Oct 13th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.3)
-
-- Compatibility with Xcode 6 that was broken by the 2.0.2 patch - [f042fd3](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/f042fd3)
-
-
-## [2.0.2 Patch for 2.0.0 on Oct 12th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.2)
-
-- Swift 1.2 fixes [#546](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/546) [#578](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/578) plus and update to Swift 2.0 [5627dff](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/5627dff) imported from our swift_2.0 branch
-- Make build work on `tvOS` [#597](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/597)
-- Make `CocoaLumberjackSwift-iOS` target depends on `CocoaLumberjack-iOS` [#575](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/575)
-- `APPLICATION_EXTENSION_API_ONLY` to `YES` for Extensions [#576](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/576)
-- Remove unnecessary `NS_DESIGNATED_INITIALIZER`s [#593](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/593) fixes [#592](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/592)
-- Add ignore warning mark for `DDMakeColor` [#553](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/553)
-- Kill unused function warnings from `DDTTYLogger.h` [#613](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/613)
-- Flag unused parameters as being unused to silence strict warnings [#566](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/566)
-- Extend ignore unused warning pragma to cover all platforms [#559](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/559)
-- Removed images.xcassets from Mobile project [#580](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/580)
-- Silence the Xcode 7 upgrade check - [#595](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/595)
-- Fix import for when CL framework files are manually imported into project [#560](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/560)
-- Don't override defines in case they're already set at project level [#551](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/551)
-- log full filepath when failing to set attribute [#550](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/550)
-- Fix issue in standalone build with `DDLegacyMacros.h` [#552](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/552)
-- Update `CustomFormatters.md` with proper thread-safe blurb [#555](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/555)
-- typo in parameter's variable name fixed [#568](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/568)
-- Typo: minor fix [#571](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/571)
-- Surely we should be adding 1, not 0 for `OSAtomicAdd32` ? [#587](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/587)
-- `rollLogFileWithCompletionBlock` calls back on background queue instead of main queue [#589](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/589)
-- Removing extraneous `\` on line 55 [#600](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/600)
-- Updated `GettingStarted.md` to include `ddLogLevel` [#602](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/602)
-- Remove redundant check for `processorCount` availability [#604](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/604)
-
-
-## [2.0.1 Patch for 2.0.0 on Jun 25th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.1)
-
-- **Carthage support** [#521](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/521) [#526](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/526)
-- fixed crash on `DDASLLogCapture` when `TIME` or `TIME_NSEC` is `NULL` [#484](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/484)
-- **Swift** fixes and improvements: [#483](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/483) [#509](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/509) [#518](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/518) [#522](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/522) [5eafceb](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/5eafceb)
-- Unit tests: [#500](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/500) [#498](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/498) [#499](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/499)
-- Fix [#478](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/478) by reverting [#473](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/473)
-- Add `armv7s` to static library [#538](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/538)
-- Fix `NSLog` `threadid` mismatch with iOS 8+/OSX 10.10+ [#514](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/514)
-- Fixed the `LogV` macros so that avalist is no longer undefined [#511](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/511)
-- Using type safe `DDColor` alias instead of #define directive [#506](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/506)
-- Several fixes/tweaks to `DDASLLogCapture` [#512](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/512)
-- Prevent duplicate log entries when both `DDASLLogCapture` and `DDASLLogger` are used [#515](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/515)
-- Fix memory leaks in `DDTTYLogger`, add self annotations to blocks [#536](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/536)
-- Update older syntax to modern subscripting for array access [#482](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/482)
-- Remove execute permission on non-executable files [#517](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/517)
-- Change code samples to use `DDLogFlagWarning` [#520](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/520)
-- Fix seemingly obvious typo in the `toLogLevel` function [#508](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/508)
-
-
-## [CocoaLumberjack 2.0.0 on Mar 13th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0)
-
-The library was strongly refactored, with a few goals in mind:
-- Swift support - that we will release in a separate milestone, since CocoaPods 0.36.0 just got out
-- Unit tests support
-- reorganised things (on disk)
-- better coding style
-
-See [Migration from 1.x to 2.x](https://github.com/CocoaLumberjack/CocoaLumberjack#migrating-to-2x)
-
-
-## [2.0.0-rc2 on Feb 20th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-rc2)
-
-- Bucket of Swift improvements - [#434](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/434) [#437](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/437) [#449](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/449) [#440](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/440)
-- Fixed [#433](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/433) (build issue due to dispatch_queue properties) - [#455](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/455)
-- Enable codesign for iOS device framework builds - [#444](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/444)
-- Declare `automaticallyAppendNewlineForCustomFormatters` properties as `nonatomic` - [#443](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/443)
-- Warning fixes & type standardization - [#419](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/419)
-- Legacy checks updated - [#424](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/424)
-- Documentation updates
-
-
-## [2.0.0-rc on Dec 11th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-rc)
-
-- Fix `dispatch_queue_t` properties.
-- Fix `registeredClasses` crashes at launch.
-
-
-## [2.0.0-beta4 on Nov 7th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta4)
-
-- Major refactoring and clean up.
-- Remove superfluous `log` from property names and use underscore for direct variable access.
-- Preliminary Swift support through `CocoaLumberjack.swift`.
-- Automatic 1.9.x legacy support when `DDLog.h` is imported instead of the new `CocoaLumberjack.h`.
-
-
-## [2.0.0-beta3 on Oct 21st, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta3)
-
-- Modernize flag variables to be `NS_OPTIONS`/`NS_ENUM`.
-- Change the log flags and levels to `NSUInteger`.
-- Fix warning when compiled with assertions blocked.
-- Crash fixes.
-
-
-## [2.0.0-beta2 on Sep 30th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta2)
-
-- Cleanup code.
-- Match `NSLog` read UID functionality in `DDASLLogger`.
-- Update framework and static libraries.
-
-
-## [2.0.0 Beta on Aug 12th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta)
-
-See [Migrate from 1.x to 2.x](https://github.com/CocoaLumberjack/CocoaLumberjack#migrating-to-2x)
-
-
-## [1.9.2 Updated patch release for 1.9.0 on Aug 11th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.2)
-
-- Fixed `NSCalendar components:fromDate:` crash - [#140](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/140) [#307](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/307) [#216](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/216)
-- New `DDAssert` macros - [#306](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/306)
-- Limit log growth by disk space only, not the number of files - [#195](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/195) [#303](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/303)
-- Change the mechanism for adding new line character (i.e. '\n\) to log messages in some logger - [#308](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/308) [#310](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/310)
-- Fixed deprecations - [#320](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/320) [#312](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/312) [#317](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/317)
-- `aslmsg` not freed and causing memory leak - [#314](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/314)
-- Fixed `CompressingLogFileManager` compression bug - [#315](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/315)
-- Remove unnecessary `NULL` check before `free()` - [#316](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/316)
-
-
-## [1.9.1 Patch release for 1.9.0 on Jun 30th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.1)
-
-- Fixed issues in rolling frequency - [#243](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/243) [#295](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/295) [@georgekola](https://github.com/georgekola)
-- Fixed critical issue, `addLogger` method should use a full bit mask instead of `LOG_LEVEL_VERBOSE`, otherwise extended logs or extra flags are ignored [fe6824c](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/fe6824c) [@robbiehanson](https://github.com/robbiehanson)
-- Performance optimisation: use compiler macros to skip iOS version checks - [4656d3b](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/4656d3b) [#298](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/298) [#291](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/291) [@robbiehanson](https://github.com/robbiehanson) [@liviur](https://github.com/liviur)
-- Changed the `Build Active Architecture Only` to `NO` [#294](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/294) [#293](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/293)
-- Optimisation by reusing `NSDateFormatter` instances [#296](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/296) [#301](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/301)
-
-
-## [1.9.0 New ASL capture module, several File logger fixes on May 23rd, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.0)
-
-- New ASL capture module [#242](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/242) [#263](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/263)
-- Override default `NSFileProtection` handling [#285](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/285)
-- Replaced warnings when ARC was not enabled with errors [#284](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/284)
-- Fix for issue [#278](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/278) where really large log files can keep growing [#280](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/280)
-- Fixed Xcode warnings [#279](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/279)
-- Update `calendarUnitFlags` with new iOS SDK values [#277](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/277)
-- Fix possible crash in `[NSCalendar components:fromDate:]` [#277](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/277)
-- Fix [#262](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/262) inverted ifs when renaming log [#264](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/264)
-- Proper way of doing singletons (via `dispatch_once`) [#259](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/259)
-- Explicitly declare `DDFileLogger` and `DDDispatchQueueLogFormatter ` properties as atomic to avoid Xcode warnings [#258](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/258)
-- Set `NSFileProtectionKey` on the temporary file created during compression [#256](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/256)
-- Fix a rare crash in `CompressingLogFileManager` caused by an unchecked result from read [#255](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/255)
-- Add explicit casts for integer conversion [#253](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/253)
-- Replace use of `NSThread.detachNewThreadSelector` [#251](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/251)
-- Add a constructor override for `initWithLogsDirectory:` [#252](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/252)
-- Check and log the streamError whenever we fail to write during compression and log any failures when removing the original file or cleaning up the temporary file after compression failed [#250](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/250)
-- Following Apple's guidelines for iOS Static Libraries [#249](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/249)
-- Some extra warnings for the mobile framework xcode project [a2e5666](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/a2e5666)
-- Update `FineGrainedLoggingAppDelegate.m` [#244](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/244)
-- New `[DDLog log:message:]` primitive [7f8af2e](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/7f8af2e)
-- Fixed issue [#181](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/181) when logging messages in iOS7 devices aren't properly retrieved by `asl_search` [#240](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/240)
-- Allow prevention of log file reuse [#238](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/238)
-- `DDTTYLogger`: Favour XcodeColors environment variable [#237](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/237)
-- `DDLog`: calling `atexit_b` in CLI applications, that use Foundation framework [#234](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/234)
-
-
-## [1.8.1 AllLoggers and bugfixes on Feb 14th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.8.1)
-
-- read access to all loggers - [#217](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/217) [#219](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/219)
-- fixed bug with archived logs not being handled correctly on iOS simulator - [#218](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/218)
-- log the `strerror(errno)` value when `setxattr()` fails - [#211](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/211)
-- Add a check for an archived log before overwriting - [#214](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/214)
-- improved safety by using assertions instead of comments (`DDLog` in the core) - [#221](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/221)
-- added Lumberjack logo :)
-
-
-## [1.8.0 Better CL support, custom logfile name format, bugfixes on Jan 21st, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.8.0)
-
-- `DDFileLogger` custom logfile (name) format - [#208](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/208)
-- Security static analysis fix - [#202](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/202)
-- `DDFileLogger`: using `CFBundleIdentifier` as a log filename prefix on OSX and iOS - [#206](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/206)
-- Allow disabling of specific levels per-logger - [#204](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/204)
-- Improve support for OS X command line tools - [#194](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/194)
-- `DDFileLogger`: fixed crash that occurred in case if application name == nil - [#198](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/198)
-- `DDFileLogger`: fixed comment - [#199](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/199)
-- Fix Travis - [#205](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/205)
-
-
-## [1.7.0 New log file naming convention and CocoaLumberjack organisation on Dec 10th, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.7.0)
-
-- new log file naming convention - [#191](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/191)
-- completed transition to **CocoaLumberjack** organisation - [#188](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/188)
-
-
-## [1.6.5.1 Patch release for Xcode 4.4+ compatibility on Dec 4th, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.5.1)
-
-- fixed compatibility with Xcode 4.4+ [#187](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/187)
-
-
-## [1.6.5 File Logger refactoring, Multi Formatter, preffixed extension classes on Dec 3rd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.5)
-
-`DDFileLogger` refactoring and fixes (thanks [@dvor](https://github.com/dvor) and [@an0](https://github.com/an0)):
-- Fixed [#63](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/63) Loggers don't flush in Command Line Tool [#184](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/184)
-- Fixed [#52](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/52) Force log rotation [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
-- Fixed [#55](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/55) After deleting log file or log dir they aren't created again without relaunching the app [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
-- Fixed [#129](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/129) [iOS] `DDFileLogger` causes crash when logging from background app [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
-- Fixed [#153](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/153) Log file on iPhone only contains a single line [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
-- Fixed [#155](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/155) How do I combine all my log levels into one file? [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
-- Fixed [#175](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/175) `DFileLogger` `creationDate` bug on 64-bit iOS system [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
-- Allow customizing the naming convention for log files to use timestamps [#174](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/174)
-
-Other:
-- Implemented multiple formatter (`DDMultiFormatter` - alows chaining of formatters) [#178](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/178)
-- Added DD prefix to extension classes (`ContextFilterLogFormatter` and `DispatchQueueLogFormatter`) [#178](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/178)
-- Updated code indentation: Tabs changed to spaces [#180](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/180)
-- Included `DDLog+LOGV.h` in Cocoapods sources [d253bd7](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/d253bd7)
-- other fixes/improvements
-
-
-## [1.6.4 Fix compatibility with 3rd party frameworks on Nov 21st, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.4)
-
-* "Fix" conflicts with 3rd party libraries using `CocoaLumberjack` [#172](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/172)
-* Ignore deprecated warning for `dispatch_get_current_queue` [#167](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/167)
-* Add new `DEBUG` log level support to included loggers [#166](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/166)
-* Method declarations that make it easier to extend/modify `DispatchQueueLogFormatter` [#164](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/164)
-
-
-## [1.6.3 New macros, updated podspec and bug fixes on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.3)
-
-* Add `LOGV`-style macros [#161](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/161)
-* Fix getting queue's label [#159](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/159)
-* New log level `DEBUG` [#145](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/145)
-* Use `DISPATCH_CURRENT_QUEUE_LABEL` if available [#159](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/159)
-* Different `logLevel` per each logger [#151](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/151)
-* Created 2 subspecs, `Core` and `Extensions` [#152](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/152)
-* Updated observer for keypath using `NSStringFromSelector` + `@selector` [38e5da3](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/38e5da3)
-* Replaced `id` return type with `instancetype` [ebee454](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/ebee454)
-* Remove implicit conversion warnings [#149](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/149)
-* `DDTTYLogger`: Allow to set default color profiles for all contexts at once [#146](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/146) [#158](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/158)
-* `DDTTYLogger`: By default apply `setForegroundColor:backgroundColor:forFlag:` to `LOG_CONTEXT_ALL` [#154](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/154)
-* `DispatchQueueLogFormatter`: Use modern Objective-C [#142](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/142)
-* `DispatchQueueLogFormatter`: Make sure to always use a `NSGregorianCalendar` for date formatter [#142](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/142)
-* Replaced explicit reference to class name in `logFileWithPath` factory method [#131](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/131)
-* Catch exceptions in `logMessage:` [#130](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/130)
-* Fix enum type conversion warnings [#124](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/124)
-* Add deployment target condition for workaround [#121](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/121)
-* Fix static analyzer warnings about `nil` values in dictionary [#122](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/122)
-* Fix `dispatch_get_current_queue` crash [#121](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/121)
-* Fixing colors in greyscale color-space not working [d019cfd](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/d019cfd)
-* Guard around `dispatch_resume()` being called with null pointer [#107](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/107)
-* `NULL` safety checks [#107](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/107)
-
-
-## [1.6.2 on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.2)
-
-## [1.6.1 on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.1)
-
-## [1.6 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6)
-
-## [1.5.1 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.5.1)
-
-## [1.5 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.5)
-
-## [1.4.1 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.4.1)
-
-## [1.4 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.4)
-
-## [1.3.3 on Mar 30th, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.3)
-
-## [1.3.2 on Dec 23rd, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.2)
-
-## [1.3.1 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.1)
-
-## [1.3 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3)
-
-## [1.2.3 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.3)
-
-## [1.2.2 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.2)
-
-## [1.2.1 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.1)
-
-## [1.2 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2)
-
-## [1.1 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.1)
-
-## [1.0 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.0)
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/LICENSE b/comwell_key_app/ios/Pods/CocoaLumberjack/LICENSE
deleted file mode 100644
index 27f20f72..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-BSD 3-Clause License
-
-Copyright (c) 2010-2024, Deusty, LLC
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-3. Neither the name of Deusty nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/README.md b/comwell_key_app/ios/Pods/CocoaLumberjack/README.md
deleted file mode 100644
index e9a2fc17..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/README.md
+++ /dev/null
@@ -1,301 +0,0 @@
-<p align="center">
- <img src="https://raw.githubusercontent.com/CocoaLumberjack/CocoaLumberjack/master/LumberjackLogo.png" title="Lumberjack logo" float=left>
-</p>
-
-CocoaLumberjack
-===============
-[![Version](https://img.shields.io/github/release/CocoaLumberjack/CocoaLumberjack.svg?display_name=tag&style=flat)](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/latest)
-[![License](https://img.shields.io/github/license/CocoaLumberjack/CocoaLumberjack.svg?style=flat)](https://opensource.org/licenses/BSD-3-Clause)
-[![Pod Platform](https://img.shields.io/cocoapods/p/CocoaLumberjack.svg?style=flat)](https://cocoadocs.org/docsets/CocoaLumberjack/)
-[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
-![Unit Tests](https://github.com/CocoaLumberjack/CocoaLumberjack/workflows/Unit%20Tests/badge.svg)
-[![codecov](https://codecov.io/gh/CocoaLumberjack/CocoaLumberjack/branch/master/graph/badge.svg)](https://codecov.io/gh/CocoaLumberjack/CocoaLumberjack)
-[![codebeat badge](https://codebeat.co/badges/840b714a-c8f3-4936-ada4-363473cd4e6b)](https://codebeat.co/projects/github-com-cocoalumberjack-cocoalumberjack-master)
-
-
-**CocoaLumberjack** is a fast & simple, yet powerful & flexible logging framework for macOS, iOS, tvOS and watchOS.
-
-## How to get started
-
-First, install CocoaLumberjack via [CocoaPods](https://cocoapods.org), [Carthage](https://github.com/Carthage/Carthage), [Swift Package Manager](https://swift.org/package-manager/) or manually.
-Then use `DDOSLogger` for iOS 10 and later, or `DDTTYLogger` and `DDASLLogger` for earlier versions to begin logging messages.
-
-### CocoaPods
-
-```ruby
-platform :ios, '11.0'
-
-target 'SampleTarget' do
- use_frameworks!
- pod 'CocoaLumberjack/Swift'
-end
-```
-Note: `Swift` is a subspec which will include all the Obj-C code plus the Swift one, so this is sufficient.
-For more details about how to use Swift with Lumberjack, see [this conversation](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/405).
-
-For Objective-C use the following:
-```ruby
-platform :ios, '11.0'
-
-target 'SampleTarget' do
- pod 'CocoaLumberjack'
-end
-```
-
-### Carthage
-
-Carthage is a lightweight dependency manager for Swift and Objective-C. It leverages CocoaTouch modules and is less invasive than CocoaPods.
-
-To install with Carthage, follow the instruction on [Carthage](https://github.com/Carthage/Carthage)
-
-Cartfile
-```
-github "CocoaLumberjack/CocoaLumberjack"
-```
-
-
-### Swift Package Manager
-
-As of CocoaLumberjack 3.6.0, you can use the Swift Package Manager as integration method.
-If you want to use the Swift Package Manager as integration method, either use Xcode to add the package dependency or add the following dependency to your Package.swift:
-
-```swift
-.package(url: "https://github.com/CocoaLumberjack/CocoaLumberjack.git", from: "3.8.0"),
-```
-
-Note that you may need to add both products, `CocoaLumberjack` and `CocoaLumberjackSwift` to your target since SPM sometimes fails to detect that `CocoaLumerjackSwift` depends on `CocoaLumberjack`.
-
-### Install manually
-
-If you want to install CocoaLumberjack manually, read the [manual installation](Documentation/GettingStarted.md#manual-installation) guide for more information.
-
-### Swift Usage
-
-Usually, you can simply `import CocoaLumberjackSwift`. If you installed CocoaLumberjack using CocoaPods, you need to use `import CocoaLumberjack` instead.
-
-```swift
-DDLog.add(DDOSLogger.sharedInstance) // Uses os_log
-
-let fileLogger: DDFileLogger = DDFileLogger() // File Logger
-fileLogger.rollingFrequency = 60 * 60 * 24 // 24 hours
-fileLogger.logFileManager.maximumNumberOfLogFiles = 7
-DDLog.add(fileLogger)
-
-...
-
-DDLogVerbose("Verbose")
-DDLogDebug("Debug")
-DDLogInfo("Info")
-DDLogWarn("Warn")
-DDLogError("Error")
-```
-
-### Obj-C usage
-
-If you're using Lumberjack as a framework, you can `@import CocoaLumberjack;`.
-Otherwise, `#import <CocoaLumberjack/CocoaLumberjack.h>`
-
-```objc
-[DDLog addLogger:[DDOSLogger sharedInstance]]; // Uses os_log
-
-DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; // File Logger
-fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
-fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
-[DDLog addLogger:fileLogger];
-
-...
-
-DDLogVerbose(@"Verbose");
-DDLogDebug(@"Debug");
-DDLogInfo(@"Info");
-DDLogWarn(@"Warn");
-DDLogError(@"Error");
-```
-### Objective-C ARC Semantic Issue
-
-When integrating Lumberjack into an existing Objective-C it is possible to run into `Multiple methods named 'tag' found with mismatched result, parameter type or attributes` build error.
-
-Add `#define DD_LEGACY_MESSAGE_TAG 0` before importing CocoaLumberjack or add `#define DD_LEGACY_MESSAGE_TAG 0` or add `-DDD_LEGACY_MESSAGE_TAG=0` to *Other C Flags*/*OTHER_CFLAGS* in your Xcode project.
-
-## [swift-log](https://github.com/apple/swift-log) backend
-
-CocoaLumberjack also ships with a backend implementation for [swift-log](https://github.com/apple/swift-log).
-Simply add CocoaLumberjack as dependency to your SPM target (see above) and also add the `CocoaLumberjackSwiftLogBackend` product as dependency to your target.
-
-You can then use `DDLogHandler` as backend for swift-log, which will forward all messages to CocoaLumberjack's `DDLog`. You will still configure the loggers and log formatters you want via `DDLog`, but writing log messages will be done using `Logger` from swift-log.
-
-In your own log formatters, you can make use of the `swiftLogInfo` property on `DDLogMessage` to retrieve the details of a message that is logged via swift-log.
-
-To use swift-log with CocoaLumberjack, take a look the following code snippet to see how to get started.
-
-```swift
-import CocoaLumberjack
-import CocoaLumberjackSwiftLogBackend
-import Logging
-
-// In your application's entry point (e.g. AppDelegate):
-DDLog.add(DDOSLogger.sharedInstance) // Configure loggers
-LoggingSystem.bootstrapWithCocoaLumberjack() // Use CocoaLumberjack as swift-log backend
-```
-
-
-## More information
-
-- read the [Getting started](Documentation/GettingStarted.md) guide, check out the [FAQ](Documentation/FAQ.md) section or the other [docs](Documentation/)
-- if you find issues or want to suggest improvements, create an issue or a pull request
-- for all kinds of questions involving CocoaLumberjack, use the [Google group](https://groups.google.com/group/cocoalumberjack) or StackOverflow (use [#lumberjack](https://stackoverflow.com/questions/tagged/lumberjack)).
-
-
-## CocoaLumberjack 3
-
-### Migrating to 3.x
-
-* To be determined
-
-## Features
-
-### Lumberjack is Fast & Simple, yet Powerful & Flexible.
-
-It is similar in concept to other popular logging frameworks such as log4j, yet is designed specifically for Objective-C, and takes advantage of features such as multi-threading, grand central dispatch (if available), lockless atomic operations, and the dynamic nature of the Objective-C runtime.
-
-### Lumberjack is Fast
-
-In most cases it is an order of magnitude faster than NSLog.
-
-### Lumberjack is Simple
-
-It takes as little as a single line of code to configure lumberjack when your application launches. Then simply replace your NSLog statements with DDLog statements and that's about it. (And the DDLog macros have the exact same format and syntax as NSLog, so it's super easy.)
-
-### Lumberjack is Powerful:
-
-One log statement can be sent to multiple loggers, meaning you can log to a file and the console simultaneously. Want more? Create your own loggers (it's easy) and send your log statements over the network. Or to a database or distributed file system. The sky is the limit.
-
-### Lumberjack is Flexible:
-
-Configure your logging however you want. Change log levels per file (perfect for debugging). Change log levels per logger (verbose console, but concise log file). Change log levels per xcode configuration (verbose debug, but concise release). Have your log statements compiled out of the release build. Customize the number of log levels for your application. Add your own fine-grained logging. Dynamically change log levels during runtime. Choose how & when you want your log files to be rolled. Upload your log files to a central server. Compress archived log files to save disk space...
-
-## This framework is for you if:
-
-- You're looking for a way to track down that impossible-to-reproduce bug that keeps popping up in the field.
-- You're frustrated with the super short console log on the iPhone.
-- You're looking to take your application to the next level in terms of support and stability.
-- You're looking for an enterprise level logging solution for your application (Mac or iPhone).
-
-## Documentation
-
-- **[Get started using Lumberjack](Documentation/GettingStarted.md)**<br/>
-- [Different log levels for Debug and Release builds](Documentation/XcodeTricks.md)<br/>
-- [Different log levels for each logger](Documentation/PerLoggerLogLevels.md)<br/>
-- [Use colors in the Xcode debugging console](Documentation/XcodeColors.md)<br/>
-- [Write your own custom formatters](Documentation/CustomFormatters.md)<br/>
-- [FAQ](Documentation/FAQ.md)<br/>
-- [Analysis of performance with benchmarks](Documentation/Performance.md)<br/>
-- [Common issues you may encounter and their solutions](Documentation/ProblemSolution.md)<br/>
-- [AppCode support](Documentation/AppCode-support.md)
-- **[Full Lumberjack documentation](Documentation/)**<br/>
-
-## Requirements
-The current version of Lumberjack requires:
-- Xcode 14.1 or later
-- Swift 5.5 or later
-- macOS 10.13 or later
-- iOS 11 or later
-- tvOS 11 or later
-- watchOS 4 or later
-
-### Backwards compatibility
-- for iOS/tvOS up to 10, watchOS up to 3, macOS up to 10.12, Xcode up to 13 and Swift up to 5.4, use the 3.7.4 version
-- for Xcode 11 and Swift up to 5.2, use the 3.6.2 version
-- for Xcode 10 and Swift 4.2, use the 3.5.2 version
-- for iOS 8, use the 3.6.1 version
-- for iOS 6, iOS 7, OS X 10.8, OS X 10.9 and Xcode 9, use the 3.4.2 version
-- for iOS 5 and OS X 10.7, use the 3.3 version
-- for Xcode 8 and Swift 3, use the 3.2 version
-- for Xcode 7.3 and Swift 2.3, use the 2.4.0 version
-- for Xcode 7.3 and Swift 2.2, use the 2.3.0 version
-- for Xcode 7.2 and 7.1, use the 2.2.0 version
-- for Xcode 7.0 or earlier, use the 2.1.0 version
-- for Xcode 6 or earlier, use the 2.0.x version
-- for OS X < 10.7 support, use the 1.6.0 version
-
-## Communication
-
-- If you **need help**, use [Stack Overflow](https://stackoverflow.com/questions/tagged/lumberjack). (Tag 'lumberjack')
-- If you'd like to **ask a general question**, use [Stack Overflow](https://stackoverflow.com/questions/tagged/lumberjack).
-- If you **found a bug**, open an issue.
-- If you **have a feature request**, open an issue.
-- If you **want to contribute**, submit a pull request.
-
-## Data Collection Practices
-
-Per [App privacy details on the App Store](https://developer.apple.com/app-store/app-privacy-details/), Apple is requesting app developers to provide info about their data collection, us SDK maintainers must provide them with the same data.
-
-### Data collection by the framework
-
-**By default, CocoaLumberjack does NOT collect any data on its own.**
-
-[See our Data Collection Practices list.](https://cocoalumberjack.github.io/DataCollection/index.html)
-
-### Indirect data collection through the framework
-
-CocoaLumberjack is a logging framework which makes it easy to send those logs to different platforms.
-
-This is why collecting data might happen quite easily, if app developers include any sensitive data into their log messages.
-
-**Important note: app developers are fully responsible for any sensitive data collected through our logging system!**
-
-In consequence, you must comply to the Apple's privacy details policy (mentioned above) and document the ways in which user data is being collected.
-Since the number of scenarios where data might be indirectly collected through CocoaLumberjack is quite large, it's up to you, as app developers, to properly review your app's code and identify those cases.
-What we can do to help is raise awareness about potential data collection through our framework.
-
-Private data includes but isn't limited to:
-
-- user info (name, email, address, ...)
-- location info
-- contacts
-- identifiers (user id, device id, ...)
-- app usage data
-- performance data
-- health and fitness info
-- financial info
-- sensitive info
-- user content
-- history (browsing, search, ...)
-- purchases
-- diagnostics
-- ...
-
-_Example_: `DDLogInfo("User: \(myUser)")` will add the `myUser` info to the logs, so if those are forwarded to a 3rd party or sent via email, that may qualify as data collection.
-
-## Author
-
-- [Robbie Hanson](https://github.com/robbiehanson)
-- Love the project? Wanna buy me a coffee? (or a beer :D) [![donation](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UZRA26JPJB3DA)
-
-## Collaborators
-- [Ernesto Rivera](https://github.com/rivera-ernesto)
-- [Dmitry Vorobyov](https://github.com/dvor)
-- [Bogdan Poplauschi](https://github.com/bpoplauschi)
-- [C.W. Betts](https://github.com/MaddTheSane)
-- [Koichi Yokota (sushichop)](https://github.com/sushichop)
-- [Nick Brook](https://github.com/nrbrook)
-- [Florian Friedrich](https://github.com/ffried)
-- [Stephan Diederich](https://github.com/diederich)
-- [Kent Sutherland](https://github.com/ksuther)
-- [Dmitry Lobanov](https://github.com/lolgear)
-- [Hakon Hanesand](https://github.com/hhanesand)
-
-## License
-- CocoaLumberjack is available under the BSD 3 license. See the [LICENSE file](LICENSE).
-
-## Extensions
-- [Birch-Lumberjack](https://github.com/gruffins/birch-lumberjack) A remote logger for CocoaLumberjack
-- [BugfenderSDK-CocoaLumberjack](https://github.com/bugfender/BugfenderSDK-CocoaLumberjack) A Bugfender logger for CocoaLumberjack
-- [LogIO-CocoaLumberjack](https://github.com/s4nchez/LogIO-CocoaLumberjack) A log.io logger for CocoaLumberjack
-- [XCDLumberjackNSLogger](https://github.com/0xced/XCDLumberjackNSLogger) CocoaLumberjack logger which sends logs to NSLogger
-
-## Architecture
-
-<p align="center">
- <img src="https://raw.githubusercontent.com/CocoaLumberjack/CocoaLumberjack/master/Documentation/CocoaLumberjackClassDiagram.png" title="CocoaLumberjack class diagram">
-</p>
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/CLI/CLIColor.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/CLI/CLIColor.m
deleted file mode 100644
index 08c63301..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/CLI/CLIColor.m
+++ /dev/null
@@ -1,57 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-
-#if TARGET_OS_OSX
-
-#import <CocoaLumberjack/CLIColor.h>
-
-@interface CLIColor () {
- CGFloat _red, _green, _blue, _alpha;
-}
-
-@end
-
-
-@implementation CLIColor
-
-+ (instancetype)colorWithCalibratedRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha {
- __auto_type color = [CLIColor new];
- color->_red = red;
- color->_green = green;
- color->_blue = blue;
- color->_alpha = alpha;
- return color;
-}
-
-- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha {
- if (red) {
- *red = _red;
- }
- if (green) {
- *green = _green;
- }
- if (blue) {
- *blue = _blue;
- }
- if (alpha) {
- *alpha = _alpha;
- }
-}
-
-@end
-
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogCapture.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogCapture.m
deleted file mode 100644
index db7254dc..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogCapture.m
+++ /dev/null
@@ -1,205 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-
-#if !TARGET_OS_WATCH
-
-#include <asl.h>
-#include <notify.h>
-#include <notify_keys.h>
-#include <sys/time.h>
-
-#import <CocoaLumberjack/DDASLLogCapture.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-static __auto_type _cancel = YES;
-static __auto_type _captureLevel = DDLogLevelVerbose;
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-@implementation DDASLLogCapture
-#pragma clang diagnostic pop
-
-+ (void)start {
- // Ignore subsequent calls
- if (!_cancel) {
- return;
- }
-
- _cancel = NO;
-
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
- [self captureAslLogs];
- });
-}
-
-+ (void)stop {
- _cancel = YES;
-}
-
-+ (DDLogLevel)captureLevel {
- return _captureLevel;
-}
-
-+ (void)setCaptureLevel:(DDLogLevel)level {
- _captureLevel = level;
-}
-
-#pragma mark - Private methods
-
-+ (void)configureAslQuery:(aslmsg)query {
- const char param[] = "7"; // ASL_LEVEL_DEBUG, which is everything. We'll rely on regular DDlog log level to filter
-
- asl_set_query(query, ASL_KEY_LEVEL, param, ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC);
-
- // Don't retrieve logs from our own DDASLLogger
- asl_set_query(query, kDDASLKeyDDLog, kDDASLDDLogValue, ASL_QUERY_OP_NOT_EQUAL);
-
-#if !TARGET_OS_IPHONE || (defined(TARGET_SIMULATOR) && TARGET_SIMULATOR)
- __auto_type processId = [[NSProcessInfo processInfo] processIdentifier];
- char pid[16];
- snprintf(pid, sizeof(pid), "%d", processId);
- asl_set_query(query, ASL_KEY_PID, pid, ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_NUMERIC);
-#endif
-}
-
-+ (void)aslMessageReceived:(aslmsg)msg {
- __auto_type messageCString = asl_get(msg, ASL_KEY_MSG);
- if (messageCString == NULL)
- return;
-
- DDLogFlag flag;
- BOOL async;
-
- __auto_type levelCString = asl_get(msg, ASL_KEY_LEVEL);
- switch (levelCString? atoi(levelCString) : 0) {
- // By default all NSLog's with a ASL_LEVEL_WARNING level
- case ASL_LEVEL_EMERG :
- case ASL_LEVEL_ALERT :
- case ASL_LEVEL_CRIT : flag = DDLogFlagError; async = NO; break;
- case ASL_LEVEL_ERR : flag = DDLogFlagWarning; async = YES; break;
- case ASL_LEVEL_WARNING : flag = DDLogFlagInfo; async = YES; break;
- case ASL_LEVEL_NOTICE : flag = DDLogFlagDebug; async = YES; break;
- case ASL_LEVEL_INFO :
- case ASL_LEVEL_DEBUG :
- default : flag = DDLogFlagVerbose; async = YES; break;
- }
-
- if (!(_captureLevel & flag)) {
- return;
- }
-
- // NSString * sender = [NSString stringWithCString:asl_get(msg, ASL_KEY_SENDER) encoding:NSUTF8StringEncoding];
- NSString *message = @(messageCString);
-
- __auto_type secondsCString = asl_get(msg, ASL_KEY_TIME);
- __auto_type nanoCString = asl_get(msg, ASL_KEY_TIME_NSEC);
- __auto_type seconds = secondsCString ? strtod(secondsCString, NULL) : [NSDate timeIntervalSinceReferenceDate] - NSTimeIntervalSince1970;
- __auto_type nanoSeconds = nanoCString? strtod(nanoCString, NULL) : 0;
- __auto_type totalSeconds = seconds + (nanoSeconds / 1e9);
-
- __auto_type timeStamp = [NSDate dateWithTimeIntervalSince1970:totalSeconds];
-
- __auto_type logMessage = [[DDLogMessage alloc] initWithMessage:message
- level:_captureLevel
- flag:flag
- context:0
- file:@"DDASLLogCapture"
- function:nil
- line:0
- tag:nil
- options:DDLogMessageDontCopyMessage
- timestamp:timeStamp];
-
- [DDLog log:async message:logMessage];
-}
-
-+ (void)captureAslLogs {
- @autoreleasepool
- {
- /*
- We use ASL_KEY_MSG_ID to see each message once, but there's no
- obvious way to get the "next" ID. To bootstrap the process, we'll
- search by timestamp until we've seen a message.
- */
-
- struct timeval timeval = {
- .tv_sec = 0
- };
- gettimeofday(&timeval, NULL);
- __auto_type startTime = (unsigned long long)timeval.tv_sec;
- __block unsigned long long lastSeenID = 0;
-
- /*
- syslogd posts kNotifyASLDBUpdate (com.apple.system.logger.message)
- through the notify API when it saves messages to the ASL database.
- There is some coalescing - currently it is sent at most twice per
- second - but there is no documented guarantee about this. In any
- case, there may be multiple messages per notification.
-
- Notify notifications don't carry any payload, so we need to search
- for the messages.
- */
- int notifyToken = 0; // Can be used to unregister with notify_cancel().
- notify_register_dispatch(kNotifyASLDBUpdate, &notifyToken, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(int token)
- {
- // At least one message has been posted; build a search query.
- @autoreleasepool
- {
- __auto_type query = asl_new(ASL_TYPE_QUERY);
- char stringValue[64];
-
- if (lastSeenID > 0) {
- snprintf(stringValue, sizeof stringValue, "%llu", lastSeenID);
- asl_set_query(query, ASL_KEY_MSG_ID, stringValue, ASL_QUERY_OP_GREATER | ASL_QUERY_OP_NUMERIC);
- } else {
- snprintf(stringValue, sizeof stringValue, "%llu", startTime);
- asl_set_query(query, ASL_KEY_TIME, stringValue, ASL_QUERY_OP_GREATER_EQUAL | ASL_QUERY_OP_NUMERIC);
- }
-
- [self configureAslQuery:query];
-
- // Iterate over new messages.
- aslmsg msg;
- __auto_type response = asl_search(NULL, query);
-
- while ((msg = asl_next(response)))
- {
- [self aslMessageReceived:msg];
-
- // Keep track of which messages we've seen.
- lastSeenID = (unsigned long long)atoll(asl_get(msg, ASL_KEY_MSG_ID));
- }
- asl_release(response);
- asl_free(query);
-
- if (_cancel) {
- notify_cancel(token);
- return;
- }
-
- }
- });
- }
-}
-
-@end
-
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogger.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogger.m
deleted file mode 100644
index e9b8c6a3..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDASLLogger.m
+++ /dev/null
@@ -1,133 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-
-#if !TARGET_OS_WATCH
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <asl.h>
-
-#import <CocoaLumberjack/DDASLLogger.h>
-
-const char* const kDDASLKeyDDLog = "DDLog";
-const char* const kDDASLDDLogValue = "1";
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
-static DDASLLogger *sharedInstance;
-#pragma clang diagnostic pop
-
-@interface DDASLLogger () {
- aslclient _client;
-}
-
-@end
-
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-@implementation DDASLLogger
-#pragma clang diagnostic pop
-
-+ (instancetype)sharedInstance {
- static dispatch_once_t DDASLLoggerOnceToken;
-
- dispatch_once(&DDASLLoggerOnceToken, ^{
- sharedInstance = [[[self class] alloc] init];
- });
-
- return sharedInstance;
-}
-
-- (instancetype)init {
- if (sharedInstance != nil) {
- return nil;
- }
-
- if ((self = [super init])) {
- // A default asl client is provided for the main thread,
- // but background threads need to create their own client.
-
- _client = asl_open(NULL, "com.apple.console", 0);
- }
-
- return self;
-}
-
-- (DDLoggerName)loggerName {
- return DDLoggerNameASL;
-}
-
-- (void)logMessage:(DDLogMessage *)logMessage {
- // Skip captured log messages
- if ([logMessage->_fileName isEqualToString:@"DDASLLogCapture"]) {
- return;
- }
-
- __auto_type message = _logFormatter ? [_logFormatter formatLogMessage:logMessage] : logMessage->_message;
-
- if (message) {
- __auto_type msg = [message UTF8String];
-
- size_t aslLogLevel;
- switch (logMessage->_flag) {
- // Note: By default ASL will filter anything above level 5 (Notice).
- // So our mappings shouldn't go above that level.
- case DDLogFlagError : aslLogLevel = ASL_LEVEL_CRIT; break;
- case DDLogFlagWarning : aslLogLevel = ASL_LEVEL_ERR; break;
- case DDLogFlagInfo : aslLogLevel = ASL_LEVEL_WARNING; break; // Regular NSLog's level
- case DDLogFlagDebug :
- case DDLogFlagVerbose :
- default : aslLogLevel = ASL_LEVEL_NOTICE; break;
- }
-
- static char const *const level_strings[] = { "0", "1", "2", "3", "4", "5", "6", "7" };
-
- // NSLog uses the current euid to set the ASL_KEY_READ_UID.
- const __auto_type readUID = geteuid();
-
- char readUIDString[16];
-#ifndef NS_BLOCK_ASSERTIONS
- __auto_type l = (size_t)snprintf(readUIDString, sizeof(readUIDString), "%d", readUID);
-#else
- snprintf(readUIDString, sizeof(readUIDString), "%d", readUID);
-#endif
-
- NSAssert(l < sizeof(readUIDString),
- @"Formatted euid is too long.");
- NSAssert(aslLogLevel < (sizeof(level_strings) / sizeof(level_strings[0])),
- @"Unhandled ASL log level.");
-
- __auto_type m = asl_new(ASL_TYPE_MSG);
- if (m != NULL) {
- if (asl_set(m, ASL_KEY_LEVEL, level_strings[aslLogLevel]) == 0 &&
- asl_set(m, ASL_KEY_MSG, msg) == 0 &&
- asl_set(m, ASL_KEY_READ_UID, readUIDString) == 0 &&
- asl_set(m, kDDASLKeyDDLog, kDDASLDDLogValue) == 0) {
- asl_send(_client, m);
- }
- asl_free(m);
- }
- //TODO handle asl_* failures non-silently?
- }
-}
-
-@end
-
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDAbstractDatabaseLogger.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDAbstractDatabaseLogger.m
deleted file mode 100644
index 232846aa..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDAbstractDatabaseLogger.m
+++ /dev/null
@@ -1,636 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <CocoaLumberjack/DDAbstractDatabaseLogger.h>
-
-@interface DDAbstractDatabaseLogger ()
-
-- (void)destroySaveTimer;
-- (void)updateAndResumeSaveTimer;
-- (void)createSuspendedSaveTimer;
-- (void)destroyDeleteTimer;
-- (void)updateDeleteTimer;
-- (void)createAndStartDeleteTimer;
-
-@end
-
-#pragma mark -
-
-@implementation DDAbstractDatabaseLogger
-
-- (instancetype)init {
- if ((self = [super init])) {
- _saveThreshold = 500;
- _saveInterval = 60; // 60 seconds
- _maxAge = (60 * 60 * 24 * 7); // 7 days
- _deleteInterval = (60 * 5); // 5 minutes
- }
-
- return self;
-}
-
-- (void)dealloc {
- [self destroySaveTimer];
- [self destroyDeleteTimer];
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Override Me
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (BOOL)db_log:(__unused DDLogMessage *)logMessage {
- // Override me and add your implementation.
- //
- // Return YES if an item was added to the buffer.
- // Return NO if the logMessage was ignored.
-
- return NO;
-}
-
-- (void)db_save {
- // Override me and add your implementation.
-}
-
-- (void)db_delete {
- // Override me and add your implementation.
-}
-
-- (void)db_saveAndDelete {
- // Override me and add your implementation.
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Private API
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)performSaveAndSuspendSaveTimer {
- if (_unsavedCount > 0) {
- if (_deleteOnEverySave) {
- [self db_saveAndDelete];
- } else {
- [self db_save];
- }
- }
-
- _unsavedCount = 0;
- _unsavedTime = 0;
-
- if (_saveTimer != NULL && _saveTimerSuspended == 0) {
- dispatch_suspend(_saveTimer);
- _saveTimerSuspended = 1;
- }
-}
-
-- (void)performDelete {
- if (_maxAge > 0.0) {
- [self db_delete];
-
- _lastDeleteTime = dispatch_time(DISPATCH_TIME_NOW, 0);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Timers
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)destroySaveTimer {
- if (_saveTimer != NULL) {
- dispatch_source_cancel(_saveTimer);
-
- // Must activate a timer before releasing it (or it will crash)
- if (_saveTimerSuspended < 0) {
- dispatch_activate(_saveTimer);
- } else if (_saveTimerSuspended > 0) {
- dispatch_resume(_saveTimer);
- }
-
-#if !OS_OBJECT_USE_OBJC
- dispatch_release(_saveTimer);
-#endif
- _saveTimer = NULL;
- _saveTimerSuspended = 0;
- }
-}
-
-- (void)updateAndResumeSaveTimer {
- if ((_saveTimer != NULL) && (_saveInterval > 0.0) && (_unsavedTime > 0)) {
- __auto_type interval = (uint64_t)(_saveInterval * (NSTimeInterval) NSEC_PER_SEC);
- __auto_type startTime = dispatch_time(_unsavedTime, (int64_t)interval);
-
- dispatch_source_set_timer(_saveTimer, startTime, interval, 1ull * NSEC_PER_SEC);
-
- if (_saveTimerSuspended < 0) {
- dispatch_activate(_saveTimer);
- _saveTimerSuspended = 0;
- } else if (_saveTimerSuspended > 0) {
- dispatch_resume(_saveTimer);
- _saveTimerSuspended = 0;
- }
- }
-}
-
-- (void)createSuspendedSaveTimer {
- if ((_saveTimer == NULL) && (_saveInterval > 0.0)) {
- _saveTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.loggerQueue);
-
- dispatch_source_set_event_handler(_saveTimer, ^{ @autoreleasepool {
- [self performSaveAndSuspendSaveTimer];
- } });
-
- _saveTimerSuspended = -1;
- }
-}
-
-- (void)destroyDeleteTimer {
- if (_deleteTimer != NULL) {
- dispatch_source_cancel(_deleteTimer);
-#if !OS_OBJECT_USE_OBJC
- dispatch_release(_deleteTimer);
-#endif
- _deleteTimer = NULL;
- }
-}
-
-- (void)updateDeleteTimer {
- if ((_deleteTimer != NULL) && (_deleteInterval > 0.0) && (_maxAge > 0.0)) {
- __auto_type interval = (int64_t)(_deleteInterval * (NSTimeInterval) NSEC_PER_SEC);
- dispatch_time_t startTime;
-
- if (_lastDeleteTime > 0) {
- startTime = dispatch_time(_lastDeleteTime, interval);
- } else {
- startTime = dispatch_time(DISPATCH_TIME_NOW, interval);
- }
-
- dispatch_source_set_timer(_deleteTimer, startTime, (uint64_t)interval, 1ull * NSEC_PER_SEC);
- }
-}
-
-- (void)createAndStartDeleteTimer {
- if ((_deleteTimer == NULL) && (_deleteInterval > 0.0) && (_maxAge > 0.0)) {
- _deleteTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.loggerQueue);
-
- if (_deleteTimer != NULL) {
- dispatch_source_set_event_handler(_deleteTimer, ^{ @autoreleasepool {
- [self performDelete];
- } });
-
- [self updateDeleteTimer];
-
- // We are sure that -updateDeleteTimer did call dispatch_source_set_timer()
- // since it has the same guards on _deleteInterval and _maxAge
- dispatch_activate(_deleteTimer);
- }
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Configuration
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (NSUInteger)saveThreshold {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block NSUInteger result;
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_saveThreshold;
- });
- });
-
- return result;
-}
-
-- (void)setSaveThreshold:(NSUInteger)threshold {
- dispatch_block_t block = ^{
- @autoreleasepool {
- if (self->_saveThreshold != threshold) {
- self->_saveThreshold = threshold;
-
- // Since the saveThreshold has changed,
- // we check to see if the current unsavedCount has surpassed the new threshold.
- //
- // If it has, we immediately save the log.
-
- if ((self->_unsavedCount >= self->_saveThreshold) && (self->_saveThreshold > 0)) {
- [self performSaveAndSuspendSaveTimer];
- }
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (NSTimeInterval)saveInterval {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block NSTimeInterval result;
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_saveInterval;
- });
- });
-
- return result;
-}
-
-- (void)setSaveInterval:(NSTimeInterval)interval {
- __auto_type block = ^{
- @autoreleasepool {
- // C99 recommended floating point comparison macro
- // Read: isLessThanOrGreaterThan(floatA, floatB)
-
- if (/* saveInterval != interval */ islessgreater(self->_saveInterval, interval)) {
- self->_saveInterval = interval;
-
- // There are several cases we need to handle here.
- //
- // 1. If the saveInterval was previously enabled and it just got disabled,
- // then we need to stop the saveTimer. (And we might as well release it.)
- //
- // 2. If the saveInterval was previously disabled and it just got enabled,
- // then we need to setup the saveTimer. (Plus we might need to do an immediate save.)
- //
- // 3. If the saveInterval increased, then we need to reset the timer so that it fires at the later date.
- //
- // 4. If the saveInterval decreased, then we need to reset the timer so that it fires at an earlier date.
- // (Plus we might need to do an immediate save.)
-
- if (self->_saveInterval > 0.0) {
- if (self->_saveTimer == NULL) {
- // Handles #2
- //
- // Since the saveTimer uses the unsavedTime to calculate it's first fireDate,
- // if a save is needed the timer will fire immediately.
-
- [self createSuspendedSaveTimer];
- [self updateAndResumeSaveTimer];
- } else {
- // Handles #3
- // Handles #4
- //
- // Since the saveTimer uses the unsavedTime to calculate it's first fireDate,
- // if a save is needed the timer will fire immediately.
-
- [self updateAndResumeSaveTimer];
- }
- } else if (self->_saveTimer) {
- // Handles #1
-
- [self destroySaveTimer];
- }
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (NSTimeInterval)maxAge {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block NSTimeInterval result;
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_maxAge;
- });
- });
-
- return result;
-}
-
-- (void)setMaxAge:(NSTimeInterval)interval {
- __auto_type block = ^{
- @autoreleasepool {
- // C99 recommended floating point comparison macro
- // Read: isLessThanOrGreaterThan(floatA, floatB)
-
- if (/* maxAge != interval */ islessgreater(self->_maxAge, interval)) {
- __auto_type oldMaxAge = self->_maxAge;
- __auto_type newMaxAge = interval;
-
- self->_maxAge = interval;
-
- // There are several cases we need to handle here.
- //
- // 1. If the maxAge was previously enabled and it just got disabled,
- // then we need to stop the deleteTimer. (And we might as well release it.)
- //
- // 2. If the maxAge was previously disabled and it just got enabled,
- // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.)
- //
- // 3. If the maxAge was increased,
- // then we don't need to do anything.
- //
- // 4. If the maxAge was decreased,
- // then we should do an immediate delete.
-
- __auto_type shouldDeleteNow = NO;
-
- if (oldMaxAge > 0.0) {
- if (newMaxAge <= 0.0) {
- // Handles #1
-
- [self destroyDeleteTimer];
- } else if (oldMaxAge > newMaxAge) {
- // Handles #4
- shouldDeleteNow = YES;
- }
- } else if (newMaxAge > 0.0) {
- // Handles #2
- shouldDeleteNow = YES;
- }
-
- if (shouldDeleteNow) {
- [self performDelete];
-
- if (self->_deleteTimer) {
- [self updateDeleteTimer];
- } else {
- [self createAndStartDeleteTimer];
- }
- }
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (NSTimeInterval)deleteInterval {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block NSTimeInterval result;
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_deleteInterval;
- });
- });
-
- return result;
-}
-
-- (void)setDeleteInterval:(NSTimeInterval)interval {
- __auto_type block = ^{
- @autoreleasepool {
- // C99 recommended floating point comparison macro
- // Read: isLessThanOrGreaterThan(floatA, floatB)
-
- if (/* deleteInterval != interval */ islessgreater(self->_deleteInterval, interval)) {
- self->_deleteInterval = interval;
-
- // There are several cases we need to handle here.
- //
- // 1. If the deleteInterval was previously enabled and it just got disabled,
- // then we need to stop the deleteTimer. (And we might as well release it.)
- //
- // 2. If the deleteInterval was previously disabled and it just got enabled,
- // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.)
- //
- // 3. If the deleteInterval increased, then we need to reset the timer so that it fires at the later date.
- //
- // 4. If the deleteInterval decreased, then we need to reset the timer so that it fires at an earlier date.
- // (Plus we might need to do an immediate delete.)
-
- if (self->_deleteInterval > 0.0) {
- if (self->_deleteTimer == NULL) {
- // Handles #2
- //
- // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate,
- // if a delete is needed the timer will fire immediately.
-
- [self createAndStartDeleteTimer];
- } else {
- // Handles #3
- // Handles #4
- //
- // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate,
- // if a save is needed the timer will fire immediately.
-
- [self updateDeleteTimer];
- }
- } else if (self->_deleteTimer) {
- // Handles #1
-
- [self destroyDeleteTimer];
- }
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
-
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (BOOL)deleteOnEverySave {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block BOOL result;
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_deleteOnEverySave;
- });
- });
-
- return result;
-}
-
-- (void)setDeleteOnEverySave:(BOOL)flag {
- __auto_type block = ^{
- self->_deleteOnEverySave = flag;
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Public API
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)savePendingLogEntries {
- __auto_type block = ^{
- @autoreleasepool {
- [self performSaveAndSuspendSaveTimer];
- }
- };
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- dispatch_async(self.loggerQueue, block);
- }
-}
-
-- (void)deleteOldLogEntries {
- __auto_type block = ^{
- @autoreleasepool {
- [self performDelete];
- }
- };
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- dispatch_async(self.loggerQueue, block);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark DDLogger
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)didAddLogger {
- // If you override me be sure to invoke [super didAddLogger];
- [self createSuspendedSaveTimer];
- [self createAndStartDeleteTimer];
-}
-
-- (void)willRemoveLogger {
- // If you override me be sure to invoke [super willRemoveLogger];
- [self performSaveAndSuspendSaveTimer];
- [self destroySaveTimer];
- [self destroyDeleteTimer];
-}
-
-- (void)logMessage:(DDLogMessage *)logMessage {
- if ([self db_log:logMessage]) {
- __auto_type firstUnsavedEntry = (++_unsavedCount == 1);
-
- if ((_unsavedCount >= _saveThreshold) && (_saveThreshold > 0)) {
- [self performSaveAndSuspendSaveTimer];
- } else if (firstUnsavedEntry) {
- _unsavedTime = dispatch_time(DISPATCH_TIME_NOW, 0);
- [self updateAndResumeSaveTimer];
- }
- }
-}
-
-- (void)flush {
- // This method is invoked by DDLog's flushLog method.
- //
- // It is called automatically when the application quits,
- // or if the developer invokes DDLog's flushLog method prior to crashing or something.
- [self performSaveAndSuspendSaveTimer];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger+Internal.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger+Internal.h
deleted file mode 100644
index 0ca06094..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger+Internal.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDFileLogger.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface DDFileLogger (Internal)
-
-- (void)logData:(NSData *)data;
-
-// Will assert if used outside logger's queue.
-- (void)lt_logData:(NSData *)data;
-
-- (nullable NSData *)lt_dataForMessage:(DDLogMessage *)message;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger.m
deleted file mode 100644
index 5caee8ca..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDFileLogger.m
+++ /dev/null
@@ -1,1865 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <sys/xattr.h>
-#import <sys/file.h>
-#import <errno.h>
-#import <unistd.h>
-
-#import "DDFileLogger+Internal.h"
-
-// We probably shouldn't be using DDLog() statements within the DDLog implementation.
-// But we still want to leave our log statements for any future debugging,
-// and to allow other developers to trace the implementation (which is a great learning tool).
-//
-// So we use primitive logging macros around NSLog.
-// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
-
-#ifndef DD_NSLOG_LEVEL
- #define DD_NSLOG_LEVEL 2
-#endif
-
-#define NSLogError(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogWarn(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogInfo(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogDebug(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogVerbose(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 5) NSLog((frmt), ##__VA_ARGS__); } while(0)
-
-
-#if TARGET_OS_IPHONE
-BOOL doesAppRunInBackground(void);
-#endif
-
-unsigned long long const kDDDefaultLogMaxFileSize = 1024 * 1024; // 1 MB
-NSTimeInterval const kDDDefaultLogRollingFrequency = 60 * 60 * 24; // 24 Hours
-NSUInteger const kDDDefaultLogMaxNumLogFiles = 5; // 5 Files
-unsigned long long const kDDDefaultLogFilesDiskQuota = 20 * 1024 * 1024; // 20 MB
-
-NSTimeInterval const kDDRollingLeeway = 1.0; // 1s
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@implementation DDFileLogPlainTextMessageSerializer
-
-- (instancetype)init {
- return [super init];
-}
-
-- (NSData *)dataForString:(NSString *)string originatingFromMessage:(DDLogMessage *)message {
- return [string dataUsingEncoding:NSUTF8StringEncoding] ?: [NSData data];
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDLogFileManagerDefault () {
- NSDateFormatter *_fileDateFormatter;
- NSUInteger _maximumNumberOfLogFiles;
- unsigned long long _logFilesDiskQuota;
- NSString *_logsDirectory;
- BOOL _wasAddedToLogger;
-#if TARGET_OS_IPHONE
- NSFileProtectionType _defaultFileProtectionLevel;
-#endif
-}
-
-@end
-
-@implementation DDLogFileManagerDefault
-
-@synthesize maximumNumberOfLogFiles = _maximumNumberOfLogFiles;
-@synthesize logFilesDiskQuota = _logFilesDiskQuota;
-@synthesize logMessageSerializer = _logMessageSerializer;
-
-- (instancetype)initWithLogsDirectory:(nullable NSString *)aLogsDirectory {
- if ((self = [super init])) {
- _maximumNumberOfLogFiles = kDDDefaultLogMaxNumLogFiles;
- _logFilesDiskQuota = kDDDefaultLogFilesDiskQuota;
- _wasAddedToLogger = NO;
-
- _fileDateFormatter = [[NSDateFormatter alloc] init];
- [_fileDateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
- [_fileDateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
- [_fileDateFormatter setDateFormat: @"yyyy'-'MM'-'dd'--'HH'-'mm'-'ss'-'SSS'"];
-
- if (aLogsDirectory.length > 0) {
- _logsDirectory = [aLogsDirectory copy];
- } else {
- _logsDirectory = [[self defaultLogsDirectory] copy];
- }
-
- _logMessageSerializer = [[DDFileLogPlainTextMessageSerializer alloc] init];
-
- NSLogVerbose(@"DDFileLogManagerDefault: logsDirectory:\n%@", [self logsDirectory]);
- NSLogVerbose(@"DDFileLogManagerDefault: sortedLogFileNames:\n%@", [self sortedLogFileNames]);
- }
-
- return self;
-}
-
-#if TARGET_OS_IPHONE
-- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory
- defaultFileProtectionLevel:(NSFileProtectionType)fileProtectionLevel {
-
- if ((self = [self initWithLogsDirectory:logsDirectory])) {
- if ([fileProtectionLevel isEqualToString:NSFileProtectionNone] ||
- [fileProtectionLevel isEqualToString:NSFileProtectionComplete] ||
- [fileProtectionLevel isEqualToString:NSFileProtectionCompleteUnlessOpen] ||
- [fileProtectionLevel isEqualToString:NSFileProtectionCompleteUntilFirstUserAuthentication]) {
- _defaultFileProtectionLevel = fileProtectionLevel;
- }
- }
-
- return self;
-}
-#endif
-
-- (instancetype)init {
- return [self initWithLogsDirectory:nil];
-}
-
-- (void)didAddToFileLogger:(DDFileLogger *)fileLogger {
- _wasAddedToLogger = YES;
-}
-
-- (void)deleteOldFilesForConfigurationChange {
- if (!_wasAddedToLogger) return;
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- @autoreleasepool {
- // See method header for queue reasoning.
- [self deleteOldLogFilesWithError:nil];
- }
- });
-}
-
-- (void)setLogFilesDiskQuota:(unsigned long long)logFilesDiskQuota {
- if (_logFilesDiskQuota != logFilesDiskQuota) {
- _logFilesDiskQuota = logFilesDiskQuota;
- NSLogInfo(@"DDFileLogManagerDefault: Responding to configuration change: logFilesDiskQuota");
- [self deleteOldFilesForConfigurationChange];
- }
-}
-
-- (void)setMaximumNumberOfLogFiles:(NSUInteger)maximumNumberOfLogFiles {
- if (_maximumNumberOfLogFiles != maximumNumberOfLogFiles) {
- _maximumNumberOfLogFiles = maximumNumberOfLogFiles;
- NSLogInfo(@"DDFileLogManagerDefault: Responding to configuration change: maximumNumberOfLogFiles");
- [self deleteOldFilesForConfigurationChange];
- }
-}
-
-#if TARGET_OS_IPHONE
-- (NSFileProtectionType)logFileProtection {
- if (_defaultFileProtectionLevel.length > 0) {
- return _defaultFileProtectionLevel;
- } else if (doesAppRunInBackground()) {
- return NSFileProtectionCompleteUntilFirstUserAuthentication;
- } else {
- return NSFileProtectionCompleteUnlessOpen;
- }
-}
-#endif
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark File Deleting
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Deletes archived log files that exceed the maximumNumberOfLogFiles or logFilesDiskQuota configuration values.
- * Method may take a while to execute since we're performing IO. It's not critical that this is synchronized with
- * log output, since the files we're deleting are all archived and not in use, therefore this method is called on a
- * background queue.
- **/
-- (BOOL)deleteOldLogFilesWithError:(NSError *__autoreleasing _Nullable *)error {
- NSLogVerbose(@"DDLogFileManagerDefault: %@", NSStringFromSelector(_cmd));
-
- if (error) *error = nil;
-
- __auto_type sortedLogFileInfos = [self sortedLogFileInfos];
- NSUInteger firstIndexToDelete = NSNotFound;
-
- const unsigned long long diskQuota = self.logFilesDiskQuota;
- const NSUInteger maxNumLogFiles = self.maximumNumberOfLogFiles;
-
- if (diskQuota) {
- unsigned long long used = 0;
-
- for (NSUInteger i = 0; i < sortedLogFileInfos.count; i++) {
- DDLogFileInfo *info = sortedLogFileInfos[i];
- used += info.fileSize;
-
- if (used > diskQuota) {
- firstIndexToDelete = i;
- break;
- }
- }
- }
-
- if (maxNumLogFiles) {
- if (firstIndexToDelete == NSNotFound) {
- firstIndexToDelete = maxNumLogFiles;
- } else {
- firstIndexToDelete = MIN(firstIndexToDelete, maxNumLogFiles);
- }
- }
-
- if (firstIndexToDelete == 0) {
- // Do we consider the first file?
- // We are only supposed to be deleting archived files.
- // In most cases, the first file is likely the log file that is currently being written to.
- // So in most cases, we do not want to consider this file for deletion.
-
- if (sortedLogFileInfos.count > 0) {
- if (!sortedLogFileInfos[0].isArchived) {
- // Don't delete active file.
- firstIndexToDelete++;
- }
- }
- }
-
- if (firstIndexToDelete != NSNotFound) {
- // removing all log files starting with firstIndexToDelete
- for (NSUInteger i = firstIndexToDelete; i < sortedLogFileInfos.count; i++) {
- __auto_type logFileInfo = sortedLogFileInfos[i];
-
- __autoreleasing NSError *deletionError = nil;
- __auto_type success = [[NSFileManager defaultManager] removeItemAtPath:logFileInfo.filePath error:&deletionError];
- if (success) {
- NSLogInfo(@"DDLogFileManagerDefault: Deleting file: %@", logFileInfo.fileName);
- } else {
- NSLogError(@"DDLogFileManagerDefault: Error deleting file %@", deletionError);
- if (error) {
- *error = deletionError;
- return NO; // If we were given an error, stop after the first failure!
- }
- }
- }
- }
-
- return YES;
-}
-
-- (BOOL)cleanupLogFilesWithError:(NSError *__autoreleasing _Nullable *)error {
- return [self deleteOldLogFilesWithError:error];
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Log Files
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Returns the path to the default logs directory.
- * If the logs directory doesn't exist, this method automatically creates it.
- **/
-- (NSString *)defaultLogsDirectory {
-#if TARGET_OS_IPHONE
- __auto_type paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- __auto_type baseDir = paths.firstObject;
- __auto_type logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];
-#else
- __auto_type appName = [[NSProcessInfo processInfo] processName];
- __auto_type paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
- __auto_type basePath = ([paths count] > 0) ? paths[0] : NSTemporaryDirectory();
- __auto_type logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];
-#endif
-
- return logsDirectory;
-}
-
-- (NSString *)logsDirectory {
- // We could do this check once, during initialization, and not bother again.
- // But this way the code continues to work if the directory gets deleted while the code is running.
-
- NSAssert(_logsDirectory.length > 0, @"Directory must be set.");
-
- __autoreleasing NSError *error = nil;
- __auto_type success = [[NSFileManager defaultManager] createDirectoryAtPath:_logsDirectory
- withIntermediateDirectories:YES
- attributes:nil
- error:&error];
- if (!success) {
- NSLogError(@"DDFileLogManagerDefault: Error creating logsDirectory: %@", error);
- }
-
- return _logsDirectory;
-}
-
-- (BOOL)isLogFile:(NSString *)fileName {
- __auto_type appName = [self applicationName];
-
- // We need to add a space to the name as otherwise we could match applications that have the name prefix.
- return [fileName hasPrefix:[appName stringByAppendingString:@" "]] && [fileName hasSuffix:@".log"];
-}
-
-// if you change formatter, then change sortedLogFileInfos method also accordingly
-- (NSDateFormatter *)logFileDateFormatter {
- return _fileDateFormatter;
-}
-
-- (NSArray *)unsortedLogFilePaths {
- __auto_type logsDirectory = [self logsDirectory];
-
- __autoreleasing NSError *error = nil;
- __auto_type fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:logsDirectory error:&error];
- if (!fileNames && error) {
- NSLogError(@"DDFileLogManagerDefault: Error listing log file directory: %@", error);
- return [[NSArray alloc] init];
- }
-
- __auto_type unsortedLogFilePaths = [NSMutableArray arrayWithCapacity:[fileNames count]];
-
- for (NSString *fileName in fileNames) {
- // Filter out any files that aren't log files. (Just for extra safety)
-#if TARGET_IPHONE_SIMULATOR
- // This is only used on the iPhone simulator for backward compatibility reason.
- //
- // In case of iPhone simulator there can be 'archived' extension. isLogFile:
- // method knows nothing about it. Thus removing it for this method.
- __auto_type theFileName = [fileName stringByReplacingOccurrencesOfString:@".archived"
- withString:@""];
-
- if ([self isLogFile:theFileName])
-#else
- if ([self isLogFile:fileName])
-#endif
- {
- __auto_type filePath = [logsDirectory stringByAppendingPathComponent:fileName];
- [unsortedLogFilePaths addObject:filePath];
- }
- }
-
- return unsortedLogFilePaths;
-}
-
-- (NSArray *)unsortedLogFileNames {
- __auto_type unsortedLogFilePaths = [self unsortedLogFilePaths];
- __auto_type unsortedLogFileNames = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]];
-
- for (NSString *filePath in unsortedLogFilePaths) {
- [unsortedLogFileNames addObject:[filePath lastPathComponent]];
- }
-
- return unsortedLogFileNames;
-}
-
-- (NSArray *)unsortedLogFileInfos {
- __auto_type unsortedLogFilePaths = [self unsortedLogFilePaths];
- __auto_type unsortedLogFileInfos = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]];
-
- for (NSString *filePath in unsortedLogFilePaths) {
- __auto_type logFileInfo = [[DDLogFileInfo alloc] initWithFilePath:filePath];
- [unsortedLogFileInfos addObject:logFileInfo];
- }
-
- return unsortedLogFileInfos;
-}
-
-- (NSArray *)sortedLogFilePaths {
- __auto_type sortedLogFileInfos = [self sortedLogFileInfos];
- __auto_type sortedLogFilePaths = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]];
-
- for (DDLogFileInfo *logFileInfo in sortedLogFileInfos) {
- [sortedLogFilePaths addObject:[logFileInfo filePath]];
- }
-
- return sortedLogFilePaths;
-}
-
-- (NSArray *)sortedLogFileNames {
- __auto_type sortedLogFileInfos = [self sortedLogFileInfos];
- __auto_type sortedLogFileNames = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]];
-
- for (DDLogFileInfo *logFileInfo in sortedLogFileInfos) {
- [sortedLogFileNames addObject:[logFileInfo fileName]];
- }
-
- return sortedLogFileNames;
-}
-
-- (NSArray *)sortedLogFileInfos {
- return [[self unsortedLogFileInfos] sortedArrayUsingComparator:^NSComparisonResult(DDLogFileInfo *obj1,
- DDLogFileInfo *obj2) {
- NSDate *date1 = [NSDate date];
- NSDate *date2 = [NSDate date];
-
- __auto_type arrayComponent = [[obj1 fileName] componentsSeparatedByString:@" "];
- if (arrayComponent.count > 0) {
- NSString *stringDate = arrayComponent.lastObject;
- stringDate = [stringDate stringByReplacingOccurrencesOfString:@".log" withString:@""];
-#if TARGET_IPHONE_SIMULATOR
- // This is only used on the iPhone simulator for backward compatibility reason.
- stringDate = [stringDate stringByReplacingOccurrencesOfString:@".archived" withString:@""];
-#endif
- date1 = [[self logFileDateFormatter] dateFromString:stringDate] ?: [obj1 creationDate];
- }
-
- arrayComponent = [[obj2 fileName] componentsSeparatedByString:@" "];
- if (arrayComponent.count > 0) {
- NSString *stringDate = arrayComponent.lastObject;
- stringDate = [stringDate stringByReplacingOccurrencesOfString:@".log" withString:@""];
-#if TARGET_IPHONE_SIMULATOR
- // This is only used on the iPhone simulator for backward compatibility reason.
- stringDate = [stringDate stringByReplacingOccurrencesOfString:@".archived" withString:@""];
-#endif
- date2 = [[self logFileDateFormatter] dateFromString:stringDate] ?: [obj2 creationDate];
- }
-
- return [date2 compare:date1 ?: [NSDate date]];
- }];
-
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Creation
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-// If you change newLogFileName, then change `isLogFile:` method also accordingly.
-- (NSString *)newLogFileName {
- __auto_type appName = [self applicationName];
- __auto_type dateFormatter = [self logFileDateFormatter];
- __auto_type formattedDate = [dateFormatter stringFromDate:[NSDate date]];
-
- return [NSString stringWithFormat:@"%@ %@.log", appName, formattedDate];
-}
-
-- (nullable NSString *)logFileHeader {
- return nil;
-}
-
-- (NSData *)logFileHeaderData {
- NSString *fileHeaderStr = [self logFileHeader];
-
- if (fileHeaderStr.length == 0) {
- return nil;
- }
-
- if (![fileHeaderStr hasSuffix:@"\n"]) {
- fileHeaderStr = [fileHeaderStr stringByAppendingString:@"\n"];
- }
-
- return [_logMessageSerializer dataForString:fileHeaderStr originatingFromMessage:nil];
-}
-
-- (NSString *)createNewLogFileWithError:(NSError *__autoreleasing _Nullable *)error {
- static NSUInteger MAX_ALLOWED_ERROR = 5;
-
- __auto_type fileName = [self newLogFileName];
- __auto_type logsDirectory = [self logsDirectory];
- __auto_type fileHeader = [self logFileHeaderData] ?: [NSData data];
-
- NSString *baseName = nil;
- NSString *extension;
- NSUInteger attempt = 1;
- NSUInteger criticalErrors = 0;
- NSError *lastCriticalError;
-
- if (error) *error = nil;
- do {
- if (criticalErrors >= MAX_ALLOWED_ERROR) {
- NSLogError(@"DDLogFileManagerDefault: Bailing file creation, encountered %ld errors.",
- (unsigned long)criticalErrors);
- if (error) *error = lastCriticalError;
- return nil;
- }
-
- NSString *actualFileName;
- if (attempt > 1) {
- if (baseName == nil) {
- baseName = [fileName stringByDeletingPathExtension];
- extension = [fileName pathExtension];
- }
-
- actualFileName = [baseName stringByAppendingFormat:@" %lu", (unsigned long)attempt];
- if (extension.length) {
- actualFileName = [actualFileName stringByAppendingPathExtension:extension];
- }
- } else {
- actualFileName = fileName;
- }
-
- __auto_type filePath = [logsDirectory stringByAppendingPathComponent:actualFileName];
-
- __autoreleasing NSError *currentError = nil;
- __auto_type success = [fileHeader writeToFile:filePath options:NSDataWritingAtomic error:&currentError];
-
-#if TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST
- if (success) {
- // When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
- //
- // But in case if app is able to launch from background we need to have an ability to open log file any time we
- // want (even if device is locked). Thats why that attribute have to be changed to
- // NSFileProtectionCompleteUntilFirstUserAuthentication.
- NSDictionary *attributes = @{NSFileProtectionKey: [self logFileProtection]};
- success = [[NSFileManager defaultManager] setAttributes:attributes
- ofItemAtPath:filePath
- error:&currentError];
- }
-#endif
-
- if (success) {
- NSLogVerbose(@"DDLogFileManagerDefault: Created new log file: %@", actualFileName);
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- // Since we just created a new log file, we may need to delete some old log files
- // Note that we don't on errors here! The new log file was created, so this method technically succeeded!
- [self deleteOldLogFilesWithError:nil];
- });
- return filePath;
- } else if (currentError.code == NSFileWriteFileExistsError) {
- attempt++;
- } else {
- NSLogError(@"DDLogFileManagerDefault: Critical error while creating log file: %@", currentError);
- criticalErrors++;
- lastCriticalError = currentError;
- }
- } while (YES);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Utility
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (NSString *)applicationName {
- static NSString *_appName;
- static dispatch_once_t onceToken;
-
- dispatch_once(&onceToken, ^{
- _appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"];
-
- if (_appName.length == 0) {
- _appName = [[NSProcessInfo processInfo] processName];
- }
-
- if (_appName.length == 0) {
- _appName = @"";
- }
- });
-
- return _appName;
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDLogFileFormatterDefault () {
- NSDateFormatter *_dateFormatter;
-}
-
-@end
-
-@implementation DDLogFileFormatterDefault
-
-- (instancetype)init {
- return [self initWithDateFormatter:nil];
-}
-
-- (instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter {
- if ((self = [super init])) {
- if (aDateFormatter) {
- _dateFormatter = aDateFormatter;
- } else {
- _dateFormatter = [[NSDateFormatter alloc] init];
- [_dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; // 10.4+ style
- [_dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
- [_dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
- [_dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
- }
- }
-
- return self;
-}
-
-- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
- __auto_type dateAndTime = [_dateFormatter stringFromDate:logMessage->_timestamp];
- // Note: There are two spaces between the date and the message.
- return [NSString stringWithFormat:@"%@ %@", dateAndTime, logMessage->_message];
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDFileLogger () {
- id <DDLogFileManager> _logFileManager;
-
- DDLogFileInfo *_currentLogFileInfo;
- NSFileHandle *_currentLogFileHandle;
-
- dispatch_source_t _currentLogFileVnode;
-
- NSTimeInterval _rollingFrequency;
- dispatch_source_t _rollingTimer;
-
- unsigned long long _maximumFileSize;
-
- dispatch_queue_t _completionQueue;
-}
-
-@end
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincomplete-implementation"
-@implementation DDFileLogger
-#pragma clang diagnostic pop
-
-- (instancetype)init {
- return [self initWithLogFileManager:[[DDLogFileManagerDefault alloc] init]
- completionQueue:nil];
-}
-
-- (instancetype)initWithLogFileManager:(id<DDLogFileManager>)logFileManager {
- return [self initWithLogFileManager:logFileManager completionQueue:nil];
-}
-
-- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)aLogFileManager
- completionQueue:(nullable dispatch_queue_t)dispatchQueue {
- if ((self = [super init])) {
- _completionQueue = dispatchQueue ?: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
- _maximumFileSize = kDDDefaultLogMaxFileSize;
- _rollingFrequency = kDDDefaultLogRollingFrequency;
- _automaticallyAppendNewlineForCustomFormatters = YES;
-
- _logFileManager = aLogFileManager;
- _logFormatter = [DDLogFileFormatterDefault new];
-
- if ([_logFileManager respondsToSelector:@selector(didAddToFileLogger:)]) {
- [_logFileManager didAddToFileLogger:self];
- }
- }
-
- return self;
-}
-
-- (void)lt_cleanup {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (_currentLogFileHandle != nil) {
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [_currentLogFileHandle synchronizeAndReturnError:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", error);
- }
- success = [_currentLogFileHandle closeAndReturnError:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to close file: %@", error);
- }
- } else {
- @try {
- [_currentLogFileHandle synchronizeFile];
- }
- @catch (NSException *exception) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", exception);
- }
- [_currentLogFileHandle closeFile];
- }
- _currentLogFileHandle = nil;
- }
-
- if (_currentLogFileVnode) {
- dispatch_source_cancel(_currentLogFileVnode);
- _currentLogFileVnode = NULL;
- }
-
- if (_rollingTimer) {
- dispatch_source_cancel(_rollingTimer);
- _rollingTimer = NULL;
- }
-}
-
-- (void)dealloc {
- if (self.isOnInternalLoggerQueue) {
- [self lt_cleanup];
- } else {
- dispatch_sync(self.loggerQueue, ^{
- [self lt_cleanup];
- });
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Properties
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (unsigned long long)maximumFileSize {
- __block unsigned long long result;
-
- __auto_type block = ^{
- result = self->_maximumFileSize;
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the maximumFileSize variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, block);
- });
-
- return result;
-}
-
-- (void)setMaximumFileSize:(unsigned long long)newMaximumFileSize {
- __auto_type block = ^{
- @autoreleasepool {
- self->_maximumFileSize = newMaximumFileSize;
- if (self->_currentLogFileHandle != nil) {
- [self lt_maybeRollLogFileDueToSize];
- }
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the maximumFileSize variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
-}
-
-- (NSTimeInterval)rollingFrequency {
- __block NSTimeInterval result;
-
- __auto_type block = ^{
- result = self->_rollingFrequency;
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation should access the rollingFrequency variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, block);
- });
-
- return result;
-}
-
-- (void)setRollingFrequency:(NSTimeInterval)newRollingFrequency {
- __auto_type block = ^{
- @autoreleasepool {
- self->_rollingFrequency = newRollingFrequency;
- if (self->_currentLogFileHandle != nil) {
- [self lt_maybeRollLogFileDueToAge];
- }
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation should access the rollingFrequency variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark File Rolling
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)lt_scheduleTimerToRollLogFileDueToAge {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (_rollingTimer) {
- dispatch_source_cancel(_rollingTimer);
- _rollingTimer = NULL;
- }
-
- if (_currentLogFileInfo == nil || _rollingFrequency <= 0.0) {
- return;
- }
-
- __auto_type logFileCreationDate = [_currentLogFileInfo creationDate];
- __auto_type frequency = MIN(_rollingFrequency, DBL_MAX - [logFileCreationDate timeIntervalSinceReferenceDate]);
- __auto_type logFileRollingDate = [logFileCreationDate dateByAddingTimeInterval:frequency];
-
- NSLogVerbose(@"DDFileLogger: scheduleTimerToRollLogFileDueToAge");
- NSLogVerbose(@"DDFileLogger: logFileCreationDate : %@", logFileCreationDate);
- NSLogVerbose(@"DDFileLogger: actual rollingFrequency: %f", frequency);
- NSLogVerbose(@"DDFileLogger: logFileRollingDate : %@", logFileRollingDate);
-
- _rollingTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _loggerQueue);
-
- __weak __auto_type weakSelf = self;
- dispatch_source_set_event_handler(_rollingTimer, ^{ @autoreleasepool {
- [weakSelf lt_maybeRollLogFileDueToAge];
- } });
-
-#if !OS_OBJECT_USE_OBJC
- dispatch_source_t theRollingTimer = _rollingTimer;
- dispatch_source_set_cancel_handler(_rollingTimer, ^{
- dispatch_release(theRollingTimer);
- });
-#endif
-
- static NSTimeInterval const kDDMaxTimerDelay = LLONG_MAX / NSEC_PER_SEC;
- __auto_type delay = (int64_t)(MIN([logFileRollingDate timeIntervalSinceNow], kDDMaxTimerDelay) * (NSTimeInterval)NSEC_PER_SEC);
- __auto_type fireTime = dispatch_walltime(NULL, delay); // `NULL` uses `gettimeofday` internally
-
- dispatch_source_set_timer(_rollingTimer, fireTime, DISPATCH_TIME_FOREVER, (uint64_t)kDDRollingLeeway * NSEC_PER_SEC);
- dispatch_activate(_rollingTimer);
-}
-
-- (void)rollLogFile {
- [self rollLogFileWithCompletionBlock:nil];
-}
-
-- (void)rollLogFileWithCompletionBlock:(nullable void (^)(void))completionBlock {
- // This method is public.
- // We need to execute the rolling on our logging thread/queue.
-
- __auto_type block = ^{
- @autoreleasepool {
- [self lt_rollLogFileNow];
-
- if (completionBlock) {
- dispatch_async(self->_completionQueue, ^{
- completionBlock();
- });
- }
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)lt_rollLogFileNow {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
- NSLogVerbose(@"DDFileLogger: %@", NSStringFromSelector(_cmd));
-
- if (_currentLogFileHandle == nil) {
- return;
- }
-
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [_currentLogFileHandle synchronizeAndReturnError:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", error);
- }
- success = [_currentLogFileHandle closeAndReturnError:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to close file: %@", error);
- }
- } else {
- @try {
- [_currentLogFileHandle synchronizeFile];
- }
- @catch (NSException *exception) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", exception);
- }
- [_currentLogFileHandle closeFile];
- }
- _currentLogFileHandle = nil;
-
- _currentLogFileInfo.isArchived = YES;
-
- const __auto_type logFileManagerRespondsToNewArchiveSelector = [_logFileManager respondsToSelector:@selector(didArchiveLogFile:wasRolled:)];
- const __auto_type logFileManagerRespondsToSelector = (logFileManagerRespondsToNewArchiveSelector
- || [_logFileManager respondsToSelector:@selector(didRollAndArchiveLogFile:)]);
- NSString *archivedFilePath = (logFileManagerRespondsToSelector) ? [_currentLogFileInfo.filePath copy] : nil;
- _currentLogFileInfo = nil;
-
- if (logFileManagerRespondsToSelector) {
- dispatch_block_t block;
- if (logFileManagerRespondsToNewArchiveSelector) {
- block = ^{
- [self->_logFileManager didArchiveLogFile:archivedFilePath wasRolled:YES];
- };
- } else {
- block = ^{
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self->_logFileManager didRollAndArchiveLogFile:archivedFilePath];
-#pragma clang diagnostic pop
- };
- }
- dispatch_async(_completionQueue, block);
- }
-
- if (_currentLogFileVnode) {
- dispatch_source_cancel(_currentLogFileVnode);
- _currentLogFileVnode = nil;
- }
-
- if (_rollingTimer) {
- dispatch_source_cancel(_rollingTimer);
- _rollingTimer = nil;
- }
-}
-
-- (void)lt_maybeRollLogFileDueToAge {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (_rollingFrequency > 0.0 && (_currentLogFileInfo.age + kDDRollingLeeway) >= _rollingFrequency) {
- NSLogVerbose(@"DDFileLogger: Rolling log file due to age...");
- [self lt_rollLogFileNow];
- } else {
- [self lt_scheduleTimerToRollLogFileDueToAge];
- }
-}
-
-- (void)lt_maybeRollLogFileDueToSize {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- // This method is called from logMessage.
- // Keep it FAST.
-
- // Note: Use direct access to maximumFileSize variable.
- // We specifically wrote our own getter/setter method to allow us to do this (for performance reasons).
-
- if (_currentLogFileHandle != nil && _maximumFileSize > 0) {
- unsigned long long fileSize;
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [_currentLogFileHandle getOffset:&fileSize error:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to get offset: %@", error);
- return;
- }
- } else {
- fileSize = [_currentLogFileHandle offsetInFile];
- }
-
- if (fileSize >= _maximumFileSize) {
- NSLogVerbose(@"DDFileLogger: Rolling log file due to size (%qu)...", fileSize);
-
- [self lt_rollLogFileNow];
- }
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark File Logging
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (BOOL)lt_shouldLogFileBeArchived:(DDLogFileInfo *)mostRecentLogFileInfo {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if ([self shouldArchiveRecentLogFileInfo:mostRecentLogFileInfo]) {
- return YES;
- } else if (_maximumFileSize > 0 && mostRecentLogFileInfo.fileSize >= _maximumFileSize) {
- return YES;
- } else if (_rollingFrequency > 0.0 && mostRecentLogFileInfo.age >= _rollingFrequency) {
- return YES;
- }
-
-#if TARGET_OS_IPHONE
- // When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
- //
- // But in case if app is able to launch from background we need to have an ability to open log file any time we
- // want (even if device is locked). Thats why that attribute have to be changed to
- // NSFileProtectionCompleteUntilFirstUserAuthentication.
- //
- // If previous log was created when app wasn't running in background, but now it is - we archive it and create
- // a new one.
- //
- // If user has overwritten to NSFileProtectionNone there is no need to create a new one.
- if (doesAppRunInBackground()) {
- NSFileProtectionType key = mostRecentLogFileInfo.fileAttributes[NSFileProtectionKey];
- __auto_type isUntilFirstAuth = [key isEqualToString:NSFileProtectionCompleteUntilFirstUserAuthentication];
- __auto_type isNone = [key isEqualToString:NSFileProtectionNone];
-
- if (key != nil && !isUntilFirstAuth && !isNone) {
- return YES;
- }
- }
-#endif
-
- return NO;
-}
-
-/**
- * Returns the log file that should be used.
- * If there is an existing log file that is suitable, within the
- * constraints of maximumFileSize and rollingFrequency, then it is returned.
- *
- * Otherwise a new file is created and returned.
- **/
-- (DDLogFileInfo *)currentLogFileInfo {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
- // Do not access this method on any Lumberjack queue, will deadlock.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block DDLogFileInfo *info = nil;
- __auto_type block = ^{
- info = [self lt_currentLogFileInfo];
- };
-
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self->_loggerQueue, block);
- });
-
- return info;
-}
-
-- (DDLogFileInfo *)lt_currentLogFileInfo {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- // Get the current log file info ivar (might be nil).
- __auto_type newCurrentLogFile = _currentLogFileInfo;
-
- // Check if we're resuming and if so, get the first of the sorted log file infos.
- __auto_type isResuming = newCurrentLogFile == nil;
- if (isResuming) {
- NSArray *sortedLogFileInfos = [_logFileManager sortedLogFileInfos];
- newCurrentLogFile = sortedLogFileInfos.firstObject;
- }
-
- // Check if the file we've found is still valid. Otherwise create a new one.
- if (newCurrentLogFile != nil && [self lt_shouldUseLogFile:newCurrentLogFile isResuming:isResuming]) {
- if (isResuming) {
- NSLogVerbose(@"DDFileLogger: Resuming logging with file %@", newCurrentLogFile.fileName);
- }
- _currentLogFileInfo = newCurrentLogFile;
- } else {
- NSString *currentLogFilePath;
- if ([_logFileManager respondsToSelector:@selector(createNewLogFileWithError:)]) {
- __autoreleasing NSError *error; // Don't initialize error to nil since it will be done in -createNewLogFileWithError:
- currentLogFilePath = [_logFileManager createNewLogFileWithError:&error];
- if (!currentLogFilePath) {
- NSLogError(@"DDFileLogger: Failed to create new log file: %@", error);
- }
- } else {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- NSAssert([_logFileManager respondsToSelector:@selector(createNewLogFile)],
- @"Invalid log file manager! Responds neither to `-createNewLogFileWithError:` nor `-createNewLogFile`!");
- currentLogFilePath = [_logFileManager createNewLogFile];
-#pragma clang diagnostic pop
- if (!currentLogFilePath) {
- NSLogError(@"DDFileLogger: Failed to create new log file");
- }
- }
- // Use static factory method here, since it checks for nil (and is unavailable to Swift).
- _currentLogFileInfo = [DDLogFileInfo logFileWithPath:currentLogFilePath];
- }
-
- return _currentLogFileInfo;
-}
-
-- (BOOL)lt_shouldUseLogFile:(nonnull DDLogFileInfo *)logFileInfo isResuming:(BOOL)isResuming {
- NSParameterAssert(logFileInfo);
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- // Check if the log file is archived. We must not use archived log files.
- if (logFileInfo.isArchived) {
- return NO;
- }
-
- // Don't follow symlink
- if (logFileInfo.isSymlink) {
- return NO;
- }
-
- // If we're resuming, we need to check if the log file is allowed for reuse or needs to be archived.
- if (isResuming && (_doNotReuseLogFiles || [self lt_shouldLogFileBeArchived:logFileInfo])) {
- logFileInfo.isArchived = YES;
-
- const __auto_type logFileManagerRespondsToNewArchiveSelector = [_logFileManager respondsToSelector:@selector(didArchiveLogFile:wasRolled:)];
- if (logFileManagerRespondsToNewArchiveSelector || [_logFileManager respondsToSelector:@selector(didArchiveLogFile:)]) {
- NSString *archivedFilePath = [logFileInfo.filePath copy];
- dispatch_block_t block;
- if (logFileManagerRespondsToNewArchiveSelector) {
- block = ^{
- [self->_logFileManager didArchiveLogFile:archivedFilePath wasRolled:NO];
- };
- } else {
- block = ^{
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self->_logFileManager didArchiveLogFile:archivedFilePath];
-#pragma clang diagnostic pop
- };
- }
- dispatch_async(_completionQueue, block);
- }
-
- return NO;
- }
-
- // All checks have passed. It's valid.
- return YES;
-}
-
-- (void)lt_monitorCurrentLogFileForExternalChanges {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
- NSAssert(_currentLogFileHandle, @"Can not monitor without handle.");
-
- // This seems to work around crashes when an active source is replaced / released.
- // See https://github.com/CocoaLumberjack/CocoaLumberjack/issues/1341
- // And https://stackoverflow.com/questions/36296528/what-does-this-dispatch-xref-dispose-error-mean
- if (_currentLogFileVnode) {
- dispatch_source_cancel(_currentLogFileVnode);
- }
-
- _currentLogFileVnode = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE,
- (uintptr_t)[_currentLogFileHandle fileDescriptor],
- DISPATCH_VNODE_DELETE | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,
- _loggerQueue);
-
- __weak __auto_type weakSelf = self;
- dispatch_source_set_event_handler(_currentLogFileVnode, ^{ @autoreleasepool {
- NSLogInfo(@"DDFileLogger: Current logfile was moved. Rolling it and creating a new one");
- [weakSelf lt_rollLogFileNow];
- } });
-
-#if !OS_OBJECT_USE_OBJC
- dispatch_source_t vnode = _currentLogFileVnode;
- dispatch_source_set_cancel_handler(_currentLogFileVnode, ^{
- dispatch_release(vnode);
- });
-#endif
-
- dispatch_activate(_currentLogFileVnode);
-}
-
-- (NSFileHandle *)lt_currentLogFileHandle {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (_currentLogFileHandle == nil) {
- __auto_type logFilePath = [[self lt_currentLogFileInfo] filePath];
- _currentLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath];
- if (_currentLogFileHandle != nil) {
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [_currentLogFileHandle seekToEndReturningOffset:nil error:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to seek to end of file: %@", error);
- }
- } else {
- [_currentLogFileHandle seekToEndOfFile];
- }
-
- [self lt_scheduleTimerToRollLogFileDueToAge];
- [self lt_monitorCurrentLogFileForExternalChanges];
- }
- }
-
- return _currentLogFileHandle;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark DDLogger Protocol
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-static int exception_count = 0;
-
-- (void)logMessage:(DDLogMessage *)logMessage {
- // Don't need to check for isOnInternalLoggerQueue, -lt_dataForMessage: will do it for us.
- NSData *data = [self lt_dataForMessage:logMessage];
- if (data.length == 0) {
- return;
- }
-
- [self lt_logData:data];
-}
-
-- (void)willLogMessage:(DDLogFileInfo *)logFileInfo {}
-
-- (void)didLogMessage:(DDLogFileInfo *)logFileInfo {
- [self lt_maybeRollLogFileDueToSize];
-}
-
-- (BOOL)shouldArchiveRecentLogFileInfo:(__unused DDLogFileInfo *)recentLogFileInfo {
- return NO;
-}
-
-- (void)willRemoveLogger {
- [self lt_rollLogFileNow];
-}
-
-- (void)flush {
- // This method is public.
- // We need to execute the rolling on our logging thread/queue.
-
- dispatch_block_t block = ^{
- @autoreleasepool {
- [self lt_flush];
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, block);
- });
- }
-}
-
-- (void)lt_flush {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (_currentLogFileHandle != nil) {
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [_currentLogFileHandle synchronizeAndReturnError:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", error);
- }
- } else {
- @try {
- [_currentLogFileHandle synchronizeFile];
- } @catch (NSException *exception) {
- NSLogError(@"DDFileLogger: Failed to synchronize file: %@", exception);
- }
- }
- }
-}
-
-- (DDLoggerName)loggerName {
- return DDLoggerNameFile;
-}
-
-@end
-
-@implementation DDFileLogger (Internal)
-
-- (void)logData:(NSData *)data {
- // This method is public.
- // We need to execute the rolling on our logging thread/queue.
-
- __auto_type block = ^{
- @autoreleasepool {
- [self lt_logData:data];
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, block);
- });
- }
-}
-
-- (void)lt_deprecationCatchAll {}
-
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
- if (aSelector == @selector(willLogMessage) || aSelector == @selector(didLogMessage)) {
- // Ignore calls to deprecated methods.
- return [self methodSignatureForSelector:@selector(lt_deprecationCatchAll)];
- }
-
- return [super methodSignatureForSelector:aSelector];
-}
-
-- (void)forwardInvocation:(NSInvocation *)anInvocation {
- if (anInvocation.selector != @selector(lt_deprecationCatchAll)) {
- [super forwardInvocation:anInvocation];
- }
-}
-
-- (void)lt_logData:(NSData *)data {
- static __auto_type implementsDeprecatedWillLog = NO;
- static __auto_type implementsDeprecatedDidLog = NO;
-
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- implementsDeprecatedWillLog = [self respondsToSelector:@selector(willLogMessage)];
- implementsDeprecatedDidLog = [self respondsToSelector:@selector(didLogMessage)];
- });
-
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- if (data.length == 0) {
- return;
- }
-
- @try {
- // Make sure that _currentLogFileInfo is initialised before being used.
- __auto_type handle = [self lt_currentLogFileHandle];
-
- if (implementsDeprecatedWillLog) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self willLogMessage];
-#pragma clang diagnostic pop
- } else {
- [self willLogMessage:_currentLogFileInfo];
- }
-
- // use an advisory lock to coordinate write with other processes
- __auto_type fd = [handle fileDescriptor];
- while(flock(fd, LOCK_EX) != 0) {
- NSLogError(@"DDFileLogger: Could not lock logfile, retrying in 1ms: %s (%d)", strerror(errno), errno);
- usleep(1000);
- }
- if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
- __autoreleasing NSError *error = nil;
- __auto_type success = [handle seekToEndReturningOffset:nil error:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to seek to end of file: %@", error);
- }
- success = [handle writeData:data error:&error];
- if (!success) {
- NSLogError(@"DDFileLogger: Failed to write data: %@", error);
- }
- } else {
- [handle seekToEndOfFile];
- [handle writeData:data];
- }
- flock(fd, LOCK_UN);
-
- if (implementsDeprecatedDidLog) {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self didLogMessage];
-#pragma clang diagnostic pop
- } else {
- [self didLogMessage:_currentLogFileInfo];
- }
-
- }
- @catch (NSException *exception) {
- exception_count++;
-
- if (exception_count <= 10) {
- NSLogError(@"DDFileLogger.logMessage: %@", exception);
-
- if (exception_count == 10) {
- NSLogError(@"DDFileLogger.logMessage: Too many exceptions -- will not log any more of them.");
- }
- }
- }
-}
-
-- (id <DDFileLogMessageSerializer>)lt_logFileSerializer {
- if ([_logFileManager respondsToSelector:@selector(logMessageSerializer)]) {
- return _logFileManager.logMessageSerializer;
- } else {
- return [[DDFileLogPlainTextMessageSerializer alloc] init];
- }
-}
-
-- (NSData *)lt_dataForMessage:(DDLogMessage *)logMessage {
- DDAbstractLoggerAssertOnInternalLoggerQueue();
-
- __auto_type messageString = logMessage->_message;
- __auto_type isFormatted = NO;
-
- if (_logFormatter != nil) {
- messageString = [_logFormatter formatLogMessage:logMessage];
- isFormatted = messageString != logMessage->_message;
- }
-
- if (messageString.length == 0) {
- return nil;
- }
-
- __auto_type shouldFormat = !isFormatted || _automaticallyAppendNewlineForCustomFormatters;
- if (shouldFormat && ![messageString hasSuffix:@"\n"]) {
- messageString = [messageString stringByAppendingString:@"\n"];
- }
-
- return [[self lt_logFileSerializer] dataForString:messageString originatingFromMessage:logMessage];
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-static NSString * const kDDXAttrArchivedName = @"lumberjack.log.archived";
-
-@interface DDLogFileInfo () {
- __strong NSString *_filePath;
- __strong NSString *_fileName;
-
- __strong NSDictionary *_fileAttributes;
-
- __strong NSDate *_creationDate;
- __strong NSDate *_modificationDate;
-
- unsigned long long _fileSize;
-}
-
-#if TARGET_IPHONE_SIMULATOR
-// Old implementation of extended attributes on the simulator.
-- (BOOL)_hasExtensionAttributeWithName:(NSString *)attrName;
-- (void)_removeExtensionAttributeWithName:(NSString *)attrName;
-#endif
-
-@end
-
-
-@implementation DDLogFileInfo
-
-@synthesize filePath;
-
-@dynamic fileName;
-@dynamic fileAttributes;
-@dynamic creationDate;
-@dynamic modificationDate;
-@dynamic fileSize;
-@dynamic age;
-
-@dynamic isArchived;
-
-#pragma mark Lifecycle
-
-+ (instancetype)logFileWithPath:(NSString *)aFilePath {
- if (!aFilePath) return nil;
- return [[self alloc] initWithFilePath:aFilePath];
-}
-
-- (instancetype)initWithFilePath:(NSString *)aFilePath {
- NSParameterAssert(aFilePath);
- if ((self = [super init])) {
- filePath = [aFilePath copy];
- }
-
- return self;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Standard Info
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (NSDictionary *)fileAttributes {
- if (_fileAttributes == nil && filePath != nil) {
- __autoreleasing NSError *error = nil;
- _fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error];
- if (!_fileAttributes) {
- NSLogError(@"DDLogFileInfo: Failed to read file attributes: %@", error);
- }
- }
-
- return _fileAttributes ?: @{};
-}
-
-- (NSString *)fileName {
- if (_fileName == nil) {
- _fileName = [filePath lastPathComponent];
- }
-
- return _fileName;
-}
-
-- (NSDate *)modificationDate {
- if (_modificationDate == nil) {
- _modificationDate = self.fileAttributes[NSFileModificationDate];
- }
-
- return _modificationDate;
-}
-
-- (NSDate *)creationDate {
- if (_creationDate == nil) {
- _creationDate = self.fileAttributes[NSFileCreationDate];
- }
-
- return _creationDate;
-}
-
-- (unsigned long long)fileSize {
- if (_fileSize == 0) {
- _fileSize = [self.fileAttributes[NSFileSize] unsignedLongLongValue];
- }
-
- return _fileSize;
-}
-
-- (NSTimeInterval)age {
- return -[[self creationDate] timeIntervalSinceNow];
-}
-
-- (BOOL)isSymlink {
- return self.fileAttributes[NSFileType] == NSFileTypeSymbolicLink;
-}
-
-- (NSString *)description {
- return [@{ @"filePath": self.filePath ? : @"",
- @"fileName": self.fileName ? : @"",
- @"fileAttributes": self.fileAttributes ? : @"",
- @"creationDate": self.creationDate ? : @"",
- @"modificationDate": self.modificationDate ? : @"",
- @"fileSize": @(self.fileSize),
- @"age": @(self.age),
- @"isArchived": @(self.isArchived) } description];
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Archiving
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (BOOL)isArchived {
- return [self hasExtendedAttributeWithName:kDDXAttrArchivedName];
-}
-
-- (void)setIsArchived:(BOOL)flag {
- if (flag) {
- [self addExtendedAttributeWithName:kDDXAttrArchivedName];
- } else {
- [self removeExtendedAttributeWithName:kDDXAttrArchivedName];
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Changes
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)reset {
- _fileName = nil;
- _fileAttributes = nil;
- _creationDate = nil;
- _modificationDate = nil;
-}
-
-- (void)renameFile:(NSString *)newFileName {
- // This method is only used on the iPhone simulator, where normal extended attributes are broken.
- // See full explanation in the header file.
-
- if (![newFileName isEqualToString:[self fileName]]) {
- __auto_type fileManager = [NSFileManager defaultManager];
- __auto_type fileDir = [filePath stringByDeletingLastPathComponent];
- __auto_type newFilePath = [fileDir stringByAppendingPathComponent:newFileName];
-
- // We only want to assert when we're not using the simulator, as we're "archiving" a log file with this method in the sim
- // (in which case the file might not exist anymore and neither does it parent folder).
-#if defined(DEBUG) && (!defined(TARGET_IPHONE_SIMULATOR) || !TARGET_IPHONE_SIMULATOR)
- __auto_type directory = NO;
- [fileManager fileExistsAtPath:fileDir isDirectory:&directory];
- NSAssert(directory, @"Containing directory must exist.");
-#endif
-
- __autoreleasing NSError *error = nil;
- __auto_type success = [fileManager removeItemAtPath:newFilePath error:&error];
- if (!success && error.code != NSFileNoSuchFileError) {
- NSLogError(@"DDLogFileInfo: Error deleting archive (%@): %@", self.fileName, error);
- }
-
- success = [fileManager moveItemAtPath:filePath toPath:newFilePath error:&error];
-
- // When a log file is deleted, moved or renamed on the simulator, we attempt to rename it as a
- // result of "archiving" it, but since the file doesn't exist anymore, needless error logs are printed
- // We therefore ignore this error, and assert that the directory we are copying into exists (which
- // is the only other case where this error code can come up).
-#if TARGET_IPHONE_SIMULATOR
- if (!success && error.code != NSFileNoSuchFileError)
-#else
- if (!success)
-#endif
- {
- NSLogError(@"DDLogFileInfo: Error renaming file (%@): %@", self.fileName, error);
- }
-
- filePath = newFilePath;
- [self reset];
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Attribute Management
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-#if TARGET_IPHONE_SIMULATOR
-
-// Old implementation of extended attributes on the simulator.
-
-// Extended attributes were not working properly on the simulator
-// due to misuse of setxattr() function.
-// Now that this is fixed in the new implementation, we want to keep
-// backward compatibility with previous simulator installations.
-
-static NSString * const kDDExtensionSeparator = @".";
-
-static NSString *_xattrToExtensionName(NSString *attrName) {
- static NSDictionary<NSString *, NSString *>* _xattrToExtensionNameMap;
- static dispatch_once_t _token;
- dispatch_once(&_token, ^{
- _xattrToExtensionNameMap = @{ kDDXAttrArchivedName: @"archived" };
- });
- return [_xattrToExtensionNameMap objectForKey:attrName];
-}
-
-- (BOOL)_hasExtensionAttributeWithName:(NSString *)attrName {
- // This method is only used on the iPhone simulator for backward compatibility reason.
-
- // Split the file name into components. File name may have various format, but generally
- // structure is same:
- //
- // <name part>.<extension part> and <name part>.archived.<extension part>
- // or
- // <name part> and <name part>.archived
- //
- // So we want to search for the attrName in the components (ignoring the first array index).
-
- __auto_type components = [[self fileName] componentsSeparatedByString:kDDExtensionSeparator];
-
- // Watch out for file names without an extension
-
- for (NSUInteger i = 1; i < components.count; i++) {
- if ([attrName isEqualToString:components[i]]) {
- return YES;
- }
- }
-
- return NO;
-}
-
-- (void)_removeExtensionAttributeWithName:(NSString *)attrName {
- // This method is only used on the iPhone simulator for backward compatibility reason.
-
- if ([attrName length] == 0) {
- return;
- }
-
- // Example:
- // attrName = "archived"
- //
- // "mylog.archived.txt" -> "mylog.txt"
- // "mylog.archived" -> "mylog"
-
- __auto_type components = [[self fileName] componentsSeparatedByString:kDDExtensionSeparator];
-
- __auto_type count = [components count];
-
- __auto_type estimatedNewLength = [[self fileName] length];
- __auto_type newFileName = [NSMutableString stringWithCapacity:estimatedNewLength];
-
- if (count > 0) {
- [newFileName appendString:components[0]];
- }
-
- __auto_type found = NO;
-
- NSUInteger i;
-
- for (i = 1; i < count; i++) {
- __auto_type attr = components[i];
-
- if ([attrName isEqualToString:attr]) {
- found = YES;
- } else {
- [newFileName appendString:kDDExtensionSeparator];
- [newFileName appendString:attr];
- }
- }
-
- if (found) {
- [self renameFile:newFileName];
- }
-}
-
-#endif /* if TARGET_IPHONE_SIMULATOR */
-
-- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName {
- __auto_type path = [filePath fileSystemRepresentation];
- __auto_type name = [attrName UTF8String];
- __auto_type hasExtendedAttribute = NO;
- char buffer[1];
-
- __auto_type result = getxattr(path, name, buffer, 1, 0, 0);
-
- // Fast path
- if (result > 0 && buffer[0] == '\1') {
- hasExtendedAttribute = YES;
- }
- // Maintain backward compatibility, but fix it for future checks
- else if (result >= 0) {
- hasExtendedAttribute = YES;
-
- [self addExtendedAttributeWithName:attrName];
- }
-#if TARGET_IPHONE_SIMULATOR
- else if ([self _hasExtensionAttributeWithName:_xattrToExtensionName(attrName)]) {
- hasExtendedAttribute = YES;
-
- [self addExtendedAttributeWithName:attrName];
- }
-#endif
-
- return hasExtendedAttribute;
-}
-
-- (void)addExtendedAttributeWithName:(NSString *)attrName {
- __auto_type path = [filePath fileSystemRepresentation];
- __auto_type name = [attrName UTF8String];
-
- __auto_type result = setxattr(path, name, "\1", 1, 0, 0);
-
- if (result < 0) {
- if (errno != ENOENT) {
- NSLogError(@"DDLogFileInfo: setxattr(%@, %@): error = %@",
- attrName,
- filePath,
- @(strerror(errno)));
- } else {
- NSLogDebug(@"DDLogFileInfo: File does not exist in setxattr(%@, %@): error = %@",
- attrName,
- filePath,
- @(strerror(errno)));
- }
- }
-#if TARGET_IPHONE_SIMULATOR
- else {
- [self _removeExtensionAttributeWithName:_xattrToExtensionName(attrName)];
- }
-#endif
-}
-
-- (void)removeExtendedAttributeWithName:(NSString *)attrName {
- __auto_type path = [filePath fileSystemRepresentation];
- __auto_type name = [attrName UTF8String];
-
- __auto_type result = removexattr(path, name, 0);
-
- if (result < 0 && errno != ENOATTR) {
- NSLogError(@"DDLogFileInfo: removexattr(%@, %@): error = %@",
- attrName,
- self.fileName,
- @(strerror(errno)));
- }
-
-#if TARGET_IPHONE_SIMULATOR
- [self _removeExtensionAttributeWithName:_xattrToExtensionName(attrName)];
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Comparisons
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (BOOL)isEqual:(id)object {
- if ([object isKindOfClass:[self class]]) {
- __auto_type another = (DDLogFileInfo *)object;
-
- return [filePath isEqualToString:[another filePath]];
- }
-
- return NO;
-}
-
-- (NSUInteger)hash {
- return [filePath hash];
-}
-
-- (NSComparisonResult)reverseCompareDatesUs:(NSDate *_Nullable)us them:(NSDate *_Nullable)them {
- if (us != nil && them != nil) {
- return [them compare:(NSDate * _Nonnull)us];
- } else if (us == nil && them == nil) {
- return NSOrderedSame;
- }
- return them == nil ? NSOrderedAscending : NSOrderedDescending;
-}
-
-- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another {
- return [self reverseCompareDatesUs:[self creationDate] them:[another creationDate]];
-}
-
-- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another {
- return [self reverseCompareDatesUs:[self modificationDate] them:[another modificationDate]];
-}
-
-@end
-
-#if TARGET_OS_IPHONE
-/**
- * When creating log file on iOS we're setting NSFileProtectionKey attribute to NSFileProtectionCompleteUnlessOpen.
- *
- * But in case if app is able to launch from background we need to have an ability to open log file any time we
- * want (even if device is locked). Thats why that attribute have to be changed to
- * NSFileProtectionCompleteUntilFirstUserAuthentication.
- */
-BOOL doesAppRunInBackground(void) {
- if ([[[NSBundle mainBundle] executablePath] containsString:@".appex/"]) {
- return YES;
- }
-
- __auto_type answer = NO;
- NSArray *backgroundModes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
- for (NSString *mode in backgroundModes) {
- if (mode.length > 0) {
- answer = YES;
- break;
- }
- }
-
- return answer;
-}
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLog.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLog.m
deleted file mode 100644
index 6c097720..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLog.m
+++ /dev/null
@@ -1,1321 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <pthread.h>
-#import <objc/runtime.h>
-#import <sys/qos.h>
-
-#if TARGET_OS_IOS
- #import <UIKit/UIDevice.h>
- #import <UIKit/UIApplication.h>
-#elif !defined(DD_CLI) && __has_include(<AppKit/NSApplication.h>)
- #import <AppKit/NSApplication.h>
-#endif
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-// We probably shouldn't be using DDLog() statements within the DDLog implementation.
-// But we still want to leave our log statements for any future debugging,
-// and to allow other developers to trace the implementation (which is a great learning tool).
-//
-// So we use a primitive logging macro around NSLog.
-// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
-
-#ifndef DD_DEBUG
- #define DD_DEBUG 0
-#endif
-
-#define NSLogDebug(frmt, ...) do{ if(DD_DEBUG) NSLog((frmt), ##__VA_ARGS__); } while(0)
-
-#define DDLogAssertOnGlobalLoggingQueue() \
-NSAssert(dispatch_get_specific(GlobalLoggingQueueIdentityKey), @"This method must be called on the logging thread/queue!")
-#define DDLogAssertNotOnGlobalLoggingQueue() \
-NSAssert(!dispatch_get_specific(GlobalLoggingQueueIdentityKey), @"This method must not be called on the logging thread/queue!")
-
-// The "global logging queue" refers to [DDLog loggingQueue].
-// It is the queue that all log statements go through.
-//
-// The logging queue sets a flag via dispatch_queue_set_specific using this key.
-// We can check for this key via dispatch_get_specific() to see if we're on the "global logging queue".
-
-static void *const GlobalLoggingQueueIdentityKey = (void *)&GlobalLoggingQueueIdentityKey;
-
-@interface DDLoggerNode : NSObject
-{
- // Direct accessors to be used only for performance
- @public
- id <DDLogger> _logger;
- DDLogLevel _level;
- dispatch_queue_t _loggerQueue;
-}
-
-@property (nonatomic, readonly) id <DDLogger> logger;
-@property (nonatomic, readonly) DDLogLevel level;
-@property (nonatomic, readonly) dispatch_queue_t loggerQueue;
-
-+ (instancetype)nodeWithLogger:(id <DDLogger>)logger
- loggerQueue:(dispatch_queue_t)loggerQueue
- level:(DDLogLevel)level;
-
-@end
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDLog ()
-
-// An array used to manage all the individual loggers.
-// The array is only modified on the loggingQueue/loggingThread.
-@property (nonatomic, strong) NSMutableArray *_loggers;
-
-@end
-
-@implementation DDLog
-
-// All logging statements are added to the same queue to ensure FIFO operation.
-static dispatch_queue_t _loggingQueue;
-
-// Individual loggers are executed concurrently per log statement.
-// Each logger has it's own associated queue, and a dispatch group is used for synchronization.
-static dispatch_group_t _loggingGroup;
-
-// Minor optimization for uniprocessor machines
-static NSUInteger _numProcessors;
-
-/**
- * Returns the singleton `DDLog`.
- * The instance is used by `DDLog` class methods.
- *
- * @return The singleton `DDLog`.
- */
-+ (instancetype)sharedInstance {
- static DDLog *sharedInstance = nil;
-
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedInstance = [[self alloc] init];
- });
-
- return sharedInstance;
-}
-
-/**
- * The runtime sends initialize to each class in a program exactly one time just before the class,
- * or any class that inherits from it, is sent its first message from within the program. (Thus the
- * method may never be invoked if the class is not used.) The runtime sends the initialize message to
- * classes in a thread-safe manner. Superclasses receive this message before their subclasses.
- *
- * This method may also be called directly, hence the safety mechanism.
- **/
-+ (void)initialize {
- static dispatch_once_t DDLogOnceToken;
-
- dispatch_once(&DDLogOnceToken, ^{
- NSLogDebug(@"DDLog: Using grand central dispatch");
-
- _loggingQueue = dispatch_queue_create("cocoa.lumberjack", NULL);
- _loggingGroup = dispatch_group_create();
-
- void *nonNullValue = GlobalLoggingQueueIdentityKey; // Whatever, just not null
- dispatch_queue_set_specific(_loggingQueue, GlobalLoggingQueueIdentityKey, nonNullValue, NULL);
-
- // Figure out how many processors are available.
- // This may be used later for an optimization on uniprocessor machines.
-
- _numProcessors = MAX([NSProcessInfo processInfo].processorCount, (NSUInteger) 1);
-
- NSLogDebug(@"DDLog: numProcessors = %@", @(_numProcessors));
- });
-}
-
-/**
- * The `DDLog` initializer.
- * Static variables are set only once.
- *
- * @return An initialized `DDLog` instance.
- */
-- (instancetype)init {
- self = [super init];
-
- if (self) {
- self._loggers = [[NSMutableArray alloc] initWithCapacity:4];
-
-#if TARGET_OS_IOS
- __auto_type notificationName = UIApplicationWillTerminateNotification;
-#else
- NSString *notificationName = nil;
-
- // On Command Line Tool apps AppKit may not be available
-#if !defined(DD_CLI) && __has_include(<AppKit/NSApplication.h>)
- if (NSApp) {
- notificationName = NSApplicationWillTerminateNotification;
- }
-#endif
-
- if (!notificationName) {
- // If there is no NSApp -> we are running Command Line Tool app.
- // In this case terminate notification wouldn't be fired, so we use workaround.
- __weak __auto_type weakSelf = self;
- atexit_b (^{
- [weakSelf applicationWillTerminate:nil];
- });
- }
-
-#endif /* if TARGET_OS_IOS */
-
- if (notificationName) {
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(applicationWillTerminate:)
- name:notificationName
- object:nil];
- }
- }
-
- return self;
-}
-
-/**
- * Provides access to the logging queue.
- **/
-+ (dispatch_queue_t)loggingQueue {
- return _loggingQueue;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Notifications
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)applicationWillTerminate:(NSNotification * __attribute__((unused)))notification {
- [self flushLog];
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Logger Management
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-+ (void)addLogger:(id <DDLogger>)logger {
- [self.sharedInstance addLogger:logger];
-}
-
-- (void)addLogger:(id <DDLogger>)logger {
- [self addLogger:logger withLevel:DDLogLevelAll]; // DDLogLevelAll has all bits set
-}
-
-+ (void)addLogger:(id <DDLogger>)logger withLevel:(DDLogLevel)level {
- [self.sharedInstance addLogger:logger withLevel:level];
-}
-
-- (void)addLogger:(id <DDLogger>)logger withLevel:(DDLogLevel)level {
- if (!logger) {
- return;
- }
-
- dispatch_async(_loggingQueue, ^{ @autoreleasepool {
- [self lt_addLogger:logger level:level];
- } });
-}
-
-+ (void)removeLogger:(id <DDLogger>)logger {
- [self.sharedInstance removeLogger:logger];
-}
-
-- (void)removeLogger:(id <DDLogger>)logger {
- if (!logger) {
- return;
- }
-
- dispatch_async(_loggingQueue, ^{ @autoreleasepool {
- [self lt_removeLogger:logger];
- } });
-}
-
-+ (void)removeAllLoggers {
- [self.sharedInstance removeAllLoggers];
-}
-
-- (void)removeAllLoggers {
- dispatch_async(_loggingQueue, ^{ @autoreleasepool {
- [self lt_removeAllLoggers];
- } });
-}
-
-+ (NSArray<id<DDLogger>> *)allLoggers {
- return [self.sharedInstance allLoggers];
-}
-
-- (NSArray<id<DDLogger>> *)allLoggers {
- __block NSArray *theLoggers;
-
- dispatch_sync(_loggingQueue, ^{ @autoreleasepool {
- theLoggers = [self lt_allLoggers];
- } });
-
- return theLoggers;
-}
-
-+ (NSArray<DDLoggerInformation *> *)allLoggersWithLevel {
- return [self.sharedInstance allLoggersWithLevel];
-}
-
-- (NSArray<DDLoggerInformation *> *)allLoggersWithLevel {
- __block NSArray *theLoggersWithLevel;
-
- dispatch_sync(_loggingQueue, ^{ @autoreleasepool {
- theLoggersWithLevel = [self lt_allLoggersWithLevel];
- } });
-
- return theLoggersWithLevel;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark - Master Logging
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)queueLogMessage:(DDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag {
- // We have a tricky situation here...
- //
- // In the common case, when the queueSize is below the maximumQueueSize,
- // we want to simply enqueue the logMessage. And we want to do this as fast as possible,
- // which means we don't want to block and we don't want to use any locks.
- //
- // However, if the queueSize gets too big, we want to block.
- // But we have very strict requirements as to when we block, and how long we block.
- //
- // The following example should help illustrate our requirements:
- //
- // Imagine that the maximum queue size is configured to be 5,
- // and that there are already 5 log messages queued.
- // Let us call these 5 queued log messages A, B, C, D, and E. (A is next to be executed)
- //
- // Now if our thread issues a log statement (let us call the log message F),
- // it should block before the message is added to the queue.
- // Furthermore, it should be unblocked immediately after A has been unqueued.
- //
- // The requirements are strict in this manner so that we block only as long as necessary,
- // and so that blocked threads are unblocked in the order in which they were blocked.
- //
- // Returning to our previous example, let us assume that log messages A through E are still queued.
- // Our aforementioned thread is blocked attempting to queue log message F.
- // Now assume we have another separate thread that attempts to issue log message G.
- // It should block until log messages A and B have been unqueued.
-
- __auto_type logBlock = ^{
- // We're now sure we won't overflow the queue.
- // It is time to queue our log message.
- @autoreleasepool {
- [self lt_log:logMessage];
- }
- };
-
- if (asyncFlag) {
- dispatch_async(_loggingQueue, logBlock);
- } else if (dispatch_get_specific(GlobalLoggingQueueIdentityKey)) {
- // We've logged an error message while on the logging queue...
- logBlock();
- } else {
- dispatch_sync(_loggingQueue, logBlock);
- }
-}
-
-+ (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(const char *)function
- line:(NSUInteger)line
- tag:(id)tag
- format:(NSString *)format, ... {
- va_list args;
-
- if (format) {
- va_start(args, format);
-
- [self log:asynchronous
- level:level
- flag:flag
- context:context
- file:file
- function:function
- line:line
- tag:tag
- format:format
- args:args];
-
- va_end(args);
- }
-}
-
-- (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(const char *)function
- line:(NSUInteger)line
- tag:(id)tag
- format:(NSString *)format, ... {
- va_list args;
-
- if (format) {
- va_start(args, format);
-
- [self log:asynchronous
- level:level
- flag:flag
- context:context
- file:file
- function:function
- line:line
- tag:tag
- format:format
- args:args];
-
- va_end(args);
- }
-}
-
-+ (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(const char *)function
- line:(NSUInteger)line
- tag:(id)tag
- format:(NSString *)format
- args:(va_list)args {
- [self.sharedInstance log:asynchronous level:level flag:flag context:context file:file function:function line:line tag:tag format:format args:args];
-}
-
-- (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(const char *)function
- line:(NSUInteger)line
- tag:(id)tag
- format:(NSString *)format
- args:(va_list)args {
- if (format) {
- // Null checks are handled by -initWithMessage:
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion"
- __auto_type logMessage = [[DDLogMessage alloc] initWithFormat:format
- args:args
- level:level
- flag:flag
- context:context
- file:@(file)
- function:@(function)
- line:line
- tag:tag
- options:(DDLogMessageOptions)0
- timestamp:nil];
-#pragma clang diagnostic pop
-
- [self queueLogMessage:logMessage asynchronously:asynchronous];
- }
-}
-
-+ (void)log:(BOOL)asynchronous message:(DDLogMessage *)logMessage {
- [self.sharedInstance log:asynchronous message:logMessage];
-}
-
-- (void)log:(BOOL)asynchronous message:(DDLogMessage *)logMessage {
- [self queueLogMessage:logMessage asynchronously:asynchronous];
-}
-
-+ (void)flushLog {
- [self.sharedInstance flushLog];
-}
-
-- (void)flushLog {
- DDLogAssertNotOnGlobalLoggingQueue();
- dispatch_sync(_loggingQueue, ^{
- @autoreleasepool {
- [self lt_flush];
- }
- });
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Registered Dynamic Logging
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-+ (BOOL)isRegisteredClass:(Class)class {
- __auto_type getterSel = @selector(ddLogLevel);
- __auto_type setterSel = @selector(ddSetLogLevel:);
-
- // Issue #6 (GoogleCode) - Crashes on iOS 4.2.1 and iPhone 4
- // Crash caused by class_getClassMethod(2).
- // "It's a bug with UIAccessibilitySafeCategory__NSObject so it didn't pop up until
- // users had VoiceOver enabled [...]. I was able to work around it by searching the
- // result of class_copyMethodList() instead of calling class_getClassMethod()"
- //
- // Issue #24 (GitHub) - Crashing in in ARC+Simulator
- // The method +[DDLog isRegisteredClass] will crash a project when using it with ARC + Simulator.
- // For running in the Simulator, it needs to execute the non-iOS code. Unless we're running on iOS 17+.
-
-#if TARGET_OS_IPHONE
-#if TARGET_OS_SIMULATOR
- if (@available(iOS 17, tvOS 17, *)) {
-#endif
- __auto_type result = NO;
- unsigned int methodCount, i;
- __auto_type methodList = class_copyMethodList(object_getClass(class), &methodCount);
-
- if (methodList != NULL) {
- __auto_type getterFound = NO;
- __auto_type setterFound = NO;
-
- for (i = 0; i < methodCount; ++i) {
- __auto_type currentSel = method_getName(methodList[i]);
-
- if (currentSel == getterSel) {
- getterFound = YES;
- } else if (currentSel == setterSel) {
- setterFound = YES;
- }
-
- if (getterFound && setterFound) {
- result = YES;
- break;
- }
- }
-
- free(methodList);
- }
-
- return result;
-#if TARGET_OS_SIMULATOR
- } else {
-#endif /* TARGET_OS_SIMULATOR */
-#endif /* TARGET_OS_IPHONE */
-#if !TARGET_OS_IPHONE || TARGET_OS_SIMULATOR
- __auto_type getter = class_getClassMethod(class, getterSel);
- __auto_type setter = class_getClassMethod(class, setterSel);
- return (getter != NULL) && (setter != NULL);
-#endif /* !TARGET_OS_IPHONE || TARGET_OS_SIMULATOR */
-#if TARGET_OS_IPHONE && TARGET_OS_SIMULATOR
- }
-#endif /* TARGET_OS_IPHONE && TARGET_OS_SIMULATOR */
-}
-
-+ (NSArray *)registeredClasses {
- // We're going to get the list of all registered classes.
- // The Objective-C runtime library automatically registers all the classes defined in your source code.
- //
- // To do this we use the following method (documented in the Objective-C Runtime Reference):
- //
- // int objc_getClassList(Class *buffer, int bufferLen)
- //
- // We can pass (NULL, 0) to obtain the total number of
- // registered class definitions without actually retrieving any class definitions.
- // This allows us to allocate the minimum amount of memory needed for the application.
-
- NSUInteger numClasses = 0;
- Class *classes = NULL;
-
- while (numClasses == 0) {
- numClasses = (NSUInteger)MAX(objc_getClassList(NULL, 0), 0);
-
- // numClasses now tells us how many classes we have (but it might change)
- // So we can allocate our buffer, and get pointers to all the class definitions.
- __auto_type bufferSize = numClasses;
- classes = numClasses ? (Class *)calloc(bufferSize, sizeof(Class)) : NULL;
- if (classes == NULL) {
- return @[]; // no memory or classes?
- }
-
- numClasses = (NSUInteger)MAX(objc_getClassList(classes, (int)bufferSize),0);
- if (numClasses > bufferSize || numClasses == 0) {
- // apparently more classes added between calls (or a problem); try again
- free(classes);
- classes = NULL;
- numClasses = 0;
- }
- }
-
- // We can now loop through the classes, and test each one to see if it is a DDLogging class.
- __auto_type result = [NSMutableArray arrayWithCapacity:numClasses];
- for (NSUInteger i = 0; i < numClasses; i++) {
- // Cannot use `__auto_type` here, since this will lead to crashes when deallocating!
- Class class = classes[i];
-
- if ([self isRegisteredClass:class]) {
- [result addObject:class];
- }
- }
-
- free(classes);
-
- return result;
-}
-
-+ (NSArray *)registeredClassNames {
- __auto_type registeredClasses = [self registeredClasses];
- __auto_type result = [NSMutableArray arrayWithCapacity:[registeredClasses count]];
-
- for (Class class in registeredClasses) {
- [result addObject:NSStringFromClass(class)];
- }
- return result;
-}
-
-+ (DDLogLevel)levelForClass:(Class)aClass {
- if ([self isRegisteredClass:aClass]) {
- return [aClass ddLogLevel];
- }
- return (DDLogLevel)-1;
-}
-
-+ (DDLogLevel)levelForClassWithName:(NSString *)aClassName {
- Class clazz = NSClassFromString(aClassName);
- if (clazz == nil) return (DDLogLevel)-1;
- return [self levelForClass:clazz];
-}
-
-+ (void)setLevel:(DDLogLevel)level forClass:(Class)aClass {
- if ([self isRegisteredClass:aClass]) {
- [aClass ddSetLogLevel:level];
- }
-}
-
-+ (void)setLevel:(DDLogLevel)level forClassWithName:(NSString *)aClassName {
- Class clazz = NSClassFromString(aClassName);
- if (clazz == nil) return;
- [self setLevel:level forClass:clazz];
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Logging Thread
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (void)lt_addLogger:(id <DDLogger>)logger level:(DDLogLevel)level {
- // Add to loggers array.
- // Need to create loggerQueue if loggerNode doesn't provide one.
-
- for (DDLoggerNode *node in self._loggers) {
- if (node->_logger == logger && node->_level == level) {
- // Exactly same logger already added, exit
- return;
- }
- }
-
- DDLogAssertOnGlobalLoggingQueue();
-
- dispatch_queue_t loggerQueue = NULL;
- if ([logger respondsToSelector:@selector(loggerQueue)]) {
- // Logger may be providing its own queue
- loggerQueue = logger.loggerQueue;
- }
-
- if (loggerQueue == nil) {
- // Automatically create queue for the logger.
- // Use the logger name as the queue name if possible.
- const char *loggerQueueName = NULL;
-
- if ([logger respondsToSelector:@selector(loggerName)]) {
- loggerQueueName = logger.loggerName.UTF8String;
- }
-
- loggerQueue = dispatch_queue_create(loggerQueueName, NULL);
- }
-
- __auto_type loggerNode = [DDLoggerNode nodeWithLogger:logger loggerQueue:loggerQueue level:level];
- [self._loggers addObject:loggerNode];
-
- if ([logger respondsToSelector:@selector(didAddLoggerInQueue:)]) {
- dispatch_async(loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [logger didAddLoggerInQueue:loggerNode->_loggerQueue];
- } });
- } else if ([logger respondsToSelector:@selector(didAddLogger)]) {
- dispatch_async(loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [logger didAddLogger];
- } });
- }
-}
-
-- (void)lt_removeLogger:(id <DDLogger>)logger {
- // Find associated loggerNode in list of added loggers
-
- DDLogAssertOnGlobalLoggingQueue();
-
- DDLoggerNode *loggerNode = nil;
-
- for (DDLoggerNode *node in self._loggers) {
- if (node->_logger == logger) {
- loggerNode = node;
- break;
- }
- }
-
- if (loggerNode == nil) {
- NSLogDebug(@"DDLog: Request to remove logger which wasn't added");
- return;
- }
-
- // Notify logger
- if ([logger respondsToSelector:@selector(willRemoveLogger)]) {
- dispatch_async(loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [logger willRemoveLogger];
- } });
- }
-
- // Remove from loggers array
- [self._loggers removeObject:loggerNode];
-}
-
-- (void)lt_removeAllLoggers {
- DDLogAssertOnGlobalLoggingQueue();
-
- // Notify all loggers
- for (DDLoggerNode *loggerNode in self._loggers) {
- if ([loggerNode->_logger respondsToSelector:@selector(willRemoveLogger)]) {
- dispatch_async(loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [loggerNode->_logger willRemoveLogger];
- } });
- }
- }
-
- // Remove all loggers from array
- [self._loggers removeAllObjects];
-}
-
-- (NSArray *)lt_allLoggers {
- DDLogAssertOnGlobalLoggingQueue();
-
- __auto_type loggerNodes = self._loggers;
- __auto_type theLoggers = [NSMutableArray arrayWithCapacity:loggerNodes.count];
-
- for (DDLoggerNode *loggerNode in loggerNodes) {
- [theLoggers addObject:loggerNode->_logger];
- }
-
- return [theLoggers copy];
-}
-
-- (NSArray *)lt_allLoggersWithLevel {
- DDLogAssertOnGlobalLoggingQueue();
-
-
- __auto_type loggerNodes = self._loggers;
- __auto_type theLoggersWithLevel = [NSMutableArray arrayWithCapacity:loggerNodes.count];
-
- for (DDLoggerNode *loggerNode in loggerNodes) {
- [theLoggersWithLevel addObject:[DDLoggerInformation informationWithLogger:loggerNode->_logger
- andLevel:loggerNode->_level]];
- }
-
- return [theLoggersWithLevel copy];
-}
-
-- (void)lt_log:(DDLogMessage *)logMessage {
- DDLogAssertOnGlobalLoggingQueue();
-
- // Execute the given log message on each of our loggers.
-
- if (_numProcessors > 1) {
- // Execute each logger concurrently, each within its own queue.
- // All blocks are added to same group.
- // After each block has been queued, wait on group.
- //
- // The waiting ensures that a slow logger doesn't end up with a large queue of pending log messages.
- // This would defeat the purpose of the efforts we made earlier to restrict the max queue size.
-
- for (DDLoggerNode *loggerNode in self._loggers) {
- // skip the loggers that shouldn't write this message based on the log level
-
- if (!(logMessage->_flag & loggerNode->_level)) {
- continue;
- }
-
- dispatch_group_async(_loggingGroup, loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [loggerNode->_logger logMessage:logMessage];
- } });
- }
-
- dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
- } else {
- // Execute each logger serially, each within its own queue.
-
- for (DDLoggerNode *loggerNode in self._loggers) {
- // skip the loggers that shouldn't write this message based on the log level
-
- if (!(logMessage->_flag & loggerNode->_level)) {
- continue;
- }
-
-#if DD_DEBUG
- // we must assure that we aren not on loggerNode->_loggerQueue.
- if (loggerNode->_loggerQueue == NULL) {
- // tell that we can't dispatch logger node on queue that is NULL.
- NSLogDebug(@"DDLog: current node has loggerQueue == NULL");
- }
- else {
- dispatch_async(loggerNode->_loggerQueue, ^{
- if (dispatch_get_specific(GlobalLoggingQueueIdentityKey)) {
- // tell that we somehow on logging queue?
- NSLogDebug(@"DDLog: current node has loggerQueue == globalLoggingQueue");
- }
- });
- }
-#endif
- // next, we must check that node is OK.
- dispatch_sync(loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [loggerNode->_logger logMessage:logMessage];
- } });
- }
- }
-}
-
-- (void)lt_flush {
- // All log statements issued before the flush method was invoked have now been executed.
- //
- // Now we need to propagate the flush request to any loggers that implement the flush method.
- // This is designed for loggers that buffer IO.
-
- DDLogAssertOnGlobalLoggingQueue();
-
- for (DDLoggerNode *loggerNode in self._loggers) {
- if ([loggerNode->_logger respondsToSelector:@selector(flush)]) {
- dispatch_group_async(_loggingGroup, loggerNode->_loggerQueue, ^{ @autoreleasepool {
- [loggerNode->_logger flush];
- } });
- }
- }
-
- dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Utilities
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-NSString * __nullable DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy) {
- if (filePath == NULL) {
- return nil;
- }
-
- char *lastSlash = NULL;
- char *lastDot = NULL;
-
- __auto_type p = (char *)filePath;
- while (*p != '\0') {
- if (*p == '/') {
- lastSlash = p;
- } else if (*p == '.') {
- lastDot = p;
- }
-
- p++;
- }
-
- char *subStr;
- NSUInteger subLen;
-
- if (lastSlash) {
- if (lastDot) {
- // lastSlash -> lastDot
- subStr = lastSlash + 1;
- subLen = (NSUInteger)(lastDot - subStr);
- } else {
- // lastSlash -> endOfString
- subStr = lastSlash + 1;
- subLen = (NSUInteger)(p - subStr);
- }
- } else {
- if (lastDot) {
- // startOfString -> lastDot
- subStr = (char *)filePath;
- subLen = (NSUInteger)(lastDot - subStr);
- } else {
- // startOfString -> endOfString
- subStr = (char *)filePath;
- subLen = (NSUInteger)(p - subStr);
- }
- }
-
- if (copy) {
- return [[NSString alloc] initWithBytes:subStr
- length:subLen
- encoding:NSUTF8StringEncoding];
- } else {
- // We can take advantage of the fact that __FILE__ is a string literal.
- // Specifically, we don't need to waste time copying the string.
- // We can just tell NSString to point to a range within the string literal.
-
- return [[NSString alloc] initWithBytesNoCopy:subStr
- length:subLen
- encoding:NSUTF8StringEncoding
- freeWhenDone:NO];
- }
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@implementation DDLoggerNode
-
-- (instancetype)initWithLogger:(id <DDLogger>)logger loggerQueue:(dispatch_queue_t)loggerQueue level:(DDLogLevel)level {
- if ((self = [super init])) {
- _logger = logger;
-
- if (loggerQueue) {
- _loggerQueue = loggerQueue;
-#if !OS_OBJECT_USE_OBJC
- dispatch_retain(loggerQueue);
-#endif
- }
-
- _level = level;
- }
- return self;
-}
-
-+ (instancetype)nodeWithLogger:(id <DDLogger>)logger loggerQueue:(dispatch_queue_t)loggerQueue level:(DDLogLevel)level {
- return [[self alloc] initWithLogger:logger loggerQueue:loggerQueue level:level];
-}
-
-- (void)dealloc {
-#if !OS_OBJECT_USE_OBJC
- if (_loggerQueue) {
- dispatch_release(_loggerQueue);
- }
-#endif
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@implementation DDLogMessage
-
-- (instancetype)init {
- self = [super init];
- return self;
-}
-
-- (instancetype)initWithFormat:(NSString *)messageFormat
- formatted:(NSString *)message
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(NSString *)function
- line:(NSUInteger)line
- tag:(id)tag
- options:(DDLogMessageOptions)options
- timestamp:(NSDate *)timestamp {
- NSParameterAssert(messageFormat);
- NSParameterAssert(message);
- NSParameterAssert(file);
-
- if ((self = [super init])) {
- __auto_type copyMessage = (options & DDLogMessageDontCopyMessage) == 0;
- _messageFormat = copyMessage ? [messageFormat copy] : messageFormat;
- _message = copyMessage ? [message copy] : message;
- _level = level;
- _flag = flag;
- _context = context;
-
- __auto_type copyFile = (options & DDLogMessageCopyFile) != 0;
- _file = copyFile ? [file copy] : file;
-
- __auto_type copyFunction = (options & DDLogMessageCopyFunction) != 0;
- _function = copyFunction ? [function copy] : function;
-
- _line = line;
- _representedObject = tag;
-#if DD_LEGACY_MESSAGE_TAG
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- _tag = tag;
-#pragma clang diagnostic pop
-#endif
- _options = options;
- _timestamp = timestamp ?: [NSDate date];
-
- __uint64_t tid;
- if (pthread_threadid_np(NULL, &tid) == 0) {
- _threadID = [[NSString alloc] initWithFormat:@"%llu", tid];
- } else {
- _threadID = @"N/A";
- }
- _threadName = NSThread.currentThread.name;
-
- // Get the file name without extension
- _fileName = [_file lastPathComponent];
- __auto_type dotLocation = [_fileName rangeOfString:@"." options:NSBackwardsSearch].location;
- if (dotLocation != NSNotFound) {
- _fileName = [_fileName substringToIndex:dotLocation];
- }
-
- // Try to get the current queue's label
- _queueLabel = @(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL));
- _qos = (NSUInteger) qos_class_self();
- }
- return self;
-}
-
-- (instancetype)initWithFormat:(NSString *)messageFormat
- args:(va_list)messageArgs
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(NSString *)function
- line:(NSUInteger)line
- tag:(id)tag
- options:(DDLogMessageOptions)options
- timestamp:(NSDate *)timestamp {
- __auto_type copyMessage = (options & DDLogMessageDontCopyMessage) == 0;
- NSString *format = copyMessage ? [messageFormat copy] : messageFormat;
- self = [self initWithFormat:format
- formatted:[[NSString alloc] initWithFormat:format arguments:messageArgs]
- level:level
- flag:flag
- context:context
- file:file
- function:function
- line:line
- tag:tag
- options:options | DDLogMessageDontCopyMessage // we already did the copying if needed.
- timestamp:timestamp];
- return self;
-}
-
-- (instancetype)initWithMessage:(NSString *)message
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(NSString *)function
- line:(NSUInteger)line
- tag:(id)tag
- options:(DDLogMessageOptions)options
- timestamp:(NSDate *)timestamp {
- self = [self initWithFormat:message
- formatted:message
- level:level
- flag:flag
- context:context
- file:file
- function:function
- line:line
- tag:tag
- options:options
- timestamp:timestamp];
- return self;
-}
-
-NS_INLINE BOOL _nullable_strings_equal(NSString* _Nullable lhs, NSString* _Nullable rhs)
-{
- if (lhs == nil) {
- if (rhs == nil) {
- return YES;
- }
- } else if (rhs != nil && [lhs isEqualToString:(NSString* _Nonnull)rhs]) {
- return YES;
- }
- return NO;
-}
-
-- (BOOL)isEqual:(id)other {
- // Subclasses of NSObject should not call [super isEqual:] here.
- // See https://stackoverflow.com/questions/36593038/confused-about-the-default-isequal-and-hash-implements
- if (other == self) {
- return YES;
- } else if (!other || ![other isKindOfClass:[DDLogMessage class]]) {
- return NO;
- } else {
- __auto_type otherMsg = (DDLogMessage *)other;
- return [otherMsg->_message isEqualToString:_message]
- && [otherMsg->_messageFormat isEqualToString:_messageFormat]
- && otherMsg->_level == _level
- && otherMsg->_flag == _flag
- && otherMsg->_context == _context
- && [otherMsg->_file isEqualToString:_file]
- && _nullable_strings_equal(otherMsg->_function, _function)
- && otherMsg->_line == _line
- && (([otherMsg->_representedObject respondsToSelector:@selector(isEqual:)] && [otherMsg->_representedObject isEqual:_representedObject]) || otherMsg->_representedObject == _representedObject)
- && [otherMsg->_timestamp isEqualToDate:_timestamp]
- && [otherMsg->_threadID isEqualToString:_threadID] // If the thread ID is the same, the name will likely be the same as well.
- && [otherMsg->_queueLabel isEqualToString:_queueLabel]
- && otherMsg->_qos == _qos;
- }
-}
-
-- (NSUInteger)hash {
- // Subclasses of NSObject should not call [super hash] here.
- // See https://stackoverflow.com/questions/36593038/confused-about-the-default-isequal-and-hash-implements
- return _message.hash
- ^ _messageFormat.hash
- ^ _level
- ^ _flag
- ^ _context
- ^ _file.hash
- ^ _function.hash
- ^ _line
- ^ ([_representedObject respondsToSelector:@selector(hash)] ? [_representedObject hash] : (NSUInteger)_representedObject)
- ^ _timestamp.hash
- ^ _threadID.hash
- ^ _queueLabel.hash
- ^ _qos;
-}
-
-- (id)copyWithZone:(NSZone * __attribute__((unused)))zone {
- DDLogMessage *newMessage = [DDLogMessage new];
-
- newMessage->_messageFormat = _messageFormat;
- newMessage->_message = _message;
- newMessage->_level = _level;
- newMessage->_flag = _flag;
- newMessage->_context = _context;
- newMessage->_file = _file;
- newMessage->_fileName = _fileName;
- newMessage->_function = _function;
- newMessage->_line = _line;
- newMessage->_representedObject = _representedObject;
-#if DD_LEGACY_MESSAGE_TAG
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- newMessage->_tag = _tag;
-#pragma clang diagnostic pop
-#endif
- newMessage->_options = _options;
- newMessage->_timestamp = _timestamp;
- newMessage->_threadID = _threadID;
- newMessage->_threadName = _threadName;
- newMessage->_queueLabel = _queueLabel;
- newMessage->_qos = _qos;
-
- return newMessage;
-}
-
-// ensure compatibility even when built with DD_LEGACY_MESSAGE_TAG to 0.
-- (id)tag {
- return _representedObject;
-}
-
-@end
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@implementation DDAbstractLogger
-
-- (instancetype)init {
- if ((self = [super init])) {
- const char *loggerQueueName = NULL;
-
- if ([self respondsToSelector:@selector(loggerName)]) {
- loggerQueueName = self.loggerName.UTF8String;
- }
-
- _loggerQueue = dispatch_queue_create(loggerQueueName, NULL);
-
- // We're going to use dispatch_queue_set_specific() to "mark" our loggerQueue.
- // Later we can use dispatch_get_specific() to determine if we're executing on our loggerQueue.
- // The documentation states:
- //
- // > Keys are only compared as pointers and are never dereferenced.
- // > Thus, you can use a pointer to a static variable for a specific subsystem or
- // > any other value that allows you to identify the value uniquely.
- // > Specifying a pointer to a string constant is not recommended.
- //
- // So we're going to use the very convenient key of "self",
- // which also works when multiple logger classes extend this class, as each will have a different "self" key.
- //
- // This is used primarily for thread-safety assertions (via the isOnInternalLoggerQueue method below).
-
- __auto_type key = (__bridge void *)self;
- __auto_type nonNullValue = (__bridge void *)self;
-
- dispatch_queue_set_specific(_loggerQueue, key, nonNullValue, NULL);
- }
-
- return self;
-}
-
-- (void)dealloc {
-#if !OS_OBJECT_USE_OBJC
- if (_loggerQueue) {
- dispatch_release(_loggerQueue);
- }
-#endif
-}
-
-- (void)logMessage:(DDLogMessage * __attribute__((unused)))logMessage {
- // Override me
-}
-
-- (id <DDLogFormatter>)logFormatter {
- // This method must be thread safe and intuitive.
- // Therefore if somebody executes the following code:
- //
- // [logger setLogFormatter:myFormatter];
- // formatter = [logger logFormatter];
- //
- // They would expect formatter to equal myFormatter.
- // This functionality must be ensured by the getter and setter method.
- //
- // The thread safety must not come at a cost to the performance of the logMessage method.
- // This method is likely called sporadically, while the logMessage method is called repeatedly.
- // This means, the implementation of this method:
- // - Must NOT require the logMessage method to acquire a lock.
- // - Must NOT require the logMessage method to access an atomic property (also a lock of sorts).
- //
- // Thread safety is ensured by executing access to the formatter variable on the loggerQueue.
- // This is the same queue that the logMessage method operates on.
- //
- // Note: The last time I benchmarked the performance of direct access vs atomic property access,
- // direct access was over twice as fast on the desktop and over 6 times as fast on the iPhone.
- //
- // Furthermore, consider the following code:
- //
- // DDLogVerbose(@"log msg 1");
- // DDLogVerbose(@"log msg 2");
- // [logger setFormatter:myFormatter];
- // DDLogVerbose(@"log msg 3");
- //
- // Our intuitive requirement means that the new formatter will only apply to the 3rd log message.
- // This must remain true even when using asynchronous logging.
- // We must keep in mind the various queue's that are in play here:
- //
- // loggerQueue : Our own private internal queue that the logMessage method runs on.
- // Operations are added to this queue from the global loggingQueue.
- //
- // globalLoggingQueue : The queue that all log messages go through before they arrive in our loggerQueue.
- //
- // All log statements go through the serial globalLoggingQueue before they arrive at our loggerQueue.
- // Thus this method also goes through the serial globalLoggingQueue to ensure intuitive operation.
-
- // IMPORTANT NOTE:
- //
- // Methods within the DDLogger implementation MUST access the formatter ivar directly.
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __block id <DDLogFormatter> result;
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self->_loggerQueue, ^{
- result = self->_logFormatter;
- });
- });
-
- return result;
-}
-
-- (void)setLogFormatter:(id <DDLogFormatter>)logFormatter {
- // The design of this method is documented extensively in the logFormatter message (above in code).
-
- DDAbstractLoggerAssertLockedPropertyAccess();
-
- __auto_type block = ^{
- @autoreleasepool {
- if (self->_logFormatter != logFormatter) {
- if ([self->_logFormatter respondsToSelector:@selector(willRemoveFromLogger:)]) {
- [self->_logFormatter willRemoveFromLogger:self];
- }
-
- self->_logFormatter = logFormatter;
-
- if ([self->_logFormatter respondsToSelector:@selector(didAddToLogger:inQueue:)]) {
- [self->_logFormatter didAddToLogger:self inQueue:self->_loggerQueue];
- } else if ([self->_logFormatter respondsToSelector:@selector(didAddToLogger:)]) {
- [self->_logFormatter didAddToLogger:self];
- }
- }
- }
- };
-
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self->_loggerQueue, block);
- });
-}
-
-- (dispatch_queue_t)loggerQueue {
- return _loggerQueue;
-}
-
-- (NSString *)loggerName {
- return NSStringFromClass([self class]);
-}
-
-- (BOOL)isOnGlobalLoggingQueue {
- return (dispatch_get_specific(GlobalLoggingQueueIdentityKey) != NULL);
-}
-
-- (BOOL)isOnInternalLoggerQueue {
- return dispatch_get_specific((__bridge void *)self) != NULL;
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDLoggerInformation()
-{
- // Direct accessors to be used only for performance
- @public
- id <DDLogger> _logger;
- DDLogLevel _level;
-}
-
-@end
-
-@implementation DDLoggerInformation
-
-- (instancetype)initWithLogger:(id <DDLogger>)logger andLevel:(DDLogLevel)level {
- if ((self = [super init])) {
- _logger = logger;
- _level = level;
- }
- return self;
-}
-
-+ (instancetype)informationWithLogger:(id <DDLogger>)logger andLevel:(DDLogLevel)level {
- return [[self alloc] initWithLogger:logger andLevel:level];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLoggerNames.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLoggerNames.m
deleted file mode 100644
index ffe6e331..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDLoggerNames.m
+++ /dev/null
@@ -1,21 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDLoggerNames.h>
-
-DDLoggerName const DDLoggerNameASL = @"cocoa.lumberjack.aslLogger";
-DDLoggerName const DDLoggerNameTTY = @"cocoa.lumberjack.ttyLogger";
-DDLoggerName const DDLoggerNameOS = @"cocoa.lumberjack.osLogger";
-DDLoggerName const DDLoggerNameFile = @"cocoa.lumberjack.fileLogger";
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDOSLogger.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDOSLogger.m
deleted file mode 100644
index 3ee583c6..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDOSLogger.m
+++ /dev/null
@@ -1,158 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-#import <os/log.h>
-
-#import <CocoaLumberjack/DDOSLogger.h>
-
-@implementation DDOSLogLevelMapperDefault
-
-- (instancetype)init {
- self = [super init];
- return self;
-}
-
-- (os_log_type_t)osLogTypeForLogFlag:(DDLogFlag)logFlag {
- switch (logFlag) {
- case DDLogFlagError:
- case DDLogFlagWarning:
- return OS_LOG_TYPE_ERROR;
- case DDLogFlagInfo:
- return OS_LOG_TYPE_INFO;
- case DDLogFlagDebug:
- case DDLogFlagVerbose:
- return OS_LOG_TYPE_DEBUG;
- default:
- return OS_LOG_TYPE_DEFAULT;
- }
-}
-
-@end
-
-#if TARGET_OS_SIMULATOR
-@implementation DDOSLogLevelMapperSimulatorConsoleAppWorkaround
-
-- (os_log_type_t)osLogTypeForLogFlag:(DDLogFlag)logFlag {
- __auto_type defaultMapping = [super osLogTypeForLogFlag:logFlag];
- return (defaultMapping == OS_LOG_TYPE_DEBUG) ? OS_LOG_TYPE_DEFAULT : defaultMapping;
-}
-
-@end
-#endif
-
-@interface DDOSLogger ()
-
-@property (nonatomic, copy, readonly, nullable) NSString *subsystem;
-@property (nonatomic, copy, readonly, nullable) NSString *category;
-@property (nonatomic, strong, readonly, nonnull) os_log_t logger;
-
-@end
-
-@implementation DDOSLogger
-
-@synthesize subsystem = _subsystem;
-@synthesize category = _category;
-@synthesize logLevelMapper = _logLevelMapper;
-@synthesize logger = _logger;
-
-#pragma mark - Shared Instance
-
-API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
-static DDOSLogger *sharedInstance;
-
-+ (instancetype)sharedInstance {
- static dispatch_once_t DDOSLoggerOnceToken;
-
- dispatch_once(&DDOSLoggerOnceToken, ^{
- sharedInstance = [[[self class] alloc] init];
- });
-
- return sharedInstance;
-}
-
-#pragma mark - Initialization
-- (instancetype)initWithSubsystem:(NSString *)subsystem category:(NSString *)category {
- NSAssert((subsystem == nil) == (category == nil),
- @"Either both subsystem and category or neither should be nil.");
- if (self = [super init]) {
- _subsystem = [subsystem copy];
- _category = [category copy];
- _logLevelMapper = [[DDOSLogLevelMapperDefault alloc] init];
- }
- return self;
-}
-
-- (instancetype)init {
- return [self initWithSubsystem:nil category:nil];
-}
-
-- (instancetype)initWithSubsystem:(NSString *)subsystem
- category:(NSString *)category
- logLevelMapper:(id<DDOSLogLevelMapper>)logLevelMapper {
- if (self = [self initWithSubsystem:subsystem category:category]) {
- NSParameterAssert(logLevelMapper);
- _logLevelMapper = logLevelMapper;
- }
- return self;
-}
-
-- (instancetype)initWithLogLevelMapper:(id<DDOSLogLevelMapper>)logLevelMapper {
- return [self initWithSubsystem:nil category:nil logLevelMapper:logLevelMapper];
-}
-
-#pragma mark - Mapper
-- (id<DDOSLogLevelMapper>)logLevelMapper {
- if (_logLevelMapper == nil) {
- _logLevelMapper = [[DDOSLogLevelMapperDefault alloc] init];
- }
- return _logLevelMapper;
-}
-
-#pragma mark - os_log
-- (os_log_t)logger {
- if (_logger == nil) {
- if (self.subsystem == nil || self.category == nil) {
- _logger = OS_LOG_DEFAULT;
- } else {
- _logger = os_log_create(self.subsystem.UTF8String, self.category.UTF8String);
- }
- }
- return _logger;
-}
-
-#pragma mark - DDLogger
-- (DDLoggerName)loggerName {
- return DDLoggerNameOS;
-}
-
-- (void)logMessage:(DDLogMessage *)logMessage {
-#if !TARGET_OS_WATCH // See DDASLLogCapture.m -> Was never supported on watchOS.
- // Skip captured log messages.
- if ([logMessage->_fileName isEqualToString:@"DDASLLogCapture"]) {
- return;
- }
-#endif
-
- if (@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) {
- __auto_type message = _logFormatter ? [_logFormatter formatLogMessage:logMessage] : logMessage->_message;
- if (message != nil) {
- __auto_type logType = [self.logLevelMapper osLogTypeForLogFlag:logMessage->_flag];
- os_log_with_type(self.logger, logType, "%{public}s", message.UTF8String);
- }
- }
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDTTYLogger.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDTTYLogger.m
deleted file mode 100644
index 20d08b71..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/DDTTYLogger.m
+++ /dev/null
@@ -1,1446 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <sys/uio.h>
-
-#import <CocoaLumberjack/DDTTYLogger.h>
-
-// We probably shouldn't be using DDLog() statements within the DDLog implementation.
-// But we still want to leave our log statements for any future debugging,
-// and to allow other developers to trace the implementation (which is a great learning tool).
-//
-// So we use primitive logging macros around NSLog.
-// We maintain the NS prefix on the macros to be explicit about the fact that we're using NSLog.
-
-#ifndef DD_NSLOG_LEVEL
- #define DD_NSLOG_LEVEL 2
-#endif
-
-#define NSLogError(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogWarn(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogInfo(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogDebug(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0)
-#define NSLogVerbose(frmt, ...) do{ if(DD_NSLOG_LEVEL >= 5) NSLog((frmt), ##__VA_ARGS__); } while(0)
-
-// Xcode does NOT natively support colors in the Xcode debugging console.
-// You'll need to install the XcodeColors plugin to see colors in the Xcode console.
-// https://github.com/robbiehanson/XcodeColors
-//
-// The following is documentation from the XcodeColors project:
-//
-//
-// How to apply color formatting to your log statements:
-//
-// To set the foreground color:
-// Insert the ESCAPE_SEQ into your string, followed by "fg124,12,255;" where r=124, g=12, b=255.
-//
-// To set the background color:
-// Insert the ESCAPE_SEQ into your string, followed by "bg12,24,36;" where r=12, g=24, b=36.
-//
-// To reset the foreground color (to default value):
-// Insert the ESCAPE_SEQ into your string, followed by "fg;"
-//
-// To reset the background color (to default value):
-// Insert the ESCAPE_SEQ into your string, followed by "bg;"
-//
-// To reset the foreground and background color (to default values) in one operation:
-// Insert the ESCAPE_SEQ into your string, followed by ";"
-
-#define XCODE_COLORS_ESCAPE_SEQ "\033["
-
-#define XCODE_COLORS_RESET_FG XCODE_COLORS_ESCAPE_SEQ "fg;" // Clear any foreground color
-#define XCODE_COLORS_RESET_BG XCODE_COLORS_ESCAPE_SEQ "bg;" // Clear any background color
-#define XCODE_COLORS_RESET XCODE_COLORS_ESCAPE_SEQ ";" // Clear any foreground or background color
-
-// If running in a shell, not all RGB colors will be supported.
-// In this case we automatically map to the closest available color.
-// In order to provide this mapping, we have a hard-coded set of the standard RGB values available in the shell.
-// However, not every shell is the same, and Apple likes to think different even when it comes to shell colors.
-//
-// Map to standard Terminal.app colors (1), or
-// map to standard xterm colors (0).
-
-#define MAP_TO_TERMINAL_APP_COLORS 1
-
-typedef struct {
- uint8_t r;
- uint8_t g;
- uint8_t b;
-} DDRGBColor;
-
-@interface DDTTYLoggerColorProfile : NSObject {
-@public
- DDLogFlag mask;
- NSInteger context;
-
- DDRGBColor fg;
- DDRGBColor bg;
-
- NSUInteger fgCodeIndex;
- NSString *fgCodeRaw;
-
- NSUInteger bgCodeIndex;
- NSString *bgCodeRaw;
-
- char fgCode[24];
- size_t fgCodeLen;
-
- char bgCode[24];
- size_t bgCodeLen;
-
- char resetCode[8];
- size_t resetCodeLen;
-}
-
-- (nullable instancetype)initWithForegroundColor:(nullable DDColor *)fgColor backgroundColor:(nullable DDColor *)bgColor flag:(DDLogFlag)mask context:(NSInteger)ctxt;
-
-@end
-
-@interface DDTTYLogger () {
- NSString *_appName;
- char *_app;
- size_t _appLen;
-
- NSString *_processID;
- char *_pid;
- size_t _pidLen;
-
- BOOL _colorsEnabled;
- NSMutableArray *_colorProfilesArray;
- NSMutableDictionary *_colorProfilesDict;
-}
-
-@end
-
-#pragma mark -
-
-@implementation DDTTYLogger
-
-static BOOL isaColorTTY;
-static BOOL isaColor256TTY;
-static BOOL isaXcodeColorTTY;
-
-static NSArray *codesFg = nil;
-static NSArray *codesBg = nil;
-static NSArray *colors = nil;
-
-static DDTTYLogger *sharedInstance;
-
-/**
- * Initializes the colors array, as well as the `codesFg` and `codesBg` arrays, for 16 color mode.
- *
- * This method is used when the application is running from within a shell that only supports 16 color mode.
- * This method is not invoked if the application is running within Xcode, or via normal UI app launch.
- **/
-+ (void)initializeColors16 {
- if (codesFg || codesBg || colors) {
- return;
- }
-
- __auto_type mColors = [NSMutableArray arrayWithCapacity:16];
-
- // In a standard shell only 16 colors are supported.
- //
- // More information about ansi escape codes can be found online.
- // http://en.wikipedia.org/wiki/ANSI_escape_code
- codesFg = @[
- @"30m", // normal - black
- @"31m", // normal - red
- @"32m", // normal - green
- @"33m", // normal - yellow
- @"34m", // normal - blue
- @"35m", // normal - magenta
- @"36m", // normal - cyan
- @"37m", // normal - gray
- @"1;30m", // bright - darkgray
- @"1;31m", // bright - red
- @"1;32m", // bright - green
- @"1;33m", // bright - yellow
- @"1;34m", // bright - blue
- @"1;35m", // bright - magenta
- @"1;36m", // bright - cyan
- @"1;37m", // bright - white
- ];
-
- codesBg = @[
- @"40m", // normal - black
- @"41m", // normal - red
- @"42m", // normal - green
- @"43m", // normal - yellow
- @"44m", // normal - blue
- @"45m", // normal - magenta
- @"46m", // normal - cyan
- @"47m", // normal - gray
- @"1;40m", // bright - darkgray
- @"1;41m", // bright - red
- @"1;42m", // bright - green
- @"1;43m", // bright - yellow
- @"1;44m", // bright - blue
- @"1;45m", // bright - magenta
- @"1;46m", // bright - cyan
- @"1;47m", // bright - white
- ];
-
-#if MAP_TO_TERMINAL_APP_COLORS
-
- // Standard Terminal.app colors:
- //
- // These are the default colors used by Apple's Terminal.app.
- const DDRGBColor rgbColors[] = {
- { 0, 0, 0}, // normal - black
- {194, 54, 33}, // normal - red
- { 37, 188, 36}, // normal - green
- {173, 173, 39}, // normal - yellow
- { 73, 46, 225}, // normal - blue
- {211, 56, 211}, // normal - magenta
- { 51, 187, 200}, // normal - cyan
- {203, 204, 205}, // normal - gray
- {129, 131, 131}, // bright - darkgray
- {252, 57, 31}, // bright - red
- { 49, 231, 34}, // bright - green
- {234, 236, 35}, // bright - yellow
- { 88, 51, 255}, // bright - blue
- {249, 53, 248}, // bright - magenta
- { 20, 240, 240}, // bright - cyan
- {233, 235, 235}, // bright - white
- };
-
-#else /* if MAP_TO_TERMINAL_APP_COLORS */
-
- // Standard xterm colors:
- //
- // These are the default colors used by most xterm shells.
- const DDRGBColor rgbColors[] = {
- { 0, 0, 0}, // normal - black
- {205, 0, 0}, // normal - red
- { 0, 205, 0}, // normal - green
- {205, 205, 0}, // normal - yellow
- { 0, 0, 238}, // normal - blue
- {205, 0, 205}, // normal - magenta
- { 0, 205, 205}, // normal - cyan
- {229, 229, 229}, // normal - gray
- {127, 127, 127}, // bright - darkgray
- {255, 0, 0}, // bright - red
- { 0, 255, 0}, // bright - green
- {255, 255, 0}, // bright - yellow
- { 92, 92, 255}, // bright - blue
- {255, 0, 255}, // bright - magenta
- { 0, 255, 255}, // bright - cyan
- {255, 255, 255}, // bright - white
- };
-#endif /* if MAP_TO_TERMINAL_APP_COLORS */
-
- for (size_t i = 0; i < sizeof(rgbColors) / sizeof(rgbColors[0]); ++i) {
- [mColors addObject:DDMakeColor(rgbColors[i].r, rgbColors[i].g, rgbColors[i].b)];
- }
- colors = [mColors copy];
-
- NSAssert([codesFg count] == [codesBg count], @"Invalid colors/codes array(s)");
- NSAssert([codesFg count] == [colors count], @"Invalid colors/codes array(s)");
-}
-
-/**
- * Initializes the colors array, as well as the `codesFg` and `codesBg` arrays, for 256 color mode.
- *
- * This method is used when the application is running from within a shell that supports 256 color mode.
- * This method is not invoked if the application is running within Xcode, or via normal UI app launch.
- **/
-+ (void)initializeColors256 {
- if (codesFg || codesBg || colors) {
- return;
- }
-
- __auto_type mCodesFg = [NSMutableArray arrayWithCapacity:(256 - 16)];
- __auto_type mCodesBg = [NSMutableArray arrayWithCapacity:(256 - 16)];
- __auto_type mColors = [NSMutableArray arrayWithCapacity:(256 - 16)];
-
-#if MAP_TO_TERMINAL_APP_COLORS
-
- // Standard Terminal.app colors:
- //
- // These are the colors the Terminal.app uses in xterm-256color mode.
- // In this mode, the terminal supports 256 different colors, specified by 256 color codes.
- //
- // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode.
- // These are actually configurable, and thus we ignore them for the purposes of mapping,
- // as we can't rely on them being constant. They are largely duplicated anyway.
- //
- // The next 216 color codes are designed to run the spectrum, with several shades of every color.
- // While the color codes are standardized, the actual RGB values for each color code is not.
- // Apple's Terminal.app uses different RGB values from that of a standard xterm.
- // Apple's choices in colors are designed to be a little nicer on the eyes.
- //
- // The last 24 color codes represent a grayscale.
- //
- // Unfortunately, unlike the standard xterm color chart,
- // Apple's RGB values cannot be calculated using a simple formula (at least not that I know of).
- // Also, I don't know of any ways to programmatically query the shell for the RGB values.
- // So this big giant color chart had to be made by hand.
- //
- // More information about ansi escape codes can be found online.
- // http://en.wikipedia.org/wiki/ANSI_escape_code
-
- // Colors
- const DDRGBColor rgbColors[] = {
- { 47, 49, 49},
- { 60, 42, 144},
- { 66, 44, 183},
- { 73, 46, 222},
- { 81, 50, 253},
- { 88, 51, 255},
-
- { 42, 128, 37},
- { 42, 127, 128},
- { 44, 126, 169},
- { 56, 125, 209},
- { 59, 124, 245},
- { 66, 123, 255},
-
- { 51, 163, 41},
- { 39, 162, 121},
- { 42, 161, 162},
- { 53, 160, 202},
- { 45, 159, 240},
- { 58, 158, 255},
-
- { 31, 196, 37},
- { 48, 196, 115},
- { 39, 195, 155},
- { 49, 195, 195},
- { 32, 194, 235},
- { 53, 193, 255},
-
- { 50, 229, 35},
- { 40, 229, 109},
- { 27, 229, 149},
- { 49, 228, 189},
- { 33, 228, 228},
- { 53, 227, 255},
-
- { 27, 254, 30},
- { 30, 254, 103},
- { 45, 254, 143},
- { 38, 253, 182},
- { 38, 253, 222},
- { 42, 253, 252},
-
- {140, 48, 40},
- {136, 51, 136},
- {135, 52, 177},
- {134, 52, 217},
- {135, 56, 248},
- {134, 53, 255},
-
- {125, 125, 38},
- {124, 125, 125},
- {122, 124, 166},
- {123, 124, 207},
- {123, 122, 247},
- {124, 121, 255},
-
- {119, 160, 35},
- {117, 160, 120},
- {117, 160, 160},
- {115, 159, 201},
- {116, 158, 240},
- {117, 157, 255},
-
- {113, 195, 39},
- {110, 194, 114},
- {111, 194, 154},
- {108, 194, 194},
- {109, 193, 234},
- {108, 192, 255},
-
- {105, 228, 30},
- {103, 228, 109},
- {105, 228, 148},
- {100, 227, 188},
- { 99, 227, 227},
- { 99, 226, 253},
-
- { 92, 253, 34},
- { 96, 253, 103},
- { 97, 253, 142},
- { 88, 253, 182},
- { 93, 253, 221},
- { 88, 254, 251},
-
- {177, 53, 34},
- {174, 54, 131},
- {172, 55, 172},
- {171, 57, 213},
- {170, 55, 249},
- {170, 57, 255},
-
- {165, 123, 37},
- {163, 123, 123},
- {162, 123, 164},
- {161, 122, 205},
- {161, 121, 241},
- {161, 121, 255},
-
- {158, 159, 33},
- {157, 158, 118},
- {157, 158, 159},
- {155, 157, 199},
- {155, 157, 239},
- {154, 156, 255},
-
- {152, 193, 40},
- {151, 193, 113},
- {150, 193, 153},
- {150, 192, 193},
- {148, 192, 232},
- {149, 191, 253},
-
- {146, 227, 28},
- {144, 227, 108},
- {144, 227, 147},
- {144, 227, 187},
- {142, 226, 227},
- {142, 225, 252},
-
- {138, 253, 36},
- {137, 253, 102},
- {136, 253, 141},
- {138, 254, 181},
- {135, 255, 220},
- {133, 255, 250},
-
- {214, 57, 30},
- {211, 59, 126},
- {209, 57, 168},
- {208, 55, 208},
- {207, 58, 247},
- {206, 61, 255},
-
- {204, 121, 32},
- {202, 121, 121},
- {201, 121, 161},
- {200, 120, 202},
- {200, 120, 241},
- {198, 119, 255},
-
- {198, 157, 37},
- {196, 157, 116},
- {195, 156, 157},
- {195, 156, 197},
- {194, 155, 236},
- {193, 155, 255},
-
- {191, 192, 36},
- {190, 191, 112},
- {189, 191, 152},
- {189, 191, 191},
- {188, 190, 230},
- {187, 190, 253},
-
- {185, 226, 28},
- {184, 226, 106},
- {183, 225, 146},
- {183, 225, 186},
- {182, 225, 225},
- {181, 224, 252},
-
- {178, 255, 35},
- {178, 255, 101},
- {177, 254, 141},
- {176, 254, 180},
- {176, 254, 220},
- {175, 253, 249},
-
- {247, 56, 30},
- {245, 57, 122},
- {243, 59, 163},
- {244, 60, 204},
- {242, 59, 241},
- {240, 55, 255},
-
- {241, 119, 36},
- {240, 120, 118},
- {238, 119, 158},
- {237, 119, 199},
- {237, 118, 238},
- {236, 118, 255},
-
- {235, 154, 36},
- {235, 154, 114},
- {234, 154, 154},
- {232, 154, 194},
- {232, 153, 234},
- {232, 153, 255},
-
- {230, 190, 30},
- {229, 189, 110},
- {228, 189, 150},
- {227, 189, 190},
- {227, 189, 229},
- {226, 188, 255},
-
- {224, 224, 35},
- {223, 224, 105},
- {222, 224, 144},
- {222, 223, 184},
- {222, 223, 224},
- {220, 223, 253},
-
- {217, 253, 28},
- {217, 253, 99},
- {216, 252, 139},
- {216, 252, 179},
- {215, 252, 218},
- {215, 251, 250},
-
- {255, 61, 30},
- {255, 60, 118},
- {255, 58, 159},
- {255, 56, 199},
- {255, 55, 238},
- {255, 59, 255},
-
- {255, 117, 29},
- {255, 117, 115},
- {255, 117, 155},
- {255, 117, 195},
- {255, 116, 235},
- {254, 116, 255},
-
- {255, 152, 27},
- {255, 152, 111},
- {254, 152, 152},
- {255, 152, 192},
- {254, 151, 231},
- {253, 151, 253},
-
- {255, 187, 33},
- {253, 187, 107},
- {252, 187, 148},
- {253, 187, 187},
- {254, 187, 227},
- {252, 186, 252},
-
- {252, 222, 34},
- {251, 222, 103},
- {251, 222, 143},
- {250, 222, 182},
- {251, 221, 222},
- {252, 221, 252},
-
- {251, 252, 15},
- {251, 252, 97},
- {249, 252, 137},
- {247, 252, 177},
- {247, 253, 217},
- {254, 255, 255},
-
- // Grayscale
-
- { 52, 53, 53},
- { 57, 58, 59},
- { 66, 67, 67},
- { 75, 76, 76},
- { 83, 85, 85},
- { 92, 93, 94},
-
- {101, 102, 102},
- {109, 111, 111},
- {118, 119, 119},
- {126, 127, 128},
- {134, 136, 136},
- {143, 144, 145},
-
- {151, 152, 153},
- {159, 161, 161},
- {167, 169, 169},
- {176, 177, 177},
- {184, 185, 186},
- {192, 193, 194},
-
- {200, 201, 202},
- {208, 209, 210},
- {216, 218, 218},
- {224, 226, 226},
- {232, 234, 234},
- {240, 242, 242},
- };
-
- for (size_t i = 0; i < sizeof(rgbColors) / sizeof(rgbColors[0]); ++i) {
- [mColors addObject:DDMakeColor(rgbColors[i].r, rgbColors[i].g, rgbColors[i].b)];
- }
-
- // Color codes
- int index = 16;
- while (index < 256) {
- [mCodesFg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
- [mCodesBg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
-
- index++;
- }
-
-#else /* if MAP_TO_TERMINAL_APP_COLORS */
-
- // Standard xterm colors:
- //
- // These are the colors xterm shells use in xterm-256color mode.
- // In this mode, the shell supports 256 different colors, specified by 256 color codes.
- //
- // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode.
- // These are generally configurable, and thus we ignore them for the purposes of mapping,
- // as we can't rely on them being constant. They are largely duplicated anyway.
- //
- // The next 216 color codes are designed to run the spectrum, with several shades of every color.
- // The last 24 color codes represent a grayscale.
- //
- // While the color codes are standardized, the actual RGB values for each color code is not.
- // However most standard xterms follow a well known color chart,
- // which can easily be calculated using the simple formula below.
- //
- // More information about ansi escape codes can be found online.
- // http://en.wikipedia.org/wiki/ANSI_escape_code
-
- int index = 16;
-
- int r; // red
- int g; // green
- int b; // blue
-
- int ri; // r increment
- int gi; // g increment
- int bi; // b increment
-
- // Calculate xterm colors (using standard algorithm)
-
- int r = 0;
- int g = 0;
- int b = 0;
-
- for (ri = 0; ri < 6; ri++) {
- r = (ri == 0) ? 0 : 95 + (40 * (ri - 1));
-
- for (gi = 0; gi < 6; gi++) {
- g = (gi == 0) ? 0 : 95 + (40 * (gi - 1));
-
- for (bi = 0; bi < 6; bi++) {
- b = (bi == 0) ? 0 : 95 + (40 * (bi - 1));
-
- [mCodesFg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
- [mCodesBg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
- [mColors addObject:DDMakeColor(r, g, b)];
-
- index++;
- }
- }
- }
-
- // Calculate xterm grayscale (using standard algorithm)
-
- r = 8;
- g = 8;
- b = 8;
-
- while (index < 256) {
- [mCodesFg addObject:[NSString stringWithFormat:@"38;5;%dm", index]];
- [mCodesBg addObject:[NSString stringWithFormat:@"48;5;%dm", index]];
- [mColor s addObject:DDMakeColor(r, g, b)];
-
- r += 10;
- g += 10;
- b += 10;
-
- index++;
- }
-
-#endif /* if MAP_TO_TERMINAL_APP_COLORS */
-
- codesFg = [mCodesFg copy];
- codesBg = [mCodesBg copy];
- colors = [mColors copy];
-
- NSAssert([codesFg count] == [codesBg count], @"Invalid colors/codes array(s)");
- NSAssert([codesFg count] == [colors count], @"Invalid colors/codes array(s)");
-}
-
-+ (void)getRed:(CGFloat *)rPtr green:(CGFloat *)gPtr blue:(CGFloat *)bPtr fromColor:(DDColor *)color {
-#if TARGET_OS_IPHONE
-
- // iOS
- __auto_type done = NO;
-
- if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
- done = [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
- }
-
- if (!done) {
- // The method getRed:green:blue:alpha: was only available starting iOS 5.
- // So in iOS 4 and earlier, we have to jump through hoops.
-
- __auto_type rgbColorSpace = CGColorSpaceCreateDeviceRGB();
-
- unsigned char pixel[4];
- __auto_type context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, rgbColorSpace, (CGBitmapInfo)(kCGBitmapAlphaInfoMask & kCGImageAlphaNoneSkipLast));
-
- CGContextSetFillColorWithColor(context, [color CGColor]);
- CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
-
- if (rPtr) {
- *rPtr = pixel[0] / 255.0;
- }
- if (gPtr) {
- *gPtr = pixel[1] / 255.0;
- }
- if (bPtr) {
- *bPtr = pixel[2] / 255.0;
- }
-
- CGContextRelease(context);
- CGColorSpaceRelease(rgbColorSpace);
- }
-
-#elif defined(DD_CLI) || !__has_include(<AppKit/NSColor.h>)
-
- // OS X without AppKit
- [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
-
-#else /* if TARGET_OS_IPHONE */
-
- // OS X with AppKit
- NSColor *safeColor;
- if (@available(macOS 10.14,*)) {
- safeColor = [color colorUsingColorSpace:NSColorSpace.deviceRGBColorSpace];
- } else {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- safeColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
-#pragma clang diagnostic pop
- }
-
- [safeColor getRed:rPtr green:gPtr blue:bPtr alpha:NULL];
-
-#endif /* if TARGET_OS_IPHONE */
-}
-
-/**
- * Maps the given color to the closest available color supported by the shell.
- * The shell may support 256 colors, or only 16.
- *
- * This method loops through the known supported color set, and calculates the closest color.
- * The array index of that color, within the colors array, is then returned.
- * This array index may also be used as the index within the `codesFg` and `codesBg` arrays.
- **/
-+ (NSUInteger)codeIndexForColor:(DDColor *)inColor {
- CGFloat inR, inG, inB;
-
- [self getRed:&inR green:&inG blue:&inB fromColor:inColor];
-
- NSUInteger bestIndex = 0;
- CGFloat lowestDistance = 100.0;
-
- NSUInteger i = 0;
-
- for (DDColor *color in colors) {
- // Calculate Euclidean distance (lower value means closer to given color)
-
- CGFloat r, g, b;
- [self getRed:&r green:&g blue:&b fromColor:color];
-
-#if CGFLOAT_IS_DOUBLE
- __auto_type distance = sqrt(pow(r - inR, 2.0) + pow(g - inG, 2.0) + pow(b - inB, 2.0));
-#else
- __auto_type distance = sqrtf(powf(r - inR, 2.0f) + powf(g - inG, 2.0f) + powf(b - inB, 2.0f));
-#endif
-
- NSLogVerbose(@"DDTTYLogger: %3lu : %.3f,%.3f,%.3f & %.3f,%.3f,%.3f = %.6f",
- (unsigned long)i, (double)inR, (double)inG, (double)inB, (double)r, (double)g, (double)b, (double)distance);
-
- if (distance < lowestDistance) {
- bestIndex = i;
- lowestDistance = distance;
-
- NSLogVerbose(@"DDTTYLogger: New best index = %lu", (unsigned long)bestIndex);
- }
-
- i++;
- }
-
- return bestIndex;
-}
-
-+ (instancetype)sharedInstance {
- static dispatch_once_t DDTTYLoggerOnceToken;
-
- dispatch_once(&DDTTYLoggerOnceToken, ^{
- // Xcode does NOT natively support colors in the Xcode debugging console.
- // You'll need to install the XcodeColors plugin to see colors in the Xcode console.
- //
- // PS - Please read the header file before diving into the source code.
-
- __auto_type xcodeColors = getenv("XcodeColors");
- __auto_type term = getenv("TERM");
-
- if (xcodeColors && (strcmp(xcodeColors, "YES") == 0)) {
- isaXcodeColorTTY = YES;
- } else if (term) {
- if (strcasestr(term, "color") != NULL) {
- isaColorTTY = YES;
- isaColor256TTY = (strcasestr(term, "256") != NULL);
-
- if (isaColor256TTY) {
- [self initializeColors256];
- } else {
- [self initializeColors16];
- }
- }
- }
-
- NSLogInfo(@"DDTTYLogger: isaColorTTY = %@", (isaColorTTY ? @"YES" : @"NO"));
- NSLogInfo(@"DDTTYLogger: isaColor256TTY: %@", (isaColor256TTY ? @"YES" : @"NO"));
- NSLogInfo(@"DDTTYLogger: isaXcodeColorTTY: %@", (isaXcodeColorTTY ? @"YES" : @"NO"));
-
- sharedInstance = [[self alloc] init];
- });
-
- return sharedInstance;
-}
-
-- (instancetype)init {
- if (sharedInstance != nil) {
- return nil;
- }
-
-#if !defined(DD_CLI) || __has_include(<AppKit/NSColor.h>)
- if (@available(iOS 10.0, macOS 10.12, tvOS 10.0, watchOS 3.0, *)) {
- NSLogWarn(@"CocoaLumberjack: Warning: Usage of DDTTYLogger detected when DDOSLogger is available and can be used! Please consider migrating to DDOSLogger.");
- }
-#endif
-
- if ((self = [super init])) {
- // Initialize 'app' variable (char *)
- _appName = [[NSProcessInfo processInfo] processName];
- _appLen = [_appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-
- if (_appLen == 0) {
- _appName = @"<UnnamedApp>";
- _appLen = [_appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
- }
-
- _app = (char *)calloc(_appLen + 1, sizeof(char));
- if (_app == NULL) {
- return nil;
- }
-
- BOOL processedAppName = [_appName getCString:_app maxLength:(_appLen + 1) encoding:NSUTF8StringEncoding];
- if (!processedAppName) {
- free(_app);
- return nil;
- }
-
- // Initialize 'pid' variable (char *)
-
- _processID = [NSString stringWithFormat:@"%i", (int)getpid()];
-
- _pidLen = [_processID lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
- _pid = (char *)calloc(_pidLen + 1, sizeof(char));
-
- if (_pid == NULL) {
- free(_app);
- return nil;
- }
-
- BOOL processedID = [_processID getCString:_pid maxLength:(_pidLen + 1) encoding:NSUTF8StringEncoding];
- if (!processedID) {
- free(_app);
- free(_pid);
- return nil;
- }
-
- // Initialize color stuff
-
- _colorsEnabled = NO;
- _colorProfilesArray = [[NSMutableArray alloc] initWithCapacity:8];
- _colorProfilesDict = [[NSMutableDictionary alloc] initWithCapacity:8];
-
- _automaticallyAppendNewlineForCustomFormatters = YES;
- }
-
- return self;
-}
-
-- (DDLoggerName)loggerName {
- return DDLoggerNameTTY;
-}
-
-- (void)loadDefaultColorProfiles {
- [self setForegroundColor:DDMakeColor(214, 57, 30) backgroundColor:nil forFlag:DDLogFlagError];
- [self setForegroundColor:DDMakeColor(204, 121, 32) backgroundColor:nil forFlag:DDLogFlagWarning];
-}
-
-- (BOOL)colorsEnabled {
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
- __block BOOL result;
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.loggerQueue, ^{
- result = self->_colorsEnabled;
- });
- });
-
- return result;
-}
-
-- (void)setColorsEnabled:(BOOL)newColorsEnabled {
- __auto_type block = ^{
- @autoreleasepool {
- self->_colorsEnabled = newColorsEnabled;
-
- if ([self->_colorProfilesArray count] == 0) {
- [self loadDefaultColorProfiles];
- }
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- // Note: The internal implementation MUST access the colorsEnabled variable directly,
- // This method is designed explicitly for external access.
- //
- // Using "self." syntax to go through this method will cause immediate deadlock.
- // This is the intended result. Fix it by accessing the ivar directly.
- // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster.
-
- DDAbstractLoggerAssertLockedPropertyAccess();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
-}
-
-- (void)setForegroundColor:(DDColor *)txtColor backgroundColor:(DDColor *)bgColor forFlag:(DDLogFlag)mask {
- [self setForegroundColor:txtColor backgroundColor:bgColor forFlag:mask context:LOG_CONTEXT_ALL];
-}
-
-- (void)setForegroundColor:(DDColor *)txtColor backgroundColor:(DDColor *)bgColor forFlag:(DDLogFlag)mask context:(NSInteger)ctxt {
- dispatch_block_t block = ^{
- @autoreleasepool {
- DDTTYLoggerColorProfile *newColorProfile = [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor
- backgroundColor:bgColor
- flag:mask
- context:ctxt];
- if (!newColorProfile) return;
-
- NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile);
-
- NSUInteger i = 0;
-
- for (DDTTYLoggerColorProfile *colorProfile in self->_colorProfilesArray) {
- if ((colorProfile->mask == mask) && (colorProfile->context == ctxt)) {
- break;
- }
-
- i++;
- }
-
- if (i < [self->_colorProfilesArray count]) {
- self->_colorProfilesArray[i] = newColorProfile;
- } else {
- [self->_colorProfilesArray addObject:newColorProfile];
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)setForegroundColor:(DDColor *)txtColor backgroundColor:(DDColor *)bgColor forTag:(id <NSCopying>)tag {
- NSAssert([(id <NSObject>)tag conformsToProtocol: @protocol(NSCopying)], @"Invalid tag");
-
- __auto_type block = ^{
- @autoreleasepool {
- __auto_type newColorProfile = [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor
- backgroundColor:bgColor
- flag:(DDLogFlag)0
- context:0];
-
- NSLogInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile);
-
- self->_colorProfilesDict[tag] = newColorProfile;
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)clearColorsForFlag:(DDLogFlag)mask {
- [self clearColorsForFlag:mask context:0];
-}
-
-- (void)clearColorsForFlag:(DDLogFlag)mask context:(NSInteger)context {
- __auto_type block = ^{
- @autoreleasepool {
- NSUInteger i = 0;
-
- for (DDTTYLoggerColorProfile *colorProfile in self->_colorProfilesArray) {
- if ((colorProfile->mask == mask) && (colorProfile->context == context)) {
- break;
- }
-
- i++;
- }
-
- if (i < [self->_colorProfilesArray count]) {
- [self->_colorProfilesArray removeObjectAtIndex:i];
- }
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)clearColorsForTag:(id <NSCopying>)tag {
- NSAssert([(id <NSObject>) tag conformsToProtocol: @protocol(NSCopying)], @"Invalid tag");
-
- __auto_type block = ^{
- @autoreleasepool {
- [self->_colorProfilesDict removeObjectForKey:tag];
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)clearColorsForAllFlags {
- __auto_type block = ^{
- @autoreleasepool {
- [self->_colorProfilesArray removeAllObjects];
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)clearColorsForAllTags {
- __auto_type block = ^{
- @autoreleasepool {
- [self->_colorProfilesDict removeAllObjects];
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)clearAllColors {
- __auto_type block = ^{
- @autoreleasepool {
- [self->_colorProfilesArray removeAllObjects];
- [self->_colorProfilesDict removeAllObjects];
- }
- };
-
- // The design of the setter logic below is taken from the DDAbstractLogger implementation.
- // For documentation please refer to the DDAbstractLogger implementation.
-
- if ([self isOnInternalLoggerQueue]) {
- block();
- } else {
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue();
- dispatch_async(DDLog.loggingQueue, ^{
- dispatch_async(self.loggerQueue, block);
- });
- }
-}
-
-- (void)logMessage:(DDLogMessage *)logMessage {
- __auto_type logMsg = logMessage->_message;
- __auto_type isFormatted = NO;
-
- if (_logFormatter) {
- logMsg = [_logFormatter formatLogMessage:logMessage];
- isFormatted = logMsg != logMessage->_message;
- }
-
- if (logMsg) {
- // Search for a color profile associated with the log message
-
- DDTTYLoggerColorProfile *colorProfile = nil;
-
- if (_colorsEnabled) {
- if (logMessage->_representedObject) {
- colorProfile = _colorProfilesDict[logMessage->_representedObject];
- }
-
- if (colorProfile == nil) {
- for (DDTTYLoggerColorProfile *cp in _colorProfilesArray) {
- if (logMessage->_flag & cp->mask) {
- // Color profile set for this context?
- if (logMessage->_context == cp->context) {
- colorProfile = cp;
-
- // Stop searching
- break;
- }
-
- // Check if LOG_CONTEXT_ALL was specified as a default color for this flag
- if (cp->context == LOG_CONTEXT_ALL) {
- colorProfile = cp;
-
- // We don't break to keep searching for more specific color profiles for the context
- }
- }
- }
- }
- }
-
- // Convert log message to C string.
- //
- // We use the stack instead of the heap for speed if possible.
- // But we're extra cautious to avoid a stack overflow.
-
- __auto_type msgLen = [logMsg lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
- const __auto_type useStack = msgLen < (1024 * 4);
-
- char *msg;
- if (useStack) {
- msg = (char *)alloca(msgLen + 1);
- } else {
- msg = (char *)calloc(msgLen + 1, sizeof(char));
- }
- if (msg == NULL) {
- return;
- }
-
- BOOL logMsgEnc = [logMsg getCString:msg maxLength:(msgLen + 1) encoding:NSUTF8StringEncoding];
- if (!logMsgEnc) {
- if (!useStack) {
- free(msg);
- }
- return;
- }
-
- // Write the log message to STDERR
-
- if (isFormatted) {
- // The log message has already been formatted.
- const size_t maxIovecLen = 5;
- size_t iovecLen = _automaticallyAppendNewlineForCustomFormatters ? 5 : 4;
- struct iovec v[maxIovecLen] = { 0 };
-
- if (colorProfile) {
- v[0].iov_base = colorProfile->fgCode;
- v[0].iov_len = colorProfile->fgCodeLen;
-
- v[1].iov_base = colorProfile->bgCode;
- v[1].iov_len = colorProfile->bgCodeLen;
-
- v[maxIovecLen - 1].iov_base = colorProfile->resetCode;
- v[maxIovecLen - 1].iov_len = colorProfile->resetCodeLen;
- }
-
- v[2].iov_base = msg;
- v[2].iov_len = (msgLen > SIZE_MAX - 1) ? SIZE_MAX - 1 : msgLen;
-
- if (_automaticallyAppendNewlineForCustomFormatters && (v[2].iov_len == 0 || msg[v[2].iov_len - 1] != '\n')) {
- v[3].iov_base = "\n";
- v[3].iov_len = 1;
- iovecLen = 5;
- }
-
- writev(STDERR_FILENO, v, (int)iovecLen);
- } else {
- // The log message is unformatted, so apply standard NSLog style formatting.
-
- int len;
- char ts[24] = "";
- size_t tsLen = 0;
-
- // Calculate timestamp.
- // The technique below is faster than using NSDateFormatter.
- if (logMessage->_timestamp) {
- __auto_type epoch = [logMessage->_timestamp timeIntervalSince1970];
- double integral;
- __auto_type fract = modf(epoch, &integral);
- struct tm tm;
- __auto_type time = (time_t)integral;
- (void)localtime_r(&time, &tm);
- __auto_type milliseconds = (long)(fract * 1000.0);
-
- len = snprintf(ts, 24, "%04d-%02d-%02d %02d:%02d:%02d:%03ld", // yyyy-MM-dd HH:mm:ss:SSS
- tm.tm_year + 1900,
- tm.tm_mon + 1,
- tm.tm_mday,
- tm.tm_hour,
- tm.tm_min,
- tm.tm_sec, milliseconds);
-
- tsLen = (NSUInteger)MAX(MIN(24 - 1, len), 0);
- }
-
- // Calculate thread ID
- //
- // How many characters do we need for the thread id?
- // logMessage->machThreadID is of type mach_port_t, which is an unsigned int.
- //
- // 1 hex char = 4 bits
- // 8 hex chars for 32 bit, plus ending '\0' = 9
-
- char tid[9];
- len = snprintf(tid, 9, "%s", [logMessage->_threadID cStringUsingEncoding:NSUTF8StringEncoding]);
-
- __auto_type tidLen = (NSUInteger)MAX(MIN(9 - 1, len), 0);
-
- // Here is our format: "%s %s[%i:%s] %s", timestamp, appName, processID, threadID, logMsg
-
- struct iovec v[13];
-
- if (colorProfile) {
- v[0].iov_base = colorProfile->fgCode;
- v[0].iov_len = colorProfile->fgCodeLen;
-
- v[1].iov_base = colorProfile->bgCode;
- v[1].iov_len = colorProfile->bgCodeLen;
-
- v[12].iov_base = colorProfile->resetCode;
- v[12].iov_len = colorProfile->resetCodeLen;
- } else {
- v[0].iov_base = "";
- v[0].iov_len = 0;
-
- v[1].iov_base = "";
- v[1].iov_len = 0;
-
- v[12].iov_base = "";
- v[12].iov_len = 0;
- }
-
- v[2].iov_base = ts;
- v[2].iov_len = tsLen;
-
- v[3].iov_base = " ";
- v[3].iov_len = 1;
-
- v[4].iov_base = _app;
- v[4].iov_len = _appLen;
-
- v[5].iov_base = "[";
- v[5].iov_len = 1;
-
- v[6].iov_base = _pid;
- v[6].iov_len = _pidLen;
-
- v[7].iov_base = ":";
- v[7].iov_len = 1;
-
- v[8].iov_base = tid;
- v[8].iov_len = MIN((size_t)8, tidLen); // snprintf doesn't return what you might think
-
- v[9].iov_base = "] ";
- v[9].iov_len = 2;
-
- v[10].iov_base = (char *)msg;
- v[10].iov_len = msgLen;
-
- v[11].iov_base = "\n";
- v[11].iov_len = (msg[msgLen] == '\n') ? 0 : 1;
-
- writev(STDERR_FILENO, v, 13);
- }
-
- if (!useStack) {
- free(msg);
- }
- }
-}
-
-@end
-
-#pragma mark -
-
-@implementation DDTTYLoggerColorProfile
-
-- (instancetype)initWithForegroundColor:(DDColor *)fgColor backgroundColor:(DDColor *)bgColor flag:(DDLogFlag)aMask context:(NSInteger)ctxt {
- if ((self = [super init])) {
- mask = aMask;
- context = ctxt;
-
- CGFloat r, g, b;
-
- if (fgColor) {
- [DDTTYLogger getRed:&r green:&g blue:&b fromColor:fgColor];
-
- fg.r = (uint8_t)(r * (CGFloat)255.0);
- fg.g = (uint8_t)(g * (CGFloat)255.0);
- fg.b = (uint8_t)(b * (CGFloat)255.0);
- }
-
- if (bgColor) {
- [DDTTYLogger getRed:&r green:&g blue:&b fromColor:bgColor];
-
- bg.r = (uint8_t)(r * (CGFloat)255.0);
- bg.g = (uint8_t)(g * (CGFloat)255.0);
- bg.b = (uint8_t)(b * (CGFloat)255.0);
- }
-
- if (fgColor && isaColorTTY) {
- // Map foreground color to closest available shell color
-
- fgCodeIndex = [DDTTYLogger codeIndexForColor:fgColor];
- fgCodeRaw = codesFg[fgCodeIndex];
-
- const __auto_type escapeSeq = @"\033[";
-
- __auto_type len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
- __auto_type len2 = [fgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-
- BOOL escapeSeqEnc = [escapeSeq getCString:(fgCode) maxLength:(len1 + 1) encoding:NSUTF8StringEncoding];
- BOOL fgCodeRawEsc = [fgCodeRaw getCString:(fgCode + len1) maxLength:(len2 + 1) encoding:NSUTF8StringEncoding];
-
- if (!escapeSeqEnc || !fgCodeRawEsc) {
- return nil;
- }
-
- fgCodeLen = len1 + len2;
- } else if (fgColor && isaXcodeColorTTY) {
- // Convert foreground color to color code sequence
- const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ;
- __auto_type result = snprintf(fgCode, 24, "%sfg%u,%u,%u;", escapeSeq, fg.r, fg.g, fg.b);
- fgCodeLen = (NSUInteger)MAX(MIN(result, (24 - 1)), 0);
- } else {
- // No foreground color or no color support
- fgCode[0] = '\0';
- fgCodeLen = 0;
- }
-
- if (bgColor && isaColorTTY) {
- // Map background color to closest available shell color
-
- bgCodeIndex = [DDTTYLogger codeIndexForColor:bgColor];
- bgCodeRaw = codesBg[bgCodeIndex];
-
- const __auto_type escapeSeq = @"\033[";
-
- __auto_type len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
- __auto_type len2 = [bgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-
- BOOL escapeSeqEnc = [escapeSeq getCString:(bgCode) maxLength:(len1 + 1) encoding:NSUTF8StringEncoding];
- BOOL bgCodeRawEsc = [bgCodeRaw getCString:(bgCode + len1) maxLength:(len2 + 1) encoding:NSUTF8StringEncoding];
-
- if (!escapeSeqEnc || !bgCodeRawEsc) {
- return nil;
- }
-
- bgCodeLen = len1 + len2;
- } else if (bgColor && isaXcodeColorTTY) {
- // Convert background color to color code sequence
- const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ;
- __auto_type result = snprintf(bgCode, 24, "%sbg%u,%u,%u;", escapeSeq, bg.r, bg.g, bg.b);
- bgCodeLen = (NSUInteger)MAX(MIN(result, (24 - 1)), 0);
- } else {
- // No background color or no color support
- bgCode[0] = '\0';
- bgCodeLen = 0;
- }
-
- if (isaColorTTY) {
- resetCodeLen = (NSUInteger)MAX(snprintf(resetCode, 8, "\033[0m"), 0);
- } else if (isaXcodeColorTTY) {
- resetCodeLen = (NSUInteger)MAX(snprintf(resetCode, 8, XCODE_COLORS_RESET), 0);
- } else {
- resetCode[0] = '\0';
- resetCodeLen = 0;
- }
- }
-
- return self;
-}
-
-- (NSString *)description {
- return [NSString stringWithFormat:
- @"<DDTTYLoggerColorProfile: %p mask:%i ctxt:%ld fg:%u,%u,%u bg:%u,%u,%u fgCode:%@ bgCode:%@>",
- self, (int)mask, (long)context, fg.r, fg.g, fg.b, bg.r, bg.g, bg.b, fgCodeRaw, bgCodeRaw];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter+Deprecated.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter+Deprecated.m
deleted file mode 100644
index c05db19f..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter+Deprecated.m
+++ /dev/null
@@ -1,57 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDContextFilterLogFormatter+Deprecated.h>
-
-@implementation DDContextAllowlistFilterLogFormatter (Deprecated)
-
-- (void)addToWhitelist:(NSInteger)loggingContext {
- [self addToAllowlist:loggingContext];
-}
-
-- (void)removeFromWhitelist:(NSInteger)loggingContext {
- [self removeFromAllowlist:loggingContext];
-}
-
-- (NSArray *)whitelist {
- return [self allowlist];
-}
-
-- (BOOL)isOnWhitelist:(NSInteger)loggingContext {
- return [self isOnAllowlist:loggingContext];
-}
-
-@end
-
-
-@implementation DDContextDenylistFilterLogFormatter (Deprecated)
-
-- (void)addToBlacklist:(NSInteger)loggingContext {
- [self addToDenylist:loggingContext];
-}
-
-- (void)removeFromBlacklist:(NSInteger)loggingContext {
- [self removeFromDenylist:loggingContext];
-}
-
-- (NSArray *)blacklist {
- return [self denylist];
-}
-
-- (BOOL)isOnBlacklist:(NSInteger)loggingContext {
- return [self isOnDenylist:loggingContext];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter.m
deleted file mode 100755
index 271cd4b9..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDContextFilterLogFormatter.m
+++ /dev/null
@@ -1,185 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <pthread/pthread.h>
-
-#import <CocoaLumberjack/DDContextFilterLogFormatter.h>
-
-@interface DDLoggingContextSet : NSObject
-
-@property (readonly, copy, nonnull) NSArray *currentSet;
-
-- (void)addToSet:(NSInteger)loggingContext;
-- (void)removeFromSet:(NSInteger)loggingContext;
-
-- (BOOL)isInSet:(NSInteger)loggingContext;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDContextAllowlistFilterLogFormatter () {
- DDLoggingContextSet *_contextSet;
-}
-@end
-
-@implementation DDContextAllowlistFilterLogFormatter
-
-- (instancetype)init {
- if ((self = [super init])) {
- _contextSet = [[DDLoggingContextSet alloc] init];
- }
- return self;
-}
-
-- (void)addToAllowlist:(NSInteger)loggingContext {
- [_contextSet addToSet:loggingContext];
-}
-
-- (void)removeFromAllowlist:(NSInteger)loggingContext {
- [_contextSet removeFromSet:loggingContext];
-}
-
-- (NSArray *)allowlist {
- return [_contextSet currentSet];
-}
-
-- (BOOL)isOnAllowlist:(NSInteger)loggingContext {
- return [_contextSet isInSet:loggingContext];
-}
-
-- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
- if ([self isOnAllowlist:logMessage->_context]) {
- return logMessage->_message;
- } else {
- return nil;
- }
-}
-
-@end
-
-
-@interface DDContextDenylistFilterLogFormatter () {
- DDLoggingContextSet *_contextSet;
-}
-@end
-
-@implementation DDContextDenylistFilterLogFormatter
-
-- (instancetype)init {
- if ((self = [super init])) {
- _contextSet = [[DDLoggingContextSet alloc] init];
- }
- return self;
-}
-
-- (void)addToDenylist:(NSInteger)loggingContext {
- [_contextSet addToSet:loggingContext];
-}
-
-- (void)removeFromDenylist:(NSInteger)loggingContext {
- [_contextSet removeFromSet:loggingContext];
-}
-
-- (NSArray *)denylist {
- return [_contextSet currentSet];
-}
-
-- (BOOL)isOnDenylist:(NSInteger)loggingContext {
- return [_contextSet isInSet:loggingContext];
-}
-
-- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
- if ([self isOnDenylist:logMessage->_context]) {
- return nil;
- } else {
- return logMessage->_message;
- }
-}
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@interface DDLoggingContextSet () {
- pthread_mutex_t _mutex;
- NSMutableSet *_set;
-}
-@end
-
-@implementation DDLoggingContextSet
-
-- (instancetype)init {
- if ((self = [super init])) {
- _set = [[NSMutableSet alloc] init];
- pthread_mutex_init(&_mutex, NULL);
- }
-
- return self;
-}
-
-- (void)dealloc {
- pthread_mutex_destroy(&_mutex);
-}
-
-- (void)addToSet:(NSInteger)loggingContext {
- pthread_mutex_lock(&_mutex);
- {
- [_set addObject:@(loggingContext)];
- }
- pthread_mutex_unlock(&_mutex);
-}
-
-- (void)removeFromSet:(NSInteger)loggingContext {
- pthread_mutex_lock(&_mutex);
- {
- [_set removeObject:@(loggingContext)];
- }
- pthread_mutex_unlock(&_mutex);
-}
-
-- (NSArray *)currentSet {
- NSArray *result = nil;
-
- pthread_mutex_lock(&_mutex);
- {
- result = [_set allObjects];
- }
- pthread_mutex_unlock(&_mutex);
-
- return result;
-}
-
-- (BOOL)isInSet:(NSInteger)loggingContext {
- __auto_type result = NO;
-
- pthread_mutex_lock(&_mutex);
- {
- result = [_set containsObject:@(loggingContext)];
- }
- pthread_mutex_unlock(&_mutex);
-
- return result;
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDDispatchQueueLogFormatter.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDDispatchQueueLogFormatter.m
deleted file mode 100755
index d3488551..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDDispatchQueueLogFormatter.m
+++ /dev/null
@@ -1,240 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <pthread/pthread.h>
-#import <stdatomic.h>
-#import <sys/qos.h>
-
-#import <CocoaLumberjack/DDDispatchQueueLogFormatter.h>
-
-DDQualityOfServiceName const DDQualityOfServiceUserInteractive = @"UI";
-DDQualityOfServiceName const DDQualityOfServiceUserInitiated = @"IN";
-DDQualityOfServiceName const DDQualityOfServiceDefault = @"DF";
-DDQualityOfServiceName const DDQualityOfServiceUtility = @"UT";
-DDQualityOfServiceName const DDQualityOfServiceBackground = @"BG";
-DDQualityOfServiceName const DDQualityOfServiceUnspecified = @"UN";
-
-static DDQualityOfServiceName _qos_name(NSUInteger qos) {
- switch ((qos_class_t) qos) {
- case QOS_CLASS_USER_INTERACTIVE: return DDQualityOfServiceUserInteractive;
- case QOS_CLASS_USER_INITIATED: return DDQualityOfServiceUserInitiated;
- case QOS_CLASS_DEFAULT: return DDQualityOfServiceDefault;
- case QOS_CLASS_UTILITY: return DDQualityOfServiceUtility;
- case QOS_CLASS_BACKGROUND: return DDQualityOfServiceBackground;
- default: return DDQualityOfServiceUnspecified;
- }
-}
-
-#pragma mark - DDDispatchQueueLogFormatter
-
-@interface DDDispatchQueueLogFormatter () {
- NSDateFormatter *_dateFormatter; // Use [self stringFromDate]
-
- pthread_mutex_t _mutex;
-
- NSUInteger _minQueueLength; // _prefix == Only access via atomic property
- NSUInteger _maxQueueLength; // _prefix == Only access via atomic property
- NSMutableDictionary *_replacements; // _prefix == Only access from within spinlock
-}
-@end
-
-
-@implementation DDDispatchQueueLogFormatter
-
-- (instancetype)init {
- if ((self = [super init])) {
- _dateFormatter = [self createDateFormatter];
-
- pthread_mutex_init(&_mutex, NULL);
- _replacements = [[NSMutableDictionary alloc] init];
-
- // Set default replacements:
- _replacements[@"com.apple.main-thread"] = @"main";
- }
-
- return self;
-}
-
-- (instancetype)initWithMode:(DDDispatchQueueLogFormatterMode)mode {
- return [self init];
-}
-
-- (void)dealloc {
- pthread_mutex_destroy(&_mutex);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark Configuration
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@synthesize minQueueLength = _minQueueLength;
-@synthesize maxQueueLength = _maxQueueLength;
-
-- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel {
- NSString *result = nil;
-
- pthread_mutex_lock(&_mutex);
- {
- result = _replacements[longLabel];
- }
- pthread_mutex_unlock(&_mutex);
-
- return result;
-}
-
-- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel {
- pthread_mutex_lock(&_mutex);
- {
- if (shortLabel) {
- _replacements[longLabel] = shortLabel;
- } else {
- [_replacements removeObjectForKey:longLabel];
- }
- }
- pthread_mutex_unlock(&_mutex);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark DDLogFormatter
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-- (NSDateFormatter *)createDateFormatter {
- NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- [self configureDateFormatter:formatter];
- return formatter;
-}
-
-- (void)configureDateFormatter:(NSDateFormatter *)dateFormatter {
- [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
- [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss:SSS"];
- [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
- [dateFormatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]];
-}
-
-- (NSString *)stringFromDate:(NSDate *)date {
- return [_dateFormatter stringFromDate:date];
-}
-
-- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage {
- // As per the DDLogFormatter contract, this method is always invoked on the same thread/dispatch_queue
-
- __auto_type useQueueLabel = NO;
- if (logMessage->_queueLabel) {
- useQueueLabel = YES;
-
- // If you manually create a thread, it's dispatch_queue will have one of the thread names below.
- // Since all such threads have the same name, we'd prefer to use the threadName or the machThreadID.
- const NSArray<NSString *> *names = @[
- @"com.apple.root.low-priority",
- @"com.apple.root.default-priority",
- @"com.apple.root.high-priority",
- @"com.apple.root.low-overcommit-priority",
- @"com.apple.root.default-overcommit-priority",
- @"com.apple.root.high-overcommit-priority",
- @"com.apple.root.default-qos.overcommit",
- ];
- for (NSString *name in names) {
- if ([logMessage->_queueLabel isEqualToString:name]) {
- useQueueLabel = NO;
- break;
- }
- }
- }
-
- // Get the name of the queue, thread, or machID (whichever we are to use).
- NSString *queueThreadLabel;
- if (useQueueLabel || [logMessage->_threadName length] > 0) {
- __auto_type fullLabel = useQueueLabel ? logMessage->_queueLabel : logMessage->_threadName;
-
- NSString *abrvLabel;
- pthread_mutex_lock(&_mutex);
- {
- abrvLabel = _replacements[fullLabel];
- }
- pthread_mutex_unlock(&_mutex);
-
- queueThreadLabel = abrvLabel ?: fullLabel;
- } else {
- queueThreadLabel = logMessage->_threadID;
- }
-
- // Now use the thread label in the output
- // labelLength > maxQueueLength : truncate
- // labelLength < minQueueLength : padding
- // : exact
- __auto_type minQueueLength = self.minQueueLength;
- __auto_type maxQueueLength = self.maxQueueLength;
- __auto_type labelLength = [queueThreadLabel length];
- if (maxQueueLength > 0 && labelLength > maxQueueLength) {
- // Truncate
- return [queueThreadLabel substringToIndex:maxQueueLength];
- } else if (labelLength < minQueueLength) {
- // Padding
- return [queueThreadLabel stringByPaddingToLength:minQueueLength
- withString:@" "
- startingAtIndex:0];
- } else {
- // Exact
- return queueThreadLabel;
- }
-}
-
-- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
- __auto_type timestamp = [self stringFromDate:logMessage->_timestamp];
- __auto_type queueThreadLabel = [self queueThreadLabelForLogMessage:logMessage];
-
- return [NSString stringWithFormat:@"%@ [%@ (QOS:%@)] %@", timestamp, queueThreadLabel, _qos_name(logMessage->_qos), logMessage->_message];
-}
-
-@end
-
-#pragma mark - DDAtomicCounter
-
-@interface DDAtomicCounter() {
- atomic_int_fast32_t _value;
-}
-@end
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-@implementation DDAtomicCounter
-#pragma clang diagnostic pop
-
-- (instancetype)initWithDefaultValue:(int32_t)defaultValue {
- if ((self = [super init])) {
- atomic_init(&_value, defaultValue);
- }
- return self;
-}
-
-- (int32_t)value {
- return atomic_load_explicit(&_value, memory_order_relaxed);
-}
-
-- (int32_t)increment {
- int32_t old = atomic_fetch_add_explicit(&_value, 1, memory_order_relaxed);
- return (old + 1);
-}
-
-- (int32_t)decrement {
- int32_t old = atomic_fetch_sub_explicit(&_value, 1, memory_order_relaxed);
- return (old - 1);
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDFileLogger+Buffering.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDFileLogger+Buffering.m
deleted file mode 100644
index a620a3ed..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDFileLogger+Buffering.m
+++ /dev/null
@@ -1,202 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <sys/mount.h>
-
-#import <CocoaLumberjack/DDFileLogger+Buffering.h>
-#import "../DDFileLogger+Internal.h"
-
-static const NSUInteger kDDDefaultBufferSize = 4096; // 4 kB, block f_bsize on iphone7
-static const NSUInteger kDDMaxBufferSize = 1048576; // ~1 mB, f_iosize on iphone7
-
-// Reads attributes from base file system to determine buffer size.
-// see statfs in sys/mount.h for descriptions of f_iosize and f_bsize.
-// f_bsize == "default", and f_iosize == "max"
-static inline NSUInteger p_DDGetDefaultBufferSizeBytesMax(const BOOL max) {
- struct statfs *mountedFileSystems = NULL;
- __auto_type count = getmntinfo(&mountedFileSystems, 0);
-
- for (int i = 0; i < count; i++) {
- __auto_type mounted = mountedFileSystems[i];
- __auto_type name = mounted.f_mntonname;
-
- // We can use 2 as max here, since any length > 1 will fail the if-statement.
- if (strnlen(name, 2) == 1 && *name == '/') {
- return max ? (NSUInteger)mounted.f_iosize : (NSUInteger)mounted.f_bsize;
- }
- }
-
- return max ? kDDMaxBufferSize : kDDDefaultBufferSize;
-}
-
-static NSUInteger DDGetMaxBufferSizeBytes(void) {
- static NSUInteger maxBufferSize = 0;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- maxBufferSize = p_DDGetDefaultBufferSizeBytesMax(YES);
- });
- return maxBufferSize;
-}
-
-static NSUInteger DDGetDefaultBufferSizeBytes(void) {
- static NSUInteger defaultBufferSize = 0;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- defaultBufferSize = p_DDGetDefaultBufferSizeBytesMax(NO);
- });
- return defaultBufferSize;
-}
-
-@interface DDBufferedProxy : NSProxy
-
-@property (nonatomic) DDFileLogger *fileLogger;
-@property (nonatomic) NSOutputStream *buffer;
-
-@property (nonatomic) NSUInteger maxBufferSizeBytes;
-@property (nonatomic) NSUInteger currentBufferSizeBytes;
-
-@end
-
-@implementation DDBufferedProxy
-
-- (instancetype)initWithFileLogger:(DDFileLogger *)fileLogger {
- _fileLogger = fileLogger;
- _maxBufferSizeBytes = DDGetDefaultBufferSizeBytes();
- [self flushBuffer];
-
- return self;
-}
-
-- (void)dealloc {
- __auto_type block = ^{
- [self lt_sendBufferedDataToFileLogger];
- self.fileLogger = nil;
- };
-
- if ([self->_fileLogger isOnInternalLoggerQueue]) {
- block();
- } else {
- dispatch_sync(self->_fileLogger.loggerQueue, block);
- }
-}
-
-#pragma mark - Buffering
-
-- (void)flushBuffer {
- [_buffer close];
- _buffer = [NSOutputStream outputStreamToMemory];
- [_buffer open];
- _currentBufferSizeBytes = 0;
-}
-
-- (void)lt_sendBufferedDataToFileLogger {
- NSData *data = [_buffer propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
- [_fileLogger lt_logData:data];
- [self flushBuffer];
-}
-
-#pragma mark - Logging
-
-- (void)logMessage:(DDLogMessage *)logMessage {
- // Don't need to check for isOnInternalLoggerQueue, -lt_dataForMessage: will do it for us.
- __auto_type data = [_fileLogger lt_dataForMessage:logMessage];
-
- if (data.length == 0) {
- return;
- }
-
- [data enumerateByteRangesUsingBlock:^(const void * __nonnull bytes, NSRange byteRange, BOOL * __nonnull __unused stop) {
- __auto_type bytesLength = byteRange.length;
-#ifdef NS_BLOCK_ASSERTIONS
- __unused
-#endif
- __auto_type written = [_buffer write:bytes maxLength:bytesLength];
- NSAssert(written > 0 && (NSUInteger)written == bytesLength, @"Failed to write to memory buffer.");
-
- _currentBufferSizeBytes += bytesLength;
-
- if (_currentBufferSizeBytes >= _maxBufferSizeBytes) {
- [self lt_sendBufferedDataToFileLogger];
- }
- }];
-}
-
-- (void)flush {
- // This method is public.
- // We need to execute the rolling on our logging thread/queue.
-
- __auto_type block = ^{
- @autoreleasepool {
- [self lt_sendBufferedDataToFileLogger];
- [self.fileLogger flush];
- }
- };
-
- // The design of this method is taken from the DDAbstractLogger implementation.
- // For extensive documentation please refer to the DDAbstractLogger implementation.
-
- if ([self.fileLogger isOnInternalLoggerQueue]) {
- block();
- } else {
- NSAssert(![self.fileLogger isOnGlobalLoggingQueue], @"Core architecture requirement failure");
- dispatch_sync(DDLog.loggingQueue, ^{
- dispatch_sync(self.fileLogger.loggerQueue, block);
- });
- }
-}
-
-#pragma mark - Properties
-
-- (void)setMaxBufferSizeBytes:(NSUInteger)newBufferSizeBytes {
- _maxBufferSizeBytes = MIN(newBufferSizeBytes, DDGetMaxBufferSizeBytes());
-}
-
-#pragma mark - Wrapping
-
-- (DDFileLogger *)wrapWithBuffer {
- return (DDFileLogger *)self;
-}
-
-- (DDFileLogger *)unwrapFromBuffer {
- return (DDFileLogger *)self.fileLogger;
-}
-
-#pragma mark - NSProxy
-
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
- return [self.fileLogger methodSignatureForSelector:sel];
-}
-
-- (BOOL)respondsToSelector:(SEL)aSelector {
- return [self.fileLogger respondsToSelector:aSelector];
-}
-
-- (void)forwardInvocation:(NSInvocation *)invocation {
- [invocation invokeWithTarget:self.fileLogger];
-}
-
-@end
-
-@implementation DDFileLogger (Buffering)
-
-- (instancetype)wrapWithBuffer {
- return (DDFileLogger *)[[DDBufferedProxy alloc] initWithFileLogger:self];
-}
-
-- (instancetype)unwrapFromBuffer {
- return self;
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDMultiFormatter.m b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDMultiFormatter.m
deleted file mode 100644
index 07826523..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Extensions/DDMultiFormatter.m
+++ /dev/null
@@ -1,110 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#if !__has_feature(objc_arc)
-#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
-#endif
-
-#import <CocoaLumberjack/DDMultiFormatter.h>
-
-@interface DDMultiFormatter () {
- dispatch_queue_t _queue;
- NSMutableArray *_formatters;
-}
-
-- (DDLogMessage *)logMessageForLine:(NSString *)line originalMessage:(DDLogMessage *)message;
-
-@end
-
-
-@implementation DDMultiFormatter
-
-- (instancetype)init {
- self = [super init];
-
- if (self) {
- _queue = dispatch_queue_create("cocoa.lumberjack.multiformatter", DISPATCH_QUEUE_CONCURRENT);
- _formatters = [NSMutableArray new];
- }
-
- return self;
-}
-
-#pragma mark Processing
-
-- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
- __block __auto_type line = logMessage->_message;
-
- dispatch_sync(_queue, ^{
- for (id<DDLogFormatter> formatter in self->_formatters) {
- __auto_type message = [self logMessageForLine:line originalMessage:logMessage];
- line = [formatter formatLogMessage:message];
-
- if (!line) {
- break;
- }
- }
- });
-
- return line;
-}
-
-- (DDLogMessage *)logMessageForLine:(NSString *)line originalMessage:(DDLogMessage *)message {
- DDLogMessage *newMessage = [message copy];
- newMessage->_message = line;
- return newMessage;
-}
-
-#pragma mark Formatters
-
-- (NSArray *)formatters {
- __block NSArray *formatters;
-
- dispatch_sync(_queue, ^{
- formatters = [self->_formatters copy];
- });
-
- return formatters;
-}
-
-- (void)addFormatter:(id<DDLogFormatter>)formatter {
- dispatch_barrier_async(_queue, ^{
- [self->_formatters addObject:formatter];
- });
-}
-
-- (void)removeFormatter:(id<DDLogFormatter>)formatter {
- dispatch_barrier_async(_queue, ^{
- [self->_formatters removeObject:formatter];
- });
-}
-
-- (void)removeAllFormatters {
- dispatch_barrier_async(_queue, ^{
- [self->_formatters removeAllObjects];
- });
-}
-
-- (BOOL)isFormattingWithFormatter:(id<DDLogFormatter>)formatter {
- __block BOOL hasFormatter;
-
- dispatch_sync(_queue, ^{
- hasFormatter = [self->_formatters containsObject:formatter];
- });
-
- return hasFormatter;
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/PrivacyInfo.xcprivacy b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/PrivacyInfo.xcprivacy
deleted file mode 100644
index ec783fe6..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/PrivacyInfo.xcprivacy
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>NSPrivacyTracking</key>
- <false/>
- <key>NSPrivacyCollectedDataTypes</key>
- <array/>
- <key>NSPrivacyAccessedAPITypes</key>
- <array>
- <dict>
- <key>NSPrivacyAccessedAPIType</key>
- <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
- <key>NSPrivacyAccessedAPITypeReasons</key>
- <array>
- <string>C617.1</string>
- <string>0A2A.1</string>
- </array>
- </dict>
- <dict>
- <key>NSPrivacyAccessedAPIType</key>
- <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
- <key>NSPrivacyAccessedAPITypeReasons</key>
- <array>
- <string>E174.1</string>
- </array>
- </dict>
- </array>
-</dict>
-</plist>
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/CocoaLumberjack.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/CocoaLumberjack.h
deleted file mode 100644
index 91b24088..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/CocoaLumberjack.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-/**
- * Welcome to CocoaLumberjack!
- *
- * The project page has a wealth of documentation if you have any questions.
- * https://github.com/CocoaLumberjack/CocoaLumberjack
- *
- * If you're new to the project you may wish to read "Getting Started" at:
- * Documentation/GettingStarted.md
- *
- * Otherwise, here is a quick refresher.
- * There are three steps to using the macros:
- *
- * Step 1:
- * Import the header in your implementation or prefix file:
- *
- * #import <CocoaLumberjack/CocoaLumberjack.h>
- *
- * Step 2:
- * Define your logging level in your implementation file:
- *
- * // Log levels: off, error, warn, info, verbose
- * static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
- *
- * Step 2 [3rd party frameworks]:
- *
- * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel:
- *
- * // #undef LOG_LEVEL_DEF // Undefine first only if needed
- * #define LOG_LEVEL_DEF myLibLogLevel
- *
- * Define your logging level in your implementation file:
- *
- * // Log levels: off, error, warn, info, verbose
- * static const DDLogLevel myLibLogLevel = DDLogLevelVerbose;
- *
- * Step 3:
- * Replace your NSLog statements with DDLog statements according to the severity of the message.
- *
- * NSLog(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!");
- *
- * DDLog works exactly the same as NSLog.
- * This means you can pass it multiple variables just like NSLog.
- **/
-
-#import <Foundation/Foundation.h>
-
-//! Project version number for CocoaLumberjack.
-FOUNDATION_EXPORT double CocoaLumberjackVersionNumber;
-
-//! Project version string for CocoaLumberjack.
-FOUNDATION_EXPORT const unsigned char CocoaLumberjackVersionString[];
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-// Core
-#import <CocoaLumberjack/DDLog.h>
-
-// Main macros
-#import <CocoaLumberjack/DDLogMacros.h>
-#import <CocoaLumberjack/DDAssertMacros.h>
-
-// Capture ASL
-#import <CocoaLumberjack/DDASLLogCapture.h>
-
-// Loggers
-#import <CocoaLumberjack/DDLoggerNames.h>
-
-#import <CocoaLumberjack/DDTTYLogger.h>
-#import <CocoaLumberjack/DDASLLogger.h>
-#import <CocoaLumberjack/DDFileLogger.h>
-#import <CocoaLumberjack/DDOSLogger.h>
-
-// Extensions
-#import <CocoaLumberjack/DDContextFilterLogFormatter.h>
-#import <CocoaLumberjack/DDContextFilterLogFormatter+Deprecated.h>
-#import <CocoaLumberjack/DDDispatchQueueLogFormatter.h>
-#import <CocoaLumberjack/DDMultiFormatter.h>
-#import <CocoaLumberjack/DDFileLogger+Buffering.h>
-
-// CLI
-#import <CocoaLumberjack/CLIColor.h>
-
-// etc
-#import <CocoaLumberjack/DDAbstractDatabaseLogger.h>
-#import <CocoaLumberjack/DDLog+LOGV.h>
-#import <CocoaLumberjack/DDLegacyMacros.h>
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/DDLegacyMacros.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/DDLegacyMacros.h
deleted file mode 100644
index 5289f33b..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/Supporting Files/DDLegacyMacros.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-/**
- * Legacy macros used for 1.9.x backwards compatibility.
- *
- * Imported by default when importing a DDLog.h directly and DD_LEGACY_MACROS is not defined and set to 0.
- **/
-#if DD_LEGACY_MACROS
-
-#warning CocoaLumberjack 1.9.x legacy macros enabled. \
-Disable legacy macros by importing CocoaLumberjack.h or DDLogMacros.h instead of DDLog.h or add `#define DD_LEGACY_MACROS 0` before importing DDLog.h.
-
-#ifndef LOG_LEVEL_DEF
- #define LOG_LEVEL_DEF ddLogLevel
-#endif
-
-#define LOG_FLAG_ERROR DDLogFlagError
-#define LOG_FLAG_WARN DDLogFlagWarning
-#define LOG_FLAG_INFO DDLogFlagInfo
-#define LOG_FLAG_DEBUG DDLogFlagDebug
-#define LOG_FLAG_VERBOSE DDLogFlagVerbose
-
-#define LOG_LEVEL_OFF DDLogLevelOff
-#define LOG_LEVEL_ERROR DDLogLevelError
-#define LOG_LEVEL_WARN DDLogLevelWarning
-#define LOG_LEVEL_INFO DDLogLevelInfo
-#define LOG_LEVEL_DEBUG DDLogLevelDebug
-#define LOG_LEVEL_VERBOSE DDLogLevelVerbose
-#define LOG_LEVEL_ALL DDLogLevelAll
-
-#define LOG_ASYNC_ENABLED YES
-
-#define LOG_ASYNC_ERROR ( NO && LOG_ASYNC_ENABLED)
-#define LOG_ASYNC_WARN (YES && LOG_ASYNC_ENABLED)
-#define LOG_ASYNC_INFO (YES && LOG_ASYNC_ENABLED)
-#define LOG_ASYNC_DEBUG (YES && LOG_ASYNC_ENABLED)
-#define LOG_ASYNC_VERBOSE (YES && LOG_ASYNC_ENABLED)
-
-#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
- [DDLog log : isAsynchronous \
- level : lvl \
- flag : flg \
- context : ctx \
- file : __FILE__ \
- function : fnct \
- line : __LINE__ \
- tag : atag \
- format : (frmt), ## __VA_ARGS__]
-
-#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \
- do { if((lvl & flg) != 0) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0)
-
-#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \
- LOG_MAYBE(async, lvl, flg, ctx, __PRETTY_FUNCTION__, frmt, ## __VA_ARGS__)
-
-#define DDLogError(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_ERROR, LOG_LEVEL_DEF, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__)
-#define DDLogWarn(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_WARN, LOG_LEVEL_DEF, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__)
-#define DDLogInfo(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_INFO, LOG_LEVEL_DEF, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__)
-#define DDLogDebug(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_DEBUG, LOG_LEVEL_DEF, LOG_FLAG_DEBUG, 0, frmt, ##__VA_ARGS__)
-#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__)
-
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/CLIColor.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/CLIColor.h
deleted file mode 100644
index d702e9c8..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/CLIColor.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-
-#if TARGET_OS_OSX
-
-#import <Foundation/Foundation.h>
-#import <QuartzCore/QuartzCore.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class represents an NSColor replacement for CLI projects that don't link with AppKit
- **/
-@interface CLIColor : NSObject
-
-/**
- * Convenience method for creating a `CLIColor` instance from RGBA params
- *
- * @param red red channel, between 0 and 1
- * @param green green channel, between 0 and 1
- * @param blue blue channel, between 0 and 1
- * @param alpha alpha channel, between 0 and 1
- */
-+ (instancetype)colorWithCalibratedRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
-
-/**
- * Get the RGBA components from a `CLIColor`
- *
- * @param red red channel, between 0 and 1
- * @param green green channel, between 0 and 1
- * @param blue blue channel, between 0 and 1
- * @param alpha alpha channel, between 0 and 1
- */
-- (void)getRed:(nullable CGFloat *)red green:(nullable CGFloat *)green blue:(nullable CGFloat *)blue alpha:(nullable CGFloat *)alpha NS_SWIFT_NAME(get(red:green:blue:alpha:));
-
-@end
-
-NS_ASSUME_NONNULL_END
-
-#endif
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogCapture.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogCapture.h
deleted file mode 100644
index 90226a6d..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogCapture.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDASLLogger.h>
-
-@protocol DDLogger;
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides the ability to capture the ASL (Apple System Logs)
- */
-API_DEPRECATED("Use DDOSLogger instead", macosx(10.4,10.12), ios(2.0,10.0), watchos(2.0,3.0), tvos(9.0,10.0))
-@interface DDASLLogCapture : NSObject
-
-/**
- * Start capturing logs
- */
-+ (void)start;
-
-/**
- * Stop capturing logs
- */
-+ (void)stop;
-
-/**
- * The current capture level.
- * @note Default log level: DDLogLevelVerbose (i.e. capture all ASL messages).
- */
-@property (class) DDLogLevel captureLevel;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogger.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogger.h
deleted file mode 100644
index 8951a8f9..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDASLLogger.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-// Custom key set on messages sent to ASL
-extern const char* const kDDASLKeyDDLog;
-
-// Value set for kDDASLKeyDDLog
-extern const char* const kDDASLDDLogValue;
-
-/**
- * This class provides a logger for the Apple System Log facility.
- *
- * As described in the "Getting Started" page,
- * the traditional NSLog() function directs its output to two places:
- *
- * - Apple System Log
- * - StdErr (if stderr is a TTY) so log statements show up in Xcode console
- *
- * To duplicate NSLog() functionality you can simply add this logger and a tty logger.
- * However, if you instead choose to use file logging (for faster performance),
- * you may choose to use a file logger and a tty logger.
- **/
-API_DEPRECATED("Use DDOSLogger instead", macosx(10.4,10.12), ios(2.0,10.0), watchos(2.0,3.0), tvos(9.0,10.0))
-@interface DDASLLogger : DDAbstractLogger <DDLogger>
-
-/**
- * Singleton method
- *
- * @return the shared instance
- */
-@property (nonatomic, class, readonly, strong) DDASLLogger *sharedInstance;
-
-// Inherited from DDAbstractLogger
-
-// - (id <DDLogFormatter>)logFormatter;
-// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAbstractDatabaseLogger.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAbstractDatabaseLogger.h
deleted file mode 100644
index e7d0b8cc..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAbstractDatabaseLogger.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides an abstract implementation of a database logger.
- *
- * That is, it provides the base implementation for a database logger to build atop of.
- * All that is needed for a concrete database logger is to extend this class
- * and override the methods in the implementation file that are prefixed with "db_".
- **/
-@interface DDAbstractDatabaseLogger : DDAbstractLogger {
-
-@protected
- NSUInteger _saveThreshold;
- NSTimeInterval _saveInterval;
- NSTimeInterval _maxAge;
- NSTimeInterval _deleteInterval;
- BOOL _deleteOnEverySave;
-
- NSInteger _saveTimerSuspended;
- NSUInteger _unsavedCount;
- dispatch_time_t _unsavedTime;
- dispatch_source_t _saveTimer;
- dispatch_time_t _lastDeleteTime;
- dispatch_source_t _deleteTimer;
-}
-
-/**
- * Specifies how often to save the data to disk.
- * Since saving is an expensive operation (disk io) it is not done after every log statement.
- * These properties allow you to configure how/when the logger saves to disk.
- *
- * A save is done when either (whichever happens first):
- *
- * - The number of unsaved log entries reaches saveThreshold
- * - The amount of time since the oldest unsaved log entry was created reaches saveInterval
- *
- * You can optionally disable the saveThreshold by setting it to zero.
- * If you disable the saveThreshold you are entirely dependent on the saveInterval.
- *
- * You can optionally disable the saveInterval by setting it to zero (or a negative value).
- * If you disable the saveInterval you are entirely dependent on the saveThreshold.
- *
- * It's not wise to disable both saveThreshold and saveInterval.
- *
- * The default saveThreshold is 500.
- * The default saveInterval is 60 seconds.
- **/
-@property (assign, readwrite) NSUInteger saveThreshold;
-
-/**
- * See the description for the `saveThreshold` property
- */
-@property (assign, readwrite) NSTimeInterval saveInterval;
-
-/**
- * It is likely you don't want the log entries to persist forever.
- * Doing so would allow the database to grow infinitely large over time.
- *
- * The maxAge property provides a way to specify how old a log statement can get
- * before it should get deleted from the database.
- *
- * The deleteInterval specifies how often to sweep for old log entries.
- * Since deleting is an expensive operation (disk io) is is done on a fixed interval.
- *
- * An alternative to the deleteInterval is the deleteOnEverySave option.
- * This specifies that old log entries should be deleted during every save operation.
- *
- * You can optionally disable the maxAge by setting it to zero (or a negative value).
- * If you disable the maxAge then old log statements are not deleted.
- *
- * You can optionally disable the deleteInterval by setting it to zero (or a negative value).
- *
- * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted.
- *
- * It's not wise to enable both deleteInterval and deleteOnEverySave.
- *
- * The default maxAge is 7 days.
- * The default deleteInterval is 5 minutes.
- * The default deleteOnEverySave is NO.
- **/
-@property (assign, readwrite) NSTimeInterval maxAge;
-
-/**
- * See the description for the `maxAge` property
- */
-@property (assign, readwrite) NSTimeInterval deleteInterval;
-
-/**
- * See the description for the `maxAge` property
- */
-@property (assign, readwrite) BOOL deleteOnEverySave;
-
-/**
- * Forces a save of any pending log entries (flushes log entries to disk).
- **/
-- (void)savePendingLogEntries;
-
-/**
- * Removes any log entries that are older than maxAge.
- **/
-- (void)deleteOldLogEntries;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAssertMacros.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAssertMacros.h
deleted file mode 100644
index de8d8f12..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDAssertMacros.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-/**
- * NSAssert replacement that will output a log message even when assertions are disabled.
- **/
-#define DDAssert(condition, frmt, ...) \
- if (!(condition)) { \
- NSString *description = [NSString stringWithFormat:frmt, ## __VA_ARGS__]; \
- DDLogError(@"%@", description); \
- NSAssert(NO, @"%@", description); \
- }
-#define DDAssertCondition(condition) DDAssert(condition, @"Condition not satisfied: %@", @(#condition))
-
-/**
- * Analog to `DDAssertionFailure` from DDAssert.swift for use in Objective C
- */
-#define DDAssertionFailure(frmt, ...) DDAssert(NO, frmt, ##__VA_ARGS__)
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter+Deprecated.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter+Deprecated.h
deleted file mode 100644
index 3ffc0402..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter+Deprecated.h
+++ /dev/null
@@ -1,119 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDContextFilterLogFormatter.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides a log formatter that filters log statements from a logging context not on the whitelist.
- * @deprecated Use DDContextAllowlistFilterLogFormatter instead.
- *
- * A log formatter can be added to any logger to format and/or filter its output.
- * You can learn more about log formatters here:
- * Documentation/CustomFormatters.md
- *
- * You can learn more about logging context's here:
- * Documentation/CustomContext.md
- *
- * But here's a quick overview / refresher:
- *
- * Every log statement has a logging context.
- * These come from the underlying logging macros defined in DDLog.h.
- * The default logging context is zero.
- * You can define multiple logging context's for use in your application.
- * For example, logically separate parts of your app each have a different logging context.
- * Also 3rd party frameworks that make use of Lumberjack generally use their own dedicated logging context.
- **/
-__attribute__((deprecated("Use DDContextAllowlistFilterLogFormatter instead")))
-typedef DDContextAllowlistFilterLogFormatter DDContextWhitelistFilterLogFormatter;
-
-@interface DDContextAllowlistFilterLogFormatter (Deprecated)
-
-/**
- * Add a context to the whitelist
- * @deprecated Use -addToAllowlist: instead.
- *
- * @param loggingContext the context
- */
-- (void)addToWhitelist:(NSInteger)loggingContext __attribute__((deprecated("Use -addToAllowlist: instead")));
-
-/**
- * Remove context from whitelist
- * @deprecated Use -removeFromAllowlist: instead.
- *
- * @param loggingContext the context
- */
-- (void)removeFromWhitelist:(NSInteger)loggingContext __attribute__((deprecated("Use -removeFromAllowlist: instead")));
-
-/**
- * Return the whitelist
- * @deprecated Use allowlist instead.
- */
-@property (nonatomic, readonly, copy) NSArray<NSNumber *> *whitelist __attribute__((deprecated("Use allowlist instead")));
-
-/**
- * Check if a context is on the whitelist
- * @deprecated Use -isOnAllowlist: instead.
- *
- * @param loggingContext the context
- */
-- (BOOL)isOnWhitelist:(NSInteger)loggingContext __attribute__((deprecated("Use -isOnAllowlist: instead")));
-
-@end
-
-
-/**
- * This class provides a log formatter that filters log statements from a logging context on the blacklist.
- * @deprecated Use DDContextDenylistFilterLogFormatter instead.
- **/
-__attribute__((deprecated("Use DDContextDenylistFilterLogFormatter instead")))
-typedef DDContextDenylistFilterLogFormatter DDContextBlacklistFilterLogFormatter;
-
-@interface DDContextDenylistFilterLogFormatter (Deprecated)
-
-/**
- * Add a context to the blacklist
- * @deprecated Use -addToDenylist: instead.
- *
- * @param loggingContext the context
- */
-- (void)addToBlacklist:(NSInteger)loggingContext __attribute__((deprecated("Use -addToDenylist: instead")));
-
-/**
- * Remove context from blacklist
- * @deprecated Use -removeFromDenylist: instead.
- *
- * @param loggingContext the context
- */
-- (void)removeFromBlacklist:(NSInteger)loggingContext __attribute__((deprecated("Use -removeFromDenylist: instead")));
-
-/**
- * Return the blacklist
- * @deprecated Use denylist instead.
- */
-@property (readonly, copy) NSArray<NSNumber *> *blacklist __attribute__((deprecated("Use denylist instead")));
-
-/**
- * Check if a context is on the blacklist
- * @deprecated Use -isOnDenylist: instead.
- *
- * @param loggingContext the context
- */
-- (BOOL)isOnBlacklist:(NSInteger)loggingContext __attribute__((deprecated("Use -isOnDenylist: instead")));
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter.h
deleted file mode 100644
index c83a689a..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDContextFilterLogFormatter.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides a log formatter that filters log statements from a logging context not on the allowlist.
- *
- * A log formatter can be added to any logger to format and/or filter its output.
- * You can learn more about log formatters here:
- * Documentation/CustomFormatters.md
- *
- * You can learn more about logging context's here:
- * Documentation/CustomContext.md
- *
- * But here's a quick overview / refresher:
- *
- * Every log statement has a logging context.
- * These come from the underlying logging macros defined in DDLog.h.
- * The default logging context is zero.
- * You can define multiple logging context's for use in your application.
- * For example, logically separate parts of your app each have a different logging context.
- * Also 3rd party frameworks that make use of Lumberjack generally use their own dedicated logging context.
- **/
-@interface DDContextAllowlistFilterLogFormatter : NSObject <DDLogFormatter>
-
-/**
- * Designated default initializer
- */
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Add a context to the allowlist
- *
- * @param loggingContext the context
- */
-- (void)addToAllowlist:(NSInteger)loggingContext;
-
-/**
- * Remove context from allowlist
- *
- * @param loggingContext the context
- */
-- (void)removeFromAllowlist:(NSInteger)loggingContext;
-
-/**
- * Return the allowlist
- */
-@property (nonatomic, readonly, copy) NSArray<NSNumber *> *allowlist;
-
-/**
- * Check if a context is on the allowlist
- *
- * @param loggingContext the context
- */
-- (BOOL)isOnAllowlist:(NSInteger)loggingContext;
-
-@end
-
-
-/**
- * This class provides a log formatter that filters log statements from a logging context on the denylist.
- **/
-@interface DDContextDenylistFilterLogFormatter : NSObject <DDLogFormatter>
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Add a context to the denylist
- *
- * @param loggingContext the context
- */
-- (void)addToDenylist:(NSInteger)loggingContext;
-
-/**
- * Remove context from denylist
- *
- * @param loggingContext the context
- */
-- (void)removeFromDenylist:(NSInteger)loggingContext;
-
-/**
- * Return the denylist
- */
-@property (readonly, copy) NSArray<NSNumber *> *denylist;
-
-/**
- * Check if a context is on the denylist
- *
- * @param loggingContext the context
- */
-- (BOOL)isOnDenylist:(NSInteger)loggingContext;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDDispatchQueueLogFormatter.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDDispatchQueueLogFormatter.h
deleted file mode 100644
index 90d32d4d..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDDispatchQueueLogFormatter.h
+++ /dev/null
@@ -1,223 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Log formatter mode
- */
-__attribute__((deprecated("DDDispatchQueueLogFormatter is always shareable")))
-typedef NS_ENUM(NSUInteger, DDDispatchQueueLogFormatterMode){
- /**
- * This is the default option, means the formatter can be reused between multiple loggers and therefore is thread-safe.
- * There is, of course, a performance cost for the thread-safety
- */
- DDDispatchQueueLogFormatterModeShareble = 0,
- /**
- * If the formatter will only be used by a single logger, then the thread-safety can be removed
- * @note: there is an assert checking if the formatter is added to multiple loggers and the mode is non-shareble
- */
- DDDispatchQueueLogFormatterModeNonShareble,
-};
-
-/**
- * Quality of Service names.
- *
- * Since macOS 10.10 and iOS 8.0, pthreads, dispatch queues and NSOperations express their
- * scheduling priority by using an abstract classification called Quality of Service (QOS).
- *
- * This formatter will add a representation of this QOS in the log message by using those
- * string constants.
- * For example:
- *
- * `2011-10-17 20:21:45.435 AppName[19928:5207 (QOS:DF)] Your log message here`
- *
- * Where QOS is one of:
- * `- UI = User Interactive`
- * `- IN = User Initiated`
- * `- DF = Default`
- * `- UT = Utility`
- * `- BG = Background`
- * `- UN = Unspecified`
- *
- * Note: QOS will be absent in the log messages if running on OS versions that don't support it.
- **/
-typedef NSString * DDQualityOfServiceName NS_STRING_ENUM;
-
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceUserInteractive NS_SWIFT_NAME(DDQualityOfServiceName.userInteractive) API_AVAILABLE(macos(10.10), ios(8.0));
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceUserInitiated NS_SWIFT_NAME(DDQualityOfServiceName.userInitiated) API_AVAILABLE(macos(10.10), ios(8.0));
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceDefault NS_SWIFT_NAME(DDQualityOfServiceName.default) API_AVAILABLE(macos(10.10), ios(8.0));
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceUtility NS_SWIFT_NAME(DDQualityOfServiceName.utility) API_AVAILABLE(macos(10.10), ios(8.0));
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceBackground NS_SWIFT_NAME(DDQualityOfServiceName.background) API_AVAILABLE(macos(10.10), ios(8.0));
-FOUNDATION_EXPORT DDQualityOfServiceName const DDQualityOfServiceUnspecified NS_SWIFT_NAME(DDQualityOfServiceName.unspecified) API_AVAILABLE(macos(10.10), ios(8.0));
-
-/**
- * This class provides a log formatter that prints the dispatch_queue label instead of the mach_thread_id.
- *
- * A log formatter can be added to any logger to format and/or filter its output.
- * You can learn more about log formatters here:
- * Documentation/CustomFormatters.md
- *
- * A typical `NSLog` (or `DDTTYLogger`) prints detailed info as `[<process_id>:<thread_id>]`.
- * For example:
- *
- * `2011-10-17 20:21:45.435 AppName[19928:5207] Your log message here`
- *
- * Where:
- * `- 19928 = process id`
- * `- 5207 = thread id (mach_thread_id printed in hex)`
- *
- * When using grand central dispatch (GCD), this information is less useful.
- * This is because a single serial dispatch queue may be run on any thread from an internally managed thread pool.
- * For example:
- *
- * `2011-10-17 20:32:31.111 AppName[19954:4d07] Message from my_serial_dispatch_queue`
- * `2011-10-17 20:32:31.112 AppName[19954:5207] Message from my_serial_dispatch_queue`
- * `2011-10-17 20:32:31.113 AppName[19954:2c55] Message from my_serial_dispatch_queue`
- *
- * This formatter allows you to replace the standard `[box:info]` with the dispatch_queue name.
- * For example:
- *
- * `2011-10-17 20:32:31.111 AppName[img-scaling] Message from my_serial_dispatch_queue`
- * `2011-10-17 20:32:31.112 AppName[img-scaling] Message from my_serial_dispatch_queue`
- * `2011-10-17 20:32:31.113 AppName[img-scaling] Message from my_serial_dispatch_queue`
- *
- * If the dispatch_queue doesn't have a set name, then it falls back to the thread name.
- * If the current thread doesn't have a set name, then it falls back to the mach_thread_id in hex (like normal).
- *
- * Note: If manually creating your own background threads (via `NSThread/alloc/init` or `NSThread/detachNeThread`),
- * you can use `[[NSThread currentThread] setName:(NSString *)]`.
- **/
-@interface DDDispatchQueueLogFormatter : NSObject <DDLogFormatter>
-
-/**
- * Standard init method.
- * Configure using properties as desired.
- **/
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Initializer with ability to set the queue mode
- *
- * @param mode choose between DDDispatchQueueLogFormatterModeShareble and DDDispatchQueueLogFormatterModeNonShareble, depending if the formatter is shared between several loggers or not
- */
-- (instancetype)initWithMode:(DDDispatchQueueLogFormatterMode)mode __attribute__((deprecated("DDDispatchQueueLogFormatter is always shareable")));
-
-/**
- * The minQueueLength restricts the minimum size of the [detail box].
- * If the minQueueLength is set to 0, there is no restriction.
- *
- * For example, say a dispatch_queue has a label of "diskIO":
- *
- * If the minQueueLength is 0: [diskIO]
- * If the minQueueLength is 4: [diskIO]
- * If the minQueueLength is 5: [diskIO]
- * If the minQueueLength is 6: [diskIO]
- * If the minQueueLength is 7: [diskIO ]
- * If the minQueueLength is 8: [diskIO ]
- *
- * The default minQueueLength is 0 (no minimum, so [detail box] won't be padded).
- *
- * If you want every [detail box] to have the exact same width,
- * set both minQueueLength and maxQueueLength to the same value.
- **/
-@property (assign, atomic) NSUInteger minQueueLength;
-
-/**
- * The maxQueueLength restricts the number of characters that will be inside the [detail box].
- * If the maxQueueLength is 0, there is no restriction.
- *
- * For example, say a dispatch_queue has a label of "diskIO":
- *
- * If the maxQueueLength is 0: [diskIO]
- * If the maxQueueLength is 4: [disk]
- * If the maxQueueLength is 5: [diskI]
- * If the maxQueueLength is 6: [diskIO]
- * If the maxQueueLength is 7: [diskIO]
- * If the maxQueueLength is 8: [diskIO]
- *
- * The default maxQueueLength is 0 (no maximum, so [detail box] won't be truncated).
- *
- * If you want every [detail box] to have the exact same width,
- * set both minQueueLength and maxQueueLength to the same value.
- **/
-@property (assign, atomic) NSUInteger maxQueueLength;
-
-/**
- * Sometimes queue labels have long names like "com.apple.main-queue",
- * but you'd prefer something shorter like simply "main".
- *
- * This method allows you to set such preferred replacements.
- * The above example is set by default.
- *
- * To remove/undo a previous replacement, invoke this method with nil for the 'shortLabel' parameter.
- **/
-- (nullable NSString *)replacementStringForQueueLabel:(NSString *)longLabel;
-
-/**
- * See the `replacementStringForQueueLabel:` description
- */
-- (void)setReplacementString:(nullable NSString *)shortLabel forQueueLabel:(NSString *)longLabel;
-
-@end
-
-/**
- * Category on `DDDispatchQueueLogFormatter` to make method declarations easier to extend/modify
- **/
-@interface DDDispatchQueueLogFormatter (OverridableMethods)
-
-/**
- * Date formatter default configuration
- */
-- (void)configureDateFormatter:(NSDateFormatter *)dateFormatter;
-
-/**
- * Formatter method to transfrom from date to string
- */
-- (NSString *)stringFromDate:(NSDate *)date;
-
-/**
- * Method to compute the queue thread label
- */
-- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage;
-
-@end
-
-#pragma mark - DDAtomicCountable
-
-__attribute__((deprecated("DDAtomicCountable is useless since DDDispatchQueueLogFormatter is always shareable now")))
-@protocol DDAtomicCountable <NSObject>
-
-- (instancetype)initWithDefaultValue:(int32_t)defaultValue;
-- (int32_t)increment;
-- (int32_t)decrement;
-- (int32_t)value;
-
-@end
-
-__attribute__((deprecated("DDAtomicCountable is deprecated")))
-@interface DDAtomicCounter: NSObject<DDAtomicCountable>
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger+Buffering.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger+Buffering.h
deleted file mode 100644
index cbb90f08..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger+Buffering.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <CocoaLumberjack/DDFileLogger.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface DDFileLogger (Buffering)
-
-- (instancetype)wrapWithBuffer;
-- (instancetype)unwrapFromBuffer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger.h
deleted file mode 100644
index ffd39365..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDFileLogger.h
+++ /dev/null
@@ -1,571 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-@class DDLogFileInfo;
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides a logger to write log statements to a file.
- **/
-
-
-// Default configuration and safety/sanity values.
-//
-// maximumFileSize -> kDDDefaultLogMaxFileSize
-// rollingFrequency -> kDDDefaultLogRollingFrequency
-// maximumNumberOfLogFiles -> kDDDefaultLogMaxNumLogFiles
-// logFilesDiskQuota -> kDDDefaultLogFilesDiskQuota
-//
-// You should carefully consider the proper configuration values for your application.
-
-extern unsigned long long const kDDDefaultLogMaxFileSize;
-extern NSTimeInterval const kDDDefaultLogRollingFrequency;
-extern NSUInteger const kDDDefaultLogMaxNumLogFiles;
-extern unsigned long long const kDDDefaultLogFilesDiskQuota;
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-/// The serializer is responsible for turning a log message into binary for writing into a file.
-/// It allows storing log messages in a non-text format.
-/// The serialier should not be used for filtering or formatting messages!
-/// Also, it must be fast!
-@protocol DDFileLogMessageSerializer <NSObject>
-@required
-
-/// Returns the binary representation of the message.
-/// - Parameter message: The formatted log message to serialize.
-//
-
-/// Returns the binary representation of the message.
-/// - Parameters:
-/// - string: The string to serialize. Usually, this is the formatted message, but it can also be e.g. a log file header.
-/// - message: The message which represents the `string`. This is null, if `string` is e.g. a log file header.
-/// - Note: The `message` parameter should not be used for formatting! It should simply be used to extract the necessary metadata for serializing.
-- (NSData *)dataForString:(NSString *)string
- originatingFromMessage:(nullable DDLogMessage *)message NS_SWIFT_NAME(dataForString(_:originatingFrom:));
-
-@end
-
-/// The (default) plain text message serializer.
-@interface DDFileLogPlainTextMessageSerializer : NSObject <DDFileLogMessageSerializer>
-
-- (instancetype)init;
-
-@end
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-@class DDFileLogger;
-/**
- * The LogFileManager protocol is designed to allow you to control all aspects of your log files.
- *
- * The primary purpose of this is to allow you to do something with the log files after they have been rolled.
- * Perhaps you want to compress them to save disk space.
- * Perhaps you want to upload them to an FTP server.
- * Perhaps you want to run some analytics on the file.
- *
- * A default LogFileManager is, of course, provided.
- * The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property.
- *
- * This protocol provides various methods to fetch the list of log files.
- *
- * There are two variants: sorted and unsorted.
- * If sorting is not necessary, the unsorted variant is obviously faster.
- * The sorted variant will return an array sorted by when the log files were created,
- * with the most recently created log file at index 0, and the oldest log file at the end of the array.
- *
- * You can fetch only the log file paths (full path including name), log file names (name only),
- * or an array of `DDLogFileInfo` objects.
- * The `DDLogFileInfo` class is documented below, and provides a handy wrapper that
- * gives you easy access to various file attributes such as the creation date or the file size.
- */
-@protocol DDLogFileManager <NSObject>
-@required
-
-// Public properties
-
-/**
- * The maximum number of archived log files to keep on disk.
- * For example, if this property is set to 3,
- * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk.
- * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted.
- *
- * You may optionally disable this option by setting it to zero.
- **/
-@property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
-
-/**
- * The maximum space that logs can take. On rolling logfile all old log files that exceed logFilesDiskQuota will
- * be deleted.
- *
- * You may optionally disable this option by setting it to zero.
- **/
-@property (readwrite, assign, atomic) unsigned long long logFilesDiskQuota;
-
-// Public methods
-
-/**
- * Returns the logs directory (path)
- */
-@property (nonatomic, readonly, copy) NSString *logsDirectory;
-
-/**
- * Returns an array of `NSString` objects,
- * each of which is the filePath to an existing log file on disk.
- **/
-@property (nonatomic, readonly, strong) NSArray<NSString *> *unsortedLogFilePaths;
-
-/**
- * Returns an array of `NSString` objects,
- * each of which is the fileName of an existing log file on disk.
- **/
-@property (nonatomic, readonly, strong) NSArray<NSString *> *unsortedLogFileNames;
-
-/**
- * Returns an array of `DDLogFileInfo` objects,
- * each representing an existing log file on disk,
- * and containing important information about the log file such as it's modification date and size.
- **/
-@property (nonatomic, readonly, strong) NSArray<DDLogFileInfo *> *unsortedLogFileInfos;
-
-/**
- * Just like the `unsortedLogFilePaths` method, but sorts the array.
- * The items in the array are sorted by creation date.
- * The first item in the array will be the most recently created log file.
- **/
-@property (nonatomic, readonly, strong) NSArray<NSString *> *sortedLogFilePaths;
-
-/**
- * Just like the `unsortedLogFileNames` method, but sorts the array.
- * The items in the array are sorted by creation date.
- * The first item in the array will be the most recently created log file.
- **/
-@property (nonatomic, readonly, strong) NSArray<NSString *> *sortedLogFileNames;
-
-/**
- * Just like the `unsortedLogFileInfos` method, but sorts the array.
- * The items in the array are sorted by creation date.
- * The first item in the array will be the most recently created log file.
- **/
-@property (nonatomic, readonly, strong) NSArray<DDLogFileInfo *> *sortedLogFileInfos;
-
-// Private methods (only to be used by DDFileLogger)
-
-/**
- * Generates a new unique log file path, and creates the corresponding log file.
- * This method is executed directly on the file logger's internal queue.
- * The file has to exist by the time the method returns.
- **/
-- (nullable NSString *)createNewLogFileWithError:(NSError **)error;
-
-@optional
-
-/// The log message serializer.
-@property (nonatomic, readonly, strong) id<DDFileLogMessageSerializer> logMessageSerializer;
-
-/// Manually perform a cleanup of the log files managed by this manager.
-/// This can be called from any queue!
-- (BOOL)cleanupLogFilesWithError:(NSError **)error;
-
-// MARK: Private methods (only to be used by DDFileLogger)
-
-// MARK: Notifications from DDFileLogger
-/// Called when the log file manager was added to a file logger.
-/// This should be used to make the manager "active" - like starting internal timers etc.
-/// Executed on global queue with default priority.
-/// - Parameter fileLogger: The file logger this manager was added to.
-/// - Important: The manager **must not** keep a strong reference to `fileLogger` or a retain cycle will be created!
-- (void)didAddToFileLogger:(DDFileLogger *)fileLogger;
-
-/// Called when a log file was archived. Executed on global queue with default priority.
-/// @param logFilePath The path to the log file that was archived.
-/// @param wasRolled Whether or not the archiving happend after rolling the log file.
-- (void)didArchiveLogFile:(NSString *)logFilePath wasRolled:(BOOL)wasRolled NS_SWIFT_NAME(didArchiveLogFile(atPath:wasRolled:));
-
-// MARK: Deprecated APIs
-/// Creates a new log file ignoring any errors. Deprecated in favor of `-createNewLogFileWithError:`.
-/// Will only be called if `-createNewLogFileWithError:` is not implemented.
-- (nullable NSString *)createNewLogFile __attribute__((deprecated("Use -createNewLogFileWithError:"))) NS_SWIFT_UNAVAILABLE("Use -createNewLogFileWithError:");
-
-/// Called when a log file was archived. Executed on global queue with default priority.
-- (void)didArchiveLogFile:(NSString *)logFilePath NS_SWIFT_NAME(didArchiveLogFile(atPath:)) __attribute__((deprecated("Use -didArchiveLogFile:wasRolled:")));
-
-/// Called when the roll action was executed and the log was archived. Executed on global queue with default priority.
-- (void)didRollAndArchiveLogFile:(NSString *)logFilePath NS_SWIFT_NAME(didRollAndArchiveLogFile(atPath:)) __attribute__((deprecated("Use -didArchiveLogFile:wasRolled:")));
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Default log file manager.
- *
- * All log files are placed inside the logsDirectory.
- * If a specific logsDirectory isn't specified, the default directory is used.
- * On Mac, this is in `~/Library/Logs/<Application Name>`.
- * On iPhone, this is in `~/Library/Caches/Logs`.
- *
- * Log files are named `"<bundle identifier> <date> <time>.log"`
- * Example: `com.organization.myapp 2013-12-03 17-14.log`
- *
- * Archived log files are automatically deleted according to the `maximumNumberOfLogFiles` property.
- **/
-@interface DDLogFileManagerDefault : NSObject <DDLogFileManager>
-
-/**
- * If logDirectory is not specified, then a folder called "Logs" is created in the app's cache directory.
- * While running on the simulator, the "Logs" folder is located in the library temporary directory.
- */
-- (instancetype)initWithLogsDirectory:(nullable NSString *)logsDirectory NS_DESIGNATED_INITIALIZER;
-
-#if TARGET_OS_IPHONE
-/*
- * Calling this constructor you can override the default "automagically" chosen NSFileProtection level.
- * Useful if you are writing a command line utility / CydiaSubstrate addon for iOS that has no NSBundle
- * or like SpringBoard no BackgroundModes key in the NSBundle:
- * iPhone:~ root# cycript -p SpringBoard
- * cy# [NSBundle mainBundle]
- * #"NSBundle </System/Library/CoreServices/SpringBoard.app> (loaded)"
- * cy# [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
- * null
- * cy#
- **/
-- (instancetype)initWithLogsDirectory:(nullable NSString *)logsDirectory
- defaultFileProtectionLevel:(NSFileProtectionType)fileProtectionLevel;
-#endif
-
-/// Convenience initializer.
-- (instancetype)init;
-
-/*
- * Methods to override.
- *
- * Log files are named `"<bundle identifier> <date> <time>.log"`
- * Example: `com.organization.myapp 2013-12-03 17-14.log`
- *
- * If you wish to change default filename, you can override following two methods.
- * - `newLogFileName` method would be called on new logfile creation.
- * - `isLogFile:` method would be called to filter log files from all other files in logsDirectory.
- * You have to parse given filename and return YES if it is logFile.
- *
- * **NOTE**
- * `newLogFileName` returns filename. If appropriate file already exists, number would be added
- * to filename before extension. You have to handle this case in isLogFile: method.
- *
- * Example:
- * - newLogFileName returns `"com.organization.myapp 2013-12-03.log"`,
- * file `"com.organization.myapp 2013-12-03.log"` would be created.
- * - after some time `"com.organization.myapp 2013-12-03.log"` is archived
- * - newLogFileName again returns `"com.organization.myapp 2013-12-03.log"`,
- * file `"com.organization.myapp 2013-12-03 2.log"` would be created.
- * - after some time `"com.organization.myapp 2013-12-03 1.log"` is archived
- * - newLogFileName again returns `"com.organization.myapp 2013-12-03.log"`,
- * file `"com.organization.myapp 2013-12-03 3.log"` would be created.
- **/
-
-/**
- * Generates log file name with default format `"<bundle identifier> <date> <time>.log"`
- * Example: `MobileSafari 2013-12-03 17-14.log`
- *
- * You can change it by overriding `newLogFileName` and `isLogFile:` methods.
- **/
-@property (readonly, copy) NSString *newLogFileName;
-
-/**
- * Default log file name is `"<bundle identifier> <date> <time>.log"`.
- * Example: `MobileSafari 2013-12-03 17-14.log`
- *
- * You can change it by overriding `newLogFileName` and `isLogFile:` methods.
- **/
-- (BOOL)isLogFile:(NSString *)fileName NS_SWIFT_NAME(isLogFile(withName:));
-
-/**
- * New log files are created empty by default in `createNewLogFile:` method
- *
- * If you wish to specify a common file header to use in your log files,
- * you can set the initial log file contents by overriding `logFileHeader`
- **/
-@property (readonly, copy, nullable) NSString *logFileHeader;
-
-/// The log message serializer.
-@property (nonatomic, strong) id<DDFileLogMessageSerializer> logMessageSerializer;
-
-/* Inherited from DDLogFileManager protocol:
-
- @property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles;
- @property (readwrite, assign, atomic) NSUInteger logFilesDiskQuota;
-
- - (NSString *)logsDirectory;
-
- - (NSArray *)unsortedLogFilePaths;
- - (NSArray *)unsortedLogFileNames;
- - (NSArray *)unsortedLogFileInfos;
-
- - (NSArray *)sortedLogFilePaths;
- - (NSArray *)sortedLogFileNames;
- - (NSArray *)sortedLogFileInfos;
- */
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * Most users will want file log messages to be prepended with the date and time.
- * Rather than forcing the majority of users to write their own formatter,
- * we will supply a logical default formatter.
- * Users can easily replace this formatter with their own by invoking the `setLogFormatter:` method.
- * It can also be removed by calling `setLogFormatter:`, and passing a nil parameter.
- *
- * In addition to the convenience of having a logical default formatter,
- * it will also provide a template that makes it easy for developers to copy and change.
- **/
-@interface DDLogFileFormatterDefault : NSObject <DDLogFormatter>
-
-/// Designated initializer, requires a date formatter
-- (instancetype)initWithDateFormatter:(nullable NSDateFormatter *)dateFormatter NS_DESIGNATED_INITIALIZER;
-
-/// Convenience initializer
-- (instancetype)init;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * The standard implementation for a file logger
- */
-@interface DDFileLogger : DDAbstractLogger <DDLogger>
-
-/**
- * Default initializer.
- */
-- (instancetype)init;
-
-/**
- * Designated initializer, requires a `DDLogFileManager` instance.
- * A global queue w/ default priority is used to run callbacks.
- * If needed, specify queue using `initWithLogFileManager:completionQueue:`.
- */
-- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager;
-
-/**
- * Designated initializer, requires a `DDLogFileManager` instance.
- * The completionQueue is used to execute `didArchiveLogFile:wasRolled:`,
- * and the callback in `rollLogFileWithCompletionBlock:`.
- * If nil, a global queue w/ default priority is used.
- */
-- (instancetype)initWithLogFileManager:(id <DDLogFileManager>)logFileManager
- completionQueue:(nullable dispatch_queue_t)dispatchQueue NS_DESIGNATED_INITIALIZER;
-
-/**
- * Deprecated. Use `willLogMessage:`
- */
-- (void)willLogMessage __attribute__((deprecated("Use -willLogMessage:"))) NS_REQUIRES_SUPER;
-
-/**
- * Deprecated. Use `didLogMessage:`
- */
-- (void)didLogMessage __attribute__((deprecated("Use -didLogMessage:"))) NS_REQUIRES_SUPER;
-
-/**
- * Called when the logger is about to write message. Call super before your implementation.
- */
-- (void)willLogMessage:(DDLogFileInfo *)logFileInfo NS_REQUIRES_SUPER;
-
-/**
- * Called when the logger wrote message. Call super after your implementation.
- */
-- (void)didLogMessage:(DDLogFileInfo *)logFileInfo NS_REQUIRES_SUPER;
-
-/**
- * Writes all in-memory log data to the permanent storage. Call super before your implementation.
- * Don't call this method directly, instead use the `[DDLog flushLog]` to ensure all log messages are included in flush.
- */
-- (void)flush NS_REQUIRES_SUPER;
-
-/**
- * Called when the logger checks archive or not current log file.
- * Override this method to extend standard behavior. By default returns NO.
- * This is executed directly on the logger's internal queue, so keep processing light!
- */
-- (BOOL)shouldArchiveRecentLogFileInfo:(DDLogFileInfo *)recentLogFileInfo;
-
-/**
- * Log File Rolling:
- *
- * `maximumFileSize`:
- * The approximate maximum size (in bytes) to allow log files to grow.
- * If a log file is larger than this value after a log statement is appended,
- * then the log file is rolled.
- *
- * `rollingFrequency`
- * How often to roll the log file.
- * The frequency is given as an `NSTimeInterval`, which is a double that specifies the interval in seconds.
- * Once the log file gets to be this old, it is rolled.
- *
- * `doNotReuseLogFiles`
- * When set, will always create a new log file at application launch.
- *
- * Both the `maximumFileSize` and the `rollingFrequency` are used to manage rolling.
- * Whichever occurs first will cause the log file to be rolled.
- *
- * For example:
- * The `rollingFrequency` is 24 hours,
- * but the log file surpasses the `maximumFileSize` after only 20 hours.
- * The log file will be rolled at that 20 hour mark.
- * A new log file will be created, and the 24 hour timer will be restarted.
- *
- * You may optionally disable rolling due to filesize by setting `maximumFileSize` to zero.
- * If you do so, rolling is based solely on `rollingFrequency`.
- *
- * You may optionally disable rolling due to time by setting `rollingFrequency` to zero (or any non-positive number).
- * If you do so, rolling is based solely on `maximumFileSize`.
- *
- * If you disable both `maximumFileSize` and `rollingFrequency`, then the log file won't ever be rolled.
- * This is strongly discouraged.
- **/
-@property (readwrite, assign) unsigned long long maximumFileSize;
-
-/**
- * See description for `maximumFileSize`
- */
-@property (readwrite, assign) NSTimeInterval rollingFrequency;
-
-/**
- * See description for `maximumFileSize`
- */
-@property (readwrite, assign, atomic) BOOL doNotReuseLogFiles;
-
-/**
- * The DDLogFileManager instance can be used to retrieve the list of log files,
- * and configure the maximum number of archived log files to keep.
- *
- * @see DDLogFileManager.maximumNumberOfLogFiles
- **/
-@property (strong, nonatomic, readonly) id <DDLogFileManager> logFileManager;
-
-/**
- * When using a custom formatter you can set the `logMessage` method not to append
- * `\n` character after each output. This allows for some greater flexibility with
- * custom formatters. Default value is YES.
- **/
-@property (nonatomic, readwrite, assign) BOOL automaticallyAppendNewlineForCustomFormatters;
-
-/**
- * You can optionally force the current log file to be rolled with this method.
- * CompletionBlock will be called on main queue.
- */
-- (void)rollLogFileWithCompletionBlock:(nullable void (^)(void))completionBlock
- NS_SWIFT_NAME(rollLogFile(withCompletion:));
-
-/**
- * Method is deprecated.
- * @deprecated Use `rollLogFileWithCompletionBlock:` method instead.
- */
-- (void)rollLogFile __attribute__((deprecated("Use -rollLogFileWithCompletionBlock:")));
-
-// Inherited from DDAbstractLogger
-
-// - (id <DDLogFormatter>)logFormatter;
-// - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
-
-/**
- * Returns the log file that should be used.
- * If there is an existing log file that is suitable,
- * within the constraints of `maximumFileSize` and `rollingFrequency`, then it is returned.
- *
- * Otherwise a new file is created and returned. If this failes, `NULL` is returned.
- **/
-@property (nonatomic, nullable, readonly, strong) DDLogFileInfo *currentLogFileInfo;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * `DDLogFileInfo` is a simple class that provides access to various file attributes.
- * It provides good performance as it only fetches the information if requested,
- * and it caches the information to prevent duplicate fetches.
- *
- * It was designed to provide quick snapshots of the current state of log files,
- * and to help sort log files in an array.
- *
- * This class does not monitor the files, or update it's cached attribute values if the file changes on disk.
- * This is not what the class was designed for.
- *
- * If you absolutely must get updated values,
- * you can invoke the reset method which will clear the cache.
- **/
-@interface DDLogFileInfo : NSObject
-
-@property (strong, nonatomic, readonly) NSString *filePath;
-@property (strong, nonatomic, readonly) NSString *fileName;
-
-@property (strong, nonatomic, readonly) NSDictionary<NSFileAttributeKey, id> *fileAttributes;
-
-@property (strong, nonatomic, nullable, readonly) NSDate *creationDate;
-@property (strong, nonatomic, nullable, readonly) NSDate *modificationDate;
-
-@property (nonatomic, readonly) unsigned long long fileSize;
-
-@property (nonatomic, readonly) NSTimeInterval age;
-
-@property (nonatomic, readonly) BOOL isSymlink;
-
-@property (nonatomic, readwrite) BOOL isArchived;
-
-+ (nullable instancetype)logFileWithPath:(nullable NSString *)filePath NS_SWIFT_UNAVAILABLE("Use init(filePath:)");
-
-- (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithFilePath:(NSString *)filePath NS_DESIGNATED_INITIALIZER;
-
-- (void)reset;
-- (void)renameFile:(NSString *)newFileName NS_SWIFT_NAME(renameFile(to:));
-
-- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName;
-
-- (void)addExtendedAttributeWithName:(NSString *)attrName;
-- (void)removeExtendedAttributeWithName:(NSString *)attrName;
-
-- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another;
-- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog+LOGV.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog+LOGV.h
deleted file mode 100644
index 683a7d09..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog+LOGV.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-/**
- * The constant/variable/method responsible for controlling the current log level.
- **/
-#ifndef LOG_LEVEL_DEF
- #define LOG_LEVEL_DEF ddLogLevel
-#endif
-
-/**
- * Whether async should be used by log messages, excluding error messages that are always sent sync.
- **/
-#ifndef LOG_ASYNC_ENABLED
- #define LOG_ASYNC_ENABLED YES
-#endif
-
-/**
- * This is the single macro that all other macros below compile into.
- * This big multiline macro makes all the other macros easier to read.
- **/
-#define LOGV_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, avalist) \
- [DDLog log : isAsynchronous \
- level : lvl \
- flag : flg \
- context : ctx \
- file : __FILE__ \
- function : fnct \
- line : __LINE__ \
- tag : atag \
- format : frmt \
- args : avalist]
-
-/**
- * Define version of the macro that only execute if the log level is above the threshold.
- * The compiled versions essentially look like this:
- *
- * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }
- *
- * When LOG_LEVEL_DEF is defined as ddLogLevel.
- *
- * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.
- * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.
- *
- * Note that when compiler optimizations are enabled (as they are for your release builds),
- * the log messages above your logging threshold will automatically be compiled out.
- *
- * (If the compiler sees LOG_LEVEL_DEF/ddLogLevel declared as a constant, the compiler simply checks to see
- * if the 'if' statement would execute, and if not it strips it from the binary.)
- *
- * We also define shorthand versions for asynchronous and synchronous logging.
- **/
-#define LOGV_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, avalist) \
- do { if(lvl & flg) LOGV_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, avalist); } while(0)
-
-/**
- * Ready to use log macros with no context or tag.
- **/
-#define DDLogVError(frmt, avalist) LOGV_MAYBE(NO, LOG_LEVEL_DEF, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, avalist)
-#define DDLogVWarn(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, avalist)
-#define DDLogVInfo(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, avalist)
-#define DDLogVDebug(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, avalist)
-#define DDLogVVerbose(frmt, avalist) LOGV_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, avalist)
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog.h
deleted file mode 100644
index 91bd2e3b..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLog.h
+++ /dev/null
@@ -1,1024 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-// The Swift Package integration has no support for the legacy macros.
-#if __has_include(<CocoaLumberjack/DDLegacyMacros.h>)
- // Enable 1.9.x legacy macros if imported directly and it's not a swift package build.
- #ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 1
- #endif
- // DD_LEGACY_MACROS is checked in the file itself
- #import <CocoaLumberjack/DDLegacyMacros.h>
-#endif
-
-#ifndef DD_LEGACY_MESSAGE_TAG
- #define DD_LEGACY_MESSAGE_TAG 1
-#endif
-
-// Names of loggers.
-#import <CocoaLumberjack/DDLoggerNames.h>
-
-#if OS_OBJECT_USE_OBJC
- #define DISPATCH_QUEUE_REFERENCE_TYPE strong
-#else
- #define DISPATCH_QUEUE_REFERENCE_TYPE assign
-#endif
-
-@class DDLogMessage;
-@class DDLoggerInformation;
-@protocol DDLogger;
-@protocol DDLogFormatter;
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Define the standard options.
- *
- * We default to only 4 levels because it makes it easier for beginners
- * to make the transition to a logging framework.
- *
- * More advanced users may choose to completely customize the levels (and level names) to suite their needs.
- * For more information on this see the "Custom Log Levels" page:
- * Documentation/CustomLogLevels.md
- *
- * Advanced users may also notice that we're using a bitmask.
- * This is to allow for custom fine grained logging:
- * Documentation/FineGrainedLogging.md
- *
- * -- Flags --
- *
- * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations.
- * For example, say you have a lot of warning log messages, and you wanted to disable them.
- * However, you still needed to see your error and info log messages.
- * You could accomplish that with the following:
- *
- * static const DDLogLevel ddLogLevel = DDLogFlagError | DDLogFlagInfo;
- *
- * When LOG_LEVEL_DEF is defined as ddLogLevel.
- *
- * Flags may also be consulted when writing custom log formatters,
- * as the DDLogMessage class captures the individual flag that caused the log message to fire.
- *
- * -- Levels --
- *
- * Log levels are simply the proper bitmask of the flags.
- *
- * -- Booleans --
- *
- * The booleans may be used when your logging code involves more than one line.
- * For example:
- *
- * if (LOG_VERBOSE) {
- * for (id sprocket in sprockets)
- * DDLogVerbose(@"sprocket: %@", [sprocket description])
- * }
- *
- * -- Async --
- *
- * Defines the default asynchronous options.
- * The default philosophy for asynchronous logging is very simple:
- *
- * Log messages with errors should be executed synchronously.
- * After all, an error just occurred. The application could be unstable.
- *
- * All other log messages, such as debug output, are executed asynchronously.
- * After all, if it wasn't an error, then it was just informational output,
- * or something the application was easily able to recover from.
- *
- * -- Changes --
- *
- * You are strongly discouraged from modifying this file.
- * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project.
- * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h
- *
- * For an example of customizing your logging experience, see the "Custom Log Levels" page:
- * Documentation/CustomLogLevels.md
- **/
-
-/**
- * Flags accompany each log. They are used together with levels to filter out logs.
- */
-typedef NS_OPTIONS(NSUInteger, DDLogFlag){
- /**
- * 0...00001 DDLogFlagError
- */
- DDLogFlagError = (1 << 0),
-
- /**
- * 0...00010 DDLogFlagWarning
- */
- DDLogFlagWarning = (1 << 1),
-
- /**
- * 0...00100 DDLogFlagInfo
- */
- DDLogFlagInfo = (1 << 2),
-
- /**
- * 0...01000 DDLogFlagDebug
- */
- DDLogFlagDebug = (1 << 3),
-
- /**
- * 0...10000 DDLogFlagVerbose
- */
- DDLogFlagVerbose = (1 << 4)
-};
-
-/**
- * Log levels are used to filter out logs. Used together with flags.
- */
-typedef NS_ENUM(NSUInteger, DDLogLevel){
- /**
- * No logs
- */
- DDLogLevelOff = 0,
-
- /**
- * Error logs only
- */
- DDLogLevelError = (DDLogFlagError),
-
- /**
- * Error and warning logs
- */
- DDLogLevelWarning = (DDLogLevelError | DDLogFlagWarning),
-
- /**
- * Error, warning and info logs
- */
- DDLogLevelInfo = (DDLogLevelWarning | DDLogFlagInfo),
-
- /**
- * Error, warning, info and debug logs
- */
- DDLogLevelDebug = (DDLogLevelInfo | DDLogFlagDebug),
-
- /**
- * Error, warning, info, debug and verbose logs
- */
- DDLogLevelVerbose = (DDLogLevelDebug | DDLogFlagVerbose),
-
- /**
- * All logs (1...11111)
- */
- DDLogLevelAll = NSUIntegerMax
-};
-
-/**
- * Extracts just the file name, no path or extension
- *
- * @param filePath input file path
- * @param copy YES if we want the result to be copied
- *
- * @return the file name
- */
-FOUNDATION_EXTERN NSString * __nullable DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy);
-
-/**
- * The THIS_FILE macro gives you an NSString of the file name.
- * For simplicity and clarity, the file name does not include the full path or file extension.
- *
- * For example: DDLogWarn(@"%@: Unable to find thingy", THIS_FILE) -> @"MyViewController: Unable to find thingy"
- **/
-#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO))
-
-/**
- * The THIS_METHOD macro gives you the name of the current objective-c method.
- *
- * For example: DDLogWarn(@"%@ - Requires non-nil strings", THIS_METHOD) -> @"setMake:model: requires non-nil strings"
- *
- * Note: This does NOT work in straight C functions (non objective-c).
- * Instead you should use the predefined __FUNCTION__ macro.
- **/
-#define THIS_METHOD NSStringFromSelector(_cmd)
-
-/**
- * Makes a declaration "Sendable" in Swift (if supported by the compiler).
- */
-#ifndef DD_SENDABLE
-#ifdef __has_attribute
-#if __has_attribute(swift_attr)
-#define DD_SENDABLE __attribute__((swift_attr("@Sendable")))
-#endif
-#endif
-#endif
-#ifndef DD_SENDABLE
-#define DD_SENDABLE
-#endif
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * The main class, exposes all logging mechanisms, loggers, ...
- * For most of the users, this class is hidden behind the logging functions like `DDLogInfo`
- */
-DD_SENDABLE
-@interface DDLog : NSObject
-
-/**
- * Returns the singleton `DDLog`.
- * The instance is used by `DDLog` class methods.
- */
-@property (class, nonatomic, strong, readonly) DDLog *sharedInstance;
-
-/**
- * Provides access to the underlying logging queue.
- * This may be helpful to Logger classes for things like thread synchronization.
- **/
-@property (class, nonatomic, DISPATCH_QUEUE_REFERENCE_TYPE, readonly) dispatch_queue_t loggingQueue;
-
-/**
- * Logging Primitive.
- *
- * This method is used by the macros or logging functions.
- * It is suggested you stick with the macros as they're easier to use.
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param format the log format
- */
-+ (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(nullable const char *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- format:(NSString *)format, ... NS_FORMAT_FUNCTION(9,10);
-
-/**
- * Logging Primitive.
- *
- * This method is used by the macros or logging functions.
- * It is suggested you stick with the macros as they're easier to use.
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param format the log format
- */
-- (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(nullable const char *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- format:(NSString *)format, ... NS_FORMAT_FUNCTION(9,10);
-
-/**
- * Logging Primitive.
- *
- * This method can be used if you have a prepared va_list.
- * Similar to `log:level:flag:context:file:function:line:tag:format:...`
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param format the log format
- * @param argList the arguments list as a va_list
- */
-+ (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(nullable const char *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- format:(NSString *)format
- args:(va_list)argList NS_SWIFT_NAME(log(asynchronous:level:flag:context:file:function:line:tag:format:arguments:));
-
-/**
- * Logging Primitive.
- *
- * This method can be used if you have a prepared va_list.
- * Similar to `log:level:flag:context:file:function:line:tag:format:...`
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param format the log format
- * @param argList the arguments list as a va_list
- */
-- (void)log:(BOOL)asynchronous
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(const char *)file
- function:(nullable const char *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- format:(NSString *)format
- args:(va_list)argList NS_SWIFT_NAME(log(asynchronous:level:flag:context:file:function:line:tag:format:arguments:));
-
-/**
- * Logging Primitive.
- *
- * This method can be used if you manually prepared DDLogMessage.
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param logMessage the log message stored in a `DDLogMessage` model object
- */
-+ (void)log:(BOOL)asynchronous
- message:(DDLogMessage *)logMessage NS_SWIFT_NAME(log(asynchronous:message:));
-
-/**
- * Logging Primitive.
- *
- * This method can be used if you manually prepared DDLogMessage.
- *
- * @param asynchronous YES if the logging is done async, NO if you want to force sync
- * @param logMessage the log message stored in a `DDLogMessage` model object
- */
-- (void)log:(BOOL)asynchronous
- message:(DDLogMessage *)logMessage NS_SWIFT_NAME(log(asynchronous:message:));
-
-/**
- * Since logging can be asynchronous, there may be times when you want to flush the logs.
- * The framework invokes this automatically when the application quits.
- **/
-+ (void)flushLog;
-
-/**
- * Since logging can be asynchronous, there may be times when you want to flush the logs.
- * The framework invokes this automatically when the application quits.
- **/
-- (void)flushLog;
-
-/**
- * Loggers
- *
- * In order for your log statements to go somewhere, you should create and add a logger.
- *
- * You can add multiple loggers in order to direct your log statements to multiple places.
- * And each logger can be configured separately.
- * So you could have, for example, verbose logging to the console, but a concise log file with only warnings & errors.
- **/
-
-/**
- * Adds the logger to the system.
- *
- * This is equivalent to invoking `[DDLog addLogger:logger withLogLevel:DDLogLevelAll]`.
- **/
-+ (void)addLogger:(id <DDLogger>)logger;
-
-/**
- * Adds the logger to the system.
- *
- * This is equivalent to invoking `[DDLog addLogger:logger withLogLevel:DDLogLevelAll]`.
- **/
-- (void)addLogger:(id <DDLogger>)logger;
-
-/**
- * Adds the logger to the system.
- *
- * The level that you provide here is a preemptive filter (for performance).
- * That is, the level specified here will be used to filter out logMessages so that
- * the logger is never even invoked for the messages.
- *
- * More information:
- * When you issue a log statement, the logging framework iterates over each logger,
- * and checks to see if it should forward the logMessage to the logger.
- * This check is done using the level parameter passed to this method.
- *
- * For example:
- *
- * `[DDLog addLogger:consoleLogger withLogLevel:DDLogLevelVerbose];`
- * `[DDLog addLogger:fileLogger withLogLevel:DDLogLevelWarning];`
- *
- * `DDLogError(@"oh no");` => gets forwarded to consoleLogger & fileLogger
- * `DDLogInfo(@"hi");` => gets forwarded to consoleLogger only
- *
- * It is important to remember that Lumberjack uses a BITMASK.
- * Many developers & third party frameworks may define extra log levels & flags.
- * For example:
- *
- * `#define SOME_FRAMEWORK_LOG_FLAG_TRACE (1 << 6) // 0...1000000`
- *
- * So if you specify `DDLogLevelVerbose` to this method, you won't see the framework's trace messages.
- *
- * `(SOME_FRAMEWORK_LOG_FLAG_TRACE & DDLogLevelVerbose) => (01000000 & 00011111) => NO`
- *
- * Consider passing `DDLogLevelAll` to this method, which has all bits set.
- * You can also use the exclusive-or bitwise operator to get a bitmask that has all flags set,
- * except the ones you explicitly don't want. For example, if you wanted everything except verbose & debug:
- *
- * `((DDLogLevelAll ^ DDLogLevelVerbose) | DDLogLevelInfo)`
- **/
-+ (void)addLogger:(id <DDLogger>)logger withLevel:(DDLogLevel)level;
-
-/**
- * Adds the logger to the system.
- *
- * The level that you provide here is a preemptive filter (for performance).
- * That is, the level specified here will be used to filter out logMessages so that
- * the logger is never even invoked for the messages.
- *
- * More information:
- * When you issue a log statement, the logging framework iterates over each logger,
- * and checks to see if it should forward the logMessage to the logger.
- * This check is done using the level parameter passed to this method.
- *
- * For example:
- *
- * `[DDLog addLogger:consoleLogger withLogLevel:DDLogLevelVerbose];`
- * `[DDLog addLogger:fileLogger withLogLevel:DDLogLevelWarning];`
- *
- * `DDLogError(@"oh no");` => gets forwarded to consoleLogger & fileLogger
- * `DDLogInfo(@"hi");` => gets forwarded to consoleLogger only
- *
- * It is important to remember that Lumberjack uses a BITMASK.
- * Many developers & third party frameworks may define extra log levels & flags.
- * For example:
- *
- * `#define SOME_FRAMEWORK_LOG_FLAG_TRACE (1 << 6) // 0...1000000`
- *
- * So if you specify `DDLogLevelVerbose` to this method, you won't see the framework's trace messages.
- *
- * `(SOME_FRAMEWORK_LOG_FLAG_TRACE & DDLogLevelVerbose) => (01000000 & 00011111) => NO`
- *
- * Consider passing `DDLogLevelAll` to this method, which has all bits set.
- * You can also use the exclusive-or bitwise operator to get a bitmask that has all flags set,
- * except the ones you explicitly don't want. For example, if you wanted everything except verbose & debug:
- *
- * `((DDLogLevelAll ^ DDLogLevelVerbose) | DDLogLevelInfo)`
- **/
-- (void)addLogger:(id <DDLogger>)logger withLevel:(DDLogLevel)level;
-
-/**
- * Remove the logger from the system
- */
-+ (void)removeLogger:(id <DDLogger>)logger;
-
-/**
- * Remove the logger from the system
- */
-- (void)removeLogger:(id <DDLogger>)logger;
-
-/**
- * Remove all the current loggers
- */
-+ (void)removeAllLoggers;
-
-/**
- * Remove all the current loggers
- */
-- (void)removeAllLoggers;
-
-/**
- * Return all the current loggers
- */
-@property (class, nonatomic, copy, readonly) NSArray<id<DDLogger>> *allLoggers;
-
-/**
- * Return all the current loggers
- */
-@property (nonatomic, copy, readonly) NSArray<id<DDLogger>> *allLoggers;
-
-/**
- * Return all the current loggers with their level (aka DDLoggerInformation).
- */
-@property (class, nonatomic, copy, readonly) NSArray<DDLoggerInformation *> *allLoggersWithLevel;
-
-/**
- * Return all the current loggers with their level (aka DDLoggerInformation).
- */
-@property (nonatomic, copy, readonly) NSArray<DDLoggerInformation *> *allLoggersWithLevel;
-
-/**
- * Registered Dynamic Logging
- *
- * These methods allow you to obtain a list of classes that are using registered dynamic logging,
- * and also provides methods to get and set their log level during run time.
- **/
-
-/**
- * Returns an array with the classes that are using registered dynamic logging
- */
-@property (class, nonatomic, copy, readonly) NSArray<Class> *registeredClasses;
-
-/**
- * Returns an array with the classes names that are using registered dynamic logging
- */
-@property (class, nonatomic, copy, readonly) NSArray<NSString*> *registeredClassNames;
-
-/**
- * Returns the current log level for a certain class
- *
- * @param aClass `Class` param
- */
-+ (DDLogLevel)levelForClass:(Class)aClass;
-
-/**
- * Returns the current log level for a certain class
- *
- * @param aClassName string param
- */
-+ (DDLogLevel)levelForClassWithName:(NSString *)aClassName;
-
-/**
- * Set the log level for a certain class
- *
- * @param level the new level
- * @param aClass `Class` param
- */
-+ (void)setLevel:(DDLogLevel)level forClass:(Class)aClass;
-
-/**
- * Set the log level for a certain class
- *
- * @param level the new level
- * @param aClassName string param
- */
-+ (void)setLevel:(DDLogLevel)level forClassWithName:(NSString *)aClassName;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * This protocol describes a basic logger behavior.
- * Basically, it can log messages, store a logFormatter plus a bunch of optional behaviors.
- * (i.e. flush, get its loggerQueue, get its name, ...
- */
-@protocol DDLogger <NSObject>
-
-/**
- * The log message method
- *
- * @param logMessage the message (model)
- */
-- (void)logMessage:(DDLogMessage *)logMessage NS_SWIFT_NAME(log(message:));
-
-/**
- * Formatters may optionally be added to any logger.
- *
- * If no formatter is set, the logger simply logs the message as it is given in logMessage,
- * or it may use its own built in formatting style.
- **/
-@property (nonatomic, strong, nullable) id <DDLogFormatter> logFormatter;
-
-@optional
-
-/**
- * Since logging is asynchronous, adding and removing loggers is also asynchronous.
- * In other words, the loggers are added and removed at appropriate times with regards to log messages.
- *
- * - Loggers will not receive log messages that were executed prior to when they were added.
- * - Loggers will not receive log messages that were executed after they were removed.
- *
- * These methods are executed in the logging thread/queue.
- * This is the same thread/queue that will execute every logMessage: invocation.
- * Loggers may use these methods for thread synchronization or other setup/teardown tasks.
- **/
-- (void)didAddLogger;
-
-/**
- * Since logging is asynchronous, adding and removing loggers is also asynchronous.
- * In other words, the loggers are added and removed at appropriate times with regards to log messages.
- *
- * - Loggers will not receive log messages that were executed prior to when they were added.
- * - Loggers will not receive log messages that were executed after they were removed.
- *
- * These methods are executed in the logging thread/queue given in parameter.
- * This is the same thread/queue that will execute every logMessage: invocation.
- * Loggers may use the queue parameter to set specific values on the queue with dispatch_set_specific() function.
- **/
-- (void)didAddLoggerInQueue:(dispatch_queue_t)queue;
-
-/**
- * See the above description for `didAddLogger`
- */
-- (void)willRemoveLogger;
-
-/**
- * Some loggers may buffer IO for optimization purposes.
- * For example, a database logger may only save occasionally as the disk IO is slow.
- * In such loggers, this method should be implemented to flush any pending IO.
- *
- * This allows invocations of DDLog's flushLog method to be propagated to loggers that need it.
- *
- * Note that DDLog's flushLog method is invoked automatically when the application quits,
- * and it may be also invoked manually by the developer prior to application crashes, or other such reasons.
- **/
-- (void)flush;
-
-/**
- * Each logger is executed concurrently with respect to the other loggers.
- * Thus, a dedicated dispatch queue is used for each logger.
- * Logger implementations may optionally choose to provide their own dispatch queue.
- **/
-@property (nonatomic, DISPATCH_QUEUE_REFERENCE_TYPE, readonly) dispatch_queue_t loggerQueue;
-
-/**
- * If the logger implementation does not choose to provide its own queue,
- * one will automatically be created for it.
- * The created queue will receive its name from this method.
- * This may be helpful for debugging or profiling reasons.
- **/
-@property (copy, nonatomic, readonly) DDLoggerName loggerName;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * This protocol describes the behavior of a log formatter
- */
-@protocol DDLogFormatter <NSObject>
-@required
-
-/**
- * Formatters may optionally be added to any logger.
- * This allows for increased flexibility in the logging environment.
- * For example, log messages for log files may be formatted differently than log messages for the console.
- *
- * For more information about formatters, see the "Custom Formatters" page:
- * Documentation/CustomFormatters.md
- *
- * The formatter may also optionally filter the log message by returning nil,
- * in which case the logger will not log the message.
- **/
-- (nullable NSString *)formatLogMessage:(DDLogMessage *)logMessage NS_SWIFT_NAME(format(message:));
-
-@optional
-
-/**
- * A single formatter instance can be added to multiple loggers.
- * These methods provides hooks to notify the formatter of when it's added/removed.
- *
- * This is primarily for thread-safety.
- * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.
- * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter with 10.0 behavior),
- * it could possibly use these hooks to switch to thread-safe versions of the code.
- **/
-- (void)didAddToLogger:(id <DDLogger>)logger;
-
-/**
- * A single formatter instance can be added to multiple loggers.
- * These methods provides hooks to notify the formatter of when it's added/removed.
- *
- * This is primarily for thread-safety.
- * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers.
- * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter with 10.0 behavior),
- * it could possibly use these hooks to switch to thread-safe versions of the code or use dispatch_set_specific()
-.* to add its own specific values.
- **/
-- (void)didAddToLogger:(id <DDLogger>)logger inQueue:(dispatch_queue_t)queue;
-
-/**
- * See the above description for `didAddToLogger:`
- */
-- (void)willRemoveFromLogger:(id <DDLogger>)logger;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * This protocol describes a dynamic logging component
- */
-@protocol DDRegisteredDynamicLogging
-
-/**
- * Implement these methods to allow a file's log level to be managed from a central location.
- *
- * This is useful if you'd like to be able to change log levels for various parts
- * of your code from within the running application.
- *
- * Imagine pulling up the settings for your application,
- * and being able to configure the logging level on a per file basis.
- *
- * The implementation can be very straight-forward:
- *
- * ```
- * + (int)ddLogLevel
- * {
- * return ddLogLevel;
- * }
- *
- * + (void)ddSetLogLevel:(DDLogLevel)level
- * {
- * ddLogLevel = level;
- * }
- * ```
- **/
-@property (class, nonatomic, readwrite, setter=ddSetLogLevel:) DDLogLevel ddLogLevel;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-#ifndef NS_DESIGNATED_INITIALIZER
- #define NS_DESIGNATED_INITIALIZER
-#endif
-
-/**
- * Log message options, allow copying certain log elements
- */
-typedef NS_OPTIONS(NSInteger, DDLogMessageOptions){
- /**
- * Use this to use a copy of the file path
- */
- DDLogMessageCopyFile = 1 << 0,
- /**
- * Use this to use a copy of the function name
- */
- DDLogMessageCopyFunction = 1 << 1,
- /**
- * Use this to use avoid a copy of the message
- */
- DDLogMessageDontCopyMessage = 1 << 2
-};
-
-/**
- * The `DDLogMessage` class encapsulates information about the log message.
- * If you write custom loggers or formatters, you will be dealing with objects of this class.
- **/
-DD_SENDABLE
-@interface DDLogMessage : NSObject <NSCopying>
-{
- // Direct accessors to be used only for performance
- @public
- NSString *_message;
- NSString *_messageFormat;
- DDLogLevel _level;
- DDLogFlag _flag;
- NSInteger _context;
- NSString *_file;
- NSString *_fileName;
- NSString *_function;
- NSUInteger _line;
-#if DD_LEGACY_MESSAGE_TAG
- id _tag __attribute__((deprecated("Use _representedObject instead", "_representedObject")));
-#endif
- id _representedObject;
- DDLogMessageOptions _options;
- NSDate * _timestamp;
- NSString *_threadID;
- NSString *_threadName;
- NSString *_queueLabel;
- NSUInteger _qos;
-}
-
-/**
- * Default `init` for empty messages.
- */
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/**
- * Standard init method for a log message object.
- * Used by the logging primitives. (And the macros use the logging primitives.)
- *
- * If you find need to manually create logMessage objects, there is one thing you should be aware of:
- *
- * If no flags are passed, the method expects the file and function parameters to be string literals.
- * That is, it expects the given strings to exist for the duration of the object's lifetime,
- * and it expects the given strings to be immutable.
- * In other words, it does not copy these strings, it simply points to them.
- * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters,
- * so it makes sense to optimize and skip the unnecessary allocations.
- * However, if you need them to be copied you may use the options parameter to specify this.
- *
- * @param messageFormat the message format
- * @param message the formatted message
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param options a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.
- * @param timestamp the log timestamp
- *
- * @return a new instance of a log message model object
- */
-- (instancetype)initWithFormat:(NSString *)messageFormat
- formatted:(NSString *)message
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(nullable NSString *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- options:(DDLogMessageOptions)options
- timestamp:(nullable NSDate *)timestamp NS_DESIGNATED_INITIALIZER;
-
-/**
- * Convenience initializer taking a `va_list` as arguments to create the formatted message.
- *
- * @param messageFormat the message format
- * @param messageArgs the message arguments.
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param options a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.
- * @param timestamp the log timestamp
- *
- * @return a new instance of a log message model object
- */
-- (instancetype)initWithFormat:(NSString *)messageFormat
- args:(va_list)messageArgs
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(nullable NSString *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- options:(DDLogMessageOptions)options
- timestamp:(nullable NSDate *)timestamp;
-
-/**
- * Deprecated initialier. See initWithFormat:args:formatted:level:flag:context:file:function:line:tag:options:timestamp:.
- *
- * @param message the message
- * @param level the log level
- * @param flag the log flag
- * @param context the context (if any is defined)
- * @param file the current file
- * @param function the current function
- * @param line the current code line
- * @param tag potential tag
- * @param options a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction.
- * @param timestamp the log timestamp
- *
- * @return a new instance of a log message model object
- */
-- (instancetype)initWithMessage:(NSString *)message
- level:(DDLogLevel)level
- flag:(DDLogFlag)flag
- context:(NSInteger)context
- file:(NSString *)file
- function:(nullable NSString *)function
- line:(NSUInteger)line
- tag:(nullable id)tag
- options:(DDLogMessageOptions)options
- timestamp:(nullable NSDate *)timestamp
-__attribute__((deprecated("Use initializer taking unformatted message and args instead", "initWithFormat:formatted:level:flag:context:file:function:line:tag:options:timestamp:")));
-
-/**
- * Read-only properties
- **/
-
-/**
- * The log message.
- */
-@property (readonly, nonatomic) NSString *message;
-/**
- * The message format. When the deprecated initializer is used, this might be the same as `message`.
- */
-@property (readonly, nonatomic) NSString *messageFormat;
-@property (readonly, nonatomic) DDLogLevel level;
-@property (readonly, nonatomic) DDLogFlag flag;
-@property (readonly, nonatomic) NSInteger context;
-@property (readonly, nonatomic) NSString *file;
-@property (readonly, nonatomic) NSString *fileName;
-@property (readonly, nonatomic, nullable) NSString * function;
-@property (readonly, nonatomic) NSUInteger line;
-#if DD_LEGACY_MESSAGE_TAG
-@property (readonly, nonatomic, nullable) id tag __attribute__((deprecated("Use representedObject instead", "representedObject")));
-#endif
-@property (readonly, nonatomic, nullable) id representedObject;
-@property (readonly, nonatomic) DDLogMessageOptions options;
-@property (readonly, nonatomic) NSDate *timestamp;
-@property (readonly, nonatomic) NSString *threadID; // ID as it appears in NSLog calculated from the machThreadID
-@property (readonly, nonatomic, nullable) NSString *threadName;
-@property (readonly, nonatomic) NSString *queueLabel;
-@property (readonly, nonatomic) NSUInteger qos API_AVAILABLE(macos(10.10), ios(8.0));
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/**
- * The `DDLogger` protocol specifies that an optional formatter can be added to a logger.
- * Most (but not all) loggers will want to support formatters.
- *
- * However, writing getters and setters in a thread safe manner,
- * while still maintaining maximum speed for the logging process, is a difficult task.
- *
- * To do it right, the implementation of the getter/setter has strict requirements:
- * - Must NOT require the `logMessage:` method to acquire a lock.
- * - Must NOT require the `logMessage:` method to access an atomic property (also a lock of sorts).
- *
- * To simplify things, an abstract logger is provided that implements the getter and setter.
- *
- * Logger implementations may simply extend this class,
- * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their `logMessage:` method!
- **/
-@interface DDAbstractLogger : NSObject <DDLogger>
-{
- // Direct accessors to be used only for performance
- @public
- _Nullable id <DDLogFormatter> _logFormatter;
- dispatch_queue_t _loggerQueue;
-}
-
-@property (nonatomic, strong, nullable) id <DDLogFormatter> logFormatter;
-@property (nonatomic, DISPATCH_QUEUE_REFERENCE_TYPE) dispatch_queue_t loggerQueue;
-
-// For thread-safety assertions
-
-/**
- * Return YES if the current logger uses a global queue for logging
- */
-@property (nonatomic, readonly, getter=isOnGlobalLoggingQueue) BOOL onGlobalLoggingQueue;
-
-/**
- * Return YES if the current logger uses the internal designated queue for logging
- */
-@property (nonatomic, readonly, getter=isOnInternalLoggerQueue) BOOL onInternalLoggerQueue;
-
-@end
-
-#define _DDAbstractLoggerSelectorMessage(msg) [NSStringFromSelector(_cmd) stringByAppendingString:@" " msg]
-// Note: we do not wrap these in any do {...} while 0 construct, because NSAssert does that for us.
-#define DDAbstractLoggerAssertOnGlobalLoggingQueue() \
-NSAssert([self isOnGlobalLoggingQueue], _DDAbstractLoggerSelectorMessage("must only be called on the global logging queue!"))
-#define DDAbstractLoggerAssertOnInternalLoggerQueue() \
-NSAssert([self isOnInternalLoggerQueue], _DDAbstractLoggerSelectorMessage("must only be called on the internal logger queue!"))
-#define DDAbstractLoggerAssertNotOnGlobalLoggingQueue() \
- NSAssert(![self isOnGlobalLoggingQueue], _DDAbstractLoggerSelectorMessage("must not be called on the global logging queue!"))
-#define DDAbstractLoggerAssertNotOnInternalLoggerQueue() \
- NSAssert(![self isOnGlobalLoggingQueue], _DDAbstractLoggerSelectorMessage("must not be called on the internal logger queue!"))
-
-#define DDAbstractLoggerAssertLockedPropertyAccess() \
- DDAbstractLoggerAssertNotOnGlobalLoggingQueue(); \
- NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax.")
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark -
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-DD_SENDABLE
-@interface DDLoggerInformation : NSObject
-
-@property (nonatomic, readonly) id <DDLogger> logger;
-@property (nonatomic, readonly) DDLogLevel level;
-
-+ (instancetype)informationWithLogger:(id <DDLogger>)logger
- andLevel:(DDLogLevel)level;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLogMacros.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLogMacros.h
deleted file mode 100644
index 62325cca..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLogMacros.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-/**
- * The constant/variable/method responsible for controlling the current log level.
- **/
-#ifndef LOG_LEVEL_DEF
- #define LOG_LEVEL_DEF ddLogLevel
-#endif
-
-/**
- * Whether async should be used by log messages, excluding error messages that are always sent sync.
- **/
-#ifndef LOG_ASYNC_ENABLED
- #define LOG_ASYNC_ENABLED YES
-#endif
-
-/**
- * These are the two macros that all other macros below compile into.
- * These big multiline macros makes all the other macros easier to read.
- **/
-#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
- [DDLog log : isAsynchronous \
- level : lvl \
- flag : flg \
- context : ctx \
- file : __FILE__ \
- function : fnct \
- line : __LINE__ \
- tag : atag \
- format : (frmt), ## __VA_ARGS__]
-
-#define LOG_MACRO_TO_DDLOG(ddlog, isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \
- [ddlog log : isAsynchronous \
- level : lvl \
- flag : flg \
- context : ctx \
- file : __FILE__ \
- function : fnct \
- line : __LINE__ \
- tag : atag \
- format : (frmt), ## __VA_ARGS__]
-
-/**
- * Define version of the macro that only execute if the log level is above the threshold.
- * The compiled versions essentially look like this:
- *
- * if (logFlagForThisLogMsg & ddLogLevel) { execute log message }
- *
- * When LOG_LEVEL_DEF is defined as ddLogLevel.
- *
- * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels.
- * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques.
- *
- * Note that when compiler optimizations are enabled (as they are for your release builds),
- * the log messages above your logging threshold will automatically be compiled out.
- *
- * (If the compiler sees LOG_LEVEL_DEF/ddLogLevel declared as a constant, the compiler simply checks to see
- * if the 'if' statement would execute, and if not it strips it from the binary.)
- *
- * We also define shorthand versions for asynchronous and synchronous logging.
- **/
-#define LOG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \
- do { if(((NSUInteger)lvl & (NSUInteger)flg) != 0) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)
-
-#define LOG_MAYBE_TO_DDLOG(ddlog, async, lvl, flg, ctx, tag, fnct, frmt, ...) \
- do { if(((NSUInteger)lvl & (NSUInteger)flg) != 0) LOG_MACRO_TO_DDLOG(ddlog, async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0)
-
-/**
- * Ready to use log macros with no context or tag.
- **/
-#define DDLogError(frmt, ...) LOG_MAYBE(NO, LOG_LEVEL_DEF, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogWarn(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogInfo(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogDebug(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogVerbose(frmt, ...) LOG_MAYBE(LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-
-#define DDLogErrorToDDLog(ddlog, frmt, ...) LOG_MAYBE_TO_DDLOG(ddlog, NO, LOG_LEVEL_DEF, DDLogFlagError, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogWarnToDDLog(ddlog, frmt, ...) LOG_MAYBE_TO_DDLOG(ddlog, LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagWarning, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogInfoToDDLog(ddlog, frmt, ...) LOG_MAYBE_TO_DDLOG(ddlog, LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagInfo, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogDebugToDDLog(ddlog, frmt, ...) LOG_MAYBE_TO_DDLOG(ddlog, LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagDebug, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
-#define DDLogVerboseToDDLog(ddlog, frmt, ...) LOG_MAYBE_TO_DDLOG(ddlog, LOG_ASYNC_ENABLED, LOG_LEVEL_DEF, DDLogFlagVerbose, 0, nil, __PRETTY_FUNCTION__, frmt, ##__VA_ARGS__)
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLoggerNames.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLoggerNames.h
deleted file mode 100644
index 7aec9d71..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDLoggerNames.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NSString *DDLoggerName NS_EXTENSIBLE_STRING_ENUM;
-
-FOUNDATION_EXPORT DDLoggerName const DDLoggerNameOS NS_SWIFT_NAME(DDLoggerName.os); // DDOSLogger
-FOUNDATION_EXPORT DDLoggerName const DDLoggerNameFile NS_SWIFT_NAME(DDLoggerName.file); // DDFileLogger
-
-FOUNDATION_EXPORT DDLoggerName const DDLoggerNameTTY NS_SWIFT_NAME(DDLoggerName.tty); // DDTTYLogger
-
-API_DEPRECATED("Use DDOSLogger instead", macosx(10.4, 10.12), ios(2.0, 10.0), watchos(2.0, 3.0), tvos(9.0, 10.0))
-FOUNDATION_EXPORT DDLoggerName const DDLoggerNameASL NS_SWIFT_NAME(DDLoggerName.asl); // DDASLLogger
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDMultiFormatter.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDMultiFormatter.h
deleted file mode 100644
index a53b68ac..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDMultiFormatter.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <Foundation/Foundation.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This formatter can be used to chain different formatters together.
- * The log message will processed in the order of the formatters added.
- **/
-@interface DDMultiFormatter : NSObject <DDLogFormatter>
-
-/**
- * Array of chained formatters
- */
-@property (nonatomic, readonly) NSArray<id<DDLogFormatter>> *formatters;
-
-/**
- * Add a new formatter
- */
-- (void)addFormatter:(id<DDLogFormatter>)formatter NS_SWIFT_NAME(add(_:));
-
-/**
- * Remove a formatter
- */
-- (void)removeFormatter:(id<DDLogFormatter>)formatter NS_SWIFT_NAME(remove(_:));
-
-/**
- * Remove all existing formatters
- */
-- (void)removeAllFormatters NS_SWIFT_NAME(removeAll());
-
-/**
- * Check if a certain formatter is used
- */
-- (BOOL)isFormattingWithFormatter:(id<DDLogFormatter>)formatter;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDOSLogger.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDOSLogger.h
deleted file mode 100644
index 13e032c1..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDOSLogger.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-#import <TargetConditionals.h>
-#import <Foundation/Foundation.h>
-#import <os/log.h>
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/// Describes a type that maps CocoaLumberjack log levels to os\_log levels (`os_log_type_t`).
-API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
-DD_SENDABLE
-@protocol DDOSLogLevelMapper <NSObject>
-
-/// Maps the given `DDLogFlag` to a `os_log_type_t`.
-/// - Parameter logFlag: `DDLogFlag` for which to return the os log type.
-- (os_log_type_t)osLogTypeForLogFlag:(DDLogFlag)logFlag;
-
-@end
-
-/// The default os\_log level mapper.
-/// Uses the following mapping:
-/// - `DDLogFlagError` -> `OS_LOG_TYPE_ERROR`
-/// - `DDLogFlagWarning` -> `OS_LOG_TYPE_ERROR`
-/// - `DDLogFlagInfo` -> `OS_LOG_TYPE_INFO`
-/// - `DDLogFlagDebug` -> `OS_LOG_TYPE_DEBUG`
-/// - `DDLogFlagVerbose` -> `OS_LOG_TYPE_DEBUG`
-API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
-DD_SENDABLE
-@interface DDOSLogLevelMapperDefault : NSObject <DDOSLogLevelMapper>
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-@end
-
-#if TARGET_OS_SIMULATOR
-/// An os\_log level mapper that works around the fact that `OS_LOG_TYPE_DEBUG` messages logged in the simulator do not show up in the Console.app.
-/// Performs the same mapping as ``DDOSLogLevelMapperDefault``, except that `OS_LOG_TYPE_DEBUG` is raised to `OS_LOG_TYPE_DEFAULT`.
-/// See [this thread](https://developer.apple.com/forums/thread/82736?answerId=761544022#761544022) in the Apple Developer Forums.
-API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
-DD_SENDABLE
-@interface DDOSLogLevelMapperSimulatorConsoleAppWorkaround : DDOSLogLevelMapperDefault
-@end
-#endif
-
-/// This class provides a logger for the Apple os\_log facility.
-API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0))
-DD_SENDABLE
-@interface DDOSLogger : DDAbstractLogger <DDLogger>
-
-/// The shared instance using `OS_LOG_DEFAULT`.
-@property (nonatomic, class, readonly, strong) DDOSLogger *sharedInstance;
-
-/// The log level mapper, that maps ``DDLogFlag``s to ``os_log_type_t`` for this logger.
-@property (nonatomic, strong, readonly) id<DDOSLogLevelMapper> logLevelMapper;
-
-/// The designated initializer, using `DDOSLogLevelMapperDefault`.
-/// @param subsystem Desired subsystem in log. E.g. "org.example"
-/// @param category Desired category in log. E.g. "Point of interests."
-/// @discussion This method requires either both or no parameter to be set. Much like `(String, String)?` in Swift.
-/// If both parameters are nil, this method will return a logger configured with `OS_LOG_DEFAULT`.
-/// If both parameters are non-nil, it will return a logger configured with `os_log_create(subsystem, category)`.
-- (instancetype)initWithSubsystem:(nullable NSString *)subsystem
- category:(nullable NSString *)category NS_DESIGNATED_INITIALIZER;
-
-/// Creates an instance that uses `OS_LOG_DEFAULT` and `DDOSLogLevelMapperDefault`.
-- (instancetype)init;
-
-/// An initializer that in addition to subsystem and category also allows providing the log level mapper.
-/// @param subsystem Desired subsystem in log. E.g. "org.example"
-/// @param category Desired category in log. E.g. "Point of interests."
-/// @param logLevelMapper The log level mapper to use.
-/// @discussion This method requires either both or no parameter to be set. Much like `(String, String)?` in Swift.
-/// If both parameters are nil, this method will return a logger configured with `OS_LOG_DEFAULT`.
-/// If both parameters are non-nil, it will return a logger configured with `os_log_create(subsystem, category)`
-- (instancetype)initWithSubsystem:(nullable NSString *)subsystem
- category:(nullable NSString *)category
- logLevelMapper:(id<DDOSLogLevelMapper>)logLevelMapper;
-// FIXME: This should actually be the designated initializer, but that would be a breaking change. Adjust in next version bump.
-
-/// Creates an instance that uses `OS_LOG_DEFAULT`.
-/// @param logLevelMapper The log level mapper to use.
-- (instancetype)initWithLogLevelMapper:(id<DDOSLogLevelMapper>)logLevelMapper;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDTTYLogger.h b/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDTTYLogger.h
deleted file mode 100644
index 610c2e5d..00000000
--- a/comwell_key_app/ios/Pods/CocoaLumberjack/Sources/CocoaLumberjack/include/CocoaLumberjack/DDTTYLogger.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// Software License Agreement (BSD License)
-//
-// Copyright (c) 2010-2024, Deusty, LLC
-// All rights reserved.
-//
-// Redistribution and use of this software in source and binary forms,
-// with or without modification, are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-//
-// * Neither the name of Deusty nor the names of its contributors may be used
-// to endorse or promote products derived from this software without specific
-// prior written permission of Deusty, LLC.
-
-// Disable legacy macros
-#ifndef DD_LEGACY_MACROS
- #define DD_LEGACY_MACROS 0
-#endif
-
-#import <CocoaLumberjack/DDLog.h>
-
-#define LOG_CONTEXT_ALL INT_MAX
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-function"
-#if !(TARGET_OS_OSX)
- // iOS or tvOS or watchOS
- #import <UIKit/UIColor.h>
- typedef UIColor DDColor;
- static inline DDColor* _Nonnull DDMakeColor(CGFloat r, CGFloat g, CGFloat b) {return [DDColor colorWithRed:(r/(CGFloat)255.0) green:(g/(CGFloat)255.0) blue:(b/(CGFloat)255.0) alpha:1.0];}
-#elif defined(DD_CLI) || !__has_include(<AppKit/NSColor.h>)
- // OS X CLI
- #import <CocoaLumberjack/CLIColor.h>
- typedef CLIColor DDColor;
- static inline DDColor* _Nonnull DDMakeColor(CGFloat r, CGFloat g, CGFloat b) {return [DDColor colorWithCalibratedRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0];}
-#else
- // OS X with AppKit
- #import <AppKit/NSColor.h>
- typedef NSColor DDColor;
- static inline DDColor * _Nonnull DDMakeColor(CGFloat r, CGFloat g, CGFloat b) {return [DDColor colorWithCalibratedRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0];}
-#endif
-#pragma clang diagnostic pop
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class provides a logger for Terminal output or Xcode console output,
- * depending on where you are running your code.
- *
- * As described in the "Getting Started" page,
- * the traditional NSLog() function directs it's output to two places:
- *
- * - Apple System Log (so it shows up in Console.app)
- * - StdErr (if stderr is a TTY, so log statements show up in Xcode console)
- *
- * To duplicate NSLog() functionality you can simply add this logger and an asl logger.
- * However, if you instead choose to use file logging (for faster performance),
- * you may choose to use only a file logger and a tty logger.
- **/
-@interface DDTTYLogger : DDAbstractLogger <DDLogger>
-
-/**
- * Singleton instance. Returns `nil` if the initialization of the DDTTYLogger fails.
- */
-@property (nonatomic, class, readonly, strong, nullable) DDTTYLogger *sharedInstance;
-
-/* Inherited from the DDLogger protocol:
- *
- * Formatters may optionally be added to any logger.
- *
- * If no formatter is set, the logger simply logs the message as it is given in logMessage,
- * or it may use its own built in formatting style.
- *
- * More information about formatters can be found here:
- * Documentation/CustomFormatters.md
- *
- * The actual implementation of these methods is inherited from DDAbstractLogger.
-
- - (id <DDLogFormatter>)logFormatter;
- - (void)setLogFormatter:(id <DDLogFormatter>)formatter;
-
- */
-
-/**
- * Want to use different colors for different log levels?
- * Enable this property.
- *
- * If you run the application via the Terminal (not Xcode),
- * the logger will map colors to xterm-256color or xterm-color (if available).
- *
- * Xcode does NOT natively support colors in the Xcode debugging console.
- * You'll need to install the XcodeColors plugin to see colors in the Xcode console.
- * https://github.com/robbiehanson/XcodeColors
- *
- * The default value is NO.
- **/
-@property (readwrite, assign) BOOL colorsEnabled;
-
-/**
- * When using a custom formatter you can set the `logMessage` method not to append
- * `\n` character after each output. This allows for some greater flexibility with
- * custom formatters. Default value is YES.
- **/
-@property (nonatomic, readwrite, assign) BOOL automaticallyAppendNewlineForCustomFormatters;
-
-/**
- Using this initializer is not supported. Please use `DDTTYLogger.sharedInstance`.
- **/
-- (instancetype)init NS_UNAVAILABLE;
-
-/**
- * The default color set (foregroundColor, backgroundColor) is:
- *
- * - DDLogFlagError = (red, nil)
- * - DDLogFlagWarning = (orange, nil)
- *
- * You can customize the colors however you see fit.
- * Please note that you are passing a flag, NOT a level.
- *
- * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:DDLogFlagInfo]; // <- Good :)
- * BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:DDLogLevelInfo]; // <- BAD! :(
- *
- * DDLogFlagInfo = 0...00100
- * DDLogLevelInfo = 0...00111 <- Would match DDLogFlagInfo and DDLogFlagWarning and DDLogFlagError
- *
- * If you run the application within Xcode, then the XcodeColors plugin is required.
- *
- * If you run the application from a shell, then DDTTYLogger will automatically map the given color to
- * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.)
- *
- * This method invokes setForegroundColor:backgroundColor:forFlag:context: and applies it to `LOG_CONTEXT_ALL`.
- **/
-- (void)setForegroundColor:(nullable DDColor *)txtColor backgroundColor:(nullable DDColor *)bgColor forFlag:(DDLogFlag)mask;
-
-/**
- * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context.
- *
- * A logging context is often used to identify log messages coming from a 3rd party framework,
- * although logging context's can be used for many different functions.
- *
- * Use LOG_CONTEXT_ALL to set the default color for all contexts that have no specific color set defined.
- *
- * Logging context's are explained in further detail here:
- * Documentation/CustomContext.md
- **/
-- (void)setForegroundColor:(nullable DDColor *)txtColor backgroundColor:(nullable DDColor *)bgColor forFlag:(DDLogFlag)mask context:(NSInteger)ctxt;
-
-/**
- * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile.
- * For example, you could do something like this:
- *
- * static NSString *const PurpleTag = @"PurpleTag";
- *
- * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__)
- *
- * And then where you configure CocoaLumberjack:
- *
- * purple = DDMakeColor((64/255.0), (0/255.0), (128/255.0));
- *
- * or any UIColor/NSColor constructor.
- *
- * Note: For CLI OS X projects that don't link with AppKit use CLIColor objects instead
- *
- * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag];
- * [DDLog addLogger:[DDTTYLogger sharedInstance]];
- *
- * This would essentially give you a straight NSLog replacement that prints in purple:
- *
- * DDLogPurple(@"I'm a purple log message!");
- **/
-- (void)setForegroundColor:(nullable DDColor *)txtColor backgroundColor:(nullable DDColor *)bgColor forTag:(id <NSCopying>)tag;
-
-/**
- * Clearing color profiles.
- **/
-- (void)clearColorsForFlag:(DDLogFlag)mask;
-- (void)clearColorsForFlag:(DDLogFlag)mask context:(NSInteger)context;
-- (void)clearColorsForTag:(id <NSCopying>)tag;
-- (void)clearColorsForAllFlags;
-- (void)clearColorsForAllTags;
-- (void)clearAllColors;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.h
deleted file mode 100644
index c4ca47cc..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.h
+++ /dev/null
@@ -1,284 +0,0 @@
-//
-// JSONModel.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-#import "JSONModelError.h"
-#import "JSONValueTransformer.h"
-#import "JSONKeyMapper.h"
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-#if TARGET_IPHONE_SIMULATOR
-#define JMLog( s, ... ) NSLog( @"[%@:%d] %@", [[NSString stringWithUTF8String:__FILE__] \
-lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
-#else
-#define JMLog( s, ... )
-#endif
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-DEPRECATED_ATTRIBUTE
-@protocol ConvertOnDemand
-@end
-
-DEPRECATED_ATTRIBUTE
-@protocol Index
-@end
-
-#pragma mark - Property Protocols
-/**
- * Protocol for defining properties in a JSON Model class that should not be considered at all
- * neither while importing nor when exporting JSON.
- *
- * @property (strong, nonatomic) NSString <Ignore> *propertyName;
- *
- */
-@protocol Ignore
-@end
-
-/**
- * Protocol for defining optional properties in a JSON Model class. Use like below to define
- * model properties that are not required to have values in the JSON input:
- *
- * @property (strong, nonatomic) NSString <Optional> *propertyName;
- *
- */
-@protocol Optional
-@end
-
-/**
- * Make all objects compatible to avoid compiler warnings
- */
-@interface NSObject (JSONModelPropertyCompatibility) <Optional, Ignore>
-@end
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark - JSONModel protocol
-/**
- * A protocol describing an abstract JSONModel class
- * JSONModel conforms to this protocol, so it can use itself abstractly
- */
-@protocol AbstractJSONModelProtocol <NSCopying, NSCoding>
-
-@required
-/**
- * All JSONModel classes should implement initWithDictionary:
- *
- * For most classes the default initWithDictionary: inherited from JSONModel itself
- * should suffice, but developers have the option to also overwrite it if needed.
- *
- * @param dict a dictionary holding JSON objects, to be imported in the model.
- * @param err an error or NULL
- */
-- (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err;
-
-
-/**
- * All JSONModel classes should implement initWithData:error:
- *
- * For most classes the default initWithData: inherited from JSONModel itself
- * should suffice, but developers have the option to also overwrite it if needed.
- *
- * @param data representing a JSON response (usually fetched from web), to be imported in the model.
- * @param error an error or NULL
- */
-- (instancetype)initWithData:(NSData *)data error:(NSError **)error;
-
-/**
- * All JSONModel classes should be able to export themselves as a dictionary of
- * JSON compliant objects.
- *
- * For most classes the inherited from JSONModel default toDictionary implementation
- * should suffice.
- *
- * @return NSDictionary dictionary of JSON compliant objects
- * @exception JSONModelTypeNotAllowedException thrown when one of your model's custom class properties
- * does not have matching transformer method in an JSONValueTransformer.
- */
-- (NSDictionary *)toDictionary;
-
-/**
- * Export a model class to a dictionary, including only given properties
- *
- * @param propertyNames the properties to export; if nil, all properties exported
- * @return NSDictionary dictionary of JSON compliant objects
- * @exception JSONModelTypeNotAllowedException thrown when one of your model's custom class properties
- * does not have matching transformer method in an JSONValueTransformer.
- */
-- (NSDictionary *)toDictionaryWithKeys:(NSArray <NSString *> *)propertyNames;
-@end
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-#pragma mark - JSONModel interface
-/**
- * The JSONModel is an abstract model class, you should not instantiate it directly,
- * as it does not have any properties, and therefore cannot serve as a data model.
- * Instead you should subclass it, and define the properties you want your data model
- * to have as properties of your own class.
- */
-@interface JSONModel : NSObject <AbstractJSONModelProtocol, NSSecureCoding>
-
-// deprecated
-+ (NSMutableArray *)arrayOfModelsFromDictionaries:(NSArray *)array DEPRECATED_MSG_ATTRIBUTE("use arrayOfModelsFromDictionaries:error:");
-+ (void)setGlobalKeyMapper:(JSONKeyMapper *)globalKeyMapper DEPRECATED_MSG_ATTRIBUTE("override +keyMapper in a base model class instead");
-+ (NSString *)protocolForArrayProperty:(NSString *)propertyName DEPRECATED_MSG_ATTRIBUTE("use classForCollectionProperty:");
-- (void)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping DEPRECATED_MSG_ATTRIBUTE("use mergeFromDictionary:useKeyMapping:error:");
-- (NSString *)indexPropertyName DEPRECATED_ATTRIBUTE;
-- (NSComparisonResult)compare:(id)object DEPRECATED_ATTRIBUTE;
-
-/** @name Creating and initializing models */
-
-/**
- * Create a new model instance and initialize it with the JSON from a text parameter. The method assumes UTF8 encoded input text.
- * @param string JSON text data
- * @param err an initialization error or nil
- * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON,
- * or a property type in your model is not supported by JSONValueTransformer and its categories
- * @see initWithString:usingEncoding:error: for use of custom text encodings
- */
-- (instancetype)initWithString:(NSString *)string error:(JSONModelError **)err;
-
-/**
- * Create a new model instance and initialize it with the JSON from a text parameter using the given encoding.
- * @param string JSON text data
- * @param encoding the text encoding to use when parsing the string (see NSStringEncoding)
- * @param err an initialization error or nil
- * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON,
- * or a property type in your model is not supported by JSONValueTransformer and its categories
- */
-- (instancetype)initWithString:(NSString *)string usingEncoding:(NSStringEncoding)encoding error:(JSONModelError **)err;
-
-/** @name Exporting model contents */
-
-/**
- * Export the whole object to a JSON data text string
- * @return JSON text describing the data model
- */
-- (NSString *)toJSONString;
-
-/**
- * Export the whole object to a JSON data text string
- * @return JSON text data describing the data model
- */
-- (NSData *)toJSONData;
-
-/**
- * Export the specified properties of the object to a JSON data text string
- * @param propertyNames the properties to export; if nil, all properties exported
- * @return JSON text describing the data model
- */
-- (NSString *)toJSONStringWithKeys:(NSArray <NSString *> *)propertyNames;
-
-/**
- * Export the specified properties of the object to a JSON data text string
- * @param propertyNames the properties to export; if nil, all properties exported
- * @return JSON text data describing the data model
- */
-- (NSData *)toJSONDataWithKeys:(NSArray <NSString *> *)propertyNames;
-
-/** @name Batch methods */
-
-/**
- * If you have a list of dictionaries in a JSON feed, you can use this method to create an NSArray
- * of model objects. Handy when importing JSON data lists.
- * This method will loop over the input list and initialize a data model for every dictionary in the list.
- *
- * @param array list of dictionaries to be imported as models
- * @return list of initialized data model objects
- * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON,
- * or a property type in your model is not supported by JSONValueTransformer and its categories
- * @exception JSONModelInvalidDataException thrown when the input data does not include all required keys
- * @see arrayOfDictionariesFromModels:
- */
-+ (NSMutableArray *)arrayOfModelsFromDictionaries:(NSArray *)array error:(NSError **)err;
-+ (NSMutableArray *)arrayOfModelsFromData:(NSData *)data error:(NSError **)err;
-+ (NSMutableArray *)arrayOfModelsFromString:(NSString *)string error:(NSError **)err;
-+ (NSMutableDictionary *)dictionaryOfModelsFromDictionary:(NSDictionary *)dictionary error:(NSError **)err;
-+ (NSMutableDictionary *)dictionaryOfModelsFromData:(NSData *)data error:(NSError **)err;
-+ (NSMutableDictionary *)dictionaryOfModelsFromString:(NSString *)string error:(NSError **)err;
-
-/**
- * If you have an NSArray of data model objects, this method takes it in and outputs a list of the
- * matching dictionaries. This method does the opposite of arrayOfObjectsFromDictionaries:
- * @param array list of JSONModel objects
- * @return a list of NSDictionary objects
- * @exception JSONModelTypeNotAllowedException thrown when unsupported type is found in the incoming JSON,
- * or a property type in your model is not supported by JSONValueTransformer and its categories
- * @see arrayOfModelsFromDictionaries:
- */
-+ (NSMutableArray *)arrayOfDictionariesFromModels:(NSArray *)array;
-+ (NSMutableDictionary *)dictionaryOfDictionariesFromModels:(NSDictionary *)dictionary;
-
-/** @name Validation */
-
-/**
- * Overwrite the validate method in your own models if you need to perform some custom validation over the model data.
- * This method gets called at the very end of the JSONModel initializer, thus the model is in the state that you would
- * get it back when initialized. Check the values of any property that needs to be validated and if any invalid values
- * are encountered return NO and set the error parameter to an NSError object. If the model is valid return YES.
- *
- * NB: Only setting the error parameter is not enough to fail the validation, you also need to return a NO value.
- *
- * @param error a pointer to an NSError object, to pass back an error if needed
- * @return a BOOL result, showing whether the model data validates or not. You can use the convenience method
- * [JSONModelError errorModelIsInvalid] to set the NSError param if the data fails your custom validation
- */
-- (BOOL)validate:(NSError **)error;
-
-/** @name Key mapping */
-/**
- * Overwrite in your models if your property names don't match your JSON key names.
- * Lookup JSONKeyMapper docs for more details.
- */
-+ (JSONKeyMapper *)keyMapper;
-
-/**
- * Indicates whether the property with the given name is Optional.
- * To have a model with all of its properties being Optional just return YES.
- * This method returns by default NO, since the default behaviour is to have all properties required.
- * @param propertyName the name of the property
- * @return a BOOL result indicating whether the property is optional
- */
-+ (BOOL)propertyIsOptional:(NSString *)propertyName;
-
-/**
- * Indicates whether the property with the given name is Ignored.
- * To have a model with all of its properties being Ignored just return YES.
- * This method returns by default NO, since the default behaviour is to have all properties required.
- * @param propertyName the name of the property
- * @return a BOOL result indicating whether the property is ignored
- */
-+ (BOOL)propertyIsIgnored:(NSString *)propertyName;
-
-/**
- * Indicates the class used for the elements of a collection property.
- * Rather than using:
- * @property (strong) NSArray <MyType> *things;
- * You can implement classForCollectionProperty: and keep your property
- * defined like:
- * @property (strong) NSArray *things;
- * @param propertyName the name of the property
- * @return Class the class used to deserialize the elements of the collection
- *
- * Example in Swift 3.0:
- * override static func classForCollectionProperty(propertyName: String) -> AnyClass? {
- * switch propertyName {
- * case "childModel":
- * return ChildModel.self
- * default:
- * return nil
- * }
- * }
- */
-+ (Class)classForCollectionProperty:(NSString *)propertyName NS_SWIFT_NAME(classForCollectionProperty(propertyName:));
-
-/**
- * Merges values from the given dictionary into the model instance.
- * @param dict dictionary with values
- * @param useKeyMapping if YES the method will use the model's key mapper and the global key mapper, if NO
- * it'll just try to match the dictionary keys to the model's properties
- */
-- (BOOL)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping error:(NSError **)error;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.m
deleted file mode 100644
index 4ae211a1..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModel.m
+++ /dev/null
@@ -1,1387 +0,0 @@
-//
-// JSONModel.m
-// JSONModel
-//
-
-#if !__has_feature(objc_arc)
-#error The JSONMOdel framework is ARC only, you can enable ARC on per file basis.
-#endif
-
-
-#import <objc/runtime.h>
-#import <objc/message.h>
-
-
-#import "JSONModel.h"
-#import "JSONModelClassProperty.h"
-
-#pragma mark - associated objects names
-static const char * kMapperObjectKey;
-static const char * kClassPropertiesKey;
-static const char * kClassRequiredPropertyNamesKey;
-static const char * kIndexPropertyNameKey;
-
-#pragma mark - class static variables
-static NSArray* allowedJSONTypes = nil;
-static NSArray* allowedPrimitiveTypes = nil;
-static JSONValueTransformer* valueTransformer = nil;
-static Class JSONModelClass = NULL;
-
-#pragma mark - model cache
-static JSONKeyMapper* globalKeyMapper = nil;
-
-#pragma mark - JSONModel implementation
-@implementation JSONModel
-{
- NSString* _description;
-}
-
-#pragma mark - initialization methods
-
-+(void)load
-{
- static dispatch_once_t once;
- dispatch_once(&once, ^{
- // initialize all class static objects,
- // which are common for ALL JSONModel subclasses
-
- @autoreleasepool {
- allowedJSONTypes = @[
- [NSString class], [NSNumber class], [NSDecimalNumber class], [NSArray class], [NSDictionary class], [NSNull class], //immutable JSON classes
- [NSMutableString class], [NSMutableArray class], [NSMutableDictionary class] //mutable JSON classes
- ];
-
- allowedPrimitiveTypes = @[
- @"BOOL", @"float", @"int", @"long", @"double", @"short",
- @"unsigned int", @"usigned long", @"long long", @"unsigned long long", @"unsigned short", @"char", @"unsigned char",
- //and some famous aliases
- @"NSInteger", @"NSUInteger",
- @"Block"
- ];
-
- valueTransformer = [[JSONValueTransformer alloc] init];
-
- // This is quite strange, but I found the test isSubclassOfClass: (line ~291) to fail if using [JSONModel class].
- // somewhat related: https://stackoverflow.com/questions/6524165/nsclassfromstring-vs-classnamednsstring
- // //; seems to break the unit tests
-
- // Using NSClassFromString instead of [JSONModel class], as this was breaking unit tests, see below
- //http://stackoverflow.com/questions/21394919/xcode-5-unit-test-seeing-wrong-class
- JSONModelClass = NSClassFromString(NSStringFromClass(self));
- }
- });
-}
-
--(void)__setup__
-{
- //if first instance of this model, generate the property list
- if (!objc_getAssociatedObject(self.class, &kClassPropertiesKey)) {
- [self __inspectProperties];
- }
-
- //if there's a custom key mapper, store it in the associated object
- id mapper = [[self class] keyMapper];
- if ( mapper && !objc_getAssociatedObject(self.class, &kMapperObjectKey) ) {
- objc_setAssociatedObject(
- self.class,
- &kMapperObjectKey,
- mapper,
- OBJC_ASSOCIATION_RETAIN // This is atomic
- );
- }
-}
-
--(id)init
-{
- self = [super init];
- if (self) {
- //do initial class setup
- [self __setup__];
- }
- return self;
-}
-
--(instancetype)initWithData:(NSData *)data error:(NSError *__autoreleasing *)err
-{
- //check for nil input
- if (!data) {
- if (err) *err = [JSONModelError errorInputIsNil];
- return nil;
- }
- //read the json
- JSONModelError* initError = nil;
- id obj = [NSJSONSerialization JSONObjectWithData:data
- options:kNilOptions
- error:&initError];
-
- if (initError) {
- if (err) *err = [JSONModelError errorBadJSON];
- return nil;
- }
-
- //init with dictionary
- id objModel = [self initWithDictionary:obj error:&initError];
- if (initError && err) *err = initError;
- return objModel;
-}
-
--(id)initWithString:(NSString*)string error:(JSONModelError**)err
-{
- JSONModelError* initError = nil;
- id objModel = [self initWithString:string usingEncoding:NSUTF8StringEncoding error:&initError];
- if (initError && err) *err = initError;
- return objModel;
-}
-
--(id)initWithString:(NSString *)string usingEncoding:(NSStringEncoding)encoding error:(JSONModelError**)err
-{
- //check for nil input
- if (!string) {
- if (err) *err = [JSONModelError errorInputIsNil];
- return nil;
- }
-
- JSONModelError* initError = nil;
- id objModel = [self initWithData:[string dataUsingEncoding:encoding] error:&initError];
- if (initError && err) *err = initError;
- return objModel;
-
-}
-
--(id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err
-{
- //check for nil input
- if (!dict) {
- if (err) *err = [JSONModelError errorInputIsNil];
- return nil;
- }
-
- //invalid input, just create empty instance
- if (![dict isKindOfClass:[NSDictionary class]]) {
- if (err) *err = [JSONModelError errorInvalidDataWithMessage:@"Attempt to initialize JSONModel object using initWithDictionary:error: but the dictionary parameter was not an 'NSDictionary'."];
- return nil;
- }
-
- //create a class instance
- self = [self init];
- if (!self) {
-
- //super init didn't succeed
- if (err) *err = [JSONModelError errorModelIsInvalid];
- return nil;
- }
-
- //check incoming data structure
- if (![self __doesDictionary:dict matchModelWithKeyMapper:self.__keyMapper error:err]) {
- return nil;
- }
-
- //import the data from a dictionary
- if (![self __importDictionary:dict withKeyMapper:self.__keyMapper validation:YES error:err]) {
- return nil;
- }
-
- //run any custom model validation
- if (![self validate:err]) {
- return nil;
- }
-
- //model is valid! yay!
- return self;
-}
-
--(JSONKeyMapper*)__keyMapper
-{
- //get the model key mapper
- return objc_getAssociatedObject(self.class, &kMapperObjectKey);
-}
-
--(BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMapper:(JSONKeyMapper*)keyMapper error:(NSError**)err
-{
- //check if all required properties are present
- NSArray* incomingKeysArray = [dict allKeys];
- NSMutableSet* requiredProperties = [self __requiredPropertyNames].mutableCopy;
- NSSet* incomingKeys = [NSSet setWithArray: incomingKeysArray];
-
- //transform the key names, if necessary
- if (keyMapper || globalKeyMapper) {
-
- NSMutableSet* transformedIncomingKeys = [NSMutableSet setWithCapacity: requiredProperties.count];
- NSString* transformedName = nil;
-
- //loop over the required properties list
- for (JSONModelClassProperty* property in [self __properties__]) {
-
- transformedName = (keyMapper||globalKeyMapper) ? [self __mapString:property.name withKeyMapper:keyMapper] : property.name;
-
- //check if exists and if so, add to incoming keys
- id value;
- @try {
- value = [dict valueForKeyPath:transformedName];
- }
- @catch (NSException *exception) {
- value = dict[transformedName];
- }
-
- if (value) {
- [transformedIncomingKeys addObject: property.name];
- }
- }
-
- //overwrite the raw incoming list with the mapped key names
- incomingKeys = transformedIncomingKeys;
- }
-
- //check for missing input keys
- if (![requiredProperties isSubsetOfSet:incomingKeys]) {
-
- //get a list of the missing properties
- [requiredProperties minusSet:incomingKeys];
-
- //not all required properties are in - invalid input
- JMLog(@"Incoming data was invalid [%@ initWithDictionary:]. Keys missing: %@", self.class, requiredProperties);
-
- if (err) *err = [JSONModelError errorInvalidDataWithMissingKeys:requiredProperties];
- return NO;
- }
-
- //not needed anymore
- incomingKeys= nil;
- requiredProperties= nil;
-
- return YES;
-}
-
--(NSString*)__mapString:(NSString*)string withKeyMapper:(JSONKeyMapper*)keyMapper
-{
- if (keyMapper) {
- //custom mapper
- NSString* mappedName = [keyMapper convertValue:string];
- if (globalKeyMapper && [mappedName isEqualToString: string]) {
- mappedName = [globalKeyMapper convertValue:string];
- }
- string = mappedName;
- } else if (globalKeyMapper) {
- //global keymapper
- string = [globalKeyMapper convertValue:string];
- }
-
- return string;
-}
-
--(BOOL)__importDictionary:(NSDictionary*)dict withKeyMapper:(JSONKeyMapper*)keyMapper validation:(BOOL)validation error:(NSError**)err
-{
- //loop over the incoming keys and set self's properties
- for (JSONModelClassProperty* property in [self __properties__]) {
-
- //convert key name to model keys, if a mapper is provided
- NSString* jsonKeyPath = (keyMapper||globalKeyMapper) ? [self __mapString:property.name withKeyMapper:keyMapper] : property.name;
- //JMLog(@"keyPath: %@", jsonKeyPath);
-
- //general check for data type compliance
- id jsonValue;
- @try {
- jsonValue = [dict valueForKeyPath: jsonKeyPath];
- }
- @catch (NSException *exception) {
- jsonValue = dict[jsonKeyPath];
- }
-
- //check for Optional properties
- if (isNull(jsonValue)) {
- //skip this property, continue with next property
- if (property.isOptional || !validation) continue;
-
- if (err) {
- //null value for required property
- NSString* msg = [NSString stringWithFormat:@"Value of required model key %@ is null", property.name];
- JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg];
- *err = [dataErr errorByPrependingKeyPathComponent:property.name];
- }
- return NO;
- }
-
- Class jsonValueClass = [jsonValue class];
- BOOL isValueOfAllowedType = NO;
-
- for (Class allowedType in allowedJSONTypes) {
- if ( [jsonValueClass isSubclassOfClass: allowedType] ) {
- isValueOfAllowedType = YES;
- break;
- }
- }
-
- if (isValueOfAllowedType==NO) {
- //type not allowed
- JMLog(@"Type %@ is not allowed in JSON.", NSStringFromClass(jsonValueClass));
-
- if (err) {
- NSString* msg = [NSString stringWithFormat:@"Type %@ is not allowed in JSON.", NSStringFromClass(jsonValueClass)];
- JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg];
- *err = [dataErr errorByPrependingKeyPathComponent:property.name];
- }
- return NO;
- }
-
- //check if there's matching property in the model
- if (property) {
-
- // check for custom setter, than the model doesn't need to do any guessing
- // how to read the property's value from JSON
- if ([self __customSetValue:jsonValue forProperty:property]) {
- //skip to next JSON key
- continue;
- };
-
- // 0) handle primitives
- if (property.type == nil && property.structName==nil) {
-
- //generic setter
- if (jsonValue != [self valueForKey:property.name]) {
- [self setValue:jsonValue forKey: property.name];
- }
-
- //skip directly to the next key
- continue;
- }
-
- // 0.5) handle nils
- if (isNull(jsonValue)) {
- if ([self valueForKey:property.name] != nil) {
- [self setValue:nil forKey: property.name];
- }
- continue;
- }
-
-
- // 1) check if property is itself a JSONModel
- if ([self __isJSONModelSubClass:property.type]) {
-
- //initialize the property's model, store it
- JSONModelError* initErr = nil;
- id value = [[property.type alloc] initWithDictionary: jsonValue error:&initErr];
-
- if (!value) {
- //skip this property, continue with next property
- if (property.isOptional || !validation) continue;
-
- // Propagate the error, including the property name as the key-path component
- if((err != nil) && (initErr != nil))
- {
- *err = [initErr errorByPrependingKeyPathComponent:property.name];
- }
- return NO;
- }
- if (![value isEqual:[self valueForKey:property.name]]) {
- [self setValue:value forKey: property.name];
- }
-
- //for clarity, does the same without continue
- continue;
-
- } else {
-
- // 2) check if there's a protocol to the property
- // ) might or not be the case there's a built in transform for it
- if (property.protocol) {
-
- //JMLog(@"proto: %@", p.protocol);
- jsonValue = [self __transform:jsonValue forProperty:property error:err];
- if (!jsonValue) {
- if ((err != nil) && (*err == nil)) {
- NSString* msg = [NSString stringWithFormat:@"Failed to transform value, but no error was set during transformation. (%@)", property];
- JSONModelError* dataErr = [JSONModelError errorInvalidDataWithMessage:msg];
- *err = [dataErr errorByPrependingKeyPathComponent:property.name];
- }
- return NO;
- }
- }
-
- // 3.1) handle matching standard JSON types
- if (property.isStandardJSONType && [jsonValue isKindOfClass: property.type]) {
-
- //mutable properties
- if (property.isMutable) {
- jsonValue = [jsonValue mutableCopy];
- }
-
- //set the property value
- if (![jsonValue isEqual:[self valueForKey:property.name]]) {
- [self setValue:jsonValue forKey: property.name];
- }
- continue;
- }
-
- // 3.3) handle values to transform
- if (
- (![jsonValue isKindOfClass:property.type] && !isNull(jsonValue))
- ||
- //the property is mutable
- property.isMutable
- ||
- //custom struct property
- property.structName
- ) {
-
- // searched around the web how to do this better
- // but did not find any solution, maybe that's the best idea? (hardly)
- Class sourceClass = [JSONValueTransformer classByResolvingClusterClasses:[jsonValue class]];
-
- //JMLog(@"to type: [%@] from type: [%@] transformer: [%@]", p.type, sourceClass, selectorName);
-
- //build a method selector for the property and json object classes
- NSString* selectorName = [NSString stringWithFormat:@"%@From%@:",
- (property.structName? property.structName : property.type), //target name
- sourceClass]; //source name
- SEL selector = NSSelectorFromString(selectorName);
-
- //check for custom transformer
- BOOL foundCustomTransformer = NO;
- if ([valueTransformer respondsToSelector:selector]) {
- foundCustomTransformer = YES;
- } else {
- //try for hidden custom transformer
- selectorName = [NSString stringWithFormat:@"__%@",selectorName];
- selector = NSSelectorFromString(selectorName);
- if ([valueTransformer respondsToSelector:selector]) {
- foundCustomTransformer = YES;
- }
- }
-
- //check if there's a transformer with that name
- if (foundCustomTransformer) {
- IMP imp = [valueTransformer methodForSelector:selector];
- id (*func)(id, SEL, id) = (void *)imp;
- jsonValue = func(valueTransformer, selector, jsonValue);
-
- if (![jsonValue isEqual:[self valueForKey:property.name]])
- [self setValue:jsonValue forKey:property.name];
- } else {
- if (err) {
- NSString* msg = [NSString stringWithFormat:@"%@ type not supported for %@.%@", property.type, [self class], property.name];
- JSONModelError* dataErr = [JSONModelError errorInvalidDataWithTypeMismatch:msg];
- *err = [dataErr errorByPrependingKeyPathComponent:property.name];
- }
- return NO;
- }
- } else {
- // 3.4) handle "all other" cases (if any)
- if (![jsonValue isEqual:[self valueForKey:property.name]])
- [self setValue:jsonValue forKey:property.name];
- }
- }
- }
- }
-
- return YES;
-}
-
-#pragma mark - property inspection methods
-
--(BOOL)__isJSONModelSubClass:(Class)class
-{
-// http://stackoverflow.com/questions/19883472/objc-nsobject-issubclassofclass-gives-incorrect-failure
-#ifdef UNIT_TESTING
- return [@"JSONModel" isEqualToString: NSStringFromClass([class superclass])];
-#else
- return [class isSubclassOfClass:JSONModelClass];
-#endif
-}
-
-//returns a set of the required keys for the model
--(NSMutableSet*)__requiredPropertyNames
-{
- //fetch the associated property names
- NSMutableSet* classRequiredPropertyNames = objc_getAssociatedObject(self.class, &kClassRequiredPropertyNamesKey);
-
- if (!classRequiredPropertyNames) {
- classRequiredPropertyNames = [NSMutableSet set];
- [[self __properties__] enumerateObjectsUsingBlock:^(JSONModelClassProperty* p, NSUInteger idx, BOOL *stop) {
- if (!p.isOptional) [classRequiredPropertyNames addObject:p.name];
- }];
-
- //persist the list
- objc_setAssociatedObject(
- self.class,
- &kClassRequiredPropertyNamesKey,
- classRequiredPropertyNames,
- OBJC_ASSOCIATION_RETAIN // This is atomic
- );
- }
- return classRequiredPropertyNames;
-}
-
-//returns a list of the model's properties
--(NSArray*)__properties__
-{
- //fetch the associated object
- NSDictionary* classProperties = objc_getAssociatedObject(self.class, &kClassPropertiesKey);
- if (classProperties) return [classProperties allValues];
-
- //if here, the class needs to inspect itself
- [self __setup__];
-
- //return the property list
- classProperties = objc_getAssociatedObject(self.class, &kClassPropertiesKey);
- return [classProperties allValues];
-}
-
-//inspects the class, get's a list of the class properties
--(void)__inspectProperties
-{
- //JMLog(@"Inspect class: %@", [self class]);
-
- NSMutableDictionary* propertyIndex = [NSMutableDictionary dictionary];
-
- //temp variables for the loops
- Class class = [self class];
- NSScanner* scanner = nil;
- NSString* propertyType = nil;
-
- // inspect inherited properties up to the JSONModel class
- while (class != [JSONModel class]) {
- //JMLog(@"inspecting: %@", NSStringFromClass(class));
-
- unsigned int propertyCount;
- objc_property_t *properties = class_copyPropertyList(class, &propertyCount);
-
- //loop over the class properties
- for (unsigned int i = 0; i < propertyCount; i++) {
-
- JSONModelClassProperty* p = [[JSONModelClassProperty alloc] init];
-
- //get property name
- objc_property_t property = properties[i];
- const char *propertyName = property_getName(property);
- p.name = @(propertyName);
-
- //JMLog(@"property: %@", p.name);
-
- //get property attributes
- const char *attrs = property_getAttributes(property);
- NSString* propertyAttributes = @(attrs);
- NSArray* attributeItems = [propertyAttributes componentsSeparatedByString:@","];
-
- //ignore read-only properties
- if ([attributeItems containsObject:@"R"]) {
- continue; //to next property
- }
-
- scanner = [NSScanner scannerWithString: propertyAttributes];
-
- //JMLog(@"attr: %@", [NSString stringWithCString:attrs encoding:NSUTF8StringEncoding]);
- [scanner scanUpToString:@"T" intoString: nil];
- [scanner scanString:@"T" intoString:nil];
-
- //check if the property is an instance of a class
- if ([scanner scanString:@"@\"" intoString: &propertyType]) {
-
- [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"\"<"]
- intoString:&propertyType];
-
- //JMLog(@"type: %@", propertyClassName);
- p.type = NSClassFromString(propertyType);
- p.isMutable = ([propertyType rangeOfString:@"Mutable"].location != NSNotFound);
- p.isStandardJSONType = [allowedJSONTypes containsObject:p.type];
-
- //read through the property protocols
- while ([scanner scanString:@"<" intoString:NULL]) {
-
- NSString* protocolName = nil;
-
- [scanner scanUpToString:@">" intoString: &protocolName];
-
- if ([protocolName isEqualToString:@"Optional"]) {
- p.isOptional = YES;
- } else if([protocolName isEqualToString:@"Index"]) {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- p.isIndex = YES;
-#pragma GCC diagnostic pop
-
- objc_setAssociatedObject(
- self.class,
- &kIndexPropertyNameKey,
- p.name,
- OBJC_ASSOCIATION_RETAIN // This is atomic
- );
- } else if([protocolName isEqualToString:@"Ignore"]) {
- p = nil;
- } else {
- p.protocol = protocolName;
- }
-
- [scanner scanString:@">" intoString:NULL];
- }
-
- }
- //check if the property is a structure
- else if ([scanner scanString:@"{" intoString: &propertyType]) {
- [scanner scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet]
- intoString:&propertyType];
-
- p.isStandardJSONType = NO;
- p.structName = propertyType;
-
- }
- //the property must be a primitive
- else {
-
- //the property contains a primitive data type
- [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@","]
- intoString:&propertyType];
-
- //get the full name of the primitive type
- propertyType = valueTransformer.primitivesNames[propertyType];
-
- if (![allowedPrimitiveTypes containsObject:propertyType]) {
-
- //type not allowed - programmer mistaken -> exception
- @throw [NSException exceptionWithName:@"JSONModelProperty type not allowed"
- reason:[NSString stringWithFormat:@"Property type of %@.%@ is not supported by JSONModel.", self.class, p.name]
- userInfo:nil];
- }
-
- }
-
- NSString *nsPropertyName = @(propertyName);
- if([[self class] propertyIsOptional:nsPropertyName]){
- p.isOptional = YES;
- }
-
- if([[self class] propertyIsIgnored:nsPropertyName]){
- p = nil;
- }
-
- Class customClass = [[self class] classForCollectionProperty:nsPropertyName];
- if (customClass) {
- p.protocol = NSStringFromClass(customClass);
- }
-
- //few cases where JSONModel will ignore properties automatically
- if ([propertyType isEqualToString:@"Block"]) {
- p = nil;
- }
-
- //add the property object to the temp index
- if (p && ![propertyIndex objectForKey:p.name]) {
- [propertyIndex setValue:p forKey:p.name];
- }
-
- // generate custom setters and getter
- if (p)
- {
- NSString *name = [p.name stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[p.name substringToIndex:1].uppercaseString];
-
- // getter
- SEL getter = NSSelectorFromString([NSString stringWithFormat:@"JSONObjectFor%@", name]);
-
- if ([self respondsToSelector:getter])
- p.customGetter = getter;
-
- // setters
- p.customSetters = [NSMutableDictionary new];
-
- SEL genericSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@WithJSONObject:", name]);
-
- if ([self respondsToSelector:genericSetter])
- p.customSetters[@"generic"] = [NSValue valueWithBytes:&genericSetter objCType:@encode(SEL)];
-
- for (Class type in allowedJSONTypes)
- {
- NSString *class = NSStringFromClass([JSONValueTransformer classByResolvingClusterClasses:type]);
-
- if (p.customSetters[class])
- continue;
-
- SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@With%@:", name, class]);
-
- if ([self respondsToSelector:setter])
- p.customSetters[class] = [NSValue valueWithBytes:&setter objCType:@encode(SEL)];
- }
- }
- }
-
- free(properties);
-
- //ascend to the super of the class
- //(will do that until it reaches the root class - JSONModel)
- class = [class superclass];
- }
-
- //finally store the property index in the static property index
- objc_setAssociatedObject(
- self.class,
- &kClassPropertiesKey,
- [propertyIndex copy],
- OBJC_ASSOCIATION_RETAIN // This is atomic
- );
-}
-
-#pragma mark - built-in transformer methods
-//few built-in transformations
--(id)__transform:(id)value forProperty:(JSONModelClassProperty*)property error:(NSError**)err
-{
- Class protocolClass = NSClassFromString(property.protocol);
- if (!protocolClass) {
-
- //no other protocols on arrays and dictionaries
- //except JSONModel classes
- if ([value isKindOfClass:[NSArray class]]) {
- @throw [NSException exceptionWithName:@"Bad property protocol declaration"
- reason:[NSString stringWithFormat:@"<%@> is not allowed JSONModel property protocol, and not a JSONModel class.", property.protocol]
- userInfo:nil];
- }
- return value;
- }
-
- //if the protocol is actually a JSONModel class
- if ([self __isJSONModelSubClass:protocolClass]) {
-
- //check if it's a list of models
- if ([property.type isSubclassOfClass:[NSArray class]]) {
-
- // Expecting an array, make sure 'value' is an array
- if(![[value class] isSubclassOfClass:[NSArray class]])
- {
- if(err != nil)
- {
- NSString* mismatch = [NSString stringWithFormat:@"Property '%@' is declared as NSArray<%@>* but the corresponding JSON value is not a JSON Array.", property.name, property.protocol];
- JSONModelError* typeErr = [JSONModelError errorInvalidDataWithTypeMismatch:mismatch];
- *err = [typeErr errorByPrependingKeyPathComponent:property.name];
- }
- return nil;
- }
-
- //one shot conversion
- JSONModelError* arrayErr = nil;
- value = [[protocolClass class] arrayOfModelsFromDictionaries:value error:&arrayErr];
- if((err != nil) && (arrayErr != nil))
- {
- *err = [arrayErr errorByPrependingKeyPathComponent:property.name];
- return nil;
- }
- }
-
- //check if it's a dictionary of models
- if ([property.type isSubclassOfClass:[NSDictionary class]]) {
-
- // Expecting a dictionary, make sure 'value' is a dictionary
- if(![[value class] isSubclassOfClass:[NSDictionary class]])
- {
- if(err != nil)
- {
- NSString* mismatch = [NSString stringWithFormat:@"Property '%@' is declared as NSDictionary<%@>* but the corresponding JSON value is not a JSON Object.", property.name, property.protocol];
- JSONModelError* typeErr = [JSONModelError errorInvalidDataWithTypeMismatch:mismatch];
- *err = [typeErr errorByPrependingKeyPathComponent:property.name];
- }
- return nil;
- }
-
- NSMutableDictionary* res = [NSMutableDictionary dictionary];
-
- for (NSString* key in [value allKeys]) {
- JSONModelError* initErr = nil;
- id obj = [[[protocolClass class] alloc] initWithDictionary:value[key] error:&initErr];
- if (obj == nil)
- {
- // Propagate the error, including the property name as the key-path component
- if((err != nil) && (initErr != nil))
- {
- initErr = [initErr errorByPrependingKeyPathComponent:key];
- *err = [initErr errorByPrependingKeyPathComponent:property.name];
- }
- return nil;
- }
- [res setValue:obj forKey:key];
- }
- value = [NSDictionary dictionaryWithDictionary:res];
- }
- }
-
- return value;
-}
-
-//built-in reverse transformations (export to JSON compliant objects)
--(id)__reverseTransform:(id)value forProperty:(JSONModelClassProperty*)property
-{
- Class protocolClass = NSClassFromString(property.protocol);
- if (!protocolClass) return value;
-
- //if the protocol is actually a JSONModel class
- if ([self __isJSONModelSubClass:protocolClass]) {
-
- //check if should export list of dictionaries
- if (property.type == [NSArray class] || property.type == [NSMutableArray class]) {
- NSMutableArray* tempArray = [NSMutableArray arrayWithCapacity: [(NSArray*)value count] ];
- for (NSObject<AbstractJSONModelProtocol>* model in (NSArray*)value) {
- if ([model respondsToSelector:@selector(toDictionary)]) {
- [tempArray addObject: [model toDictionary]];
- } else
- [tempArray addObject: model];
- }
- return [tempArray copy];
- }
-
- //check if should export dictionary of dictionaries
- if (property.type == [NSDictionary class] || property.type == [NSMutableDictionary class]) {
- NSMutableDictionary* res = [NSMutableDictionary dictionary];
- for (NSString* key in [(NSDictionary*)value allKeys]) {
- id<AbstractJSONModelProtocol> model = value[key];
- [res setValue: [model toDictionary] forKey: key];
- }
- return [NSDictionary dictionaryWithDictionary:res];
- }
- }
-
- return value;
-}
-
-#pragma mark - custom transformations
-- (BOOL)__customSetValue:(id <NSObject>)value forProperty:(JSONModelClassProperty *)property
-{
- NSString *class = NSStringFromClass([JSONValueTransformer classByResolvingClusterClasses:[value class]]);
-
- SEL setter = nil;
- [property.customSetters[class] getValue:&setter];
-
- if (!setter)
- [property.customSetters[@"generic"] getValue:&setter];
-
- if (!setter)
- return NO;
-
- IMP imp = [self methodForSelector:setter];
- void (*func)(id, SEL, id <NSObject>) = (void *)imp;
- func(self, setter, value);
-
- return YES;
-}
-
-- (BOOL)__customGetValue:(id *)value forProperty:(JSONModelClassProperty *)property
-{
- SEL getter = property.customGetter;
-
- if (!getter)
- return NO;
-
- IMP imp = [self methodForSelector:getter];
- id (*func)(id, SEL) = (void *)imp;
- *value = func(self, getter);
-
- return YES;
-}
-
-#pragma mark - persistance
--(void)__createDictionariesForKeyPath:(NSString*)keyPath inDictionary:(NSMutableDictionary**)dict
-{
- //find if there's a dot left in the keyPath
- NSUInteger dotLocation = [keyPath rangeOfString:@"."].location;
- if (dotLocation==NSNotFound) return;
-
- //inspect next level
- NSString* nextHierarchyLevelKeyName = [keyPath substringToIndex: dotLocation];
- NSDictionary* nextLevelDictionary = (*dict)[nextHierarchyLevelKeyName];
-
- if (nextLevelDictionary==nil) {
- //create non-existing next level here
- nextLevelDictionary = [NSMutableDictionary dictionary];
- }
-
- //recurse levels
- [self __createDictionariesForKeyPath:[keyPath substringFromIndex: dotLocation+1]
- inDictionary:&nextLevelDictionary ];
-
- //create the hierarchy level
- [*dict setValue:nextLevelDictionary forKeyPath: nextHierarchyLevelKeyName];
-}
-
--(NSDictionary*)toDictionary
-{
- return [self toDictionaryWithKeys:nil];
-}
-
--(NSString*)toJSONString
-{
- return [self toJSONStringWithKeys:nil];
-}
-
--(NSData*)toJSONData
-{
- return [self toJSONDataWithKeys:nil];
-}
-
-//exports the model as a dictionary of JSON compliant objects
-- (NSDictionary *)toDictionaryWithKeys:(NSArray <NSString *> *)propertyNames
-{
- NSArray* properties = [self __properties__];
- NSMutableDictionary* tempDictionary = [NSMutableDictionary dictionaryWithCapacity:properties.count];
-
- id value;
-
- //loop over all properties
- for (JSONModelClassProperty* p in properties) {
-
- //skip if unwanted
- if (propertyNames != nil && ![propertyNames containsObject:p.name])
- continue;
-
- //fetch key and value
- NSString* keyPath = (self.__keyMapper||globalKeyMapper) ? [self __mapString:p.name withKeyMapper:self.__keyMapper] : p.name;
- value = [self valueForKey: p.name];
-
- //JMLog(@"toDictionary[%@]->[%@] = '%@'", p.name, keyPath, value);
-
- if ([keyPath rangeOfString:@"."].location != NSNotFound) {
- //there are sub-keys, introduce dictionaries for them
- [self __createDictionariesForKeyPath:keyPath inDictionary:&tempDictionary];
- }
-
- //check for custom getter
- if ([self __customGetValue:&value forProperty:p]) {
- //custom getter, all done
- [tempDictionary setValue:value forKeyPath:keyPath];
- continue;
- }
-
- //export nil when they are not optional values as JSON null, so that the structure of the exported data
- //is still valid if it's to be imported as a model again
- if (isNull(value)) {
-
- if (value == nil)
- {
- [tempDictionary removeObjectForKey:keyPath];
- }
- else
- {
- [tempDictionary setValue:[NSNull null] forKeyPath:keyPath];
- }
- continue;
- }
-
- //check if the property is another model
- if ([value isKindOfClass:JSONModelClass]) {
-
- //recurse models
- value = [(JSONModel*)value toDictionary];
- [tempDictionary setValue:value forKeyPath: keyPath];
-
- //for clarity
- continue;
-
- } else {
-
- // 1) check for built-in transformation
- if (p.protocol) {
- value = [self __reverseTransform:value forProperty:p];
- }
-
- // 2) check for standard types OR 2.1) primitives
- if (p.structName==nil && (p.isStandardJSONType || p.type==nil)) {
-
- //generic get value
- [tempDictionary setValue:value forKeyPath: keyPath];
-
- continue;
- }
-
- // 3) try to apply a value transformer
- if (YES) {
-
- //create selector from the property's class name
- NSString* selectorName = [NSString stringWithFormat:@"%@From%@:", @"JSONObject", p.type?p.type:p.structName];
- SEL selector = NSSelectorFromString(selectorName);
-
- BOOL foundCustomTransformer = NO;
- if ([valueTransformer respondsToSelector:selector]) {
- foundCustomTransformer = YES;
- } else {
- //try for hidden transformer
- selectorName = [NSString stringWithFormat:@"__%@",selectorName];
- selector = NSSelectorFromString(selectorName);
- if ([valueTransformer respondsToSelector:selector]) {
- foundCustomTransformer = YES;
- }
- }
-
- //check if there's a transformer declared
- if (foundCustomTransformer) {
- IMP imp = [valueTransformer methodForSelector:selector];
- id (*func)(id, SEL, id) = (void *)imp;
- value = func(valueTransformer, selector, value);
-
- [tempDictionary setValue:value forKeyPath:keyPath];
- } else {
- //in this case most probably a custom property was defined in a model
- //but no default reverse transformer for it
- @throw [NSException exceptionWithName:@"Value transformer not found"
- reason:[NSString stringWithFormat:@"[JSONValueTransformer %@] not found", selectorName]
- userInfo:nil];
- return nil;
- }
- }
- }
- }
-
- return [tempDictionary copy];
-}
-
-//exports model to a dictionary and then to a JSON string
-- (NSData *)toJSONDataWithKeys:(NSArray <NSString *> *)propertyNames
-{
- NSData* jsonData = nil;
- NSError* jsonError = nil;
-
- @try {
- NSDictionary* dict = [self toDictionaryWithKeys:propertyNames];
- jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&jsonError];
- }
- @catch (NSException *exception) {
- //this should not happen in properly design JSONModel
- //usually means there was no reverse transformer for a custom property
- JMLog(@"EXCEPTION: %@", exception.description);
- return nil;
- }
-
- return jsonData;
-}
-
-- (NSString *)toJSONStringWithKeys:(NSArray <NSString *> *)propertyNames
-{
- return [[NSString alloc] initWithData: [self toJSONDataWithKeys: propertyNames]
- encoding: NSUTF8StringEncoding];
-}
-
-#pragma mark - import/export of lists
-//loop over an NSArray of JSON objects and turn them into models
-+(NSMutableArray*)arrayOfModelsFromDictionaries:(NSArray*)array
-{
- return [self arrayOfModelsFromDictionaries:array error:nil];
-}
-
-+ (NSMutableArray *)arrayOfModelsFromData:(NSData *)data error:(NSError **)err
-{
- id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:err];
- if (!json || ![json isKindOfClass:[NSArray class]]) return nil;
-
- return [self arrayOfModelsFromDictionaries:json error:err];
-}
-
-+ (NSMutableArray *)arrayOfModelsFromString:(NSString *)string error:(NSError **)err
-{
- return [self arrayOfModelsFromData:[string dataUsingEncoding:NSUTF8StringEncoding] error:err];
-}
-
-// Same as above, but with error reporting
-+(NSMutableArray*)arrayOfModelsFromDictionaries:(NSArray*)array error:(NSError**)err
-{
- //bail early
- if (isNull(array)) return nil;
-
- //parse dictionaries to objects
- NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]];
-
- for (id d in array)
- {
- if ([d isKindOfClass:NSDictionary.class])
- {
- JSONModelError* initErr = nil;
- id obj = [[self alloc] initWithDictionary:d error:&initErr];
- if (obj == nil)
- {
- // Propagate the error, including the array index as the key-path component
- if((err != nil) && (initErr != nil))
- {
- NSString* path = [NSString stringWithFormat:@"[%lu]", (unsigned long)list.count];
- *err = [initErr errorByPrependingKeyPathComponent:path];
- }
- return nil;
- }
-
- [list addObject: obj];
- } else if ([d isKindOfClass:NSArray.class])
- {
- [list addObjectsFromArray:[self arrayOfModelsFromDictionaries:d error:err]];
- } else
- {
- // This is very bad
- }
-
- }
-
- return list;
-}
-
-+ (NSMutableDictionary *)dictionaryOfModelsFromString:(NSString *)string error:(NSError **)err
-{
- return [self dictionaryOfModelsFromData:[string dataUsingEncoding:NSUTF8StringEncoding] error:err];
-}
-
-+ (NSMutableDictionary *)dictionaryOfModelsFromData:(NSData *)data error:(NSError **)err
-{
- id json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:err];
- if (!json || ![json isKindOfClass:[NSDictionary class]]) return nil;
-
- return [self dictionaryOfModelsFromDictionary:json error:err];
-}
-
-+ (NSMutableDictionary *)dictionaryOfModelsFromDictionary:(NSDictionary *)dictionary error:(NSError **)err
-{
- NSMutableDictionary *output = [NSMutableDictionary dictionaryWithCapacity:dictionary.count];
-
- for (NSString *key in dictionary.allKeys)
- {
- id object = dictionary[key];
-
- if ([object isKindOfClass:NSDictionary.class])
- {
- id obj = [[self alloc] initWithDictionary:object error:err];
- if (obj == nil) return nil;
- output[key] = obj;
- }
- else if ([object isKindOfClass:NSArray.class])
- {
- id obj = [self arrayOfModelsFromDictionaries:object error:err];
- if (obj == nil) return nil;
- output[key] = obj;
- }
- else
- {
- if (err) {
- *err = [JSONModelError errorInvalidDataWithTypeMismatch:@"Only dictionaries and arrays are supported"];
- }
- return nil;
- }
- }
-
- return output;
-}
-
-//loop over NSArray of models and export them to JSON objects
-+(NSMutableArray*)arrayOfDictionariesFromModels:(NSArray*)array
-{
- //bail early
- if (isNull(array)) return nil;
-
- //convert to dictionaries
- NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]];
-
- for (id<AbstractJSONModelProtocol> object in array) {
-
- id obj = [object toDictionary];
- if (!obj) return nil;
-
- [list addObject: obj];
- }
- return list;
-}
-
-//loop over NSArray of models and export them to JSON objects with specific properties
-+(NSMutableArray*)arrayOfDictionariesFromModels:(NSArray*)array propertyNamesToExport:(NSArray*)propertyNamesToExport;
-{
- //bail early
- if (isNull(array)) return nil;
-
- //convert to dictionaries
- NSMutableArray* list = [NSMutableArray arrayWithCapacity: [array count]];
-
- for (id<AbstractJSONModelProtocol> object in array) {
-
- id obj = [object toDictionaryWithKeys:propertyNamesToExport];
- if (!obj) return nil;
-
- [list addObject: obj];
- }
- return list;
-}
-
-+(NSMutableDictionary *)dictionaryOfDictionariesFromModels:(NSDictionary *)dictionary
-{
- //bail early
- if (isNull(dictionary)) return nil;
-
- NSMutableDictionary *output = [NSMutableDictionary dictionaryWithCapacity:dictionary.count];
-
- for (NSString *key in dictionary.allKeys) {
- id <AbstractJSONModelProtocol> object = dictionary[key];
- id obj = [object toDictionary];
- if (!obj) return nil;
- output[key] = obj;
- }
-
- return output;
-}
-
-#pragma mark - custom comparison methods
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
--(NSString*)indexPropertyName
-{
- //custom getter for an associated object
- return objc_getAssociatedObject(self.class, &kIndexPropertyNameKey);
-}
-
--(BOOL)isEqual:(id)object
-{
- //bail early if different classes
- if (![object isMemberOfClass:[self class]]) return NO;
-
- if (self.indexPropertyName) {
- //there's a defined ID property
- id objectId = [object valueForKey: self.indexPropertyName];
- return [[self valueForKey: self.indexPropertyName] isEqual:objectId];
- }
-
- //default isEqual implementation
- return [super isEqual:object];
-}
-
--(NSComparisonResult)compare:(id)object
-{
- if (self.indexPropertyName) {
- id objectId = [object valueForKey: self.indexPropertyName];
- if ([objectId respondsToSelector:@selector(compare:)]) {
- return [[self valueForKey:self.indexPropertyName] compare:objectId];
- }
- }
-
- //on purpose postponing the asserts for speed optimization
- //these should not happen anyway in production conditions
- NSAssert(self.indexPropertyName, @"Can't compare models with no <Index> property");
- NSAssert1(NO, @"The <Index> property of %@ is not comparable class.", [self class]);
- return kNilOptions;
-}
-
-- (NSUInteger)hash
-{
- if (self.indexPropertyName) {
- id val = [self valueForKey:self.indexPropertyName];
-
- if (val) {
- return [val hash];
- }
- }
-
- return [super hash];
-}
-
-#pragma GCC diagnostic pop
-
-#pragma mark - custom data validation
--(BOOL)validate:(NSError**)error
-{
- return YES;
-}
-
-#pragma mark - custom recursive description
-//custom description method for debugging purposes
--(NSString*)description
-{
- NSMutableString* text = [NSMutableString stringWithFormat:@"<%@> \n", [self class]];
-
- for (JSONModelClassProperty *p in [self __properties__]) {
-
- id value = ([p.name isEqualToString:@"description"])?self->_description:[self valueForKey:p.name];
- NSString* valueDescription = (value)?[value description]:@"<nil>";
-
- if (p.isStandardJSONType && ![value respondsToSelector:@selector(count)] && [valueDescription length]>60) {
-
- //cap description for longer values
- valueDescription = [NSString stringWithFormat:@"%@...", [valueDescription substringToIndex:59]];
- }
- valueDescription = [valueDescription stringByReplacingOccurrencesOfString:@"\n" withString:@"\n "];
- [text appendFormat:@" [%@]: %@\n", p.name, valueDescription];
- }
-
- [text appendFormat:@"</%@>", [self class]];
- return text;
-}
-
-#pragma mark - key mapping
-+(JSONKeyMapper*)keyMapper
-{
- return nil;
-}
-
-+(void)setGlobalKeyMapper:(JSONKeyMapper*)globalKeyMapperParam
-{
- globalKeyMapper = globalKeyMapperParam;
-}
-
-+(BOOL)propertyIsOptional:(NSString*)propertyName
-{
- return NO;
-}
-
-+(BOOL)propertyIsIgnored:(NSString *)propertyName
-{
- return NO;
-}
-
-+(NSString*)protocolForArrayProperty:(NSString *)propertyName
-{
- return nil;
-}
-
-+(Class)classForCollectionProperty:(NSString *)propertyName
-{
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- NSString *protocolName = [self protocolForArrayProperty:propertyName];
-#pragma GCC diagnostic pop
-
- if (!protocolName)
- return nil;
-
- return NSClassFromString(protocolName);
-}
-
-#pragma mark - working with incomplete models
-- (void)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping
-{
- [self mergeFromDictionary:dict useKeyMapping:useKeyMapping error:nil];
-}
-
-- (BOOL)mergeFromDictionary:(NSDictionary *)dict useKeyMapping:(BOOL)useKeyMapping error:(NSError **)error
-{
- return [self __importDictionary:dict withKeyMapper:(useKeyMapping)? self.__keyMapper:nil validation:NO error:error];
-}
-
-#pragma mark - NSCopying, NSCoding
--(instancetype)copyWithZone:(NSZone *)zone
-{
- return [NSKeyedUnarchiver unarchiveObjectWithData:
- [NSKeyedArchiver archivedDataWithRootObject:self]
- ];
-}
-
--(instancetype)initWithCoder:(NSCoder *)decoder
-{
- NSString* json;
-
- if ([decoder respondsToSelector:@selector(decodeObjectOfClass:forKey:)]) {
- json = [decoder decodeObjectOfClass:[NSString class] forKey:@"json"];
- } else {
- json = [decoder decodeObjectForKey:@"json"];
- }
-
- JSONModelError *error = nil;
- self = [self initWithString:json error:&error];
- if (error) {
- JMLog(@"%@",[error localizedDescription]);
- }
- return self;
-}
-
--(void)encodeWithCoder:(NSCoder *)encoder
-{
- [encoder encodeObject:self.toJSONString forKey:@"json"];
-}
-
-+ (BOOL)supportsSecureCoding
-{
- return YES;
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.h
deleted file mode 100644
index 67405abf..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// JSONModelClassProperty.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-/**
- * **You do not need to instantiate this class yourself.** This class is used internally by JSONModel
- * to inspect the declared properties of your model class.
- *
- * Class to contain the information, representing a class property
- * It features the property's name, type, whether it's a required property,
- * and (optionally) the class protocol
- */
-@interface JSONModelClassProperty : NSObject
-
-// deprecated
-@property (assign, nonatomic) BOOL isIndex DEPRECATED_ATTRIBUTE;
-
-/** The name of the declared property (not the ivar name) */
-@property (copy, nonatomic) NSString *name;
-
-/** A property class type */
-@property (assign, nonatomic) Class type;
-
-/** Struct name if a struct */
-@property (strong, nonatomic) NSString *structName;
-
-/** The name of the protocol the property conforms to (or nil) */
-@property (copy, nonatomic) NSString *protocol;
-
-/** If YES, it can be missing in the input data, and the input would be still valid */
-@property (assign, nonatomic) BOOL isOptional;
-
-/** If YES - don't call any transformers on this property's value */
-@property (assign, nonatomic) BOOL isStandardJSONType;
-
-/** If YES - create a mutable object for the value of the property */
-@property (assign, nonatomic) BOOL isMutable;
-
-/** a custom getter for this property, found in the owning model */
-@property (assign, nonatomic) SEL customGetter;
-
-/** custom setters for this property, found in the owning model */
-@property (strong, nonatomic) NSMutableDictionary *customSetters;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.m
deleted file mode 100644
index 5330c921..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelClassProperty.m
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// JSONModelClassProperty.m
-// JSONModel
-//
-
-#import "JSONModelClassProperty.h"
-
-@implementation JSONModelClassProperty
-
--(NSString*)description
-{
- //build the properties string for the current class property
- NSMutableArray* properties = [NSMutableArray arrayWithCapacity:8];
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- if (self.isIndex) [properties addObject:@"Index"];
-#pragma GCC diagnostic pop
-
- if (self.isOptional) [properties addObject:@"Optional"];
- if (self.isMutable) [properties addObject:@"Mutable"];
- if (self.isStandardJSONType) [properties addObject:@"Standard JSON type"];
- if (self.customGetter) [properties addObject:[NSString stringWithFormat: @"Getter = %@", NSStringFromSelector(self.customGetter)]];
-
- if (self.customSetters)
- {
- NSMutableArray *setters = [NSMutableArray array];
-
- for (id obj in self.customSetters.allValues)
- {
- SEL selector;
- [obj getValue:&selector];
- [setters addObject:NSStringFromSelector(selector)];
- }
-
- [properties addObject:[NSString stringWithFormat: @"Setters = [%@]", [setters componentsJoinedByString:@", "]]];
- }
-
- NSString* propertiesString = @"";
- if (properties.count>0) {
- propertiesString = [NSString stringWithFormat:@"(%@)", [properties componentsJoinedByString:@", "]];
- }
-
- //return the name, type and additional properties
- return [NSString stringWithFormat:@"@property %@%@ %@ %@",
- self.type?[NSString stringWithFormat:@"%@*",self.type]:(self.structName?self.structName:@"primitive"),
- self.protocol?[NSString stringWithFormat:@"<%@>", self.protocol]:@"",
- self.name,
- propertiesString
- ];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.h
deleted file mode 100644
index 266e6ccc..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.h
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// JSONModelError.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-typedef NS_ENUM(int, kJSONModelErrorTypes)
-{
- kJSONModelErrorInvalidData = 1,
- kJSONModelErrorBadResponse = 2,
- kJSONModelErrorBadJSON = 3,
- kJSONModelErrorModelIsInvalid = 4,
- kJSONModelErrorNilInput = 5
-};
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-/** The domain name used for the JSONModelError instances */
-extern NSString *const JSONModelErrorDomain;
-
-/**
- * If the model JSON input misses keys that are required, check the
- * userInfo dictionary of the JSONModelError instance you get back -
- * under the kJSONModelMissingKeys key you will find a list of the
- * names of the missing keys.
- */
-extern NSString *const kJSONModelMissingKeys;
-
-/**
- * If JSON input has a different type than expected by the model, check the
- * userInfo dictionary of the JSONModelError instance you get back -
- * under the kJSONModelTypeMismatch key you will find a description
- * of the mismatched types.
- */
-extern NSString *const kJSONModelTypeMismatch;
-
-/**
- * If an error occurs in a nested model, check the userInfo dictionary of
- * the JSONModelError instance you get back - under the kJSONModelKeyPath
- * key you will find key-path at which the error occurred.
- */
-extern NSString *const kJSONModelKeyPath;
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Custom NSError subclass with shortcut methods for creating
- * the common JSONModel errors
- */
-@interface JSONModelError : NSError
-
-@property (strong, nonatomic) NSHTTPURLResponse *httpResponse;
-
-@property (strong, nonatomic) NSData *responseData;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1
- */
-+ (id)errorInvalidDataWithMessage:(NSString *)message;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1
- * @param keys a set of field names that were required, but not found in the input
- */
-+ (id)errorInvalidDataWithMissingKeys:(NSSet *)keys;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorInvalidData = 1
- * @param mismatchDescription description of the type mismatch that was encountered.
- */
-+ (id)errorInvalidDataWithTypeMismatch:(NSString *)mismatchDescription;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorBadResponse = 2
- */
-+ (id)errorBadResponse;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorBadJSON = 3
- */
-+ (id)errorBadJSON;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorModelIsInvalid = 4
- */
-+ (id)errorModelIsInvalid;
-
-/**
- * Creates a JSONModelError instance with code kJSONModelErrorNilInput = 5
- */
-+ (id)errorInputIsNil;
-
-/**
- * Creates a new JSONModelError with the same values plus information about the key-path of the error.
- * Properties in the new error object are the same as those from the receiver,
- * except that a new key kJSONModelKeyPath is added to the userInfo dictionary.
- * This key contains the component string parameter. If the key is already present
- * then the new error object has the component string prepended to the existing value.
- */
-- (instancetype)errorByPrependingKeyPathComponent:(NSString *)component;
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.m
deleted file mode 100644
index f357e707..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModel/JSONModelError.m
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// JSONModelError.m
-// JSONModel
-//
-
-#import "JSONModelError.h"
-
-NSString* const JSONModelErrorDomain = @"JSONModelErrorDomain";
-NSString* const kJSONModelMissingKeys = @"kJSONModelMissingKeys";
-NSString* const kJSONModelTypeMismatch = @"kJSONModelTypeMismatch";
-NSString* const kJSONModelKeyPath = @"kJSONModelKeyPath";
-
-@implementation JSONModelError
-
-+(id)errorInvalidDataWithMessage:(NSString*)message
-{
- message = [NSString stringWithFormat:@"Invalid JSON data: %@", message];
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorInvalidData
- userInfo:@{NSLocalizedDescriptionKey:message}];
-}
-
-+(id)errorInvalidDataWithMissingKeys:(NSSet *)keys
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorInvalidData
- userInfo:@{NSLocalizedDescriptionKey:@"Invalid JSON data. Required JSON keys are missing from the input. Check the error user information.",kJSONModelMissingKeys:[keys allObjects]}];
-}
-
-+(id)errorInvalidDataWithTypeMismatch:(NSString*)mismatchDescription
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorInvalidData
- userInfo:@{NSLocalizedDescriptionKey:@"Invalid JSON data. The JSON type mismatches the expected type. Check the error user information.",kJSONModelTypeMismatch:mismatchDescription}];
-}
-
-+(id)errorBadResponse
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorBadResponse
- userInfo:@{NSLocalizedDescriptionKey:@"Bad network response. Probably the JSON URL is unreachable."}];
-}
-
-+(id)errorBadJSON
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorBadJSON
- userInfo:@{NSLocalizedDescriptionKey:@"Malformed JSON. Check the JSONModel data input."}];
-}
-
-+(id)errorModelIsInvalid
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorModelIsInvalid
- userInfo:@{NSLocalizedDescriptionKey:@"Model does not validate. The custom validation for the input data failed."}];
-}
-
-+(id)errorInputIsNil
-{
- return [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:kJSONModelErrorNilInput
- userInfo:@{NSLocalizedDescriptionKey:@"Initializing model with nil input object."}];
-}
-
-- (instancetype)errorByPrependingKeyPathComponent:(NSString*)component
-{
- // Create a mutable copy of the user info so that we can add to it and update it
- NSMutableDictionary* userInfo = [self.userInfo mutableCopy];
-
- // Create or update the key-path
- NSString* existingPath = userInfo[kJSONModelKeyPath];
- NSString* separator = [existingPath hasPrefix:@"["] ? @"" : @".";
- NSString* updatedPath = (existingPath == nil) ? component : [component stringByAppendingFormat:@"%@%@", separator, existingPath];
- userInfo[kJSONModelKeyPath] = updatedPath;
-
- // Create the new error
- return [JSONModelError errorWithDomain:self.domain
- code:self.code
- userInfo:[NSDictionary dictionaryWithDictionary:userInfo]];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelLib.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelLib.h
deleted file mode 100644
index 564ca46e..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelLib.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// JSONModelLib.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-// core
-#import "JSONModel.h"
-#import "JSONModelError.h"
-
-// transformations
-#import "JSONValueTransformer.h"
-#import "JSONKeyMapper.h"
-
-// networking (deprecated)
-#import "JSONHTTPClient.h"
-#import "JSONModel+networking.h"
-#import "JSONAPI.h"
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.h
deleted file mode 100644
index 30a8743a..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// JSONAPI.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-#import "JSONHTTPClient.h"
-
-DEPRECATED_ATTRIBUTE
-@interface JSONAPI : NSObject
-
-+ (void)setAPIBaseURLWithString:(NSString *)base DEPRECATED_ATTRIBUTE;
-+ (void)setContentType:(NSString *)ctype DEPRECATED_ATTRIBUTE;
-+ (void)getWithPath:(NSString *)path andParams:(NSDictionary *)params completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)postWithPath:(NSString *)path andParams:(NSDictionary *)params completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)rpcWithMethodName:(NSString *)method andArguments:(NSArray *)args completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)rpc2WithMethodName:(NSString *)method andParams:(id)params completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.m
deleted file mode 100644
index a7e33262..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONAPI.m
+++ /dev/null
@@ -1,145 +0,0 @@
-//
-// JSONAPI.m
-// JSONModel
-//
-
-#import "JSONAPI.h"
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#pragma GCC diagnostic ignored "-Wdeprecated-implementations"
-
-#pragma mark - helper error model class
-@interface JSONAPIRPCErrorModel: JSONModel
-@property (assign, nonatomic) int code;
-@property (strong, nonatomic) NSString* message;
-@property (strong, nonatomic) id<Optional> data;
-@end
-
-#pragma mark - static variables
-
-static JSONAPI* sharedInstance = nil;
-
-static long jsonRpcId = 0;
-
-#pragma mark - JSONAPI() private interface
-
-@interface JSONAPI ()
-@property (strong, nonatomic) NSString* baseURLString;
-@end
-
-#pragma mark - JSONAPI implementation
-
-@implementation JSONAPI
-
-#pragma mark - initialize
-
-+(void)initialize
-{
- static dispatch_once_t once;
- dispatch_once(&once, ^{
- sharedInstance = [[JSONAPI alloc] init];
- });
-}
-
-#pragma mark - api config methods
-
-+(void)setAPIBaseURLWithString:(NSString*)base
-{
- sharedInstance.baseURLString = base;
-}
-
-+(void)setContentType:(NSString*)ctype
-{
- [JSONHTTPClient setRequestContentType: ctype];
-}
-
-#pragma mark - GET methods
-+(void)getWithPath:(NSString*)path andParams:(NSDictionary*)params completion:(JSONObjectBlock)completeBlock
-{
- NSString* fullURL = [NSString stringWithFormat:@"%@%@", sharedInstance.baseURLString, path];
-
- [JSONHTTPClient getJSONFromURLWithString: fullURL params:params completion:^(NSDictionary *json, JSONModelError *e) {
- completeBlock(json, e);
- }];
-}
-
-#pragma mark - POST methods
-+(void)postWithPath:(NSString*)path andParams:(NSDictionary*)params completion:(JSONObjectBlock)completeBlock
-{
- NSString* fullURL = [NSString stringWithFormat:@"%@%@", sharedInstance.baseURLString, path];
-
- [JSONHTTPClient postJSONFromURLWithString: fullURL params:params completion:^(NSDictionary *json, JSONModelError *e) {
- completeBlock(json, e);
- }];
-}
-
-#pragma mark - RPC methods
-+(void)__rpcRequestWithObject:(id)jsonObject completion:(JSONObjectBlock)completeBlock
-{
-
- NSData* jsonRequestData = [NSJSONSerialization dataWithJSONObject:jsonObject
- options:kNilOptions
- error:nil];
- NSString* jsonRequestString = [[NSString alloc] initWithData:jsonRequestData encoding: NSUTF8StringEncoding];
-
- NSAssert(sharedInstance.baseURLString, @"API base URL not set");
- [JSONHTTPClient postJSONFromURLWithString: sharedInstance.baseURLString
- bodyString: jsonRequestString
- completion:^(NSDictionary *json, JSONModelError* e) {
-
- if (completeBlock) {
- //handle the rpc response
- NSDictionary* result = json[@"result"];
-
- if (!result) {
- JSONAPIRPCErrorModel* error = [[JSONAPIRPCErrorModel alloc] initWithDictionary:json[@"error"] error:nil];
- if (error) {
- //custom server error
- if (!error.message) error.message = @"Generic json rpc error";
- e = [JSONModelError errorWithDomain:JSONModelErrorDomain
- code:error.code
- userInfo: @{ NSLocalizedDescriptionKey : error.message}];
- } else {
- //generic error
- e = [JSONModelError errorBadResponse];
- }
- }
-
- //invoke the callback
- completeBlock(result, e);
- }
- }];
-}
-
-+(void)rpcWithMethodName:(NSString*)method andArguments:(NSArray*)args completion:(JSONObjectBlock)completeBlock
-{
- NSAssert(method, @"No method specified");
- if (!args) args = @[];
-
- [self __rpcRequestWithObject:@{
- //rpc 1.0
- @"id": @(++jsonRpcId),
- @"params": args,
- @"method": method
- } completion:completeBlock];
-}
-
-+(void)rpc2WithMethodName:(NSString*)method andParams:(id)params completion:(JSONObjectBlock)completeBlock
-{
- NSAssert(method, @"No method specified");
- if (!params) params = @[];
-
- [self __rpcRequestWithObject:@{
- //rpc 2.0
- @"jsonrpc": @"2.0",
- @"id": @(++jsonRpcId),
- @"params": params,
- @"method": method
- } completion:completeBlock];
-}
-
-@end
-
-#pragma mark - helper rpc error model class implementation
-@implementation JSONAPIRPCErrorModel
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.h
deleted file mode 100644
index 0f47cef9..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// JSONModelHTTPClient.h
-// JSONModel
-//
-
-#import "JSONModel.h"
-
-extern NSString *const kHTTPMethodGET DEPRECATED_ATTRIBUTE;
-extern NSString *const kHTTPMethodPOST DEPRECATED_ATTRIBUTE;
-extern NSString *const kContentTypeAutomatic DEPRECATED_ATTRIBUTE;
-extern NSString *const kContentTypeJSON DEPRECATED_ATTRIBUTE;
-extern NSString *const kContentTypeWWWEncoded DEPRECATED_ATTRIBUTE;
-
-typedef void (^JSONObjectBlock)(id json, JSONModelError *err) DEPRECATED_ATTRIBUTE;
-
-DEPRECATED_ATTRIBUTE
-@interface JSONHTTPClient : NSObject
-
-+ (NSMutableDictionary *)requestHeaders DEPRECATED_ATTRIBUTE;
-+ (void)setDefaultTextEncoding:(NSStringEncoding)encoding DEPRECATED_ATTRIBUTE;
-+ (void)setCachingPolicy:(NSURLRequestCachePolicy)policy DEPRECATED_ATTRIBUTE;
-+ (void)setTimeoutInSeconds:(int)seconds DEPRECATED_ATTRIBUTE;
-+ (void)setRequestContentType:(NSString *)contentTypeString DEPRECATED_ATTRIBUTE;
-+ (void)getJSONFromURLWithString:(NSString *)urlString completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)getJSONFromURLWithString:(NSString *)urlString params:(NSDictionary *)params completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)JSONFromURLWithString:(NSString *)urlString method:(NSString *)method params:(NSDictionary *)params orBodyString:(NSString *)bodyString completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)JSONFromURLWithString:(NSString *)urlString method:(NSString *)method params:(NSDictionary *)params orBodyString:(NSString *)bodyString headers:(NSDictionary *)headers completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)JSONFromURLWithString:(NSString *)urlString method:(NSString *)method params:(NSDictionary *)params orBodyData:(NSData *)bodyData headers:(NSDictionary *)headers completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)postJSONFromURLWithString:(NSString *)urlString params:(NSDictionary *)params completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)postJSONFromURLWithString:(NSString *)urlString bodyString:(NSString *)bodyString completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)postJSONFromURLWithString:(NSString *)urlString bodyData:(NSData *)bodyData completion:(JSONObjectBlock)completeBlock DEPRECATED_ATTRIBUTE;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.m
deleted file mode 100644
index 6c72dc5b..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONHTTPClient.m
+++ /dev/null
@@ -1,361 +0,0 @@
-//
-// JSONModelHTTPClient.m
-// JSONModel
-//
-
-#import "JSONHTTPClient.h"
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#pragma GCC diagnostic ignored "-Wdeprecated-implementations"
-
-typedef void (^RequestResultBlock)(NSData *data, JSONModelError *error);
-
-#pragma mark - constants
-NSString* const kHTTPMethodGET = @"GET";
-NSString* const kHTTPMethodPOST = @"POST";
-
-NSString* const kContentTypeAutomatic = @"jsonmodel/automatic";
-NSString* const kContentTypeJSON = @"application/json";
-NSString* const kContentTypeWWWEncoded = @"application/x-www-form-urlencoded";
-
-#pragma mark - static variables
-
-/**
- * Defaults for HTTP requests
- */
-static NSStringEncoding defaultTextEncoding = NSUTF8StringEncoding;
-static NSURLRequestCachePolicy defaultCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
-
-static int defaultTimeoutInSeconds = 60;
-
-/**
- * Custom HTTP headers to send over with *each* request
- */
-static NSMutableDictionary* requestHeaders = nil;
-
-/**
- * Default request content type
- */
-static NSString* requestContentType = nil;
-
-#pragma mark - implementation
-@implementation JSONHTTPClient
-
-#pragma mark - initialization
-+(void)initialize
-{
- static dispatch_once_t once;
- dispatch_once(&once, ^{
- requestHeaders = [NSMutableDictionary dictionary];
- requestContentType = kContentTypeAutomatic;
- });
-}
-
-#pragma mark - configuration methods
-+(NSMutableDictionary*)requestHeaders
-{
- return requestHeaders;
-}
-
-+(void)setDefaultTextEncoding:(NSStringEncoding)encoding
-{
- defaultTextEncoding = encoding;
-}
-
-+(void)setCachingPolicy:(NSURLRequestCachePolicy)policy
-{
- defaultCachePolicy = policy;
-}
-
-+(void)setTimeoutInSeconds:(int)seconds
-{
- defaultTimeoutInSeconds = seconds;
-}
-
-+(void)setRequestContentType:(NSString*)contentTypeString
-{
- requestContentType = contentTypeString;
-}
-
-#pragma mark - helper methods
-+(NSString*)contentTypeForRequestString:(NSString*)requestString
-{
- //fetch the charset name from the default string encoding
- NSString* contentType = requestContentType;
-
- if (requestString.length>0 && [contentType isEqualToString:kContentTypeAutomatic]) {
- //check for "eventual" JSON array or dictionary
- NSString* firstAndLastChar = [NSString stringWithFormat:@"%@%@",
- [requestString substringToIndex:1],
- [requestString substringFromIndex: requestString.length -1]
- ];
-
- if ([firstAndLastChar isEqualToString:@"{}"] || [firstAndLastChar isEqualToString:@"[]"]) {
- //guessing for a JSON request
- contentType = kContentTypeJSON;
- } else {
- //fallback to www form encoded params
- contentType = kContentTypeWWWEncoded;
- }
- }
-
- //type is set, just add charset
- NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
- return [NSString stringWithFormat:@"%@; charset=%@", contentType, charset];
-}
-
-+(NSString*)urlEncode:(id<NSObject>)value
-{
- //make sure param is a string
- if ([value isKindOfClass:[NSNumber class]]) {
- value = [(NSNumber*)value stringValue];
- }
-
- NSAssert([value isKindOfClass:[NSString class]], @"request parameters can be only of NSString or NSNumber classes. '%@' is of class %@.", value, [value class]);
-
- NSString *str = (NSString *)value;
-
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9
- return [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
-
-#else
- return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
- NULL,
- (__bridge CFStringRef)str,
- NULL,
- (CFStringRef)@"!*'();:@&=+$,/?%#[]",
- kCFStringEncodingUTF8));
-#endif
-}
-
-#pragma mark - networking worker methods
-+(void)requestDataFromURL:(NSURL*)url method:(NSString*)method requestBody:(NSData*)bodyData headers:(NSDictionary*)headers handler:(RequestResultBlock)handler
-{
- NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: url
- cachePolicy: defaultCachePolicy
- timeoutInterval: defaultTimeoutInSeconds];
- [request setHTTPMethod:method];
-
- if ([requestContentType isEqualToString:kContentTypeAutomatic]) {
- //automatic content type
- if (bodyData) {
- NSString *bodyString = [[NSString alloc] initWithData:bodyData encoding:NSUTF8StringEncoding];
- [request setValue: [self contentTypeForRequestString: bodyString] forHTTPHeaderField:@"Content-type"];
- }
- } else {
- //user set content type
- [request setValue: requestContentType forHTTPHeaderField:@"Content-type"];
- }
-
- //add all the custom headers defined
- for (NSString* key in [requestHeaders allKeys]) {
- [request setValue:requestHeaders[key] forHTTPHeaderField:key];
- }
-
- //add the custom headers
- for (NSString* key in [headers allKeys]) {
- [request setValue:headers[key] forHTTPHeaderField:key];
- }
-
- if (bodyData) {
- [request setHTTPBody: bodyData];
- [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)bodyData.length] forHTTPHeaderField:@"Content-Length"];
- }
-
- void (^completionHandler)(NSData *, NSURLResponse *, NSError *) = ^(NSData *data, NSURLResponse *origResponse, NSError *origError) {
- NSHTTPURLResponse *response = (NSHTTPURLResponse *)origResponse;
- JSONModelError *error = nil;
-
- //convert an NSError to a JSONModelError
- if (origError) {
- error = [JSONModelError errorWithDomain:origError.domain code:origError.code userInfo:origError.userInfo];
- }
-
- //special case for http error code 401
- if (error.code == NSURLErrorUserCancelledAuthentication) {
- response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:401 HTTPVersion:@"HTTP/1.1" headerFields:@{}];
- }
-
- //if not OK status set the err to a JSONModelError instance
- if (!error && (response.statusCode >= 300 || response.statusCode < 200)) {
- error = [JSONModelError errorBadResponse];
- }
-
- //if there was an error, assign the response to the JSONModel instance
- if (error) {
- error.httpResponse = [response copy];
- }
-
- //empty respone, return nil instead
- if (!data.length) {
- data = nil;
- }
-
- handler(data, error);
- };
-
- //fire the request
-
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_10
- NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:completionHandler];
- [task resume];
-#else
- NSOperationQueue *queue = [NSOperationQueue new];
-
- [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
- completionHandler(data, response, error);
- }];
-#endif
-}
-
-+(void)requestDataFromURL:(NSURL*)url method:(NSString*)method params:(NSDictionary*)params headers:(NSDictionary*)headers handler:(RequestResultBlock)handler
-{
- //create the request body
- NSMutableString* paramsString = nil;
-
- if (params) {
- //build a simple url encoded param string
- paramsString = [NSMutableString stringWithString:@""];
- for (NSString* key in [[params allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
- [paramsString appendFormat:@"%@=%@&", key, [self urlEncode:params[key]] ];
- }
- if ([paramsString hasSuffix:@"&"]) {
- paramsString = [[NSMutableString alloc] initWithString: [paramsString substringToIndex: paramsString.length-1]];
- }
- }
-
- //set the request params
- if ([method isEqualToString:kHTTPMethodGET] && params) {
-
- //add GET params to the query string
- url = [NSURL URLWithString:[NSString stringWithFormat: @"%@%@%@",
- [url absoluteString],
- [url query] ? @"&" : @"?",
- paramsString
- ]];
- }
-
- //call the more general synq request method
- [self requestDataFromURL: url
- method: method
- requestBody: [method isEqualToString:kHTTPMethodPOST]?[paramsString dataUsingEncoding:NSUTF8StringEncoding]:nil
- headers: headers
- handler:handler];
-}
-
-#pragma mark - Async network request
-+(void)JSONFromURLWithString:(NSString*)urlString method:(NSString*)method params:(NSDictionary*)params orBodyString:(NSString*)bodyString completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString
- method:method
- params:params
- orBodyString:bodyString
- headers:nil
- completion:completeBlock];
-}
-
-+(void)JSONFromURLWithString:(NSString *)urlString method:(NSString *)method params:(NSDictionary *)params orBodyString:(NSString *)bodyString headers:(NSDictionary *)headers completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString
- method:method
- params:params
- orBodyData:[bodyString dataUsingEncoding:NSUTF8StringEncoding]
- headers:headers
- completion:completeBlock];
-}
-
-+(void)JSONFromURLWithString:(NSString*)urlString method:(NSString*)method params:(NSDictionary *)params orBodyData:(NSData*)bodyData headers:(NSDictionary*)headers completion:(JSONObjectBlock)completeBlock
-{
- RequestResultBlock handler = ^(NSData *responseData, JSONModelError *error) {
- id jsonObject = nil;
-
- //step 3: if there's no response so far, return a basic error
- if (!responseData && !error) {
- //check for false response, but no network error
- error = [JSONModelError errorBadResponse];
- }
-
- //step 4: if there's a response at this and no errors, convert to object
- if (error==nil) {
- // Note: it is possible to have a valid response with empty response data (204 No Content).
- // So only create the JSON object if there is some response data.
- if(responseData.length > 0)
- {
- //convert to an object
- jsonObject = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
- }
- }
- //step 4.5: cover an edge case in which meaningful content is return along an error HTTP status code
- else if (error && responseData && jsonObject==nil) {
- //try to get the JSON object, while preserving the original error object
- jsonObject = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
- //keep responseData just in case it contains error information
- error.responseData = responseData;
- }
-
- //step 5: invoke the complete block
- dispatch_async(dispatch_get_main_queue(), ^{
- if (completeBlock) {
- completeBlock(jsonObject, error);
- }
- });
- };
-
- NSURL *url = [NSURL URLWithString:urlString];
-
- if (bodyData) {
- [self requestDataFromURL:url method:method requestBody:bodyData headers:headers handler:handler];
- } else {
- [self requestDataFromURL:url method:method params:params headers:headers handler:handler];
- }
-}
-
-#pragma mark - request aliases
-+(void)getJSONFromURLWithString:(NSString*)urlString completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString method:kHTTPMethodGET
- params:nil
- orBodyString:nil completion:^(id json, JSONModelError* e) {
- if (completeBlock) completeBlock(json, e);
- }];
-}
-
-+(void)getJSONFromURLWithString:(NSString*)urlString params:(NSDictionary*)params completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString method:kHTTPMethodGET
- params:params
- orBodyString:nil completion:^(id json, JSONModelError* e) {
- if (completeBlock) completeBlock(json, e);
- }];
-}
-
-+(void)postJSONFromURLWithString:(NSString*)urlString params:(NSDictionary*)params completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString method:kHTTPMethodPOST
- params:params
- orBodyString:nil completion:^(id json, JSONModelError* e) {
- if (completeBlock) completeBlock(json, e);
- }];
-
-}
-
-+(void)postJSONFromURLWithString:(NSString*)urlString bodyString:(NSString*)bodyString completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString method:kHTTPMethodPOST
- params:nil
- orBodyString:bodyString completion:^(id json, JSONModelError* e) {
- if (completeBlock) completeBlock(json, e);
- }];
-}
-
-+(void)postJSONFromURLWithString:(NSString*)urlString bodyData:(NSData*)bodyData completion:(JSONObjectBlock)completeBlock
-{
- [self JSONFromURLWithString:urlString method:kHTTPMethodPOST
- params:nil
- orBodyString:[[NSString alloc] initWithData:bodyData encoding:defaultTextEncoding]
- completion:^(id json, JSONModelError* e) {
- if (completeBlock) completeBlock(json, e);
- }];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.h
deleted file mode 100644
index 444f26d9..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// JSONModel+networking.h
-// JSONModel
-//
-
-#import "JSONModel.h"
-#import "JSONHTTPClient.h"
-
-typedef void (^JSONModelBlock)(id model, JSONModelError *err) DEPRECATED_ATTRIBUTE;
-
-@interface JSONModel (Networking)
-
-@property (assign, nonatomic) BOOL isLoading DEPRECATED_ATTRIBUTE;
-- (instancetype)initFromURLWithString:(NSString *)urlString completion:(JSONModelBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)getModelFromURLWithString:(NSString *)urlString completion:(JSONModelBlock)completeBlock DEPRECATED_ATTRIBUTE;
-+ (void)postModel:(JSONModel *)post toURLWithString:(NSString *)urlString completion:(JSONModelBlock)completeBlock DEPRECATED_ATTRIBUTE;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.m
deleted file mode 100644
index b3e0aa42..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelNetworking/JSONModel+networking.m
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// JSONModel+networking.m
-// JSONModel
-//
-
-#import "JSONModel+networking.h"
-#import "JSONHTTPClient.h"
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#pragma GCC diagnostic ignored "-Wdeprecated-implementations"
-
-BOOL _isLoading;
-
-@implementation JSONModel(Networking)
-
-@dynamic isLoading;
-
--(BOOL)isLoading
-{
- return _isLoading;
-}
-
--(void)setIsLoading:(BOOL)isLoading
-{
- _isLoading = isLoading;
-}
-
--(instancetype)initFromURLWithString:(NSString *)urlString completion:(JSONModelBlock)completeBlock
-{
- id placeholder = [super init];
- __block id blockSelf = self;
-
- if (placeholder) {
- //initialization
- self.isLoading = YES;
-
- [JSONHTTPClient getJSONFromURLWithString:urlString
- completion:^(NSDictionary *json, JSONModelError* e) {
-
- JSONModelError* initError = nil;
- blockSelf = [self initWithDictionary:json error:&initError];
-
- if (completeBlock) {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_MSEC), dispatch_get_main_queue(), ^{
- completeBlock(blockSelf, e?e:initError );
- });
- }
-
- self.isLoading = NO;
-
- }];
- }
- return placeholder;
-}
-
-+ (void)getModelFromURLWithString:(NSString*)urlString completion:(JSONModelBlock)completeBlock
-{
- [JSONHTTPClient getJSONFromURLWithString:urlString
- completion:^(NSDictionary* jsonDict, JSONModelError* err)
- {
- JSONModel* model = nil;
-
- if(err == nil)
- {
- model = [[self alloc] initWithDictionary:jsonDict error:&err];
- }
-
- if(completeBlock != nil)
- {
- dispatch_async(dispatch_get_main_queue(), ^
- {
- completeBlock(model, err);
- });
- }
- }];
-}
-
-+ (void)postModel:(JSONModel*)post toURLWithString:(NSString*)urlString completion:(JSONModelBlock)completeBlock
-{
- [JSONHTTPClient postJSONFromURLWithString:urlString
- bodyString:[post toJSONString]
- completion:^(NSDictionary* jsonDict, JSONModelError* err)
- {
- JSONModel* model = nil;
-
- if(err == nil)
- {
- model = [[self alloc] initWithDictionary:jsonDict error:&err];
- }
-
- if(completeBlock != nil)
- {
- dispatch_async(dispatch_get_main_queue(), ^
- {
- completeBlock(model, err);
- });
- }
- }];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.h
deleted file mode 100644
index 61ea929f..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.h
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// JSONKeyMapper.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-typedef NSString *(^JSONModelKeyMapBlock)(NSString *keyName);
-
-/**
- * **You won't need to create or store instances of this class yourself.** If you want your model
- * to have different property names than the JSON feed keys, look below on how to
- * make your model use a key mapper.
- *
- * For example if you consume JSON from twitter
- * you get back underscore_case style key names. For example:
- *
- * <pre>"profile_sidebar_border_color": "0094C2",
- * "profile_background_tile": false,</pre>
- *
- * To comply with Obj-C accepted camelCase property naming for your classes,
- * you need to provide mapping between JSON keys and ObjC property names.
- *
- * In your model overwrite the + (JSONKeyMapper *)keyMapper method and provide a JSONKeyMapper
- * instance to convert the key names for your model.
- *
- * If you need custom mapping it's as easy as:
- * <pre>
- * + (JSONKeyMapper *)keyMapper {
- * &nbsp; return [[JSONKeyMapper&nbsp;alloc]&nbsp;initWithDictionary:@{@"crazy_JSON_name":@"myCamelCaseName"}];
- * }
- * </pre>
- * In case you want to handle underscore_case, **use the predefined key mapper**, like so:
- * <pre>
- * + (JSONKeyMapper *)keyMapper {
- * &nbsp; return [JSONKeyMapper&nbsp;mapperFromUnderscoreCaseToCamelCase];
- * }
- * </pre>
- */
-@interface JSONKeyMapper : NSObject
-
-// deprecated
-@property (readonly, nonatomic) JSONModelKeyMapBlock JSONToModelKeyBlock DEPRECATED_ATTRIBUTE;
-- (NSString *)convertValue:(NSString *)value isImportingToModel:(BOOL)importing DEPRECATED_MSG_ATTRIBUTE("use convertValue:");
-- (instancetype)initWithDictionary:(NSDictionary *)map DEPRECATED_MSG_ATTRIBUTE("use initWithModelToJSONDictionary:");
-- (instancetype)initWithJSONToModelBlock:(JSONModelKeyMapBlock)toModel modelToJSONBlock:(JSONModelKeyMapBlock)toJSON DEPRECATED_MSG_ATTRIBUTE("use initWithModelToJSONBlock:");
-+ (instancetype)mapper:(JSONKeyMapper *)baseKeyMapper withExceptions:(NSDictionary *)exceptions DEPRECATED_MSG_ATTRIBUTE("use baseMapper:withModelToJSONExceptions:");
-+ (instancetype)mapperFromUnderscoreCaseToCamelCase DEPRECATED_MSG_ATTRIBUTE("use mapperForSnakeCase:");
-+ (instancetype)mapperFromUpperCaseToLowerCase DEPRECATED_ATTRIBUTE;
-
-/** @name Name converters */
-/** Block, which takes in a property name and converts it to the corresponding JSON key name */
-@property (readonly, nonatomic) JSONModelKeyMapBlock modelToJSONKeyBlock;
-
-/** Combined converter method
- * @param value the source name
- * @return JSONKeyMapper instance
- */
-- (NSString *)convertValue:(NSString *)value;
-
-/** @name Creating a key mapper */
-
-/**
- * Creates a JSONKeyMapper instance, based on the block you provide this initializer.
- * The parameter takes in a JSONModelKeyMapBlock block:
- * <pre>NSString *(^JSONModelKeyMapBlock)(NSString *keyName)</pre>
- * The block takes in a string and returns the transformed (if at all) string.
- * @param toJSON transforms your model property name to a JSON key
- */
-- (instancetype)initWithModelToJSONBlock:(JSONModelKeyMapBlock)toJSON;
-
-/**
- * Creates a JSONKeyMapper instance, based on the mapping you provide.
- * Use your JSONModel property names as keys, and the JSON key names as values.
- * @param toJSON map dictionary, in the format: <pre>@{@"myCamelCaseName":@"crazy_JSON_name"}</pre>
- * @return JSONKeyMapper instance
- */
-- (instancetype)initWithModelToJSONDictionary:(NSDictionary <NSString *, NSString *> *)toJSON;
-
-/**
- * Given a camelCase model property, this mapper finds JSON keys using the snake_case equivalent.
- */
-+ (instancetype)mapperForSnakeCase;
-
-/**
- * Given a camelCase model property, this mapper finds JSON keys using the TitleCase equivalent.
- */
-+ (instancetype)mapperForTitleCase;
-
-/**
- * Creates a JSONKeyMapper based on a built-in JSONKeyMapper, with specific exceptions.
- * Use your JSONModel property names as keys, and the JSON key names as values.
- */
-+ (instancetype)baseMapper:(JSONKeyMapper *)baseKeyMapper withModelToJSONExceptions:(NSDictionary *)toJSON;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.m
deleted file mode 100644
index e1daa17f..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONKeyMapper.m
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// JSONKeyMapper.m
-// JSONModel
-//
-
-#import "JSONKeyMapper.h"
-
-@implementation JSONKeyMapper
-
-- (instancetype)initWithJSONToModelBlock:(JSONModelKeyMapBlock)toModel modelToJSONBlock:(JSONModelKeyMapBlock)toJSON
-{
- return [self initWithModelToJSONBlock:toJSON];
-}
-
-- (instancetype)initWithModelToJSONBlock:(JSONModelKeyMapBlock)toJSON
-{
- if (!(self = [self init]))
- return nil;
-
- _modelToJSONKeyBlock = toJSON;
-
- return self;
-}
-
-- (instancetype)initWithDictionary:(NSDictionary *)map
-{
- NSDictionary *toJSON = [JSONKeyMapper swapKeysAndValuesInDictionary:map];
-
- return [self initWithModelToJSONDictionary:toJSON];
-}
-
-- (instancetype)initWithModelToJSONDictionary:(NSDictionary <NSString *, NSString *> *)toJSON
-{
- if (!(self = [super init]))
- return nil;
-
- _modelToJSONKeyBlock = ^NSString *(NSString *keyName)
- {
- return [toJSON valueForKeyPath:keyName] ?: keyName;
- };
-
- return self;
-}
-
-- (JSONModelKeyMapBlock)JSONToModelKeyBlock
-{
- return nil;
-}
-
-+ (NSDictionary *)swapKeysAndValuesInDictionary:(NSDictionary *)dictionary
-{
- NSArray *keys = dictionary.allKeys;
- NSArray *values = [dictionary objectsForKeys:keys notFoundMarker:[NSNull null]];
-
- return [NSDictionary dictionaryWithObjects:keys forKeys:values];
-}
-
-- (NSString *)convertValue:(NSString *)value isImportingToModel:(BOOL)importing
-{
- return [self convertValue:value];
-}
-
-- (NSString *)convertValue:(NSString *)value
-{
- return _modelToJSONKeyBlock(value);
-}
-
-+ (instancetype)mapperFromUnderscoreCaseToCamelCase
-{
- return [self mapperForSnakeCase];
-}
-
-+ (instancetype)mapperForSnakeCase
-{
- return [[self alloc] initWithModelToJSONBlock:^NSString *(NSString *keyName)
- {
- NSMutableString *result = [NSMutableString stringWithString:keyName];
- NSRange range;
-
- // handle upper case chars
- range = [result rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]];
- while (range.location != NSNotFound)
- {
- NSString *lower = [result substringWithRange:range].lowercaseString;
- [result replaceCharactersInRange:range withString:[NSString stringWithFormat:@"_%@", lower]];
- range = [result rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]];
- }
-
- // handle numbers
- range = [result rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
- while (range.location != NSNotFound)
- {
- NSRange end = [result rangeOfString:@"\\D" options:NSRegularExpressionSearch range:NSMakeRange(range.location, result.length - range.location)];
-
- // spans to the end of the key name
- if (end.location == NSNotFound)
- end = NSMakeRange(result.length, 1);
-
- NSRange replaceRange = NSMakeRange(range.location, end.location - range.location);
- NSString *digits = [result substringWithRange:replaceRange];
- [result replaceCharactersInRange:replaceRange withString:[NSString stringWithFormat:@"_%@", digits]];
- range = [result rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet] options:0 range:NSMakeRange(end.location + 1, result.length - end.location - 1)];
- }
-
- return result;
- }];
-}
-
-+ (instancetype)mapperForTitleCase
-{
- return [[self alloc] initWithModelToJSONBlock:^NSString *(NSString *keyName)
- {
- return [keyName stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[keyName substringToIndex:1].uppercaseString];
- }];
-}
-
-+ (instancetype)mapperFromUpperCaseToLowerCase
-{
- return [[self alloc] initWithModelToJSONBlock:^NSString *(NSString *keyName)
- {
- return keyName.uppercaseString;
- }];
-}
-
-+ (instancetype)mapper:(JSONKeyMapper *)baseKeyMapper withExceptions:(NSDictionary *)exceptions
-{
- NSDictionary *toJSON = [JSONKeyMapper swapKeysAndValuesInDictionary:exceptions];
-
- return [self baseMapper:baseKeyMapper withModelToJSONExceptions:toJSON];
-}
-
-+ (instancetype)baseMapper:(JSONKeyMapper *)baseKeyMapper withModelToJSONExceptions:(NSDictionary *)toJSON
-{
- return [[self alloc] initWithModelToJSONBlock:^NSString *(NSString *keyName)
- {
- if (!keyName)
- return nil;
-
- if (toJSON[keyName])
- return toJSON[keyName];
-
- return baseKeyMapper.modelToJSONKeyBlock(keyName);
- }];
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.h b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.h
deleted file mode 100644
index 7dd585c9..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.h
+++ /dev/null
@@ -1,209 +0,0 @@
-//
-// JSONValueTransformer.h
-// JSONModel
-//
-
-#import <Foundation/Foundation.h>
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-#pragma mark - extern definitions
-/**
- * Boolean function to check for null values. Handy when you need to both check
- * for nil and [NSNUll null]
- */
-extern BOOL isNull(id value);
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-#pragma mark - JSONValueTransformer interface
-/**
- * **You don't need to call methods of this class manually.**
- *
- * Class providing methods to transform values from one class to another.
- * You are given a number of built-in transformers, but you are encouraged to
- * extend this class with your own categories to add further value transformers.
- * Just few examples of what can you add to JSONValueTransformer: hex colors in JSON to UIColor,
- * hex numbers in JSON to NSNumber model properties, base64 encoded strings in JSON to UIImage properties, and more.
- *
- * The class is invoked by JSONModel while transforming incoming
- * JSON types into your target class property classes, and vice versa.
- * One static copy is create and store in the JSONModel class scope.
- */
-@interface JSONValueTransformer : NSObject
-
-@property (strong, nonatomic, readonly) NSDictionary *primitivesNames;
-
-/** @name Resolving cluster class names */
-/**
- * This method returns the umbrella class for any standard class cluster members.
- * For example returns NSString when given as input NSString, NSMutableString, __CFString and __CFConstantString
- * The method currently looksup a pre-defined list.
- * @param sourceClass the class to get the umbrella class for
- * @return Class
- */
-+ (Class)classByResolvingClusterClasses:(Class)sourceClass;
-
-#pragma mark - NSMutableString <-> NSString
-/** @name Transforming to Mutable copies */
-/**
- * Transforms a string value to a mutable string value
- * @param string incoming string
- * @return mutable string
- */
-- (NSMutableString *)NSMutableStringFromNSString:(NSString *)string;
-
-#pragma mark - NSMutableArray <-> NSArray
-/**
- * Transforms an array to a mutable array
- * @param array incoming array
- * @return mutable array
- */
-- (NSMutableArray *)NSMutableArrayFromNSArray:(NSArray *)array;
-
-#pragma mark - NSMutableDictionary <-> NSDictionary
-/**
- * Transforms a dictionary to a mutable dictionary
- * @param dict incoming dictionary
- * @return mutable dictionary
- */
-- (NSMutableDictionary *)NSMutableDictionaryFromNSDictionary:(NSDictionary *)dict;
-
-#pragma mark - NSSet <-> NSArray
-/** @name Transforming Sets */
-/**
- * Transforms an array to a set
- * @param array incoming array
- * @return set with the array's elements
- */
-- (NSSet *)NSSetFromNSArray:(NSArray *)array;
-
-/**
- * Transforms an array to a mutable set
- * @param array incoming array
- * @return mutable set with the array's elements
- */
-- (NSMutableSet *)NSMutableSetFromNSArray:(NSArray *)array;
-
-/**
- * Transforms a set to an array
- * @param set incoming set
- * @return an array with the set's elements
- */
-- (NSArray *)JSONObjectFromNSSet:(NSSet *)set;
-
-/**
- * Transforms a mutable set to an array
- * @param set incoming mutable set
- * @return an array with the set's elements
- */
-- (NSArray *)JSONObjectFromNSMutableSet:(NSMutableSet *)set;
-
-#pragma mark - BOOL <-> number/string
-/** @name Transforming JSON types */
-/**
- * Transforms a number object to a bool number object
- * @param number the number to convert
- * @return the resulting number
- */
-- (NSNumber *)BOOLFromNSNumber:(NSNumber *)number;
-
-/**
- * Transforms a number object to a bool number object
- * @param string the string value to convert, "0" converts to NO, everything else to YES
- * @return the resulting number
- */
-- (NSNumber *)BOOLFromNSString:(NSString *)string;
-
-/**
- * Transforms a BOOL value to a bool number object
- * @param number an NSNumber value coming from the model
- * @return the result number
- */
-- (NSNumber *)JSONObjectFromBOOL:(NSNumber *)number;
-
-#pragma mark - string <-> number
-/**
- * Transforms a string object to a number object
- * @param string the string to convert
- * @return the resulting number
- */
-- (NSNumber *)NSNumberFromNSString:(NSString *)string;
-
-/**
- * Transforms a number object to a string object
- * @param number the number to convert
- * @return the resulting string
- */
-- (NSString *)NSStringFromNSNumber:(NSNumber *)number;
-
-/**
- * Transforms a string object to a nsdecimalnumber object
- * @param string the string to convert
- * @return the resulting number
- */
-- (NSDecimalNumber *)NSDecimalNumberFromNSString:(NSString *)string;
-
-/**
- * Transforms a nsdecimalnumber object to a string object
- * @param number the number to convert
- * @return the resulting string
- */
-- (NSString *)NSStringFromNSDecimalNumber:(NSDecimalNumber *)number;
-
-
-#pragma mark - string <-> url
-/** @name Transforming URLs */
-/**
- * Transforms a string object to an NSURL object
- * @param string the string to convert
- * @return the resulting url object
- */
-- (NSURL *)NSURLFromNSString:(NSString *)string;
-
-/**
- * Transforms an NSURL object to a string
- * @param url the url object to convert
- * @return the resulting string
- */
-- (NSString *)JSONObjectFromNSURL:(NSURL *)url;
-
-#pragma mark - string <-> time zone
-
-/** @name Transforming NSTimeZone */
-/**
- * Transforms a string object to an NSTimeZone object
- * @param string the string to convert
- * @return the resulting NSTimeZone object
- */
-- (NSTimeZone *)NSTimeZoneFromNSString:(NSString *)string;
-
-/**
- * Transforms an NSTimeZone object to a string
- * @param timeZone the time zone object to convert
- * @return the resulting string
- */
-- (NSString *)JSONObjectFromNSTimeZone:(NSTimeZone *)timeZone;
-
-#pragma mark - string <-> date
-/** @name Transforming Dates */
-/**
- * The following two methods are not public. This way if there is a category on converting
- * dates it'll override them. If there isn't a category the default methods found in the .m
- * file will be invoked. If these are public a warning is produced at the point of overriding
- * them in a category, so they have to stay hidden here.
- */
-
-//- (NSDate *)NSDateFromNSString:(NSString *)string;
-//- (NSString *)JSONObjectFromNSDate:(NSDate *)date;
-
-#pragma mark - number <-> date
-
-/**
- * Transforms a number to an NSDate object
- * @param number the number to convert
- * @return the resulting date
- */
-- (NSDate *)NSDateFromNSNumber:(NSNumber *)number;
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.m b/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.m
deleted file mode 100644
index 0fc55714..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/JSONModel/JSONModelTransformations/JSONValueTransformer.m
+++ /dev/null
@@ -1,246 +0,0 @@
-//
-// JSONValueTransformer.m
-// JSONModel
-//
-
-#import "JSONValueTransformer.h"
-
-#pragma mark - functions
-extern BOOL isNull(id value)
-{
- if (!value) return YES;
- if ([value isKindOfClass:[NSNull class]]) return YES;
-
- return NO;
-}
-
-@implementation JSONValueTransformer
-
--(id)init
-{
- self = [super init];
- if (self) {
- _primitivesNames = @{@"f":@"float", @"i":@"int", @"d":@"double", @"l":@"long", @"B":@"BOOL", @"s":@"short",
- @"I":@"unsigned int", @"L":@"usigned long", @"q":@"long long", @"Q":@"unsigned long long", @"S":@"unsigned short", @"c":@"char", @"C":@"unsigned char",
- //and some famous aliases of primitive types
- // BOOL is now "B" on iOS __LP64 builds
- @"I":@"NSInteger", @"Q":@"NSUInteger", @"B":@"BOOL",
-
- @"@?":@"Block"};
- }
- return self;
-}
-
-+(Class)classByResolvingClusterClasses:(Class)sourceClass
-{
- //check for all variations of strings
- if ([sourceClass isSubclassOfClass:[NSString class]]) {
- return [NSString class];
- }
-
- //check for all variations of numbers
- if ([sourceClass isSubclassOfClass:[NSNumber class]]) {
- return [NSNumber class];
- }
-
- //check for all variations of dictionaries
- if ([sourceClass isSubclassOfClass:[NSArray class]]) {
- return [NSArray class];
- }
-
- //check for all variations of arrays
- if ([sourceClass isSubclassOfClass:[NSDictionary class]]) {
- return [NSDictionary class];
- }
-
- //check for all variations of dates
- if ([sourceClass isSubclassOfClass:[NSDate class]]) {
- return [NSDate class];
- }
-
- //no cluster parent class found
- return sourceClass;
-}
-
-#pragma mark - NSMutableString <-> NSString
--(NSMutableString*)NSMutableStringFromNSString:(NSString*)string
-{
- return [NSMutableString stringWithString:string];
-}
-
-#pragma mark - NSMutableArray <-> NSArray
--(NSMutableArray*)NSMutableArrayFromNSArray:(NSArray*)array
-{
- return [NSMutableArray arrayWithArray:array];
-}
-
-#pragma mark - NSMutableDictionary <-> NSDictionary
--(NSMutableDictionary*)NSMutableDictionaryFromNSDictionary:(NSDictionary*)dict
-{
- return [NSMutableDictionary dictionaryWithDictionary:dict];
-}
-
-#pragma mark - NSSet <-> NSArray
--(NSSet*)NSSetFromNSArray:(NSArray*)array
-{
- return [NSSet setWithArray:array];
-}
-
--(NSMutableSet*)NSMutableSetFromNSArray:(NSArray*)array
-{
- return [NSMutableSet setWithArray:array];
-}
-
--(id)JSONObjectFromNSSet:(NSSet*)set
-{
- return [set allObjects];
-}
-
--(id)JSONObjectFromNSMutableSet:(NSMutableSet*)set
-{
- return [set allObjects];
-}
-
-//
-// 0 converts to NO, everything else converts to YES
-//
-
-#pragma mark - BOOL <-> number/string
--(NSNumber*)BOOLFromNSNumber:(NSNumber*)number
-{
- if (isNull(number)) return [NSNumber numberWithBool:NO];
- return [NSNumber numberWithBool: number.intValue==0?NO:YES];
-}
-
--(NSNumber*)BOOLFromNSString:(NSString*)string
-{
- if (string != nil &&
- ([string caseInsensitiveCompare:@"true"] == NSOrderedSame ||
- [string caseInsensitiveCompare:@"yes"] == NSOrderedSame)) {
- return [NSNumber numberWithBool:YES];
- }
- return [NSNumber numberWithBool: ([string intValue]==0)?NO:YES];
-}
-
--(NSNumber*)JSONObjectFromBOOL:(NSNumber*)number
-{
- return [NSNumber numberWithBool: number.intValue==0?NO:YES];
-}
-
-#pragma mark - string/number <-> float
--(float)floatFromObject:(id)obj
-{
- return [obj floatValue];
-}
-
--(float)floatFromNSString:(NSString*)string
-{
- return [self floatFromObject:string];
-}
-
--(float)floatFromNSNumber:(NSNumber*)number
-{
- return [self floatFromObject:number];
-}
-
--(NSNumber*)NSNumberFromfloat:(float)f
-{
- return [NSNumber numberWithFloat:f];
-}
-
-#pragma mark - string <-> number
--(NSNumber*)NSNumberFromNSString:(NSString*)string
-{
- return [NSNumber numberWithDouble:[string doubleValue]];
-}
-
--(NSString*)NSStringFromNSNumber:(NSNumber*)number
-{
- return [number stringValue];
-}
-
--(NSDecimalNumber*)NSDecimalNumberFromNSString:(NSString*)string
-{
- return [NSDecimalNumber decimalNumberWithString:string];
-}
-
--(NSString*)NSStringFromNSDecimalNumber:(NSDecimalNumber*)number
-{
- return [number stringValue];
-}
-
-#pragma mark - string <-> url
--(NSURL*)NSURLFromNSString:(NSString*)string
-{
- // do not change this behavior - there are other ways of overriding it
- // see: https://github.com/jsonmodel/jsonmodel/pull/119
- return [NSURL URLWithString:string];
-}
-
--(NSString*)JSONObjectFromNSURL:(NSURL*)url
-{
- return [url absoluteString];
-}
-
-#pragma mark - string <-> date
--(NSDateFormatter*)importDateFormatter
-{
- static dispatch_once_t onceInput;
- static NSDateFormatter* inputDateFormatter;
- dispatch_once(&onceInput, ^{
- inputDateFormatter = [[NSDateFormatter alloc] init];
- [inputDateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
- [inputDateFormatter setDateFormat:@"yyyy-MM-dd'T'HHmmssZZZ"];
- });
- return inputDateFormatter;
-}
-
--(NSDate*)__NSDateFromNSString:(NSString*)string
-{
- string = [string stringByReplacingOccurrencesOfString:@":" withString:@""]; // this is such an ugly code, is this the only way?
- return [self.importDateFormatter dateFromString: string];
-}
-
--(NSString*)__JSONObjectFromNSDate:(NSDate*)date
-{
- static dispatch_once_t onceOutput;
- static NSDateFormatter *outputDateFormatter;
- dispatch_once(&onceOutput, ^{
- outputDateFormatter = [[NSDateFormatter alloc] init];
- [outputDateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
- [outputDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
- });
- return [outputDateFormatter stringFromDate:date];
-}
-
-#pragma mark - number <-> date
-- (NSDate*)NSDateFromNSNumber:(NSNumber*)number
-{
- return [NSDate dateWithTimeIntervalSince1970:number.doubleValue];
-}
-
-#pragma mark - string <-> NSTimeZone
-
-- (NSTimeZone *)NSTimeZoneFromNSString:(NSString *)string {
- return [NSTimeZone timeZoneWithName:string];
-}
-
-- (id)JSONObjectFromNSTimeZone:(NSTimeZone *)timeZone {
- return [timeZone name];
-}
-
-#pragma mark - hidden transform for empty dictionaries
-//https://github.com/jsonmodel/jsonmodel/issues/163
--(NSDictionary*)__NSDictionaryFromNSArray:(NSArray*)array
-{
- if (array.count==0) return @{};
- return (id)array;
-}
-
--(NSMutableDictionary*)__NSMutableDictionaryFromNSArray:(NSArray*)array
-{
- if (array.count==0) return [[self __NSDictionaryFromNSArray:array] mutableCopy];
- return (id)array;
-}
-
-@end
diff --git a/comwell_key_app/ios/Pods/JSONModel/LICENSE b/comwell_key_app/ios/Pods/JSONModel/LICENSE
deleted file mode 100644
index babea518..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright (c) 2012-2016 Marin Todorov and JSONModel contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/comwell_key_app/ios/Pods/JSONModel/README.md b/comwell_key_app/ios/Pods/JSONModel/README.md
deleted file mode 100644
index 67089d95..00000000
--- a/comwell_key_app/ios/Pods/JSONModel/README.md
+++ /dev/null
@@ -1,395 +0,0 @@
-# JSONModel - Magical Data Modeling Framework for JSON
-
-JSONModel allows rapid creation of smart data models. You can use it in your
-iOS, macOS, watchOS and tvOS apps. Automatic introspection of your model classes
-and JSON input drastically reduces the amount of code you have to write.
-
-See [CHANGELOG.md](CHANGELOG.md) for details on changes.
-
-## Installation
-
-### CocoaPods
-
-```ruby
-pod 'JSONModel'
-```
-
-### Carthage
-
-```ruby
-github "jsonmodel/jsonmodel"
-```
-
-### Manual
-
-0. download the JSONModel repository
-0. copy the JSONModel sub-folder into your Xcode project
-0. link your app to SystemConfiguration.framework
-
-## Basic Usage
-
-Consider you have JSON like this:
-
-```json
-{ "id": 10, "country": "Germany", "dialCode": 49, "isInEurope": true }
-```
-
-- create a JSONModel subclass for your data model
-- declare properties in your header file with the name of the JSON keys:
-
-```objc
-@interface CountryModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *country;
-@property (nonatomic) NSString *dialCode;
-@property (nonatomic) BOOL isInEurope;
-@end
-```
-
-There's no need to do anything in the implementation (`.m`) file.
-
-- initialize your model with data:
-
-```objc
-NSError *error;
-CountryModel *country = [[CountryModel alloc] initWithString:myJson error:&error];
-```
-
-If the validation of the JSON passes. you have all the corresponding properties
-in your model populated from the JSON. JSONModel will also try to convert as
-much data to the types you expect. In the example above it will:
-
-- convert `id` from string (in the JSON) to an `int` for your class
-- copy the `country` value
-- convert `dialCode` from a number (in the JSON) to an `NSString` value
-- copy the `isInEurope` value
-
-All you have to do is define the properties and their expected types.
-
-## Examples
-
-### Automatic name based mapping
-
-```json
-{
- "id": 123,
- "name": "Product name",
- "price": 12.95
-}
-```
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *name;
-@property (nonatomic) float price;
-@end
-```
-
-### Model cascading (models including other models)
-
-```json
-{
- "orderId": 104,
- "totalPrice": 13.45,
- "product": {
- "id": 123,
- "name": "Product name",
- "price": 12.95
- }
-}
-```
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *name;
-@property (nonatomic) float price;
-@end
-
-@interface OrderModel : JSONModel
-@property (nonatomic) NSInteger orderId;
-@property (nonatomic) float totalPrice;
-@property (nonatomic) ProductModel *product;
-@end
-```
-
-### Model collections
-
-```json
-{
- "orderId": 104,
- "totalPrice": 103.45,
- "products": [
- {
- "id": 123,
- "name": "Product #1",
- "price": 12.95
- },
- {
- "id": 137,
- "name": "Product #2",
- "price": 82.95
- }
- ]
-}
-```
-
-```objc
-@protocol ProductModel;
-
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *name;
-@property (nonatomic) float price;
-@end
-
-@interface OrderModel : JSONModel
-@property (nonatomic) NSInteger orderId;
-@property (nonatomic) float totalPrice;
-@property (nonatomic) NSArray <ProductModel> *products;
-@end
-```
-
-Note: the angle brackets after `NSArray` contain a protocol. This is not the
-same as the Objective-C generics system. They are not mutually exclusive, but
-for JSONModel to work, the protocol must be in place.
-
-Also property can have generics info for compiler
-```objc
-@interface OrderModel : JSONModel
-@property (nonatomic) NSInteger orderId;
-@property (nonatomic) float totalPrice;
-@property (nonatomic) NSArray<ProductModel *> <ProductModel> *products;
-@end
-```
-
-### Nested key mapping
-
-```json
-{
- "orderId": 104,
- "orderDetails": {
- "name": "Product #1",
- "price": {
- "usd": 12.95
- }
- }
-}
-```
-
-```objc
-@interface OrderModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *productName;
-@property (nonatomic) float price;
-@end
-
-@implementation OrderModel
-
-+ (JSONKeyMapper *)keyMapper
-{
- return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{
- @"id": @"orderId",
- @"productName": @"orderDetails.name",
- @"price": @"orderDetails.price.usd"
- }];
-}
-
-@end
-```
-
-### Map automatically to snake_case
-
-```json
-{
- "order_id": 104,
- "order_product": "Product #1",
- "order_price": 12.95
-}
-```
-
-```objc
-@interface OrderModel : JSONModel
-@property (nonatomic) NSInteger orderId;
-@property (nonatomic) NSString *orderProduct;
-@property (nonatomic) float orderPrice;
-@end
-
-@implementation OrderModel
-
-+ (JSONKeyMapper *)keyMapper
-{
- return [JSONKeyMapper mapperForSnakeCase];
-}
-
-@end
-```
-
-### Optional properties (i.e. can be missing or null)
-
-```json
-{
- "id": 123,
- "name": null,
- "price": 12.95
-}
-```
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString <Optional> *name;
-@property (nonatomic) float price;
-@property (nonatomic) NSNumber <Optional> *uuid;
-@end
-```
-
-### Ignored properties (i.e. JSONModel completely ignores them)
-
-```json
-{
- "id": 123,
- "name": null
-}
-```
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString <Ignore> *customProperty;
-@end
-```
-
-### Making scalar types optional
-
-```json
-{
- "id": null
-}
-```
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@end
-
-@implementation ProductModel
-
-+ (BOOL)propertyIsOptional:(NSString *)propertyName
-{
- if ([propertyName isEqualToString:@"id"])
- return YES;
-
- return NO;
-}
-
-@end
-```
-
-### Export model to `NSDictionary` or JSON
-
-```objc
-ProductModel *pm = [ProductModel new];
-pm.name = @"Some Name";
-
-// convert to dictionary
-NSDictionary *dict = [pm toDictionary];
-
-// convert to json
-NSString *string = [pm toJSONString];
-```
-
-### Custom data transformers
-
-```objc
-@interface JSONValueTransformer (CustomTransformer)
-@end
-
-@implementation JSONValueTransformer (CustomTransformer)
-
-- (NSDate *)NSDateFromNSString:(NSString *)string
-{
- NSDateFormatter *formatter = [NSDateFormatter new];
- formatter.dateFormat = APIDateFormat;
- return [formatter dateFromString:string];
-}
-
-- (NSString *)JSONObjectFromNSDate:(NSDate *)date
-{
- NSDateFormatter *formatter = [NSDateFormatter new];
- formatter.dateFormat = APIDateFormat;
- return [formatter stringFromDate:date];
-}
-
-@end
-```
-
-### Custom getters/setters
-
-```objc
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *name;
-@property (nonatomic) float price;
-@property (nonatomic) NSLocale *locale;
-@end
-
-@implementation ProductModel
-
-- (void)setLocaleWithNSString:(NSString *)string
-{
- self.locale = [NSLocale localeWithLocaleIdentifier:string];
-}
-
-- (void)setLocaleWithNSDictionary:(NSDictionary *)dictionary
-{
- self.locale = [NSLocale localeWithLocaleIdentifier:dictionary[@"identifier"]];
-}
-
-- (NSString *)JSONObjectForLocale
-{
- return self.locale.localeIdentifier;
-}
-
-@end
-```
-
-### Custom JSON validation
-
-```objc
-
-@interface ProductModel : JSONModel
-@property (nonatomic) NSInteger id;
-@property (nonatomic) NSString *name;
-@property (nonatomic) float price;
-@property (nonatomic) NSLocale *locale;
-@property (nonatomic) NSNumber <Ignore> *minNameLength;
-@end
-
-@implementation ProductModel
-
-- (BOOL)validate:(NSError **)error
-{
- if (![super validate:error])
- return NO;
-
- if (self.name.length < self.minNameLength.integerValue)
- {
- *error = [NSError errorWithDomain:@"me.mycompany.com" code:1 userInfo:nil];
- return NO;
- }
-
- return YES;
-}
-
-@end
-```
-
-## License
-
-MIT licensed - see [LICENSE](LICENSE) file.
-
-## Contributing
-
-We love pull requests! See [CONTRIBUTING.md](CONTRIBUTING.md) for full details.
diff --git a/comwell_key_app/ios/Runner/Runner.entitlements b/comwell_key_app/ios/Runner/Runner.entitlements
index 647a38fd..0c67376e 100644
--- a/comwell_key_app/ios/Runner/Runner.entitlements
+++ b/comwell_key_app/ios/Runner/Runner.entitlements
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
-<dict>
- <key>com.apple.developer.passkit.pass-presentation-suppression</key>
- <true/>
-</dict>
+<dict/>
</plist>
diff --git a/comwell_key_app/ios/Runner/RunnerDebug-develop.entitlements b/comwell_key_app/ios/Runner/RunnerDebug-develop.entitlements
index 280a0133..4b666946 100644
--- a/comwell_key_app/ios/Runner/RunnerDebug-develop.entitlements
+++ b/comwell_key_app/ios/Runner/RunnerDebug-develop.entitlements
@@ -6,7 +6,5 @@
<array>
<string>merchant.ComwellHotelsECOM</string>
</array>
- <key>com.apple.developer.passkit.pass-presentation-suppression</key>
- <true/>
</dict>
</plist>
diff --git a/comwell_key_app/ios/Runner/RunnerRelease.entitlements b/comwell_key_app/ios/Runner/RunnerRelease.entitlements
index 647a38fd..0c67376e 100644
--- a/comwell_key_app/ios/Runner/RunnerRelease.entitlements
+++ b/comwell_key_app/ios/Runner/RunnerRelease.entitlements
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
-<dict>
- <key>com.apple.developer.passkit.pass-presentation-suppression</key>
- <true/>
-</dict>
+<dict/>
</plist>