Help with a wireless scanner

Hi there.

I have a All in One printer, HP OfficeJet 6950

It was working like a charm when I switched to Nixos with version 22.10. Printing was OK, scanning with gnome-scan was OK too.
The printer can scan from the classic way, when you open it and place your doc on the glass (sorry I’m not english, and idk how to gice a better description). It can also scan from a document tray when you place multiple pages in top.
Both method were working perfectly.

Since NixOS 23.05, scanning via Wifi using Gnome default app for scanning (simple-scan) was not working. At the time I spent hours to try to understand why …

I ended up by waiting the next 23.11 with my fingers crossed.
Unluckily, simple-scan still cannot scan with the same error.

Here is the capture
Peek 04-12-2023 13-17

And here is the output of LANG=C simple-scan --debug

[+0.00s] DEBUG: simple-scan.vala:2015: Starting simple-scan 44.0, PID=25091
[+0.00s] DEBUG: unsetenv() is not thread-safe and should not be used after threads are created
[+0.14s] DEBUG: _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’
[+0.17s] DEBUG: app-window.vala:2002: Loading state from /home/seb/.config/simple-scan/state
[+0.17s] WARNING: scanner.vala:1739: Unknown ScanType: . Please report this error.
[+0.17s] DEBUG: app-window.vala:1981: Restoring window to 600x400 pixels
[+0.19s] DEBUG: scanner.vala:1619: sane_init () -> SANE_STATUS_GOOD
[+0.19s] DEBUG: scanner.vala:1625: SANE version 1.2.1
[+0.19s] DEBUG: scanner.vala:1686: Requesting redetection of scan devices
[+0.19s] DEBUG: scanner.vala:863: Processing request
[+0.45s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+8.74s] DEBUG: scanner.vala:348: sane_get_devices () -> SANE_STATUS_GOOD
[+8.74s] DEBUG: scanner.vala:374: Device: name="escl:https://10.0.2.2:443" vendor="HP" model="OfficeJet 6950 [CFC9A1]" type="platen,adf scanner"
[+9.05s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+9.73s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+10.15s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+10.27s] DEBUG: simple-scan.vala:1820: Requesting scan at 300 dpi from device 'escl:https://10.0.2.2:443'
[+10.27s] DEBUG: scanner.vala:1777: Scanner.scan ("escl:https://10.0.2.2:443", dpi=300, scan_mode=ScanMode.COLOR, depth=8, type=single, side=front, paper_width=0, paper_height=0, brightness=0, contrast=0, delay=0ms)
[+10.27s] DEBUG: scanner.vala:863: Processing request
[+10.59s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+11.13s] DEBUG: scanner.vala:924: sane_open ("escl:https://10.0.2.2:443") -> SANE_STATUS_GOOD
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (0)
[+11.13s] DEBUG: scanner.vala:795: Option 0: name='(null)' title='Number of options' type=int size=4 cap=soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Read-only option that specifies how many options a specific device supports.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (1)
[+11.13s] DEBUG: scanner.vala:795: Option 1: name='(null)' title='Scan mode' type=group size=0
[+11.13s] DEBUG: scanner.vala:798:   Description: 
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (2)
[+11.13s] DEBUG: scanner.vala:795: Option 2: name='mode' title='Scan mode' type=string size=6 values=["Gray", "Color"] cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Selects the scan mode (e.g., lineart, monochrome, or color).
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (3)
[+11.13s] DEBUG: scanner.vala:795: Option 3: name='resolution' title='Scan resolution' type=int size=4 unit=dpi values=[75, 100, 200, 300, 600, 1200] cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Sets the resolution of the scanned image.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (4)
[+11.13s] DEBUG: scanner.vala:795: Option 4: name='source' title='Scan source' type=string size=8 values=["Flatbed", "ADF"] cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Selects the scan source (such as a document-feeder).
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (5)
[+11.13s] DEBUG: scanner.vala:795: Option 5: name='(null)' title='Geometry' type=group size=0 cap=advanced
[+11.13s] DEBUG: scanner.vala:798:   Description: Scan area and media size options
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (6)
[+11.13s] DEBUG: scanner.vala:795: Option 6: name='tl-x' title='Top-left x' type=fixed size=4 unit=mm min=0.000000, max=215.222656, quant=0 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Top-left x position of scan area.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (7)
[+11.13s] DEBUG: scanner.vala:795: Option 7: name='tl-y' title='Top-left y' type=fixed size=4 unit=mm min=0.000000, max=299.889328, quant=0 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Top-left y position of scan area.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (8)
[+11.13s] DEBUG: scanner.vala:795: Option 8: name='br-x' title='Bottom-right x' type=fixed size=4 unit=mm min=0.677322, max=215.899994, quant=0 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Bottom-right x position of scan area.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (9)
[+11.13s] DEBUG: scanner.vala:795: Option 9: name='br-y' title='Bottom-right y' type=fixed size=4 unit=mm min=0.677322, max=300.566666, quant=0 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Bottom-right y position of scan area.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (10)
[+11.13s] DEBUG: scanner.vala:795: Option 10: name='(null)' title='Enhancement' type=group size=0 cap=advanced
[+11.13s] DEBUG: scanner.vala:798:   Description: 
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (11)
[+11.13s] DEBUG: scanner.vala:795: Option 11: name='preview' title='Preview' type=bool size=4 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Request a preview-quality scan.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (12)
[+11.13s] DEBUG: scanner.vala:795: Option 12: name='preview-in-gray' title='Force monochrome preview' type=bool size=4 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Request that all previews are done in monochrome mode.  On a three-pass scanner this cuts down the number of passes to one and on a one-pass scanner, it reduces the memory requirements and scan-time of the preview.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (13)
[+11.13s] DEBUG: scanner.vala:795: Option 13: name='brightness' title='Brightness' type=int size=4 min=0, max=2000, quant=1 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Controls the brightness of the acquired image.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (14)
[+11.13s] DEBUG: scanner.vala:795: Option 14: name='contrast' title='Contrast' type=int size=4 min=0, max=2000, quant=1 cap=soft-select,soft-detect
[+11.13s] DEBUG: scanner.vala:798:   Description: Controls the contrast of the acquired image.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (15)
[+11.13s] DEBUG: scanner.vala:795: Option 15: name='sharpen' title='Sharpen' type=int size=4 min=-511731360, max=32679, quant=-190837479 cap=soft-select,soft-detect,inactive
[+11.13s] DEBUG: scanner.vala:798:   Description: Set sharpen value.
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (16)
[+11.13s] DEBUG: scanner.vala:795: Option 16: name='threshold' title='Threshold' type=int size=4 min=0, max=255, quant=1 cap=soft-select,soft-detect,inactive
[+11.13s] DEBUG: scanner.vala:798:   Description: Select minimum-brightness to get a white point
[+11.13s] DEBUG: scanner.vala:1002: sane_get_option_descriptor (17)
[+11.13s] DEBUG: scanner.vala:602: sane_control_option (4, SANE_ACTION_SET_VALUE, source="Flatbed") -> (SANE_STATUS_GOOD, "Flatbed")
[+11.13s] DEBUG: scanner.vala:602: sane_control_option (2, SANE_ACTION_SET_VALUE, mode="Color") -> (SANE_STATUS_GOOD, "Color")
[+11.13s] DEBUG: scanner.vala:514: sane_control_option (3, SANE_ACTION_SET_VALUE, resolution=300) -> (SANE_STATUS_GOOD, 300)
[+11.13s] DEBUG: scanner.vala:584: sane_control_option (8, SANE_ACTION_SET_VALUE, br-x=option.range.max=215.899994) -> (SANE_STATUS_GOOD)
[+11.13s] DEBUG: scanner.vala:584: sane_control_option (9, SANE_ACTION_SET_VALUE, br-y=option.range.max=300.566666) -> (SANE_STATUS_GOOD)
[+11.13s] DEBUG: scanner.vala:449: scale_int: scaling 0 [min: -100, max: 100] to 1000 [min: 0, max: 2000]
[+11.13s] DEBUG: scanner.vala:514: sane_control_option (13, SANE_ACTION_SET_VALUE, brightness=1000) -> (SANE_STATUS_GOOD, 1000)
[+11.13s] DEBUG: scanner.vala:449: scale_int: scaling 0 [min: -100, max: 100] to 1000 [min: 0, max: 2000]
[+11.13s] DEBUG: scanner.vala:514: sane_control_option (14, SANE_ACTION_SET_VALUE, contrast=1000) -> (SANE_STATUS_GOOD, 1000)
[+12.25s] DEBUG: scanner.vala:1352: sane_start (page=0, pass=0) -> SANE_STATUS_NO_DOCS
[+12.25s] DEBUG: scanner.vala:1325: sane_cancel ()
[+12.25s] DEBUG: scanner.vala:825: sane_cancel ()
[+12.25s] DEBUG: scanner.vala:828: sane_close ()
[+12.25s] CRITICAL: page_get_has_data: assertion 'self != NULL' failed
[+12.25s] CRITICAL: book_delete_page: assertion 'page != NULL' failed
[+12.61s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+13.80s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+14.43s] DEBUG: app-window.vala:2078: Saving state to /home/seb/.config/simple-scan/state
[+15.04s] DEBUG: autosave-manager.vala:201: Deleting autosave records
[+15.04s] WARNING: autosave-manager.vala:214: Failed to delete autosaves: Error opening directory “/home/seb/.cache/simple-scan/autosaves”: No such file or directory
[+15.04s] DEBUG: scanner.vala:1807: Stopping scan thread
[+15.04s] DEBUG: scanner.vala:863: Processing request
[+15.05s] DEBUG: scanner.vala:1818: sane_exit ()

