LibreLogo

LibreLogo är en enkel Logo-liknande programmeringsmiljö med sköldpaddegrafik som skapats för att utbilda informationskunskap (programmering och ordbehandling), DTP och grafikdesign. Se http://www.numbertext.org/logo/librelogo.pdf.

Verktygsraden LibreLogo

Verktygsraden LibreLogo (Visa - Verktygsrader - Logo) innehåller förflyttning av sköldpadda, start/stop av programkörning, hem, rensa skärmen, syntaxmarkering/-översättning och en inmatningsrad (kommandorad).

Ikoner för sköldpaddsförflyttningar

De motsvarar Logo-kommandona "FORWARD 10", "BACK 10", "LEFT 15", "RIGHT 15". Genom att klicka på en av ikonerna så kommer markören att fokusera på sköldpaddan och sidan kommer rullas till dess position.

Starta Logo-program

Klicka på ikonen "Starta Logoprogram" för att köra texten i dokumentet (eller i markeringen) som ett LibreLogoprogram. I ett tomt dokument infogas ett exempelprogram och körs.

Klicka på “Stopp”-ikonen för att stoppa programmet.

Home

Klicka på "Hem"-ikonen för att återställa sköldpaddans position och inställningar.

Rensa skärmen.

Klicka på ikonen “Rensa skärm” för att ta bort teckningsobjekt från dokumentet.

Program redigerare/Syntax märkning/Översättning

