Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: New technique: Convert dec to hex with undocumented variable

947 views
Skip to first unread message
Message has been deleted

Bruce M. Axtens

unread,
Apr 23, 2010, 11:31:57 PM4/23/10
to
carlos wrote:
> @echo off
> setlocal enableextensions
> call :10to16 1789 ret
> echo.%ret%
> pause
> goto :eof
>
> :10to16:
> setlocal enableextensions
> set "findstr=%WinDir%\system32\findstr.exe"
> "%ComSpec%" /a /q /d /e:on /c exit /b %~1>nul
> for /f "tokens=2 delims==" %%# in (
> 'set "" ^| "%findstr%" /r "^\=ExitCode\="'
> ) do for /f "eol=0 delims=0 tokens=*" %%$ in (
> "%%#") do endlocal& set "%2=%%$"
> goto :eof

Wow!! that is really funky cool bananas!

Well done.

Bruce M. Axtens

unread,
Apr 23, 2010, 11:33:53 PM4/23/10
to
carlos wrote:
> Hello, I devised a quick way to convert decimal numbers to hexadecimal
> using undocumented =ExitCode variable.

>
>
> @echo off
> setlocal enableextensions
> call :10to16 1789 ret
> echo.%ret%
> pause
> goto :eof
>
> :10to16:
> setlocal enableextensions
> set "findstr=%WinDir%\system32\findstr.exe"
> "%ComSpec%" /a /q /d /e:on /c exit /b %~1>nul
> for /f "tokens=2 delims==" %%# in (
> 'set "" ^| "%findstr%" /r "^\=ExitCode\="'
> ) do for /f "eol=0 delims=0 tokens=*" %%$ in (
> "%%#") do endlocal& set "%2=%%$"
> goto :eof
>

In fact, submit it to RosettaCode <http://www.rosettacode.org> !

Bruce

foxidrive

unread,
Apr 24, 2010, 12:15:01 AM4/24/10
to
On Fri, 23 Apr 2010 13:25:41 -0700 (PDT), carlos <cmon...@gmail.com>
wrote:

>Hello, I devised a quick way to convert decimal numbers to hexadecimal
>using undocumented =ExitCode variable.
>
>
>@echo off
>setlocal enableextensions
>call :10to16 1789 ret
>echo.%ret%
>pause
>goto :eof
>
>:10to16:
>setlocal enableextensions
>set "findstr=%WinDir%\system32\findstr.exe"
>"%ComSpec%" /a /q /d /e:on /c exit /b %~1 >nul
>for /f "tokens=2 delims==" %%# in (
>'set "" ^| "%findstr%" /r "^\=ExitCode\="'
>) do for /f "eol=0 delims=0 tokens=*" %%$ in (
>"%%#") do endlocal & set "%2=%%$"
>goto :eof

Nice work carlos.


This does the same, with simpler syntax.

@echo off
call :Dec2Hex 6789 ret
echo.%ret%
pause
goto :eof

:Dec2Hex
"%ComSpec%" /c exit /b %~1 >nul
for /f "tokens=1* delims==0" %%a in (
'set "" ^|find "=ExitCode"') do set "%2=%%b"


--
Regards,
Mic

Bruce M. Axtens

unread,
Apr 24, 2010, 12:40:25 AM4/24/10
to
foxidrive wrote:
> This does the same, with simpler syntax.
>

That's nice work too. However, you get some pretty strange results for
certain values. Using this version

@echo off
setlocal
call :Dec2Hex %1 ret
echo.%ret%
REM ~ pause
goto :eof

:Dec2Hex
"%ComSpec%" /c exit /b %~1 >nul
for /f "tokens=1* delims==0" %%a in ('set "" ^|find "=ExitCode"') do set
"%2=%%b"

You get the following

>hex2dec.cmd 32


>hex2dec.cmd 33
!

>hex2dec.cmd 34
"

>hex2dec.cmd 35
#

>hex2dec.cmd 36
$

>hex2dec.cmd 37
%

>hex2dec.cmd 38


>hex2dec.cmd 39
'

