Compare commits
7
Commits
817a227309
...
85be71fe1a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85be71fe1a | ||
|
|
e63c2abff2 | ||
|
|
a9f3d013a7 | ||
|
|
881fce5023 | ||
|
|
38ca16bbca | ||
|
|
9d2565a8b4 | ||
|
|
1cf5a39acd |
+2
-2
@@ -64,9 +64,9 @@ According to the agent:
|
|||||||
|
|
||||||
It ends with a summary showing how to start the server (port 8056), demo credentials, and handy make commands.
|
It ends with a summary showing how to start the server (port 8056), demo credentials, and handy make commands.
|
||||||
|
|
||||||
The snippet below is from my performance widget. Token generation is not super fast, but all 32 turns ran while attending Chris Parsons’ webinar. 2.5 minutes for a script that ’just works’ is good enough for me.
|
The snippet below is from my performance widget. Token generation is not super fast, but all 32 turns ran while attending Chris Parsons' webinar. 2.5 minutes for a script that _just works_; is good enough for me.
|
||||||
|
|
||||||
📊 Performance: llama.cpp/Qwen3.6-35B-A3B-MXFP4<sub>MOE.gguf</sub>
|
📊 Performance: llama.cpp/Qwen3.6-35B-A3B-MXFP4-MOE.gguf
|
||||||
Prefill: 28,376 tokens @ 5253.8 tok/s
|
Prefill: 28,376 tokens @ 5253.8 tok/s
|
||||||
Generation: 5,699 tokens @ 38.8 tok/s
|
Generation: 5,699 tokens @ 38.8 tok/s
|
||||||
Combined: 34,075 tokens @ 223.5 tok/s (2.5m total)
|
Combined: 34,075 tokens @ 223.5 tok/s (2.5m total)
|
||||||
|
|||||||
+4
-2
@@ -13,7 +13,7 @@ In this case, we were discussing giving developers feedback on how they are runn
|
|||||||
|
|
||||||
QWEN 3.6 models are multi modal, but getting that to work requires an additional file and configuration in llama.cpp and enabling images in the Pi.dev models configuration.
|
QWEN 3.6 models are multi modal, but getting that to work requires an additional file and configuration in llama.cpp and enabling images in the Pi.dev models configuration.
|
||||||
|
|
||||||
In addition to the configuration I described in [My local ageentic dev setup two months ago](/blog/engineering/my-local-agentic-dev-setup-today), I had to download an 'mmproj' file and specify it in my llama.cpp run script. And then it was vision capable. I put the mmproj file in the directory with my scripts, as the name is somewhat generic, and I do not yet know if it is the same for other models, or specific for this one.
|
In addition to the configuration I described in [My local agentic dev setup two months ago](/blog/engineering/my-local-agentic-dev-setup-today), I had to download an 'mmproj' file and specify it in my llama.cpp run script. And then it was vision capable. I put the mmproj file in the directory with my scripts, as the name is somewhat generic, and I do not yet know if it is the same for other models, or specific for this one.
|
||||||
|
|
||||||
There are some more changes to the script since the last time, most notable `--spec-default` for 'speculative decoding' which gave a nice speed bump.
|
There are some more changes to the script since the last time, most notable `--spec-default` for 'speculative decoding' which gave a nice speed bump.
|
||||||
|
|
||||||
@@ -76,7 +76,9 @@ The results I found surprisingly good, as Jon sketched this during a conversatio
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Below you can see the part of the session where QWEN interpreted the image. I asked after that to make a mermaid diagram. The mermaid syntax was broken, so either a larger or more cohesive model might be needed, or feedback from running `mmdc` - the mer pppmaid command line.
|