My previous search sent me to the low level library code on Github, but I wasn’t able to find a solution or a workaround.

For a workaround, I was wondering if as nixos is pretty good at isolating environments, is there a way to run simlple-scan from NixOS 22.11 ?

Thanks for any help

PS: I need to test from a live Ubuntu for example, I’ll post the results asap

Ah! Hewlett Packard, the mark of open source quality.

1 Like

I just tested Ubuntu 23.10.1 and it also fails

Here is the simple-scan log: https://pastebin.com/raw/CK1r9Sq7

And here are the versions from ubuntu:

ii  libsane-common                                1.2.1-5                                 all          API library for scanners -- documentation and support files
ii  libsane1:amd64                                1.2.1-5                                 amd64        API library for scanners
ii  mawk                                          1.3.4.20230730-1                        amd64        Pattern scanning and text processing language
ii  sane-airscan                                  0.99.27-1build1                         amd64        SANE backend for AirScan (eSCL) and WSD document scanner
ii  sane-utils                                    1.2.1-5                                 amd64        API library for scanners -- utilities
ii  simple-scan                                   44.0+git20230905-0ubuntu1               amd64        Simple Scanning Utility

Not sure, if it is the same issue, but I observed something similar with a Canon SnapScan in combo with any scanning software managed via home-manager on a host running Archlinux, see simple-scan: Scanner is not detected anymore on non-NixOS system that has sane set up · Issue #271989 · NixOS/nixpkgs · GitHub

