After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 356052 - slideshow segfaults
slideshow segfaults
Status: RESOLVED FIXED
Product: gnome-screensaver
Classification: Deprecated
Component: daemon
2.14.x
Other All
: Normal critical
: ---
Assigned To: gnome-screensaver maintainers
gnome-screensaver maintainers
Depends on:
Blocks:
 
 
Reported: 2006-09-15 03:17 UTC by Lane
Modified: 2007-05-03 20:58 UTC
See Also:
GNOME target: ---
GNOME version: 2.13/2.14



Description Lane 2006-09-15 03:17:35 UTC
Steps to reproduce:
1. Run slideshow
2. 
3. 


Stack trace:
Sep 14 23:07:16 kernel: slideshow[11407]: segfault at 00007fff00000018 rip 0000003dcfe217ae rsp 00007fff857e48e0 error 4

Other information:
I am running FC5 with the latest updates.  Slideshow used to work fine until a recent update.  This is x86_64 machine.  nvidia graphics card using nvidia's driver
Comment 1 William Jon McCann 2006-09-15 16:38:44 UTC
I'm not seeing this here.  Does it crash when you just run it from the command line:
/usr/libexec/gnome-screensaver/slideshow

If it does can you run it under gdb:
gdb /usr/libexec/gnome-screensaver/slideshow

and then do "bt" and post the output.

You may need to use a --location= argument depending on which slideshow theme you are using...

Thanks.
Comment 2 Lane 2006-09-15 18:03:44 UTC
It does not crash from the command line, although it is not in full screen mode.
Comment 3 William Jon McCann 2006-09-15 18:07:36 UTC
Can you run gnome-screensaver-preferences from the command line and see if it crashes there?

Or kill the running g-s process and run:
gnome-screensaver --no-daemon --debug

And post the output here.  We might be able to see some of the output from the subprocess in it.

