'sdinfo' ist ein tool für linux (ubuntu) mit dem man auf einfache art und weise die karten-id (CID) einer sd-karte auslesen kann.
vereinzelt werden sd-karten verwendet die mit einem passwort versiegelt wurden. siehe dazu: (CMD42) ein Befehl zum Karten-Update RNS310/RNS315 (AMUNDSEN+)
das auslesen der CID einer versiegelten sd-karte funktioniert zur zeit nur mit bestimmten linux-varianten. für diesen fall benötigt 'sdinfo' das linux kernel 4.1.0-mmc. nur mit diesem kernel lässt sich auch die CID einer gelockten (gesperrten) sd-karte auslesen. dieses kernel ist in einigen wenigen 64bit custom-varianten von ubuntu 16.04 enthalten. eine dieser custom-varianten (ubuntu-16.04.1-desktop-amd64-custom.iso) gibt es hier im forum. ein paar symbian und android smartphones bieten ebenfalls die möglichkeit die CID einer verschlüsselten sd-karte auszulesen bzw. deren status (gelockt) zurückzusetzen. windows ist nicht dafür geeignet. gelockte sd-karten werden von diesem system nicht erkannt.
'Simply@Clever' ein von mir zusammengestelltes custom-ubuntu enthält 'sdinfo' in einer dafür angepassten version. siehe: (Simply@Clever) ein Linux Live-System zum Karten-Update RNS310/RNS315(AMUNDSEN+) wer 'Simply@Clever' schon hat und verwendet, muss 'sdinfo' dafür nicht extra runterladen.
für normale (unverschlüsselte) sd-karten sind diese speziellen custom-varianten von linux(ubuntu) nicht nötig. 'sdinfo' läuft auf jedem der zur zeit aktuellen ubuntu-systeme 16.0x/17.0x/18.0x nach dem aufruf über die commandozeile eines terminal-fensters überprüft 'sdinfo' ob eine eingesteckte sd-karte als block-device ins system eingebunden wurde. läuft die schnittstelle des verwendeten kartenlesers über einen erweiterten usb-port. gibt 'sdinfo' eine fehlermeldung aus und bricht die ausgabe ab. damit lässt sich vorab erkennen ob der verwendete kartenleser für den hack - die CID einer sd-karte zu verändern - geeignet ist.
ist eine sd-karte über einen pci-bus karten-leser angeschlossen, zeigt 'sdinfo' in der ausgabe ob die karte über die nötige start-adresse mmcX:0001 verfügt. bei karten mit dieser adresse ist die wahrscheinlichkeit sehr hoch das sich deren CID verändern und anpassen lässt. X ist dabei die portnummer an dem die sd-karte anliegt und variiert je nach hardware-konfiguration normalerweise von 0 bis 3.
in der aktuellen version von 'sdinfo' werden auch die von der karte unterstützten 'Card Command Classes' ausgegeben. dabei ist Class-7 zum versiegeln von karten ganz wichtig. die klasse 7 ist eine optionale klasse und wird möglicherweise nicht von jeder karte unterstützt. also auch das muss gegeben sein.
die grossen karten-hersteller wie sandisk; samsung etc.. unterstützen diese option aber schon seit vielen jahren in ihren karten und weisen in der jeweiligen 'sd-card spezification' ausdrücklich daraufhin. ein grossteil der heutigen sd-karten stellt daher standardmässig die kommando-klassen 0, 2, 4, 5, 7, 8 und 10 zur verfügung.
ACHTUNG! das hat nichts mit den geschwindigkeitsklassen [CLASS(2), CLASS(4), CLASS(10) etc..] der sd-karten zutun.
mit der jetzigen version von 'sdinfo' darf/sollte auch nur ein cardreader im system vorhanden sein. wer mehr als einen hat und parallel zwei oder mehr karten im system eingebunden sind, da kommt es mit hoher wahrscheinlichkeit zu konflikten und 'sdinfo' wird rumzicken. genaues weiss ich nicht. ich konnte das bis jetzt nicht testen.
nachfolgend ist ein bsp. zu sehen, wie die ausgabe von 'sdinfo' in einem terminal dargestellt wird.
Code:
(SD-Card Information v1.8) 29.09.2018 20:34:46 ************
Production-Date = 11/2015
Firmware-Revision = 0x0
Hardware-Revision = 0x1
Manufacturer-ID = 0x1b
OEM-ID = 0x534d
Serialnumber = 0x6a6f06d4
Product-Name = "00000"
Product-Type = SD
CID = 1b534d3030303030106a6f06d400fb01
CSD = 400e00325b590001dcff7f800a404001
SCR = 02c5800300000000
Supported CCC = [010110110101] = 0 2 4 5 7 8 10
Card-Status = unlocked
Card-Address = mmc0:0001
***********************************************************
'sdinfo' wird von mir in form einer zip-datei zur verfügung gestellt. die zip-datei einfach in den $HOME-ordner entpacken. möglicherweise muss nach dem entpacken noch das execute-flag für 'sdinfo' gesetzt werden. dazu im $HOME-ordner ein terminal öffnen und
chmod 700 sdinfo [eingeben und mit enter bestätigen.]
oder mit der rechten maus-taste auf das icon von 'sdinfo' klicken und die eigenschaften (properties) öffnen.
im zweiten tab-reiter kann man dann einen haken für das execute-flag setzen.
root-rechte (sudo -s) etc.. sind nicht erforderlich!
meine kleine liste an brauchbaren karten habe ich inzwischen hierher verlegt:
Code:
DATUM: 05.11.2018 15:26
SUITABLE CARDS **************************************************************************************************************************************************************
01) MB-SP64D MBSP CGVF0 DGW-F D CQHE 18GH 541 CID:1b534d3030303030106a5e064400fb01 11/2015 samsung standard-card 64gb made in korea jori
02) MB-SG32D MBSG BGUEQ DFW-F D HCJ8 56MZ 525 CID: samsung standard-card 32gb made in korea Acidhouse
03) MB-MC64D MBMC CGVF0 DGW-F D CQD2 P5GR 627 CID: samsung micro-sd-card 64gb made in korea Acidhouse
04) MMAG R08GU DCA-DB I F044 0S00 903 CID: samsung micro-sd-card 8gb made in taiwan ???
05) MMAG R08GU DCA-DB S FLB3 51P1 010 CID: transcend micro-sd-card 8gb made in korea ???
03) MB-SP64D MBSP CGVF0 DGW-F D CQHX 26GI 538 CID: samsung standard-card 64gb made in korea xxx
07) MB-SP64D MBSP CGVF0 DGW-F D CQHX 26GC 538 CID:1b534d303030303010f548141400f901 09/2015 samsung standard-card 64gb made in korea jori
08) MB-SP32D MBSP BGVEQ DFW-F D CQD6 57GD 522 CID: samsung standard-card 32gb made in korea Schanz
09) MB-MC64D MBMC CGVF0 DGW-F D CQCQ 62GQ 626 CID: samsung micro-sd-card 64gb made in korea Ascot1982
10) MB-MP32D MBMP BGVEQ DFW-F K NATH NWAD 631 CID: samsung micro-sd-card 32gb made in philippines morli1982
11) MB-SS32D MBSS BGVEQ BFW-B D HTCF 91GN 416 CID: samsung standard-card 32gb made in korea harry1208
12) MMBG F08GW ACA-GE D C01U 0100 039 CID:1b534d3030303030107672241600a900 09/2010 transcend standard-card 8gb made in korea balrog
13) MB-SGCGB MBSG CGUFO CGW-B D CMK8 75AW 352 CID:1b534d3030303030106a5b54a000e200 02/2014 samsung standard-card 64gb made in korea balrog
14) MB-MPAGB MBMS AGVDD ACA-XF D HJH5 57PA 239 CID: samsung micro-sd-card 16gb made in korea CarNavi
15) MB-MSBGB MBMS BGVEO BFW-B D HTIB 25PZ 344 CID: samsung micro-sd-card 32gb made in korea CarNavi
16) MB-MSBGB MBMS BGVEO AFA-XF D HJH0 17GC 236 CID: samsung micro-sd-card 32gb made in korea CarNavi
17) MB-MSBGA MBMS BGVEO BGA-SH S N3XH NM2W 216 CID: samsung micro-sd-card 32gb made in korea CarNavi
18) MB-SP64D MBSP CGVF0 DGW-F CID:1b534d303030303010bb99049000f400 04/2015 samsung standard-card 64gb made in korea silent7
19) MB-SSBGA MBSS BGVEO BGA-SH D CYH2 40GD 239 CID: samsung standard-card 32gb made in korea derchef007
20) MB-SG32D MBSG BGUEQ DFW-F D HCK9 10JS 513 CID:1b534d3030303030104294029500f700 07/2015 samsung standard-card 32gb made in korea io2345
21) MB-SP64D MBSP CGVF0 DGW-F D CQFZ 03gc 527 CID:1b534d30303030301032e22a1500f800 08/2015 samsung standard-card 64gb made in korea phantomias2501
22) MB-SC32D MBSC BGVEQ DFW-F D CQFZ 09GD 529 CID:1b534d30303030301051192a3000f801 08/2015 samsung standard-card 32gb made in korea R@V3N
23) MB-MP32D MBMP BGVEQ DFW-F D H0J3 38GE 446 CID:1b534d303030303010daf5304d00eb00 11/2014 samsung micro-sd-card 32gb made in korea rsm4
24) MB-MP32D MBMP BGVEQ DFW-B D H0K9 28GE 505 CID:1b534d30303030301021a2060100f200 02/2015 samsung micro-sd-card 32gb made in korea KingTutt
25) MB-MP64D MBMP CGVFO DGW-F D HQHC 33PV 441 CID:1b534d303030303010b011148100ea00 10/2014 samsung micro-sd-card 64gb made in korea danielh83
26) MB-MP64D MBMP CGVFO DGW-B D HOKE 75GR 507 CID:1b534d303030303010150414a400f301 03/2015 samsung mirco-sd-card 64gb made in korea sebo31337
27) MB-SP32D MBSP BGVEQ DFW-F D HQKF 23GC 506 CID: 12/2015 samsung standard-card 32gb made in korea Antares1900
28) MB-SC32D MBSC BGVEQ DFW-F D CQHB 29GH 540 CID:1b534d303030303010533502c500fc01 12/2015 samsung standard-card 32gb made in korea Antares1900
29) MB-MP32D MBMP BGVEQ DFW-F K N9F5 9GAC 546 CID:1b534d303030303010b236573a00fb00 11/2015 samsung micro-sd-card 32gb made in philippines wach69
30) MMAG R08GU DCA-DB S FLC2 13P2 013 CID:1b534d30303030301076fd467500a300 03/2010 transcend mirco-sd-card 8gb made in korea wach69
31) MB-SC32D MBSC BGVEQ DFW-F D CQHX 63GH 538 CID:1b534d30303030301061e502f600fc00 12/2015 samsung standard-card 32gb made in korea wach69
32) MB-MP64D MBMP CGVFO DGW-F D CQK2 96GP 551 CID:1b534d303030303010186b04c2010101 01/2016 samsung standard-card 64gb made in korea wach69
33) MMBG F08GW ACA-GE D 01L0 0000 107 CID:1b534d303030303010757baf1e00b201 02/2011 integral standard-card 8gb made in korea thepostman
34) MB-SC32D MBSC BGVEQ DFW-F D CQF8 56GC 532 samsung standard-card 32gb made in korea rempremerdem
35) MB-SC64D MBSC CGVFO DGW-F K N9N7 WRAT 603 CID:1b534d303030303010f32d5db4010300 03/2016 samsung standard-card 64gb made in philippines rempremerdem
36) MB-SP64D MBSP CGVFO DGW-F D CQFB 18GV 531 CID:1b534d303030303010a17b025700f900 09/2015 samsung standard-card 64gb made in korea rempremerdem
37) MB-SP64D MBSP CGVFO DGW-F D CQFB 18GV 531 CID:1b534d303030303010a1a302b200f900 09/2015 samsung standard-card 64gb made in korea rempremerdem
38) MB-SP64D MBSP CGVFO DGW-F D CQD8 12GJ 522 CID:1b534d303030303010e524144700f600 06/2015 samsung standard-card 64gb made in korea rempremerdem
39) MB-MSBGA MBMS BGVEO BGA-SH S N49K 5M40 233 samsung micro-sd-card 32gb made in korea rempremerdem
40) MB-SC64D MBSC CGVFO DGW-F D CQDY 62GB 521 CID:1b534d3030303030102841105700f600 06/2015 samsung standard-card 64gb made in korea ufos
41) MB-SC16D MBSP AGVDD BCW-B D HTAF 64G0 411 CID:1b534d303030303010a2cd029600e401 04/2014 samsung standard-card 16gb made in korea RealNoob
42) MMCTF16GWACJ-AC 310 CHJB181GA SF-16UY CID:1b534d3030303030107dbd1cb500d300 03/2013 sony standard-card 16gb made in taiwan Forrest
43) MB-MS32D MBMS BGVEQ BFW-B D HTCK 77GG 416 CID:1b534d3030303030102a43100d00e501 05/2014 samsung micro-sd-card 32gb made in korea yopi
44) MB-SS32D MBSS BGVEQ BFW-B D HTDX 11GH 415 CID: samsung standard-card 32gb made in korea chinpokomon1338
45) MB-MSBGB MBMS BGVEQ AFA-XF D HJFG 67GD 329 CID:1b534d303030303010709c413800d700 07/2013 samsung micro-sd-card 32gb made in korea chinpokomon1338
CARDS ALLOW WRITING CID (but memorysize only 4gb) ***************************************************************************************************************************
01) MMB3 FO4GW MCA-GE D FD84 0000 939 CID:1b534d30303030301076113de0009a01 10/2009 hama standard-card 4gb made in korea xxx
02) MMB3 FO4GW MCA-GE D FD85 0000 939 CID:1b534d303030303010700a9b51009a01 10/2009 hama standard-card 4gb made in korea xxx
CARDS NOT WORKING ***********************************************************************************************************************************************************
01) MB-MC64D MBMC CGVFQ FFW-P K PBBU 39TJ 707 CID:1b534d4543344d57308bd55d2c011201 02/2017 samsung mikro-sd-card 64gb made in philippines jori
es wäre ganz schön, wenn diejenigen die ihre sd-karten erfolgreich einsetzen konnten. die erweiterten typ-daten ihrer sd-karte hier im forum bekanntgeben würden! soweit sie vorhanden sind!?
hier nochmal ein beispiel:
Code:
Samsung
---------------------
MB-SP64D
MBSPCGVF0DGW-F <------- diese angaben meine ich
D CQHE 18GH 541 <-------
Made in Korea <-------
Designed by Samsung
---------------------
hintergrund ist der, das drittanbieter wie z.bsp. transcend; hama; intenso etc. ebenfalls diese angabe auf ihre karten drucken. damit lassen sich rückschlüsse ziehen, welche sd-karten von diesen anbietern möglicherweise auch für diesen hack geeignet sind!!!
das würde die auswahl an verwendbaren karten deutlich erweitern und sich somit nicht nur auf evo-karten beschränken!!!
und noch ein hinweis:
sichert euch jeweils die karten-id (CID) bevor ihr eine veränderung an sd-karten vornehmt!!!
die kenntnisse über das produktions-datum sowie die hard.- / firmware-revision der sd-karte
sind ebenfalls wertvolle hinweise darauf ob eine karte für diesen hack geeignet ist oder nicht.
diese information wird überschrieben und geht verloren, wenn ihr eine neue CID schreibt.
seit der version 0.9+ bietet 'sdinfo' dafür das argument 'save' an.
./sdinfo save [enter]
mit der angabe dieses arguments, wird die ausgabe von 'sdinfo' zusätzlich in eine datei 'cid.db' umgeleitet. diese datei wächst mit jedem 'save'. die darin enthaltenen datensätze werden durch einen einfachen delimeter (-EOCID-) getrennt.
das kann bitte auch dazu verwendet werden, um eure karten-daten hier im forum der allgemeinheit zur verfügung zustellen. wichtig sind dabei die erweiterten typ-daten, die auf der rückseite der karte aufgedruckt sind und die Original-CID, die ihr mit 'sdinfo' ausgelesen habt. DANKE!
zum schluss noch eine liste mit weiteren CID's und den dazugehörigen passwörtern. mal so zum ausprobieren!
Code:
--------------------------------------------
CID: 5d53424c32424d31013917ca53010400 !!!
PWD: C99A20843ED7D90B6801E49F2BC80277 !!!
--------------------------------------------
CID: 015041534c303447124880ddec00b800
PWD: 33E46037B93FA156BE1F9F767F6F991D
CID: 9e42453030303030100000036a010c00
PWD: 6412D51618E889E43A773CBE84BEF78B
CID: 1d4144534420202002b134071300f101
PWD: 0ADE337703304AC469D7058CD950E939
CID: 1b534d303030303010715f530e010c01
PWD: 56AA87CA241073B713432E5509197F03
CID: 1b534d3030303030107156532f010c00
PWD: B58BA67416446C08C6BAC9DEA736C69D
CID: 1b534d3030303030100927535e010901
PWD: 4BDB1BACC7ADB0EC76D5C66BDD5E1BF4
CID: 744a605344553120104b959c1c00fb00
PWD: 45D87C7D003A5E8E7EBDA2108ACDFE7F
CID: 1b534d3030303030105b0455a1010a00
PWD: 7AE30FE69B6BC8E13AB4488F529E8B14
CID: 9c534f5553443030025db841ab0102af
PWD: E8A4C2B4BF8FFD3A29849889905240DC
CID: 1b534d3030303030100af104be00f800
PWD: 1D4E2871C78ED8F97F494811A72CE893
CID: 1b534d30303030301020665d3d010701
PWD: 24A43B2D9864C5B8E141D850EC0C5B2C
-------------------------------------
CID: 1501004d414732474107e1bd78f37ffb
PWD: CD2A527ADBE4617FF7044CBB2C225399
CID: 035344534c3038478075752ad1010a00
PWD: 73CEFB30ADE1D222296CF577E8ED8BF1
CID: 1b534d4542324d5730d14161c2011100
PWD: 359F79CBB42FDD707CAC706ADCC01F1A
CID: 00300041505053440000000520011200
PWD: 371FEFD7DA6392D0307B9440C9C74D12
CID: 1b534d30303030301075c45dbd010a01
PWD: 3866760849BC0FA74CB653310F7C48F8
CID: 1b534d30303030301032b15517010c00
PWD: 99370E44C04F600E6E5861213B318CA8
CID: 1b534d303030303010f3e753d1010b01
PWD: 0A87407426E0E929AAF0CE9DD4E51262
-------------------------------------
CID: 1b534d30303030301093a353c6010c00
PWD: 9D06011C2E9C3725ED9B5AE32704EA15
CID: 4134325344384742300024a39e00f701 OK!
PWD: B8956EE913EBC927174D9CBC00351F08 OK!
CID: 9e4245303030303010000010be010c00
PWD: 40F1E89E22763F88F9E7DB58BC5CD8DD
CID: 1b534d30303030301071da5f97010c01
PWD: 16214FA46144E6F537D724A9AAF9EECC
CID: 03534453553038478080fba62f00b200
PWD: 33FBED847510905C600EDF5F1CE40C26
CID: 28424520202020200200333db9010301
PWD: B7AF5B5484B4496554DCB2D12F205E40
CID: 02544d534130344711228237b200e100
PWD: 73F758996FB33322F10153C9636D74B7
CID: 275048534438474230da9854b700f401
PWD: 31D963019FC3581CFEF2EFE374BC45EF
CID: 1b534d4542324d5730ca455dfa011200
PWD: E7B5819F4FE3C5DC046E1FE06AA51D52
CID: 1b534d4542324d5730e48d57d9011200
PWD: D6EB216069D711A2EC1971CF0784AD3C
CID: 744a455344553120020033540a000700
PWD: 475EBB18816090F64F0274D4526B322B
CID: 1b534d30303030301059b928a500ea00
PWD: 428CC5DC4947D3DB192ED3ECA83C00E0
CID: 1b534d30303030301059b928a400ea00
PWD: 369A261B7B2B828E8E4744EE23245914
CID: 1b534d3030303030101d712e2d00f301
PWD: 81C53919BE1D54A836C8D725EB5D587C
so, hab ich noch was vergessen?! NÖ! erstmal nicht...
ach so... doch! den befehl 'sdinfo' unter linux immer mit einem vorangestellten ./ (punkt slash) aufrufen wenn er im $HOME-verzeichniss liegt!
der download von 'sdinfo' erfolgt über einen privaten cloud-account. um einen überblick über die transfer-quote zu behalten und das ganze ein wenig kontrolliert zu steuern, sind die informationen zum download/passwort für das archiv bitte per PN einzuholen. dabei sind höfliche und respektvolle anfragen mit aussagekräftigen titel in bezug auf (SD-Info) in der betreff-zeile gern gesehen. alles andere wird NICHT NUR aus logistischen / technischen gründen gefiltert und verworfen.
wer zusätzlich auch den link und das passwort zu (Simply@Clever) oder (CMD42) benötigt? auch diese bitte aus logistischen gründen jeweils einzeln und gesondert anfordern, danke!
mfg jori...
seitenprojekt zum thema 'cyclic redundancy check' der CID.
aufgrund der unterschiedlichen ausgaben im letzten byte der CID kommt es immer wieder zu nachfragen. laut sd-spezifikation beinhaltet dieses byte die crc7-summe der gesamten CID. sie ist auch interner bestandteil der CID und wird nicht nur zu übertragungszwecken ermittelt. die checksumme liegt dabei in den oberen 7 bits des letzten bytes. das letzte bit in dieser kette (bit NULL) ist das sogenannte stoppbit. dieses bit wird nicht weiter genutzt und sollte eigentlich immer auf '1' stehen. je nach checksumme können (sollten) für das lo-nibble des letzten bytes also nur ungrade werte, wie: $01; $03; $05; $07; $09; $0b; $0d: $0f auftreten. in der realität sieht das aber zur zeit immer wieder anders aus. warum? das erklärt sich mir noch nicht!
für das sende-protokoll ist die crc7-summe angeblich zwingend notwendig um übertragungsfehler schnell und sicher zu erkennen. momentan scheint sie aber nicht wirklich relevant zu sein!? wer sicher gehen möchte, sollte für das schreiben der CID 'evoplus_cid' verwenden und dort nur eine 30-stellige CID übergeben. 'evoplus_cid' berechnet daraus die crc7-summe und bindet diese automatisch in die CID mit ein.
wer interesse daran hat und sehen möchte, wie die summe für eine vorhandene CID aussieht und berechnet wird, kann dafür 'crc7' verwenden. im nächsten codefeld sind die dafür nötigen zeilen geschrieben in 'C'. damit lässt sich die korrekte checksumme für jede CID ermitteln und im terminal ausgeben. die crc7-routine stammt in teilen von 'evoplus_cid'. um eine ein.- und ausgabe im terminal zu gewähren, habe ich dafür alles nötige noch drumherum gebastelt und an vielen stellen kommentiert. der kompilierte befehl 'crc7' erwartet als eingabe eine 30-stellige CID. ausgegeben wird die reguläre crc7-summe und die um 1 bit nach links geschobene summe + stoppbit.
der sourcecode lässt sich auch unter verwendung von 'simply@clever' problemlos compilieren. dazu den gesamten text im nachfolgenden codefeld mittels copy&paste in ein neues file 'crc7.c' kopieren. in dem ordner, in dem der sourcecode 'crc7.c' abgelegt wurde ein terminal öffnen und mit dem 'gcc' kompilieren. danach die properties der kompilierten datei 'crc7' öffnen und unter 'permissons' den haken für 'executable' setzen. gleiches lässt sich auch mit 'chmod' bewerkstelligen (siehe die folgenden 2 zeilen).
gcc -o crc7 crc7.c [ENTER]
chmod 777 crc7 [ENTER]
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define version "0.9"
#define CID_SIZE 16
// binarystring ****************************************************************
#define bitpat "%c%c%c%c %c%c%c%c"
#define bit(byte) (byte & 0x80 ? '1':'0'),(byte & 0x40 ? '1':'0'),\
(byte & 0x20 ? '1':'0'),(byte & 0x10 ? '1':'0'),\
(byte & 0x08 ? '1':'0'),(byte & 0x04 ? '1':'0'),\
(byte & 0x02 ? '1':'0'),(byte & 0x01 ? '1':'0')
// subroutine calculate crc7sum ************************************************
unsigned char crc7(const unsigned char data[], int len, int verbose) {
int count; unsigned char crc = 0;
unsigned char dat; unsigned char bits;
for (count = 0; count <= len; count++) {
if (count == len) {
dat = 0;
bits = 7;
} else {
dat = data[count];
bits = 8;
}
if (verbose) {printf("\n\t dat = %02x "bitpat"\n\n",dat,bit(dat));}
for (; bits > 0; bits--) {
crc = (crc << 1) + ( (dat & 0x80) ? 1 : 0 );
if (crc & 0x80) crc ^= 0x09;
dat <<= 1;
if (verbose) {printf("\t crc = %02x "bitpat,crc,bit(crc));
printf("\t dat = %02x "bitpat,dat,bit(dat));
printf("\n");
}
}
crc &= 0x7f;
}
return ((crc << 1) + 1);
}
// crc7 versionstring **********************************************************
const char VER[] = "$VER: crc7 "version" "__DATE__" "__TIME__" jori@nachtfalke.biz";
// mainpart ********************************************************************
void main(int argc, const char **argv) {
unsigned char cid[CID_SIZE] = {0};
int verbose = 0;
// crc7 needs only 1 arg, print 'usage' otherwise ******************************
if (argc < 2) {
printf("\nUsage: %s <CID>\n\n",argv[0]);
printf("\tcalculates the crc7 checksum for a given CID.\n");
printf("\tCID must be in hex (without 0x prefix) and 30 chars. in length.\n\n");
printf("\tadd 'verbose' for bitwise output.\n\n");
printf("\texample: %s 1b534d4543344d57308bd55d2c0112\n\n",argv[0]);
return;
}
if (!strcmp("verbose", argv[argc-1])) {verbose = 1;}
// check <CID> length - should be 30 chars. long *******************************
int cid_len=strlen(argv[1]);
if (cid_len != 30) {
printf("\nINVALID CID SIZE (length should be 30 char.)\n\n");
exit(1);
}
// check <CID> for suitable chars. *********************************************
int hex_len = strspn(argv[1],"0123456789abcdefABCDEF");
if (cid_len != hex_len) {
printf("\nINVALID PARAMETER at POS:%d (char. should be a hex-value!)\n\n",hex_len+1);
exit(1);
}
// convert <CID> ascii2hex *****************************************************
for (int i = 0; i < (cid_len/2); i++){sscanf(&argv[1][i*2], "%2hhx", &cid[i]);}
// calculate crc7 checksum + left shift by 1 bit + stoppbit(1) *****************
cid[15] = crc7(cid, 15, verbose); // cal. crcsum + left shift and stoppbit
int checksum = (cid[15] >> 1); // get back the regular crc7 sum
printf("\n\t CID = %s%02x\n\tCRC7 = $%02x left shift + stoppbit = $%02x\n\n",argv[1],cid[15],checksum,cid[15]);
exit;
}
// EOF *************************************************************************
falls das mit dem kompilieren nicht gelingt, gibt es im nächsten codefeld die ausführbare datei im base64 format. ähnlich wie oben, den gesamten text im codefeld mittels copy&paste in eine neue datei 'crc7.base64' kopieren und mit dem befehl 'base64' in eine binär-datei zurückwandeln.
base64 -d crc7.base64 >crc7 [ENTER]
chmod 777 crc7 [ENTER]
./crc7 [ENTER]
Usage: ./crc7 <CID>
calculates the crc7 checksum for a given CID.
CID must be in hex (without 0x prefix) and 30 chars. in length.
add 'verbose' for bitwise output.
example: ./crc7 1b534d4543344d57308bd55d2c0112 verbose
./crc7 1b534d4543344d57308bd55d2c0112 [ENTER]
CID = 1b534d4543344d57308bd55d2c011275
CRC7 = $3a left shift + 1 stoppbit= $75
!!!ACHTUNG!!! ------------------- !!!ACHTUNG!!!
die binär datei von 'crc7', die hier im base64-format
vorliegt, ist NICHT für 32-bit prozessoren kompiliert!!!
!!!ACHTUNG! --------------------- !!!ACHTUNG!!!
Code:
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAsBJAAAAAAABAAAAAAAAAAKgxAAAAAAAAAAAAAEAAOAAN
AEAAHQAcAAYAAAAEAAAAQAAAAAAAAABAAEAAAAAAAEAAQAAAAAAA2AIAAAAAAADYAgAAAAAAAAgA
AAAAAAAAAwAAAAQAAAAYAwAAAAAAABgDQAAAAAAAGANAAAAAAAAcAAAAAAAAABwAAAAAAAAAAQAA
AAAAAAABAAAABAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAMgGAAAAAAAAyAYAAAAAAAAAEAAA
AAAAAAEAAAAFAAAAABAAAAAAAAAAEEAAAAAAAAAQQAAAAAAARQYAAAAAAABFBgAAAAAAAAAQAAAA
AAAAAQAAAAQAAAAAIAAAAAAAAAAgQAAAAAAAACBAAAAAAABQBAAAAAAAAFAEAAAAAAAAABAAAAAA
AAABAAAABgAAABAuAAAAAAAAED5AAAAAAAAQPkAAAAAAAFgCAAAAAAAAYAIAAAAAAAAAEAAAAAAA
AAIAAAAGAAAAIC4AAAAAAAAgPkAAAAAAACA+QAAAAAAA0AEAAAAAAADQAQAAAAAAAAgAAAAAAAAA
BAAAAAQAAAA4AwAAAAAAADgDQAAAAAAAOANAAAAAAAAgAAAAAAAAACAAAAAAAAAACAAAAAAAAAAE
AAAABAAAAFgDAAAAAAAAWANAAAAAAABYA0AAAAAAAEQAAAAAAAAARAAAAAAAAAAEAAAAAAAAAFPl
dGQEAAAAOAMAAAAAAAA4A0AAAAAAADgDQAAAAAAAIAAAAAAAAAAgAAAAAAAAAAgAAAAAAAAAUOV0
ZAQAAABYIgAAAAAAAFgiQAAAAAAAWCJAAAAAAABMAAAAAAAAAEwAAAAAAAAABAAAAAAAAABR5XRk
BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAFLldGQE
AAAAEC4AAAAAAAAQPkAAAAAAABA+QAAAAAAA8AEAAAAAAADwAQAAAAAAAAEAAAAAAAAAL2xpYjY0
L2xkLWxpbnV4LXg4Ni02NC5zby4yAAAAAAAEAAAAEAAAAAUAAABHTlUAAgAAwAQAAAADAAAAAAAA
AAQAAAAUAAAAAwAAAEdOVQD1Yr2R0ccLYJlNd9QpCa35ztfynwQAAAAQAAAAAQAAAEdOVQAAAAAA
AwAAAAIAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAQwAAABIAAAAAAAAAAAAAAAAAAAAAAAAALQAAABIAAAAAAAAAAAAAAAAA
AAAAAAAAMgAAABIAAAAAAAAAAAAAAAAAAAAAAAAASwAAABIAAAAAAAAAAAAAAAAAAAAAAAAAWQAA
ABIAAAAAAAAAAAAAAAAAAAAAAAAAUgAAABIAAAAAAAAAAAAAAAAAAAAAAAAAlwAAACAAAAAAAAAA
AAAAAAAAAAAAAAAAHQAAABIAAAAAAAAAAAAAAAAAAAAAAAAACwAAABIAAAAAAAAAAAAAAAAAAAAA
AAAAGAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAGxpYmMuc28uNgBfX3ByaW50Zl9jaGsAZXhpdABf
X2lzb2M5OV9zc2NhbmYAcHV0cwBfX3N0YWNrX2Noa19mYWlsAHB1dGNoYXIAc3Ryc3BuAHN0cmNt
cABfX2xpYmNfc3RhcnRfbWFpbgBHTElCQ18yLjMuNABHTElCQ18yLjcAR0xJQkNfMi40AEdMSUJD
XzIuMi41AF9fZ21vbl9zdGFydF9fAAAAAgACAAMAAgACAAIAAAAEAAUAAgAAAAAAAQAEAAEAAAAQ
AAAAAAAAAHQZaQkAAAUAawAAABAAAAAXaWkNAAAEAHcAAAAQAAAAFGlpDQAAAwCBAAAAEAAAAHUa
aQkAAAIAiwAAAAAAAADwP0AAAAAAAAYAAAAFAAAAAAAAAAAAAAD4P0AAAAAAAAYAAAAHAAAAAAAA
AAAAAAAYQEAAAAAAAAcAAAABAAAAAAAAAAAAAAAgQEAAAAAAAAcAAAACAAAAAAAAAAAAAAAoQEAA
AAAAAAcAAAADAAAAAAAAAAAAAAAwQEAAAAAAAAcAAAAEAAAAAAAAAAAAAAA4QEAAAAAAAAcAAAAG
AAAAAAAAAAAAAABAQEAAAAAAAAcAAAAIAAAAAAAAAAAAAABIQEAAAAAAAAcAAAAJAAAAAAAAAAAA
AABQQEAAAAAAAAcAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPMPHvpIg+wI
SIsF6S8AAEiFwHQC/9BIg8QIwwAAAAAA/zXiLwAA8v8l4y8AAA8fAPMPHvpoAAAAAPLp4f///5Dz
Dx76aAEAAADy6dH///+Q8w8e+mgCAAAA8unB////kPMPHvpoAwAAAPLpsf///5DzDx76aAQAAADy
6aH///+Q8w8e+mgFAAAA8umR////kPMPHvpoBgAAAPLpgf///5DzDx76aAcAAADy6XH///+Q8w8e
+vL/JV0vAAAPH0QAAPMPHvry/yVVLwAADx9EAADzDx768v8lTS8AAA8fRAAA8w8e+vL/JUUvAAAP
H0QAAPMPHvry/yU9LwAADx9EAADzDx768v8lNS8AAA8fRAAA8w8e+vL/JS0vAAAPH0QAAPMPHvry
/yUlLwAADx9EAADzDx76QVUPV8BBVFVTSInzSIPsKGRIiwQlKAAAAEiJRCQYMcAPEUQkCIP/AX9T
SIsWvwEAAABIjTX6DgAA6J7///9IjT0BDwAA6EL///9IjT0kDwAA6Db///9IjT1aDwAA6Cr///9I
ixO/AQAAADHASI01aA8AAOhk////6d0AAABIY/9FMeRIi3T++EiNPXoPAADoKP///0yLQwiFwEEP
lMRMicdIg8n/McDyrkj30YP5H3QOSI09WQ8AAOjP/v//6zFIjTV6DwAATInHTI1sJAgx7ejX/v//
g/gedCCNUAFIjTVzDwAAvwEAAAAxwOjs/v//vwEAAADo8v7//0mNVC0ASI18LQAxwEgDewhIjTWE
DwAASP/F6LP+//9Ig/0PddtEieK+DwAAAEyJ7+gzAQAASItTCL8BAAAASI01XA8AAA+2yDHAQYnI
QYnJiEwkF0HQ6EGD4H/ogv7//0iLRCQYZEgzBCUoAAAAdAXoLf7//0iDxChbXUFcQV3DZpDzDx76
Me1JidFeSIniSIPk8FBUScfAMBZAAEjHwcAVQABIx8cwEUAA/xUSLQAA9JDzDx76w2YuDx+EAAAA
AACQuGhAQABIPWhAQAB0E7gAAAAASIXAdAm/aEBAAP/gZpDDZmYuDx+EAAAAAAAPH0AAvmhAQABI
ge5oQEAASInwSMHuP0jB+ANIAcZI0f50EbgAAAAASIXAdAe/aEBAAP/gw2ZmLg8fhAAAAAAADx9A
APMPHvqAPf0sAAAAdRNVSInl6Hr////GBessAAABXcOQw2ZmLg8fhAAAAAAADx9AAPMPHvrrivMP
HvpBV0yNPYQMAABBVkFVQYnVQVRFMeRVMe1TSIPsGEiJPCSJdCQMRDlkJAwPjOABAAB0DUiLBCRB
tghCihwg6wVBtgcx20WF7Q+EiQAAAEGJ2YnYidkPttNBg+EBg+ACQYPBMDwBidhFGcCD4ARBg8Ax
PAGJ2Bn/g+AIg8cxPAGJ2Bn2g+AQg8YxPAEZwIPhIIPAMYD5AYnZRRnbg+FAgPkBD77LRRnSSIPs
CMHpH0FRg8EwRY1LMUFQRY1CMVe/AQAAAFZIjTWgCwAAUDHA6KT8//9Ig8QwidjA6AeNLGhAhO15
A4P1CQHbRYXtD4QLAQAAQYnpieiJ6UAPttVBg+EBg+ACQYPBMDwBiehFGcCD4ARBg8AxPAGJ6Bn/
g+AIg8cxPAGJ6Bn2g+AQg8YxPAEZwIPhIIPAMYD5AYnpRRnbg+FAgPkBQA++zUUZ0kiD7AjB6R9B
UYPBMEWNSzFBUEWNQjFXvwEAAABWTIn+UDHA6AL8//+J2EiDxCiJ2YPgAmowD7bTPAGJ2EUZwIPg
BEGDwDE8AYnYGf+D4AhBUIPHMTwBidgZ9oPgEFe/AQAAAIPGMTwBGcCD4SBWSI017AoAAIPAMYD5
AYnZRRnJg+FAUID5AQ++y0UZ0sHpH0GDwTExwIPBMEWNQjHoiPv//0iDxDC/CgAAAOga+///Qf7O
D4XR/v//g+V/Sf/E6RX+//9Ig8QYjUQtAVtdQVxBXUFeQV/DDx8A8w8e+kFXTI09QygAAEFWSYnW
QVVJifVBVEGJ/FVIjS00KAAAU0wp/UiD7AjoD/r//0jB/QN0HzHbDx+AAAAAAEyJ8kyJ7kSJ50H/
FN9Ig8MBSDnddepIg8QIW11BXEFdQV5BX8NmZi4PH4QAAAAAAPMPHvrDAAAA8w8e+kiD7AhIg8QI
wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIACgkgZGF0ID0gJTAy
eCAgJWMlYyVjJWMgJWMlYyVjJWMKCgAJIGNyYyA9ICUwMnggICVjJWMlYyVjICVjJWMlYyVjAAkg
ZGF0ID0gJTAyeCAgJWMlYyVjJWMgJWMlYyVjJWMAClVzYWdlOiAlcyA8Q0lEPgoKAAljYWxjdWxh
dGVzIHRoZSBjcmM3IGNoZWNrc3VtIGZvciBhIGdpdmVuIENJRC4ACUNJRCBtdXN0IGJlIGluIGhl
eCAod2l0aG91dCAweCBwcmVmaXgpIGFuZCAzMCBjaGFycy4gaW4gbGVuZ3RoLgoACWFkZCAndmVy
Ym9zZScgZm9yIGJpdHdpc2Ugb3V0cHV0LgoACWV4YW1wbGU6ICVzIDFiNTM0ZDQ1NDMzNDRkNTcz
MDhiZDU1ZDJjMDExMgoKAHZlcmJvc2UACklOVkFMSUQgQ0lEIFNJWkUgKGxlbmd0aCBzaG91bGQg
YmUgMzAgY2hhci4pCgAwMTIzNDU2Nzg5YWJjZGVmQUJDREVGAApJTlZBTElEIFBBUkFNRVRFUiBh
dCBQT1M6JWQgKGNoYXIuIHNob3VsZCBiZSBhIGhleC12YWx1ZSEpCgoAJTJoaHgACgkgQ0lEID0g
JXMlMDJ4CglDUkM3ID0gJCUwMnggIGxlZnQgc2hpZnQgKyBzdG9wcGJpdCA9ICQlMDJ4CgoAAAAA
AAAAAAAAAAAAAAAAAAAAJFZFUjogY3JjNyAwLjkgTWF5ICA0IDIwMjAgMDI6MTA6MDIgam9yaUBu
YWNodGZhbGtlLmJpegABGwM7TAAAAAgAAADI7f//kAAAAFju//+4AAAA2O7//1gBAABY8P//aAAA
AIjw//98AAAAPvH//9AAAABo8///mAEAANjz///gAQAAAAAAABQAAAAAAAAAAXpSAAF4EAEbDAcI
kAEAABAAAAAcAAAA6O///y8AAAAARAcQEAAAADAAAAAE8P//BQAAAAAAAAAkAAAARAAAADDt//+Q
AAAAAA4QRg4YSg8LdwiAAD8aOiozJCIAAAAAFAAAAGwAAACY7f//gAAAAAAAAAAAAAAAhAAAAIQA
AABm8P//JwIAAABGDhCPAkkOGI4DQg4gjQRFDiiMBUQOMIYGQw44gwdEDlACjQ5YRQ5gSQ5oRQ5w
Rg54SA6AAUsOUAJ6DlhFDmBJDmhFDnBGDnhEDoABTQ5YRw5gXA5oTQ5wUA54Vg6AAWIOUGIOOEUO
MEEOKEIOIEIOGEIOEEIOCDwAAAAMAQAAeO3//34BAAAARg4QjQJFDhiMA0EOIIYEQQ4ogwVHDlAD
YwEOKEEOIEEOGEIOEEIOCAAAAAAAAABEAAAATAEAAMjx//9lAAAAAEYOEI8CSQ4YjgNFDiCNBEUO
KIwFRA4whgZIDjiDB0cOQG4OOEEOMEEOKEIOIEIOGEIOEEIOCAAQAAAAlAEAAPDx//8FAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQE0AAAAAA
AGATQAAAAAAAAQAAAAAAAAABAAAAAAAAAAwAAAAAAAAAABBAAAAAAAANAAAAAAAAADgWQAAAAAAA
GQAAAAAAAAAQPkAAAAAAABsAAAAAAAAACAAAAAAAAAAaAAAAAAAAABg+QAAAAAAAHAAAAAAAAAAI
AAAAAAAAAPX+/28AAAAAoANAAAAAAAAFAAAAAAAAAMgEQAAAAAAABgAAAAAAAADAA0AAAAAAAAoA
AAAAAAAApgAAAAAAAAALAAAAAAAAABgAAAAAAAAAFQAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAEBA
AAAAAAACAAAAAAAAAMAAAAAAAAAAFAAAAAAAAAAHAAAAAAAAABcAAAAAAAAACAZAAAAAAAAHAAAA
AAAAANgFQAAAAAAACAAAAAAAAAAwAAAAAAAAAAkAAAAAAAAAGAAAAAAAAAD+//9vAAAAAIgFQAAA
AAAA////bwAAAAABAAAAAAAAAPD//28AAAAAbgVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAID5AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
MBBAAAAAAABAEEAAAAAAAFAQQAAAAAAAYBBAAAAAAABwEEAAAAAAAIAQQAAAAAAAkBBAAAAAAACg
EEAAAAAAAAAAAAAAAAAAAAAAAAAAAABHQ0M6IChVYnVudHUgOS4yLjEtOXVidW50dTIpIDkuMi4x
IDIwMTkxMDA4AAAuc2hzdHJ0YWIALmludGVycAAubm90ZS5nbnUucHJvcGVydHkALm5vdGUuZ251
LmJ1aWxkLWlkAC5ub3RlLkFCSS10YWcALmdudS5oYXNoAC5keW5zeW0ALmR5bnN0cgAuZ251LnZl
cnNpb24ALmdudS52ZXJzaW9uX3IALnJlbGEuZHluAC5yZWxhLnBsdAAuaW5pdAAucGx0LnNlYwAu
dGV4dAAuZmluaQAucm9kYXRhAC5laF9mcmFtZV9oZHIALmVoX2ZyYW1lAC5pbml0X2FycmF5AC5m
aW5pX2FycmF5AC5keW5hbWljAC5nb3QALmdvdC5wbHQALmRhdGEALmJzcwAuY29tbWVudAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAALAAAAAQAAAAIAAAAAAAAAGANAAAAAAAAYAwAAAAAAABwAAAAAAAAAAAAAAAAAAAAB
AAAAAAAAAAAAAAAAAAAAEwAAAAcAAAACAAAAAAAAADgDQAAAAAAAOAMAAAAAAAAgAAAAAAAAAAAA
AAAAAAAACAAAAAAAAAAAAAAAAAAAACYAAAAHAAAAAgAAAAAAAABYA0AAAAAAAFgDAAAAAAAAJAAA
AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA5AAAABwAAAAIAAAAAAAAAfANAAAAAAAB8AwAA
AAAAACAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAARwAAAPb//28CAAAAAAAAAKADQAAA
AAAAoAMAAAAAAAAcAAAAAAAAAAYAAAAAAAAACAAAAAAAAAAAAAAAAAAAAFEAAAALAAAAAgAAAAAA
AADAA0AAAAAAAMADAAAAAAAACAEAAAAAAAAHAAAAAQAAAAgAAAAAAAAAGAAAAAAAAABZAAAAAwAA
AAIAAAAAAAAAyARAAAAAAADIBAAAAAAAAKYAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
YQAAAP///28CAAAAAAAAAG4FQAAAAAAAbgUAAAAAAAAWAAAAAAAAAAYAAAAAAAAAAgAAAAAAAAAC
AAAAAAAAAG4AAAD+//9vAgAAAAAAAACIBUAAAAAAAIgFAAAAAAAAUAAAAAAAAAAHAAAAAQAAAAgA
AAAAAAAAAAAAAAAAAAB9AAAABAAAAAIAAAAAAAAA2AVAAAAAAADYBQAAAAAAADAAAAAAAAAABgAA
AAAAAAAIAAAAAAAAABgAAAAAAAAAhwAAAAQAAABCAAAAAAAAAAgGQAAAAAAACAYAAAAAAADAAAAA
AAAAAAYAAAAYAAAACAAAAAAAAAAYAAAAAAAAAJEAAAABAAAABgAAAAAAAAAAEEAAAAAAAAAQAAAA
AAAAGwAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAACMAAAAAQAAAAYAAAAAAAAAIBBAAAAA
AAAgEAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAlwAAAAEAAAAGAAAAAAAA
ALAQQAAAAAAAsBAAAAAAAACAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAKAAAAABAAAA
BgAAAAAAAAAwEUAAAAAAADARAAAAAAAABQUAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACm
AAAAAQAAAAYAAAAAAAAAOBZAAAAAAAA4FgAAAAAAAA0AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAA
AAAAAAAArAAAAAEAAAACAAAAAAAAAAAgQAAAAAAAACAAAAAAAABYAgAAAAAAAAAAAAAAAAAAIAAA
AAAAAAAAAAAAAAAAALQAAAABAAAAAgAAAAAAAABYIkAAAAAAAFgiAAAAAAAATAAAAAAAAAAAAAAA
AAAAAAQAAAAAAAAAAAAAAAAAAADCAAAAAQAAAAIAAAAAAAAAqCJAAAAAAACoIgAAAAAAAKgBAAAA
AAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAzAAAAA4AAAADAAAAAAAAABA+QAAAAAAAEC4AAAAA
AAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAANgAAAAPAAAAAwAAAAAAAAAYPkAAAAAA
ABguAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAADkAAAABgAAAAMAAAAAAAAA
ID5AAAAAAAAgLgAAAAAAANABAAAAAAAABwAAAAAAAAAIAAAAAAAAABAAAAAAAAAA7QAAAAEAAAAD
AAAAAAAAAPA/QAAAAAAA8C8AAAAAAAAQAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAPIA
AAABAAAAAwAAAAAAAAAAQEAAAAAAAAAwAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAA
AAAAAAD7AAAAAQAAAAMAAAAAAAAAWEBAAAAAAABYMAAAAAAAABAAAAAAAAAAAAAAAAAAAAAIAAAA
AAAAAAAAAAAAAAAAAQEAAAgAAAADAAAAAAAAAGhAQAAAAAAAaDAAAAAAAAAIAAAAAAAAAAAAAAAA
AAAAAQAAAAAAAAAAAAAAAAAAAAYBAAABAAAAMAAAAAAAAAAAAAAAAAAAAGgwAAAAAAAALAAAAAAA
AAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAACUMAAAAAAA
AA8BAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
Lesezeichen