@lyse@lyse.isobeef.org the siting lady reads this?
Gestiftet von
Hildegard Schünar
Gesellschafterin
der Schwarz-Gruppe
Firma Wüst's
Anni
Or it is something else? Awesome pics, Lyse! Some oldies I missed (the lady), and some pretty cool new ones. I canāt get enough of nature pics!
Got my daily āsummerdoroā ( walk during the summertime, admiring nature, meditating ) in before the rains started.
tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt's cache. This is rather tidious:
Now Iām curious how movwin deals with that. ;-)
Focus handling? I hardly remember, lol. š Did that 6 months ago and havenāt touched it since. Letās see.
The core main loop gets keyboard/mouse events from curses. At this level, the main loop only knows about exactly one widget, so it passes the event to that widget (whatever that is, doesnāt matter ā they all inherit from the Widget base class, it could be a Window, a WindowManager, or an Edit box directly).
The outermost widget is usually a WindowManager. It implements a few hotkeys of its own, like switching to another window. If none of those hotkeys match, it passes the event to the currently focused window.
Same story here: Window implements some hotkeys (like opening the menu bar). If none of those match, then ⦠the magic happens.
Each Window acts as a focus manager. It can descend into its child widget hierarchy and collect all child widgets in a depth-first search. They are collected into a flat list. Each Window then has an attribute _focus_position, which is an index into that list. Pressing Tab or Shift+Tab increases or decreases that index and that allows you to select the next/previous focusable widget in the current window.
Eventually, Window passes the input event to the currently focused widget.
Usually on initialization, the application can ask a Window object to focus a certain widget. The file selection dialog does that, for example, because the ānaturalā focus order would be to focus the Edit box at the top of the window first ā but thatās not what the user wants, the Table showing the list of files should be focused.
If no widget ever feels responsible for handling a certain input event, then thereās a global unhandled_input callback that the application can provide (same as in urwid).
I think thatās it.
Hm, thatās more complicated than I remembered, but apparently it works fine, because I completely forgot about this. š
All I did in the last few months was make new classes that inherit from Widget, like the new Table class or Edit or HexEdit or whatever, and if they want to get input events, then they must implement the methods input_key() or input_mouse().
Does this answer your question? š (I admit that I didnāt exactly understand your scenario, so I just went ahead and rambled about my implementation. š )
tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt's cache. This is rather tidious:
Getting the vim key bindings to work for focus switching in this modal dialog took me forever. Only cursors and (Shift+)Tab are supported out of the box. I absolutely understand that, itās fine. I installed an input handler on the dialog, but the focus always stayed the same.
After two wasted hours, I was in despair to copy the tview.Modal into my own code base. Of course, I had to fix all the private tview field accesses first. But even installing the input handler directly on the buttons themselves did not work. Even though, the handler was definitely executed, the focus did not shift. Forcing redraws as a last resort also did not work.
Looking through all the messy chained input handling, I eventually stumbled across another place in the tview.Form, which is internally used by tview.Modal. This messed around with app focus receptions and input handlers. This gave me the idea to make the tview.Application refocus my modal dialog after I told the modal dialog which button to select. And would you look at that, this did the trick! I havenāt completely figured out what is going on exactly, but I could get rid of my Modal clone again.
I always go through hell with focus handling in tview. Each and every time. It just does not feel natural to me. Complete brainfuck to wrap my head around. The Urwid API felt sooo much more refined, it never was an issue. It just works. In fact, I cannot think of any other TUI library that has remotely the same pain level when it comes to focusing widgets as tview.
Now Iām curious how movwin deals with that. ;-)
@lyse@lyse.isobeef.org Nature is cruel.
And the humidity sucks. Itās been a horrible day. š„“
Itās one of the reasons in fact Iāve been working on bob so I have a very concrete and strong foundation for how these things work, how they behave and how bad or good they can be. I am on-purpose building bob to be not only a decent coding tool and general task completion tool, but with serious security boundaries, sanitation, auditing and compliance. If Iām going to succeed at building autoonmous agents that can cope with a wider array of varying inputs (mostly natural language, some structural language) then it needs to be both a) Safe and b) Robust
@prologic@twtxt.net Ahh, I see. Okay, Iām with you there. On this high level, I can understand how the thing works.
Maybe my wording isnāt good. š¤ Letās take a real life example from what we do at work.
Thereās this AI chatbot. It gets support requests from users, so the user says something like āI need access to a particular systemā. This triggers the bot to ārunā the instructions stored in a large Markdown file, like ācheck if the user is authorized to do this, then issue the following API requestsā, and so on. This is essentially like running a little script, except itās written in natural language (German) and thereās no āscript interpreterā but just the AI.
Now, suppose that the AI doesnāt quite do what was intended. Thereās some subtle bug. How do you debug this? How do you find out how the AI came to the āconclusionā to run step A instead of step B? And how do you find out how exactly you have to change your prompt so this doesnāt happen again next time?
If this was an actual script/program instead of AI, you could repeat the request and attach a debugger or throw in some printf() or whatever. How do you do that kind of thing with AI? How do you pinpoint exactly what the problem was?
(Or is this just a stupid idea? Do we have to give up that way of thinking when using AI? Is the era of debuggability over?)
Of course, @movq@www.uninformativ.de! Most of my points are also included in your list.
First of all, programming is what I really do enjoy the most. So, it doesnāt make any sense at all to not do this anymore. āBut you could use your now free time to do something much cooler and more valuable!ā, others might reply. Fuck no, I donāt want to waste my time with other shit that doesnāt fulfill me, why on earth would I want to do that?
All this hallucination reduces quality badly. In my experience, itās also happening much more rapidly than I expected. Even though developers are still supposed to own and understand whatever has been generated under their name and even be responsible for that, the sad reality is that teammates often blindly trust the AI output. āBut I asked the AI and it told me that $this was impossibleā, āIāve no idea either, but the AI just generated itā are responses I get more often. What really makes my angry is when I point out a flaw and suggest an alternative and this is the reaction. It happened several times that just trying it out and seeing it clearly work to proof my point only took me half a minute, but people still did something handwavy else instead.
The learning effect is drastically reduced. The more time I spend on a topic, the better the odds that whatever I learned actually makes it over into long-term memory. Itās like if a collegue just says ādo it like thatā or āthis solves your problemā, but neither explains the why or how. Somehow, people are still convinced that itās a completely different story when you replace the human counterpart with a computer program in this equation.
Skills are unlearned. Itās like with automation in general, just much worse. You end up in a state where youāve no clue how anything works under the hood or how to actually find out important information that are needed to solve your problem. Youāre screwed when a process breaks out of the blue. Even though it can become also rather terrible, with classical automation youāre typically still be able to decipher how exactly the thing was supposed to do something.
The energy consumption is sooo high, I absolutely do not want to be a part in burning down our planet. Iām sure I find (and probably have long found without knowing) other ways to contribute to worsen our climate crisis.
The scraper part is already covered in detail in your list. :-)
Iām convinced that license and copyright violations are only played down or even refused entirely because companies want to make big money quickly. With the work of others of course. Their double standards are obvious, they still try to actively keep their own stuff secret and out of any training sets. At most for internal use only. Virtually noone in charge is interested in good long-term solutions. Short-term for the win, when disaster eventually strikes, the causers are long gone, the responsibilities in other hands.
Vendor lock-in is something that lots of folks are only realizing very slowly. Itās completely crazy to me. This drug dealer routine should be well-known by now. Itās fucking everywhere. Yet, people are always surprised when they found themselves caught in it.
Adding new AI stuff only increases complexity. But complexity is the enemy that everybody should fear and reduce as much as possible. Of course, this is not limited to AI at all. And everywhere I look around, people in charge looooove to make things way more complicated than they ever need to be. Yet, simplicity is the real art and much harder to achieve.
I donāt understand why we have to go back full force to the ambiguity of natural languages. This alone should be more than enough to realize what a stupid idea all that is. Linked to that is that the āinstruction setā is interpreted differently with newer model versions. I mean, is has to be. Why else would somebody want to upgrade in the first place than to get more Powerful⢠Featuresā¢?
Some people argue that with AI the democratization is empowered. However, in my view, the exact opposite is the case. Models are getting so large that you can basically not run them locally or even train them. So, you have to rely on whatever the vendor offers you and runs for you. In the end, this only gives the owners more power, the multi billionaires. Not exactly what I understand by democratization.
Finally, technology assessments are missing completely. Or they are faked such that mostly only the (questionable) benefits are listed. But all the negative impact is just ignored.
Letās keep some popcorn around for when this all explodes. :-)
@bender@twtxt.net I believe itās been money well spent if Iām to be honest. Itās a great āget awayā and āadventureā for not just myself but the family too. Getting away from it all, experiencing nature and what this wonderful country has to offer is pretty nice š As long as we keep up the adventures over the long time, use it several times a year, it will be very well wroth the investment š
@prologic@twtxt.net Oh, lol, itās literally called that: https://www.queensland.com/au/en/places-to-see/experiences/nature-and-wildlife/everything-to-know-about-natural-bridge š
Natural Bridge