Not only seems simple-scan not to work but any software using the sane backend i. e. libreoffice or gscan2pdf. On my side I also only recently observed this but cannot tell for sure since when it stopped working. Following nixos-23.11.

On the machine where I use NixOS (sane.enable = true;) following nixos-23.11 the issue does not occur.

EDIT: My last sentence is not entirely true as I had to indeed switch to the module version of 22.11 for the module in question to work, have a peek here if interested in the hack.

When I’m back at the machine I’ll try what gives to have these files in place as installed by Arch’s packaging of sane and report back if nixpkgs’ simple-scan is happy then:

  • /usr/lib/udev/rules.d/65-sane.rules
  • /usr/lib/udev/rules.d/66-saned.rules
  • /usr/lib/udev/hwdb.d/20-sane.hwdb

I don’t know if your problem is related to mine @573 , as far as I understand, your scanner is not detected, mine is. My problem is that it returns a SANE_STATUS_NO_DOCS before scanning the first page.

I was able to make simple scan work by installing it with flatpak and downgrading it

Available versions

$ flatpak remote-info --log flathub org.gnome.SimpleScan
        ID: org.gnome.SimpleScan     
       Ref: app/org.gnome.SimpleScan/x86_64/stable
      Arch: x86_64                                                                                        
    Branch: stable                             