Trollstavs-ikonen ger 2-sidig layout för programredigering, expanderar och konverterar de förkortade, gemena Logo-kommandona i Writer-dokumentet till versaler. Ändra språket för dokumentet ( - Språkinställningar - språk - västerländska och klicka på ikonen för att översätta Logo-programmet till det valda språket.

Kommandorad

Tyck Enter i kommandoraden för att köra dess innehåll. För att stoppa programmet använder du ikonen "Stop".

Håll nere Enter för att upprepa kommandot, till exempel på följande kommandosekvens:

 FORWARD 200 LEFT 89

To reset the command line triple-click it or press +A to select the previous commands, and type the new commands.

Användargränssnitt för grundläggande sköldpaddeinställningar

Turtle shape of LibreLogo is a normal fixed size drawing object. You can position and rotate it on standard way, too, using the mouse and the Rotate icon of the Drawing Object Properties toolbar. Modify Line Width, Line Color and Area Color settings of the turtle shape to set PENSIZE, PENCOLOR and FILLCOLOR attributes of LibreLogo.

Programredigering

LibreLogo-teckningar och program använder samma dokument. Ritytan för LibreLogo är på första sidan i Writer-dokumentet. Du kan infoga en sidbrytning före LibreLogo-programmet och ange sidans zoomningsgrad med hjälp av "trollstavs"-ikonen i verktygsraden Logo. Förslagsvis kan du även förstora teckenstorleken så att texten blir mer lättläst i den tvåsidiga layouten. Med detta tillvägagångssätt får du ritytan på sida ett och programredigeraren på sidan två.

Programmeringsspråket LibreLogo

LibreLogo är ett Logo-liknande programmeringsspråk som lätt kan översättas. Det har redan översatts till flera språk av LibreOffice lokala gemenskaper. Det är bakåtkompatibelt med äldre Logo-system om det handlar om enkla Logoprogram som t.ex. används inom utbildningar.

 TO triangle :size
REPEAT 3 [
FORWARD :size
LEFT 120
]
END

triangle 10 triangle 100 triangle 200

Skillnader från Logo programmeringsspråk

Andra funktioner i LibreLogo

LibreLogo-kommandon

Grundläggande syntax

Skiftlägeskänslighet

Kommando och färgkonstanter är inte skiftlägeskänsliga:

 PRINT “Hello, World!”
print “Hello, World, igen!”

Variabelnamn är skiftlägeskänsliga:

 a = 5
A = 7
PRINT a
PRINT A

Programrader

Rader av ett LibreLogo-program är stycken i LibreOffice Writerdokument. En programrad kan innehålla flera kommandon:

 PRINT “Hello, World!” PRINT “LibreLogo”

Kommentarer

Rader eller delar av rader kan göras till kommentarer genom att lägga till ett semikolon, allt som följer semikolon (i samma stycke) räknas som en kommentar.

 ; en kommentar
PRINT 5 * 5 ; ytterligare en kommentar

Dela upp programrader i flera stycken

Det är möjligt att dela upp en programrad i flera stycken med hjälp av tecknet ~ (tilde) vid radens slut:

 PRINT “Detta är ett väldigt långt ” + ~
“varningsmeddelande”

Sköldpaddsförflyttningar

FORWARD (fd)

 FORWARD 10 ; flyttar framåt 10pt (1pt = 1/72 inch = 0,35 mm)
FORWARD 10pt ; se ovan
FORWARD 0.5in ; flytta framåt 0.5 inch (1 inch = 2,54 cm)
FORWARD 1" ; se ovan
FD 1mm
FD 1cm

BACK (bk)

 BACK 10 ; flytta bakåt 10pt

LEFT (lt)

 LEFT 90 ; sväng 90 grader motsols
LEFT 90° ; se ovan
LT 3h ; sväng 3 timmar mot klockans riktning, dvs 90 grader motsols
LT any ; sväng åt ett slumpmässigt håll

RIGHT (rt)

 RIGHT 90 ; sväng 90 grader medsols

PENUP (pu)

 PENUP ; flytta sköldpaddan utan att rita något

PENDOWN (pd)

 PENDOWN ; rita medan du flyttar sköldpaddan

POSITION (pos)

 POSITION [0, 0] ; sväng och flytta till översta, vänstra hörnet
POSITION PAGESIZE ; sväng och flytta till nedersta högra hörnet
POSITION [PAGESIZE[0], 0] ; sväng och flytta till översta, högra hörnet
POSITION ANY ; sväng och flytta till en slumpmässig position

HEADING (seth)

 HEADING 0 ; sväng norrut
HEADING 12h ; se ovan
HEADING [0, 0] ; sväng mot vänstra övre hörnet
HEADING ANY ; sväng i en slumpmässig riktning

Andra skölpaddekommandon

HIDETURTLE (ht)

 HIDETURTLE ; döljer sköldpaddan (tills kommandot showturtle används)

SHOWTURTLE (st)

 SHOWTURTLE ; visa sköldpadda

HOME

 HOME ; nollställ sköldpaddans ursprungliga position

CLEARSCREEN (cs)

 CLEARSCREEN ; tar bort ritade objekt från dokumentet

FILL och CLOSE

 FILL ; stäng och fyll den aktuella streckfiguren eller punkter
CLOSE ; stänger den aktuella streckfiguren eller förbinder de aktuella punkterna

Exempel: fyllning av en vanlig triangel:

 FRAM 50 VÄNSTER 120 FRAM 50 FYLL

Exempel: ritning av en vanlig triangel:

 FRAM 50 VÄNSTER 120 FRAM 50 STÄNG

Penninställningar

PENSIZE (ps)

 PENSIZE 100 ; ange linjebredden till 100 punkter
PENSIZE ANY ; motsvarar PENSIZE RANDOM 10

PENCOLOR/PENCOLOUR (pc)

 PENCOLOR “red” ; ange pennfärgen till röd (via färgnamn, se färgkonstanter)
PENCOLOR [255, 255, 0] ; anger en gul färg (RGB lista)
PENCOLOR 0xffff00 ; anger gul färg (hexadecimal kod)
PENCOLOR 0 ; anger svart färg (0x000000)
PENCOLOR ANY ; slumpmässig färg
PENCOLOR [5] ; anger röd färg (via färgidentifierare, se färgkonstanter)
PENCOLOR “invisible” ; genomskinlig "färg" för former utan synligt område
PENCOLOR “~red” ; ange en slumpmässig röd färg

PENTRANSPARENCY

 PENTRANSPARENCY 80 ; ange transparensen för pennans färg till 80%

PENCAP/LINECAP

 PENCAP “none” ; utan extra linjeslut (standard)
PENCAP “round” ; avrundat linjeslut
PENCAP “square” ; fyrkantigt linjeslut

PENJOINT/LINEJOINT

 PENJOINT “rounded” ; avrundade linjeskarvar (standard)
PENJOINT “miter” ; skarpa linjeskarvar
PENJOINT “bevel” ; kapade linjeskarvar
PENJOINT “none” ; ingen linjeskarv

PENSTYLE

 PENSTYLE “solid” ; solid linje (default)
PENSTYLE “dotted” ; prickad linje
PENSTYLE “dashed” ; streckad linje

; anpassat mönster av prickar och streck angivet av en lista med följande argument:
; – antal intilliggande punkter
; – prickarnas längd
; – antal intilliggande streck
; – streckens längd
; – avstånd mellan strickar/streck
; – typ (valfri):
; 0 = prickar är rektangulära (default)
; 2 = prickar är kvadratiska (avstånd och längd anges i förhållande till pennstorleken)

PENSTYLE [3, 1mm, 2, 4mm, 2mm, 2] ; ...––...––...––

Fyllningsinställningar

FILLCOLOR/FILLCOLOUR (fc)

 FILLCOLOR “blue” ; fill with blue color, see also PENCOLOR
FILLCOLOR “invisible” CIRCLE 10 ; unfilled circle
FILLCOLOR [“blue”, “red”] ; gradient between red and blue
FILLCOLOR [[255, 255, 255], [255, 128, 0]] ; between white and orange
FILLCOLOR [“blue”, “red”, 1, 0, 0] ; set axial gradient (with the required rotation and border settings), possible values: 0-5 = linear, axial, radial, elliptical, square and rectangle gradients
FILLCOLOR [“red”, “blue”, 0, 90, 20] ; linear with 20% border, rotated with 90 degrees from the actual heading of the turtle
FILLCOLOR [“red”, “blue”, 0, 90, 20, 0, 0, 200, 50] ; from 200% to 50% intensity
FILLCOLOR [ANY, ANY, 2, 0, 0, 50, 50] ; radial gradient with random colors and 50-50% horizontal and vertical positions of the center

FILLTRANSPARENCY

 FILLTRANSPARENCY 80 ; anger att aktuella fyllnadsfärgen ska vara 80% transparent (genomskinlig)
FILLTRANSPARENCY [80] ; anger linjär transparent toning från 80% till 0%
FILLTRANSPARENCY [80, 20] ; anger linjär transparent toning från 80% till 20%
FILLTRANSPARENCY [80, 20, 1, 90] ; anger axiell transparent toning roterat med 90 grader från sköldpaddans aktuella position
FILLTRANSPARENCY [80, 20, 2, 0, 20, 50, 50] ; anger radiell transparent toning från yttre 80% till inre 20% transparens med 20% inramning och 50-50% horisontell och vertikal position från mitten

FILLSTYLE

 FILLSTYLE 0 ; fyll utan skraffering (default)
FILLSTYLE 1 ; enkel svart skraffering (horisontell)
FILLSTYLE 2 ; enkel svart skraffering (45 grader)
FILLSTYLE 3 ; enkel svart skraffering (-45 grader)
FILLSTYLE 4 ; enkel svart skraffering (vertikal)
FILLSTYLE 5 ; röd skraffering i kors (45 degrees)
FILLSTYLE 6 ; röd skraffering i kors (0 grader)
FILLSTYLE 7 ; blå skraffering i kors (45 degrees)
FILLSTYLE 8 ; blå skraffering i kors (0 grader)
FILLSTYLE 9 ; blå skraffering trippelkryssad
FILLSTYLE 10 ; enkel svart skraffering (bred) (45 grader)

; anpassad skraffering anger en lista med följande argument:
; – style (1 = enkel, 2 = dubbel, 3 = trippel skraffering)
; – färg
; – avstånd
; – grader

FILLSTYLE [2, “green”, 3pt, 15°] ; grön korsad skraffering (15 grader)

Ritobjekt

CIRCLE

 CIRCLE 100 ; rita en cirkel (diameter = 100pt)

ELLIPSE

 ELLIPSE [50, 100] ; rita en ellips med 50pt samt 100pt i diameter
ELLIPSE [50, 100, 2h, 12h] ; rita en elliptisk sektor (från positionen kl 2 till kl 12)
ELLIPSE [50, 100, 2h, 12h, 2] ; rita ett elliptiskt segment
ELLIPSE [50, 100, 2h, 12h, 3] ; rita en elliptisk båge

SQUARE

 SQUARE 100 ; rita en kvadrat (storlek = 100pt)

RECTANGLE

 REKTANGEL [50, 100] ; rita en rektangelform (50×100pt)
REKTANGEL [50, 100, 10] ; rita en rektangel med avrundade hörn

POINT

 POINT ; rita en punkt med pennans storlek och färg

STÄNG kan förbinda de sista punkterna, FYLL kan fylla formen definierad av punkter. Till exempel, det är enkelt att rita en "platt" stjärna som börjar från centrum:

 PENUP
REPEAT 5 [
FORWARD 80
POINT
BACK 80
RIGHT 36
FORWARD 50
POINT
BACK 50
RIGHT 120
] FILL

LABEL

 LABEL “text” ; skriver ut text vid sköldpaddans position
LABEL 'text' ; se ovan
LABEL "text ; se ovan (endast för enstaka ord)

TEXT

 CIRCLE 10 TEXT “text” ; ange texten för det aktuella objektet

Teckensnittsinställningar

FONTCOLOR/FONTCOLOUR

 FONTCOLOR “green” ; anger teckensnittsfärgen till grön

FONTFAMILY

 FONTFAMILY “Linux Libertine G” ; anger teckensnitt (-sfamilj)
FONTFAMILY “Linux Libertine G:smcp=1” ; anger även teckensnittseffekt (små bokstäver)
FONTFAMILY “Linux Libertine G:smcp=1&onum=1” ; små bokstäver + gammeldags stil

FONTSIZE

 FONTSIZE 12 ; anger 12pt

FONTWEIGHT

 FONTWEIGHT “bold” ; anger fet stil
FONTWEIGHT “normal” ; anger normal teckentjocklek

FONTSTYLE

 FONTSTYLE “italic” ; anger kursiv stil
FONTSTYLE “normal” ; återställer kursiv stil till normal

PICTURE (pic)

PICTURE är till

Gruppering av figurer

 ; PICTURE [ LibreLogo_kommandon]
PICTURE [ FORWARD 100 CIRCLE 100 ] ; trädliknande grupperad figur

Se även "Grupp" i hjälpen för LibreOffice Writer.

 TO tree location
PENUP POSITION location HEADING 0 PENDOWN
PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape
END

PICTURE [ tree [230, 400] tree [300, 400] ] ; grouped shapes in a grouped shape

Att påbörja nya streckfigurer

 PICTURE ; påbörja en ny streckfigur
FORWARD 10 PICTURE FORWARD 10 ; två streckfigurer

Sparar svg-bilder

 PICTURE “example.svg” [ CIRCLE 5 ] ; spara bilden som en SVG-bildfil i användarmappen
PICTURE “Desktop/example.svg” [ FORWARD 100 CIRCLE 5 ] ; som ovan, med en relativ sökväg
PICTURE “/home/user/example.svg” [ CIRCLE 5 ]; absolut sökväg för Unix/Linux
PICTURE “C:\example.svg” [ CIRCLE 5 ] ; absolut sökväg för Windows

Sparar svg-/smil-animationer (teckningar med SLEEP-kommandon)

 PICTURE “animation.svg” [ CIRCLE 5 SLEEP 1000 CIRCLE 99 ] ; spara som en svg-/smil-animation (se även SLEEP)
PICTURE “animation2.svg” [ CIRCLE 5 SLEEP 1000 CIRCLE 99 SLEEP 2000 ] ; som ovan, men med SLEEP efter sista objektet vilket resulterar i en loop: efter 2 sekunder så startas svg-animationen om i webbläsare som stöder smil.

Konsekvent vid vänster kant

Använd BILD för att behålla linjefigurers placering konsekvent vid vänsterkanten av Writer:

 PICTURE [ CIRCLE 20 POSITION [-100, 100] CIRCLE 20 ]

Iterativa satser

REPEAT

 ; REPEAT antal [ kommandon]

REPEAT 10 [ FORWARD 10 LEFT 45 CIRCLE 10 ] ; upprepa 10 gånger
 ; antal är valfritt

REPEAT [ POSITION ANY ] ; oändlig loop

REPCOUNT

Loopvariabel (även i FOR- och WHILE-loopar).

 REPEAT 100 [ FORWARD REPCOUNT LEFT 90 ]

FOR IN

Loop för listposterna:

 FOR i IN [1, 5, 7, 9, 11] [
FORWARD i
LEFT 90
]

En slinga (loop) för alla tecken i en teckensekvens:

 FOR i IN “text” [
LABEL i
FORWARD 10
]

WHILE

 WHILE TRUE [ POSITION ANY ] ; oändlig loop
WHILE REPCOUNT <= 10 [ FORWARD 50 LEFT 36 ] ; as REPEAT 10 [ ... ]

BREAK

Avbryt loopen.

 REPEAT [ ; oändlig loop
POSITION ANY
IF REPCOUNT = 100 [ BREAK ] ; motsvarigheten för REPEAT 100 [ ... ]
]

CONTINUE

Hoppa till nästa steg i loopen.

 REPEAT 100 [
POSITION ANY
IF REPCOUNT % 2 = 0 [ CONTINUE ]
CIRCLE 10 ; rita cirklar på varannan position
]

Villkor

OM

 ; IF villkor [ sant block ]
; IF villkor[ sant block ] [ falskt block ]

IF a < 10 [ PRINT “Small” ]
IF a < 10 [ PRINT “Small” ] [ PRINT “Big” ]

AND, OR, NOT

Logiska operatorer

 IF a < 10 AND NOT a = 5 [ PRINT “0, 1, 2, 3, 4, 6, 7, 8 or 9” ]
IF a < 10 AND a != 5 [ PRINT “0, 1, 2, 3, 4, 6, 7, 8 or 9" ] ; som ovan

Subrutiner

TO, END

Nytt ord (eller procedur).

 TO triangle
REPEAT 2 [ FORWARD 100 RIGHT 120 ] FILL
END

REPEAT 10 [ triangle PENUP POSITION ANY PENDOWN ]

OUTPUT

Returvärde från funktionen.

 TO randomletter
OUTPUT RANDOM “qwertzuiopasdfghjklyxcvbnm”
END

PRINT randomletter + randomletter + randomletter ; skriver ut 3 slumpmässigt valda tecken

STOP

Avslutar process.

 TO example number
IF number < 0 [ STOP ]
PRINT SQRT number ; skriver ut kvadratroten
]

example 100
example -1 ; utan utdata och fel
example 25

Standardvariabler

ANY

Standard slumpmässiga färgvärden etc.

 PENCOLOR ANY ; slumpmässig pennfärg

TRUE

Logiskt värde.

 WHILE TRUE [ POSITION ANY ] ; ändlös loop
PRINT TRUE ; skriver ut true

FALSE

Logiskt värde.

 WHILE NOT FALSE [ POSITION ANY ] ; ändlös loop
PRINT FALSE ; skriver ut false

PAGESIZE

 PRINT PAGESIZE ; skriver ut pappersstorlekar i punkter, t.ex. [595.30, 841.89]

PI/π

 PRINT PI ; skriver ut 3.14159265359

Input/Output

PRINT

 PRINT “text” ; skriver ut “text” i en dialogruta
PRINT 5 + 10 ; skriver ut 15

INPUT

 PRINT INPUT “Inmatningsvärde?” ; frågar efter och skriver ut en sträng via en frågedialog
PRINT FLOAT (INPUT “Första numret?”) + FLOAT (INPUT “Andra numret?”) ; enkel kalkylator som adderar två värden

SLEEP

 SLEEP 1000 ; vänta i 1000 ms (1 sekund)

GLOBAL

Anger globala variabler som används i procedurer.

 GLOBAL about
about = “LibreLogo”

TO example
PRINT about
GLOBAL about ; när vi vill lägga till ett nytt värde
about = “nytt värde för den globala variabeln”
END

example
PRINT about

Funktioner

RANDOM

 PRINT RANDOM 100 ; slumpmässigt flyttal (0 <= x < 100)
PRINT RANDOM “text” ; slumpmässigt tecken från "text"
PRINT RANDOM [1, 2] ; slumpmässig post från listan (1 eller 2)

INT

 PRINT INT 3.8 ; skriver ut 3 (heltalsdelen (integer-delen) av 3.8)
PRINT INT RANDOM 100 ; slumpmässigt heltal (0 <= x < 100)
PRINT INT “7” ; konverterar en strängparameter till ett heltal (en integer)

FLOAT

 ; konverterar strängparametern till ett flyttal
PRINT 2 * FLOAT "5.5" ; skriver ut 11.0

STR

 ; konverterar den numeriska parametern till en sträng
PRINT “Resultat: ” + STR 5 ; skriver ut “Resultat: 5”
PRINT 10 * STR 5 ; skriver ut 5555555555

SQRT

 PRINT SQRT 100 ; skriver ut 10, kvadratroten av 100

SIN

 PRINT SIN 90 * PI/180 ; skriver ut 1.0 (sinus av 90° i radianer)

COS

 PRINT COS 0 * PI/180 ; skriver ut 1.0 (cosinus av 0° i radianer)

LOG10

 PRINT LOG10 100 ; skriv ut 2.0 (logaritmen av 100)

ROUND

 PRINT ROUND 3.8 ; skriver ut 4 (avrundar 3.8)
PRINT ROUND RANDOM 100 ; slumpmässigt heltal (0 <= x <= 100)

ABS

 PRINT ABS -10 ; skriver ut 10, det absoluta värdet av -10

COUNT

 PRINT COUNT “text” ; skriver ut 4, det antal tecken som strängen “text” innehåller
PRINT COUNT [1, 2, 3] ; skriver ut 3, listans storlek

SET

 ; konverterar listan till ett Python-set
PRINT SET [4, 5, 6, 6] ; skriver ut {4, 5, 6}
PRINT SET [4, 5, 6, 6] | SET [4, 1, 9] ; skriver ut {1, 4, 5, 6, 9}, union
PRINT SET [4, 5, 6, 6] & SET [4, 1, 9] ; skriver ut {4}, skärningspunkten
PRINT SET ([4, 5, 6, 6]) - SET [4, 1, 9] ; skriver ut {5, 6}, differensen
PRINT SET [4, 5, 6, 6] ^ SET [4, 1, 9] ; skriver ut {1, 5, 6, 9}, symmetriska differensen

RANGE

 ; Python-like list generation
PRINT LIST RANGE 10 ; print [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
PRINT LIST RANGE 3 10 ; print [3, 4, 5, 6, 7, 8, 9]
PRINT LIST RANGE 3 10 3 ; print [3, 6, 9]

FOR i IN RANGE 10 50 10 [ ; loop for [10, 20, 30, 40]
FORWARD i
LEFT 90
]

LIST

 ; tar bort upprepade poster från en lista med set och listkonvertering
PRINT LIST (SET [1, 3, 5, 5, 2, 1]) ; skriver ut [1, 3, 5, 2]

TUPLE

Konverterar till en Python tuple (lista som inte går att ändra)

 PRINT TUPLE [4, 5]

SORTED

Returnerar en sorterad lista.

 PRINT SORTED [5, 1, 3, 4]; skriver ut [1, 3, 4, 5]

SUB

Ersätter teckensekvenser med hjälp av regex-mönster (reguljära uttryck).

 PRINT SUB("t", "T", "text"); skriver ut "Text", ersätter "t" med "T"
PRINT SUB("(.)", "\\1\\1", "text"; skriver ut "tteexxtt", dubblerar alla tecken

SÖK

Söker efter teckensekvenser med hjälp av reguljära uttryck.

 IF SEARCH (“\w”, "word") [ PRINT “Letter in the word.” ]

FINDALL

Hittar alla teckensekvenser i en sträng som matchar ett givet reguljärt uttryck.

 PRINT FINDALL("\w+","Hundar,  katter."); skriver ut "Hundar", "katter"], listan med ord.

MIN

 PRINT MIN [1, 2, 3]; skriver ut 1, listans minsta element

MAX

 PRINT MAX [1, 2, 3]; skriver ut 3, det största elementet i listan

Färgkonstanter

 PENCOLOR "SILVER"; välj färg via namn
PENCOLOR[1], väljer färg via identifierare
PENCOLOR "~SILVER"; slumpmässig silverfärg

ID

Namn

0

BLACK

1

SILVER

2

GRAY/GREY

3

WHITE

4

MAROON

5

RED

6

PURPLE

7

FUCHSIA/MAGENTA

8

GREEN

9

LIME

10

OLIVE

11

YELLOW

12

NAVY

13

BLUE

14

TEAL

15

AQUA

16

PINK

17

TOMATO

18

ORANGE

19

GOLD

20

VIOLET

21

SKYBLUE

22

CHOCOLATE

23

BROWN

24

INVISIBLE


Stötta oss!