Thanks.
Comment 4 Lane 2006-09-15 18:18:00 UTC
[check_for_clock_skew] gs-watcher-x11.c:1327 (14:15:23):         checking wall clock for hibernation, changed: 0:00:00
[watcher_idle_cb] gs-monitor.c:110 (14:15:23):   Idle signal detected: 1
[gs_listener_set_session_idle] gs-listener-dbus.c:362 (14:15:23):        Setting session idle: 1
[listener_check_activation] gs-listener-dbus.c:260 (14:15:23):   Checking for activation
[listener_check_activation] gs-listener-dbus.c:275 (14:15:23):   Trying to activate
[gs_grab_get_keyboard] gs-grab-x11.c:166 (14:15:23):     Grabbing keyboard widget=135
[gs_grab_get_mouse] gs-grab-x11.c:192 (14:15:23):        Grabbing mouse widget=135[gs_manager_activate] gs-manager.c:1323 (14:15:23):      fading out
[fade_done_cb] gs-manager.c:1279 (14:15:23):     fade completed, showing windows
[window_map_cb] gs-manager.c:1039 (14:15:23):    Handling window map event
[gs_window_clear] gs-window-x11.c:254 (14:15:23):        Clearing window
[clear_all_children] gs-window-x11.c:229 (14:15:23):     Clearing all child windows
[window_show_cb] gs-manager.c:1091 (14:15:23):   Handling window show
[gs_watcher_set_active] gs-watcher-x11.c:774 (14:15:23):         turning watcher: OFF
[_gs_watcher_set_active_internal] gs-watcher-x11.c:757 (14:15:23):       Stopping idle watcher
[gs_listener_send_signal_active_changed] gs-listener-dbus.c:162 (14:15:23):      Sending the ActiveChanged(TRUE) signal on the session bus
[_gs_watcher_set_session_idle] gs-watcher-x11.c:550 (14:15:23):  Changing idle state: 1
[watcher_idle_notice_cb] gs-monitor.c:126 (14:15:23):    Idle notice signal detected: 0
[watcher_idle_notice_cb] gs-monitor.c:148 (14:15:23):    manager active, skipping fade cancellation
[_gs_watcher_set_session_idle_notice] gs-watcher-x11.c:527 (14:15:23):   Changing idle notice state: 0
[gs_window_xevent] gs-window-x11.c:460 (14:15:23):       not raising our windows
[window_map_event_cb] gs-manager.c:1026 (14:15:23):      Handling window map_event event
[gs_grab_move_keyboard] gs-grab-x11.c:328 (14:15:23):    Moving keyboard grab from 135 to 2E00006
[gs_grab_move_keyboard] gs-grab-x11.c:335 (14:15:23):    *** doing X server grab
[gs_grab_release_keyboard] gs-grab-x11.c:218 (14:15:23):         Ungrabbing keyboard
[gs_grab_get_keyboard] gs-grab-x11.c:166 (14:15:23):     Grabbing keyboard widget=2E00006
[gs_grab_move_keyboard] gs-grab-x11.c:357 (14:15:23):    *** releasing X server grab
[gs_grab_move_mouse] gs-grab-x11.c:274 (14:15:23):       Moving pointer grab from 135 to 2E00006
[gs_grab_move_mouse] gs-grab-x11.c:281 (14:15:23):       *** doing X server grab
[gs_grab_release_mouse] gs-grab-x11.c:236 (14:15:23):    Ungrabbing pointer
[gs_grab_get_mouse] gs-grab-x11.c:192 (14:15:23):        Grabbing mouse widget=2E00006
[gs_grab_move_mouse] gs-grab-x11.c:304 (14:15:23):       *** releasing X server grab
[manager_maybe_start_job_for_window] gs-manager.c:190 (14:15:23):        Starting job for window
[gs_job_start] gs-job.c:758 (14:15:23):  starting job
[nice_process] gs-job.c:555 (14:15:23):  Setting child process priority to: 10
[gs_window_xevent] gs-window-x11.c:460 (14:15:23):       not raising our windows
[window_map_event_cb] gs-manager.c:1026 (14:15:23):      Handling window map_event event
[gs_grab_move_keyboard] gs-grab-x11.c:321 (14:15:23):    Window 2E00006 is already grabbed, skipping
[gs_grab_move_mouse] gs-grab-x11.c:262 (14:15:23):       Window 2E00006 is already grabbed, skipping
[manager_maybe_start_job_for_window] gs-manager.c:196 (14:15:23):        Not starting job because job is running
[unfade_idle] gs-manager.c:998 (14:15:23):       resetting fade
[gs_fade_reset] gs-fade.c:640 (14:15:23):        Resetting fade
[gs_window_xevent] gs-window-x11.c:472 (14:15:23):       not raising our windows
[gs_window_xevent] gs-window-x11.c:472 (14:15:23):       not raising our windows
[gs_job_died] gs-job.c:434 (14:15:23):   Waiting on process 21391
[gs_job_died] gs-job.c:448 (14:15:23):   Job died
[find_window_at_pointer] gs-manager.c:949 (14:15:34):    Requesting unlock for screen 0
[gs_window_request_unlock] gs-window-x11.c:1019 (14:15:34):      Requesting unlock[gs_grab_release_keyboard_and_mouse] gs-grab-x11.c:384 (14:15:34):       Releasing all grabs
[gs_grab_release_mouse] gs-grab-x11.c:236 (14:15:34):    Ungrabbing pointer
[gs_grab_release_keyboard] gs-grab-x11.c:218 (14:15:34):         Ungrabbing keyboard
[gs_job_stop] gs-job.c:814 (14:15:34):   stopping job
[window_unmap_cb] gs-manager.c:1046 (14:15:34):  window unmapped!
[gs_window_dialog_finish] gs-window-x11.c:815 (14:15:34):        Dialog finished
[gs_watcher_set_active] gs-watcher-x11.c:774 (14:15:34):         turning watcher: ON
Comment 5 Lane 2006-09-15 18:20:37 UTC
gnome-screensaver-preferences also produces the same output in my /var/log/messages:

