Wednesday, 2017-04-12

*** lamt has quit IRC00:06
*** lamt has joined #openstack-meeting-cp00:09
*** lamt has quit IRC00:10
*** gouthamr has quit IRC02:44
*** lamt has joined #openstack-meeting-cp03:14
*** lamt has quit IRC03:43
*** lamt has joined #openstack-meeting-cp03:56
*** diablo_rojo has joined #openstack-meeting-cp03:57
*** lamt has quit IRC04:08
*** lamt has joined #openstack-meeting-cp04:09
*** lamt has quit IRC04:19
*** lamt has joined #openstack-meeting-cp04:44
*** lamt has quit IRC04:52
*** lamt has joined #openstack-meeting-cp04:54
*** lamt has quit IRC05:08
*** knangia has joined #openstack-meeting-cp05:14
*** diablo_rojo has quit IRC05:41
*** lamt has joined #openstack-meeting-cp05:49
*** lamt has quit IRC05:58
*** dmellado has joined #openstack-meeting-cp08:23
*** MarkBaker_ has quit IRC08:29
*** MarkBaker has joined #openstack-meeting-cp08:30
*** knangia has quit IRC08:31
*** sdague has joined #openstack-meeting-cp10:22
*** gouthamr has joined #openstack-meeting-cp12:14
*** markvoelker has joined #openstack-meeting-cp12:37
*** lamt has joined #openstack-meeting-cp12:47
*** lamt has quit IRC12:48
*** lamt has joined #openstack-meeting-cp12:57
*** lamt has quit IRC13:07
*** lamt has joined #openstack-meeting-cp13:16
*** markvoelker has quit IRC13:37
*** markvoelker has joined #openstack-meeting-cp13:40
*** lamt has quit IRC13:49
*** lamt has joined #openstack-meeting-cp13:53
*** david-lyle has quit IRC14:15
*** lamt has quit IRC14:21
*** lamt has joined #openstack-meeting-cp14:42
*** aselius has joined #openstack-meeting-cp14:54
*** diablo_rojo has joined #openstack-meeting-cp15:04
*** ayoung has joined #openstack-meeting-cp15:15
*** lamt has quit IRC15:20
*** felipemonteiro__ has joined #openstack-meeting-cp15:21
*** MarkBaker has quit IRC15:26
*** lamt has joined #openstack-meeting-cp15:27
*** knangia has joined #openstack-meeting-cp15:36
*** MarkBaker has joined #openstack-meeting-cp15:39
*** Rockyg has joined #openstack-meeting-cp15:42
*** lamt has quit IRC15:53
*** rarcea has joined #openstack-meeting-cp15:54
*** blancos has joined #openstack-meeting-cp15:58
lbragstad#startmeeting policy16:00
openstackMeeting started Wed Apr 12 16:00:13 2017 UTC and is due to finish in 60 minutes.  The chair is lbragstad. Information about MeetBot at http://wiki.debian.org/MeetBot.16:00
openstackUseful Commands: #action #agreed #help #info #idea #link #topic #startvote.16:00
*** openstack changes topic to " (Meeting topic: policy)"16:00
openstackThe meeting name has been set to 'policy'16:00
lbragstadping  antwash, raildo, ktychkova, dolphm, dstanek, rderose, htruta, atrmr, gagehugo, lamt, thinrichs, edmondsw, ruan, ayoung, ravelar, morgan, raj_singh, johnthetubaguy, knikolla16:00
knikollao/16:00
*** gagehugo has joined #openstack-meeting-cp16:00
* johnthetubaguy lurks16:00
lbragstad#link https://etherpad.openstack.org/p/keystone-policy-meeting16:00
lbragstadagenda ^16:00
gagehugoo/16:00
morgansorry, missing this one.16:01
lbragstadmorgan no worries - thanks for head sup16:01
lbragstadheads up, rather16:01
lbragstad#topic spec reviews16:02
*** openstack changes topic to "spec reviews (Meeting topic: policy)"16:02
lbragstad#link https://review.openstack.org/#/c/427872/ additional default policy roles spec16:03
lbragstad#link https://review.openstack.org/#/c/433037/ policy remove scope checks spec16:03
lbragstad#link https://review.openstack.org/#/c/452198/ RBAC in middleware spec16:03
lbragstadwe cancelled last weeks meeting due to several scheduling issues16:03
*** blancos has quit IRC16:03
lbragstadthe idea was to review ^ those over the week and talk about them here16:04
lbragstadlooks like there is still a bit of discussion going on the rbac in middleware approach16:04
lbragstadjohnthetubaguy ayoung is the main issue with https://review.openstack.org/#/c/427872/ the delegation use case?16:05
johnthetubaguyI am not sure its that simple16:06
lbragstadwhich I assume is "As an end user, i want the ability to discover which role is needed for a particular operation I want to delegate"16:06
johnthetubaguysee line 34616:06
johnthetubaguyin https://review.openstack.org/#/c/42787216:06
johnthetubaguyoops16:06
johnthetubaguyhttps://review.openstack.org/#/c/427872/19/specs/pike/approved/additional-default-policy-roles.rst16:06
johnthetubaguyI am working under the assumption policy is a per service concern16:07
*** rarcea has quit IRC16:07
lbragstadjohnthetubaguy aha - sure16:07
johnthetubaguythe current defaults mean thats no true16:07
lbragstadright16:07
johnthetubaguythat where this idea came from: https://review.openstack.org/45373916:08
johnthetubaguybut none of that gets us closer to delegation16:08
lbragstadyeah16:08
lbragstadthe actual act of delegating isn't too bad since that can be done with oauth or trusts16:09
lbragstadthe hard part is the inspection piece, finding out which role is needed to do a specific thing16:09
lbragstadwhich according to the NIST RBAC model is level 4 RBAC16:09
*** blancos has joined #openstack-meeting-cp16:09
johnthetubaguyso, API keys are probably more important than delegation16:09
johnthetubaguydo we have that work progress at all?16:09
lbragstadjohnthetubaguy there is a spec in review - but it hasn't been merged yet16:10
lbragstadjohnthetubaguy and as far as i know, there is no implementation up for review16:10
johnthetubaguyOK, wasn't sure on the status16:10
lbragstad#link https://review.openstack.org/#/c/450415/16:10
johnthetubaguyI think for me, this is all a question of priorities16:10
lbragstadsure16:10
johnthetubaguyand how we get people productive quickly16:10
johnthetubaguy(and how we keep things simple)16:11
lbragstadi find that to be paramount16:11
lbragstadbecause this is going to be a long running effort16:11
johnthetubaguymy current thinking is an API key to a project that might be a sub project, is maybe good enough for Trove "delegation" and "protection"16:11
johnthetubaguyif we get hierarchical quota sorted16:12
lbragstadjohnthetubaguy you mean by scoping the api key to a specific role?16:12
johnthetubaguynot really, specific to a project, on behalf of a user and all their roles16:13
johnthetubaguyI am still thinking things through really16:13
johnthetubaguythe main thing is trying to get the problem statement straight16:14
johnthetubaguynot sure I have got there yet either16:14
johnthetubaguyattempted it in here: https://review.openstack.org/#/c/45562916:14
johnthetubaguyso going back to my spec16:14
johnthetubaguythis one: https://review.openstack.org/#/c/42787216:14
johnthetubaguythe main issue I find with alternatives is a lack of smooth transition of the operators16:14
johnthetubaguythis seems a nice step wise evolution16:15
johnthetubaguyit doesn't fix all the problems folks have, but it does seem to make quite a few operators lives easier16:15
lbragstadfwiw - i attempted to graph that approach16:15
lbragstad#link https://github.com/lbragstad/orbac16:15
johnthetubaguyhopefully we can find a way to get feedback on the relative approach to these things16:15
johnthetubaguyI mean priority, not approach16:15
johnthetubaguyI remember taking a look at that16:16
lbragstadwell - introducing more roles is something we can do today16:16
johnthetubaguyI wasn't really sure about the contstraints16:16
johnthetubaguylbragstad: I am being told we can't add new roles, even though thats what all the operators are doing today16:16
johnthetubaguyat least, it feels like thats what is being said16:17
lbragstadthe ability to figure out which role is needed for a particular action doesn't exist at all - we'd need to build something to do that16:17
lbragstadjohnthetubaguy i'm unsure why we can't do that16:17
johnthetubaguywell, we have docs for some of that now16:17
johnthetubaguylbragstad: i think its the security concern I linked to16:17
johnthetubaguyother than that, I am lost16:17
lbragstadoh - where any role on a project allows a person to do things outside that role ?16:18
lbragstadi.e. i have the observer role on a project but that doesn't stop me from creating instances16:18
johnthetubaguyyeah16:18
johnthetubaguybasically16:18
lbragstadgot it16:18
lbragstadso - correct me if I'm wrong16:19
johnthetubaguyhence my suggestion of https://review.openstack.org/45373916:19
lbragstadbut doesn't the service have all theinformation to enforce that today?16:19
*** edmondsw has joined #openstack-meeting-cp16:19
johnthetubaguyIts not really that16:19
johnthetubaguytoday if you are in a project, you get access to everything by default16:19
johnthetubaguyif every service did some sort of role check, we would be fine16:20
johnthetubaguyit has access to all that info, we just have a very unhelpful default16:20
johnthetubaguy... so lets take a step down what I proposed in my spec16:20
*** rarcea has joined #openstack-meeting-cp16:20
johnthetubaguybasically have a transitional release, where you log warnings if people don't have the required role, but still give people access by default16:20
johnthetubaguyoperator can override their policy rule to opt into the new behaviour sooner, if they want that16:21
johnthetubaguynot sure if that makes any sense out of context16:21
lbragstadthis would assume they have other roles in place besides 'admin'16:21
johnthetubaguyits all about giving the operator help and time to apply the extra roles that are needed16:22
johnthetubaguyif the just use "Member" role for everyone already, it might just be add some implied roles16:22
lbragstadsomething about this feels like a circular dependency16:22
johnthetubaguycircular?16:23
johnthetubaguyits more there is a transition phase for a cycle where there is pain but little gain16:23
lbragstadlike - we can't add new roles without changing each project to be deny-all by default, but we can't be deny-all by default without giving operators more roles to use instead of just 'admin'16:23
johnthetubaguyrelease N, everyone has access by default16:23
dstanekwhoa...not many in here today16:23
johnthetubaguyrelease N+1, people with new role get access, but everyone also gets access but trigger a log message16:24
johnthetubaguyrelease N+2, only people with new role get access16:24
johnthetubaguyI think thats my rough proposal16:24
lbragstadjohnthetubaguy doesn't the require https://review.openstack.org/#/c/427872/ to land before N+1?16:25
lbragstadthat's what it sounds like to me16:25
lbragstads/the/that/16:25
johnthetubaguynot really16:25
lbragstador is it suppose to happen during N+1's cycle?16:25
johnthetubaguyright, that is about N+116:26
lbragstadwe just have to be able to provide better roles by N+2 is what i'm hearing then16:26
johnthetubaguyideally you would also do https://review.openstack.org/453739 at the same time16:26
johnthetubaguyright, you have a transition16:26
johnthetubaguyyou have a release of nothing is better, to help people transition16:26
dstanekjohnthetubaguy: how granular do you think roles will go?16:27
lbragstadso - by the time N+2 rolls around, operators should have a bunch of new roles that they can assign to people that correct part of the issue because each service should now be deny-all by default16:27
*** lamt has joined #openstack-meeting-cp16:27
johnthetubaguydstanek: initially, I am just talking about getting to no access by default16:27
johnthetubaguydstanek: read, read/write, admin seems a sensible split to add in any first pass16:28
johnthetubaguylbragstad: they can assign them during N+116:28
lbragstadjohnthetubaguy so when they upgrade to N+2 users shouldn't notice any sort of breakage16:29
johnthetubaguylbragstad: rather, they have to assign the roles to the existing users during N+1, so everything works after upgrading to N+216:29
johnthetubaguylbragstad: thats it, yeah16:29
dstanekjohnthetubaguy: do you plan to go as deep as vm_rebooter, catalog_endpoint_changer, etc?16:29
lbragstadok - that makes sense16:29
johnthetubaguydstanek: I am trying to ignore all that for now, just get to a happy place where such things are possible16:29
johnthetubaguydstanek: we give operators the ability to create all of those, but its not in the default, basically16:30
lbragstadjohnthetubaguy is that going to pan out with interoperability though?16:30
dstanekjohnthetubaguy: i'm trying to figure out the end goal of all of this.16:30
johnthetubaguylbragstad: which bit?16:30
lbragstadjohnthetubaguy one deployment implements reader and another implements observer, for example16:31
dstanekand then i want to poke at it for potentially how it might work16:31
johnthetubaguydstanek: the end goal I am taking about here, is letting users modify policy without breaking everything16:31
johnthetubaguylbragstad: ah, thats where the capabilities API comes into play slightly16:31
lbragstaddstanek the big thing i think we're talking about here, right now, is making it so that if you have a role on the project you don't access to all the things16:31
johnthetubaguylbragstad: at least we have standard error codes for permission denied due to policy16:32
lbragstaddstanek (i.e. I have the 'observer' role on project 'Foo' but that doesn't actually stop me from launching instance)16:32
johnthetubaguylbragstad: true, thats the big one16:32
dstaneklbragstad: sure, i'm trying to see who it fits in the bigger picture (assuming that we have one)16:32
johnthetubaguyI am thinking really small here, on purpose16:32
johnthetubaguylets get stuff into a state where folks can innovate and tell us what is best to have as upstream defaults16:33
lbragstadjohnthetubaguy is it fair to say that the main thing we're discussing here is closing that security hole?16:33
johnthetubaguyyeah, I think it probably is16:33
ayoungWhoa...I need to read up....16:33
johnthetubaguybut fixing that allows folks to "understand" policy I guess16:33
lbragstaddstanek do you think that sounds like a fair starting point, or do we need to back up further?16:34
ayoung" I am working under the assumption policy is a per service concern"  very no.   ...more as I catch up16:34
ayoungthe only way that could be true is if a token were issued for a specific service, and invalid for other services16:35
johnthetubaguyayoung: I think that was me saying "I was"16:35
ayoungjohnthetubaguy, ah16:35
ayoungcool16:35
ayoungjohnthetubaguy, so you no longer see it like that, I take it?16:35
johnthetubaguyayoung: yes, but probably not in the way you want to me to16:36
ayoungjohnthetubaguy, that is ok, it took me a long time to get to where I am in my opinions.  THe fact that you are following me at least thus far is, frankly, more than most people16:37
ayoungjohnthetubaguy, lets start with the term delegation.  To me, Keystone is a Delegation service, not an identity service16:38
dstaneklbragstad: it sounds like a good middle step....but i'm curious to know what the vision is.... some of ayoung's proposals have high level thoughts on where we should be heading16:38
ayounga token is a way of saying "I need a delegation agreement so some service can do something on my behalf"16:38
johnthetubaguyayoung: yeah, thats fair, especially in the LDAP case16:38
lbragstaddstanek ++16:39
ayoungso, delegation is a way to make operations scale16:39
ayoungif I have to do everything manually myself, I can only handle so much16:39
dstaneki can't formulate an opinion on whether or not we are on the right path if we don't have a concrete destination (like Seatle) or even a general location (like Southern Cal)16:39
ayoungIf I can get some other service to do stuff for me with my resources, I can get more done16:40
johnthetubaguyayoung: +1 that, the hierarchical quota stuff is all about exactly that16:40
ayoungso, a role in Openstack is a label that maps to "permission to perform a set of operations"  for a specific scope.  I'll use the term project for scope, as only Keystone uses domains16:41
ayoungSomeone was thinking this way all-the-way-back to the pre-Keystonelight  code base16:41
ayoungcuz termie pulled in "role is on a tenant" even back then16:42
ayounghowever, they coded as if roles were global16:42
ayoungthus, admin everywhere16:42
ayoungthe only role they actually knew about16:42
johnthetubaguyyeah, role is for a given user on a particular project scope16:42
ayoungSo, that is the first thing to fix.  Bug 96869616:43
openstackbug 968696 in OpenStack Identity (keystone) ""admin"-ness not properly scoped" [High,In progress] https://launchpad.net/bugs/968696 - Assigned to Adam Young (ayoung)16:43
johnthetubaguythats fair, I think thats the spec I am pushing in Nova to get merged, effectively16:43
ayoungjohnthetubaguy, I have a patch for it16:43
lbragstadhttps://chickenfriedbuffalo.files.wordpress.com/2014/03/keystone-light-keith-stone1.jpg16:43
johnthetubaguyayoung: yeah, I need to go look at that again now16:44
ayounghttps://review.openstack.org/#/c/384148/16:44
ayoungjohnthetubaguy, and getting that patch and fix through is what convinced me that, if we depend on getting a change through all the services, we are sunk16:44
johnthetubaguythe problem there is not one really understands that patch or policy16:45
ayoungjohnthetubaguy, the situation in the keystone code base is actually worse16:45
*** david-lyle has joined #openstack-meeting-cp16:45
ayoungI have 2 patches as a pre-req to the Keystone one, and they are both, once again, in need of a rebase16:45
ayoungAnd, let me be clear, I consider this a CVE level security hole.16:45
ayoungTHe only reason it is not a CVE is that everyone knows about it16:45
johnthetubaguywell, for some, its a feature16:46
ayoungbut I really would like it if the entire OpenStack community were to treat that as if the house were on fire16:46
ayoungOK, so, next step16:46
ayoungdelegation16:46
johnthetubaguyso... I think we are skipping a bit16:46
johnthetubaguytoday people modify policy.json to give people subsets of stuff16:47
ayoungI got my first lesson on Delegation when the Heat people asked me about it ... in Dublin, so, it must have been 4 years ago16:47
*** rarcea has quit IRC16:47
ayoungThe Trust API was my first attempt at it, and it has stood up, meh, over time16:47
ayoungbut a trust is a delegation agreement16:47
ayoungas is a role assignment, when you think about it16:48
ayoungand we did think about it16:48
ayoungand thus, the unified delegation effort...16:48
ayoungwhich I can link to16:48
ayoungThere is a commonality to my rantings here16:48
ayoungthey all are driven off the same core principals16:48
ayoung"delegate the minimal amount to perform the operation"16:49
ayoungleast principal16:49
ayounger16:49
lbragstadPofLP16:49
ayoungleast privilege principal16:49
ayoungyep16:49
ayoungPronounce PoffUlp, I believe16:49
johnthetubaguyright, its something that gets most people nodding, the problem we have is usability and transitioning to it16:50
ayoungright16:50
ayoungvery right16:50
ayoungand transition is ultra important16:50
lbragstad10 minutes remaining16:50
ayoungwe can't break the existing way of doing things16:50
ayoungok...this is why I want to do this in a video conf...16:50
lbragstad*without* a transition period16:50
ayoungtoo much to say, and hard to do on IRC16:50
lbragstadayoung you're doing well16:51
ayoungso....can we agree to video conf next week?16:51
johnthetubaguyayoung: +116:51
lbragstadyes16:51
johnthetubaguythat +1 actually applies to its hard to do on IRC, and lets do a video conf next week16:51
ayoungjohnthetubaguy, would love to have you there.  Probably the most important person, right now, as you are the nova person taking point on this16:51
lbragstadjohnthetubaguy dstanek gagehugo lamt ayoung knikolla have all confirmed attendance16:51
ayoungexcellent16:51
ayoungI'll try to be organized and concise, so I don't take too much time, and we can have a decent discussion16:52
lbragstadwhich is under 10, which means we can use Google Hangouts16:52
johnthetubaguyactually, what about this slot next week?16:52
johnthetubaguyto keep it simple16:52
lbragstadyep16:52
ayoungjohnthetubaguy, btw, some other related efforts you should know about16:52
knikollaworks for me16:52
lbragstadthat's what ayoung suggested in the thread16:52
ayoung1.  "Request a token with a specific role"16:52
johnthetubaguyah, I missed that bit16:52
edmondswI will try to make it if someone will send me the information16:53
ayoungthis is the idea that, when I ask Nova to reboot a VM, I get a token that can only do that16:53
lbragstadedmondsw ++ i'll add you to the thread16:53
lbragstadedmondsw want to ping me your preferred email?16:53
ayounghttps://review.openstack.org/#/c/186979/16:53
ayoungjohnthetubaguy, the trove example you brought up is a superb starting point16:53
johnthetubaguydo we want to talk API Keys16:54
johnthetubaguyI think thats very relevant here16:54
ayoungif you think of Trove, Sahara, or anything else that makes use of existing OS services as a semi-trusted third-party resource, it makes a lot of sense16:54
ayoungjohnthetubaguy, an API key, as I see it, is 2 things16:54
ayoung1. An identity16:54
johnthetubaguyayoung: +1 the trove statement16:54
ayoung2. a delegation agreement16:54
*** edtubill has joined #openstack-meeting-cp16:55
lbragstadquick note before we end the meeting - i'd like to have some idea of the goals we want to accomplish next week16:55
ayoungthey really are a way to do lightweight user-like objects16:55
ayounglbragstad, should we use the etherpad to frame the agenda?16:55
lbragstadi just don't want to get lost in conversation without working towards something16:55
lbragstadayoung yeah - that's eventually what I was going to do16:56
ayounglink?16:56
* lbragstad #link https://etherpad.openstack.org/p/policy-chat-session-one16:56
lbragstadlet's keep the goals short - since we've only got an hour16:56
*** edtubill has quit IRC16:56
lbragstadI want to make sure we come out of the meeting with something accomplished, and having known goals before hand should help us with that16:57
johnthetubaguyso... there is an interesting option about a release goal for queens16:58
johnthetubaguysome quick fixes projects can do in a single cycle, so we are less... broken16:58
johnthetubaguyhow could that get packaged into a release goal for queens16:59
ayoungjohnthetubaguy, analogs of Bug 96869616:59
openstackbug 968696 in OpenStack Identity (keystone) ""admin"-ness not properly scoped" [High,In progress] https://launchpad.net/bugs/968696 - Assigned to Adam Young (ayoung)16:59
ayoungcheck is_admin_project in policy for every project16:59
lbragstadi like the idea of using release goals to encourage adoption of what we end up moving towards16:59
edmondsw++16:59
ayoungGet someone to take that per project and run it through to completion16:59
johnthetubaguyayoung: yeah, I think closed by default as well17:00
lbragstadjohnthetubaguy ++17:00
johnthetubaguywell, all the projects have to commit or not, basically17:00
*** rarcea has joined #openstack-meeting-cp17:00
johnthetubaguyideally a few projects have examples, maybe just WIP, to frame the discussion17:00
lbragstadalright - we're out of time17:00
lbragstadwe can spill over into -keystone or -dev17:00
johnthetubaguydoh, yep17:00
lbragstad-dev?17:00
lbragstad#endmeeting17:01
*** openstack changes topic to "OpenStack Meetings || https://wiki.openstack.org/wiki/Meetings"17:01
openstackMeeting ended Wed Apr 12 17:01:09 2017 UTC.  Information about MeetBot at http://wiki.debian.org/MeetBot . (v 0.1.4)17:01
openstackMinutes:        http://eavesdrop.openstack.org/meetings/policy/2017/policy.2017-04-12-16.00.html17:01
openstackMinutes (text): http://eavesdrop.openstack.org/meetings/policy/2017/policy.2017-04-12-16.00.txt17:01
openstackLog:            http://eavesdrop.openstack.org/meetings/policy/2017/policy.2017-04-12-16.00.log.html17:01
*** blancos has quit IRC17:01
*** gagehugo has left #openstack-meeting-cp17:01
*** lamt has quit IRC17:17
*** rarcea has quit IRC17:43
*** edtubill has joined #openstack-meeting-cp18:04
*** lamt has joined #openstack-meeting-cp18:14
*** ayoung has quit IRC18:31
*** edtubill has quit IRC18:46
*** beekhof has quit IRC19:19
*** lamt has quit IRC19:22
*** lamt has joined #openstack-meeting-cp20:03
*** ayoung has joined #openstack-meeting-cp20:26
*** MarkBaker has quit IRC20:38
*** MarkBaker has joined #openstack-meeting-cp20:50
*** sdague has quit IRC21:07
*** gouthamr has quit IRC21:21
*** edmondsw has quit IRC21:33
*** Qiming has quit IRC21:41
*** Qiming has joined #openstack-meeting-cp21:46
*** lamt has quit IRC21:59
*** lamt has joined #openstack-meeting-cp22:04
*** ayoung has quit IRC22:34
*** lamt has quit IRC22:47
*** aselius has quit IRC22:54
*** lamt has joined #openstack-meeting-cp22:59
*** lamt has quit IRC23:08
*** lamt has joined #openstack-meeting-cp23:12
*** lamt has quit IRC23:12
*** lamt has joined #openstack-meeting-cp23:13
*** lamt has quit IRC23:13
*** lamt has joined #openstack-meeting-cp23:14
*** lamt has quit IRC23:15
*** knangia has quit IRC23:21

Generated by irclog2html.py 2.14.0 by Marius Gedminas - find it at mg.pov.lt!