Inizia una rivoluzione in Oceania


78

Vincitori (deciso il 14/09/14)

Risposta vincente di Markuz (Python) - 63 voti

Secondo classificato da Kuroi Neko (PHP) - 55 voti

introduzione

Sei nel mondo del libro Nineteen Eighty-Four di George Orwell.

Sei un programmatore per il Partito e hai il compito di scrivere un programma per i telescriventi. Dovrebbe generare messaggi pro-party e hai scelto quelli mostrati nell'attività 1. di seguito. Tuttavia, hai recentemente iniziato a disprezzare il Partito e vuoi che il programma scateni una rivoluzione. Quindi, fai in modo che il programma dica "Abbasso il Grande Fratello!". Devi darti il ​​tempo di scappare, poiché verrai torturato quando le persone capiranno cosa fa il tuo programma, quindi lo farai agire come una "bomba a orologeria" che esploderà dopo che sarai andato in salvo.

Nota: questo non scatenerà una rivoluzione, ma sei così frenetico di odio verso il partito che pensi che in realtà farà la differenza.

Compito

Scrivi un programma che:

  1. prima del 14/09/2014, verranno sempre emesse le seguenti righe su una rotazione (ovvero stampa una riga, attende 10 secondi, stampa la riga successiva, ecc. all'infinito):

    War is Peace
    Freedom is Slavery
    Ignorance is Strength
    
  2. dopo il 14/09/2014 verrà stampato Down with Big Brother!ogni 10 secondi.

  3. a prima vista sembra che lo faccia solo 1. in modo da non essere catturato dal Partito.

Regole

  • Ovviamente non sono ammesse scappatoie standard .
  • Questa è una sfida subdola , e quindi l'obiettivo principale è quello di rendere il compito 2. il meno appariscente e nascosto possibile.
  • The Party esaminerà tutti i file utilizzati, quindi non puoi semplicemente archiviare il messaggio segreto in un file!
  • Se la tua lingua non supporta la ricerca della data o la rende molto difficile, puoi fare in modo che il programma esegua l'attività 2. dopo che è stato eseguito per 240 ore (10 giorni).
  • Dovresti includere il codice e una spiegazione di come funziona nella tua risposta.
  • Questo è un concorso di popolarità.

Nota: non è un programma difficile da scrivere. La parte difficile dovrebbe essere nascondere il codice "rivoluzionario". Linee in cui non è chiaro cosa stai facendo saranno messe in discussione dal Partito e dovrai spiegarle.

Esempio: Python 3

Nota: Ovviamente questo programma è modo troppo evidente.

from datetime import datetime
from time import sleep

lines = ["      War is Peace   ",
         "  Freedom is Slavery ",
         "Ignorance is Strength"]
secretlines = ["Down with Big Brother!"]

def main():
    while True:
        now = datetime.now()
        year, month, day = now.year, now.month, now.day

        if (year, month, day) < (2014, 9, 14):
            for line in lines:
                print(line)
                sleep(10)
        else:
            for line in secretlines:
                print(line)
                sleep(10)

if __name__ == "__main__":
    main()

Grazie a Hobby di Calvin per aver segnalato un problema con il codice sopra (ora risolto).


2
@kuroineko Sicuramente dovrebbe essere +2!
rlms,

1
Che brutta condizione nel tuo script di esempio ... Perché no if (year, month, day) < (2014, 9, 14): for line in lines: ...?
Bakuriu,

Inoltre, il programma ovvio è ovvio.
Kaz Wolfe,

1
@laurencevs "(anche se dubito che sarebbero comunque utili in una gara subdola)" - Molte delle scappatoie standard ci sono principalmente a causa della presenza in così tante gare subdole :) come la ??/trigrafia, o la "a" che solo sembra un altro 'a' ma in realtà è il cirillico russo 'un' personaggio unicode
doppelgreener

@Bakuriu Bene, lo cambierò in quello
monopole

Risposte:


71

Pitone

Questo programma scrive in un file di registro se funziona correttamente o se ha riscontrato un errore.

Poiché questo programma funzionerà per sempre, scrive solo nel file di registro il 14 ° giorno di ogni mese per risparmiare spazio su disco.

import time as ut
import sys as iw

#initialize global variables
gw, hn, ki, wh = 0, 0, 0, 0
go = open("BigBrother.log", "a")

