Jonas IslandDebug-Menü
',''+cart+engBlock);}
function xpGame(id,name,label){xpCloseWin();XP.game=label||name;const doc=p8Srcdoc(id);if(!doc){XP.game=null;run(()=>say(J,'Das Spiel ist nicht installiert. Die CD liegt irgendwo in der WG.'));return;}
const w=document.createElement('div');w.id='xpgame';w.innerHTML='
✕
';w.querySelector('.xpt span').textContent=name;w.querySelector('.xpx').onclick=()=>xpCloseWin();const f=w.querySelector('iframe');f.srcdoc=doc;document.body.appendChild(w);xpWinEl=w;xpPlace();addEventListener('resize',xpPlace);addEventListener('message',xpMsg);setTimeout(()=>{try{f.contentWindow.focus();}catch(e){}},300);}
function xpMsg(e){if(e.data==='p8close')xpCloseWin();}
function xpCloseWin(){XP.game=null;if(xpWinEl){xpWinEl.remove();xpWinEl=null;removeEventListener('message',xpMsg);removeEventListener('resize',xpPlace);}}
function closeDesktop(){if(!xpOpen)return;xpCloseWin();XP.menu=false;closeup=null;xpOpen=false;
run(async()=>{await say(J,pick(['Herunterfahren. Er fährt runter. Das dauert. Wie 2009.','Windows wird heruntergefahren. Ich auch, gleich. Erst die Prüfungen.','Genug gespielt. Die Prüfungen warten. Mega Mett Männchen auch, aber der kann warten.']));});}
/* ================= FILMABEND: Jonas spielt selbst ================= */
// #filmabend in the URL, the host filmabend.jonas-island.de or typing "popcorn" starts a fresh game that plays itself: Jonas walks the whole
// solution, says why he does what he does, reads the pictures and photos, and the credits roll at the end.
// Nothing is written to the autosave meanwhile (NOSAVE), so the player's own game stays as it was.
const AUTO={on:false,q:[],duel:false,sel:-1,stop:false,joker:false,sent:'',kiosk:false};
const AUTO_HASH=/filmabend/i,AUTO_HOST=/^filmabend\./i,KIOSK_HASH=/kiosk/i;
// birthday: on 28 October (or with #geburtstag in the URL) the title gets balloons and the tutors sing in the Z10
const BDAY_FORCE=/geburtstag/i.test(location.hash);
function isBday(){if(BDAY_FORCE)return true;const d=new Date();return d.getMonth()===9&&d.getDate()===28;}
const BDAY_COLS=['#fc5454','#fcfc54','#54fc54','#5494fc','#fc54fc','#fca854'];
function drawBalloons(t){for(let i=0;i<7;i++){const x=Math.round(22+i*46+Math.sin(t*0.8+i)*6),y=Math.round(160-((t*9+i*41)%180));g.fillStyle=BDAY_COLS[i%6];
for(let dy=-8;dy<=8;dy++){if(y+dy>=RH)break;const w=Math.round(Math.sqrt(Math.max(0,1-(dy/8)**2))*6);g.fillRect(x-w,y+dy,w*2,1);}g.fillStyle='#fcfcfc';g.fillRect(x-1,y-5,1,3);g.fillStyle='#d0d0d0';g.fillRect(x,y+9,1,Math.max(0,Math.min(14,RH-y-9)));}}
function confetti(){for(let i=0;i<70;i++)spawn(Math.random()*W,-4-Math.random()*40,(Math.random()-0.5)*16,18+Math.random()*16,BDAY_COLS[i%6],2,2,4+Math.random()*2,6);}
async function bdaySong(){cutscene=true;sfx('fanfare');confetti();await say(CHOR,'Happy Birthday, lieber Jonas!');confetti();await say(CHOR,'Happy Birthday to you!');
await say(J,'...Woher wisst ihr das?');await say(T2,KI_STORY?'Kalender. Und das Internet. Und die KI hat es gesagt. Zweimal.':'Kalender. Und das Internet. Und Paddy.');await say(J,'Danke. Ich bin gerührt. Und ein Jahr älter. Beides geht vorbei.');cutscene=false;} // #filmabend oder filmabend.jonas-island.de
async function think(s){const c=J.color;J.color='#9ad8ff';try{await say(J,s);}finally{J.color=c;}}
const autoIdle=async()=>{for(;;){if(!busy&&!cutscene&&!dialog&&!closeup&&!J.walking&&!anyTalk()&&!menu){if(AUTO.stop)throw 'film';return;}await wait(80);}};
async function autoPick(d){while(dialog===d&&anyTalk())await wait(100);await wait(900);if(dialog!==d||!AUTO.on)return;const o=d.opts;let i=-1;
if(AUTO.duel){const ok=new Set(DUEL.map(x=>x.ok));const jk=o.findIndex(x=>x.startsWith('Telefonjoker'));if(jk>=0&&!AUTO.joker){AUTO.joker=true;i=jk;}else i=o.findIndex(x=>ok.has(x));}
if(i<0){const want=AUTO.q.shift();i=want?o.findIndex(x=>x.includes(want)):o.length-1;if(i<0){console.warn('Film: Antwort fehlt: '+want);i=o.length-1;}}
AUTO.sel=i;await wait(700);AUTO.sel=-1;if(dialog!==d)return;dialog=null;d.r(i);}
async function autoAct(room,verb,id,item,ans,comment){
while(menu)await wait(200);if(AUTO.stop)throw 'film';
if(room&&S.room!==room)console.warn('Film: in '+S.room+' statt '+room+' bei '+verb+' '+id);
if(comment)await think(comment);
AUTO.q=ans?ans.slice():[];
const h=id?ROOMS[room||S.room].hot.find(x=>x.id===id):null;if(id&&!h)throw new Error('Film: kein Hotspot '+room+'/'+id);
if(item&&!has(item))console.warn('Film: '+item+' fehlt');
const a=item?ITEMS[item]:h,b=item&&h?h:undefined;
AUTO.sent=verb==='Gehe zu'&&!h?'':verb+' '+a.name+(b?(verb==='Gib'?' an ':' mit ')+b.name:'');
if(h&&h.walk)await doAction(verb,a,b);else await run(()=>execute(verb,a,b));
await autoIdle();await wait(350);
}
const FA=(r,v,id,item,ans,c)=>()=>autoAct(r,v,id,item,ans,c);
const FC=c=>async()=>{await think(c);};
const FGO=(from,exit,to,c)=>async()=>{await autoAct(from,'Gehe zu',exit,null,null,c);if(to)await autoAct('karte','Gehe zu','m_'+to);};
const FU=(it,c)=>()=>autoAct(null,'Benutze',null,it,null,c);
const FL=(it,c)=>()=>autoAct(null,'Schau an',null,it,null,c);
const FDUEL=f=>async()=>{AUTO.duel=f;};
const FW=ms=>async()=>{for(const t0=now;now-t0{const f=async()=>{AUTO.ch=f.idx;if(AUTO.rec)AUTO.rec.push(b64u(svEncode(saveState())));};f.ch=name;return f;};
const FILM=[
FCH('Der Aussichtspunkt'),
FC('Filmabend. Ich spiele heute selbst. Ihr lehnt euch zurück, ich erkläre, was ich tue. Und warum.'),
FC('Regel eins in jedem Adventure: erst reden, dann anfassen. Der Mann mit dem Fernrohr zuerst.'),
FA('lookout','Rede mit','ausguck',null,['Wer bist du','Lass mich runter','Ich muss los']),
FC('Er lässt mich nicht runter. Und er klingt durstig. Also schaue ich, was hier so herumsteht.'),
FA('lookout','Schau an','fass',null,null,'Ein Fass. Rosé, Jahrgang 2003. Der Zapfhahn ist festgerostet. Ich bräuchte einen Hebel.'),
FA('lookout','Schau an','busch',null,null,'Im Busch raschelt etwas. In Adventures raschelt nie etwas umsonst.'),
FA('lookout','Nimm','busch',null,null,'Regel zwei: alles einsammeln, was nicht niet- und nagelfest ist.'),
FC('Ein Gummihuhn mit Seilrolle. Die Rolle ist aus Metall. Metall ist ein Hebel. Das Huhn ist ein Werkzeug.'),
FA('lookout','Benutze','fass','huhn'),
FA('lookout','Benutze','fass','glas',null,'Mein Weinglas, endlich mit Inhalt. Nicht für mich. Für den Durstigen da drüben.'),
FA('lookout','Nimm','feuer',null,null,'Vorher noch, weil man es in jedem Adventure einmal versuchen muss:'),
FA('lookout','Benutze','feuer','huhn'),
FA('lookout','Schau an','mond'),
FA('lookout','Gib','ausguck','rose',null,'Gut. Rosé öffnet Türen. Und Münder.'),
FGO('lookout','pfad','kino','Weiter in die Stadt. Auf der Karte: die Innenstadt, mit der Schauburg. Der Mittelpunkt von allem.'),
FCH('Freiburg'),
FA('kino','Schau an','plakat1',null,null,'Erst mal umsehen. Das Plakat da... Moment. SpongeBob. Das weckt Erinnerungen.'),
FA('xmas','Nimm','maroni',null,null,'Erst Maroni. Auf jedem Weihnachtsmarkt. Ich habe jede Tüte geteilt. Offiziell, weil es mir zu viel war.'),
FA('xmas','Gib','fr1','maroni',['zu geizig','zu viel. Offiziell'],'Die halbe Tüte. Wie jedes Jahr. Er will erst nicht. Ich muss ehrlich sein. Fast.'),
FA('xmas','Gehe zu','xeingang',null,null,'Freiburg, Weihnachtskino. Im Foyer hängt die Galerie der Pioniere. Die muss man gesehen haben.'),
FA('foyer','Schau an','pio2',null,null,'Das bin ich. Spitzname prozac. Mehr sage ich dazu nicht.'),
FA('foyer','Schau an','pio4',null,null,'Und Patrick. Der Mann hinter dem Weihnachtskino. Den Spitznamen auf dem Schild merke ich mir.'),
FA('foyer','Gehe zu','fexit'),
FA('xmas','Benutze','xhuette',null,null,'Ein Kinderpunsch, und zurück nach Karlsruhe. So funktioniert Zeitreise.'),
FCH('Das Z10'),
FA('kino','Gehe zu','bartuer',null,null,'Ins Z10. Da sitzt Paddy hinter der Bar, und drei Tutoren, die mir sagen werden, was ich zu tun habe.'),
FA('bar','Rede mit','barkeeper',null,null,'Paddy kennt jeden. Mit ihm rede ich zuerst.'),
FA('bar','Rede mit','tutoren',null,['mächtiger Student werden','Tschüss'],'Die Tutoren. Ich will ein mächtiger Student werden. Also sage ich das. Laut.'),
FC('Ohne Namensschild reden sie nicht mit Erstis. Namensschilder gibt es bei der O-Phasen-Begrüßung. Im Gerthsen. Merken.'),
FA('bar','Schau an','partyfoto',null,null,'Das Partyfoto über ihren Köpfen. Das war ich. Mit Laura und ihrer Kollegin.'),
FA('bar','Nimm','hund',null,null,'Der Hund. Jedes Adventure hat ein Tier, das man nicht mitnehmen kann.'),
FC('Er hat aber ein gutes Gespür. Wer hängt, winselt bei ihm. Ich heute hoffentlich nicht.'),
FA('bar','Drücke','jukebox',null,null,'Und die Jukebox. Einmal drücken.'),
FW(12000),FC('Gut. Weiter. Sonst stehe ich hier noch um Mitternacht und singe mit.'),
FGO('bar','tuerL'),
FCH('Hörsaal, Mensa, WG'),
FGO('kino','stadt','hoersaal','Zum Gerthsen-Hörsaal. Eine Vorlesung überstehen, ein Namensschild holen.'),
FA('hoersaal','Schau an','pizza',null,null,'Vorher das Schild an der Wand. Pizza bestellen verboten. Mit Diagrammen. Softwaretechnik I. Wir haben trotzdem bestellt.'),
FA('hoersaal','Benutze','platz',null,null,'Ich setze mich. Und... schlafe ein. Das ist keine Schwäche, das ist Physik.'),
FC('Der Tutor sagt: Kaffee. Mensa. Also: Mensa.'),
FGO('hoersaal','tuer','mensa'),
FA('mensa','Benutze','automat',null,null,'Der Kaffeeautomat. Mal sehen, was er will.'),
FC('Kein Kaffee ohne Tablett, und die FriCard hat der Schwabe in der WG. Zwei Probleme. Erst das Tablett.'),
FA('mensa','Schau an','malibu',null,null,'Hans-Dieter-Detlef weint in sein letztes Tablett. Ein Taschentuch kostet mich nichts. Waschbar.'),
FA('mensa','Gib','malibu','taschentuch'),
FGO('mensa','ausgang','wg','Tablett. Jetzt die FriCard. Zur WG, zum Schwaben. Der steht im Flur. Immer.'),
FA('wg','Schau an','putzplan',null,null,'Der Putzplan. Laminiert. „Kehrwoche: Jonas.“ Ich ahne, was gleich kommt.'),
FA('wg','Rede mit','schwabe',null,['FriCard','Wo ist eigentlich der Besen','Ich mach mich']),
FC('FriCard gegen Kehrwoche. Und der Besen ist beim Klingonen. Der ist in der Küche. Natürlich.'),
FA('wg','Gehe zu','kuetuer'),
FA('wgkueche','Rede mit','klingone',null,['Lebe lang','nuqneH','Kann ich mal','Qapla'],'Der Klingone. Ich versuche es erst mal mit der falschen Franchise. Nur zum Spaß.'),
FC('Er will einen Kriegsruf hören. Den kenne ich nicht. Aber sein Wörterbuch steht in meinem Regal. Geliehen. Seit 2012.'),
FA('wgkueche','Schau an','muffins',null,null,'Vorher noch das Muffinblech. Keksebacken in der WG, jedes Jahr.'),
FA('wgkueche','Rede mit','brief'),
FA('wgkueche','Gehe zu','ktuer'),
FA('wg','Gehe zu','jtuer'),
FA('jzimmer','Schau an','kbuch',null,null,'Das Wörterbuch. Eselsohr auf der richtigen Seite.'),
FA('jzimmer','Schau an','dvds',null,null,'Wo ich schon hier bin: meine DVD-Sammlung. Der Deal: schlechtere Klausurnote, schlechte DVD. Ich habe viele.'),
FA('jzimmer','Schau an','weste',null,null,'Und die Kaschmirweste. Sechzig Grad. Puppengröße.'),
FA('jzimmer','Schau an','bingo'),
FA('jzimmer','Schau an','abizeitung',null,null,'Die Abizeitung auf dem Schreibtisch. Genie mit Hang zum Wahnsinn. Drei Seiten reichen, den Rest kenne ich auswendig.'),
FA('jzimmer','Nimm','abizeitung',null,null,'Die nehme ich mit. Allgemeinwissen zum Nachschlagen. Man weiß nie.'),
FA('jzimmer','Gehe zu','ztuer'),FA('wg','Gehe zu','kuetuer'),
FA('wgkueche','Rede mit','klingone',null,['Kann ich mal','Heghlu'],'Heute ist ein guter Tag zum Fegen.'),
FA('wgkueche','Gehe zu','ktuer'),
FA('wg','Gehe zu','jtuer',null,null,'Mit Besen in der Hand muss man das einmal versuchen:'),
FA('jzimmer','Benutze','swposter','besen'),
FA('jzimmer','Gehe zu','ztuer'),
FA('wg','Benutze','treppe','besen',null,'Kehrwoche. Das Treppenhaus. Mit Schnitt, wie im Film.'),
FA('wg','Schau an','gemaelde',null,null,'Das Gemälde im Flur. Drei feine Herren, Schulfreunde. Mike hat geheiratet.'),
FA('wg','Öffne','umschlag',null,['Aufmachen','Balken bleibt'],'Der Umschlag vor der WC-Tür. „Beweise“, steht drauf. Ich schaue nur zensiert. Ich weiß, was ich mir zumute.'),
FGO('wg','treppe','mensa','FriCard in der Tasche. Zurück zum Automaten.'),
FA('mensa','Benutze','automat',null,null,'Kein Guthaben. Natürlich nicht.'),
FA('mensa','Benutze','aufwerter',null,null,'Der Aufwerter will Geld. Ich habe keins. Was hat ein Student? Pfand.'),
FCH('Pfand und Kaffee'),
FGO('mensa','ausgang','wg','In der WG-Küche steht der Altglasberg. Das Erbe von 23 Mitbewohnern.'),
FA('wg','Gehe zu','kuetuer'),
FA('wgkueche','Nimm','altglas'),
FA('wgkueche','Benutze','spuele','altglas',null,'Der Schwabe meckert aus dem Flur: ungespült. Also spülen. Dann nimmt es Fred.'),
FA('wgkueche','Gehe zu','ktuer'),
FGO('wg','treppe','fred','Zu Fahrrad-Fred. Pfand gegen Geld.'),
FA('fred','Rede mit','fred',null,['Nehmen Sie Pfand','Vorgeschichte','Ich schau mich']),
FA('fred','Gib','fred','kiste_wg'),
FA('fred','Gehe zu','exit_fred',null,null,'Fünf Euro. Reich. Zurück in die Mensa.'),FA('karte','Gehe zu','m_mensa'),
FA('mensa','Benutze','aufwerter'),FA('mensa','Benutze','automat',null,null,'Kaffee. Endlich. Der schwerste Kaffee meines Lebens.'),
FGO('mensa','ausgang','hoersaal'),
FU('kaffee','Kaffee trinken, dann die Vorlesung. Diesmal bleibe ich wach.'),
FA('hoersaal','Benutze','platz',null,['Nummer 3','1825','Gastdozentenhaus','Zwei X','Ich bin oben','Afrikanisch','Jojoba'],'Die Vorlesung ist ein Quiz. Ich kenne die Antworten. Das war schon in der Schule mein Problem.'),
FGO('hoersaal','tuer','kino','Namensschild. Jojobaöl-Jonas. Zurück ins Z10, Bericht erstatten.'),
FA('kino','Gehe zu','bartuer'),FA('bar','Rede mit','tutoren',null,['in der Truhe','Tschüss'],'Drei Prüfungen, sagen sie. Film-Fechten, Diebstahl, Schatzsuche. Ich frage trotzdem, was in der Truhe ist.'),
FA('bar','Rede mit','barkeeper',null,null,'Paddy hat auch einen Auftrag. Er redet nur mit Leuten im Kostüm. Ich hatte mal einen Bademantel.'),
FGO('bar','tuerL'),
FCH('Kostüm und Kinokarte'),
FA('kino','Rede mit','cineast',null,null,'Prüfung eins: Herr Petrow. Der Cineast. Er duelliert sich nur mit Leuten, die eine Karte für seine Traumfabrik haben.'),
FA('kino','Rede mit','kasse',null,['Traumfabrik','Kostüm','Danke'],'Die Kasse. Karte und Kostüm, beides frage ich hier.'),
FC('Die Karten sind ausverkauft, eine Japanerin hat zwei. Und für den Bademantel aus der Fundkiste muss ich mich ausweisen.'),
FA('kino','Gib','kasse','ausweis'),
FU('bademantel','Der Bademantel. Ein Kostüm ist ein Kostüm. Ich bin jetzt ein Jedi.'),
FGO('kino','stadt','mensa','Die Japanerin: Yuki, an Linie 3 in der Mensa. Ich sollte vorher wissen, was es an Linie 3 gibt.'),
FA('mensa','Schau an','linie3'),FA('mensa','Rede mit','yuki',null,['Eiga','Sanban','Arigatou'],'Eiga: Film. Sanban: Nummer drei. Mehr Japanisch brauche ich nicht.'),
FGO('mensa','ausgang','kino'),FA('kino','Rede mit','cineast',null,['später'],'Zu Petrow, mit Karte. Er erklärt die Regeln: vier Runden, und ohne meine Notizen aus seinen Vorträgen bin ich chancenlos.'),
FC('Vier Notizen. Hitchcock liegt in seiner Traumfabrik. Kubrick und Lynch irgendwo in der WG. Und Kultfilme... hat Paddy, als Bierdeckel. Der Reihe nach.'),
FCH('Küche und Traumfabrik'),
FA('kino','Gehe zu','bartuer'),FA('bar','Rede mit','barkeeper',null,['Gin Tonic','B-52','Hilfe','Patrick.','Bierdeckel','Doch nichts'],'Erst mal etwas bestellen. Dann helfen. Paddy wird fragen, ob ich wirklich beim Weihnachtskino war. Ich kenne den Namen vom Schild.'),
FA('bar','Gehe zu','tuerR',null,null,'In die Küche. Feuer löschen, Leergut mitnehmen. Und Paddys Bierdeckel liegen überall in der Stadt.'),
FA('kueche','Nimm','leergut'),FA('kueche','Benutze','loescher'),FA('kueche','Nimm','leergut'),FA('kueche','Nimm','bdh',null,null,'Bierdeckel eins: Hoepfner, auf dem Regal.'),
FA('kueche','Gehe zu','ktuer'),FGO('bar','tuerL'),FGO('kino','stadt','fred','Noch eine Kiste für Fred. Geld ist Geld, und Kaffee kostet.'),FA('fred','Gib','fred','kiste_z10'),
FA('fred','Gehe zu','exit_fred'),FA('karte','Gehe zu','m_kino'),FA('kino','Gehe zu','eingang',null,null,'In die Traumfabrik. Petrows Hitchcock-Vortrag. Mit Vorfilm über die Post. Ich werde einschlafen. Ich weiß es.'),
FA('saal','Benutze','sitz'),
FA('saal','Gehe zu','stuer',null,null,'Eingeschlafen, Handouts verpasst. Also Kaffee. Und in der Mensa liegt ein Bierdeckel, habe ich gesehen.'),
FGO('kino','stadt','mensa'),FA('mensa','Nimm','bdm',null,null,'Bierdeckel zwei: Moninger, vom Tisch der Malibu-Gruppe.'),FA('mensa','Benutze','aufwerter'),FA('mensa','Benutze','automat'),
FGO('mensa','ausgang','kino'),FA('kino','Gehe zu','eingang'),FU('kaffee','Kaffee. Jetzt bleibe ich wach bis zum Handout.'),FA('saal','Benutze','sitz'),FA('saal','Nimm','handouts',null,null,'Notizen Hitchcock. Eins von vier.'),
FA('saal','Gehe zu','stuer'),FGO('kino','stadt','wg','Kubrick: der Ordner mit Petrows Vorträgen steht in meinem Zimmer. Ganz oben im Regal.'),
FA('wg','Gehe zu','kuetuer'),
FA('wgkueche','Rede mit','klingone',null,['Lynch'],'Lynch: meine Notizen hat der Klingone. Er übersetzt sie. Und ihm fehlt ein Wort.'),
FC('Kaffee. Twin Peaks ohne Kaffee ist sinnlos. Das Wort steht im Wörterbuch, unter K. In meinem Regal.'),
FA('wgkueche','Gehe zu','ktuer'),FA('wg','Gehe zu','jtuer'),
FA('jzimmer','Schau an','ordner',null,null,'Erst der Ordner. Ganz oben. Klettern wäre Sport. Aber ich habe ein Huhn mit Seilrolle.'),
FA('jzimmer','Benutze','ordner','huhn'),
FA('jzimmer','Öffne','buch',null,null,'Und das Japanisch-Lehrbuch, das rote. Yuki hat es erwähnt. Was liegt da als Lesezeichen drin?'),
FL('schatzkarte','Mein Ersti-Ticket von 2007. Sieht aus wie eine Schatzkarte. Mit Fußnoten. Das X ist im Schlossgarten.'),
FA('jzimmer','Schau an','kbuch',null,null,'Und unter K wie Kaffee: qa’vIn.'),
FA('jzimmer','Gehe zu','ztuer'),FA('wg','Gehe zu','kuetuer'),
FA('wgkueche','Rede mit','klingone',null,['Lynch','qa’vIn','Qapla']),
FA('wgkueche','Gehe zu','ktuer'),
FCH('Die Audimax-Treppe'),
FGO('wg','treppe','treppe','Prüfung zwei: der Humpen im Verbindungshaus. Dafür brauche ich eine Verbindungsmütze. Und an der Audimax-Treppe rodelt die Lila Pause mit genau solchen Leuten.'),
FA('treppe','Schau an','foto',null,null,'Erst das Schwarze Brett. Da hängt ein Foto von der Schneekugel. Eine echte Kugel aus Schnee, auf dem Campus.'),
FA('treppe','Rede mit','lpt',null,['mitmachen','Viel Spaß'],'Mitmachen heißt: die Treppe runter, auf dem Tablett, ohne zu schreien.'),
FA('treppe','Benutze','treppe'),
FU('taschentuch','Ich habe geschrien. Jeder schreit. Also: Taschentuch in den Mund. Würde.'),
FA('treppe','Benutze','treppe',null,null,'Noch mal. Diesmal stumm.'),
FL('muetze','Die Mütze vom Verbindungsstudenten sitzt. Sieht gut aus. Sagt niemand, aber ich weiß es.'),
FA('treppe','Gehe zu','exit_treppe'),FA('karte','Gehe zu','m_fred'),FA('fred','Gib','fred','kiste_lila',null,'Die Lila-Kiste zu Fred. Das Pfand finanziert diese ganze Geschichte.'),
FCH('Verbindungshaus'),
FA('fred','Gehe zu','exit_fred'),FA('karte','Gehe zu','m_verbindung',null,null,'Das Verbindungshaus. Am Tor steht ein Fuchs. Füchse reden gern.'),
FA('vhaus','Rede mit','fuchs',null,['hinter der Tür','Schönen Abend']),
FC('Der Goldene Humpen, Tradition seit 1847. Bewacht von Wachpudeln. Beides merke ich mir.'),
FA('vhaus','Gehe zu','vtuer'),FA('kneipe','Nimm','bdb',null,null,'Bierdeckel drei: Badisch Brauhaus, an der Tafel.'),
FA('kneipe','Öffne','vitrine',null,null,'Die Vitrine. Da ist der Humpen. Da sind auch die Pudel.'),
FA('kneipe','Schau an','pudel',null,null,'Bismarck und Metternich. Sie schlafen nur bei sehr langweiligen Reden.'),
FA('kneipe','Benutze','pudel','huhn',null,'Vorher noch der Pflichtversuch mit dem Huhn.'),
FA('kneipe','Benutze','fstall',null,null,'Hinter der Tür wird gemurmelt. Mit einem Glas an der Tür könnte ich lauschen. Mein Glas hat der Ausguck.'),
FC('Die langweiligste Rede der Welt kenne ich. Sie liegt als Folien im Gerthsen. Erst die, dann das Glas.'),
FA('kneipe','Gehe zu','raus'),FGO('vhaus','exit_verbindung','hoersaal'),
FA('hoersaal','Nimm','projektor',null,null,'Folie 1 von 487: Die Geschichte der Post. Eine Waffe.'),
FGO('hoersaal','tuer','lookout','Und mein Glas. Beim Ausguck, der schläft.'),
FA('lookout','Nimm','ausguck'),
FA('lookout','Gehe zu','pfad'),FA('karte','Gehe zu','m_verbindung'),FA('vhaus','Gehe zu','vtuer'),
FA('kneipe','Benutze','pudel','folien',null,'Folie 1 von 487. Die Pudel schlafen nach drei.'),
FA('kneipe','Benutze','fstall','glas',null,'Das Glas an die Tür. Der Code ist das Gründungsjahr. 1847, hat der Fuchs gesagt.'),
FA('kneipe','Öffne','vitrine',null,['1847'],'Jetzt die Vitrine. Und dann... wird es nass.'),
FA('teich','Rede mit','wasser',null,null,'Unter Wasser. Zehn Minuten Luft. Zeit genug, um mit dem Wasser zu reden.'),
FA('teich','Schau an','laser',null,null,'Und all die Werkzeuge hier. Alle genau zwanzig Zentimeter zu weit weg.'),
FA('teich','Nimm','thumpen',null,null,'Der Humpen hängt an der Kette. Ich auch. Also nehme ich einfach beides mit.'),
FGO('vhaus','exit_verbindung','kino','Humpen zu den Tutoren. Der zweite Anteil.'),FA('kino','Gehe zu','bartuer'),FA('bar','Gib','tutoren','humpen'),
FCH('Schlossgarten'),
FGO('bar','tuerL'),FGO('kino','stadt','schlossgarten','Prüfung drei: der Schatz. Das X auf der Karte liegt im Schlossgarten.'),
FA('baustelle','Rede mit','bau',null,['Kombilösung fertig','Schlossgarten durch','Schöne Pause'],'Eine Baustelle versperrt den Weg. Der Bauarbeiter macht Pause. Ich frage, seit wann.'),
FC('Die Pause endet nach seinem Kaffee. Er hat keinen. Ich weiß, wo es welchen gibt.'),
FA('baustelle','Gehe zu','exit_schlossgarten'),FA('karte','Gehe zu','m_mensa'),FA('mensa','Benutze','aufwerter'),FA('mensa','Benutze','automat'),
FGO('mensa','ausgang','schlossgarten'),FA('baustelle','Gib','bau','kaffee',null,'Kaffee gegen Durchgang. Die Währung dieser Stadt.'),FA('baustelle','Gehe zu','zaun'),
FA('bruecke','Rede mit','waechter',null,null,'Ein Brückenwächter. Er stellt Fragen. Vorher will er ein Pferd sehen. Ich habe kein Pferd.'),
FC('Aber ich kenne Monty Python. Zwei Kokosnusshälften klingen wie ein Pferd. Und die Malibu-Gruppe hat Kokosnussbecher.'),
FA('bruecke','Gehe zu','bzur'),FA('baustelle','Gehe zu','exit_schlossgarten'),FA('karte','Gehe zu','m_mensa'),
FA('mensa','Rede mit','malibu',null,['Kokosnuss','Kopf hoch']),
FU('kokos','Klapp, klapp. Mein Pferd.'),FL('ausweis','Und der Wächter wird nach meiner Matrikelnummer fragen, das machen Wächter so. Steht auf dem Ausweis: 1384474.'),
FGO('mensa','ausgang','schlossgarten'),FA('baustelle','Gehe zu','zaun'),
FA('bruecke','Rede mit','waechter',null,['Jonas Böhler.','Schatz der Arrrr','1384474'],'Name, Ziel, Matrikelnummer. Die drei Fragen.'),
FCH('Ritter, Insel, Schatz'),
FA('bruecke','Gehe zu','bruecke'),FA('steich','Rede mit','ni',null,null,'Die Ritter vom Ni. Sie wollen ein Gebüsch. Natürlich wollen sie das.'),
FC('Ein Gebüsch. Der Busch am Aussichtspunkt. Zum Ausgraben brauche ich eine Schaufel. Der Bauarbeiter hat eine, er baut ja nicht.'),
FA('steich','Gehe zu','szur'),FA('bruecke','Gehe zu','bzur'),FA('baustelle','Rede mit','bau',null,['Schaufel','Schöne Pause']),
FA('baustelle','Gehe zu','exit_schlossgarten'),FA('karte','Gehe zu','m_lookout'),FA('lookout','Benutze','busch','schaufel',null,'Der Busch vom Ausguck. Ausgraben.'),
FA('lookout','Gehe zu','pfad'),FA('karte','Gehe zu','m_schlossgarten'),FA('baustelle','Gehe zu','zaun'),FA('bruecke','Gehe zu','bruecke'),FA('steich','Gib','ni','gebuesch',null,'Ein Gebüsch. Bitte sehr.'),
FC('Sie wollen noch eins. Etwas höher. Terrassenwirkung. Wer hat einen Busch, der höher ist? Der Schwabe. Seinen Buchsbaum. Laminiert.'),
FA('steich','Gehe zu','szur'),FA('bruecke','Gehe zu','bzur'),FA('baustelle','Gehe zu','exit_schlossgarten'),FA('karte','Gehe zu','m_wg'),
FA('wg','Rede mit','schwabe',null,['Buchsbaum','Ich mach mich']),
FGO('wg','treppe','schlossgarten'),FA('baustelle','Gehe zu','zaun'),FA('bruecke','Gehe zu','bruecke'),FA('steich','Gib','ni','buchs',null,'Der Buchsbaum. Als Quittung gibt es Bierdeckel vier: Vogelbräu.'),
FA('steich','Benutze','seil','huhn',null,'Das Stahlseil zur Insel. Das Huhn hat eine Seilrolle. Ich sagte doch: Werkzeug. Viermal.'),
FA('insel','Benutze','huegel','schaufel',null,'Das X. Graben.'),
FA('insel','Gehe zu','iseil',null,null,'Ein lausiges T-Shirt mit dem dritten Anteil im Etikett. Jetzt fehlt nur noch Petrow.'),FA('steich','Gehe zu','szur'),FA('bruecke','Gehe zu','bzur'),FA('baustelle','Gehe zu','exit_schlossgarten'),
FCH('Fechten und Finale'),
FA('karte','Gehe zu','m_kino'),FA('kino','Gehe zu','bartuer'),FA('bar','Rede mit','barkeeper',null,['Bierdeckel','Doch nichts'],'Vier Bierdeckel für Paddy. Dafür gibt es die Kultfilm-Notizen. Vier von vier.'),
FGO('bar','tuerL'),
FDUEL(true),FA('kino','Rede mit','cineast',null,['fechten'],'Film-Fechten. Vier Runden. Ich habe alle Notizen. Und einen Telefonjoker in der Tasche.'),FDUEL(false),
FL('todo','Alle drei Anteile. Die To-do-Liste ist fast leer.'),
FA('kino','Gehe zu','bartuer'),FA('bar','Benutze','truhe','anteil1',null,'Die Truhe. Drei Anteile, ein Geheimnis. Lagrange lässt grüßen.'),
FGO('bar','tuerL'),FGO('kino','stadt','fred','Und jetzt: ins HaDiKo. Zu Fuß wäre Sport. Fahrrad fahre ich nicht. Fred hat eine Rikscha. Mit Vorgeschichte.'),
FA('fred','Rede mit','fred',null,['Rikscha zum HaDiKo']),
];
const FILM_CHAPTERS=[];FILM.forEach((f,i)=>{if(f.ch){f.idx=FILM_CHAPTERS.length;FILM_CHAPTERS.push({name:f.ch,step:i});}});
// BEGIN FILM_STATES (generated by tools/tests/filmchapters.mjs: the game state at each chapter marker)
const FILM_STATES={n:260,s:["Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSAyYTFiCk0wb2JYMGR6Ym1jL1BrNVRBQTRzYVRNNGNZK0x4KzNqL3FhdXVZUDhsWWo2cTgvMDZ4a0VVRW9mSVRZMk5SZ0UKVlZVRVp6Sk5LdFd5aFkzUS9PejFrY1RmalplMjdmenE3dmtIQ2tOWlp5NG5LekZCQlIxS2NYa25BVTdjeG9LUQo1OEh4cGFDQm9OVERsYjIvcmJkYlJSMGRTbkJ4YkNaTkRrQkFYd3NuVkRUWXdObS8yL0w0b2c9PQo","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA0ZWJjCk0wb2JYMGR6Ym1jL1BrNVRBQTRzYmpVNWRjTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUnpBb0xUczJRRWs5YkRaOGRYUXo1Y1BZbUlTZHRiSzYwSWlVZ2QvcStPUGtDd29YVDE0b2JHdzcKZlZ4U1ZBcGJaaGQ1ZUlEQjVvL2p0clNtOUl1SXdKR3c5UGk0cXhvVFFsQndiUUo1Y2gwTURGUTVhV0kzTCtpcQowZFBkc2FybDlaclMK","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA2Y2Y5Ck0wb2JYMGR6Ym1jL1BrNVRBQTRzYmpVNWRjTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUjJFbWZDSTNXQXhpWkhGdGRESm1zNTJQbk4zTXI3YWh6TVRSZ1pHNnA2TGhEeFlNVkZRVEppRnIKY0UwWUFCa3FhRVo0Y1ltOHVwdTRwS1AyN0lDVm44Mzc4ZEQ3NVZwQ0ZSZHdQVW9tWkE1WFdnNDVPVjAzWWFXQwpuTjNUNUtXeXZOaksxZE9RcEtXcXVCY0JGRkFuT1NzOUpIaEtLMWxGYTJrYU5EK0FqSUtkdTdUampPS1F3TkxTCjd2M3hzdmxHTFYxV1FYNXFlUmdGR0FCRU9paGxZem5ZMGN6VjMrR3l2ZlNXbXRESGxLVHl0WStyVURkQ1VpQWEKTzM1bEhuaz0K","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA4MGFmCk0wb2JYMGR6Ym1jL1BrNVRBQTRzYmpVNWRjTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUjJFbWZDSTNXQXhpWkhGdGRESm1zNTJQbk4zTXI3YWh6TVRSZ1pHNnA2TGhEeFlNVkZRVEppRnIKY0UwWUFCa3FhRVo0Y1ltOHVwdTRwS1AyN0lDVm44Mzc4ZEQ3NVZwQ0ZSZHdQVXAzYWw5YlVSWkVZV2RuTi9EWAozOTJMcTZHejdaWGJ6dFhYcEtXcmhnd05HVWM2TEQ4eWJtQlhKUk5EWm1sTVVFN1AxNFNBb0xpOC9lemJ5c2lYCjlweW81T0ZITUYxQVVqTTlad2hDUzBJYk9paDdlbWlCaUo2Tmg3YTdyUFNBaVlxQTBPaTYvWS84RXhBUEVHdFAKQ0hCOVQyaGJHek55TG1sc2c4ZlAyL3Jxcjc2eTJaK1lpSXZDczZLdVJ4RWNjUkUyYjJkRUhBY0ZYVWN1SlRZbAowZGpha0pUdHZMT08rSmpQOXR1MHZMSHYK","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSAxN2I5Ck0wb2JYMGR6Ym1jL1BrNVRBQTRzYURrNWFZSGNuKzJwc0tHbHE4YTF6SkRvNTlMbzhFbFJCZ0llTm05eEpWRlMKSGdFR04zMXpKSU8xbElxYzh2VG1qOURKZzVuZzdmbTdvK2djREFSWlp5a3FQVGRaUWtsS2RtOHFEekdGdTQyVgo3b3pwNU95Qm9NN08yZXlzcHVrV0N3UUJSR2dxS24wRURoQVVVUk4yWTNPYXZjV3dpN3l1L2NyaGlZZkczZS96CjJ2THdHQlZlVEh3b0xTRW9XUVZnVWtkdGYzNSsvWnVJakpUQzRMcXkwY1hXeW9teHVxeXVBd1VSVlZNcEhTaDQKWjB4ZUdCSTNaaGR1Y1lLTmc1S3V1TFNtOUl1SWtaL2k5Ky9LOEZ4Wkh4ODVKVUZxWkE1TlVSMTFYR1IwWitqYwp3dFBkc3FtaXU0MlZ5TkxIN2F2OHJEc0tFMUE3UGo4L0lIaGNPQjBTY0dKV2JGVyt6OHFHcDZpay9lekJ3ZHZiCms2L2w5ZnhRUGg0QVVtaDVPRjFTVDExcmMydHJPU0dXa282RzMrRzBvYlhZK0llUTFxU2lwZC9rRjA1Q0RXNEkKSlNoOUVYQk9UR3dsTG10V25JQ2JtYmZxK09pOHdkM1J6NUhzN3VYNkJRMFNhVXBpYnpNWFMwOWtWa3hvUFQxagpsWUdkMXRLNjJlYTcrSTdjclpmNDQrSDJpak1JQVZsMUZESWdNQWtLVWt4N1luQWtNSmlVaU5HVDRMeW4rZnZDCjBNeUl1cmpGNmc5RlF5MFhJaTBNTFU4UkFRb1hNbTl6Y1dlSWw0U01wZXpKKzZIUDBNUzcxdWJoODdGMkVBTUUKSkdoa01peElRMzFaVjJGMFBUaU9pY0NOK3VmNnI2dkJodFRaek96bzEvTVJUVlZIV0hVME16WWlWM1ZYUlNwcgpMbVorMEx6UnpLcXFydVdxeE1YZGxaSzVvYi8vQ1F3Q0FpSWtPeXgyRkJSUVZWdGlkd0ZLanBqQzJJejJtckwrCmc4amswK3ZxNFBmK3FVa1hBUjB4YW40NWR4Wk5XQXA3U1hOM2Q5ek0yYml0dnUzaGdON2MzSldlKy9UeTlnMFcKQng5UWMzUmhLMEVXVFcxV2RXQkxjODZta3R6SHVaQ3J2dnVGMitQSjVlTHpwckpiSFZNVWFDSThaaWRLQjFKWgpjRzFzSFR1Sm5veW5sYXkyOS9TSXljVEsydjcvOHVJWVIwZFFWSFJqRWo5YUNoWVNFVVo5ZFhkNDdNN1ZoNktvCnRLYS8zNG1NanUvbTZxQzRDUm9WVnhKcmRuZ2xRd1JtWEY5bWNVaHh3N3pkMXBLOXZ2L255WnpYMzhQcThhZXcKVUVvOFdWSjljblpzQ2hNRUR3UUdKSGgrYlpLQnhkWCs0LzZpdDl2Q2tJaW11SzM1aXdaTVhGWkxLa3M2WVFFZApLVVVSTDJkb01NL0wyZDNNdUwzODc5M1ZtSnlNcWR1OXRySW5TaGg5TUN4elkwTlgK","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA2NGRkCk0wb2JYMGR6Ym1jL1BrNVRBQTRzYmpVNWRjTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUjJFbWZDSTNXQXhpWkhGdGRESm1zNTJQbk4zTXI3YWh6TVRSZ1pHNnA2TGhEeFlNVkZRVEppRnIKY0UwWUFCa3FhRVo0Y1ltOHVwdTRwS1AyN0lDVm44Mzc4ZEQ3NVZwQ0ZSZHdQVXAzYWw5YlVSWkVZV2RuTi9EWAozOTJMcTZHejdaWGJ6dFhYcEtXcmhnd05HVWM2TEQ4eWJtQlhKUk5EWm1sTVVFN1AxNFNBb0xqdDg3M1h3ZERxCnBLanY0djFDUGhOT1NtTmtOZ3BLVG1OY2QyNHRJVytRbFo3UDBhKzlwNkwvem9lYm1yenNvOWowWGtBVEVtY2QKSVg1bFgzWkpYQ1VyZVVGa2xJdUdpL1R5OC9XeWtNdlJ4S0RlNXU3bkYwNEtZbGRzSXpnWFNtaEdSVm91SlhObAprcEhVMklXUThmYis0SVhCbzl2ejQrREdyQ0FRV2tFN0VqVXdlUWRBVzBOK2NDczhmcDZUbUppZHRxbWs5L0xUCjBKcVE5TDdDK2taTEVqc1hLUndrUFFvSkNoY1pZM0Y3WURHUTJZS0x0YVhIc3EvQ3l2ZUp6dWpndGFrNEZnUVUKYldZMUpDeERjbFZKVzM5a096T0R6dGlHNSttcnVhdkt0K0hKMytqbzMrUkJWVjVhVmp3ek5qRXJaMDFLVTJ4egpZR0I1d1BYZmlyaTR1Y1djeE02UmpabWtyLy8wRGdVS1BoUWtNR0J1SHdsZUZsaHBURFpPaTk3YWxvcnhpdnZ3CndNdnY3dDdnN3Z5eXNRY1JCZzE0WkQ0K1lRQkdGQkkxVDNSblB0S0YxN1czN3ZXdmh0bk1sWnZKNCtyaS9Ra2IKQVZwSVBYSm1Pd2dZQVdaV2RFbHBjc1c2eWNTSnY1ZTc5L1hTOGRyZDh1TzF2cmxHUWg1YWRTc21KVzVWU2toVApOamc2UTJ5Tng5MmpsYUNyaXI3WTJNR2JnNmUydnZBQVFWdFFRaUo1RWpJWUNsbFJEMDh0SUNvaC9zN1ZsYkdqCnUrSHhuNXVNanZ2YjdLSzdEeHdFRzA5NGRuZ3BVUXQrV0JZOWQwNWhoTTNUa0pPL3NxNnAxNXlhenNPOXJycSsKRXhaNVFSdytLekUwV1ZaNVExQllaSHB4ZTVPS2dNMzEvdkRpcC9mVGpKejA4dm4zazF4U1hBSWZZdzBjTVZNRgpJa3hQZUdnOE1KZVBpSlNJdDZEODc1aVYzOVdDNGRINjZmUXhCMGNyTWk4MGUweGVYVTVlZnl3NWFuMlYydDZ0CjdyL3Q4YmVFbE5Qc3hPSDE1ZmRSYjFsZUN5b1hQekZNUjFoTFNua25PU2llbllxWGtxL3N1YXZ0L00zSmxycXUKc2RIeUZBZ1VKanNsSUhWeURsSkNXWFIxYzN0aW04T1QwTml6NkkyeGxJcUd4cC9ENWYzdkcySk1WeHNrSlQ4agpSbHBLVGtOZ1lqOEpjOENNaXR6Vi9iLzZ2Y1dldFlXN3BhUFQ5VVZaUWxacUp5cHJlUW9ORWhaWUt6OWtlOUtUCjlOWElxTDJsLyt2Y2hvMkNnS2I2bzBOZVYwMUxKbnhnZEdFR0F4NUtKRFl6ZXdtTnl0N1U5YVRKcDZTSG42dkwKcjYzbDdyWk5TVTFUVGpvN2VtMWZXd0llRGk5ZFB6VE1yc2lhKzdhdThlMjkxUT09Cg","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA5NGE3Ck0wb2JYMGR6Ym1jL1BrNVRBQTRzYmpVNWRjTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUjJFbWZDSTNXQXhpWkhGdGRESm1zNTJQbk4zTXI3YWh6TVRSZ1pHNnA2TGhEeFlNVkZRVEppRnIKY0UwWUFCa3FhRVo0Y1ltOHVwdTRwS1AyN0lDVm44Mzc4ZEQ3NVZwQ0ZSZHdQVXAzYWw5YlVSWkVZV2RuTi9EWAozOTJMcTZHejdaWGJ6dFhYcEtXcmhnd05HVWM2TEQ4eWJtQlhKUk5EWm1sTVVFN1AxNFNBb0xqdDg3M1h3ZERxCnBLanY0djFDUGhOT1NtTmtOZ3BLVG1OY2QyNHRJVytRbFo3UDBhKzlwNkwvem9lYm1yenNvOWowWGtBVEVtY2QKSVg1bFgzWkpYQ1VyZVVGa2xJdUdpL1R5OC9XeWtNdlJ4S0RlNXU3bkYwNEtZbGRzSXpnWFNtaEdSVm91SlhObAprcEhVMklXUThmYis0SVhCbzl2ejQrREdyQ0FRV2tFN0VqVXdlUWRBVzBOK2NDczhmcDZUbUppZHRxbWs5L0xUCjBKcVE5TDdDK2taTEVqc1hLUndrUFFvSkNoY1pZM0Y3WURHUTJZS0x0YVhIc3EvQ3l2ZUp6dWpndGFrNEZnUVUKYldZMUpDeERjbFZKVzM5a096T0R6dGlHNSttcnVhdkt0K0hKMytqbzMrUkJWVjVhVmp3ek5qRXJaMDFLVTJ4egpZR0I1d1BYZmlyaTR1Y1djeE02UmpabWtyLy8wRGdVS1BoUWtNR0J1SHdsZUZsaHBURFpPaTk3YWxvcnhpdnZ3CndNdnY3dDdnN3Z5eXNRY1JCZzE0WkQ0K1lRQkdGQkkxVDNSblB0S0YxN1czN3ZXdmh0bk1sWnZKNCtyaS9Ra2IKQVZwSVBYSm1Pd2dZQVdaV2RFbHBjc1c2eWNTSnY1ZTc5L1hTOGRyZDh1TzF2cmxHUWg1YWRTc21KVzVWU2toVApOamc2UTJ5Tng5MmpsYUNyaXI3WTJNR2JnNmUydnZBQVFWdFFRaUo1RWpJWUNsbFJEMDh0SUNvaC9zN1ZsYkdqCnUrSHhuNXVNanZ2YjdLSzdEeHdFRzA5NGRuZ3BVUXQrV0JZOWQwNWhoTTNUa0pPL3NxNnAxNXlhenNPOXJycSsKRXhaNVFSdytLekUwV1ZaNVExQllaSHB4ZTVPS2dNMzEvdkRpcC9mVGpKejA4dm4zazF4U1hBSWZZdzBjTVZNRgpJa3hQZUdnOE1KZVBpSlNJdDZEODc1aVYzOVdDNGRINjZmUXhCMGNyTWk4MGUweGVYVTVlTGlKMVpuYUhySTJWCnA2NzJ0K0xTeW9Ub25iRGg3ZnRXYjA4SURUNEJjSHRDUkVsS0N5dHhaMytUeE1DQXhlaW5nS1A4K01iVWxxejQKb3NiK1FrOFBQU3d1WlcwcVhrcENHeVZnY1hsN2l0TGlsSldqNDhQdnd0VFIxOUtENS8zK0N3NFBBUkEyYW1BNQpSMXhNV3dZdWIzTWlmZGl6eE0rWW82djY1b0tONHN6OTdPak5zRXRCQnhzN01ETStOVVJKWFZ3UlptOTRhNWpICjU5WElwN21rOWV2RWhwdVJ6ZWI0NndRTkVoUUhLbTl1YkQxUFR3c2FiVzF3STA3SjFONkpvZVNQOGZxSDBmdlUKNytyNzRyWmJYUkVlQVRVc0t5UU5BVjFlU0djVlAyV0hrb1hkdUxPMHR2WFZoSS9aMGVlZ3YvYXpGaHNRVm5SMApNRFUzUnh4SlBpTStkSE1vaHZYRzN1T2loNmlyem9tSWdZZXg0ZmI3RVFnTldRZzBaSFFqVXo4YkV4NHlaV01mCjM5M0QyYkw5NitQbzhJemZrNWUvcTZxNjVoc0NDVTlvZUhzS01Gc0dIQTFzQVdCeGJwbmd4TXFLNit5MnQ1V2QKaFpTYXBxTDFyd05XVzFZSlhXY3NNaFlZVEVNYkpDbG9YakxmMElnPQo","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSBiNmEKTTBvYlgwZHpibWMvUGs1VEFBNHNjanQxTnNLWTM2Nm9yK0w0bzhibTJjYno1b1NnNnhrZUYxeEpQaVluYWc1UwpUazRYYVNwK2ZjbXp3OWlHb3J2MzBZZll6c3UydHYzcjdQbENXeElaSUQ4MmVtaGRFZ1piS0RnNmZIaVppb25lCnV0TG4vSzNZN05XWmplSHY4UHdTUzFVT0hTRWxmU3hSQUFoWEdGUnJXWDJWa05xMDIvTDY4OUtqd01EYjUrSDAKNi9hN1RFdFFWRDUwWUR3L1V6aGlVbm9xSUdRdXNvclcyNXlQc0xpOXlvaUNrb2VwNXVIK0FRb0thVlVoUENWOQpOeE1MRmdwMUwxQnpTNEdNcFpHejQrdmwrcFBKMU5MQy8vVG8rRXRBVkVaaksxa29MVWxRYXhwNmNTUXZKT2JFCmg1S2FzdWI5dTkzYTJZeVEvZGkydGdFUUQxUW9JWHhrZlhaRWVsUmVkMDlyT2llWm40V1grZit5dEt2Yys5YmEKcWJYNThlOVBmVVZkWEhBOWVSTjFSMUJkTkRCN2FXNkh6Tm1QbHFDc2w3UEp4Y0RQelBUdHRJR3pBUTRGRG5aUApieWd0WG1FUUczeFdZWHRuZ29UWDBPZms0S3IxaHNEcng1cmQ4T0cyVEYwY2NSVXJLRGt4VDFsREZRUjRiWEp5Cnk5YU5wWWVvcEt2dDlwYUQ1TkR5MHZienAyTlREQWs2Qld4M1BVUkdVVlEzTTMxMGY0bkszOERlb0tTajcrT0YKbnN6WTlhbWJ2UmtNQkRBdE1DUnhZQmtmR1VoV2RXZzhMbWZZMkpYUzh1S0FzYmpyeTkyZndhKys0K0U1QVYxVApNaUVqTHhaYVNrbGJWV2xwUFhuYzNjNlZ1SzY5c3BIT2t1TGUyK0QzbUt4U1EwMGRHRDR4T0FnalFrWWFEVG83CllYY2doNzJMaXIyUHIvT1hnNXFDbTRycTVQUDZEekVBQ0I5alpITjRERVFlSG1obGZ6Y04xWWlTbDUyb3piYXcKeVAzbjBkcmxxYWprK1FZR1gwbzJJeTgrZkVjU1FsbzBXQzBnZVpXR3dQLy91TDJ1a1lDTHpOVFA3Zkh0OUFKWQpYQXdBUEdVL2ZFcGZDbWQrZjJwalpZTDVuNHlJcU03OHJvakIzTm5MdGIybXFLb0xEQXRSYlMwNUFISi9RQVFNCllIQTdWRFhLbUpxMW5wcWpwNzNPbjUrSWxiVDg4Zk1aQmhVR0NpTnVTM1ZYU1VsWVhoMDZLaWs5N0lTRm1xRG8KNHZmN2g0blY4K0g4NWJXdkJFeGFDRmxyT3kwcFRRODNCMEIxZGxrNHc0V1VtcDJpcmJqL2lNclN6OVRrNmZldApVQjB2Q1IwcGNuWnRKRlZEUjFkRGFIZHFjWUhHM2Q3ajdhbWZwdHJDam9uaG9LYmtoVThRR3drZVN3Z2hjaGxUCmFrMVlJUzl5WUp5WWg1U0s4UDZxcDVtQ2hwTEFwdHI3ei84QkhFRXlJbUJyTFFSZlNoY1piR1YrWjBlS200K1QKdU9tNDRhclQzZDJ2MHYvbjlMd1lPUWNKR21kR056Uk1YUTRFWFdOd2NDYlVrWmVTMmRlbnQ2SDY1NEdhd09UNQp0Wis1SEFJZk4yeHhNeVVyU1JNRlEyNTNjMzlrdk03ZWk1VDJ0NVdudzhPSWtKREU3UHpWQURRRkJsZC9QQ2c0ClVBVUxWVWxrY1d4MlpaYWFrOTdiNWFlM3FjdVk5dGJtcTd1YzhGSlJFZzg3Y1hkNU5GSlpURkpCTHl4N1VidUwKLzhqRzZMTy83dWJGd2RuODU2YXI1Uk1SQTAxTEl5Z25LaEpPQTBJUGRIbG5ld21ZblptQW0rT2V0clhOd0xpTQpzcU90OFAwRkdqQUtHSEo0TENVYkRCZ1FSejhJTFN6VWlKakR2TzNpc2JQWHdNTFl6ZWJzNFArelcwOU9WajBnCmVYa0ZVMThTWXkwbU1TNDYwcUNGbEtpbGk0aXF4Y1hiM3N5eHVmWHBHQlVaVnhCMktUY2tNbkZFVWtZeU5DWlAKa0luRDJiYW9sclMyc3NmWHh0RDN1THlwdmt0QlJCOHZQejFCYVVSV1UxbHNBWDF4YjR1cmtwYlYvYnF1dXRLTApsY2pSNU9QM2wxSUhTRjVKQXpBamVoWlBEMkZyYldwN0VpcVJsNENkNXYrMHVLL2YxSjZNK2JhNjkrVmFDUzRaCkltcGdDejV6UUY1V0V3SWdkbWFRbloyS21Pbm40cmpQMThDU21PNzY5Ym85UzFaWUFETmlHMzk0QlU1OVJtNXYKZURZNjA1aWZsS2k3cWE2a2hveVVrTENxM3ZYN0RSVVZTaThtWkhsM2JVTmZXeDBxSm1sdWdvcVNrNEdyci9mMQp3SUNRMStMazhQSG4rMVE5RkZKdlpSb3hPRjlKVlZGK2VHMHpJdENRbjVmZzRyNms3TSs5MGNQRSsvS0wxMFZPClV4YzVQaVloQkVrQ0Z3RkFZSEJsWXBhQXc4ZU1vL3E5ejcvZDFzbkVuY0czd2JOSklCQWVhM00zZkQ1VVZ4Y1EKSnlRZ2REZUIxTVhHbllleThQYU1uZHl4ME8vLzZkZE1VVlpiWEM0Nk5ESkpSUm9BQVNOa09pNDR6cHp0MTczMwo1dWl2cll2ZWlxMmFzYm0zQTFwWVYyUmxhekk0RGh3TVdGMTJZV1V3OWQzVjFNaXI0NFNyaUpPUXNwRGc2djI0ClVrSlhXUmxsYm54dVloZEJFbFJvYXg4c09NYmFuTVBIOS9YbDU2Q0cyOVdqdnFUVHEwRlBGUUJTY0hSbAo","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSAyZGE4Ck0wb2JYMGR6Ym1jL1BrNVRBQTRzWXk0eWZzTFNrYW1qdmFleCt0NzBsZHZ2L2RUMXZWRWZBQVVPZjJFK0xVQUUKQms4QU1HMDZLc21vaVl6UTZycmdpTUNBamMvMS9LdWo3ZTRiSEUxWE5qWWpQU0lMV2dkTWNYOWpBV2F2ajQrUwo3OEh4Ny9HUDhzdlYzS1cwK3U0YkZCSklTaUExTkhOREZob0lYMEpnWTNpcmljK2pqYTNwNWNIOGg5YlEzZVRDCjd2RDNHVmhHUjJFbWZDSTNXQXhpWkhGdGRESm1zNTJQbk4zTXI3YWh6TVRSZ1pHNnA2TGhEeFlNVkZRVEppRnIKY0UwWUFCa3FhRVo0Y1ltOHVwdTRwS1AyN0lDVm44Mzc4ZEQ3NVZwQ0ZSZHdQVXAzYWw5YlVSWkVZV2RuTi9EWAozOTJMcTZHejdaWGJ6dFhYcEtXcmhnd05HVWM2TEQ4eWJtQlhKUk5EWm1sTVVFN1AxNFNBb0xqdDg3M1h3ZERxCnBLanY0djFDUGhOT1NtTmtOZ3BLVG1OY2QyNHRJVytRbFo3UDBhKzlwNkwvem9lYm1yenNvOWowWGtBVEVtY2QKSVg1bFgzWkpYQ1VyZVVGa2xJdUdpL1R5OC9XeWtNdlJ4S0RlNXU3bkYwNEtZbGRzSXpnWFNtaEdSVm91SlhObAprcEhVMklXUThmYis0SVhCbzl2ejQrREdyQ0FRV2tFN0VqVXdlUWRBVzBOK2NDczhmcDZUbUppZHRxbWs5L0xUCjBKcVE5TDdDK2taTEVqc1hLUndrUFFvSkNoY1pZM0Y3WURHUTJZS0x0YVhIc3EvQ3l2ZUp6dWpndGFrNEZnUVUKYldZMUpDeERjbFZKVzM5a096T0R6dGlHNSttcnVhdkt0K0hKMytqbzMrUkJWVjVhVmp3ek5qRXJaMDFLVTJ4egpZR0I1d1BYZmlyaTR1Y1djeE02UmpabWtyLy8wRGdVS1BoUWtNR0J1SHdsZUZsaHBURFpPaTk3YWxvcnhpdnZ3CndNdnY3dDdnN3Z5eXNRY1JCZzE0WkQ0K1lRQkdGQkkxVDNSblB0S0YxN1czN3ZXdmh0bk1sWnZKNCtyaS9Ra2IKQVZwSVBYSm1Pd2dZQVdaV2RFbHBjc1c2eWNTSnY1ZTc5L1hTOGRyZDh1TzF2cmxHUWg1YWRTc21KVzVWU2toVApOamc2UTJ5Tng5MmpsYUNyaXI3WTJNR2JnNmUydnZBQVFWdFFRaUo1RWpJWUNsbFJEMDh0SUNnZy90TGIwYVc0CnNhRHBrWitRZ0t6eDNMV2xCZ0VTWFZkemEzWnFSeDEwVmxFbE9VaG1sSVRkMXBLMHQ3YXV4dHVDZ01XNnZ2T3cKVUVacVdWSTRMQ0Y5VndGVGFrTlBkSEYyY1lLUmlZanQ5ZTNzOE4zNGlvdmg4dXl3aTFkUFVrNFVZd3cxSFVKWApPZ0pKZjNoMVB0ZWZrNWlMdEtHNjk5YVQyTVhMNzUzeDZmVVdLMXNzTXpjOFBGUVFXMGxPWnl3NWJYYUduTENmCnI2RG40ZnFjeklQNDFMNmc0L05IT1ZkR0N6a1JPWFVMUWtGYlhUTS9ZWGlEamM3YnlmYWx2WjcyOE1qRndMUzIKcE1IdUMwRmZJQ0VwSW5Wa1dFMVNVaXMyYkhOemhNUEZyNUs3K28vM2pOTFd4NXVOcS9iK0NpUXVHZ0VnTzNoMwpRVnRjUXdZdWRYNDhLSlBLM00rRnNxSDA2TU9EOU5UKzZPalNzRjFCRVU5Nk1pNG9lUndlVVZaV09DdGllNUhDCmlyTEk4T242dU83RTBOVGJ5ZXJlMmtOZUVoTWNLR0ZnSURWUFJUb2ZKRFoySlY2TzFONmRvZTJGakwzUXdQbmUKNXEyMXA3aFZHUllOQ1I4M0xIVlVIVVpIU1drYmRuVGZ6TWlNcmJPMXR2dXF5c25pMWUvbjlldi9CQXhBVG45cApQbVEvUlZBc2ZHNTliQ0FpbGVQVmhLNjdnTE96eHZuSDNzWDY3ZlNxVGdBZEYwRmdaSFE3QUh4TmNWNTFmaVlmCjM1aWRqckhnNjd1OWc4UFd6OXpyL2VQcXNGTVJIMXdsTFc0SU5nSUdIRWd5Vm00eVA1dXRqSjJlcTZQKzljUFYKd3NHRXFPem11RUlFS3hkV1UzOHlKRUZIUWpOVWFYdE5WWEdCeDgrTXVLaWc5ZnZIMjhyZjQrYjE1dW9EVG10VgpKeTAvUGtOelhWOUpRVXNnTFNMUHlJcU1qNjZuajRlTW50ZUlpT1dpb3I0MERsaEFEaWRtQmpoNEJWQi9SbVJnCmZIRnkwOE9KajZlNzdQaXlpWnZpM2ZtaTFibXlHQXdCWFhkaEpUUWxSVWdSQlV0MGNXSnl3ODJWam9UcS9jVzcKME0zWW1xdWh2UC81NlZFc0dBTmhhMW9zUEY1T1dGZDdhWFJ5WnRESTNKMzU3NlR5NHNIeTN0N2YvT0gyazBVRApFeEFzTHlZdkxreEhHUThSYm4xcVpZMkF3OGVNby9xOXo3Ylh6c1NjN28vNy9mSU9LZzhLS2lFbE1pMFRDUmRCCmYyWnRjakhSbXBISWs5R2hxYkhFeUpYdzBPdmh2NTVNSHdZVkVpa3JNM1VMRmxaVlJHWThEblE0Mkkrdm1xS3YKdm8zMW80V2F5T3pJNGVIdkRna0lHVEJyWldRa1ExSlVEaUJ1S2lwNXVwS0JqSkNscnFyemlNM04rWkM5K0xIdApEUUZaUVVwOGZqTXpjVkJjSEJ4a09CVTdNTnZVMU5HRXY3Q3k4YmFWblpQajRmWGs1eHhQV0Y5Y2FDb3FPUndkCkRsVmdPam9tUDhpS3JjTFUvL1RXOU1XZGpZeUZ1NzNyN2E1S1UxUlZlbUEzT1c1ZktCRU1aWE41SWh2YjBkL1YKajZHai8rZVJqb2ZQaExPOHVLVVRTUjVkQW1Ka0lsb1pFQUpJUVdZVkppRFh4ZVNRbStueDhJTHBuNEhFeHJhOApxZVk9Cg","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSA4MmUwCk0wb2JYMGR6Ym1jL1BrNVRBQTRzWnowbE9NemMxYU91dTdQZzRwK3QzdHoxKzhtNHBSOFpCeFZIY1M0MlBCWWMKU0VrSElDUTBZTlMxajhESXBMem5tSW1PMjlya3JyUHQ2K2tMVlVNR0tUOGpLSEFURkFGTFlUWnRWa3liallpVApvdG42OHYvZDk5RFFsYjNvL2VNRUFsdEdBajhyT2pSYkhBWUdEbFJnYUVtZmc5eWxuT3J4N3R6eTFzRFExdFgyCjdQZjJWRUJOV205M2Z6MDJVUTVVVW5GbU9Db290WnFmMWRPRG82Vzh6Y09hbVpxbnFlM3RIQXNOVTI0b0x6SjgKY1FzQUN3UWtPVkI0ZXJpRnM0MmtzL1B1NTUyYnpkVDl6dUh1NDBGSUhWNW9ObGQ1TzBsYldpZDVZblEzTC92SwowWXVTbzdEbDlkdmR5Y1dlcXZLQnNRc0hEa1lvTERKOGRtdEtLMEpWYlhOd1N6L1htWUtIc1BIam9xdlh5dUhkCm82TDQ0KzlDTTExV1FYNXFZUkpMY0ZSWWNpZzFiMm1YaGRmQm42YTdzSVhKem96WGd2THFwTWk5VUJFTUczSVoKZDJZcldYRlpGU3Q4VTNOc241YVV5T3o1N3Z2amhzdmE5WkxXN2ZQMVZGWUJmMWtnS0RnV2JVcFZVeHcyYTNWaQpndGphajYrNDRiUG02NWpQNzlEejR0RGd2emhMUWc4OUZTVjVkMDFKVkVac0t6TnllSm1EMFpiTG82cXEvdVBUCmhvTGU4cm5TczBnYUJEc2NHRFEwZUJJQ0Z4bElmWGxxTmluZTM0V2IvS3VPdktMWStjV1J3T21tcmVjK0VSUmQKWXpjakpDZHlXa1ZGUlc5aU1EN0UxdE9iNmJpOXVhRDdndkhhMitqZ3lMUlpYa05VSHpzMk1UZ2JYMUJjRlhROQpabWRwaWZ1Wm1LcXZtZk9jejRLSmhvU3E3L1R6QncwMkNCUXZmSGhsQWdjZEZWTlNlekpMemNhVWtJM2h3L1d6Cnc4RFMyOVR1NWJDcS93RVdGa1IySkRrb2R3c0tERnd6U0dRdU1KdUwycS9uOXJ1cGdjbUZtOHpSL2ZycCtRUWQKUkVJR08zVjJjZ1pVQ21aWFhXdG9lZG5oMFlxUHVJZnkrYUw0eU03Szg2V3R0YVJJQVJOQ1ppQXJOMWwrUzBNVQpMblk4Ukh6RXlZeTFsYXVhczZyUDJZZURpTHE0K3ZzSVVBMUlEQ1IrQW5zV1MxdERGQVUxS3lnaC9zN1ZsYkdqCnUrSHhuNXVNanZ2YjdLSzdEeHdFRzA5NGRuZ3BVUXQrV0JZOWQwNWhoTTNUa0pPL3NxNnAxNXlhenNPOXJycSsKRXhaNVFSdytLekUwV1ZaNVExQllaSHB4ZTVPS2dNMzEvdkRpcC9mVGpKejA4dm4zazF4U1hBSWZZdzBjTVZNRgpJa3hQZUdnOE1KZVBpSlNJdDZEODc1aVYzOVdDNGRINjZmUXhCMGNyTWk4MGUweGVYVTVlTGlKMVpuYUhySTJWCnA2NzJ0K0xTeW9Ub25iRGg3ZnRXYjA4SURUNEJjSHRDUkVsS0N5dHhaMytUeE1DQXhlaW5nS1A4K01iVWxxejQKb3NiK1FrOFBQU3d1WlcwcVhrcENHeVZnY1hsN2l0TGlsSldqNDhQdnd0VFIxOUtENS8zK0N3NFBBUkEyYW1BNQpSMXhNQ2doL1pYVWpMc0RTa3NtQ291ajZxYytQL012cjRPMmNxRVVCUmtncEppaDVkeEpUWEZGQkxEOTFmNXZtCmp0dlErL1QwOGV6Wng5L1d3c3ZhczFzUUZCUU1ZVzhzS3pWT1l4eFpQSGh3SWs3SDJvK0xvZWEwdUtQQXh2TFQKb2JXK3VyWVJGZzBhSXlVMmVtMGFHMEZYQUdkU1p6L2UzdERDcTdTbC8vWHF6UExWMHVYeTQrUDBFMXhZUldKbgpiM0kvVG1FQWJtNXdJamdwaU8yQm5iT3ZqN2F5K2Q3YzNzTDk1TEd5RWdjUUNGY3BhaVVwQUhGeVRsZGdlbkFICmtaNmFudmp1cTcyR3NjSFh5TnZpLy9TNnFGZ01FUjh6TzJRR1lSSWVVazQxUmljOGE0S3dtSkticXV6bXU4WFMKMG9pSzV2bnh0VWt0R1E4ZlN6RTBJMUVPVEh4WWVGbDZVWFRIMzRHS3Y3anArNmpYek5YWXIvNjc0TzBUQjJVRQpNUzAwRDJoMVNrcEpWQXc0SmovQm1KZUhqcWVFaSs2VTBOR1BtS3lzNTdneVMwQWNDU3A1RUhGMlZFQnVVV0JzCmRIQTB5NDJQaUxmeTRybXdtTC9YMS9lcG1hSDhIZ3NSRkhrZ0p5VWFaQVFKUzAxellTc3RuSXFaanEyK3IvL3MKMTRDR3hLV3Y2UHk5b2hKK1UwbzNOUTA5Y1E5ZVZWZDdRbXAvYTV1VW05ZTJ0dWJ5cklmQTNjM1UrL3UzMTBWWQpRRlYwSkNvK1AzSlZYMFpmSVNKd1pKbU9qcGVXbzczMXFyM1QwZE9jK05ubjZmcEhaZ3dNTFN3Z0RTVlVRRVVJCkxIeHdiRFdQekp5UDNvR25nN3ZTeWRLcHovejQrSjVNSFE0RERDVXhJaGhYVVZZWUNuczBKSGsyMXNXMG1LYWoKcW9IcTdzWGQxYTJhOU9mZ0FFUllERDBmSURValRrcFlWa1ZrYVdvb3NzdkdqWVNrNllXb3k5M0U3SkM5NWZMMgpHeFpYV1JNMU5TMGdjVkFaUWt0MU5BazdZNFNPMUlDKzc3QzR0K09HblpQZzhmWDI3QVFlUUVKU1BpQnJlRTVKClRBTithSEErSXNiQXZwdVk1K25ZdThMZHdOamR0Yk85L3U0WkdCMGVlbnc2Tlc1Sk8xQkxZRzlyUFZpVGxKYlYKeE9xcXVMSEVnSW1QMytEejUvb2RGbDlmRXl3Nk1VTU5WMGxNVnk5T1pXYUV5K3JZbmFLdW9MU3UwTWpXeExhcQp2dSt6UndRVEhIVmZiV0E4WDFvYloxcGtMVGNXZ29hTmtJYVJzdVA1aDhuRjBOUDl1cmovRmc1S1lWOXlLaWtvCkNYbDBVaDhoQUhOdWNwT1VtYzM3NWJHcnBNUEYwZFR0cnUzb3ZDSkhTbFExTEhvVU1FUVpIVTBjSjJGNWY4akgKbnR1T3M2ais3SnpJemQvZnRQR1d1MVljQzBBZVhYNTJlenB2VUVOV0lUQXBMeW1KanBPSm9MWGhvS3lNak12TApsN09ydHFvTkczZEhSV3RoR21VREd3QVlGSGNyUHlmRDBzS09nNnF4NS9DUWsvTFl3NjZrcGZTWkNBa0dBVWg4ClluTjlRVTFKRFRVK01DSnczZFdjZy9YdS92T0xqNFNQMFpia3crbXlXVlpvUUZGdkp5bHdEd3dUQlFJd2JubzMKbG9XbTBzS2hpTEh1Nm9mVgo","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSBiYWMzCk0wb2JYMGR6Ym1jL1BrNVRBQTRzWnk0aWY0T1YxdTNqL3FhdXVZUDhsWWo2cTgvMDZ4a0VVRW9mSVRZMlpCWkwKV1U5UWYzeGtmY1R4dzRxSHVLQ3d4OUhlMnQ2NHJ2MzQ2YjVVRFJNQUlIWmtLejVNQlFNY1BtNDlWbmJjeHBPago2NHFsc2YrWHM1S1p4L0xnOTYxTkFSWUlHeTlzZlh3VVIwOEdSd0VwSkdXUmg4Q09rcW01cTVYeW41U1ptdm40CjRQZkdIUk1TR1c4K1BuNTZSUnRvV1hOdFNYVTVxYzNBallPYnAvdnh6c3ZLek1YaXFicTlRa1lPVzA4dklDbEsKZlVoSVgwd2tjQVF4TnBTR3VacWVwNzZ0czhPYmg0eSt2UER6L25oS0FnNDdaQkI1Y2gwU0ZndCtabWhLZDZ1VQowY1hPNnVhem9zcmJucHJHK3ZLNzlVWVhJMTBtS0N3dExUc0tLd3NCTHlWTGZYT1pwYVBRNzZtenBLdWVoczNRCnFhblYrT0ZHTFF3TkVUNXFMazRMQUVSVWVsaHFlbi9BMm8rUmhxYjA1cnJKeUphbTNlUDI4NWZsQUJjRlVpQWUKT1Rrdlh5WUdUWHQ4YVRJcmhMcVlqN2k3by91cTBvS1cyWnJXN2QvNUV3SkRNbGwwZkhGUVFFNUNVMzF0YldNMQozWUNLajVYanBPU0RyZFBQdTRTNnBPcjN1eVU5Q2hvMlFub2hKMUJORmc5OWFHZHRjODdjaWNiS3ArVGs3L2JGCnlOM2U5TzZONnhnY0JISlFOQ1kyTkhkRVhCa0JJVEE4WjM3UDJkTEVwUHVRdk9hSTA5T1MxOHozL1BZb1Jrc0YKTXpFamJXdGVTRWRBYjMxbU15NkRqNHJTNmZIcDhPelhqZTdkNmUvLzAvc09DaDFVVG1aemZUUWdXVXhmWUNFNwpjREEyMGF1SWkrTCtydUNkMHZQVzBzYXF0Nnl4UWdBTUF4WXVEU2N4UUFkR1JoWWlmekZHdlptQmh0cSttNlduCnhJV2syOTNpMy9QNzdoMUJTUndtTXpsM01BZE5SVTB2SHp0MllJV0xudit1cWFlcDFwYmR5OHpab3J2MCtCWVoKRGhRVExpSXBLbFpQQ2k4UmZtRmplTzJzaFp1RTc5aXFxYUxDZ3A3YXlPSGw0ZXhJV2s0YUl5MG1NSHA5UkZWeQplMndyRXlPY21ZcTEzT2Uyc0wzRTRzUEwzUEs0cHFkQkJra2ZIU0lwWFNOR1hWOGNYa1J1YVhFejlOdkh3Ky9vCnZyR2l5SW1hbUw2b29hK0NEeFlHVmdjdGVHQjVDa2gwU2xWc1poNHVsWk9Fa2RyenZiaXoyYzNVMzVQeXYrVHAKRnd0NUdsbHVaQ0JxRGtZS0YwQjFjSFp0ZlkrS2c1cWhxUDc2NDRTRmk2Ync4UG1sMlFoY1JGMVdKQWMwTlVkcQplVWdmTjNsaVo1RFJ3NU9jdTZHNHNJakZrTVRjdHRxenJ2NFhEVkFjS0RFbExCdFBEUUZQY0hWK0x6R05uWUdTCm1LTGgvcjNTbXN2NXcrZm5yTHhCSUJBSVhYRVFMaXhNQlE1VlJIUnhOekNDbXBlY25LRzNvYUgyeDhyRDMvUDQKOG9udkhCZ1lmbXc1S0RVN0RnVlRSWEp4TkRoa2hzWGFtWTZINVk2aTJJU2V4b3pVN0xTNUFTVUZFVHNxUEQ4KwpGeE5kVkY5cEtqOG5QSXFmbDVuTnM3YXRyNHpPOU5EcDR2WGYrd3RCU1ZncVptazZMa01lRWhaY0tDaGllSUxNCnBKS2xnZnJzcTZtUHo5N0h6K3owL3k0dlJGc2RQemduWW5KRVJCMGZSR2dnYlYrWmpabkM1dnVPdHJqNnp1L1QKNE9mcXRLNUdVMTBaQlNJbkZ5SWFTdzVHWGpCY01TeUZodHVHKy91MG9hTHRoSS9mMmQvcTZ1amhCeEFIQm14LwpMVHQ0VTFzV1lWQnZZV04waHZYRzN1Ty9pYWk1d3NmZjR0Nzk3ZnJtRTBSR0hWTnBPek5rUTI1QVExNURZamROCmtjN1ZqNmE1clBYN3Zzcm16TnJyOCtqLzl4c0NDVTlvZUc0VU1sdEJGQjU2VjNscmVNSGdpSlNGb2Fld29wV2QKdzliZDc2eTl1bGdDQ1F4OEFpNWtiRUJRRzNRVkttWitRRUtBaEpIYThLbTNyTHlhbU0zWCs2MmhzS0lDV1RJUwplR29wTlhscGNFNUxWRjV5Y2pIWjI5VEJtYVN2cGFEaDc0SEFpZkw3NWZWM0Roc2RTbnhzRkRFblFnOCtSMkp6CmRIVjdsSjNmeDZhc3RiLzl5b2pYek1hbTBQN21Ua1FBU2k0bWFuYzJhMVo4VVIwOGNIVjZpc1BlazVldHFjSHYKek1QSmhxdTNyN0t1N0VSNFNVUjBaVUlzTDFoSUhCQm1lR1IvVVptS201ejg0dWpxLzgrOTNjanY4T213MWhRQgpHVnRzZTJONU5VZEZYM05HWjMxb05OYWYwTUNkNnZyL2lMVFc1Y3pmc2Q2M3B1c1pNUmxWYXprNU9peGRkbGxQCmMzZ2dJeVRSbTVIR25adW1vYWJTNzUvMzNxeTM2Y0FiRGt0VkNDVXJOVDVKVVhkS1ZXRmthMmhvZ2NqdDE3NnoKcWFMNzcvck0xT1BGN3JldkVSb1BDSGxyS0M0Y1JWVlVGaE5uS2p3OXRvdVhuY2JpK1ptN3o5dlcvOGJpOGJHZwpEaElYQ0I1OGZqWXhPaGtaRWdSa08xQjhKc2lMazkrTGtxYTJwdi9RMU4zdDRhUzd1RUZQQUE4RkhTQjJiMVZ2ClRSRnRibjArTkpEYXZwYmE1NmVibyt6Znl0aVdyZXZ0NnVsY1FBc1NhMmNMTUQ0UWZGNUZhejR3WnhYRGpwYVMKaklDaXI2N0ZnSi9ady9UN3JyWUdDazVFSDJKa1p4MWFXUXdBVXlwQVlGK0FuYlRZeGZybjhMSzUyc2ZVemJhOAo2T21uUUVSVUgyQVlCaTA4VlF4SWFYZDVhbVlZem9DWGo5NzBndU9oeXQ3Sm1wNnJvYWJ0RXg5R01GRjhaakk5CkUyQkRXMU41VjMxek5jdk1sSnEvcWZYbzZzZkJ6Wm12NWFpby96QUhEd3d4SzNvRU4wOEpFekpkWUd0bWVZR2MKbDQyYzlQYitzY2lJaTVDVXRLWEcraEVHQ1FOZkR5WTJQWE1pQUZ4YWJXVnpZbm1manNMQTdLYXEvKy9FeThPUwowT1c0dHFvSVJTRVVEaGdyWG5nRFQxNUFYMnRHZGovZTNKT1ptZW4vckxmVGxlL2VpcUM4K3JmUENod3FHVWhxCmNUSXFRMUJkU2kwalBtWjloSTdiMStidS92S0Z6TTJjZ0ppbngrWDFDZ3RxV2xGdk9URXdXVmhWUlF3K0puVjYKeDhpWjByT3YzYnVndDVDU2o3M3c1K083akZ0RFdSWWxZbUZ5ZndGTVZRWXVNWE41T28yWnc3bVU4UGp4OHNEdgowTS9hNWRXK28xaEZUaFZiYzM5a1poUkRFeHRLY2lJMmJHN3gyZEhZOUtxaTBlR2ZnWi9tL0ttOXBySk9DdzRVCkxIWmlhM3dORFI1UFRqWjNFRG5VZ1kyY25OdjQ5UG5OdFpLWGo3U2t1T3NYUzFOWFJtNGtiRFlsRTFVS1dWMS8KSmlJNzBKejczYUN3NDhUamxKR2ZtT0wzdWFHNUlsNVNWZ1JrTDJwclRRPT0K","Sk9OQVMgSVNMQU5EIFNQSUVMU1RBTkQgMSBlYTQ1Ck0wb2JYMGR6Ym1jL1BrNVRBQTRzYmowbGJvWGNuKzJwc0tHbHE4YTF6SkRvNTlMbzhFbFJCZ0llTm05eEpWRlMKSGdFR04zMXpKSU8xbElxYzh2VG1qOURKZzVuZzdmbTdvK2djREFSWlp5a3FQVGRaUWtsS2RtOHFEekdGdTQyVgo3b3pwNU95Qm9NN08yZXlzcHVrV0N3UUJSR2dxS24wRURoQVVVUk4yWTNPYXZjV3dpN3l1L2NyaGlZZkczZS96CjJ2THdHQlZlVEh3b0xTRW9XUVZnVWtkdGYzNSsvWnVJakpUQzRMcXkwY1hXeW9teHVxeXVBd1VSVlZNcEhTaDQKWjB4ZUdCSTNaaGR1Y1lLTmc1S3V1TFNtOUl1SWtaL2k5Ky9LOEZ4Wkh4ODVKVUZxWkE1TlVSMTFYR1IwWitqYwp3dFBkc3FtaXU0MlZ5TkxIN2F2OHJEc0tFMUE3UGo4L0lIaGNPQjBTY0dKV2JGVyt6OHFHcDZpay9lekJ3ZHZiCms2L2w5ZnhRUGg0QVVtaDVPRjFTVDExcmMydHJPU0dXa282RzMrRzBvYlhZK0llUTFxU2lwZC9rRjA1Q0RXNEkKSlNoOUVYQk9UR3dsTG10V25JQ2JtYmZxK09pOHdkM1J6NUhzN3VYNkJRMFNhVXBpYnpNWFMwOWtWa3hvUFQxagpsWUdkMXRLNjJlYTcrSTdjclpmNDQrSDJpak1JQVZsMUZESWdNQWtLVWt4N1luQWtNSmlVaU5HVDRMeW4rZnZDCjBNeUl1cmpGNmc5RlF5MFhJaTBNTFU4UkFRb1hNbTl6Y1dlSWw0U01wZXpKKzZIUDBNUzcxdWJoODdGMkVBTUUKSkdoa01peElRMzFaVjJGMFBUaU9pY0NOK3VmNnI2dkJodFRaek96bzEvTVJUVlZIV0hVME16WWlWM1ZYUlNwcgpMbVorMEx6UnpLcXFydVdxeE1YZGxaSzVvYi8vQ1F3Q0FpSWtPeXgyRkJSUVZWdGlkd0ZLanBqQzJJejJtckwrCmc4amswK3ZxNFBmK3FVa1hBUjB4YW40NWR4Wk5XQXA3U1hOM2Q5ek0yYml0dnUzaGdON2MzSldlKy9UeTlnMFcKQng5UWMzUmhLMEVXVFcxV2RXQkxjODZta3R6SHVaQ3J2dnVGMitQSjVlTHpwckpiVEYxWGJUZ3RLSHhpWVVsWQpjU0IwUld1ZGp0UHlnNkNndTRmTXo4RGRtNnlyc0xRTFNVb0dXbXgvRlNKUkJCaFRIVlJuT0NNbC90TGIwYVc0CnNhRHBrWitRZ0t6eDNMV2xCZ0VTWFZkemEzWnFSeDEwVmxFbE9VaG1sSVRkMXBLMHQ3YXV4dHVDZ01XNnZ2T3cKVUVacVdWSTRMQ0Y5VndGVGFrTlBkSEYyY1lLUmlZanQ5ZTNzOE4zNGlvdmg4dXl3aTFkUFVrNFVZd3cxSFVKWApPZ0pKZjNoMVB0ZWZrNWlMdEtHNjk5YVQyTVhMNzUzeDZmVVdLMXNzTXpjOFBGUVFXMGxPWnl3NWJYYUduTENmCnI2RG40ZnFjeklQNDFMNmc0L05IT1ZkR0N6a1JPWFVMUWtGYlhUTS9ZWGlEamM3YnlmYWx2WjcyOE1qRndMUzIKcE1IdUMwRmZJQ0VwSW5Wa1dFMVNVaXMyYkhOemhNUEZyNUs3K28vM2pOTFd4NXVOcS9iK0NpUXVHZ0VnTzNoMwpRVnRjUXdZdWRYNDhLSlBLM00rRnNxSDA2TU9EOU5UKzZPalNzRjFCRVU5Nk1pNG9lUndlVVZaV09DdGllNUhDCmlyTEk4T242dU83RTBOVGJ5ZXJlMmtOZUVoTWNLR0ZnSURWUFJUb2ZKRFoySlY2TzFONmRvZTJGakwzUXdQbmUKNXEyMXA3aFZHUllOQ1I4M0xIVlVIVVpIU1drYmRuVGZ6TWlNcmJPMXR2dXF5c25pMWUvbjlldi9CQXhBVG45cApQbVEvUlZBc2ZHNTliQ0FpbGVQVmhLNjdnTE96eHZuSDNzWDY3ZlNxVGdBZEYwRmdaSFE3QUh4TmNWNTFmaVlmCjM1aWRqckhnNjd1OWc4UFd6OXpyL2VQcXNGTVJIMXdsTFc0SU5nSUdIRWd5Vm00eVA1dXRqSjJlcTZQKzljUFYKd3NHRXFPem11RUlFS3hkV1UzOHlKRUZIUWpOVWFYdE5WWEdCeDgrTXVLaWc5ZnZIMjhyZjQrYjE1dW9EVG10VgpKeTAvUGtOelhWOUpRVXNnTFNMUHlJcU1qNjZuajRlTW50ZUlpT1dpb3I0MERsaEFEaWRtQmpoNEJWQi9SbVJnCmZIRnkwOE9KajZlNzdQaXlpWnZpM2ZtaTFibXlHQXdCWFhkaEpUUWxSVWdSQlV0MGNXSWp6WnlaaFp5WHNmYjQKMGRHZXo3aWh2T2p1cXg1OVJsSjVNd290T0FFUFExZHdjMTU2WUplTmpwQ3V2ZnY4N0lINzRNN1I5dUduM0E5QQpTMGg2YUNFK1BrWndUa2RXYnpvK1lwNmV4NW5hcUwzMGlaYmV3OVBONEpmaDd1b09hRjRKUEMwcE1ocGRRRkJhCk5ESjJheVhHd3RhQzJwS3hwSmZaeUpXeGdmci82TmRDU1JFZUNqNDJLVEpvUkYxVUVqVXlJMmwvMkkrcGdMdTIKb2J6TjljYlUzdUdDdXVIbkVBMVdUelFoSHk4NVJVUlJFVjA0Ym1jM3BJTEkycCt1NkpLdDNjalYrOENsdWZYNwpCQUFlVjFrNE9UY25KMGhYUkV4bExBazdlWStkbU9XSHJMR2twK25JM2RTanZyZXRxdzhNRnprUkpEVnJXRWxLClJCSnVLU0pvZkpITjU5R1VwTEMxcHNiQmpZekE1ZXI2czY0REJ4MFpVV3NtSnlrR2NsZ01OQzBtZEZlRWhaZS8KaDdxK3VQK2ExdGZZMUsyODZ2c2NGbGtWUURRc1pnb0RIa3RNVnpOaWRtYVR5L3pMMCttcG9MbXYxTWFSa3VEMAo2ZjcrQng4WERVWVNMeWR3Q2xvQWFHQWdMV2hSaVllbWlvaXJzS0s5aDRDWGxKRG5wYmI2TnhKZE5oRnlmakl1CkZXWUhIRjk0VVgxelFJS0ozdFhtNi9XcXJjL0U3SjZ6K2VpMi8yc1JGQU14Yml3Zk1HeEVVWFVTUDNGbmJZL1IKeDV1ZGlheXpzY2lJellpSnV1blU4aEVHSlJsU0ZDbzJlMnMvRGhWU01DZ2lkM21lanAzQTdLMnQ3TCthOVlLTgoydTMxdUtSRVN5QU9BeUlxRDNZTkEwVlZSWEp4ZUhPR2k0T1MwNlNwdnFuYWlibVhpdUgvNXJmVkNrUlpWd3NrCk9pVTZUMUJTUVdndE1DSi9qWW5OMksranJ1R01qNUtjeTkrcXpiTzhRUWs1RlJnalBpTXhYVlJOVlF3K0puVjgKd3NpQmtaejNtdjNnOHREQmtlM2o1L0x5MHdaTlYxa3NMeThxS1h4UUJob3VaUzBoY1p5bjJ1L2Q4TEdqdG9QNQp6OWZlK2RENXUwVkxBaEVkT0Q4S0poUUVBRlFGSm5wdWIzMy93WWFidXFYMW5mbUNqOXIrNy9pbHU3d05FUk1TCkxqaHFlSHdORWhCZVZuRTVWVGZheEkrZDFZNjYrdmVOODhQZDFQRHUvK0ZYUlVzU0dTUXZMMkE5RGdwSEZVTmkKYlhRNXd2SDczYTZscHR6bzNJSEUzL3F4b2FxM1VoRVpWa2s3SVhJcVFWa25BeHNtT24wN3Q1bUIxY25kNlBPegp4TmZEejlpdnQ3T2lzZ0ZUR2dGM1lHQjhXZ2tDRFFJbUxob3hMTlRKK0pEeDdmWG4rSlhMeloyV29hNjY0MGRLCkgxQldORlYvSlVGUFhsUWpNQ3d4Y0tHR3o4Zk03T0NuK09PRGhKT1lyT08rOWFCUlVoRXRmbjU2Y3lWSUxWMUsKSXpNWExpbkh5WmlKeWVueDQrU1d6TmlaeU9mTXRLUURLZzlBU0dVego"]};
// END FILM_STATES
const chaptersOK=()=>!!FILM_STATES&&FILM_STATES.n===FILM.length&&FILM_STATES.s.length===FILM_CHAPTERS.length;
let chapOpen=false;
function jumpChapter(i){if(!chaptersOK()||!AUTO.on)return;AUTO.jump=i;AUTO.stop=true;AUTO.jumpTS=TS;setTS(16);filmPause=false;S.toast={text:'Kapitel '+(i+1)+': '+FILM_CHAPTERS[i].name,until:now+4000*16};}
async function applyChapter(i){const ch=FILM_CHAPTERS[i];cutscene=true;await fadeTo(1,300);
for(const a of ALL){a.talk=null;if(a.talkR){const r=a.talkR;a.talkR=null;r();}}dialog=null;closeup=null;FLY=null;S.card=null;S.sierra=null;S.duel=false;MAU.on=false;
Object.assign(J,{sit:false,sled:false,sleep:false,reach:false,bend:false,fence:false,run:false,speedMul:1,droop:0});CN.fence=false;CN.noGlasses=false;
applyState(svDecode(atob(FILM_STATES.s[i].replace(/-/g,'+').replace(/_/g,'/'))));S.phase='game';
AUTO.ch=i;AUTO.q=[];AUTO.duel=false;AUTO.joker=false;setTS(AUTO.jumpTS||1);await fadeTo(0,300);cutscene=false;return ch.step;}
function chapRows(){return FILM_CHAPTERS.map((c,i)=>({i,x:i<6?24:168,y:26+(i%6)*16,w:136,h:14}));}
function chapAt(x,y){const r=chapRows().find(r=>x>=r.x-4&&x=r.y-2&&y{const cur=r.i===AUTO.ch;text((r.i+1)+'. '+FILM_CHAPTERS[r.i].name,r.x,r.y,r.i===hv?'#fcfc54':cur?'#fcfcfc':'#a868fc',false);if(cur){g.fillStyle='#fcfcfc';g.fillRect(r.x-6,r.y+3,3,3);}});
gtiny('KLICK DANEBEN: ZURUECK',W/2-44,129,'#6a6a8a');}
async function startFilm(){if(S.phase!=='title'||busy)return;AUTO.stop=false;AUTO.joker=false;AUTO.jump=null;AUTO.ch=0;await startGame();
let i=0,first=true;
while(i{const hv=mx>=x&&mx=y&&myx>=bx&&x=by&&y{if(e.key.length!==1)return;typed=(typed+e.key.toLowerCase()).slice(-7);if(typed.endsWith('jojoba')){setCheat(!CHEAT.on);typed='';}if(typed==='popcorn'&&!AUTO.on){typed='';location.hash='#filmabend';location.reload();}});
addEventListener('hashchange',()=>{if(DEBUG_RE.test(location.hash))setCheat(true);});
const hotMask={};
function drawHotspots(){
const id=S.room;if(!hotMask[id]){const m=[];const hs=ROOMS[id].hot;for(let y=1;yh.hit(x,y));if(i>=0)m.push([x,y,i]);}hotMask[id]=m;}
const cols=['#fc5454','#54fc54','#5454fc','#fcfc54','#fc54fc','#54fcfc','#fca854','#a8fc54'];
for(const[x,y,i]of hotMask[id]){g.fillStyle=cols[i%cols.length];g.fillRect(x,y,1,1);}
g.strokeStyle='rgba(255,255,255,0.5)';const w=ROOMS[id].walk;g.beginPath();g.moveTo(w[0][0]+.5,w[0][1]+.5);for(const p of w)g.lineTo(p[0]+.5,p[1]+.5);g.closePath();g.stroke();
}
/* ================= UPDATE ================= */
function updateActor(a,dt){
if(a.walking){
const dx=a.tx-a.x,dy=a.ty-a.y;const mp=a===J&&ROOM().map;const sp=a.speedMul||1;const tx=Math.abs(dx)/(mp?190:40*sp),ty=Math.abs(dy)/(mp?190:22*sp),tn=Math.max(tx,ty);
if(tn<=dt){a.x=a.tx;a.y=a.ty;a.walking=false;if(a.run){a.run=false;a.speedMul=1;}const r=a.walkR;a.walkR=null;r&&r(true);}
else{a.x+=dx*dt/tn;a.y+=dy*dt/tn;a.dir=tx>=ty*0.8?(dx<0?'L':'R'):(dy<0?'U':'D');
a.ft+=dt;if(a.ft>0.1/sp){a.ft=0;a.frame=(a.frame+1)%4;}}
}
if(a.talk){a.mt-=dt;if(a.mt<=0){a.mouth=!a.mouth;a.mt=0.08+Math.random()*0.1;}
if(now>=a.talkEnd){a.talk=null;a.mouth=false;const r=a.talkR;a.talkR=null;r&&r();}}
if(a!==J){a.bt=(a.bt??Math.random()*3)-dt;if(a.bt<=0){a.blink=!a.blink;a.bt=a.blink?0.15:2+Math.random()*3;}}
}
const ZZ=[];let zt=0,jzt=0;
function update(dt){
for(let i=waits.length-1;i>=0;i--)if(now>=waits[i].t){const w=waits.splice(i,1)[0];w.r();}
if(fade!==fadeTarget){const d=fadeSpeed*dt*1000;fade=fade600000)run(drownGag);}
if((S.room==='bar'||S.room==='hadiko')&&!HUND.walking&&!HUND.talk){hundT-=dt;if(hundT<=0){hundT=4+Math.random()*6;HUND.speedMul=1.6;walkTo(HUND,30+Math.random()*260,138+Math.random()*4,true);}}
if(S.room==='treppe'){lptT-=dt;if(lptT<=0)lptT=7+Math.random()*5;}
if(closeup&&AUTO.on&&!closeup.xp){if(!closeup.t0)closeup.t0=now;else if(now-closeup.t0>3800){const c=closeup;closeup=null;c.r();}}
if(S.phase==='game'&&!busy&&!cutscene&&!dialog&&!closeup&&!J.walking&&!ROOM().map){idleT+=dt;if(idleT>9){idleT=0;jonasIdle();}}else idleT=0;
if(A.asleep&&S.room==='lookout'){zt-=dt;if(zt<=0){zt=1.1;ZZ.push({x:A.x-4,y:A.y-34,t:0,room:'lookout'});}}
if(J.sleep){jzt-=dt;if(jzt<=0){jzt=0.8;ZZ.push({x:J.x+3,y:J.y-56,t:0,room:S.room});}}
for(const o of OP)o.a=Math.max(0,Math.min(1,o.a+(o.ta>o.a?1:-1)*dt/1.0));
for(let i=ZZ.length-1;i>=0;i--){const z=ZZ[i];z.t+=dt;z.y-=dt*9;z.x+=Math.sin(z.t*3)*0.25;if(z.t>2.6||z.room!==S.room)ZZ.splice(i,1);}
setSong(musicFor());
updateHover();
}
/* ================= DRAW ================= */
const LAYERS={};
function drawChorTalk(){
if(!CHOR.talk)return;const lines=CHOR.talk,n=lines.length,blk=n*LH+2;const base=Math.max(2,Math.round(CHOR.y-CHOR.h-6-blk*3+2));
[T1,T2,T3].forEach((t,k)=>{const top=base+k*blk,dx=(k-1)*10;lines.forEach((l,i)=>{const w=tw(l);let x=Math.round(CHOR.x+dx-w/2);x=Math.max(3,Math.min(W-3-w,x));g.fillStyle='rgba(0,0,0,0.35)';g.fillRect(x-2,top+i*LH-1,w+4,LH);text(l,x,top+i*LH,t.color);});});
}
function drawTalk(a){
if(!a.talk)return;const lines=a.talk;const h=a===J&&ROOM().map?8:a.h;const top=Math.max(2,Math.round(a.y-h-6-lines.length*LH));
g.fillStyle='rgba(0,0,0,0.35)';lines.forEach((l,i)=>{const w=tw(l);let x=Math.round(a.x-w/2);x=Math.max(3,Math.min(W-3-w,x));g.fillRect(x-2,top+i*LH-1,w+4,LH);});
lines.forEach((l,i)=>{const w=tw(l);let x=Math.round(a.x-w/2);x=Math.max(3,Math.min(W-3-w,x));text(l,x,top+i*LH,a.color);});
}
const C_VERB='#2c9c3c',C_VERBH='#7cfc7c',C_SENT='#54d8fc',C_DLG='#a868fc',C_DLGH='#fcfc54',C_DLGD='#5c3c8c'; // C_DLGD: already used once
function sentence(){
const n=hover?hover.name:'';
if(obj1)return`${verb} ${obj1.name} ${verb==='Gib'?'an':'mit'} ${hover&&hover!==obj1?n:''}`;
return`${verb} ${n}`;
}
function drawMenuIcon(){g.fillStyle=menu?'#fcfc54':'#2c9c3c';for(let i=0;i<3;i++)g.fillRect(305,146+i*3,10,1);}
function drawSpeaker(){
g.fillStyle=Mus.on?'#2c9c3c':'#3a3a4a';g.fillRect(303,147,2,3);g.fillRect(305,146,1,5);g.fillRect(306,145,1,7);
if(Mus.on){g.fillRect(308,147,1,3);g.fillRect(310,146,1,5);}else{g.fillStyle='#8a3a3a';for(let i=0;i<5;i++){g.fillRect(308+i,146+i,1,1);g.fillRect(312-i,146+i,1,1);}}
}
function drawUI(){
g.fillStyle='#000';g.fillRect(0,RH,W,H-RH);
if(S.phase!=='game'||cutscene)return;
drawMenuIcon();
if(MAU.on&&!dialog){drawMau();return;}
if(dialog){if(!anyTalk()){const{y0,lh}=dlgLay();if(y0text(o,4,y0+i*lh,i===dlgHover||i===AUTO.sel?C_DLGH:(dialog.done&&dialog.done[i]?C_DLGD:C_DLG),false));}return;}
if(!busy)lastSentence=sentence();
textC(closeup?'':AUTO.on?AUTO.sent:lastSentence,W/2,145,C_SENT,false);
const defV=(!obj1&&verb==='Gehe zu'&&hover)?(hover.kind==='item'?'Schau an':(hover.def||'Schau an')):null;
if(AUTO.on)drawFilmUI();else for(let r=0;r<3;r++)for(let c=0;c<3;c++){const v=VERBS[r][c];const hl=v===verb||v===hoverVerb||v===defV;text(v,PORT?4+c*106:4+c*54,PORT?158+r*18:157+r*15,hl?C_VERBH:C_VERB,false);}
if(invOff>invMax())invOff=invMax();
const ax=PORT?312:172,cols=ICOLS(),cw=PORT?48:32;
for(const[y,d,on]of PORT?[[216,-1,invOff>0],[250,1,invOff0],[188,1,invOff>1)-(ic.width>>1),y+10-(ic.height>>1));
if(it.num)text(it.num,x+(cw>>1)-1,y+7,'#6a3a1a',false);
if(hover&&hover.id===id||obj1&&obj1.id===id){g.strokeStyle='#4c3c7c';g.strokeRect(x+.5,y+.5,cw-1,19);}}}
}
function drawCursor(t){
if(mx<0||touchMode||S.phase==='opening'||cutscene&&S.phase==='game')return;
const cols=['#fcfcfc','#c8c8c8','#888888','#545454','#888888','#c8c8c8'];
g.fillStyle=cols[Math.floor(t*12)%cols.length];const x=Math.round(mx),y=Math.round(my);
g.fillRect(x-6,y,4,1);g.fillRect(x+3,y,4,1);g.fillRect(x,y-6,1,4);g.fillRect(x,y+3,1,4);
}
function drawMapJonas(t){const x=Math.round(J.x),y=Math.round(J.y);g.fillStyle='#000';g.fillRect(x-2,y-5,4,7);g.fillStyle='#e8e4da';g.fillRect(x-1,y-2,2,3);g.fillStyle='#e2a27c';g.fillRect(x-1,y-4,2,2);}
function drawRoom(t){
const id=S.room,L=LAYERS[id],R=ROOM();
g.drawImage(L.bg,0,0);if(L.stars)drawStars(t,0,L.stars);R.dyn(t);
const midY=R.midY||0,back=R.npcs.filter(a=>a.ya.y-b.y);
for(const a of back)a.draw(a,t);
if(L.mid)g.drawImage(L.mid,0,0);
const front=[...R.npcs.filter(a=>a.y>=midY),J].sort((a,b)=>a.y-b.y);
for(const a of front)a===J?(R.map?drawMapJonas(t):R.noJ?0:drawJonas(J)):a.draw(a,t);
if(R.map&&hover&&hover.pt){const[x,y]=hover.pt,s=hover.name,w=tw(norm(s));text(s,Math.max(3,Math.min(W-3-w,x-w/2)),y-13,isLocked(hover)?'#a8a8b8':'#fcfcfc');}
drawParts();if(L.fg)g.drawImage(L.fg,0,0);
for(const z of ZZ)text(z.t>1.3?'Z':'z',z.x,z.y,'#c8a8fc',true);
if(CHEAT.hot)drawHotspots();if(CHEAT.walk&&!R.map){const w=R.walk;g.strokeStyle='rgba(84,252,84,0.9)';g.beginPath();w.forEach(([x,y],i)=>i?g.lineTo(x+.5,y+.5):g.moveTo(x+.5,y+.5));g.closePath();g.stroke();}
for(const a of R.npcs)drawTalk(a);if(id==='bar'||id==='hadiko')drawChorTalk();if(id==='fahrt')drawTalk(FRED);drawTalk(J);
}
let saveCache=null,saveCacheT=-1;
let saveRoom='lookout';
const HAS_SAVE=()=>{if(now-saveCacheT>500){const d=loadSave();saveCache=!!d;saveRoom=d&&LAYERS[d.room]?d.room:'lookout';saveCacheT=now;}return saveCache;};
function drawTitle(t){
const rm=HAS_SAVE()?saveRoom:'lookout',L=LAYERS[rm];g.drawImage(L.bg,0,0);if(rm==='lookout'){drawStars(t,0,L.stars);lookoutDyn(t);A.draw(A,t);}if(L.mid)g.drawImage(L.mid,0,0);if(L.fg)g.drawImage(L.fg,0,0);
g.fillStyle='rgba(0,0,0,0.75)';g.fillRect(0,0,W,RH);g.fillStyle='#000';g.fillRect(0,RH,W,H-RH);
if(isBday()){drawBalloons(t);textC('Heute ist der 28. Oktober. Alles Gute, Jonas!',W/2,34,'#fcfc54');}
textC('Ein Geburtstagsabenteuer für Jonas',W/2,52,'#a868fc');
if(AUTO.kiosk){textC('FILMABEND',W/2,76,'#fcfc54');textC('Der Film startet gleich von selbst.',W/2,90,'#fcfcfc');textC('Einmal klicken, dann gibt es auch Ton.',W/2,100,'#fcfcfc');textC('(läuft in Dauerschleife)',W/2,118,'#6a6a8a');
}else if(AUTO.on){textC('FILMABEND',W/2,76,'#fcfc54');textC('Jonas spielt heute selbst.',W/2,90,'#fcfcfc');textC('Zurücklehnen, Popcorn, Klick.',W/2,100,'#fcfcfc');textC('(dein Spielstand bleibt unberührt)',W/2,118,'#6a6a8a');
}else if(HAS_SAVE()&&titleConfirm){
const hv=mx>=0&&!touchMode?(my>=94&&my<108?2:my>=110&&my<124?3:0):0;
textC('Neues Spiel? Der gespeicherte Spielstand',W/2,70,'#fc8a8a');textC('wird dabei gelöscht.',W/2,80,'#fc8a8a');
textC('Ja, von vorn beginnen',W/2,98,hv===2?'#fcfc54':'#fcfcfc');textC('Abbrechen',W/2,114,hv===3?'#fcfc54':'#a868fc');
}else if(HAS_SAVE()){
const hv=mx>=0&&!touchMode?(my>=78&&my<92?1:my>=94&&my<108?2:0):0;
textC('> Weiterspielen <',W/2,82,hv===1?'#fcfc54':'#fcfcfc');textC('Neues Spiel',W/2,98,hv===2?'#fcfc54':'#a868fc');
textC('(am besten mit Ton)',W/2,118,'#6a6a8a');
}else{
if(Math.floor(t*1.6)%2===0)textC('- Klicken zum Starten -',W/2,82,'#fcfcfc');
textC('(am besten mit Ton)',W/2,96,'#6a6a8a');
}
textC(touchMode||matchMedia('(pointer:coarse)').matches?'Antippen = auswählen, nochmal = Aktion':'Esc = Menü - M = Ton - Rechtsklick = Standard-Aktion',W/2,H-14,'#3a3a5a',false);
}
function drawEnd(t){
g.fillStyle='#000';g.fillRect(0,0,W,H);
drawStars(t,30);
textC(KI_STORY?'Und so wurde Jonas wieder ein mächtiger Student.':'Und so wurde Jonas ein mächtiger Student.',W/2,10,'#d0d0f0');
textC('Doch der Untote Dekan hat die Torte entführt...',W/2,22,'#fc8a8a');
textC(KI_STORY?'Und später Doktor. Und Lead Scientist. Diesmal unersetzlich.':'Und später Doktor. Und Lead Scientist.',W/2,34,'#d0d0f0');
textC('Die HaDiKo-Party ging übrigens bis sechs Uhr morgens.',W/2,46,'#8a8ab8');
const s='ALLES GUTE!',sc=3;bigText(s,Math.round(W/2-tw(s)*sc/2),66,sc);
textC('Zum Geburtstag, Jonas!',W/2,98,'#fce04c');
textC('Hochachtungsvoll,',W/2,120,'#a868fc');
textC('deine Freunde (aus der Arrrr!-Gruppe und darüber hinaus)',W/2,132,'#a868fc');
textC('ENDE VON TEIL I - FORTSETZUNG: DIE REISE NACH DURLACH',W/2,160,'#545470',false);
if(now>endT+2500&&Math.floor(t*1.6)%2===0)textC('(Klicken für Neustart)',W/2,184,'#545454',false);
}
let lastT=0,tOff=0; // game time now=(ts-tOff)*TS: while the menu or the film pause is open, tOff grows and time stands still
function setTS(v){tOff=lastT-now/v;TS=v;}
function frame(ts){
if(menu||filmPause||chapOpen){tOff+=ts-lastT;lastT=ts;const t=now/1000;drawRoom(t);drawUI();if(menu)drawMenu();else if(chapOpen)drawChapters();else drawFilmPause();drawCursor(t);requestAnimationFrame(frame);return;}
const dt=Math.min(0.05*TS,(ts-lastT)/1000*TS||0);lastT=ts;now=(ts-tOff)*TS;const t=now/1000;
if(S.phase==='end'&&!endT)endT=now;if(S.phase!=='end')endT=0;
if(S.phase==='end'&&AUTO.kiosk&&now>endT+30000){restart();AUTO.on=true;NOSAVE=true;startFilm();}
update(dt);autosave(dt);
if(S.phase==='title')drawTitle(t);else if(S.phase==='end')drawEnd(t);else{drawRoom(t);drawFly();if(J.drunk)drawDizzy(t);drawUI();drawSierra();if(closeup)closeup.draw();if(AUTO.on&&!menu){g.fillStyle=Math.floor(t*2)%2?'#e02828':'#6a1010';g.fillRect(4,4,3,3);gtiny('FILM',9,3,'#f0f0f0');}}
drawCursor(t);
if(fade>0){g.fillStyle=`rgba(0,0,0,${Math.round(fade*8)/8})`;g.fillRect(0,0,W,H);}
if(S.phase==='opening')drawOpening();
if(S.toast&&S.phase==='game'){if(now{const d=document.documentElement;(document.fullscreenElement?document.exitFullscreen():d.requestFullscreen().catch(()=>{}))?.catch?.(()=>{});});}
function setLayout(port){PORT=port;H=port?256:200;cv.height=H;g.imageSmoothingEnabled=false;document.body.classList.toggle('port',port);}
function resize(){
const port=innerHeight>innerWidth*1.15;if(port!==PORT)setLayout(port);
const aw=innerWidth-(PORT?0:32),ah=innerHeight-(PORT?0:16);let s=Math.min(aw/W,ah/H);if(s>=2)s=Math.floor(s);s=Math.max(s,0.5);
cv.style.width=W*s+'px';cv.style.height=H*s+'px';
}
addEventListener('resize',resize);
function start(data){
LAYERS.lookout={bg:paint(lookoutBG),fg:paint(lookoutFG)};
LAYERS.bar={bg:paint(barBG),mid:paint(barMid)};
LAYERS.kino={bg:paint(kinoBG),mid:paint(kinoMid)};
LAYERS.karte={bg:paint(karteBG)};
LAYERS.wg={bg:paint(flurBG)};LAYERS.wgkueche={bg:paint(wgBG)};LAYERS.jzimmer={bg:paint(jzBG)};
LAYERS.mensa={bg:paint(mensaBG),mid:paint(mensaMid)};
LAYERS.hoersaal={bg:paint(hsBG),mid:paint(hsMid),fg:paint(hsFG)};
LAYERS.fred={bg:paint(fredBG)};LAYERS.kueche={bg:paint(kuecheBG)};LAYERS.saal={bg:paint(saalBG),fg:paint(saalFG)};LAYERS.treppe={bg:paint(treppeBG)};
LAYERS.vhaus={bg:paint(vhausBG)};LAYERS.kneipe={bg:paint(kneipeBG),mid:paint(kneipeMid)};LAYERS.teich={bg:paint(teichBG)};LAYERS.baustelle={bg:paint(baustelleBG)};
LAYERS.bruecke={bg:paint(brueckeBG)};LAYERS.steich={bg:paint(steichBG)};LAYERS.insel={bg:paint(inselBG)};LAYERS.fahrt={bg:paint(fahrtBG)};LAYERS.treppenhaus={bg:paint(thBG)};LAYERS.xmas={bg:paint(xmasBG),mid:LAYERS.kino.mid};LAYERS.foyer={bg:paint(foyerBG)};
{const c=document.createElement('canvas');c.width=W;c.height=RH;const x=c.getContext('2d');x.drawImage(LAYERS.bar.bg,0,0);x.fillStyle='rgba(60,10,80,0.45)';x.fillRect(0,0,W,RH);LAYERS.hadiko={bg:c,mid:LAYERS.bar.mid};}
LAYERS.lookout.stars=skyStars(LAYERS.lookout.bg);LAYERS.kino.stars=skyStars(LAYERS.kino.bg);
resize();
const kiosk=KIOSK_HASH.test(location.hash),film=kiosk||AUTO_HASH.test(location.hash)||AUTO_HOST.test(location.hostname);
if(film){if(location.hash&&!kiosk&&!BDAY_FORCE)history.replaceState(null,'',location.pathname);AUTO.on=true;NOSAVE=true;AUTO.kiosk=kiosk;if(kiosk)setTimeout(()=>{if(S.phase==='title')startFilm();},2500);}
if(data&&data.phase==='game'&&data.flags&&!film){applyState(data);S.phase='game';}
let ld=null;try{ld=JSON.parse(sessionStorage.getItem('jonas-island-load')||'null');sessionStorage.removeItem('jonas-island-load');}catch(e){}
if(ld&&ld.d&&ld.d.flags&&!film){applyState(ld.d);S.phase='game';S.toast={text:'Spielstand geladen ('+ld.src+').',until:6000};}
const fromLink=loadStateFromHash();if(DEBUG_RE.test(location.hash))setCheat(true);
fade=0;fadeTarget=0;
requestAnimationFrame(frame);
}
window.claude?.hot?.snapshot?.(()=>({phase:S.phase==='game'&&F.intro&&!busy&&!cutscene?'game':'title',room:S.room,flags:{...F},inv:S.inv,dlg:S.dlg,jx:J.x,jy:J.y}));
window.__game={setTS,duelOk:()=>DUEL.map(d=>d.ok),ROOM_START,MAPPTS,CHEAT,setCheat,loadSave,clearSave,S,J,A,F,WB,HUND,CHOR,ITEMS,ROOMS,give,goRoom,get busy(){return busy},get dialog(){return dialog},execute,run,click,Mus,skip:skipText,anyTalk,pick:i=>{const d=dialog;dialog=null;d.r(i);},hot:(r,id)=>ROOMS[r].hot.find(h=>h.id===id),get verb(){return verb},get obj1(){return obj1}};
window.claude?.hot?.ready?window.claude.hot.ready(start):start(window.claude?.hot?.data??{});
// offline/homescreen: the service worker (public/sw.js) keeps a copy of the page; only on the real site
if('serviceWorker'in navigator&&location.protocol==='https:')navigator.serviceWorker.register('/sw.js').catch(()=>{});