Sep 15 14:15:23 greylock kernel: slideshow[21391]: segfault at 00007fff00000018 rip 0000003dcfe217ae rsp 00007fff9dbd3ce0 error 4
Sep 15 14:18:59 greylock kernel: slideshow[21442]: segfault at 00007fff00000018 rip 0000003dcfe217ae rsp 00007fff8a7d11f0 error 4

and leaves the demo screen all black.

Comment 6 William Jon McCann 2006-09-15 18:44:32 UTC
Ok, then I think the best way to get at a stack trace is to enable core dumps and then run the preferences.

Here's some info on how to enable core dumps:
http://kbase.redhat.com/faq/FAQ_52_2890.shtm

If you have another distro the info may be a bit different.

Then run gnome-screensaver-preferences.  With any luck you then get a core file or two probably in the current directory or your home directory.

Then extract the stack trace from the core file:
http://fedoraproject.org/wiki/StackTraces#core

Thanks.
Comment 7 Lane 2006-09-17 11:21:44 UTC
Here is a stack trace from core dump.


(gdb) thread apply all bt full

Thread 1 (process 2873)

  • #0 gdk_gc_set_clip_rectangle
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #1 gtk_style_attach
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #2 gtk_window_new
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #3 gtk_window_new
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #4 gtk_marshal_BOOLEAN__VOID
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #5 g_closure_invoke
    from /usr/lib64/libgobject-2.0.so.0
  • #6 g_signal_override_class_closure
    from /usr/lib64/libgobject-2.0.so.0
  • #7 g_signal_emit_valist
    from /usr/lib64/libgobject-2.0.so.0
  • #8 g_signal_emit
    from /usr/lib64/libgobject-2.0.so.0
  • #9 gtk_widget_get_default_style
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #10 gtk_main_do_event
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #11 gdk_window_is_viewable
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #12 gdk_window_process_all_updates
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #13 gtk_container_check_resize
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #14 g_main_context_dispatch
    from /usr/lib64/libglib-2.0.so.0
  • #15 g_main_context_check
    from /usr/lib64/libglib-2.0.so.0
  • #16 g_main_loop_run
    from /usr/lib64/libglib-2.0.so.0
  • #17 gtk_main
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #18 ??
  • #19 __libc_start_main
    from /lib64/libc.so.6
  • #20 ??
  • #21 ??
  • #22 ??

Comment 8 William Jon McCann 2006-10-02 18:16:37 UTC
Could you please try installing debuginfo packages and attaching the stacetrace with them installed?

http://live.gnome.org/GettingTraces#head-62fed2004a51381957ab279a3e38f685a11ea0a8
Comment 9 William Jon McCann 2006-10-02 18:17:21 UTC
... for gtk+, gdk, gnome-screensaver

Thanks.
Comment 10 Lane 2006-10-02 19:15:20 UTC
I install debug info for gtk+ and gnome-screensaver.  I am not sure what gdk is.  Attached is the result:

Thread 1 (process 2904)

  • #0 gdk_gc_set_clip_rectangle
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #1 gtk_style_attach
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #2 gtk_window_new
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #3 gtk_window_new
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #4 gtk_marshal_BOOLEAN__VOID
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #5 g_closure_invoke
    from /usr/lib64/libgobject-2.0.so.0
  • #6 g_signal_override_class_closure
    from /usr/lib64/libgobject-2.0.so.0
  • #7 g_signal_emit_valist
    from /usr/lib64/libgobject-2.0.so.0
  • #8 g_signal_emit
    from /usr/lib64/libgobject-2.0.so.0
  • #9 gtk_widget_get_default_style
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #10 gtk_main_do_event
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #11 gdk_window_is_viewable
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #12 gdk_window_process_all_updates
    from /usr/lib64/libgdk-x11-2.0.so.0
  • #13 gtk_container_check_resize
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #14 g_main_context_dispatch
    from /usr/lib64/libglib-2.0.so.0
  • #15 g_main_context_check
    from /usr/lib64/libglib-2.0.so.0
  • #16 g_main_loop_run
    from /usr/lib64/libglib-2.0.so.0
  • #17 gtk_main
    from /usr/lib64/libgtk-x11-2.0.so.0
  • #18 main
    at slideshow.c line 93