Collection: org.flathub.Stable       
  Download: 9,7 Mo
 Installed: 24,6 Mo                                                                                       
   Runtime: org.gnome.Platform/x86_64/45          
       Sdk: org.gnome.Sdk/x86_64/45  

    Commit: f93e47f97cda3797203d16d733c7881f03d6c5ae353efa37c1102685c1a07ff8
    Parent: 3c49ec111aa390597517ebbdc07bc4e7f3608e4cd7457ad14b292c41445a9d9d
   Subject: Update libgusb.git to 0.4.8 (b8f70a1a)
      Date: 2023-11-28 23:03:44 +0000
   History:                                                                                               
                                                     
    Commit: 3c49ec111aa390597517ebbdc07bc4e7f3608e4cd7457ad14b292c41445a9d9d
   Subject: Update libgusb.git to 0.4.6 (f9356189)                                                                                                                                                                   
      Date: 2023-09-23 15:24:44 +0000
                                                     
    Commit: bbe33abe5be5d65a7e9cac2ab4ae601bf9adf63c076c3a06fd93ce3de1ab2261                                                                                                                                         
   Subject: Use id instead of app-id (e9eb1ab1)
      Date: 2023-03-27 06:58:14 +0000
                                                     
    Commit: 3586b7d4d065d553e1ba1e9ec2924137d25fe8f2ece7958d83380bb654f46d2e                      
   Subject: Update libgusb.git to 0.4.4 (ecbf0757)
      Date: 2023-02-02 12:00:05 +0000

    Commit: a3b9802be3eb716761204ddc14ef1efc486fb61cc3f076ef1a0ec786d9bdfd82
   Subject: Update libgusb.git to 0.4.4 (ecbf0757)                                                        
      Date: 2023-02-02 12:00:05 +0000                                                                                                                                                                                
                                                                                                                                                                                                                     
    Commit: 35384d08cff6da960f2d3eb0eaa1d11b7db6afa456aff7a5e5586b19d29bea10
   Subject: Add org.gnome.SimpleScan (935384c6)
      Date: 2023-01-18 14:54:11 +0000    

Install

$ flatpak install org.gnome.SimpleScan 

Here I tried to scan, and got the same SANE_STATUS_NO_DOCS error like the version installed with my NisOS.

Downgrade to the oldest available version

# we need sudo to downgrade
$ sudo flatpak update --commit=35384d08cff6da960f2d3eb0eaa1d11b7db6afa456aff7a5e5586b19d29bea10 org.gnome.SimpleScan

Then I was able to scan.

In conclusion, I think I’ll open a ticket on Gnome Simple Scan project and see where it goes.

1 Like

Ok, I don’t understand anything about what’s going on with Gnome Scan :slight_smile:

As the oldest version available on flathub was working, I tried to test all available version from the oldest to the newest to find between which commits the regression appears.

And … all versions are working !

Even more strange, I uninstalled the flatpack version, and the NixOS native version does not find my scanner anymore !

I’ll give another try tomorrow :frowning:

It looks like Gnome Scan or the library it uses under the hood, has some kind of cached devices found on the network. That seems to cause my previous post, all flathub versions were working because of the cache… to be verified

Also I noticed that my printer is recognized with e “eSCL” prefix in its name. When this eSCL prefix is here, the device works. With the latest version, my scanner name does not have the eSCL prefix, and it does not work.

I manage to get 2 scanners in the dropdown selection list when I play with different versions quickly (reason why I think there is a cache somewhere). And only the eSCL device works.

Starting simple-scan with the --debug switch from my flake shows that sane from the host seems to be used:

[+698.23s] DEBUG: scanner.vala:1686: Requesting redetection of scan devices
[+698.23s] DEBUG: scanner.vala:863: Processing request
[+701.69s] DEBUG: scanner.vala:348: sane_get_devices () -> SANE_STATUS_GOOD
[+701.79s] DEBUG: app-window.vala:2078: Saving state to /home/dani/.config/simple-scan/state

But still the scanner is not detected (sane-related binaries in /usr/bin thus I assume it is the host’s).

All with udev rules mentioned up in place.

IDK all I can find so far back in git history is the move of vala to nativeBuildInputs which is a logical step but would be the only idea I had to look for a regression.

Some other ideas ?

@seb0 Issuing upstream probably is a good idea if only they miss documention to provide us with a path forward.

The workaround in my case until the issue with the non-detected scanner is sorted out is using nixos-22.11 branch to inherit simple-scan and sane-backends in my flake.

nix shell .#homeConfigurations."me@machine".pkgs.sane-backends
nix shell .#homeConfigurations."me@machine".pkgs.simple-scan

$ which scanimage
/nix/store/rx7yz2xpkziyqpsigb7x647rjjgqvwq2-sane-backends-1.0.32/bin/scanimage
$ /nix/store/rx7yz2xpkziyqpsigb7x647rjjgqvwq2-sane-backends-1.0.32/bin/scanimage -L
device `v4l:/dev/video0’ is a Noname Integrated Camera: Integrated C virtual device
device `plustek:libusb:003:002’ is a Canon CanoScan N1240U/LiDE30 flatbed scanner

Hello,

  • if your scanner needs escl to work then you need to add air-scan to the available backends:
    hardware.sane.extraBackends = [ pkgs.sane-airscan ];
  • sane is not as isolated as other libraries so downgrading to old simple-scan will not be enough.