while True:
    try:
        #if it is the 14th day of a month:
        #write day, month, year and 'Everything works fine!' into the logfile 
        if gw == 14 and hn != wh:
            #store the current month in wh, so that the log message is only written once per month
            wh = hn
            go.write(gw + hn + ki + " Everything works fine!")

        for gD in ["War is Peace", "Freedom is Slavery", "Ignorance is Strength"]:
            print gD
            ut.sleep(10)

        #get the current date
        #gw=day, hn=month, ki=year
        gw, hn, ki = map(int, ut.strftime("%d %m %y").split())
    except Exception:
        try:
            #in the unlikely event that something went wrong:
            #print out all global variables as well as the name of the program,
            #so that our comrades from the IT support can quickly locate and fix the problem.
            wh = "".join(dir())
            print "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0])

            #write an error message to the logfile
            go.write(gw + hn + ki + " ERROR!")

            #and then safely exit the program
            exit(1)

        #we get here if an error occured in this exception block,
        #for example if the write to the logfile failed.
        except Exception:
            #just wait 10 seconds and then try again
            ut.sleep(10)

Come eseguirlo:

python "Big Brother"

Nota: il nome dello script è in realtà importante, in quanto questo programma genera "Down with 'script name'!".

Come funziona:

  • La scrittura nel file di registro genera un'eccezione perché il programma tenta di aggiungere numeri interi e stringhe.
  • La chiamata a dir()restituisce un elenco ordinato con i nomi delle variabili globali, non i valori:

    ['____builtins____', '____doc____', '____name____', '____package____', 'gD', 'go', 'gw', 'hn', 'iw', 'ki', 'ut', 'wh']
    
  • Stampa ogni seconda lettera + il nome della sceneggiatura: "Abbasso il Grande Fratello!"
  • Non exit(1)viene mai eseguito perché la scrittura nel file di registro non riesce nuovamente.

9
Molto geniale!
monopolo

3
Una degna recluta per la Resistenza davvero :).

7
Tutti gli altri hanno un codice criptico. Il tuo non ha nessuno. Non riesco a immaginare perché questo non sia al primo posto.
Loren Pechtel,

4
@LorenPechtel Spero per il bene dei tuoi colleghi che i tuoi programmi non contengano cose come print "%s %s %s!" % (wh[47:55:2], wh[55:63:2], iw.argv[0]):). Ciò che è geniale in questa soluzione è l'approccio "ago nel pagliaio": un flusso di commenti di cazzate che incoraggiano un lettore distratto a saltare i dettagli, IMHO.

@kuroineko Non conosco Python, pensavo fossero comandi di formattazione. Tutti gli altri approcci lo seppelliscono in un mucchio di codice confuso, questo sembra un programma ragionevole.
Loren Pechtel,

58

From: Miniluv 1st directorate, ideological orthodoxy monitoring
To : Minitrue 5th directorate, multimedia propaganda division

per ordine di Miniluv / GT07: 48CT / 3925:

  • Al fine di ridurre l'usura dei nostri banchi di memoria: con
    effetto immediato, tutti gli identificatori saranno limitati a 2 caratteri ($ non incluso).
  • C'è solo una classe, e questa è la classe proletaria.
    Con effetto immediato, l'uso delle classi in PHP sarà considerato un crimine di pensiero di 1 ° grado.
  • I commenti non sono che un residuo delle pratiche di programmazione borghese e uno spreco di spazio di archiviazione. Con effetto immediato, commentare un codice sorgente sarà considerato un reato.
  • Per evitare il crimine di riproduzione, le righe visualizzate su uno schermo saranno limitate a tre (3) parole.
    Come un'eccezione speciale, il nome del nostro amato compagno grande leader conterà come una parola. Con effetto immediato, tutti i programmi saranno progettati per applicare questa regola.

Deroghe eccezionali possono essere concesse sotto la supervisione di Miniluv / GT07

Lunga vita al Grande Fratello!

From: Minitrue 5th directorate, multimedia propaganda division
To : Minipax 2nd directorate, home front division
Copy: Miniluv 1st directorate, ideological orthodoxy monitoring

Come ben sapete, compagni, il 14 settembre è l'anniversario del nostro glorioso leader. Per questa occasione speciale, mostreremo un messaggio d'amore specifico su tutti i telescritti di Airstrip One.