I completely forgot, I saw my very first badger in the wild the day before yesterday. :-) That was absolutely cool! <3
I heard something comparatively large rustling in the bush right next to me and thought that it must be dear. Naturally, I stopped and tried to see whatās in there. The rustling went up the bank and it suddenly came down again towards the road I was on. Thatās when I first layed eyes on it and identified it as a badger. For a split second I thought that itās going to get after me and was ready to get running. But it just hadnāt noticed me yet. When it eventually spotted me, it froze for a few seconds and ran off uphill. My camera took too long to boot, so it was already gone by the time the photo machine was good to go.
Another AI rant:
One of the ākey featuresā of LLMs is that you can use ānatural languageā, because that is supposed to be easier than having to learn a programming language. So, when someone says to me, āI automated this process using AI!ā, what they mean is: They have written a very, very large Markdown document. In this document, they list what the AI is supposed to do.
In prose.
This is a complete disaster.
Programming and programming languages have one crucial property: They follow a well-defined structure and every word has a well-defined meaning. That is absolutely brilliant, because I can read this and I can follow the program in my head. I can build a mental model. I can debug this, down to the precise instructions that the CPU executes. This all follows well-defined patterns that you can reason about.
But with these Markdown files, I am completely lost. We lose all these important properties! No debugging, no reasoning about program flow, nothing. Itās all gone. Itās a magic black box now, literally randomized, that may or may not do what you wanted, in some order.
People now throw these Markdown files at me ⦠and ⦠am I supposed to read this? Why? Itās completely random and fuzzy.
Sadly, these AI tools are good enough to be able to mostly grasp the authors intentions. Hence people donāt see the harm they cause, because āit worksā.
We already have a ton of automations like this at work: Tickets get piped through an LLM and these Markdown files / prompts determine what will happen with the ticket, and maybe they trigger additional actions as well, like account creation or granting permissions. All based on fuzzy natural language ā that no two humans will ever properly agree on.
Jesus Christ, weāre now INTENTIONALLY bringing the ambiguity of legal texts and lawyers into programming.
Using natural language is NOT easier than using a programming language. It is HARDER. Have you people never read a legal contract? And that stuff can STILL be debated in a court room.
I canāt begin to comprehend why we, tech folks, push this so hard. What is wrong with you? Or me?
(And, once again, weāre ignoring other factors here. LLMs use a ton of energy and ressources, that we donāt have to spare. Itās expensive as fuck. It doesnāt even run locally on our servers, meaning we give all these credentials and permissions to some US company. Itās insane.)
@bender@twtxt.net Thanks! :-) Nature explodes everywhere at the moment, so pretty.
I called it quits a bit earlier and enjoyed the sunny 19°C blue sky in nature. I just sat an entire hour on a bench (12) near a habitat (07) and enjoyed the sun rays and singing birds around me. When I returned, the batteries were almost drained. The sunset finished them off, so that I could not record Azabacheās concert shortly after. However, I saw that amazing bird this morning and got him on film. Enjoy!
Everything changes, right? I know we sound like curmudgeons, and perhaps AI is the next step. We are living its early infancy, the struggles and dislikes, the errors and flaws, and generations after us will simply benefit from it, and see it as natural as my children see the Internet today (it isnāt natural to me, I was born way before it).
Or maybe AI isnāt the next step. Either way, whether we like it or not, there is truly absolutely nothing (or close to) we can do. Well, complain we can, of course. :-P
Saw Project Hail Mary at the cinema as planned. Not nearly as detailed as the book, naturally, but still very entertaining ā ā ā ā šæ
After making three crosses (state and mayoral election) my mate and I went into the wildernes. Well, nature at least. There are heaps of people out there, too. The 13°C (and still raising) are very nice. Iām drowing in sweat, though.
I built Audiofern to make it simple to turn PDFs into audiobooks. Upload a document, get clean, chapterized narration with natural voices, and share it via a hosted playerāor download M4A/M4B and keep it forever. Files are private by default, and pricing is transparent: pay once by audio hour or subscribe to build a listening library.
The only good thing about this absolute craziness is that I can restock my rocket sticks. I picked up twelve along the way. Unfortunately, it looks like 99.999% of ammunition is bombs instead of rockets. Some sections of my street look exactly like an arbitrary Pakistanian town that Iāve seen online.
There was surprisingly much snow in the woods. Also, all ponds have frozen over. I didnāt expect that. Not at all. There were even illegal ice skating tracks in the natural reserve. We came across a large puddle and it was at least 10cm solid ice to the ground. Crazy!
Hi everyone š
Iāve been experimenting with different creative tools recently, mostly around image and video editing, and I came across an interesting AI-based face editing website:
https://remakeface.ai/
What I found useful is that it focuses on realistic face replacement and quick previews, which can be handy for creative projects, short videos, or just experimenting with ideas before doing more detailed work elsewhere.
Iām curious if anyone here has tried similar tools or has recommendations for AI-assisted image or face editing that feels natural rather than overly artificial. Always interested in learning what others in the community are using or testing lately.
Looking forward to your thoughts š
i like the plain text nature of gopher, makes for a very lightweight informations system
I had no meetings this arvo, so I made an appointment with the woods in my extended lunch break. The 6°C warm sun was out all day long and there was only a very light breeze. So, a very nice autumn day.
When I stopped to take a photo in the forest, a deer behind me took off into the woodland. I didnāt see it before. Also, I came across one or the other clearing. Sadly, itās all commercial timberland here. Luckily, in a year or so, when nature slowly took over and reclaimed some spots, the apocalyptic sites are then looking a bit more decent again.
Cleaning of the ruin walls on my backyard mountain slowly takes shape. They made some progress and moved on to the other section. The flag on top is halfway disintegrated again, all the yellow half is completely gone. Iām wondering if they just stop replacing it at some point in time. But probably not.
@prologic@twtxt.net yeah, all eggs in one basket has never been a sensible approach. Sadly, even without that, this outage is affecting many due to the interconnected nature of services these days.
Welcome to the party, @threatcat@tilde.club! I reckon itās totally fine what youāre doing. Over time, message counts naturally drop anyway. :-D And this is fine, too.
@movq@www.uninformativ.de Gemini liked your opinion very much. Here is how it countered:
1. The User Perspective (Untrustworthiness)The criticism of AI as untrustworthy is a problem of misapplication, not capability.
- AI as a Force Multiplier: AI should be treated as a high-speed drafting and brainstorming tool, not an authority. For experts, it offers an immense speed gain, shifting the work from slow manual creation to fast critical editing and verification.
- The Rise of AI Literacy: Users must develop a new skillāAI literacyāto critically evaluate and verify AIās probabilistic output. This skill, along with improving citation features in AI tools, mitigates the āgaslightingā effect.
The fear of skill loss is based on a misunderstanding of how technology changes the nature of work; itās skill evolution, not erosion.
- Shifting Focus to High-Level Skills: Just as the calculator shifted focus from manual math to complex problem-solving, AI shifts the focus from writing boilerplate code to architectural design and prompt engineering. It handles repetitive tasks, freeing humans for creative and complex challenges.
- Accessibility and Empowerment: AI serves as a powerful democratizing tool, offering personalized tutoring and automation to people who lack deep expertise. While dependency is a risk, this accessibility empowers a wider segment of the population previously limited by skill barriers.
The legal and technical flaws are issues of governance and ethical practice, not reasons to reject the core technology.
- Need for Better Bot Governance: Destructive scraping is a failure of ethical web behavior and can be solved with better bot identification, rate limits, and protocols (like enhanced
robots.txt). The solution is to demand digital citizenship from AI companies, not to stop AI development.
@movq@www.uninformativ.de Donāt you worry, this was meant as a joke. :-D
There was a time when I thought that Swing was actually really good. But having done some Qt/KDE later, I realized how much better that was. That were the late KDE 3 and early KDE 4 days, though. Not sure how it is today. But back then it felt Trolltech and the KDE folks put a hell lot more thought into their stuff. I was pleasantly surprised how natural it appeared and all the bits played together. Sure, there were the odd ends, but the overall design was a lot better in my opinion.
To be fair, I never used it from C++, always the Python bindings, which were considerably more comfortable (just alone the possibility to specify most attributes right away as kwargs in the constructor instead of calling tons of setters). And QtJambi, the Java binding, was also relatively nice. I never did a real project though, just played around with the latter.
@movq@www.uninformativ.de LOL. I wish and hope they keep proposing it until the proposers die of natural causes, and then it vanishes. Hopeful thinking, I knowā¦
Each origin feed numbers new threads
(tno:N). Replies carry both (tno:N) and (ofeed:<origin-url>). Thread identity = (ofeed, tno).
@prologic@twtxt.net I think a counter in the client is not a good choice given the decentralized nature of twtxt, especially if someone use multiple cients together.
After thinking about it for a while I got to two solutions:
Proposal 1: Thread syntax (using subject)
Each post have an implicit and an optional explicit root reference:
Implicit (no action needed, all data required are already there)
- URL + timestamp
- URL + timestamp
Explicit (subject required)
- Identity (client generated)
- External reference
- Random value
- Identity (client generated)
We then add include a ārootā subject in each post for generating explicit theads:
1. `[ROOT_ID] (REPLY_ID)`: simpler with no need of prefixes
2. `(root:ROOT_ID) (reply:REPLY_ID)`: more complex but could allow expansions
- `(rt:ROOT_ID) (re:REPLY_ID)`: same but with a compact version
- `($ROOT_ID) (>REPLY_ID)`: same but with a single characters
Each post can have both references, like the current hash approach the reference can be treated as a simple string and donāt have a real meaning.
Using a custom reference this way allows a client to decide how to generate them:
- Identity: can be a content hash or signature or anything else, without enforcing how it is generated we can upgrade the algorithm/length freely
- External references: can be provided from another system (Eg.
7e073bd345, yarnsocial/yarn latest commit)
- Random value: like a UUID (Eg.
9a0c34ed-d11e-447e-9257-0a0f57ef6e07)
Proposal 2: Threaded mentions (featuring zvava)
Inspired by @zvava@twtxt.netās solution it could be simplified into: #<nick url#timestamp> or #<url#timestamp>
It can be shown like a mentions or hidden like a subject.
If weāre using thinking of using a counter in the client, I think thereās no point in avoiding the timestamp anymore.
@alexonit@twtxt.alessandrocutolo.it Personally, I find the reversed order of URL first and then timestamp more natural to reference something. Granted, URL last would be kinda consistent with the mention format. However, the timestamp doesnāt act as a link text or display text like in a mention, so, itās some different in my opinion. But yeah.
Only plebeians and shabbos goyim care about politics, however. Naturally, the Jews would want you to sperg out about Trump in a hipster-protocol chat.
@movq@www.uninformativ.de Holy shit, thatās insane! :-D I tried it, but iām absolutely terrible at these type of games. Iām having trouble with the keys to move around. Maybe after ages I would pick it up and it becomes natural. I just was never a real gamer.
I will definitely try to read through the code, though! This looks sick. 8-)
@movq@www.uninformativ.de Oh, nice read!
If Iām in the woods, Iād like to not waste my time with computers and focus on the beauty of nature. ;-) So, Iām not gonna participate in that event. But Iād read your articles on that subject anytime. :-)
Go 3 hours into nature and any mental disorder ceases.
Distrobox is pretty handy and kind of amazed I havenāt played with it before now. I wanted to quickly try out Protonās Authenticator they just released, but they only had binaries for Ubuntu and Fedora (naturally), but Iām on Void Linux on this laptop.
Installed the latest basic Fedora image with Distrobox, used dnf to install the downloaded rpm file within it, and presto, running the app within Void like Iād just downloaded it though the normal repos.
A mate visted me and we went on a few hours long hike. We came across a mythical creature in its natural habitat:

