рдЬреАрд░рд╛ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрд╕рдЖрдИрдПрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдмрдирд╛рдирд╛

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрд╕рдЖрдИрдПрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдПрд╕рдЖрдИрдПрд▓ рдХреЗ рдореБрдЦреНрдп рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдЖрдИрдПрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЛрдб рдЬреАрд░рд╛ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд╛рдЗрд▓реЗрдВрдЯ-рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рдЖрд░реНрдХрдПрдкреНрдЯ рд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдВ


рдкреНрд░рддрд┐рд░реВрдк рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ:

git clone https://alex1mmm@bitbucket.org/alex1mmm/sil-extension-archetype.git --branch v1 --single-branch

рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЖрд░реНрдХрдЯрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЖрд░реНрдХрд╣рд╛рдЗрдк рд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдПрд╕рдЖрдИрдПрд▓ рд╕реЗрд╡рд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ


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

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдПрд╕рдЖрдИрдПрд▓ рдХреМрди рд╕реА рд╕реЗрд╡рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ?

рд╣рдо рдПрд╕рдЖрдИрдПрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрди рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ:

рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ : 2990 / рдЬреАрд░рд╛ / рдкреНрд▓рдЧрдЗрдиреНрд╕ / рд╕рд░реНрд╡рд▓реЗрдЯ / рдЕрдкрдо / рдУрд╕реНрдЧреА

рдЖрдк рдЬреАрд░рд╛ рдореЗрдВ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдУрдПрд╕рдЬреАрдЖрдИ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреЗрдВрдЧреЗ:



рд╣рдо



рдХреЗрдЯреАрдПрд▓ рдХреЙрдордиреНрд╕ рд╕реВрдЪреА рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдкрдВрдЬреАрдХреГрдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ : рдЬреЗрдПрдордпреВрдЬрд╝рд░рд╕рд░реНрд╡рд┐рд╕реЗрдЬ, рдЬреЗрдордкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрд╡рд╛рдПрдБ рд╡реЗ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИрдВ рд╕рд┐рд▓ред

рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рдЖрдИрдПрд▓ рд╕реЗрд╡рд╛рдПрдВ рдХреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рдирд╛рдо рд╕реЗ рд╣рдо рдЗрд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рдмрдирд╛рдпреЗ рдЧрдП рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ


рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕реЗрд╡рд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

BeanService.java


@Named
public class BeanService {
    @Getter
    private final KIssueService kIssueService;
    @Getter
    private final ClassLoaderService classLoaderService;
    @Getter
    private final CurrentUserHelper currentUserHelper;
    @Getter
    private final JMIssueSearchServices jmIssueSearchServices;
    @Getter
    private final UserHelper userHelper;
    @Getter
    private final JMIssueServices jmIssueServices;
    @Inject
    public BeanService(@ComponentImport KIssueService kIssueService,
                       @ComponentImport CurrentUserHelper currentUserHelper,
                       @ComponentImport JMIssueSearchServices     jmIssueSearchServices,
                       @ComponentImport UserHelper userHelper,
                       @ComponentImport JMIssueServices jmIssueServices,
                       ClassLoaderService classLoaderService) {
        this.kIssueService = kIssueService;
        this.classLoaderService = classLoaderService;
        this.currentUserHelper = currentUserHelper;
        this.jmIssueSearchServices = jmIssueSearchServices;
        this.userHelper = userHelper;
        this.jmIssueServices = jmIssueServices;
    }
}

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

рдЖрдЗрдП рдЗрди рд░реЗрдЦрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВ:

@Getter
 private final KIssueService kIssueService;

рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗрд╡рд╛рд▓рд╛рдпрд╣ рдПрдХ рд▓рдВрдмреЛрдХ рдПрдиреЛрдЯреЗрд╢рди kIssueService рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдмрдирд╛рддрд╛ рд╣реИред

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

    public BeanService(@ComponentImport KIssueService kIssueService,
                       @ComponentImport CurrentUserHelper currentUserHelper,
                       @ComponentImport JMIssueSearchServices jmIssueSearchServices,
                       @ComponentImport UserHelper userHelper,
                       @ComponentImport JMIssueServices jmIssueServices,
                       ClassLoaderService classLoaderService) {
        this.kIssueService = kIssueService;
        this.classLoaderService = classLoaderService;
        this.currentUserHelper = currentUserHelper;
        this.jmIssueSearchServices = jmIssueSearchServices;
        this.userHelper = userHelper;
        this.jmIssueServices = jmIssueServices;
    }

рдХрд┐рдпрд╛ рд╣реБрдЖред

ESLauncher рд╡рд░реНрдЧ рдореЗрдВ рдмреАрдирд╕реЗрд╡рд╛ рдмреАрди рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдмреАрди рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ:

/*   BeanService */
private final BeanService beanService;

@Inject
public ESLauncher(@ComponentImport EventPublisher eventPublisher,
                  PluginInfoService pluginInfoService,
                  @ComponentImport CommonPluginConfigurationService commonPluginConfigurationService,
                  @ComponentImport HostConfigurationProvider hostConfigurationProvider,
                  @ClasspathComponent PluginConfigurationServiceImpl pluginConfigurationService,
/*  BeanService */
                  BeanService beanService)
{
    super(eventPublisher, pluginInfoService, hostConfigurationProvider, pluginConfigurationService);

    log.error("eslauncher constructor");
    this.beanService = beanService;

}

