{"id":1621,"date":"2023-06-10T12:27:17","date_gmt":"2023-06-10T11:27:17","guid":{"rendered":"https:\/\/www.sp3yor.net\/?p=1621"},"modified":"2023-06-10T12:32:56","modified_gmt":"2023-06-10T11:32:56","slug":"odswiezenie-yor-beaconow-czyli-inzynieria-wsteczna-avr-lekcja-1","status":"publish","type":"post","link":"https:\/\/www.sp3yor.net\/?p=1621","title":{"rendered":"Od\u015bwie\u017cenie YOR-beacon\u00f3w, czyli in\u017cynieria wsteczna AVR, lekcja 1."},"content":{"rendered":"\n<p>&#8222;Klubowe&#8221; beacony mikrofalowe (23, 13 oraz 3 cm) wybieraj\u0105 si\u0119 do nowego, troch\u0119 wy\u017cszego ni\u017c dach bloku QTH. \u017beby wszystko by\u0142o legalne, poprawne i zgodne ze sztuk\u0105, nale\u017ca\u0142o wymienionym urz\u0105dzeniom zaktualizowa\u0107 oprogramowanie keyer\u00f3w, aby przedstawia\u0142y si\u0119 odpowiednim znakiem (SR3YOR) oraz nowym lokatorem.<\/p>\n\n\n\n<p>Beacony na 3 i 23 cm to konstrukcje &#8222;klasyczne&#8221;, tzn. schemat blokowy urz\u0105dzenia \u017cywcem przypomina &#8222;nadajnik telegraficzny na jedno pasmo&#8221; z egzaminu na uprawnienia amatorskie.<\/p>\n\n\n\n<p>\u0179r\u00f3d\u0142em sygna\u0142u jest generator kwarcowy, kt\u00f3rego sygna\u0142 jest wielokrotnie powielany, filtrowany i wzmacniany, a\u017c do uzyskania odpowiedniej cz\u0119stotliwo\u015bci i mocy wyj\u015bciowej. Kluczowanie odbywa si\u0119 poprzez w\u0142\u0105czanie i wy\u0142\u0105czanie stopnia mocy (dla 23 cm) lub delikatn\u0105 zmian\u0119 cz\u0119stotliwo\u015bci generatora za pomoc\u0105 napi\u0119cia (3 cm &#8211; nadaje sygna\u0142 CW-FSK).<\/p>\n\n\n\n<p>W pa\u015bmie 3 cm zastosowano kwarc o cz\u0119stotliwo\u015bci 108,009 MHz co pomno\u017cone 96 razy produkuje sygna\u0142 w okolicy 10 368 MHz &#8211; dost\u0119pny jest trymer do precyzyjnego dostrajania, a o stabilno\u015b\u0107 temperatury (i cz\u0119stotliwo\u015bci) dba OCXO wg. G8ACE, utrzymuj\u0105ce sta\u0142e 60\u00b0C.<\/p>\n\n\n\n<p>Uk\u0142ady kluczuj\u0105ce w obydwu urz\u0105dzeniach s\u0105 wzgl\u0119dnie proste, bo ich zadaniem jest tylko wytworzenie przebiegu on\/off odpowiadaj\u0105cego telegraficznej reprezentacji znaku i lokatora.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3 cm<\/h2>\n\n\n\n<p>Na pierwszy ogie\u0144 we\u017amy beacon na 3 cm, z keyerem wykonanym przez SP3FYK i zaprogramowanym przez SP5MX.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"767\" src=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y-1024x767.jpg\" alt=\"\" class=\"wp-image-1622\" srcset=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y-1024x767.jpg 1024w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y-300x225.jpg 300w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y-768x575.jpg 768w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/photo_5771750157182942742_y.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Serce urz\u0105dzenia to leciwy (a jeszcze niedawno ca\u0142kiem nowy, w por\u00f3wnaniu do 2051&#8230;) mikrokontroler attiny2313. Wygodnie wyprowadzone z\u0142\u0105cze ISP kusi \u017ceby pod\u0142\u0105czy\u0107 do\u0144 programator i zobaczy\u0107 co w beaconie piszczy.<\/p>\n\n\n\n<p>Za pomoc\u0105 programu avrdude odczyta\u0142em pami\u0119c flash urz\u0105dzenia:<br><code>avrdude -c usbasp -p t2313 -U flash:w:3cm.hex:i<\/code> <br>i zabra\u0142em si\u0119 za jej analiz\u0119. M\u00f3g\u0142bym oczywi\u015bcie bardzo ma\u0142ym nak\u0142adem pracy napisa\u0107 sw\u00f3j program, w ko\u0144cu to tylko ustawianie stanu HIGH oraz LOW na danym pinie, ale w ramach zabawy stwierdzi\u0142em, \u017ce przerobi\u0119 to co ju\u017c siedzi w mikrokontrolerze.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"885\" height=\"775\" src=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-2.png\" alt=\"\" class=\"wp-image-1625\" srcset=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-2.png 885w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-2-300x263.png 300w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-2-768x673.png 768w\" sizes=\"auto, (max-width: 885px) 100vw, 885px\" \/><\/a><\/figure>\n\n\n\n<p>Tak prezentuje si\u0119 surowy program. Zanim si\u0119gniemy po deasembler, warto wizualnie oceni\u0107 zawarto\u015b\u0107 pami\u0119ci &#8211; moj\u0105 uwag\u0119 natychmiast przyku\u0142y ci\u0105gi &#8222;2D&#8221; i &#8222;2E&#8221; w pierwszej po\u0142owie zrzutu &#8211; odpowiadaj\u0105 one znakom &#8217;-&#8217; i &#8217;.&#8217;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; chr(0x2d), chr(0x2e)\n('-', '.')<\/code><\/pre>\n\n\n\n<p>To nie mo\u017ce by\u0107 nic innego jak telegrafia. Zamie\u0144my wi\u0119c wszystkie wyst\u0105pienia <code>2D<\/code> na my\u015blniki, <code>2E<\/code> na kropki a <code>00<\/code> na spacje (global search-and-replace):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"299\" src=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-1.png\" alt=\"\" class=\"wp-image-1624\" srcset=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-1.png 568w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-1-300x158.png 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/a><\/figure>\n\n\n\n<p>Ca\u0142y alfabet telegraficzny w formie tablicy. Super, czyli gdzie\u015b w kodzie musi znajdowa\u0107 si\u0119 funkcja kt\u00f3re iteruje po ci\u0105gu znak\u00f3w i dla ka\u017cdego wywo\u0142uje funkcj\u0119 nadaj\u0105c\u0105. To pozwala domniemywa\u0107, \u017ce gdzie\u015b w pami\u0119ci musi znajdowa\u0107 si\u0119 ci\u0105g tekstowy, LUB, ewentualnie, szereg liczb okre\u015blaj\u0105cy pozycj\u0119 w tablicy kt\u00f3re tworz\u0105 znak i lokator. Tekst w pliku binarnym naj\u0142atwiej znale\u017a\u0107 za pomoc\u0105 polecenia <code>strings<\/code>, ale \u017ceby m\u00f3c go u\u017cy\u0107, trzeba przekonertowa\u0107 nasz plik .hex na format binarny:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u279c  <span style=\"background-color: initial; font-family: Monaco, Consolas, &quot;Andale Mono&quot;, &quot;DejaVu Sans Mono&quot;, monospace;\">objcopy -I ihex -O binary 3cm.hex 3cm.bin<\/span>\n\n\u279c  strings 3cm.bin \n..--.-\n.-.-.\n--..---....-.-.-.--..-.\n(....)\n-.--\n--..\nsr3xhy sr3xhy sr3xhy jo82lj jo82lj jo82lj \n<\/code><\/pre>\n\n\n\n<p>Voila &#8211; mamy co chcieli\u015bmy. Pozosta\u0142o tylko znale\u017a\u0107 interesuj\u0105cy nas tekst w pliku <code>.hex<\/code> i podmieni\u0107 go na nowy.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; ''.join(&#91;hex(ord(x))&#91;2:] for x in 'sr3xhy'])\n'737233786879'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"98\" src=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-3.png\" alt=\"\" class=\"wp-image-1626\" srcset=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-3.png 909w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-3-300x32.png 300w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-3-768x83.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><\/a><\/figure>\n\n\n\n<p>Zaznaczone na niebiesko bajty w pliku .hex (<code>6A<\/code> i <code>23<\/code>) to sumy kontrolne &#8211; nale\u017cy przeliczy\u0107 je, aby program <code>avrdude<\/code> nie zg\u0142osi\u0142 b\u0142\u0119du przy programowaniu. U\u017cy\u0142em pluginu do edycji plik\u00f3w intel hex do VS Code i zrobi\u0142em to jednym klikni\u0119ciem. Pozosta\u0142o wgra\u0107 zmieniony program:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>avrdude -c usbasp -p t2313 -U flash:w:3cm.hex:i<\/code><\/pre>\n\n\n\n<p>I zgodnie z oczekiwaniami &#8211; dioda led na keyerze zacz\u0119\u0142a mruga\u0107 w takt nowego znaku i lokatora.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">23 cm<\/h2>\n\n\n\n<p>Tu jest gorzej. Narz\u0119dzie <code>strings<\/code> nie zwraca \u017cadnych &#8222;oczywistych&#8221; rezultat\u00f3w, tak samo rzut oka na plik hex. Czas spojrze\u0107 na program w postaci zdeasemblowanej:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>avr-objdump -D -m avr 23cm.hex | less<\/code><\/pre>\n\n\n\n<p>Podstawowym punktem zaczepienia mo\u017ce by\u0107 oczywi\u015bcie fakt, \u017ce kluczowanie CW odbywa si\u0119 za pomoc\u0105 jakiego\u015b pinu procesora. Sterowanie pinami odbywa si\u0119 za pomoc\u0105 instrukcji <code>sbi<\/code> i <code>cbi<\/code>, kt\u00f3re musz\u0105 wyst\u0119powa\u0107 listingu asemblera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 3b6:   08 95           ret\n 3b8:   95 9a           <strong>sbi<\/strong>     0x12, 5 ; 18\n 3ba:   a0 e6           ldi     r26, 0x60       ; 96\n 3bc:   8d 91           ld      r24, X+\n 3be:   9c 91           ld      r25, X\n 3c0:   5b d0           rcall   .+182           ;  0x478\n 3c2:   95 98           <strong>cbi<\/strong>     0x12, 5 ; 18\n 3c4:   a0 e6           ldi     r26, 0x60       ; 96\n 3c6:   8d 91           ld      r24, X+\n 3c8:   9c 91           ld      r25, X\n 3ca:   56 d0           rcall   .+172           ;  0x478\n 3cc:   08 95           ret\n 3ce:   95 9a           <strong>sbi<\/strong>     0x12, 5 ; 18\n 3d0:   a2 e6           ldi     r26, 0x62       ; 98\n 3d2:   8d 91           ld      r24, X+\n 3d4:   9c 91           ld      r25, X\n 3d6:   50 d0           rcall   .+160           ;  0x478\n 3d8:   95 98           <strong>cbi<\/strong>     0x12, 5 ; 18\n 3da:   a0 e6           ldi     r26, 0x60       ; 96\n 3dc:   8d 91           ld      r24, X+\n 3de:   9c 91           ld      r25, X\n 3e0:   4b d0           rcall   .+150           ;  0x478\n 3e2:   08 95           ret<\/code><\/pre>\n\n\n\n<p>W powy\u017cszym fragmencie wida\u0107 dwie funkcje (pomi\u0119dzy <code>ret<\/code> i <code>ret<\/code>), kt\u00f3re ustawiaj\u0105 stan wysoki a nast\u0119pnie niski na pinie  <code>5<\/code> portu &#8222;D&#8221; &#8211; czyli <code>0x12<\/code>, zgodnie z <a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/Atmel-2543-AVR-ATtiny2313_Datasheet.pdf\">dokumentacj\u0105 attiny2313<\/a>.<\/p>\n\n\n\n<p>Poszukajmy w kodzie odwo\u0142a\u0144 do tych funkcji, czyli skok\u00f3w pod adresy <code>0x3b8<\/code> oraz <code>0x3ce<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 29e:   08 95           ret\n 2a0:   8b d0           rcall   .+278           ;  0x3b8\n 2a2:   95 d0           rcall   .+298           ;  0x3ce\n 2a4:   94 d0           rcall   .+296           ;  0x3ce\n 2a6:   93 d0           rcall   .+294           ;  0x3ce\n 2a8:   9d d0           rcall   .+314           ;  0x3e4\n 2aa:   08 95           ret\n 2ac:   90 d0           rcall   .+288           ;  0x3ce\n 2ae:   84 d0           rcall   .+264           ;  0x3b8\n 2b0:   8e d0           rcall   .+284           ;  0x3ce\n 2b2:   98 d0           rcall   .+304           ;  0x3e4\n 2b4:   08 95           ret\n 2b6:   80 d0           rcall   .+256           ;  0x3b8\n 2b8:   8a d0           rcall   .+276           ;  0x3ce\n 2ba:   7e d0           rcall   .+252           ;  0x3b8\n 2bc:   7d d0           rcall   .+250           ;  0x3b8\n 2be:   92 d0           rcall   .+292           ;  0x3e4\n 2c0:   08 95           ret\n 2c2:   85 d0           rcall   .+266           ;  0x3ce\n 2c4:   84 d0           rcall   .+264           ;  0x3ce\n 2c6:   8e d0           rcall   .+284           ;  0x3e4\n 2c8:   08 95           ret<\/code><\/pre>\n\n\n\n<p>Mamy tutaj kilka funkcji. Je\u015bli przyj\u0119liby\u015bmy, \u017ce funkcja spod <code>3b8<\/code> nadaje kropk\u0119, a <code>3ce<\/code> kresk\u0119, to sk\u0142ada si\u0119 to w telegraficzne literki &#8222;J&#8221;, &#8222;K&#8221;, &#8222;L&#8221;, &#8222;M&#8221;, a z du\u017cym prawdopodobie\u0144stwem <code>3e4<\/code> oznacza po prostu czekanie. Czas spojrze\u0107 wi\u0119c sk\u0105d wo\u0142ane s\u0105 w\/w funkcje&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 15a:   cc d0           rcall   .+408           ;  0x2f4\n 15c:   c1 d0           rcall   .+386           ;  0x2e0\n 15e:   ec d0           rcall   .+472           ;  0x338\n 160:   aa d0           rcall   .+340           ;  0x2b6\n 162:   98 d0           rcall   .+304           ;  0x294\n 164:   c2 d0           rcall   .+388           ;  0x2ea\n 166:   3e d1           rcall   .+636           ;  0x3e4\n 168:   9b d0           rcall   .+310           ;  0x2a0\n 16a:   af d0           rcall   .+350           ;  0x2ca\n 16c:   08 d1           rcall   .+528           ;  0x37e\n 16e:   dd d0           rcall   .+442           ;  0x32a\n 170:   a2 d0           rcall   .+324           ;  0x2b6\n 172:   96 d0           rcall   .+300           ;  0x2a0\n 174:   37 d1           rcall   .+622           ;  0x3e4<\/code><\/pre>\n\n\n\n<p>Pomijaj\u0105c funkcj\u0119 pauzy (<code>3e4<\/code>), mamy wi\u0119c odwo\u0142ania do adres\u00f3w <code>2f4 2e0 338 2b6 294 2ea 2a0 2ca 37e 32a 2b6 2a0<\/code>. U\u017cyjmy kr\u00f3tkiego skryptu w pythonie do zobaczenia, kt\u00f3re funkcje s\u0105 wywo\u0142ywanie &#8211; nie b\u0119dziemy tego sprawdza\u0107 r\u0119cznie, w ko\u0144cu to a\u017c 12 znak\u00f3w&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/python3\n\nf = open('23cm.asm').read().splitlines()\n\nfor addr in &#91;'2f4', '2e0', '338', '2b6', '294', '2ea', '2a0', '2ca', '37e', '32a', '2b6', '2a0']:\n    prin = False\n    out = \"\"\n    for l in f:\n        if l.startswith(f\" {addr}\") or prin:\n            prin = True\n            out += \"-\" if \"0x3ce\" in l else '.' if \"0x3b8\" in l else \"\"\n        if 'ret' in l:\n            prin = False\n\n    print(out)<\/code><\/pre>\n\n\n\n<p>Odpalmy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u279c  python3 parse.py \n...\n.-.\n...--\n.-..\n....\n-.--\n.---\n---\n---..\n..---\n.-..\n.---<\/code><\/pre>\n\n\n\n<p>I wszystko jasne &#8211; znaki uk\u0142adaj\u0105 si\u0119 w ci\u0105g SR3LHY JO82LJ. Analogicznie do poprzedniego przyk\u0142adu z pasma 3 cm, nale\u017cy teraz &#8222;tylko&#8221; podmieni\u0107 adresy wywo\u0142ywanych funkcji.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>15a:   cc d0           rcall   .+408           ;  0x2f4<\/code><\/pre>\n\n\n\n<p>Skok pod adres <code>0x2f4<\/code> kodowany jest przez op-code &#8222;<code>cc d0<\/code>&#8222;. Tak wygl\u0105da op-kod dla instrukcji rcall:  (<a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/devicedoc\/atmel-0856-avr-instruction-set-manual.pdf\">strona 137<\/a>)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"109\" src=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4-1024x109.png\" alt=\"\" class=\"wp-image-1628\" srcset=\"https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4-1024x109.png 1024w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4-300x32.png 300w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4-768x82.png 768w, https:\/\/www.sp3yor.net\/wp-content\/uploads\/2023\/06\/image-4.png 1155w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Ca\u0142y trick polega na tym, \u017ce adres pod kt\u00f3ry skaczemy jest w instrukcji <code>rcall<\/code> podawany relatywnie do naszej aktualnej pozycji w pami\u0119ci, czyli je\u015bli z <code>15a<\/code> chcemy skoczy\u0107 na <code>2f4<\/code>, to musimy skoczy\u0107 o <code>0x0cc<\/code>, czyli 204, razy dwa &#8211; 408 kom\u00f3rek pami\u0119ci.<\/p>\n\n\n\n<p>Sprawia to, \u017ce podmiana wywo\u0142a\u0144 nie jest trywialna, ale z wiedz\u0105 jak dzia\u0142a instrukcja rcall, nie jest te\u017c absolutnie trudna &#8211; wystarczy kalkulator i chwila cierpliwo\u015bci. Po naniesieniu poprawek w pliku hex (i korekcie checksum na ko\u0144cu ka\u017cdej modyfikowanej linii) mo\u017cna taki plik wrzuci\u0107 jeszcze raz do deasemblera (<code>avr-objdump<\/code>) i upewni\u0107 si\u0119, \u017ce wo\u0142amy do odpowiednich miejsc. Finalnym potwierdzeniem by\u0142o u\u017cycie <code>avrdude<\/code> i uwa\u017cna obserwacja diody na pude\u0142ku keyera \ud83d\ude42<\/p>\n\n\n\n<p>Dwa beacony \u0107wierkaj\u0105 ju\u017c nowymi znakami, pozosta\u0142 jeszcze model na 13 cm &#8211; ju\u017c wkr\u00f3tce!<\/p>\n\n\n\n<p>73 \/ SQ3SWF<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8222;Klubowe&#8221; beacony mikrofalowe (23, 13 oraz 3 cm) wybieraj\u0105 si\u0119 do nowego, troch\u0119 wy\u017cszego ni\u017c dach bloku QTH. \u017beby wszystko by\u0142o legalne, poprawne i zgodne ze sztuk\u0105, nale\u017ca\u0142o wymienionym urz\u0105dzeniom zaktualizowa\u0107 oprogramowanie keyer\u00f3w, aby przedstawia\u0142y si\u0119 odpowiednim znakiem (SR3YOR) oraz &hellip; <a href=\"https:\/\/www.sp3yor.net\/?p=1621\">Czytaj dalej <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1621","post","type-post","status-publish","format-standard","hentry","category-bez-kategorii"],"_links":{"self":[{"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/posts\/1621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1621"}],"version-history":[{"count":5,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/posts\/1621\/revisions"}],"predecessor-version":[{"id":1633,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=\/wp\/v2\/posts\/1621\/revisions\/1633"}],"wp:attachment":[{"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sp3yor.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}