Comment 11 William Jon McCann 2006-10-02 19:20:29 UTC
It doesn't look like you have the GTK+ debuginfo.  I think in FC5 the debuginfo package for GTK+ is called "gtk2-debuginfo".  Could you install that too and try again?  Thanks, sorry about that.
Comment 12 Lane 2006-10-02 19:33:13 UTC
I installed gtk2-debuginfo, and hopefully this is what you are looking for:

Thread 2 (process 2905)

  • #0 clone
    from /lib64/libc.so.6
  • #1 __make_stacks_executable
    from /lib64/libpthread.so.0
  • #2 ??
  • #3 ??

Thread 1 (process 2904)

  • #0 IA__gdk_gc_set_clip_rectangle
    at gdkgc.c line 575

Comment 13 William Jon McCann 2006-10-02 19:36:01 UTC
Yes that looks better.  Could you attach the entire backtrace?
Comment 14 Lane 2006-10-02 19:38:10 UTC
How do I get the entire backtrace?  I ran the command:

thread apply all bt full

I posted everything that came out.
Comment 15 Lane 2006-10-02 19:39:13 UTC
I removed the "full" and here is what I get.  Is this what you are looking for?

(gdb) thread apply all bt

Thread 1 (process 2904)

  • #0 IA__gdk_gc_set_clip_rectangle
    at gdkgc.c line 575
  • #1 gtk_default_draw_flat_box
    at gtkstyle.c line 3578
  • #2 gtk_window_paint
    at gtkwindow.c line 5894
  • #3 gtk_window_expose
    at gtkwindow.c line 5903
  • #4 _gtk_marshal_BOOLEAN__BOXED
    at gtkmarshalers.c line 83
  • #5 g_closure_invoke
    from /usr/lib64/libgobject-2.0.so.0
  • #6 g_signal_override_class_closure
    from /usr/lib64/libgobject-2.0.so.0
  • #7 g_signal_emit_valist
    from /usr/lib64/libgobject-2.0.so.0
  • #8 g_signal_emit
    from /usr/lib64/libgobject-2.0.so.0
  • #9 gtk_widget_event_internal
    at gtkwidget.c line 3751
  • #10 IA__gtk_main_do_event
    at gtkmain.c line 1382
  • #11 gdk_window_process_updates_internal
    at gdkwindow.c line 2292
  • #12 IA__gdk_window_process_all_updates
    at gdkwindow.c line 2345
  • #13 gtk_container_idle_sizer
    at gtkcontainer.c line 1117
  • #14 g_main_context_dispatch
    from /usr/lib64/libglib-2.0.so.0
  • #15 g_main_context_check
    from /usr/lib64/libglib-2.0.so.0
  • #16 g_main_loop_run
    from /usr/lib64/libglib-2.0.so.0
  • #17 IA__gtk_main
    at gtkmain.c line 1003
  • #18 main
    at slideshow.c line 93
  • #19 __libc_start_main
    from /lib64/libc.so.6
  • #20 _start
  • #21 ??
  • #22 ??

Comment 16 William Jon McCann 2006-10-02 19:44:58 UTC
Yup.  That's better.  Thank you.
Comment 17 Lane 2006-10-20 02:20:14 UTC
I downloaded source code for version 2.17.1 and slideshow no longer segfaults.
Comment 18 William Jon McCann 2006-11-06 04:44:01 UTC
OK, good.  I'll close this bug then.  Please reopen if you see it again.  Thanks.
Comment 19 Derick Rethans 2007-05-03 20:47:11 UTC
Actually William, I found this bug after digging a bit more, and it seems exactly the same. I am using gnome-screensaver 2.18.1 from Debian unstable (amd64 distribution). I managed to make a back trace:


