From 0caa3e9461bb9e4bb66699476e5de19c3ed8efc7 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 30 Aug 2012 08:52:08 +0200 Subject: [PATCH] implement message delivery status notification --- Classes/ChatRoomTableViewController.h | 1 + Classes/ChatRoomTableViewController.m | 14 +++- Classes/ChatRoomViewController.m | 16 ++++- Classes/DialerViewController.m | 2 +- Classes/InCallTableViewController.m | 4 +- Classes/InCallViewController.m | 5 +- Classes/LinphoneManager.m | 30 ++++++--- Classes/LinphoneUI/UICallBar.m | 5 +- Classes/LinphoneUI/UIChatRoomCell.h | 2 +- Classes/LinphoneUI/UIChatRoomCell.m | 16 ++++- Classes/LinphoneUI/UIChatRoomCell.xib | 61 +++++++++++++++--- Classes/LinphoneUI/UIHangUpButton.m | 3 +- Classes/LinphoneUI/UIPauseButton.m | 4 +- Classes/Model/ChatModel.h | 3 + Classes/Model/ChatModel.m | 17 +++-- Resources/chat_message_delivered.png | Bin 0 -> 1701 bytes Resources/chat_message_inprogress.png | Bin 0 -> 684 bytes Resources/chat_message_not_delivered.png | Bin 0 -> 1488 bytes Resources/database.sqlite | Bin 3072 -> 0 bytes linphone.xcodeproj/project.pbxproj | 24 +++++-- .../liblinphone.xcodeproj/project.pbxproj | 6 -- submodules/linphone | 2 +- 22 files changed, 162 insertions(+), 53 deletions(-) create mode 100644 Resources/chat_message_delivered.png create mode 100644 Resources/chat_message_inprogress.png create mode 100644 Resources/chat_message_not_delivered.png delete mode 100644 Resources/database.sqlite diff --git a/Classes/ChatRoomTableViewController.h b/Classes/ChatRoomTableViewController.h index e36041750..5d3b01ca2 100644 --- a/Classes/ChatRoomTableViewController.h +++ b/Classes/ChatRoomTableViewController.h @@ -29,5 +29,6 @@ @property (nonatomic, retain) NSString *remoteAddress; - (void)addChatEntry:(ChatModel*)chat; +- (void)updateChatEntry:(ChatModel*)chat; @end diff --git a/Classes/ChatRoomTableViewController.m b/Classes/ChatRoomTableViewController.m index 3e8da2008..d06ade197 100644 --- a/Classes/ChatRoomTableViewController.m +++ b/Classes/ChatRoomTableViewController.m @@ -71,7 +71,19 @@ [self.tableView endUpdates]; [self scrollToLastUnread:true]; } - +- (void)updateChatEntry:(ChatModel*)chat { + if(data == nil) { + [LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot update entry: null data"]; + return; + } + NSInteger index = [data indexOfObject:chat]; + if (index<0) { + [LinphoneLogger logc:LinphoneLoggerWarning format:"chat entries diesn not exixt"]; + return; + } + [[self tableView] reloadData]; //just reload + return; +} - (void)scrollToLastUnread:(BOOL)animated { if(data == nil) { [LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot add entry: null data"]; diff --git a/Classes/ChatRoomViewController.m b/Classes/ChatRoomViewController.m index 7d945b531..8d3282c71 100644 --- a/Classes/ChatRoomViewController.m +++ b/Classes/ChatRoomViewController.m @@ -186,6 +186,15 @@ static UICompositeViewDescription *compositeDescription = nil; } [avatarImage setImage:image]; } +static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud) { + ChatRoomViewController* thiz=(ChatRoomViewController*)ud; + ChatModel *chat = (ChatModel *)linphone_chat_message_get_user_data(msg); + [LinphoneLogger log:LinphoneLoggerLog + format:@"Delivery status for [%@] is [%s]",chat.message,linphone_chat_message_state_to_string(state)]; + [chat setState:[NSNumber numberWithInt:state]]; + [chat update]; + [thiz.tableController updateChatEntry:chat]; +} - (BOOL)sendMessage:(NSString *)message { if(![LinphoneManager isLcReady]) { @@ -211,6 +220,7 @@ static UICompositeViewDescription *compositeDescription = nil; } chatRoom = linphone_core_create_chat_room([LinphoneManager getLc], [remoteAddress UTF8String]); + } // Save message in database @@ -221,11 +231,13 @@ static UICompositeViewDescription *compositeDescription = nil; [chat setDirection:[NSNumber numberWithInt:0]]; [chat setTime:[NSDate date]]; [chat setRead:[NSNumber numberWithInt:1]]; + [chat setState:[NSNumber numberWithInt:1]]; //INPROGRESS [chat create]; [tableController addChatEntry:chat]; [chat release]; - - linphone_chat_room_send_message(chatRoom, [message UTF8String]); + LinphoneChatMessage* msg = linphone_chat_room_create_message(chatRoom,[message UTF8String]); + linphone_chat_message_set_user_data(msg,chat); + linphone_chat_room_send_message2(chatRoom, msg,message_status,self); return TRUE; } diff --git a/Classes/DialerViewController.m b/Classes/DialerViewController.m index 21b20f6bc..707d4a829 100644 --- a/Classes/DialerViewController.m +++ b/Classes/DialerViewController.m @@ -27,7 +27,7 @@ #import "Utils.h" #include "linphonecore.h" -#include "private.h" + @implementation DialerViewController diff --git a/Classes/InCallTableViewController.m b/Classes/InCallTableViewController.m index 158df61ab..f4c939c4a 100644 --- a/Classes/InCallTableViewController.m +++ b/Classes/InCallTableViewController.m @@ -22,7 +22,7 @@ #import "UIConferenceHeader.h" #import "LinphoneManager.h" -#include "private.h" + @implementation InCallTableViewController @@ -92,7 +92,7 @@ enum TableSection { + (bool)isInConference:(LinphoneCall*) call { if (!call) return false; - return linphone_call_get_current_params(call)->in_conference; + return linphone_call_is_in_conference(call); } + (int)callCount:(LinphoneCore*) lc { diff --git a/Classes/InCallViewController.m b/Classes/InCallViewController.m index e836a18ef..1c66439b7 100644 --- a/Classes/InCallViewController.m +++ b/Classes/InCallViewController.m @@ -31,7 +31,7 @@ #import "UILinphone.h" #include "linphonecore.h" -#include "private.h" + const NSInteger SECURE_BUTTON_TAG=5; @@ -428,7 +428,8 @@ static UICompositeViewDescription *compositeDescription = nil; [videoWaitingForFirstImage startAnimating]; LinphoneCall *call = linphone_core_get_current_call([LinphoneManager getLc]); - if (call != NULL && call->videostream) { + //linphone_call_params_get_used_video_codec return 0 if no video stream enabled + if (call != NULL && linphone_call_params_get_used_video_codec(linphone_call_get_current_params(call))) { linphone_call_set_next_video_frame_decoded_callback(call, hideSpinner, self); } } diff --git a/Classes/LinphoneManager.m b/Classes/LinphoneManager.m index 0862758e3..910d7279a 100644 --- a/Classes/LinphoneManager.m +++ b/Classes/LinphoneManager.m @@ -33,7 +33,7 @@ #include "linphonecore_utils.h" #include "lpconfig.h" -#include "private.h" + static LinphoneCore* theLinphoneCore = nil; static LinphoneManager* theLinphoneManager = nil; @@ -231,13 +231,27 @@ struct codec_name_pref_table codec_pref_table[]={ #pragma mark - Database Functions - (void)openDatabase { - NSString *src = [LinphoneManager bundleFile:@"database.sqlite"]; - NSString *dst = [LinphoneManager documentFile:@"database.sqlite"]; - [LinphoneManager copyFile:src destination:dst override:FALSE]; - - if(sqlite3_open([dst UTF8String], &database) != SQLITE_OK) { - [LinphoneLogger log:LinphoneLoggerError format:@"Can't open \"%@\" sqlite3 database.", dst]; - } + NSString *databasePath = [LinphoneManager documentFile:@"chat_database.sqlite"]; + NSFileManager *filemgr = [NSFileManager defaultManager]; + //[filemgr removeItemAtPath:databasePath error:nil]; + BOOL firstInstall= ![filemgr fileExistsAtPath: databasePath ]; + + if(sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) { + [LinphoneLogger log:LinphoneLoggerError format:@"Can't open \"%@\" sqlite3 database.", databasePath]; + return; + } + + if (firstInstall) { + char *errMsg; + //better to create the db from the code + const char *sql_stmt = "CREATE TABLE chat (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT NOT NULL, time NUMERIC, read INTEGER, state INTEGER)"; + + if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { + [LinphoneLogger logc:LinphoneLoggerError format:"Can't create table error[%s] ", errMsg]; + } + } + + [filemgr release]; } - (void)closeDatabase { diff --git a/Classes/LinphoneUI/UICallBar.m b/Classes/LinphoneUI/UICallBar.m index 968a0bc3c..db7d1c8a6 100644 --- a/Classes/LinphoneUI/UICallBar.m +++ b/Classes/LinphoneUI/UICallBar.m @@ -23,7 +23,6 @@ #import "Utils.h" #include "linphonecore.h" -#include "private.h" @implementation UICallBar @@ -218,6 +217,10 @@ [[NSNotificationCenter defaultCenter] removeObserver:self name:kLinphoneCallUpdate object:nil]; + if (linphone_core_get_calls_nb([LinphoneManager getLc]) == 0) { + //reseting speaker button because no more call + speakerButton.selected=FALSE; + } } #pragma mark - Event Functions diff --git a/Classes/LinphoneUI/UIChatRoomCell.h b/Classes/LinphoneUI/UIChatRoomCell.h index 503fffe66..bb76a3c5d 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.h +++ b/Classes/LinphoneUI/UIChatRoomCell.h @@ -31,7 +31,7 @@ @property (nonatomic, retain) IBOutlet UILabel *messageLabel; @property (nonatomic, retain) IBOutlet UIButton *deleteButton; @property (nonatomic, retain) IBOutlet UILabel *dateLabel; - +@property (nonatomic, retain) IBOutlet UIImageView* statusImage; - (id)initWithIdentifier:(NSString*)identifier; + (CGFloat)height:(ChatModel*)chat width:(int)width; diff --git a/Classes/LinphoneUI/UIChatRoomCell.m b/Classes/LinphoneUI/UIChatRoomCell.m index 08d5ce136..badd8088f 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.m +++ b/Classes/LinphoneUI/UIChatRoomCell.m @@ -21,6 +21,7 @@ #import "Utils.h" #import +#include "linphonecore.h" @implementation UIChatRoomCell @@ -31,6 +32,7 @@ @synthesize deleteButton; @synthesize dateLabel; @synthesize chat; +@synthesize statusImage; static const CGFloat CELL_MIN_HEIGHT = 40.0f; static const CGFloat CELL_MIN_WIDTH = 150.0f; @@ -59,7 +61,7 @@ static UIFont *CELL_FONT = nil; [messageLabel release]; [deleteButton release]; [dateLabel release]; - + [statusImage release]; [chat release]; [super dealloc]; @@ -96,6 +98,18 @@ static UIFont *CELL_FONT = nil; [dateFormatter setLocale:locale]; [dateLabel setText:[dateFormatter stringFromDate:[chat time]]]; [dateFormatter release]; + if ([chat.state intValue] == LinphoneChatMessageStateInProgress) { + [statusImage setImage:[UIImage imageNamed:@"chat_message_inprogress.png"] ]; + statusImage.hidden=FALSE; + } else if ([chat.state intValue] == LinphoneChatMessageStateDelivered) { + [statusImage setImage:[UIImage imageNamed:@"chat_message_delivered.png"] ]; + statusImage.hidden=FALSE; + } else if ([chat.state intValue] == LinphoneChatMessageStateNotDelivered) { + [statusImage setImage:[UIImage imageNamed:@"chat_message_not_delivered.png"]]; + statusImage.hidden=FALSE; + } else { + statusImage.hidden=TRUE; + } } - (void)setEditing:(BOOL)editing { diff --git a/Classes/LinphoneUI/UIChatRoomCell.xib b/Classes/LinphoneUI/UIChatRoomCell.xib index 3b9e82293..e8127e89c 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.xib +++ b/Classes/LinphoneUI/UIChatRoomCell.xib @@ -3,19 +3,19 @@ 1296 11E53 - 2549 + 2182 1138.47 569.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1498 + 1181 - IBProxyObject IBUIButton IBUIImageView - IBUILabel IBUIView + IBUILabel + IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -131,9 +131,10 @@ 265 - {{14, 107}, {280, 7}} + {{14, 107}, {260, 7}} + _NS:9 NO YES @@ -144,17 +145,33 @@ 0 - 10 + 8 2 1 - 10 + 9 Helvetica - 10 + 9 16 + NO + + + + 265 + {{284, 104}, {10, 10}} + + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + chat_message_not_delivered.png + {{13, 13}, {294, 114}} @@ -186,6 +203,7 @@ {100, 100} + _NS:9 IBCocoaTouchFramework @@ -196,6 +214,7 @@ {100, 100} + _NS:9 IBCocoaTouchFramework @@ -267,6 +286,14 @@ 25 + + + statusImage + + + + 27 + onDeleteClick: @@ -331,6 +358,7 @@ + messageView @@ -353,6 +381,12 @@ timestampLabel + + 26 + + + status + @@ -367,6 +401,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -375,7 +410,7 @@ - 25 + 27 @@ -400,6 +435,7 @@ UIView UILabel UIView + UIImageView @@ -426,6 +462,10 @@ messageView UIView + + statusImage + UIImageView + IBProjectSource @@ -444,9 +484,10 @@ 3 {71, 46} + {18, 17} {45, 45} {45, 45} - 1498 + 1181 diff --git a/Classes/LinphoneUI/UIHangUpButton.m b/Classes/LinphoneUI/UIHangUpButton.m index 61e4f38a1..6cc759087 100644 --- a/Classes/LinphoneUI/UIHangUpButton.m +++ b/Classes/LinphoneUI/UIHangUpButton.m @@ -20,7 +20,6 @@ #import "UIHangUpButton.h" #import "LinphoneManager.h" -#import "private.h" @implementation UIHangUpButton @@ -30,7 +29,7 @@ + (bool)isInConference:(LinphoneCall*) call { if (!call) return false; - return linphone_call_get_current_params(call)->in_conference; + return linphone_call_is_in_conference(call); } + (int)callCount:(LinphoneCore*) lc { diff --git a/Classes/LinphoneUI/UIPauseButton.m b/Classes/LinphoneUI/UIPauseButton.m index ed6b962b6..2eea9919d 100644 --- a/Classes/LinphoneUI/UIPauseButton.m +++ b/Classes/LinphoneUI/UIPauseButton.m @@ -21,7 +21,7 @@ #import "LinphoneManager.h" #include "linphonecore.h" -#include "private.h" + @implementation UIPauseButton @@ -62,7 +62,7 @@ + (bool)isInConference: (LinphoneCall*) call { if (!call) return false; - return linphone_call_get_current_params(call)->in_conference; + return linphone_call_is_in_conference(call); } + (int)notInConferenceCallCount: (LinphoneCore*) lc { diff --git a/Classes/Model/ChatModel.h b/Classes/Model/ChatModel.h index f1258ba80..f8607fe9b 100644 --- a/Classes/Model/ChatModel.h +++ b/Classes/Model/ChatModel.h @@ -19,6 +19,7 @@ #import + @interface ChatModel : NSObject { @private NSNumber *chatId; @@ -28,6 +29,7 @@ NSString *message; NSDate *time; NSNumber *read; + NSNumber *state; //0 IDLE, 1 in progress, 2 delivered, 3 not delivered see LinphoneChatMessageState } @property (readonly) NSNumber *chatId; @@ -37,6 +39,7 @@ @property (copy) NSString *message; @property (copy) NSDate *time; @property (copy) NSNumber *read; +@property (copy) NSNumber *state; - (void)create; + (ChatModel*)read:(NSNumber*)id; diff --git a/Classes/Model/ChatModel.m b/Classes/Model/ChatModel.m index a216cdd8d..291149373 100644 --- a/Classes/Model/ChatModel.m +++ b/Classes/Model/ChatModel.m @@ -29,7 +29,7 @@ @synthesize direction; @synthesize time; @synthesize read; - +@synthesize state; #pragma mark - Lifecycle Functions @@ -43,6 +43,7 @@ self.message = [NSString stringWithUTF8String: (const char*) sqlite3_column_text(sqlStatement, 4)]; self.time = [NSDate dateWithTimeIntervalSince1970:sqlite3_column_int(sqlStatement, 5)]; self.read = [NSNumber numberWithInt:sqlite3_column_int(sqlStatement, 6)]; + self.state = [NSNumber numberWithInt:sqlite3_column_int(sqlStatement, 7)]; } return self; } @@ -55,7 +56,7 @@ [direction release]; [time release]; [read release]; - + [state release]; [super dealloc]; } @@ -69,7 +70,7 @@ return; } - const char *sql = "INSERT INTO chat (localContact, remoteContact, direction, message, time, read) VALUES (@LOCALCONTACT, @REMOTECONTACT, @DIRECTION, @MESSAGE, @TIME, @READ)"; + const char *sql = "INSERT INTO chat (localContact, remoteContact, direction, message, time, read, state) VALUES (@LOCALCONTACT, @REMOTECONTACT, @DIRECTION, @MESSAGE, @TIME, @READ, @STATE)"; sqlite3_stmt *sqlStatement; if (sqlite3_prepare_v2(database, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { [LinphoneLogger logc:LinphoneLoggerError format:"Can't prepare the query: %s (%s)", sql, sqlite3_errmsg(database)]; @@ -83,6 +84,7 @@ sqlite3_bind_text(sqlStatement, 4, [message UTF8String], -1, SQLITE_STATIC); sqlite3_bind_double(sqlStatement, 5, [time timeIntervalSince1970]); sqlite3_bind_int(sqlStatement, 6, [read intValue]); + sqlite3_bind_int(sqlStatement, 7, [state intValue]); if (sqlite3_step(sqlStatement) != SQLITE_DONE) { [LinphoneLogger logc:LinphoneLoggerError format:"Error during execution of query: %s (%s)", sql, sqlite3_errmsg(database)]; @@ -134,7 +136,7 @@ return; } - const char *sql = "UPDATE chat SET localContact=@LOCALCONTACT, remoteContact=@REMOTECONTACT, direction=@DIRECTION, message=@MESSAGE, time=@TIME, read=@READ WHERE id=@ID"; + const char *sql = "UPDATE chat SET localContact=@LOCALCONTACT, remoteContact=@REMOTECONTACT, direction=@DIRECTION, message=@MESSAGE, time=@TIME, read=@READ, state=@STATE WHERE id=@ID"; sqlite3_stmt *sqlStatement; if (sqlite3_prepare_v2(database, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { [LinphoneLogger logc:LinphoneLoggerError format:"Can't prepare the query: %s (%s)", sql, sqlite3_errmsg(database)]; @@ -148,7 +150,8 @@ sqlite3_bind_text(sqlStatement, 4, [message UTF8String], -1, SQLITE_STATIC); sqlite3_bind_double(sqlStatement, 5, [time timeIntervalSince1970]); sqlite3_bind_int(sqlStatement, 6, [read intValue]); - sqlite3_bind_int(sqlStatement, 7, [chatId intValue]); + sqlite3_bind_int(sqlStatement, 7, [state intValue]); + sqlite3_bind_int(sqlStatement, 8, [chatId intValue]); if (sqlite3_step(sqlStatement) != SQLITE_DONE) { [LinphoneLogger logc:LinphoneLoggerError format:"Error during execution of query: %s (%s)", sql, sqlite3_errmsg(database)]; @@ -196,7 +199,7 @@ return array; } - const char *sql = "SELECT id, localContact, remoteContact, direction, message, time, read FROM chat GROUP BY remoteContact ORDER BY time DESC"; + const char *sql = "SELECT id, localContact, remoteContact, direction, message, time, read, state FROM chat GROUP BY remoteContact ORDER BY time DESC"; sqlite3_stmt *sqlStatement; if (sqlite3_prepare_v2(database, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { [LinphoneLogger logc:LinphoneLoggerError format:"Can't execute the query: %s (%s)", sql, sqlite3_errmsg(database)]; @@ -228,7 +231,7 @@ return array; } - const char *sql = "SELECT id, localContact, remoteContact, direction, message, time, read FROM chat WHERE remoteContact=@REMOTECONTACT ORDER BY time ASC"; + const char *sql = "SELECT id, localContact, remoteContact, direction, message, time, read, state FROM chat WHERE remoteContact=@REMOTECONTACT ORDER BY time ASC"; sqlite3_stmt *sqlStatement; if (sqlite3_prepare_v2(database, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { [LinphoneLogger logc:LinphoneLoggerError format:"Can't execute the query: %s (%s)", sql, sqlite3_errmsg(database)]; diff --git a/Resources/chat_message_delivered.png b/Resources/chat_message_delivered.png new file mode 100644 index 0000000000000000000000000000000000000000..e788e2b0798f07d9699032f417803c27031ff4d4 GIT binary patch literal 1701 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Y!N$PAxIFeuK9D0>;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uDKjLZB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u z42@09&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMw zS&*t9lv*Mup|Ns9tG}vrp^yfdj z$e)id^$*AMO<3sTu({#Ki*x?H%eL*YZ`@XRMb%~kJBNbX1jnt$PbRmfL_Rk#a+<@t z$T7{x(AeO~jyq{7I&Y_0o>4!Rb@|*xz$yt+|W7Bxe%b&xVN_c*7u7lDuQJ-o1BeH*q*RW{ISW* zQYMFFes~8WVY%b&B3mxmJ<3t!d%A+@D0OjrC>SYc8NM z>jp!@5v%^1rF=>rSpqjo+{+EZzoaXv@`W5dWcS(g%F3&+R?q$E!7iGmwrSEUpEA2A zhO-v5p6@7ciGNc1v&_nFihP59!~KK5uUKfVcMQp3_#~0^_}mXevH5rFb^r5zGkK`6 TO5Y|JRB?E^`njxgN@xNA@EMY3 literal 0 HcmV?d00001 diff --git a/Resources/chat_message_inprogress.png b/Resources/chat_message_inprogress.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fe9da56d4495847cb9fa90cf4674c411e0d388 GIT binary patch literal 684 zcmV;d0#p5oP)|WE1x-V1Nj~7#IP^ zz*(<9^fpe~4?lmryr1Pa->c?by!D<)3!or!32gNG!;9u#o5S~$?Ol=V7j9j%Ddxr1 zwkc*)+zQ+)+^a6`fB&4n-knqQ`P0*9YiqZ^X4wri*(iy~~R=D0g%Qp^%uB3RWme1- zx|gX(ZVBoYxX~)@SgXnp%F-~Kq{3NUKrb;XX2gj+k-2-lXPF*EbB?OYYsu6Z1*8$} zQs)tAh9Z*cAsSK1K;%ewUX07C^7W!H%u3vgl$lLxdsR}|QkE>v`mx^Y4@(8u+8Lh~ zh3!oy6-7~DR?d+&WXX!p`lS;0`gh-)Ui)W3GEh}iJ7dv&6tr_3!t&Xp$M5F;NB;mlIboM= SQyD7&0000;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uDKjLZB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!W+OlMT!a6wD0u z42@09&CPWbj0_A7^bL&k4UKdS&8>`$tPBhkpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMw zS&*t9lvT3&BOEG(d2Tf!ehn>g_2qa446+ba3~y$=HcmaxYh8KkNL2@+=N@z4uAR@ z4{|6pI0WhBOG?x=Ke23>A>0w^FzX$Yp|-$h#*I7z%q#*DjG^HSZ>@REzA|0-As_HG zAveF_NWMZE^P~L=jq4pAafgVdh)uQ+kiM|ZYrz9SYXxbA28o4o9{-LWFnBJ{d}ObW z!xj<*e-_)y(Kp&-5riVD;CADn_OPS2lAVCPM*}6M}O;w6m|T(NL1Tz;ZNzTfWL+5&t3= zD}~(~1liT+KAHSI=lm_D8%-NbW;_Ui_j06dLWm{u7&d_r*5jIxF5kE^50jm{+zKSEyYS+BruvuCKo|YGL(JOi%1E!GMvJ9;A5`&k^RW)5F;D%Zt=!EC{@ zcODZ1#Z)uD9WU6%`rsmSN_*t0u(V5If8QT<>63bNFn;B`$=UL$EUcdnFP-<%$4v3% zw`Dq9OXg@a{Isw=?%W}>IyGJGVYlH{e(tg*jR}gP`xE}YKQ~v-XO4!+mh-PH|0@*V zVA9@L^v-5dJ-bP0l+XkK Dz#0)Q literal 0 HcmV?d00001 diff --git a/Resources/database.sqlite b/Resources/database.sqlite deleted file mode 100644 index 1469b4df151ed14246ec8fa70f44a3b256555fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHGy-ve05O(5-45(w(^%kU74HGK^A+k_JlD5H>$bgVZ4~Uc>H8B$tyh`7UC&8%{ zR3dfjP>@eL`_5;dzxz&iw+J$c@Lbh}kZ?gPVi@EKfDmFUrAj+#eXDcSZtU3mOq-m4 zoek&%G0jUtPt~I3-!SkIP