@bender@twtxt.net Both Gopher and Mastodon are a way for me to ābabbleā. š I basically shut down Gopher in favor of Mastodon/Fedi last year. But the Fediverse doesnāt really work for me. Itās too focused on people (I prefer topics) and I dislike the addictive nature of likes and boosts (Iām not disciplined enough to ignore them). Self-hosting some Fedi thing is also out of the question (the minimalistic daemons donāt really support following hashtags, which is a must-have for me).
Iāll probably keep reading Fedi stuff, I just wonāt post that much, I think.
i cannot stay awake with hungry, its the worst feeling in my nature
i cannot stay awake with hungry, its the worst feeling in my nature
@eapl.me@eapl.me I wouldnāt call it natural, it is the way Bluesky decided to handle handles (not meaning to make a pun, or anything). There is no other way, but that.
The bottomline is, there are agreed upon āstandardsā, right? From example, on Yarnd you show as āeapl.meā, from āeapl.meā. A kind of weird redundancy because on twtxt, ever since I started using it, one will expect to see a ānickā (equivalent to a personās first name), from āa domainā (like a surname).
There is nothing holding back someone from giving themselves the nick:
thisismyawesomenickforwhichiwillbeknownforeverandeveritsgreatisntit
But, do we really want that? š
.(s) / dot(s) like @eapl.me are valid? š¤ Or nicks even? š¤
on timeline the mention looks OK. Is there an issue on Yarn?
Itās an interesting topic. For example on Bsky itās natural to allow domains https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial
Although TwiXter only allows (letters A-Z, numbers 0-9 and of underscores)
https://help.x.com/en/managing-your-account/x-username-rules
@prologic@twtxt.net @movq@www.uninformativ.de @bmallred@staystrong.run @ionores@twtxt.net Thank you! Yeah, the yellow meadows look truly awesome.
Watching āHappy People: A Year in the Taigaā in German the evening before, this thing totally looked like a trap to us. So, we decided to sit on another, more rustic bench nearby. :-) Oh neat, it turns out, there is a much longer four part series of the documentary in English on YouTube. Highly recommended! This is part one: https://www.youtube.com/watch?v=fbhPIK-oBvA
Judging by the surroundings, I think this is actually a forest altar or something of that nature. But it looks like they started with the chappelās reinforcement steel and then they ran out of money before completing it or even placing the concrete forms. :-P
Yeah, 78 might be photo of the month. Itās one of my favorites.
@eapl.me@eapl.me When it is up and running, I promise to add it to the specification. I will also include some corrections.
The nature of twtxt does not allow us to selectively hide clients. Itās a problem not with DM, but with any extension.
@prologic@twtxt.net Yes, it is a security hole. All dm-echo messages are readable. I intend it to be a debugging tool. Maybe I can include a warning message. If many of you see that it is a serious problem, I can remove the links.
@xuu@txt.sour.is Itās already much better than Mastodon :P . Maybe we can remove the sender and receiver references with an intermediary register.
Another nice stroll in nature last week: https://lyse.isobeef.org/waldspaziergang-2025-04-03/

@thecanine@twtxt.net My apologies, mate! :-( As @david@collantes.us pointed out, this was definitely not my intent at all.
For the easter egg hunt, I first looked for a hidden image map link on the pixel dog in the right lower corner itself. Maybe one giant pixel just links to somewhere else, I figured. But I couldnāt find any and then quickly moved on. Hence, I naturally viewed the HTML source. Because where else would be a good hiding place for easter eggs, right?
Next, I noticed the <font> tags. I thought I had read quite some time ago that they are not an HTML5 thing, but wasnāt entirely sure about it. So, I asked the W3C HTML validator. Sure enough. I thought I let you know about the violations. If somebody had found a mistake on my site, Iād love to hear about it, so I could fix it. Iām sorry that my chosen form of report didnāt resonate with you all that well. I reckoned youāll also find it a bit funny, but I was clearly very wrong on that.
I actually followed the dog cow link to the video, so I ended up on the easter egg. However, I didnāt recognize it as such. ĀÆ_(ć)_/ĀÆ Oh well.
Regarding my message about the browser quirks: I read your answer that you were arguing against the HTML validator findings. Of course, everybody can do with their sites whatever they likes.