libera/#maemo-leste/ Saturday, 2021-05-29

Wizzupfreemangordon: the only thing I can do is enable them, start the scan, and disable them immediately00:02
Wizzupfreemangordon: https://w1.fi/cgit/hostap/tree/wpa_supplicant/scan.c#n151900:05
inkyuvos: i think it is enough to follow the keyboard. if the keyboard changed to english, then setxkbmap "us", if the keyboard changed to armenian, then setxkbmap "us, am".00:13
inkylet me explain why. if the vkbd is russian, you need to do setxkbmap "ru, us" because ru also contains dot, comma, etc from the ascii segment.00:13
inkyby the way, armenian layout has own dot symbol, but shares the comma. (: so still, as the general rule00:14
inkyit is better to activate two layouts - us and something.00:14
joergweird, buzz spamming #libera with a surefire-kline ascii art :-o00:17
Wizzupfreemangordon: ok, I think I have a hack00:25
Wizzupfreemangordon: so if we 'disconnect' the interface (we don't need to do it if we are already connected), then wpa_supplicant will not auto connect00:26
Wizzupbecause the reassociate key is set to 000:26
Wizzupso then we can scan properly for hidden ssids00:26
Wizzupbut then select_network will set reassociate back to 1, so if we get dropped from the AP, we need to set disconnect before scanning00:27
lelinformer2016 opened an issue: https://github.com/maemo-leste/eg25-manager/issues/1 (EG25-G GB - official SDK and many helpful files)00:28
Wizzupuvos: if you have time this weekend, I can try to make clownboot work00:30
inkyuvos: ah know this is a problem, setxkbmap cannot, i guess, accept both us and am simultaneously.00:47
inkyit has switch to accept one or the other.00:47
inkyso then depending on the utf-8 keycode it has to choose hardcoded range.00:48
inkyhm.00:48
inkynot keycode, utf-8 code.00:48
inkybut that's possible, because we know all the utf-8 symbols that are used in the vkbs.00:49
Wizzupfreemangordon: ok, this works00:50
WizzupI'll clean it up tomorrow00:50
inkyuvos i found it https://github.com/maemo-leste/hildon-input-method-plugins/blob/master/hildon-im-virtual-keyboard-layouts/hy_AM.xml but it does not help us.00:55
Wizzupok, except that the dbus interface for wpa supplicant doesn't do the same on  fi.w1.wpa_supplicant1.Interface.Disconnect compared to 'disconnect' on the ctrl interface00:57
Wizzup......00:57
Wizzupso then I would have to *also* connect to the wpa_supplicant control interface00:59
Wizzupfreemangordon: https://github.com/maemo-leste/bugtracker/issues/489#issuecomment-85071350801:05
* Wizzup wondering if we can make ofono and asterisk play nice somehow01:39
Wizzupor maybe they just complement each other01:39
Wizzupgn01:39
tmlindmighty: i'd use the known working android mux setting, not sure what the difference. see also the gpio-hog for msecure-hog in arch/arm/boot/dts/omap5-board-common.dtsi, maybe something similar works for you too06:48
tmlindmighty: i think you just want to keep msecure high for twl access, so muxing it into gpio mode and using a gpio hog should do it06:53
freemangordonWizzup: nice, just LMK why it doesn't work through the wizard when it comes to it06:58
freemangordonah, wlancond interface I guess07:28
freemangordonWizzup: do you remember/have any clue why we decided to drop osso-wlan (wlancond)? https://github.com/community-ssu/osso-wlan07:51
freemangordonIt is weird we did it like that, given that wpa_supplicant replaces eapd07:56
freemangordonmaybe we shall reconsider07:56
freemangordonkeep in mind we lack support for WPS too ATM07:56
parazydfreemangordon: WPS is fundamentally broken and unsafe btw.08:47
parazydHaven't seen it deployed in a long time.08:48
freemangordonso, we shall not support that?08:49
Danct12for some reason the technician guys from the isp still uses wps08:50
parazydI wouldn't really.08:50
Danct12so usually when they're done replacing my router i just turn it off08:50
freemangordonafk, ttyl08:50
parazydNowadays script kiddies use reaver and pixiewps to screw up routers that have it enabled08:51
parazydttyl08:51
Danct12right, ttyl 208:52
parazydfreemangordon: (for later), Did osso-wlan also do hostap?08:52
Danct12one last thing, is there a list of things that needs to be TODO?08:52
Danct12i'd like to have screenshooting as a feature08:53
parazydIn case no, it might also be interesting to look forward, rather than backwards: https://wiki.archlinux.org/title/Iwd08:53
parazydDanct12: https://github.com/maemo-leste/bugtracker/issues/08:54
parazydThis really08:54
tvallwps was wonderful the last time i lived in an apartment. reaver is so much quicker than brute forcing handshakes08:57
tvallwould never let it anywhere near a network i run08:58
parazydYeah I also used it in a clutch when I needed Internet access but no open networks :D09:01
Danct12what did you need for internet access at that moment?09:04
Danct12updating the system? :P09:04
parazydWell, I wanted to use it, but didn't have a connection at home at that time09:05
parazydI had this 1W device and a yagi https://www.alfa.com.tw/products/awus036h09:06
Danct12i heard alfa made really high quality stuffs, i had a few friends who had one09:10
parazydYeah09:10
siceloparazyd: no, wlancond didn't do hostapd10:01
siceloAnyway, n900 wifi card/driver doesn't do ap mode at all. Any hotspot applications that existed were doing adhoc network10:02
parazydfreemangordon: I have a WIP patch for hildon-input-method-framework gtk3: http://sprunge.us/KRcRJ310:05
parazydfreemangordon: Could you try having a look at the remaining compiler errors?10:05
parazydfreemangordon: There is also a dependency on https://maemo.org/api_refs/5.0/5.0-final/gtk/GtkIMContext.html#hildon-gtk-im-context-show10:05
siceloscreen shooting means screen recording? Or screenshot?10:29
freemangordonparazyd: can't open the link11:14
parazydfreemangordon: Which?12:18
parazydYou can curl/wget http://sprunge.us/KRcRJ312:19
mighty`<6>[ 0.269683] twl6030: PIH (irq 39) chaining IRQs 368..387` downstream and `twl 0-0048: PIH (irq 146) nested IRQs` mainline12:19
mightythis is sus right?12:19
mightytmlind yeah something like the gpio hog should work lets try12:26
Wizzupfreemangordon: I think wpa_supplicant implements both wlancond and eapd12:28
Wizzupparazyd: wlancond does not do hostapd, we don't need it12:29
parazyd(y)12:31
freemangordonparazyd: I get 40412:31
freemangordonin the browser that is12:31
parazydfreemangordon: I pushed here: https://github.com/maemo-leste/hildon-input-method-framework/tree/gtk312:31
parazydUnsure, it loads fine here12:31
parazydAnyway, it's in this gtk3 branch now12:31
freemangordonok12:31
mightybut i cant understand how omap5 has done it ie what is p23412:33
mightyalso only this is needed right https://github.com/torvalds/linux/commit/af756bbccff85504ce05c63a50f80b9d7823c500#diff-49bb9f3d1c5e2d002c2e7cfc17c39443c007e2dbd32a0d5282934f24f9b02c68R133-R14212:33
freemangordonWizzup: not sure, I think it is only eapd that's implemented, but won't argue much12:33
Wizzupfreemangordon: wpa supplicant does everything on the wireless side, I can't imagine what wlancond did12:34
Wizzup(not arguing btw :p)12:34
freemangordonbecause, from what I understand, wlancond implements what icd2 plugin requires in terms of caching and stuff like hidden wlan and wps and adhoc12:35
freemangordonIIUC it is a kind of a proxy12:35
Wizzupwpa_supplicant caches Bss info12:35
WizzupI don't know much about icd2 caching though12:36
Wizzupbut wpa_supplicant is also a 'proxy' in many ways, you can do some of the same things with a lower level interface, but then you rely on (sometimes) buggy kernel drivers, etc12:36
freemangordonwhat about hidden wlan support? how we're going to implement this https://github.com/maemo-leste/connui-internet/blob/master/src/settings/easy-wlan.c#L936?12:36
Wizzupby implementing another dbus interface12:36
Wizzups/implementing/reading/12:36
freemangordonany hint which one?12:37
freemangordonas I am going to implement it as soon as I know how :)12:37
WizzupSee  fi.w1.wpa_supplicant1.Interface.Scan12:37
Wizzup SSIDsaayArray of SSIDs to scan for (applies only if scan type is active)No12:37
freemangordonbut, you said this shall be called after 'disconnect', no?12:37
WizzupIt might interact with our icd2 module, but I can maybe work around that12:37
freemangordonexactly12:38
Wizzupnot in that way12:38
freemangordonthis is my point about wlancond acting as a proxy12:38
Wizzupthe disconnect is not relevant, the icd2 module can handle that12:38
WizzupI am providing you the replacement dbus code, I would write the easy wlan stuff differently I think12:38
WizzupI think all you need it already in the IAP data that gets created from icd212:38
freemangordonok, lets not discuss that now as I have to go. Will think about it a bit more, please, you do too.12:38
Wizzupok12:39
freemangordonbbl12:39
Wizzuphi12:42
* ^-^hi 12:43
^-^hiWizzup: if you have implemented and tested the battery use improvements on n900, why don't you incorporate them?12:44
Wizzup^-^hi: sorry, what exactly are you talking about? Got a link/reference?12:45
siceloI suppose he means the tweet about N900 doing off mode12:46
Wizzupsicelo: I realised, but I'd like context :)12:46
^-^hiyou sent a tweet somewhere saying that n900 battery now lasts much longer. i come every few months and ask if the battery use improvements are already included and hear no.12:47
Wizzup^-^hi: I see, ok12:51
^-^hiis it included already?12:51
Wizzup^-^hi: so the answer is that it's not just a question of 'merging in some code', it's a decent amount of research work, let me explain12:51
WizzupOur current Linux on the N900 is 5.1 with some patches, some of our own, some powervr patches, for omapfb and powervr. The tweet was plain mainline (5.8 or so?) with no maemo leste loaded - minimal userspace, showing that it is possible to enter those idle/off modes12:52
WizzupWhat needs to be done to get it all in place and merged is: (1) move from kernel 5.1 to a newer/latest kernel - this is being blocked by some of us not knowing how to port to 5.2 and forward due to some kernel change12:52
Wizzup(2) is then loading up minimal userspace, hitting off mode with the powervr driver loaded but not used, and then booting maemo bits one at a time, and see what can prevent OFF mode from being hit12:53
Wizzup(3) making n900 on maemo play nice with off mode once (1) and (2) are done12:53
WizzupWe're not doing (1) at the moment because we want to switch to another, newer, powervr userspace + kernel driver so that we're using the same one on all devices, but that driver needs some more work to get X11 going with hildon-desktop12:54
WizzupIf we can get the new driver working, we can skip (1) outright, and since we want to do that anyway, it's better to aim for the newer driver rather than having to redo the work we just did to begin with12:54
WizzupA shortcut to start on (2) and (3) is to load the latest kernel without powervr on the n900 and start working on OFF mode, without 3d acceleration, this can be useful, but it won't result in a useful phone until it's once again equipped with the 3d driver12:55
WizzupOne other shortcut is that maybe it is possible to try to hit off mode on kernel 5.1, but if we can't, we cannot report bugs since everyone (rightfully so) will tell us: does it work with latest kernel? as first question12:56
WizzupHope this clarifies it a bit, please let me know if you have more questions12:57
^-^hiany way to run new software on fremantle without compiling everything and its dependencies?12:58
* ^-^hi 's English is degrading13:00
WizzupIf you fremantle you mean the ancient kernel and ancient userspace, then likely only chroot will be easy, but even that will likely have trouble with really old kernel13:01
siceloNot really enough useful ways for that.13:01
^-^hididn't linux have a policy of "don't break userspace"?13:02
WizzupMaybe if you also go for arm eabi, and use the space x11 driver ported to latest xorg server and using eabi in the chroot, you could get something going, but that by itself is probably more effort than the work required to get decent PM on leste13:02
sicelo^-^hi: if you want to help with the off mode issue (and get some use out of the device in the meantime), maybe look at running plain devuan with i3 or similar light UI (no 3d required). Should make it easier to play with kernel, and still use device to some extent13:04
^-^hii know C but don't know anything about kernel and such stuff13:05
siceloIf you know C, you're already halfway :-)13:05
siceloI don't know C, but already 'fixed' something for the LED driver ... so you should do even better. Also, the PM stuff doesn't necessarily need you to do actual dev. Testing, reporting, testing some more, etc. is still a good start13:07
Wizzupsicelo: I'm not sure if that helps that much (with i3), it's mostly kernel stuff really13:07
WizzupDon't mean to discourage, but I think if folks want to contribute without the powervr stuff, then picking the last path I outlined is helpful: latest mainline linux without powervr, and making things play nice then13:08
Wizzupyou could do that with i3, but might as well do it with maemo tbh13:08
Wizzupfreemangordon: these bits should allow just reading the iap network attrs without extra dbus calls already iiuc: https://github.com/maemo-leste/libicd-network-wpasupplicant/blob/master/src/wpaicd.c#L61113:11
Wizzupfreemangordon: seems like I already implemented the wlancond caps in icd2 since it's part of the api :)13:12
Wizzupfreemangordon: and src/wlan.c's wlan_search_network_added_cb uses network_attrs = wpaicd_bssinfo_to_network_attrs(info);13:13
Wizzupso at least icd2 is already perfectly aware of this13:13
Wizzupso if you can get access to the IAP you need to connect to for the hidden wlan, you can already know the capabilities and the entire scan is redundant13:14
Wizzupfreemangordon: so this can just go away and be replaced with reading icd2 network attrs https://github.com/maemo-leste/connui-internet/blob/master/src/settings/easy-wlan.c#L42913:14
Wizzupalso it looks like there is cap2nwattr13:15
Wizzupno clue where it comes from, though13:16
freemangordonWizzup: but how do we match a hidden wlan to the SSID just entered?14:27
freemangordonbut yeah, might be possible, will check leater on14:28
Wizzupfreemangordon: with the ssid that someone fills in14:54
Wizzupfreemangordon: oh, I see, how do we known which of the hidden ssids it might be14:54
Wizzupfreemangordon: in that case we can just have it trigger a scan via icd2, and get the info that way?14:56
Wizzupit does sometimes take one or two scans to fully pick the ap up though14:56
Wizzuphonestly if it was me I'd make people do it through the settings ;-)14:56
Wizzupfreemangordon: hm, I think we would know what hidden ssid it is, since someone would pick it from the UI16:23
Wizzupfreemangordon: but all of the would just say 'Hidden WiFi'16:23
Wizzupthe whole idea behind hidden APs is so broken16:23
Wizzupparazyd: re: him gtk316:27
Wizzupgtk HildonGtkInputMode could perhaps be replaced with https://developer.gnome.org/gtk3/stable/GtkEntry.html GtkInputPurpose16:27
Wizzupparazyd: various things there do depend on gtk2 patches like the filter_event16:38
Wizzupin GtkIMContextClass16:38
Wizzupdebian/patches/hildonize-gtk-imcontext.diff is particularly relevant16:39
Wizzupparazyd: so this would go into our gtk3 patch set I think16:43
WizzupThe hildongtkinputmodes we can maybe base on the GtkInputPurpose enums as listed above16:44
Wizzupbut the other stuff requires more significant changes16:44
WizzupWe can look at dropping it maybe, but it seems quite relevant16:45
parazydftr17:10
parazyd15:43 <parazyd> I'm not sure what exactly hildonize-im-context.patch really does, but if the idea was: "hide the input method on focus change or on windowing system state change", then it should not be necessary17:10
parazyd15:43 <parazyd> Widgets should do that17:11
freemangordonWizzup: I'll debug to see what exactly data we have in connui dialogs17:56
Wizzupfreemangordon: ok17:59
Wizzupparazyd: I don't think it was about focus tracking17:59
Wizzupparazyd: it is a way to force-raise the IM it looks like17:59
freemangordonWizzup: it seems we have some caps, whether they are correct is another story18:04
Wizzupfreemangordon: they should be I think18:04
Wizzupfreemangordon: if they are not please let me know18:04
Wizzupfreemangordon: we render them in the UI based on those caps (the lock, etc)18:04
freemangordonok, will just comment trhe code that scans and will se how it will pan out18:04
freemangordon*the18:04
Wizzupok, I need to push some code from my side as well but I don't have the control interface part yet18:06
freemangordonWizzup: hmm, won;t work, because you may have more than one hidden wifi around, and in the menu only one entry seems to be shown18:13
freemangordonwhich is the case here18:13
Wizzupfreemangordon: I don't know how that can ever be made sensible UX tbh18:14
freemangordonI guess that's why Nokia did it like that - no matter how many hidden nets you have around, only one entry is shown. Once you click it, you enter ssid and caps for that ssid are retreived18:15
freemangordonor, we can group in the UI by caps18:16
freemangordonhmm, no, not a good idea18:17
Wizzupcan't people use the cpa?18:17
Wizzup(serious question)18:17
freemangordonWizzup: the more I think, the more I agree with how nokia did implement it18:17
Wizzupit seems to be a better way to implement it18:17
freemangordonstatus menu is way more intuitive18:18
freemangordonalso, we know how to do it, well, lets do it then18:18
freemangordonWizzup: you may expose dbus interface from wpa plugin to be called by the dialog to get the caps18:19
Wizzupfreemangordon: I need to check if wpa_supplicant can scan for ssid without proving key_mgmt18:19
freemangordonnot sure what you mean, but ok18:20
Wizzupbut if it does, I suggest that you use icd2 dbus api to just issue another scan and then wait18:20
Wizzupyou can add a 'temporary' IAP and scan18:20
Wizzupno need for more dbus apis iiuc18:20
freemangordonI think at that point we already have temporary iap18:20
freemangordonwe just need its caps so UI to know which dialogs to show18:21
Wizzupthen just issue another icd2 scan, as when I push my code the thing should show up upon rescan if it's present as temporary18:21
freemangordonhidden wlans are not shown unless you add them18:22
freemangordonyou == wpa plugin18:23
Wizzupfreemangordon: yes, the new code does that (local)18:23
WizzupI already connected to hidden wlan at home18:23
Wizzupand it shows up in the scan dialog18:23
WizzupI just need to add the control interface and send "DISCONNECT" at the right time18:23
freemangordonbut how to issue another scan from the UI?18:23
freemangordonI don't think that is going to work, not reliably18:24
WizzupHow does it do the first one? ;)18:24
freemangordondoesn;t matter, we are already in a different state18:24
freemangordonalso, I am not sure icd2 will reissue a scan before the cache is expired18:25
freemangordonso that would mean that we will have cache expiry timeout+scan time for the new entry to appear18:25
freemangordonmore that 30 seconds, which is very bad UX imo18:26
freemangordonnot to say that you have to now that you have to search for the SSID you have just entered in the list and click it18:27
freemangordon*know18:27
Wizzupa new ssid showing up doesn't matter to the cache18:27
Wizzupafaik18:27
freemangordonafaik, no new scan to the plugin is issued while the cache is still valid18:28
freemangordonso plugin won;t have the chance to update the list with that temporary iap, if we assume it is created18:29
Wizzupfreemangordon: maybe allow cache to be invalidated rather than new api?18:34
freemangordonWizzup: why you don't like the idea?18:34
freemangordonalso, how exactly is UI supposed to invalidate icd2 cache?18:35
Wizzupfreemangordon: I am not sure if I don't like it, but adding more interfaces when we already have interfaces to (1) add a network to that is is scanned (2) issue another scan seems unnecessary18:35
Wizzups/to that is/so that it/18:35
freemangordonbut, we don;t really want another full scan, no?18:36
freemangordonwe just want details for a single SSID18:36
Wizzupthat's still a scan18:36
freemangordonyes, but not full18:36
freemangordonbtw, what is the problem to call wpa_supplicant?18:36
freemangordondo you think it will connect?18:37
freemangordonalso, how it is going to connect without a key?18:37
WizzupI don't think there is one, as long as the libicd-network-wpasupplicant's callbacks for scan results do not confuse icd218:37
Wizzupfreemangordon: wait, why are we talking about connect?18:37
Wizzupfreemangordon: oh, sorry18:37
freemangordonbecause you said (at least that's what I understood) is that issuing scan for ssid will also connect it18:38
Wizzupfreemangordon: no, it should be fine to call wpa_supplicant18:38
Wizzupfreemangordon: yes, but I found a workaround for that (with meridions help)18:38
freemangordonunless you call 'disconnect'18:38
freemangordonhmm?18:38
WizzupI can try to describe it here, but if you didn't, can you read my post on the gh issue first?18:38
freemangordonwhat is the workaround18:38
WizzupI tried to describe it well there18:38
Wizzuphttps://github.com/maemo-leste/bugtracker/issues/489#issuecomment-85071350818:39
Wizzupso the tl;dr is we can prevent wpa_supplicant for from acting on it's own by:18:39
Wizzup(1) if we are not connected to any APs, call 'DISCONNECT' on the ctrl interface18:39
Wizzup(2) if we are connected to something else, we don't need to do anything18:39
WizzupIf we are not connected, calling 'DISCONNECT' just has the effect of setting the 'reassociate' variable in wpa_supplicant to 0 which means it will *not* try to connect on its own18:40
Wizzupso I think it's fine if the easy-wlan calls out to wpa_supplicant over dbus to do a scan of a single ssid, I will just need to teach the libicd-network-wpasupplicant code to deal properly with scans it did not initiate18:41
freemangordonand that's why we need a separate daemon to control that, because UI has no clue (or at least should not care) whether we are connected or not18:41
Wizzupfreemangordon: easy-wlan will not need to issue 'DISCONNECT'18:41
Wizzuplibicd-network-wpasupplicant will take care of all of that18:41
freemangordonsure? ok, then it is fine18:41
Wizzupyes18:41
freemangordonI have no issue to call wpa_supplicant from the UI18:41
Wizzupok, then maybe that's the best solution18:41
WizzupShould we split out wpaicd to some shared lib?18:42
freemangordonyes, this is what code currently does, albeit it calls wlancond and not wpa_supplicant :)18:42
WizzupI have some more local code, but I'm currently at my parents place and already started on the wine, so I'm worried that if work too much on it now I'll create more work for myself tomorrow :p18:42
freemangordonno, connui has pretty much very good dbus support already18:42
Wizzupok18:42
freemangordonWizzup: take your time, I'll try to replace wlancond with wpa_supplicant calls18:43
freemangordonBTE, UI runs as user, is that a problem in regards to dbus security?18:43
freemangordon*BTW18:43
WizzupI would have to check, good question18:44
Wizzupwpa_supplicant runs on system I think18:44
freemangordonalso, tomorrow I'll be MIA the whole day, so you'll have plenty of time to implement whatever changes are needed in the plugin :p18:44
freemangordonmaybe we shall check the dbus service18:44
Wizzupok18:45
WizzupI know what I need to implement from my side, and tomorrow morning I'll be home with the hidden ap again18:45
freemangordongreat18:45
WizzupI'll push all the code to make auto connect and configured-via-cpa to work18:45
freemangordonI'll try to finish UI part today18:45
Wizzupand then we can test the other code when you  get back18:45
freemangordonmhm18:45
freemangordondeal18:45
freemangordonWizzup: one more thing - which interface I shall use to issue the scan?18:48
Wizzupfreemangordon: wlan0 currently, that's also the assumption in libicd-network-wpasupplicant18:48
WizzupI imagine that eventually we want to get rid of that, but for now ... eh18:48
freemangordonI meant dbus, I guess it is fi.w1.wpa_supplicant1.Interface18:48
Wizzuphttps://w1.fi/wpa_supplicant/devel/dbus.html18:48
Wizzuphttps://w1.fi/wpa_supplicant/devel/dbus.html#dbus_interface18:49
Wizzuphttps://github.com/maemo-leste/libicd-network-wpasupplicant/blob/master/src/wpasupplicant-defs.h18:49
freemangordonthanks18:49
freemangordonWizzup: hmm, it seems I shall issue more than one dbus call, right? "Scan" first then  GetAll on BSS id, right?18:59
Wizzupfreemangordon: yeah, you need to wait for it to complete19:02
freemangordonok19:02
Wizzupbut it;s async19:02
Wizzuphttps://github.com/maemo-leste/libicd-network-wpasupplicant/blob/master/src/wpaicd.c#L48719:02
freemangordonI can issue sync dbus acll19:02
freemangordon*call19:02
Wizzup+ https://github.com/maemo-leste/libicd-network-wpasupplicant/blob/master/src/wpaicd.c#L57419:03
Wizzupwell the signal is 'ScanDone19:03
Wizzup'19:03
freemangordoncurrent code does https://github.com/maemo-leste/connui-internet/blob/master/src/settings/easy-wlan.c#L98619:05
freemangordonso this is already handled19:05
freemangordonanyways, dinner19:05
freemangordonttyl19:05

Generated by irclog2html.py 2.17.0 by Marius Gedminas - find it at https://mg.pov.lt/irclog2html/!