рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рд▓рд┐рдЦрдирд╛ рдмрдВрдж рдХреИрд╕реЗ рдХрд░реЗрдВред рд╣рдо рдЬреАрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...


рдФрд░ рдлрд┐рд░, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рдХреИрд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдиреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЬрдЧрд╛рдпрд╛ рдерд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдФрд░ рд╢рд╛рдпрдж, рдпрд╣ рдореБрдЭреЗ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред


рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдорд╛рдирдХ Peripherals Library рд╕реЗ DMA_Polling рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдирдореВрдирд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рд╣реИ, рдХрд┐ рдЖрдк рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рд╕реЗ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдПрдордХреЗ рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдПрдЪрдПрдПрд▓ рдпрд╛ рд╕реНрдЯреИрдВрдбрд░реНрдб рдкреЗрд░рд┐рдлреЗрд░рд▓реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдУрдкрдирдУрд╕реАрдбреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - рд╕реВрдЪреА рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрд╕рдЯреАрдПрдо 32, рдПрдЯрдореЗрд▓, рдкреАрдЖрдИрд╕реА 32 рдФрд░ рдЕрдиреНрдпред рдЙрд╕реА рд╕рдордп, рд╣рдо рд╣реЛрд╕реНрдЯ рдкреАрд╕реА рдХреЗ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирдП рд╕реА ++ рднрд╛рд╖рд╛ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдЖрдк рд░реИрдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЖрдк рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдмрд╕ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдПрд▓рдИрдбреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░реЗрдВрдЧреЗред рдФрд░ DMA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UART рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп UART рдкрд░ рдбреЗрдЯрд╛ рднреА рднреЗрдЬреЗрдВред рдбреАрдПрдордП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдмреЛрдирд╕ рджреЗрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЙрди рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдо рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдорддрджрд╛рди, рдЬреЛ рдореЗрд░реЗ рдбрд┐рдмрдЧрд░ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдбреЗрдЯрд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕рдордп рд╣реИред рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдЙрддреНрдкрдиреНрди рднреАред рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдмрд▓ рд╕рд┐рдЧреНрдирд▓ рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рд╕реНрдирд┐рдлрд░ рдмрдирд╛рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


рдЬрд┐рди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреЗ рд╕рдордп рд╕реЗ рдмрдиреЗ рд╣реБрдП рд╣реИрдВ


рдЫрд╡рд┐
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ Rx UART2 (PA3 pin) рдХреЗ рд╕рд╛рде рд╡реНрд╣рд╛рдЗрдЯ рд╡рд╛рдпрд░рд┐рдВрдЧ UART1 (PA9 рдкрд┐рди) рдХреЛ рдЬреЛрдбрд╝рд╛ред


рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ
const char * message = "AddressIntercept PinTool UART DMA example"; int main() { sizeMemoryTranslate_t s = 0; memoryTranslate *p = getMemoryMap(&s); pAddrPERIPH = p[0].start_addr; pAddrSRAM = p[1].start_addr; init(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef gpio; gpio.GPIO_Pin = GPIO_Pin_13; gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &gpio); const size_t _SIZE_MESSAGE = strlen(message); printf("sending message "); for (int i = 0; i < _SIZE_MESSAGE; i++) { /* Send one byte from USARTy to USARTz */ USART_SendData(USARTy, message[i]); GPIO_SetBits(GPIOC, GPIO_Pin_13); /* Loop until USARTy DR register is empty */ while (USART_GetFlagStatus(USARTy, USART_FLAG_TXE) == RESET); printf("."); fflush(stdout); GPIO_ResetBits(GPIOC, GPIO_Pin_13); } printf("\n"); printf("qty of sent bytes %d\n", strlen(message)); const uint16_t rec = DMA_GetCurrDataCounter(USARTz_Rx_DMA_Channel); printf("qty of received byte using DMA : %d\n", sizeDMAbuf - rec); printf("read message from buffer DMA : "); const uint8_t *pM = (uint8_t *)pAddrSRAM; for (int r = 0; r < _SIZE_MESSAGE; r++) { printf("%c", pM[r]); fflush(stdout); } printf("\n"); assert(strncmp(message, (const char *)pM, _SIZE_MESSAGE) == 0); printf("Received and sent bytes are equal!\n"); return 0; } 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкрддреЗ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдПрд╕рдЯреА рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдЪрдПрдПрд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдкреБрд░рд╛рдиреЗ рдкреБрд░рд╛рдиреЗ рдПрд╕рдкреАрдПрд▓ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВред


рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдФрд░ рдпрд╣ рд╕рдм рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП


рдпрд╣ Ubuntu 16.04 64-рдмрд┐рдЯ рд╡рд╛рд▓реЗ рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Pintool v3.7 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛


рдЕрдирдкреИрдХрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддреЛ рдЖрдк рдкрд┐рдирдЯреВрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рдкрд┐рди_рд░реЙрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рдореЗрдВ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ


 pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/ 

рдореИрдВ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдХрд░рддрд╛ рд╣реВрдВ


 cd pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/ git clone git@github.com:ser-mk/AddressIntercept.git cd AddressIntercept 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ 32-рдмрд┐рдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


 make TARGET=ia32 

рдмрд╛рдЗрдирд░реА рдпрд╣рд╛рдБ obj-ia32 / addrIntercept.so рд╣реЛрдЧрд╛ред 32-рдмрд┐рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдЖрд░рдПрдо ortex рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкрддреЗ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред


рдЕрдм рдЖрдк рд╕реНрд╡рдпрдВ рд╣реА рдЙрджрд╛рд╣рд░рдг рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рд╕реАрдзреЗ рдкрд┐рдВрдЯреЛрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ


 cd pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/AddressIntercept Git clone https://github.com/ser-mk/addrIntercept-example-UART-DMA Cd addrIntercept-example-UART-DMA Make 

рдФрд░ рд╣рдореЗрдВ рдЯреЗрд╕реНрдЯ.рдлреНрд▓реЛ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдмрд╛рдЗрдирд░реА рдорд┐рд▓рддреА рд╣реИред рдкреНрд░рдпреЛрдЧ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдлрд╛рдЗрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдкрд┐рдВрдЯреВрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдбреНрд░реЗрд╕рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦреВрдВрдЧрд╛


рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ OpenOCD рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FIFOs рдирд╛рдо рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛


 cd pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/AddressIntercept mkfifo in.fifo out.fifo 

in.fifo out.fifo - рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо, рдЖрдк рдЕрдиреНрдп рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЖрдЗрдП рдУрдкрдирдУрд╕реАрдбреА рдЧреНрд░рд╛рд╣рдХ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдЖрдИрдкреА рдУрдкрдирдУрд╕реАрдбреА рд╕рд░реНрд╡рд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ 192.168.0.111 рд╣реЛрдЧрд╛, рдкреЛрд░реНрдЯ рдорд╛рдирдХ 6666 рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред


рддреЛ, рдХреНрд░рдо рдореЗрдВ рдЪрд▓рд╛рдПрдВ


 cd pin-3.7-97619-g0d0c92f4f-gcc-linux/source/tools/AddressIntercept python3.5m OCDclient.py -ip 192.168.0.111 & ../../../pin -t obj-ia32/addrIntercept.so -- addrIntercept-example-UART-DMA/test.elf 

рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЫрд╡рд┐


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдореИрдХрдУрдПрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдпрд╣рд╛рдВ, рдЖрдкрдХреЛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдореЛрдбрд╝рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ "рд╡рд┐рдВрдбреЛрдЬрд╝" рдореЗрдВ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ)ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдЕрдЧрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЖрдк рдЗрдВрдЯреЗрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рд╕реАрдорд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЬреАрдЖрдИрдкреАрдПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрддреЗ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi434080/


All Articles