backtrace:

Thread 1 (process 7367)

  • #0 IA__gdk_gc_set_clip_rectangle
    at /build/buildd/gtk+2.0-2.10.11/gdk/gdkgc.c line 575
  • #1 gtk_default_draw_flat_box
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkstyle.c line 3590
  • #2 ??
    from /usr/lib/gtk-2.0/2.10.0/engines/libglide.so
  • #3 gtk_window_paint
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkwindow.c line 6060
  • #4 gtk_window_expose
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkwindow.c line 6069
  • #5 _gtk_marshal_BOOLEAN__BOXED
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkmarshalers.c line 84
  • #6 g_closure_invoke
    from /usr/lib/libgobject-2.0.so.0
  • #7 ??
    from /usr/lib/libgobject-2.0.so.0
  • #8 g_signal_emit_valist
    from /usr/lib/libgobject-2.0.so.0
  • #9 g_signal_emit
    from /usr/lib/libgobject-2.0.so.0
  • #10 gtk_widget_event_internal
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkwidget.c line 3915
  • #11 IA__gtk_main_do_event
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkmain.c line 1533
  • #12 gdk_window_process_updates_internal
    at /build/buildd/gtk+2.0-2.10.11/gdk/gdkwindow.c line 2338
  • #13 IA__gdk_window_process_all_updates
    at /build/buildd/gtk+2.0-2.10.11/gdk/gdkwindow.c line 2401
  • #14 gtk_container_idle_sizer
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkcontainer.c line 1113
  • #15 g_main_context_dispatch
    from /usr/lib/libglib-2.0.so.0
  • #16 ??
    from /usr/lib/libglib-2.0.so.0
  • #17 g_main_loop_run
    from /usr/lib/libglib-2.0.so.0
  • #18 IA__gtk_main
    at /build/buildd/gtk+2.0-2.10.11/gtk/gtkmain.c line 1154
  • #19 ??
  • #20 __libc_start_main
    from /lib/libc.so.6
  • #21 ??
  • #22 ??
  • #23 ??


And this is the debug info from gnome-screensaver --no-daemon --debug >/tmp/trace 2>&1 (hopefully the relevant parts):

[gs_manager_create_window] gs-manager.c:1343 (22:34:15):     Creating 1 windows for screen 0
[gs_manager_activate] gs-manager.c:1462 (22:34:15):  fading out
[fade_done_cb] gs-manager.c:1423 (22:34:16):     fade completed, showing windows
[get_best_visual_for_screen] gs-window-x11.c:471 (22:34:16):     Found best GL visual for screen 0: 0x23
[window_map_cb] gs-manager.c:1182 (22:34:16):    Handling window map event
[gs_window_clear] gs-window-x11.c:274 (22:34:16):    Clearing window
[clear_all_children] gs-window-x11.c:249 (22:34:16):     Clearing all child windows
[window_show_cb] gs-manager.c:1231 (22:34:16):   Handling window show
[gs_job_set_command] gs-job.c:193 (22:34:16):    Setting command for job: 'slideshow --location=/usr/share/pixmaps/backgrounds/cosmos'
[gs_watcher_set_active] gs-watcher-x11.c:730 (22:34:16):     turning watcher: OFF
[_gs_watcher_set_active_internal] gs-watcher-x11.c:713 (22:34:16):   Stopping idle watcher
[gs_listener_send_signal_active_changed] gs-listener-dbus.c:258 (22:34:16):  Sending the ActiveChanged(TRUE) signal on the session bus
[gs_manager_set_lock_active] gs-manager.c:406 (22:34:16):    Setting lock active: 1
[listener_service_deleted] gs-listener-dbus.c:1003 (22:34:16):   DBUS service deleted: :1.29
[gs_window_xevent] gs-window-x11.c:650 (22:34:16):   not raising our windows
[window_map_event_cb] gs-manager.c:1169 (22:34:16):  Handling window map_event event
[manager_maybe_grab_window] gs-manager.c:1123 (22:34:16):    Moving grab to 0x68a070
[xorg_lock_smasher_set_active] gs-grab-x11.c:126 (22:34:16):     Disabling the x.org grab smasher
[xorg_lock_smasher_set_active] gs-grab-x11.c:146 (22:34:16):     XF86MiscSetGrabKeysState(off) returned MiscExtGrabStateSuccess