@Override
public void doAtLaunch() {
    super.doAtLaunch();
    log.error("eslauncher doatlaunch");
    RoutineRegistry.register(new SayHello( beanService,"SayHello"));
    RoutineRegistry.register(new SayHello2( beanService,"SayHello2"));
    RoutineRegistry.register(new SayHello3( beanService,"SayHello3"));

}

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмреАрди рд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

SayHello.java


SayHello.java рдореЗрдВ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдИрдореЗрд▓ рдкрддреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рд╕рднреА рдЯрд┐рдХрдЯреЛрдВ рдХреЛ рд╣рдЯрд╛рдП рдЧрдП рдкреНрд░реЗрд╖рд┐рдд рдИрдореЗрд▓ рдкрддреЗ рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджреЗрдВред

рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрд╕рдЖрдИрдПрд▓ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

function deleteIssueForUser(string userEmail) {
  if (isUserInGroup("jira-administrators", currentUserKey())) {
    string[] issues = selectIssues("reporter = " + currentUserKey());
    for (string issue in issues) {
      deleteIssue(issue);
    }
  }
}

deleteIssueForUser("user@email.com");

рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рдХрд╛рдо рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдБ рдХрдХреНрд╖рд╛ рдкрд╛рда рд╣реИ:

@Slf4j
public class SayHello extends AbstractSILRoutine<MutableString> {
    private static final SILType[][] types = {{ TypeInst.STRING }};
    private final BeanService beanService;

    public SayHello(BeanService beanService, String name) {
        super(beanService.getClassLoaderService().getPluginClassLoader(), name, types);
        this.beanService = beanService;
    }

    @Override
    public SILType<MutableString> getReturnType() {
        return TypeInst.STRING;
    }


    @Override
    protected SILValue<MutableString>  runRoutine(SILContext silContext, List<SILValue<?>> list)  {
        SILValue param = list.get(0);
        String userEmail = param.toStringValue();
        KIssueService kIssueService = beanService.getKIssueService();
        CurrentUserHelper currentUserHelper = beanService.getCurrentUserHelper();
        JMIssueSearchServices jmIssueSearchServices = beanService.getJmIssueSearchServices();
        UserHelper userHelper = beanService.getUserHelper();
        JMIssueServices jmIssueServices = beanService.getJmIssueServices();
        ApplicationUser requestedUser = userHelper.getUserByEmail(userEmail);

        if (currentUserHelper.isUserAdministrator()) {
            SearchService.ParseResult parseResult = jmIssueSearchServices.getSearchService().parseQuery(requestedUser, "reporter = " + requestedUser.getKey());
            List<Issue> issues = (List<Issue>) kIssueService.searchIssues(requestedUser, parseResult.getQuery());
            issues.stream().forEach(issue -> kIssueService.deindexIssue(jmIssueServices.getIssueManager().getIssueByCurrentKey(issue.getKey())));
        }
        return SILValueFactory.string( "issues deleted");

    }

    @Override
    public String getParams() {
        return "(userEmail)";
    }
}

рд╣рдо рд░рдирдЖрдЙрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

    @Override
    protected SILValue<MutableString>  runRoutine(SILContext silContext, List<SILValue<?>> list)  {

/*     */

        SILValue param = list.get(0);
        String userEmail = param.toStringValue();

/*       SIL */

        KIssueService kIssueService = beanService.getKIssueService();
        CurrentUserHelper currentUserHelper = beanService.getCurrentUserHelper();
        JMIssueSearchServices jmIssueSearchServices = beanService.getJmIssueSearchServices();
        UserHelper userHelper = beanService.getUserHelper();
        JMIssueServices jmIssueServices = beanService.getJmIssueServices();

/*  SIL UserHelper,   ApplicationUser    */

        ApplicationUser requestedUser = userHelper.getUserByEmail(userEmail);

/*  SIL CurrentUserHelper,  ,     Jira */

        if (currentUserHelper.isUserAdministrator()) {

/*   SIL      JQL  */

            SearchService.ParseResult parseResult = jmIssueSearchServices.getSearchService().parseQuery(requestedUser, "reporter = " + requestedUser.getKey());
            List<Issue> issues = (List<Issue>) kIssueService.searchIssues(requestedUser, parseResult.getQuery());

/*    */

            issues.stream().forEach(issue -> kIssueService.deindexIssue(jmIssueServices.getIssueManager().getIssueByCurrentKey(issue.getKey())));
        }
        return SILValueFactory.string( "issues deleted");

    }

рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреАред

KIssueFieldsService рд╕реЗрд╡рд╛


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

рдпрджрд┐ рд╣рдордиреЗ рдПрд╕рдЖрдИрдПрд▓ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди KIssueFieldsService рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░, рд╣рдо рдПрдХ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ:

CustomField customField= this.kIssueFieldsService.getCustomField(customFieldName);

рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬреАрд░рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрд╕рдЖрдИрдПрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

All Articles