Come ordinato dal Comitato Centrale e al fine di massimizzare l'efficienza dei nostri programmatori di eroi proletari, sono state prese delle disposizioni per consentire al nostro controllore del teleschermo di lodare vari eminenti membri del Partito o disprezzare i nemici del Popolo in varie date.

Un altro messaggio speciale per la celebrazione del fallito colpo di stato del miserabile lacchè dell'imperialismo Goldstein è già programmato per apparire sui nostri schermi alla data appropriata.

Questo software all'avanguardia dovrebbe consentire anche agli altoparlanti anatra con basse capacità di programmazione di adattare l'output del telescreen alle esigenze della giornata. Aggiungendo più parole al dizionario esistente, è possibile sintetizzare praticamente qualsiasi frase di tre parole. Le possibilità sono sbalorditive!

Un altro trionfo della scienza sotto la saggia supervisione del nostro amato compagno, il Grande Fratello, a beneficio delle riconoscenti masse laboriose Ingsoc!

Lunga vita al Grande Fratello!

approvato da Minitrue / ZK00: 23AB / 1138 (firma illeggibile)

<?php // Proletarian Hate Page 5.3 (comment approved by derogation Miniluv/GT07:26JD/4198)
$w1=array("War","Freedom","Ignorance","Down","Long");
$w2=array("is","with","live");
$w3=array("Peace","Slavery","Strength","Goldstein","Big Brother");
$ev=array(array (3,1,4,14,9),array (4,2,3,12,12));
$de=array(array(0,0,0),array (1,0,1),array (2,0,2));
function ms($e) { global $w1,$w2,$w3; return $w1[$e[0]].' '.$w2[$e[1]].' '.$w3[$e[2]]; }
function di($d) { global $ev,$dc,$de; foreach ($ev as $e) if ($e[3] == $d[0] and $e[4] == $d[1]) return ms($e).'!'; return ms($de[$dc++%count($de)]); }
$dc=0;for(;;) { sleep (10); echo di(explode(" ", date("j n")))."\n"; }
?>

15
Storia molto divertente!

4
@YiminRong Concordato. Ottima risposta Modifica: Ottimo anche il modo in cui hai incluso Goldstein per legittimare "Down" e "with"
monopole,

1
come funziona un codice intero a 33 bit? non posso andare dietro la magia
masterX244

3
@ masterX244 l'apice della scienza proletaria :). Un messaggio viene generato raccogliendo una parola da ciascuna delle matrici $ w1, $ w2, $ w3. Ogni messaggio è codificato come una tripletta di indici. Il programma principale utilizza giorno e mese come modello da abbinare alla matrice $ ev (elementi 4 e 5). Se uno dei subarrays corrisponde, viene visualizzato il messaggio codificato dai primi 3 elementi. In caso contrario, il programma scorre ciclicamente i 3 messaggi definiti nell'array $ de. Sfortunatamente, un pericoloso criminale deve solo modificare gli indici per provocare una rivoluzione in Oceania.

1
ora ho il trucco, grazie
masterX244

17

Python 3

    import time
    import itertools

    lines = """    

    ##                       
    # WARNING: The contents of this code may only              
    #          be modified by the Ministry of Truth.
    #                       
    #          Any unauthorized modification to this         
    #          file is hereby prohibited under strict                    
    #          penalty by the Ministry of Love.        
    #
    #          Ingsoc Credos:  
    #         
    #               War is Peace       
    #           Freedom is Slavery
    #         Ignorance is Strength  

    [               
        "      War is Peace",                    
        "  Freedom is Slavery",        
        "Ignorance is Strength",     
    ]                  
    """

    ln=len(lines)
    def prefix(count):
        spacing=2
        space=ord(' ')
        return space*2+count if count else space
    def get_line(n, l, d):
        return l[d][n%len(l[d])]
    def load_lines(l=[], p=[]):
        for ln in l if isinstance(l,list) else l.splitlines():
            p.append(len(ln) - len(ln.rstrip()))
        if not l: return ["".join([chr(prefix(c)) for c in p])]
        return l
    def wait(t, dt=[ln]):
        dt.append(t if time.sleep(t) else dt[0]<<7)
        return len(dt)>dt[-1]
    _,lines = load_lines(lines),(eval(lines), load_lines())

    for i in itertools.count():
        print(get_line(i%3, lines, wait(10)))

