рдПрдУрдкреА рдмрдирд╛рдо рд╕реБрд╡рд┐рдзрд╛рдПрдБ

рдкрд╣рд▓реВ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдПрдУрдкреА) рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдПрдУрдкреА рд╡реИрд╢реНрд╡рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдкрдХрд░рдг рд╣реИ, рдЬреИрд╕реЗ: рд▓реЙрдЧрд┐рдВрдЧ, рдЬреЛ рд╕реАрдзреЗ, рдХреЛрдб рдХреЗ рддрд░реНрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдУрдкреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЦреЛрдЬ рддрдм рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдЗрд╕реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдЬреИрд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдбреЗрд╡рд▓рдкрд░ рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВред AOP рдЪреМрдЦрдЯреЗ рдЖрдорддреМрд░ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ:

@RequireRole(Role.Admin) // clearly visible aspect fun updateUserPermissions(тАж) { // logic here } 

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

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ : рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реАрдХреЗ рдпрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ / рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдЦ рдореЗрдВ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдмрд╕:

1. рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рд╣рд╛рдпрд░-рдСрд░реНрдбрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ

2. рд▓реЗрдЦ рд╢рдмреНрдж рдкрд╣рд▓реВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдВрдЧреНрд░реЗрдЬреАрд╡рд╛рдж рдФрд░ AOP рдкрд╣рд▓реВ рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ


 fun updateUserPermissions(тАж) { requireRole(Role.Admin) // throws SecurityException // logic here } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдЬрд╛рдВрдЪреЛрдВ рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рд▓рд╛рдн рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдпрд╣ рддрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИ, рдЬреИрд╕реЗ рд▓реЗрдирджреЗрдиред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдмреЛрдЭрд┐рд▓ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬреЛ рдЬрд╛рд╡рд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдПрдУрдкреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдХреГрддреНрд░рд┐рдо рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдмрдирд╛рддрд╛ рд╣реИред

рдХреЛрдкрд▓рд┐рди рдореЗрдВ, AOP рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрд╛рд╡рд╛ рдХреА рддрд░рд╣ рд▓реЗрди-рджреЗрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрдЬрд╛рдп:

 @Transactional fun updateUserPermissions(тАж) { // logic here } 

рдпрд╣ рдкрдардиреАрдп рднреА рд╣реИ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдкрд░ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИред

 fun updateUserPermissions(тАж) = transactional { // logic here } 

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдПрдУрдкреА рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдФрд░ рдЗрдВрдбреЗрдВрдЯ рдХреЗ рд╕рдВрдЪрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрдИ рдкрд╣рд▓реВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ:

 fun updateUserPermissions(тАж) = logged { transactional { // logic here } } 

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрдИ рдкрд╣рд▓реБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡реАрдХрд╛рд░реНрдп рдХреЛрдб рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:

 fun updateUserPermissions(тАж) = loggedTransactional { // logic here } 

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

 fun updateUserPermissions(params: Params) = logged("updateUserPermissions($params)") { // logic here } 

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

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдУрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╢рд╛рдЬрдирдХ рд╡реЗрдХреНрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛-рдЖрдзрд╛рд░рд┐рдд рдПрдУрдкреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрдорддреМрд░ рдкрд░ рдЬреЗрд╡реАрдПрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЬрд╛рджреВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдЯрд▓рд┐рди рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдиреЛрдЯ :
1. рдордзреНрдпрдо (рд╕рдВрд▓рдЧреНрди) рдкрд░ рдЕрдиреБрдЪреНрдЫреЗрдж ред
2. рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд░реЛрдорди рдПрд▓рд┐рд╕реИрд░реЛрд╡ (рдЯреАрдо рд▓реАрдб рдЬреЗрдЯрдмреНрд░реЗрдиреНрд╕, рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЯрд╛рдЗрди рдФрд░ рд▓рд┐рдмрд╛рд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕реНрдкреЛрд░реНрдЯреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ / рдЖрдИрд╕реАрдкреАрд╕реА, рдХрдВрд╕реАрдбрд░ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЧрдгрд┐рдд / рдорд╛рддреНрд░рд╛рддреНрдордХ рд╡рд┐рддреНрдд; рдкреВрд░реНрд╡ рдореЗрдВ рдбреЗрд╡реЗрдХреНрд╕рдкрд░реНрдЯреНрд╕)ред рд╣рдмрд░ рдПрд▓рд┐рдЬрд╝рд╛рд░реЛрд╡ рдкрд░

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


All Articles