|
||||||
|
|
||||||
|
Below you can see the part of the session where QWEN interpreted the image. I asked after that to make a mermaid diagram. The mermaid syntax was broken, so either a larger or more cohesive model might be needed, or feedback from running `mmdc` - the mermaid command line.
|
||||||
|
|
||||||
# Inline session transcript
|
# Inline session transcript
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>06-26-an-example-would-be-handy-right-now.html</title>
|
||||||
|
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8"/>
|
||||||
|
<link rel="stylesheet" type="text/css" media="all" href="https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css" />
|
||||||
|
<link rel="stylesheet" type="text/css" media="all" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/styles/github.min.css" /><meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'><style> body { box-sizing: border-box; max-width: 740px; width: 100%; margin: 40px auto; padding: 0 10px; } </style><script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script><script src='https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js'></script><script>document.addEventListener('DOMContentLoaded', () => { document.body.classList.add('markdown-body'); document.querySelectorAll('pre[lang] > code').forEach((code) => { code.classList.add(code.parentElement.lang); }); document.querySelectorAll('pre > code').forEach((code) => { hljs.highlightBlock(code); }); });</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h2 id="section">}</h2>
|
||||||
|
<p>Would I recommend Emacs as a writing environment? I don’t know. It
|
||||||
|
works for me, mostly thanks to org-roam. And after 5 years of <em>thou
|
||||||
|
shalt not lose weeks of configuring Emacs</em>, I am occasionally making
|
||||||
|
small tweaks.</p>
|
||||||
|
<p>Admittedly, these tweaks sometimes are things that <em>should just
|
||||||
|
work out of the box (TM)</em>. For instance, I can drag and drop an
|
||||||
|
image (on my mac, at least) in an org-mode file, and then I get to
|
||||||
|
choose how the image should be linked to the document. And then I can
|
||||||
|
see it.</p>
|
||||||
|
<p>But <em>of course</em> I mean <em>for some reason</em> this does not
|
||||||
|
work in markdown-mode. Luckily <a
|
||||||
|
href="https://oxal.org/blog/powerful-emacs-hacks-paste-images-markdown/">someone
|
||||||
|
else solved this problem before me.</a>. And found that markdown mode is
|
||||||
|
extensible in how it looks for files.</p>
|
||||||
|
<p>But what does this have to do with shaving yaks, you wonder? Well, I
|
||||||
|
was annoyed that I could not drag and drop images, displaying images was
|
||||||
|
something the author figured out first, and used as part of a solution
|
||||||
|
in dropping images.</p>
|
||||||
|
<p>I have been muddling through, and was reminded I have that problem
|
||||||
|
too. But then I was stuck. I hate thinking about paths on my computer.
|
||||||
|
And for some silly reason, I made this blog in the same way as Jekyll
|
||||||
|
and other static site generators - the images are nowhere near the blog
|
||||||
|
posts. I should fix that, but not on a hot friday when I’m recovering
|
||||||
|
from successful, but intensive, new work.</p>
|
||||||
|
<p><a
|
||||||
|
href="https://oxal.org/blog/powerful-emacs-hacks-image-markdown/">This
|
||||||
|
post helpfully explains how to find the right function, and what to
|
||||||
|
do</a>. And I have a link to an image <a
|
||||||
|
href="https://willemvandenende.com/blog/engineering/enabling-a-local-model-to-explain-images-in-pidev">in
|
||||||
|
my previous post</a> that will of course not show in
|
||||||
|
<code>markdown-mode</code>. Staring at the screen for a while, it hit
|
||||||
|
me.</p>
|
||||||
|
<p>## An example would be handy right about now</p>
|
||||||
|
<p>So I copied the image link, had a look at my directory structure,
|
||||||
|
enabled images (yes, that is disabled by default. I guess a
|
||||||
|
distraction-free writing environment requires the purity of no man-made
|
||||||
|
images). And then still saw nothing, because I forgot the
|
||||||
|
<code>static</code> part of the path. But this was quick iteration, no
|
||||||
|
code or tests were harmed in the making of this example:</p>
|
||||||
|
<pre><code>
|
||||||
|
|
||||||
|
</code></pre>
|
||||||
|
<p>Now I can go back to the joy of copy-paste-modifying the code from
|
||||||
|
the blogpost with my very own path.</p>
|
||||||
|
<h2 id="a-test-would-be-handy-right-about-now">A test would be handy
|
||||||
|
right about now</h2>
|
||||||
|
<p>I figured I could hack this path <em>only</em> for my blog, and use a
|
||||||
|
local configuration. After copy-pasting the code, it was time, for,
|
||||||
|
<em>le sigh</em> <em>modify</em>. I could let my animatronic rubber duck
|
||||||
|
do it, but I have decided to better understand my emacs mods, so doing
|
||||||
|
it by hand today.</p>
|
||||||
|
<p>There is a <code>substring</code> call that I don’t need - my example
|
||||||
|
shows that blog post and images are both under <code>priv</code>. So I
|
||||||
|
need a bunch of <code>..</code> or be clever and use the git project
|
||||||
|
root. Since my example with <code>..</code> works, we’ll make it work
|
||||||
|
and then maybe make it right.</p>
|
||||||
|
<p>But I don’t often write tests. And there was an error in it, so going
|
||||||
|
straight to an emacs lisp file was too big a step.</p>
|
||||||
|
<h2 id="taking-a-step-back-literate-programming-to-the-rescue">Taking a
|
||||||
|
step back, literate programming to the rescue</h2>
|
||||||
|
<p>In org mode I can have my function and a call for an example in a
|
||||||
|
code block, and see the error right there. I had a ‘wrong number of
|
||||||
|
arguments’ somewhere. But I can’t understand the
|
||||||
|
<code>ert-deftest</code> error message.</p>
|
||||||
|
<h2 id="another-step-back">Another step back</h2>
|
||||||
|
<p>Running the function in an org-mode code block worked. the function
|
||||||
|
doesn’t. I needed my rubber duck. Thank you dear reader.</p>
|
||||||
|
<p>I don’t know why emacs’ <code>ert-deftest</code> test framework needs
|
||||||
|
so many keystrokes. I need to evaluate the buffer (the place where you
|
||||||
|
edit files) and then run the test runner separately. Org-mode worked but
|
||||||
|
also this is not where the code should end up.</p>
|
||||||
|
<p>The example code in the blogpost used <code>message</code>, so I
|
||||||
|
added that to my emacs lisp file. Now I can evaluate the buffer with a
|
||||||
|
changed function, and see the output (in the ‘messages’ buffer, and in
|
||||||
|
the status line below)</p>
|
||||||
|
<figure>
|
||||||
|
<img src="/images/blog/2026/tdd-state-diagram-john-jagger.jpeg"
|
||||||
|
alt="Hand drawn state diagram, transcribed below in ‘Inline session transcript’ as tables and part mermaid diagram." />
|
||||||
|
<figcaption aria-hidden="true">Hand drawn state diagram, transcribed
|
||||||
|
below in ‘Inline session transcript’ as tables and part mermaid
|
||||||
|
diagram.</figcaption>
|
||||||
|
</figure>
|
||||||
|
<figure>
|
||||||
|
<img
|
||||||
|
src="../../../static/images/blog/2026/tdd-state-diagram-john-jagger.jpeg"
|
||||||
|
alt="what inline image location should be" />
|
||||||
|
<figcaption aria-hidden="true">what inline image location should
|
||||||
|
be</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
%{
|
||||||
|
title: "An example would be handy right about now - how to shave yaks with great efficiency .",
|
||||||
|
author: "Willem van den Ende",
|
||||||
|
tags: ~w(Emacs Examples),
|
||||||
|
description: "Brian Marick once distributed stickers with 'An example would be handy right about now'. This is also handy in cases where writing a test is not directly obvious",
|
||||||
|
published: true
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
# TLDR;
|
||||||
|
|
||||||
|
I write these blogposts in markdown. My editor does not show images, because the paths in the site are different than in the filesystem. My editor is moldable, but I only mold if I need to. I don't want to turn into "I am using tech x to write my blog" and blog about nothing but the tech I use for blogging. Since I am [writing more posts](https://xkcd.com/741/), not being able to easily work with images was starting to get to the point where investing a bit of time in working with images better was worth it.
|
||||||
|
|
||||||
|
Originally I wanted to be able to drag images into my editor and get them in the right place for the blog. And then, by reading, I realised that correctly placed images for my blog were not showing when I was editing. So I fixed that first, following someone else's learning path.
|
||||||
|
|
||||||
|
Fixing this involved staring at the wall, and then realising that an example would be handy. And it was. Even without a unit test.
|
||||||
|
|
||||||
|
# How it began
|
||||||
|
|
||||||
|
Would I recommend Emacs as a writing environment? I don't know. It works for me, mostly thanks to org-roam. And after 5 years of _thou shalt not lose weeks of configuring Emacs_, I am occasionally making small tweaks.
|
||||||
|
|
||||||
|
Admittedly, these tweaks sometimes are things that _should just work out of the box (TM)_. For instance, I can drag and drop an image (on my mac, at least) in an org-mode file, and then I get to choose how the image should be linked to the document. And then I can see it.
|
||||||
|
|
||||||
|
But _of course_ I mean _for some reason_ this does not work in markdown-mode. Luckily [someone else solved this problem before me.](https://oxal.org/blog/powerful-emacs-hacks-paste-images-markdown/). And found that markdown mode is extensible in how it looks for files.
|
||||||
|
|
||||||
|
But what does this have to do with shaving yaks, you wonder? Well, I was annoyed that I could not drag and drop images, displaying images was something the author figured out first, and used as part of a solution in dropping images.
|
||||||
|
|
||||||
|
I have been muddling through, and was reminded I have that problem too. But then I was stuck. I hate thinking about paths on my computer. And for some silly reason, I made this blog in the same way as Jekyll and other static site generators - the images are nowhere near the blog posts. I should fix that, but not on a hot friday when I'm recovering from successful, but intensive, new work.
|
||||||
|
|
||||||
|
[This post helpfully explains how to find the right function, and what to do](https://oxal.org/blog/powerful-emacs-hacks-image-markdown/). And I have a link to an image [in my previous post](https://willemvandenende.com/blog/engineering/enabling-a-local-model-to-explain-images-in-pidev) that will of course not show in `markdown-mode`. Staring at the screen for a while, it hit me.
|
||||||
|
|
||||||
|
# An example would be handy right about now
|
||||||
|
----
|
||||||
|
|
||||||
|
[Brian Marick](http://www.exampler.com/about/) handed out stickers saying "An example would be handy right about now". I can read posts all day long, but modifying someones' (generated) code is probably going to end badly, without checking the output before and after.
|
||||||
|
|
||||||
|
|
||||||
|
So I copied the image link, had a look at my directory structure, enabled images (yes, that is disabled by default. I guess a distraction-free writing environment requires the purity of no man-made images). And then still saw nothing, because I forgot the `static` part of the path. But this was quick iteration, no code or tests were harmed in the making of this example:
|
||||||
|
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
Now I can go back to the joy of copy-paste-modifying the code from the blogpost with my very own path.
|
||||||
|
|
||||||
|
# A test would be handy right about now
|
||||||
|
|
||||||
|
I figured I could hack this path _only_ for my blog, and use a local configuration. After copy-pasting the code, it was time, for, _le sigh_ _modify_. I could let my animatronic rubber duck do it, but I have decided to better understand my emacs mods, so doing it by hand today.
|
||||||
|
|
||||||
|
There is a `substring` call that I don't need - my example shows that blog post and images are both under `priv`. So I need a bunch of `..` or be clever and use the git project root. Since my example with `..` works, we'll make it work and then maybe make it right.
|
||||||
|
|
||||||
|
But I don't often write tests. And there was an error in it, so going straight to an emacs lisp file was too big a step.
|
||||||
|
|
||||||
|
# Taking a step back, literate programming to the rescue?
|
||||||
|
|
||||||
|
In org mode I can have my function and a call for an example in a code block, and see the error right there. I had a 'wrong number of arguments' somewhere. But I can't understand the `ert-deftest` error message.
|
||||||
|
|
||||||
|
Another step back
|
||||||
|
==
|
||||||
|
|
||||||
|
Running the function in an org-mode code block worked. the function doesn't. I needed my rubber duck. Thank you dear reader.
|
||||||
|
|
||||||
|
I don't know why emacs' `ert-deftest` test framework needs so many keystrokes. I need to evaluate the buffer (the place where you edit files) and then run the test runner separately. Org-mode worked but also this is not where the code should end up.
|
||||||
|
|
||||||
|
The example code in the blogpost used `message`, so I added that to my emacs lisp file. Now I can evaluate the buffer with a changed function, and see the output (in the 'messages' buffer, and in the status line below)
|
||||||
|
|
||||||
|
For testing in Emacs, I put the actual image in this blogpost, until I could see it. I like this TDD state diagram, and am evolving it as I spike on
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
# And then it does not integrate
|
||||||
|
|
||||||
|
The last part is monkey patching the long function that markdown-mode uses to generate the image.
|
||||||
|
the monkey patched functoin enables the 'hook' in another place, but the hook does not get called.
|
||||||
|
|
||||||
|
I am now at the point where I am putting print statements in to see what happens. Print is known as `message` in emacs. And the rubber duck of writing does its thing - after taking a break.
|
||||||
|
|
||||||
|
I put the hook definition inside a callback that gets run when the mode loads. Which of course it does not. More `modify` needed after `copy-paste`.
|
||||||
|
|
||||||
|
# It works. Will it load with my blog repository?
|
||||||
|
|
||||||
|
If I do this by hand, yes. When I add a file named [dir-locals.el](https://wiki.migueldeoleiros.com/notes/20250117203949-local_emacs_configuration_per_directory) I can redefine global variables per mode. The file itself is a list of modes, and settings for each mode. It does not allow for defining new functions.
|
||||||
|
|
||||||
|
That is annoying. With [Pi.dev](Pi.dev) it is nice that I can start [moldable development](https://medium.com/feenk/rewilding-software-engineering-900ca95ebc8c) right in my current project, and only extract to my machine or a published repository once I am a bit further and ready to generalise. I have an ugly hack in a file. I could move this ugly hack to my personal emacs repository, put the image prefix in a `.dir-locals.el` and at least it would automatically load. On my machine. I would like this to go with the blog source, so I can see images wherever I edit. I find it annoying to work on another machine and have to go and find I do not have something.
|
||||||
|
|
||||||
|
|
||||||
|
# And that is why I write blog posts like this
|
||||||
|
|
||||||
|
Some of my blogposts seem to help other people, which was the stated aim, and it is nice to see that it works. The other one is to pay it forward, I managed to improve my blog writing workflow thanks to someone else's blogpost and am paying it forward. The pay-off after a few weeks seem to be that it is easier for me to find things back in my blog than on my machine(s). I have used my [instructions for setting up Pi.dev on a VPS](https://willemvandenende.com/blog/engineering/how-to-get-started-with-the-pi-coding-agent-on-a-vps) to remember how to set up open router on one of my machines, for instance.
|
||||||
|
|
||||||
|
[Backing up your work to the internet](https://lkml.iu.edu/hypermail/linux/kernel/9607.2/0292.html) is great. I hope you enjoyed this yak shaving adventure.
|
||||||
|
|
||||||
|
The rabbit hole of emacs is deep, but removing friction from my workflows is not that onerous. And I needed to tinker with a small bit of code to recover from developing a more conceptual talk and a new workshop.
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
; This file is GPL licensed, same as Emacs
|
||||||
|
|
||||||
|
|
||||||
|
; callback to rewrite image pat so emacs can show images inside blog post drafts.
|
||||||
|
(defun firehose/markdown-translate-image-path (path)
|
||||||
|
"Translate /media/... image links to ../media/... relative to buffer."
|
||||||
|
(message (concat "markdown translate image path called on " path))
|
||||||
|
|
||||||
|
(if (string-prefix-p "/images" path)
|
||||||
|
(concat "../../../static" path)))
|
||||||
|
|
||||||
|
|
||||||
|
; test
|
||||||
|
(message (firehose/markdown-translate-image-path "/images/bla"))
|
||||||
|
|
||||||
|
; monkey patch function to fix our filename
|
||||||
|
(defun markdown-display-inline-images ()
|
||||||
|
"Add inline image overlays to image links in the buffer.
|
||||||
|
This can be toggled with `markdown-toggle-inline-images'
|
||||||
|
or \\[markdown-toggle-inline-images]."
|
||||||
|
(interactive)
|
||||||
|
(message "monkeypatched function called")
|
||||||
|
(unless (display-images-p)
|
||||||
|
(error "Cannot show images"))
|
||||||
|
(save-excursion
|
||||||
|
(save-restriction
|
||||||
|
(widen)
|
||||||
|
(goto-char (point-min))
|
||||||
|
(while (re-search-forward markdown-regex-link-inline nil t)
|
||||||
|
(let* ((start (match-beginning 0))
|
||||||
|
(imagep (match-beginning 1))
|
||||||
|
(end (match-end 0))
|
||||||
|
(file (funcall markdown-translate-filename-function (match-string-no-properties 6))))
|
||||||
|
(when (and imagep
|
||||||
|
(not (zerop (length file))))
|
||||||
|
(unless (file-exists-p file)
|
||||||
|
(let* ((download-file (funcall markdown-translate-filename-function file))
|
||||||
|
(valid-url (ignore-errors
|
||||||
|
(member (downcase (url-type (url-generic-parse-url download-file)))
|
||||||
|
markdown-remote-image-protocols))))
|
||||||
|
(if (and markdown-display-remote-images valid-url)
|
||||||
|
(setq file (markdown--get-remote-image download-file))
|
||||||
|
(when (not valid-url)
|
||||||
|
;; strip query parameter
|
||||||
|
(setq file (replace-regexp-in-string "?.+\\'" "" file))
|
||||||
|
(unless (file-exists-p file)
|
||||||
|
(setq file (url-unhex-string file)))))))
|
||||||
|
(when (file-exists-p file)
|
||||||
|
(let* ((abspath (if (file-name-absolute-p file)
|
||||||
|
file
|
||||||
|
(concat default-directory file)))
|
||||||
|
(image
|
||||||
|
(cond ((and markdown-max-image-size
|
||||||
|
(image-type-available-p 'imagemagick))
|
||||||
|
(create-image
|
||||||
|
abspath 'imagemagick nil
|
||||||
|
:max-width (car markdown-max-image-size)
|
||||||
|
:max-height (cdr markdown-max-image-size)))
|
||||||
|
(markdown-max-image-size
|
||||||
|
(create-image abspath nil nil
|
||||||
|
:max-width (car markdown-max-image-size)
|
||||||
|
:max-height (cdr markdown-max-image-size)))
|
||||||
|
(t (create-image abspath)))))
|
||||||
|
(when image
|
||||||
|
(let ((ov (make-overlay start end)))
|
||||||
|
(overlay-put ov 'display image)
|
||||||
|
(overlay-put ov 'face 'default)
|
||||||
|
(push ov markdown-inline-image-overlays)))))))))))
|
||||||
|
|
||||||
|
; register hook
|
||||||
|
(setq markdown-translate-filename-function
|
||||||
|
#'firehose/markdown-translate-image-path)
|
||||||
@@ -43,6 +43,3 @@ EOF
|
|||||||
|
|
||||||
echo "Created: $file"
|
echo "Created: $file"
|
||||||
|
|
||||||
if [[ -n "${EDITOR:-}" ]] && [[ -t 1 ]]; then
|
|
||||||
exec "$EDITOR" "$file"
|
|
||||||
fi
|
|
||||||
|
|||||||
Reference in New Issue
Block a user