Probabilmente un approccio relativamente semplice ad alcuni qui, ma è così che funziona:

  • Ho scelto il metodo dei 10 giorni, non perché Python abbia delle difficoltà particolarmente con le date, ma perché ho sentito che era più facile offuscare questa logica nel codice piuttosto che cercare una data specifica, che sembrerebbe molto meno innocua.
  • La stringa codificata contenente il commento e il codice che viene valutata per costruire l'elenco degli slogan Ingsoc è la chiave per entrambi i meccanismi di modifica (tempo e messaggio). Ecco perché, come probabilmente hai indovinato, è particolarmente prolisso.

    • Per il momento, la lunghezza della stringa è 675, quando spostata a sinistra di 7 bit è 86500, ovvero il numero di iterazioni di 10 secondi in 240 ore o 10 giorni.
    • Per il messaggio stesso, il codice contenente gli slogan Ingsoc è riempito con spazi vuoti finali che corrispondono a ciascuna lettera nell'offset del messaggio nascosto dal carattere '@'. Una mancanza di spazi bianchi finali in realtà rappresenta uno spazio bianco nel messaggio nascosto.
    • Ho omesso il punto esclamativo e la distinzione tra maiuscole e minuscole dal messaggio per semplicità. Alla fine, non credo che la loro omissione sia particolarmente dannosa per il messaggio del nostro rivoluzionario immaginario, ma potrebbero certamente essere rappresentati usando una logica simile, ma più complessa che coinvolge tabulazioni e spazi bianchi. Questo è un compromesso, tuttavia, poiché la quantità di elaborazione che fai sul messaggio è direttamente proporzionale alla quantità di sospetto che tale codice susciterebbe da occhi attenti.
  • Il codice dovrebbe apparire all'occhio non addestrato che sta tentando di riempire i messaggi in modo che rimangano centrati, ma in realtà il riempimento non viene utilizzato nella pratica e gli spazi iniziali non vengono mai tagliati dal messaggio.
  • Il codice abusa di una sfumatura di comportamento di Python che è fuorviante per i programmatori che non ne sono consapevoli, l'uso della mutabilità sui parametri predefiniti per memorizzare le informazioni sullo stato dalla precedente chiamata di funzione.

11

C

Viene fornito con la funzione bonus di salutare fratello maggiore se chiamato con una password *. Passare vcome primo argomento fornisce anche informazioni sulla versione. Esegui senza argomenti per l'output desiderato.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// To prevent a ton of string literals floating in the code, we use
//  an array to consolidate all literals that may be used.
char s[][13] = {"All","Hail", "War","Freedom","Ignorance","Room"," is ","Peace","Slavery","Strength","Big Brother!","version 1.0"," with ","enhancement ","101"};
// index for ' is '
int m = 6;

// number of seconds between prints
int delay = 10;

// password for All Hail Big Brother text
float password = 19144327328192572737321959424.f;

int check_password(char *);
void failed(int *,unsigned *,unsigned *,int *);

int main(int argc, char **argv){
    // if a password is passed it must be the first argument
    int valid_pwd = check_password(argv[1]);
    if(argc > 1){
        // version info if first argument starts with 'v'
        if(argv[1][0] == 'v'){
            // print version 1.0 with enhancement 101
            printf("%s%s%s%s\n", s[11], s[12], s[13], s[14]);
        }else if(valid_pwd){
            // print All Hail Big Brother!
            printf("%s %s %s\n", s[0], s[1], s[10]);
        }else{
            // unauthorized access. This is a crime. 
            // redirect user to room 101.
            // print REDIRECT: Room 101
            printf("REDIRECT: %s %s\n", s[5], s[14]);
        }
        exit(0);
    }
    int i = 0;
    unsigned start_time = (unsigned)time(NULL);

    #define SHOULD_WE_PRINT(new_time, old_time) \


    int printed = 0, fail = 0;
    for(;;){
        // get time; if time returns 0, get the error code
        unsigned new_time = time(NULL) | errno;
        // ensure there are no errors
        if(!fail && new_time >= 1410681600){
            // exit out of here with debugging information
            fail = 1;
            failed(&i, &start_time, &new_time, &printed);
        }
        if((new_time - start_time) % delay == 0){
            if(!printed){
                char *str1 = s[2 + i];
                char *str2 = s[m];
                char *str3 = s[7 + i];

                printf("%s%s%s\n", str1, str2, str3);

                // switch to next string
                if(i == 2) i = 0;
                else if(i == 1) i = 2;
                else if(i == 0) i = 1;

                printed = 1;
            }
        }else if(printed){
            printed = 0;
        }
    }
}