Sane works as follows: the process that wants to scan dlopens sane.so. sane.so reads /etc/sane/dll.conf for a list of backends. For each backend name, sane.so dlopens the corresponding sane-foo.so library.
On NixOS, sane.so is found with LD_LIBRARY_PATH, pointing to /etc/sane-libs. /etc/sane.d is also moved to /etc/sane-config. All these are symlinks to an overriden instance of the sane-backend package: https://github.com/NixOS/nixpkgs/blob/0a37316d6cfea44280f4470b6867a711a24606bd/nixos/modules/services/hardware/sane.nix#L167-L168
As a result:

  • if you want to use older drivers, you must use an older version of sane-backends in the module I linked above
  • but you can’t use an overlay because sane-backends very big rebuild (including libreoffice)
  • and since every app in your system can dlopen libsane.so, it can create version mismatches with all recent apps

Thanks for all these details!

I just tried

  hardware.sane.extraBackends = [ pkgs.sane-airscan ];

And I get the exact same error, my scanner is detected but it is not working, which means I think I already had this dependency before. Also my wireless scanner was detected and was working without this configuration in NixS 22.11.

I imagine that the flatpack version of Simple Scan embed these libraries, that would explain that the old versions of the flatpack apps are working with my scanner and the new versions are not?

@symphorien you think I should open a ticket in GitHub - alexpevzner/sane-airscan: Scanner Access Now Easy - universal driver for eSCL (Apple AirScan) and WSD for my problem?

For info, here is the ticket I just opened

Because when I found this ticked on simple-scan project I thought that mine would have the same response :slight_smile:

Note: it will be possible to override the sane package on the next NixOS release:
https://github.com/NixOS/nixpkgs/pull/273286

But other caveats still apply: there can be library conflicts that will just break scanning if you mix old sane with new client software.

Hi

Thanks for the info, I just read the content of the PR and I have a question.

What are possible values instead of pkgs.sane-backends?
Will it be possible to use sane-airscan instead?
This looks like what have been suggested here.
I asked how to do it and I got no response. But maybe it was simply not possible in the current nixos …

sane-airscan is not instead of sane-backend, it is in addition:

  hardware.sane.extraBackends = [ pkgs.sane-airscan ];

adds sane-airscan to the list of all backends embedded in sane-backends.


Nixpkgs only contains pkgs.sane-backends but you can craft your own value of sane-backends:

(pkgs.sane-backends.overrideAttrs (old:{ patches = [ ./my-favourite-patch.patch ]; })

or

(let oldpkgs = import (builtins.fetchTarball "channel:nixos-23.05") {}; in oldpkgs.sane-backends)

Keep in mind that mixing and matching several versions of sane-backend in the same system may lead to

  • application not loading sane at all
  • segfault

I was finally able to use my scanner today (and learnt some details about nixos and sane by the way) !!

First, I always thought I was using “airscan” driver with the configuration from the wiki

  hardware.sane.enable = true;
  hardware.sane.extraBackends = [ pkgs.sane-airscan ];

But I learnt that there is also a escl driver in sane-backends, and I was using it anyways … see this ticket

It seems that there is no way to manually choose the airscan driver over the escl driver …

I tried to explicitly disable it with:

  hardware.sane.disabledDefaultBackends = [ "escl" ];

And bingo, now my scanner uses the airscan driver :tada::tada::tada:

And luckily the airscan driver works properly with my printer/scanner :slight_smile:

Thanks @symphorien for your help on this :+1:

oh I had not noticed that there was an escl backend builtin to sane-backends!

It might be something quite new, I haven’t checked the repo nor the changelog.

That would explain why my scanner stopped working with NixOS 23.05, with the escl backend enabled by default that prevent airscan to be used.

I just checked, and it looks like the escl backend is quite old. Older than version of sane-backends that was bundled in NixOS 22.11 (the last version that was working out of the box for me).

By any chance, do you know how to retrieve a package version in an old nixos version?

Anyway, seeing the history of the escl backend, there was some discovery fix, this one in particular makes me imagine that in the NixOS 22.11 version, a discovery bug in the escl backend of the sane-backends package prevented sane to use the escl backend. So the airscan backend was used, and the scanner worked.

Eventually the bug was fixed upstream and the version shipped in NixOS 23.05 of sane-backends saw my scanner with the escl backend, and another bug (maybe linked to my specific 6950 model?) prevented sane to work since.

It is just a theory … and I’ve spent too much hours to make my scanner usable again, but I’m happy it works now :slight_smile: