Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- root@raspberrypi:~# sudo valgrind --tool=memcheck --leak-check=full --track-origins=yes --trace-children=yes pilight-daemon -D
- ==2776== Memcheck, a memory error detector
- ==2776== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
- ==2776== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
- ==2776== Command: pilight-daemon -D
- ==2776==
- ==2779== Memcheck, a memory error detector
- ==2779== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
- ==2779== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
- ==2779== Command: /usr/local/bin/gpio edge 18 both
- ==2779==
- ==2779==
- ==2779== HEAP SUMMARY:
- ==2779== in use at exit: 0 bytes in 0 blocks
- ==2779== total heap usage: 3 allocs, 3 frees, 1,080 bytes allocated
- ==2779==
- ==2779== All heap blocks were freed -- no leaks are possible
- ==2779==
- ==2779== For counts of detected and suppressed errors, rerun with: -v
- ==2779== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 6)
- [Nov 09 20:49:26:283285] pilight-daemon: DEBUG: -- start parsed config file --
- {
- "vloerverwarming": {
- "name": "Vloerverwarming",
- "temperature": {
- "name": "Temperature",
- "protocol": [ "ds18b20" ],
- "id": [{
- "id": "0000056d5665"
- }],
- "temperature": 1550
- }
- }
- }
- [Nov 09 20:49:26:464843] pilight-daemon: DEBUG: -- end parsed config file --
- [Nov 09 20:49:26:501611] pilight-daemon: INFO: daemon listening to port: 5000
- [Nov 09 20:49:27:956409] pilight-daemon: DEBUG: new thread, 1 thread running
- [Nov 09 20:49:28:774076] pilight-daemon: INFO: webserver listening to port: 5001
- [Nov 09 20:49:28:809870] pilight-daemon: DEBUG: new thread, 2 threads running
- [Nov 09 20:49:29:554264] pilight-daemon: DEBUG: new thread, 3 threads running
- ==2776== Thread 6:
- ==2776== Invalid read of size 4
- ==2776== at 0x485DC50: json_find_member (json.c:469)
- ==2776== by 0x4860377: config_update (config.c:47)
- ==2776== by 0xC357: broadcast (daemon.c:195)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11868 is 16 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485DC60: json_find_member (json.c:482)
- ==2776== by 0x4860377: config_update (config.c:47)
- ==2776== by 0xC357: broadcast (daemon.c:195)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11870 is 24 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485C910: emit_value (json.c:976)
- ==2776== by 0x485D44F: json_stringify (json.c:402)
- ==2776== by 0xC38F: broadcast (daemon.c:216)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11868 is 16 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485C9C4: emit_value (json.c:481)
- ==2776== by 0x485D44F: json_stringify (json.c:402)
- ==2776== by 0xC38F: broadcast (daemon.c:216)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11868 is 16 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485CB0C: emit_value (json.c:482)
- ==2776== by 0x485D44F: json_stringify (json.c:402)
- ==2776== by 0xC38F: broadcast (daemon.c:216)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11870 is 24 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- [Nov 09 20:49:30:132682] pilight-daemon: DEBUG: broadcasted: {}
- ==2776== Invalid read of size 4
- ==2776== at 0x485D468: json_delete (json.c:603)
- ==2776== by 0xC3FF: broadcast (daemon.c:230)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11858 is 0 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485D4B4: json_delete (json.c:412)
- ==2776== by 0xC3FF: broadcast (daemon.c:230)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11868 is 16 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid read of size 4
- ==2776== at 0x485D4DC: json_delete (json.c:420)
- ==2776== by 0xC3FF: broadcast (daemon.c:230)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11870 is 24 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== Invalid free() / delete / delete[] / realloc()
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0xC3FF: broadcast (daemon.c:230)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x4a11858 is 0 bytes inside a block of size 32 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x48675BB: ds18b20Parse (ds18b20.c:133)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- [Nov 09 20:49:30:191968] pilight-daemon: DEBUG: new thread, 4 threads running
- [Nov 09 20:49:30:625118] pilight-daemon: DEBUG: new thread, 5 threads running
- [Nov 09 20:49:31:206499] pilight-daemon: DEBUG: new thread, 6 threads running
- [ Nov 09 20:49:32:83446] pilight-daemon: DEBUG: socket write succeeded: {"message":"client gui"}
- [Nov 09 20:49:32:102931] pilight-daemon: DEBUG: new thread, 7 threads running
- [Nov 09 20:49:32:168828] pilight-daemon: INFO: new client, ip: 127.0.0.1, port: 46107
- [Nov 09 20:49:32:176920] pilight-daemon: DEBUG: client fd: 8
- [Nov 09 20:49:32:187636] pilight-daemon: DEBUG: client id: 0
- [Nov 09 20:49:32:240073] pilight-daemon: DEBUG: socket recv: {"message":"client gui"}
- [Nov 09 20:49:32:359380] pilight-daemon: DEBUG: socket write succeeded: {"message":"accept client"}
- [Nov 09 20:49:32:383855] pilight-daemon: INFO: client recognized as gui
- [Nov 09 20:49:35:449425] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:49:41:250661] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:49:47:100559] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:49:52:950345] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:49:58:800735] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:04:650432] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:08:245149] pilight-daemon: NOTICE: caching /usr/local/share/pilight/index.html
- [Nov 09 20:50:10:490740] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:16:340408] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:22:190594] pilight-daemon: DEBUG: broadcasted: {}
- [ Nov 09 20:50:28:40558] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:33:890547] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:39:740264] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:45:590561] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:51:440608] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:50:57:290380] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:03:140366] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:08:990498] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:14:840506] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:20:691181] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:26:540397] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:32:390553] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:38:240387] pilight-daemon: DEBUG: broadcasted: {}
- [ Nov 09 20:51:44:90237] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:49:940581] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:51:55:790482] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:52:01:640371] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:52:07:490623] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:52:13:340274] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:52:19:190362] pilight-daemon: DEBUG: broadcasted: {}
- [ Nov 09 20:52:25:40757] pilight-daemon: DEBUG: broadcasted: {}
- [Nov 09 20:52:30:890452] pilight-daemon: DEBUG: broadcasted: {}
- ^C[ Nov 09 20:52:36:31670] pilight-daemon: DEBUG: removed stale pid_file /var/run/pilight-daemon.pid
- [ Nov 09 20:52:36:52539] pilight-daemon: INFO: client disconnected, ip 127.0.0.1, port 5000
- [ Nov 09 20:52:36:85722] pilight-daemon: DEBUG: garbage collected fcache library
- [ Nov 09 20:52:36:94502] pilight-daemon: DEBUG: garbage collected webserver library
- ==2776== Thread 3:
- ==2776== Invalid read of size 1
- ==2776== at 0x483646C: strlen (mc_replace_strmem.c:390)
- ==2776== by 0x485DD1B: json_mkstring (json.c:40)
- ==2776== by 0x4867503: ds18b20Parse (ds18b20.c:125)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09e8 is 0 bytes inside a block of size 13 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x486725F: ds18b20GC (ds18b20.c:158)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x4836484: strlen (mc_replace_strmem.c:390)
- ==2776== by 0x485DD1B: json_mkstring (json.c:40)
- ==2776== by 0x4867503: ds18b20Parse (ds18b20.c:125)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09e9 is 1 bytes inside a block of size 13 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x486725F: ds18b20GC (ds18b20.c:158)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x4836490: strlen (mc_replace_strmem.c:390)
- ==2776== by 0x485DD1B: json_mkstring (json.c:40)
- ==2776== by 0x4867503: ds18b20Parse (ds18b20.c:125)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09eb is 3 bytes inside a block of size 13 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x486725F: ds18b20GC (ds18b20.c:158)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x48364E8: strcpy (mc_replace_strmem.c:429)
- ==2776== by 0x485DD33: json_mkstring (json.c:43)
- ==2776== by 0x4867503: ds18b20Parse (ds18b20.c:125)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09e8 is 0 bytes inside a block of size 13 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x486725F: ds18b20GC (ds18b20.c:158)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x483650C: strcpy (mc_replace_strmem.c:429)
- ==2776== by 0x485DD33: json_mkstring (json.c:43)
- ==2776== by 0x4867503: ds18b20Parse (ds18b20.c:125)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09e9 is 1 bytes inside a block of size 13 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x486725F: ds18b20GC (ds18b20.c:158)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid write of size 1
- ==2776== at 0x4836750: strncpy (mc_replace_strmem.c:463)
- ==2776== by 0x48672EB: ds18b20Parse (ds18b20.c:62)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09b0 is 0 bytes inside a block of size 3 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x4867257: ds18b20GC (ds18b20.c:157)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x48D349C: ____strtol_l_internal (strtol_l.c:298)
- ==2776== by 0x48D3303: strtol (strtol.c:110)
- ==2776== by 0x48672FB: ds18b20Parse (stdlib.h:286)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09b0 is 0 bytes inside a block of size 3 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x4867257: ds18b20GC (ds18b20.c:157)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- ==2776== Invalid read of size 1
- ==2776== at 0x48D3508: ____strtol_l_internal (strtol_l.c:314)
- ==2776== by 0x48D3303: strtol (strtol.c:110)
- ==2776== by 0x48672FB: ds18b20Parse (stdlib.h:286)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776== Address 0x49f09b0 is 0 bytes inside a block of size 3 free'd
- ==2776== at 0x48348B8: free (vg_replace_malloc.c:427)
- ==2776== by 0x4867257: ds18b20GC (ds18b20.c:157)
- ==2776== by 0x485B3FB: gc_run (gc.c:61)
- ==2776== by 0x485B4FF: gc_catch (gc.c:99)
- ==2776== by 0xB753: main (daemon.c:1420)
- ==2776==
- [Nov 09 20:52:37:162193] pilight-daemon: INFO: client disconnected, ip 127.0.0.1, port 46107
- [Nov 09 20:52:38:402862] pilight-daemon: DEBUG: garbage collected threads library
- [Nov 09 20:52:38:444598] pilight-daemon: DEBUG: garbage collected config library
- [Nov 09 20:52:38:461147] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:487652] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:495647] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:503437] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:511285] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:522797] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:530140] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:537944] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:545947] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:554013] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:562005] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:570378] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:578656] pilight-daemon: DEBUG: freed options struct
- [Nov 09 20:52:38:592570] pilight-daemon: DEBUG: garbage collected protocol library
- [Nov 09 20:52:38:610122] pilight-daemon: DEBUG: garbage collected hardware library
- [Nov 09 20:52:38:631089] pilight-daemon: DEBUG: garbage collected settings library
- [Nov 09 20:52:38:647204] pilight-daemon: DEBUG: garbage collected options library
- [Nov 09 20:52:38:755921] pilight-daemon: DEBUG: garbage collected socket library
- ==2776==
- ==2776== HEAP SUMMARY:
- ==2776== in use at exit: 1,352 bytes in 3 blocks
- ==2776== total heap usage: 2,724 allocs, 2,753 frees, 5,858,134 bytes allocated
- ==2776==
- ==2776== Thread 1:
- ==2776== 1,328 bytes in 1 blocks are definitely lost in loss record 3 of 3
- ==2776== at 0x4835978: malloc (vg_replace_malloc.c:263)
- ==2776== by 0x486DEA7: lws_allocate_header_table (parsers.c:312)
- ==2776== by 0x486FA63: lws_server_socket_service (server.c:106)
- ==2776== by 0x486C5B3: libwebsocket_service_fd (libwebsockets.c:971)
- ==2776== by 0x486C79B: libwebsocket_service (libwebsockets.c:1306)
- ==2776== by 0x485EFBB: webserver_start (webserver.c:382)
- ==2776== by 0x4887BFB: start_thread (pthread_create.c:306)
- ==2776== by 0x496A757: ??? (clone.S:116)
- ==2776==
- ==2776== LEAK SUMMARY:
- ==2776== definitely lost: 1,328 bytes in 1 blocks
- ==2776== indirectly lost: 0 bytes in 0 blocks
- ==2776== possibly lost: 0 bytes in 0 blocks
- ==2776== still reachable: 24 bytes in 2 blocks
- ==2776== suppressed: 0 bytes in 0 blocks
- ==2776== Reachable blocks (those to which a pointer was found) are not shown.
- ==2776== To see them, rerun with: --leak-check=full --show-reachable=yes
- ==2776==
- ==2776== For counts of detected and suppressed errors, rerun with: -v
- ==2776== ERROR SUMMARY: 319 errors from 18 contexts (suppressed: 20 from 9)
Advertisement
Add Comment
Please, Sign In to add comment