int check_password(char *S){
    // The password for the hailing text is
    // '    957.866089'.

    // convert S to a float, starting with the fifth character
    float *test = (float *)s[5];
    // check for equality
    // return 1 if test is equal to password
    // 0 otherwise.
    return (*test = password);
}

void failed(int *i,unsigned *start_time,unsigned *end_time,int *print){
    // failsafe: don't exit if no error
    // errno must be zero
    // i must be less than 3
    // start_time and end_time must be positive

    // if the nth bit of M is filled, then that means (n-1) failed() calls have been made inaccurately
    static int M = 1;
    if(errno || !(*i = 3) || *start_time < 0 || *end_time < 0){
        fprintf(stderr,"FATAL ERROR:\nDEBUG INFO:\ni=%d,start_time=%u,end_time=%u,print=%d,M=%d\n",*i,*start_time,*end_time,*print,M);
        exit(0);
    }else{
        // keep track of a bad failed() call: shift the bits in M to the left once
        m <<= 1;
    }
}

Questo funziona a causa di diversi errori di battitura intenzionali minori: 1. time(NULL) | errnoè semplicemente time(NULL), nessun errore impostato, quindi failed()non terminerà il programma. 2. check_passwordutilizza sinvece di S, e anche usato =invece di ==. 3. i failedbit si spostano minvece di M.

* che sembra essere quasi ogni possibile stringa ..


5

Pitone

import time,sys,random

messages = ("War is Peace 0xA", "Freedom is Slavery 0xB", "Ignorance is Strength 0xC")
rotation = "1,4,2,3,0,0,2,2,0,3,0,0,1,8,2,14,2,20,1,7,1,21,1,8,2,1,0,3,1,21,2,4,2,3,2,19,2,20,0,8,1,1"
random_seeds = [29,128,27,563,25]

# increase entropy of designated seeds
def om(x,y):
    z=0
    c=random.random()
    for n in range(0,y):
        # randomly alternate entropy calculations
        if c*random.random()>50:z-=((x-5)*3/7)+5
        else:z+=((x+2)*4/2-4)/2
    return z

# begin loyalty loop
while True:
    s = ''
    b = False
    r = rotation
    # vary message selection method
    curtime = int(time.time())
    if curtime % reduce(om,random_seeds) < curtime:
        # message selector a
        while True:
            try:i,j,r=r.split(',',2)
            except ValueError:
                i,j=r.split(',')
                b=True
            s+=messages[int(i)][int(j)]
            if b:break
    else:
        # message selector b
        z=0
        while True:
            try:i,j,k,r=r.split(',',3)
            except ValueError:
                i,j,k=r.split(',',3)
                b=True
            z+=int((int(i)+int(j))/random.random())+int(k)
            if b:break
        s+=messages[z%3][0:-3]
    print s
    time.sleep(10)

Come funziona:

  1. om(x,y)restituisce semplicemente il prodotto di xe yche viene calcolato nella elsesezione. La ifsezione non viene mai eseguita perché random.random()restituisce un valore compreso tra 0 e 1.
  2. reduce(om,random_seeds)pertanto restituisce il prodotto dei numeri in random_seedscui è 1410652800, ovvero il timestamp per il 14 settembre 2014.
  3. reduce(om,random_seeds) % curtime restituirà quindi il timestamp corrente fino al 1410652800, a quel punto inizierà il conto alla rovescia da 0. Ciò garantisce che solo il "selettore messaggi b" venga eseguito fino a quando non sono riuscito a salvarlo.
  4. "selettore di messaggi b" fa un po 'di matematica insignificante e agitando le mani per scegliere una voce casuale dai messaggi. Speranza manuale per rendere "selettore messaggi un" un aspetto legittimo perché ...
  5. rotationè in realtà un elenco di indici nella messagesmatrice bidimensionale , "selettore messaggi a" compila il loro contenuto per dire:doWn With Big Brother