[gs_grab_move_keyboard] gs-grab-x11.c:333 (22:34:16):    Moving keyboard grab from 3E to 2E00020
[gs_grab_move_keyboard] gs-grab-x11.c:340 (22:34:16):    *** doing X server grab
[gs_grab_release_keyboard] gs-grab-x11.c:221 (22:34:16):     Ungrabbing keyboard
[gs_grab_get_keyboard] gs-grab-x11.c:166 (22:34:16):     Grabbing keyboard widget=2E00020
[gs_grab_move_keyboard] gs-grab-x11.c:362 (22:34:16):    *** releasing X server grab
[gs_grab_move_mouse] gs-grab-x11.c:278 (22:34:16):   Moving pointer grab from 3E to 2E00020
[gs_grab_move_mouse] gs-grab-x11.c:285 (22:34:16):   *** doing X server grab
[gs_grab_release_mouse] gs-grab-x11.c:239 (22:34:16):    Ungrabbing pointer
[gs_grab_get_mouse] gs-grab-x11.c:195 (22:34:16):    Grabbing mouse widget=2E00020
[gs_grab_move_mouse] gs-grab-x11.c:308 (22:34:16):   *** releasing X server grab
[manager_maybe_start_job_for_window] gs-manager.c:198 (22:34:16):    Starting job for window
[gs_job_start] gs-job.c:431 (22:34:16):  starting job
[nice_process] gs-job.c:234 (22:34:16):  Setting child process priority to: 10
[gs_window_xevent] gs-window-x11.c:650 (22:34:16):   not raising our windows
[window_map_event_cb] gs-manager.c:1169 (22:34:16):  Handling window map_event event
[manager_maybe_grab_window] gs-manager.c:1123 (22:34:16):    Moving grab to 0x68a070
[xorg_lock_smasher_set_active] gs-grab-x11.c:126 (22:34:16):     Disabling the x.org grab smasher
[xorg_lock_smasher_set_active] gs-grab-x11.c:146 (22:34:16):     XF86MiscSetGrabKeysState(off) returned MiscExtGrabStateAlready

[gs_grab_move_keyboard] gs-grab-x11.c:326 (22:34:16):    Window 2E00020 is already grabbed, skipping
[gs_grab_move_mouse] gs-grab-x11.c:266 (22:34:16):   Window 2E00020 is already grabbed, skipping
[manager_maybe_start_job_for_window] gs-manager.c:204 (22:34:16):    Not starting job because job is running
[unfade_idle] gs-manager.c:1150 (22:34:16):  resetting fade
[gs_fade_reset] gs-fade.c:634 (22:34:16):    Resetting fade
[gs_window_xevent] gs-window-x11.c:662 (22:34:16):   not raising our windows
[gs_window_xevent] gs-window-x11.c:662 (22:34:16):   not raising our windows
[gs_job_died] gs-job.c:128 (22:34:16):   Waiting on process 7102
[gs_job_died] gs-job.c:142 (22:34:16):   Job died

Please let me know if you need more information, or anything else that I could help with.
Comment 20 William Jon McCann 2007-05-03 20:53:40 UTC
If you change your desktop theme to something else (say Clearlooks) does this still occur?
Comment 21 Derick Rethans 2007-05-03 20:58:51 UTC
Nope, that fixes it. It only crashes with Glider and Industrial here.