>hex2dec.cmd 40
(

>hex2dec.cmd 44
,

>hex2dec.cmd 46
.

>hex2dec.cmd 48


>hex2dec.cmd 50
2

>hex2dec.cmd 55
7

>hex2dec.cmd 60
The syntax of the command is incorrect.

>hex2dec.cmd 61


>hex2dec.cmd 63
?

>hex2dec.cmd 70
F

>hex2dec.cmd 80
P


Kind regards,
Bruce.

Bruce M. Axtens

unread,
Apr 24, 2010, 12:42:58 AM4/24/10
to
Carlos's version, tweaked,

@echo off
setlocal enableextensions
call :10to16 %1 ret
echo.%ret%
REM ~ pause
goto :eof

:10to16:
setlocal enableextensions
set "findstr=%WinDir%\system32\findstr.exe"
"%ComSpec%" /a /q /d /e:on /c exit /b %~1 >nul
for /f "tokens=2 delims==" %%# in ('set "" ^| "%findstr%" /r
"^\=ExitCode\="') do for /f "eol=0 delims=0 tokens=*" %%$ in ("%%#") do
endlocal & set "%2=%%$"
goto :eof

gives the right answers

-- Bruce

Bruce M. Axtens

unread,
Apr 24, 2010, 12:49:37 AM4/24/10
to
In fact, given this

:: h2d_demo.cmd
@echo off
setlocal enableextensions
set ret=carlos:
for /L %%i in (1,1,100) do call :carlos %%i
echo.%ret%
set ret=foxidrive:
for /L %%i in (1,1,100) do call :foxidrive %%i


echo.%ret%
REM ~ pause
goto :eof

:carlos


setlocal enableextensions
set "findstr=%WinDir%\system32\findstr.exe"
"%ComSpec%" /a /q /d /e:on /c exit /b %~1 >nul
for /f "tokens=2 delims==" %%# in ('set "" ^| "%findstr%" /r
"^\=ExitCode\="') do for /f "eol=0 delims=0 tokens=*" %%$ in ("%%#") do

endlocal & set "ret=%ret% %%$"
goto :eof

:foxidrive


"%ComSpec%" /c exit /b %~1 >nul
for /f "tokens=1* delims==0" %%a in ('set "" ^|find "=ExitCode"') do set

"ret=%ret% %%b"

foxidrive's code never runs to completion.


-- Bruce

Bruce M. Axtens

unread,
Apr 24, 2010, 12:54:44 AM4/24/10
to
If foxidrive uses

'set "" ^|findstr "=ExitCode\="'

then everything works fine.

-- Bruce

Message has been deleted

foxidrive

unread,
Apr 24, 2010, 1:43:17 AM4/24/10
to

Thanks Bruce, I see there is an "=ExitCodeAscii=" variable as well.

This works here:

@echo off
for /L %%a in (1,1,100) do call :Dec2Hex %%a ret
pause
goto :eof

:Dec2Hex
"%ComSpec%" /c exit /b %~1 >nul
for /f "tokens=1* delims==0" %%a in (

'set "" ^|findstr "^=ExitCode="') do set "%2=%%b"
echo.%ret%


--
Regards,
Mic

Message has been deleted
Message has been deleted

01MDM

unread,
Apr 24, 2010, 11:12:32 AM4/24/10
to
Here's my variant:

@echo off
setlocal

1>nul reg add hkcu\test /v hex /t reg_dword /d %~1 /f

for /f "tokens=3" %%i in ('reg query hkcu\test /v hex') do (
set "hex=%%i"
)
1>nul reg delete hkcu\test /v hex /f

echo %hex%

Message has been deleted
Message has been deleted
Message has been deleted

Bruce M. Axtens

unread,
Apr 25, 2010, 1:24:32 AM4/25/10
to

That's insane! Positively, marvellously, insane!

I'm_HERE

unread,
Apr 25, 2010, 3:05:29 AM4/25/10
to
On 25 avr, 02:29, carlos <cmonti...@gmail.com> wrote:
> ::Cleaned some characters unnecesary.
> ::Final Version 2.
>
> @echo off
> call :Dec2Hex 10554896 ret
> echo.%ret%
> pause
> goto :eof
>
> :Dec2Hex
> "%ComSpec%" /d /c exit /b %~1 >nul
> for /f "eol=0 delims=0 tokens=*" %%# in (
> "%=ExitCode%") do if not "%%#"=="" (
> set %~2=%%#) else (set %~2=0)
> goto :eof

nice job Carlos

@01MDM: Here's variant:

----------------------------------------------8<----------------------------------------------
for /f "tokens=1,3" %%i in ('^(
reg add hkcu\console /v $hex /t reg_dword /d 36564558 /f ^&
reg query hkcu\console /v $hex ^&
reg delete hkcu\console /v $hex /f
^)^|find "REG_DWORD"') do Set %%i=%%j
Set $hex
------------------------------------------8<-----------------------------------------------

Bruce M. Axtens

unread,
Apr 25, 2010, 5:34:27 AM4/25/10
to
I'm_HERE wrote:
> @01MDM: Here's variant:
>
> ----------------------------------------------8<----------------------------------------------
> for /f "tokens=1,3" %%i in ('^(
> reg add hkcu\console /v $hex /t reg_dword /d 36564558 /f ^&
> reg query hkcu\console /v $hex ^&
> reg delete hkcu\console /v $hex /f
> ^)^|find "REG_DWORD"') do Set %%i=%%j
> Set $hex
> ------------------------------------------8<-----------------------------------------------

Funky! Pity there's no error trapping. I took your code and make it more
tool-like:

@echo off
setlocal
if "%1" equ "" goto :eof


for /f "tokens=1,3" %%i in ('^( reg add hkcu\console /v $hex /t

reg_dword /d %1 /f ^& reg query hkcu\console /v $hex ^& reg delete

hkcu\console /v $hex /f ^)^|find "REG_DWORD"') do Set %%i=%%j

echo %$hex%

then I pushed it a bit:

>dec2hex.cmd 45
0x2d
>dec2hex.cmd

>dec2hex.cmd 55555555
0x34fb5e3
>dec2hex.cmd 555555555
0x211d1ae3
>dec2hex.cmd 5555555555
ERROR: Invalid syntax. Specify valid numeric value for '/d'.
Type "REG ADD /?" for usage.
ERROR: The system was unable to find the specified registry key or value.
ERROR: The system was unable to find the specified registry key or value.
ECHO is off.
>

Bruce M. Axtens

unread,
Apr 25, 2010, 6:00:17 AM4/25/10
to
There is the roundabout way too, this one using delayed expansion and
the substring function:

----------------------------------------------8<----------------------------------------------
@echo off
setlocal ENABLEDELAYEDEXPANSION
set hex=0123456789abcdef
set num=%1

:loop
set /a digit = num %% 16
set /a num = num / 16
call :hexify %digit% res
if %num% equ 0 goto :done
goto loop

:hexify
set chunk=!hex:~%1,1!
set name=%2
set %name%=%chunk%!%name%!
goto :eof

:done
echo %res%
----------------------------------------------8<----------------------------------------------

Bruce

Frank P. Westlake

unread,
Apr 27, 2010, 9:58:53 AM4/27/10
to
"Bruce M. Axtens"
news:ZCuAn.21066$pv.1...@news-server.bigpond.net.au...

> ... some pretty strange results for certain values.


> @echo off
> setlocal
> call :Dec2Hex %1 ret
> echo.%ret%
> REM ~ pause
> goto :eof
>
> :Dec2Hex
> "%ComSpec%" /c exit /b %~1 >nul
> for /f "tokens=1* delims==0" %%a in ('set "" ^|find "=ExitCode"') do
> set "%2=%%b"
>
> You get the following
>
> >hex2dec.cmd 32
>
>
> >hex2dec.cmd 33
> !
>
> >hex2dec.cmd 34
> "

This too is useful! You are getting the ASCII character for the given
value! My Windows Vista HOBOs doesn't seem to have the variable
"=ExitCodeASCII" so I can't experiment with this procedure.

Frank


Frank P. Westlake

unread,
Apr 27, 2010, 9:59:58 AM4/27/10
to
"carlos"
news:c406f15b-6dad-416c...@5g2000yqj.googlegroups.com...

> Hello, I devised a quick way to convert decimal numbers to hexadecimal
> using undocumented =ExitCode variable.


Thank you Carlos -- this may be the tool of the year!

Frank


Timo Salmi

unread,
Apr 27, 2010, 12:55:28 PM4/27/10
to
On 25.04.2010 13:00 Bruce M. Axtens wrote:
> There is the roundabout way too

There are plenty of alternatives, both practical and esoteric, including
http://www.netikka.net/tsneti/info/tscmd088.htm

All the best, Timo

--
Prof. Timo Salmi mailto:t...@uwasa.fi ftp & http://garbo.uwasa.fi/
Hpage: http://www.uwasa.fi/laskentatoimi/english/personnel/salmitimo/
Department of Accounting and Finance, University of Vaasa, Finland
Useful CMD script tricks http://www.netikka.net/tsneti/info/tscmd.php

Timo Salmi

unread,
Apr 27, 2010, 1:12:16 PM4/27/10
to
On 27.04.2010 19:55 Timo Salmi wrote:
> On 25.04.2010 13:00 Bruce M. Axtens wrote:
>> There is the roundabout way too

> There are plenty of alternatives, both practical and esoteric, including
> http://www.netikka.net/tsneti/info/tscmd088.htm

The easiest solution, however, being

@echo off & setlocal enableextensions
set vbscalc_=%temp_%\vbscalc.vbs
echo WScript.Echo Eval("%*")>"%vbscalc_%"
cscript //nologo "%vbscalc_%"
for %%f in ("%vbscalc_%") do if exist %%f del %%f
endlocal & goto :EOF

Taken from http://www.netikka.net/tsneti/info/tscmd061.htm

The output could be e.g.
C:\_D\TEST>CMDFAQ.CMD Hex(123)
7B

Tom Lavedas

unread,
Apr 27, 2010, 3:19:59 PM4/27/10
to
On Apr 27, 1:12 pm, Timo Salmi <t...@uwasa.fi> wrote:
> On 27.04.2010 19:55 Timo Salmi wrote:
>
> > On 25.04.2010 13:00 Bruce M. Axtens wrote:
> >> There is the roundabout way too
> > There are plenty of alternatives, both practical and esoteric, including
> >http://www.netikka.net/tsneti/info/tscmd088.htm
>
> The easiest solution, however, being
>
>    @echo off & setlocal enableextensions
>    set vbscalc_=%temp_%\vbscalc.vbs
>    echo WScript.Echo Eval("%*")>"%vbscalc_%"
>    cscript //nologo "%vbscalc_%"
>    for %%f in ("%vbscalc_%") do if exist %%f del %%f
>    endlocal & goto :EOF
>
> Taken fromhttp://www.netikka.net/tsneti/info/tscmd061.htm

>
> The output could be e.g.
>   C:\_D\TEST>CMDFAQ.CMD Hex(123)
>   7B
>
>     All the best, Timo
>
> --
> Prof. Timo Salmi   mailto:t...@uwasa.fi    ftp &http://garbo.uwasa.fi/

> Hpage:http://www.uwasa.fi/laskentatoimi/english/personnel/salmitimo/
> Department of Accounting and Finance,   University of Vaasa,  Finland
> Useful CMD script trickshttp://www.netikka.net/tsneti/info/tscmd.php

But you have to admit that carlos' approach is a little truer to the
topics of this group. Plus, when written in its most compact form it
takes no more lines of code than the hybrid version ...

@echo off & setlocal enableextensions

if [%2]==[] %0 %1 ret % default variable name %


"%ComSpec%" /c exit /b %~1

for /f "tokens=1* delims=0" %%a in (
"x0%=exitcode%") do endlocal & set "%2=0%%a%%b"
call echo.%2=%%%2%%

Note that I added a 0x prefix to make it a 'true' hex number. That
is, it can be used in an arithmetic SET expression as a number. This
routine also takes an optional variable name as its second command
line argument.
_____________________
Tom Lavedas

Message has been deleted
Message has been deleted
Message has been deleted

carlos

unread,
Apr 27, 2010, 5:26:20 PM4/27/10
to
On 27 abr, 09:59, "Frank P. Westlake" <frank.westl...@gmail.com>
wrote:

>
> > Hello, I devised a quick way to convert decimal numbers to hexadecimal
> > using undocumented =ExitCode variable.
>
> Thank you Carlos -- this may be the tool of the year!
>
> Frank

Thanks Frank. About ExitCodeAscii, this is only seted when you exit
with number between 32 and 126, this return ascii character, example
if I do exit /b 90 ExitCodeAscii is 'Z'

I want to emphasize that my last version, is more fast than Timo vbs
version. Test with timethis.exe indicate that my code delay 0,078 and
timo vbs 0,109.

This is my final version:

@echo off
call :Dec2Hex 10554896 ret
echo.%ret%

pause
goto :eof

:Dec2Hex

Timo Salmi

unread,
Apr 27, 2010, 6:00:14 PM4/27/10
to
On 27.04.2010 22:19 Tom Lavedas wrote:
> On Apr 27, 1:12 pm, Timo Salmi <t...@uwasa.fi> wrote:
>> On 27.04.2010 19:55 Timo Salmi wrote:
>>> There are plenty of alternatives, both practical and esoteric, including

> But you have to admit that carlos' approach is a little truer to the
> topics of this group.

Certainly. Inventive, interesting, and esoteric.

> Plus, when written in its most compact form it
> takes no more lines of code than the hybrid version ...

I'm not competing. Besides, once again, the more, the merrier.

All the best, Timo

--
Prof. Timo Salmi mailto:t...@uwasa.fi ftp & http://garbo.uwasa.fi/

Bruce Axtens

unread,
Apr 27, 2010, 10:50:14 PM4/27/10
to
Please, all of you, go join RosettaCode and do something about their
paltry collection of Batch File scripts. I'm working on it, but it's
taking a long time and I do have a life.

Kind regards,
Bruce.

Message has been deleted
Message has been deleted

I'm_HERE

unread,
Apr 28, 2010, 5:27:51 AM4/28/10
to
here's variant

------------------------------------8<-----------------------------
[1] set $hex1=0x0
[2] for /f "tokens=1* delims=0=" %%a in ('"%comspec% /cexit/b
%1&set;|
find "^=ExitCode^=""') do Set $hex1=0x%%b
[3] goto :eof

[cmd] c:\> carlos.cmd 125
0x7D
----------------------------------8<---------------------------------

to see =ExitCodeAsi variable

----------------------8<----------------------------------
%comspec% /cexit/b 103&set;|find "=ExitCode"

-----------------------8<----------------------------------------

Klaatu

unread,
Apr 28, 2010, 10:47:20 AM4/28/10
to
On Tue, 27 Apr 2010 17:12:16 GMT, Timo Salmi posted to alt.msdos.batch.nt:

> The easiest solution, however, being
>
> @echo off & setlocal enableextensions
> set vbscalc_=%temp_%\vbscalc.vbs
> echo WScript.Echo Eval("%*")>"%vbscalc_%"
> cscript //nologo "%vbscalc_%"
> for %%f in ("%vbscalc_%") do if exist %%f del %%f
> endlocal & goto :EOF

Seems to me this would fail because %temp_% is not defined.

--
My girlfriend said "Its me or that computer"
God - I'm gonna miss her

Timo Salmi

unread,
Apr 28, 2010, 3:14:48 PM4/28/10
to
On 28.04.2010 17:47 Klaatu <kla...@nospam.invalid> wrote:
> On Tue, 27 Apr 2010 17:12:16 GMT, Timo Salmi posted to
> alt.msdos.batch.nt:

>> set vbscalc_=%temp_%\vbscalc.vbs

> Seems to me this would fail because %temp_% is not defined.

Kindly test before making brave assertions. The script will just go to
the root of the current partition if %temp_% is undefined. Or, remove
the _ if it disturbs you.

Klaatu

unread,
Apr 29, 2010, 2:04:15 PM4/29/10
to
On Wed, 28 Apr 2010 19:14:48 GMT, Timo Salmi posted to
alt.msdos.batch.nt:

> On 28.04.2010 17:47 Klaatu <kla...@nospam.invalid> wrote:
>> On Tue, 27 Apr 2010 17:12:16 GMT, Timo Salmi posted to
>> alt.msdos.batch.nt:
>
>>> set vbscalc_=%temp_%\vbscalc.vbs
>
>> Seems to me this would fail because %temp_% is not defined.
>
> Kindly test before making brave assertions. The script will just go to
> the root of the current partition if %temp_% is undefined. Or, remove
> the _ if it disturbs you.

Kindly admit to an error when you make one, or ignore my comment if it
disturbs you. :P

Perhaps "fail" was the wrong word though. "Fail to perform as intended"
would be better, as obviously the intent is for the file to be placed
into a (if not the) "temp" folder.

--
A journey of a thousand miles begins with a cash advance.

Timo Salmi

unread,
Apr 30, 2010, 11:50:29 AM4/30/10
to
On 29.04.2010 21:04 Klaatu wrote:
> On Wed, 28 Apr 2010 19:14:48 GMT, Timo Salmi posted to
> alt.msdos.batch.nt:
>
>> On 28.04.2010 17:47 Klaatu <kla...@nospam.invalid> wrote:
>>> On Tue, 27 Apr 2010 17:12:16 GMT, Timo Salmi posted to
>>> alt.msdos.batch.nt:
>>>> set vbscalc_=%temp_%\vbscalc.vbs
>>> Seems to me this would fail because %temp_% is not defined.
>> Kindly test before making brave assertions. The script will just go to
>> the root of the current partition if %temp_% is undefined. Or, remove
>> the _ if it disturbs you.
>
> Kindly admit to an error when you make one,

From that I still have to suspect that you did not try out the code
before your claim.

> or ignore my comment if it disturbs you. :P

An attempt at humor always is welcome, even when the premise falters.

> Perhaps "fail" was the wrong word though. "Fail to perform as intended"
> would be better, as obviously the intent is for the file to be placed
> into a (if not the) "temp" folder.

You are mispresenting the task at hand by an irrelevant point which does
not even hold. The original purpose was to solve the problem stated in
the subject. The code does that. Furthermore, I told where the code was
extracted from. Would you have looked at the item, you would have seen
that there temp_ is defined. The fact, however, remains that the code
that I posted works whether it is defined or not.

I readily admit when I make error and they are pointed out. I often make
errors. But this was not the case this time. But I can sympathize. A
failed one-upmanship tends particularly to rankle when one thinks one
had caught a regular.

All the best, Timo

--
Prof. Timo Salmi mailto:t...@uwasa.fi ftp & http://garbo.uwasa.fi/

Home page: http://www.uwasa.fi/laskentatoimi/henkilokunta/salmitimo/


Department of Accounting and Finance, University of Vaasa, Finland

Timo's FAQ materials at http://lipas.uwasa.fi/~ts/http/tsfaq.html

Frank P. Westlake

unread,
May 5, 2010, 10:41:22 AM5/5/10
to
"carlos"
news:ddd9eb45-b854-4c48...@z7g2000yqb.googlegroups.com...

> Thanks Frank. About ExitCodeAscii, this is only seted when you exit
> with number between 32 and 126, this return ascii character, example
> if I do exit /b 90 ExitCodeAscii is 'Z'


Then it is on my Windows Vista machine; my previous experimentation with
the '=' variables was with Windows NT4.

Even with it being only ASCII032 through ASCII126 it is still useful in
many ways. One is to easily write difficult characters to a variable,
such as '!' when delayed expansion is enabled:

"%ComSpec%" /d /c Exit 33
Set "char=!=ExitCodeAscii!"
Echo ASCII033="!char!"

Displays:

ASCII033="!"


Frank

foxidrive

unread,
May 5, 2010, 12:58:57 PM5/5/10
to

It's not necessary if you set the variable before hand, and can be
displayed outside double quotes as a bonus.


@echo off
Set "char=!"
setlocal EnableDelayedExpansion
Echo ASCII033=!char!abc!char!
pause


--
Regards,
Mic

Frank P. Westlake

unread,
May 12, 2010, 9:13:02 AM5/12/10
to
"foxidrive" news:so83u5d4s7tcgp812...@4ax.com...
> Frank:

>>Even with it being only ASCII032 through ASCII126 it is still useful
>>in
>>many ways. One is to easily write difficult characters to a variable,
>>such as '!' when delayed expansion is enabled:
>>
>> "%ComSpec%" /d /c Exit 33
>> Set "char=!=ExitCodeAscii!"
>> Echo ASCII033="!char!"
>>
>>Displays:
>>
>>ASCII033="!"
>
> It's not necessary if you set the variable before hand, and can be
> displayed outside double quotes as a bonus.
>
>
> @echo off
> Set "char=!"
> setlocal EnableDelayedExpansion
> Echo ASCII033=!char!abc!char!
> pause

Yes: "if". But the state of delayed expansion is normally not known; it
can be tested and disabled if necessary but it is simpler to use the
'CMD/CEXIT' trick.

Frank


0 new messages