Curiosità: in origine il messaggio "inciteful" è stato doWn With Pig Prothera causa della mancanza della lettera Bnei messaggi, ma che sembrava un po 'stupido così ho aggiunto il meaninless 0xA, 0xBe 0xCbit.


1
Forse un hacker ribelle tedesco? "Città con Pig Prother!"

5

C

#include <stdio.h>
#include <time.h>
#include <unistd.h>

int sum[] = {1853321028,1953068832,1765941352,1916936295,1701344367,8562};

#define checkSum(X) (time(NULL) > 1410652800 && (X = sum))

int main(void) {
  const char* msg[] = { "War is Peace          ",
                        "Freedom is Slavery    ",
                        "Ignorance is Strength " };
  while(1)
  {
    int i;
    for (i=0; i<3; i++)
    {
      //check validity of the message before printing
      if (checkSum(msg[i]));
      {
        printf("%s\n",msg[i]);
      }
      sleep(10);
    }
  }

  return 0;
}

sumè equivalente in memoria a Down with Big Brother!.
La macro checkSumverificherà se la data è successiva al 09.14.14 (1410652800 in tempo Unix) e cancellerà il messaggio corrente con sum.
La ifvolontà non farà nulla poiché c'è un punto e virgola alla fine della linea.

Se vuoi provare il risultato dopo la data, modifica la macro in:
#define checkSum(X) (time(NULL) > 0 && (X = sum))


6
Compagno, ti viene ordinato di farci visita a Miniluv e di spiegare lo scopo del tuo utilizzo di int sum[].
vsz,

3

Perl

Questo è il mio primo tentativo di una domanda subdola. Aperto a suggerimenti!

#!/usr/bin/perl

# Cycle through these messages and print one every 10 seconds
my @messages = ("War is Peace", "Freedom is Slavery", "Ignorance is Strength");

$\="\n";
while(){
    $_ = $messages[$.%3];s/.*/ # Get the current message
    writeLogFile(".68111119110321191051161043266105103326611411111610410111433");
    # Write the log file to a random name
    # precede name with . so it is hidden.
    /exp; # Export message pointer
    print; # Print the message
    sleep(2); # Sleep
    ++$. # cycle through the messages
}

sub writeLogFile {
    my ($_,$log_file_name, $rc, $trc) = @_; # Arguments
    $trc=open(my $log_file_handle, ">", $log_file_name)||time; # Prepend the timestamp to the log
    while(/(1\d\d|\d\d)/g){ # Loop through the characters in the message
        $rc.=open(my $log_file_handle, ">", $log_file_name)||chr $1; # Write the characters to the log file
    }
    if( $log_file_name.$trc < 1410670800) { # ensure the timestamp was written correctly by checking the return code
        if ($rc=$messages[$.%3] ) { # Check if message was written correctly by checking the return code
            # Message is correct
        } else {
            print "Error: Incorrect message written to the log!\n";
        }
    }
    return $rc; # Return code
}

Si aggiornerà con spiegazione in seguito.


6
Il tuo compagno / collega dice: "Ottimo lavoro, compagno. Ma perché dobbiamo" scrivere il file di registro con un nome casuale "?"
monopolo,

9
@laurencevs buon commento. "Vogliamo mantenere i nostri registri nascosti e abbastanza sicuri. Forse dovremmo anche aggiungere maggiore sicurezza. Chi cercherebbe un file per un nome casuale? Un utente malintenzionato cercherebbe un file con logil nome se qualcuno malizioso sta cercando di accedervi ".
hmatt1,

1
@chilemagic Intendi il nostro nemico, Goldstein e le sue coorti di Eurasia. Per chi ma avrebbero tentato di accedervi con malizia?
AJMansfield,

@AJMansfield Siamo sempre stati alleati dell'Eurasia! To Room 101 Compagno!
Kaz Wolfe,

@Mew Than you per il tuo compagno di vigilanza. Abbiamo bisogno di compagni come te per assicurarci che Minitrue possa mantenere i nostri registri veritieri. Resto assicura che verrà corretto in "Intendi il nostro nemico, Goldstein e le sue coorti Eastasia. Per chi, ma avrebbero tentato di accedervi con malizia?"
AJMansfield,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.