AutoSys Scheduler: Create & Manage Jobs using AutoSys Job Scheduler

autosys
AutoSys is used for defining, scheduling and monitoring jobs. These jobs can be a UNIX script, java program or any other program which can be invoked from shell. Before starting we assume that user has already setup an AutoSys environment. This environment consists of autosys server and autosys client.

AutoSys System components

1. Event server (AutoSys database)
2. Event processor
3. Remote agent

Event Server

The event server is a AutoSys database which stores all system information and events as well as all job, monitor, and report definitions. Sometimes this database is also called as a data server, which actually describes a server instance. That is, it is either a UNIX or Windows process, and it is associated data space (or raw disk storage), that can include multiple databases or tablespaces.

Event Processor

This is main component of the autosys system. This processes all the events it reads from dataserver. The event processor is the program, running either as a UNIX process or as a Windows service that actually runs AutoSys. It schedules and starts jobs. When you start the event processor it continually scans the database for events to be processed. When it finds one, it checks whether the event satisfies the starting conditions for any job in the database.
[ad#blogs_content_inbetween]

Remote Agent

On a UNIX machine, the remote agent is a temporary process started by the event processor to perform a specific task on a remote (client) machine. On a Windows machine, the remote agent is a Windows service running on a remote (client) machine that is directed by the event processor to perform specific tasks.
The remote agent starts the command specified for a given job, sends running and completion information about a task to the event server, then exits. If the remote agent is unable to transfer the information, it waits and tries again until it can successfully communicate with the database.

Basic functionality of AutoSys

Below is the diagram which explains the basic functionality, please check the explanation.
functional-diagram-autosys

Explanation

1. The event processor scans the event server for the next event to process. If no event is ready, the event processor scans again in five seconds.
2. The event processor reads from the event server that an event is ready. If the event is a STARTJOB event, the job definition and attributes are retrieved from the Event Server, including the command and the pointer (full path name on the client machine) to the profile file to be used for the job. In addition, for jobs running on Windows machines, the event processor retrieves from the database the user IDs and passwords required to run the job on the client machine.
3. The event processor processes the event. If the event is a STARTJOB, the event processor attempts to establish a connection with the remote agent on the client machine, and passes the job attributes to the client machine.
The event processor sends a CHANGE_STATUS event marking in the event server that the job is in STARTING state.
4. On a UNIX machine, the inetd invokes the remote agent. On a Windows machine, the remote agent logs onto the machine as the user defined as the job’s owner, using the user IDs and passwords passed to it from the event processor.
5. The remote agent sends an acknowledgment back to the event processor indicating that it has received the job parameters. The socket connection is terminated. At this point, the event processor resumes scanning the event server database, looking for events to process.
6. The remote agent starts a process and executes the command in the job definition.
7. The remote agent issues a CHANGE_STATUS event marking in the event server that the job is in RUNNING state.
8. The client job process runs to completion, then returns an exit code to the remote agent and quits.
[ad#blogs_content_inbetween]

Defining autosys job

There are various parameters to define autosys job. Starting from profile, timezone, start time, starting condition and so on. There are the two methods you can use to create job definitions:
1. Using the AutoSys Graphical User Interface (GUI).
2. Using the AutoSys Job Information Language (JIL) through a command-line interface.

In this tutorial we will use JIL language to create autosys jobs.

JIL stands for Job Information Language. Using this you can instruct autosys to save job definitions. This information saved in autosys database. You can also create a jil file which contains job definition. You can then pass this jil file to autosys.

Essential attributes for defining job
1. Job Name
JIL Keyword : insert_job. Name used to identify the job.
2. Job Type
a. JIL Keyword : job_type. The job type is one of job types: command (c), file watcher (f) or box (b).
3. Owner
a. JIL Keyword : owner

The job owner specifies whose user ID the command will be run under on the client machine. This attribute is automatically set to the user who invoked jil or the GUI to define the job, and cannot be changed except by the edit superuser.

Other job attributes:

1. command: The command attribute can be the name of any command, executable, UNIX shell script or batch file, and its arguments.
2. machine: This attribute specifies the client machine on which the command should be run.
3. date_condition: The start date/time dependencies attribute is a toggle, which specifies whether or not there are date, time, or both, conditions required for starting the job.
4. days_of_week: The days of the week attribute specifies the days on which the job should be run.

Sample jil file for command job echoJob.jil

To add this job in atosys db. Run following command from unix:

This command will add “echoJob” job to autosys databse.

Commands to control the job

Start job command

sendevent –E FORCE_STARTJOB -J <job_name>

sendevent -E STARTJOB -J <job_name>

To put jobs on OFF ICE or ON ICE

sendevent -E OFF_ICE -J <job_name>

sendevent -E ON_ICE -J <job_name>

sendevent -E KILLJOB –J "Job Name Here"

Meaning of AutoSys status

STATUS AUTOSTATUS Meaning
RU RUNNING Running
ST STARTING Starting
SU SUCCESS Success
FA FAILURE Failure
TE TERMINATED Terminated
OI ON_ICE On Ice
IN INACTIVE Inactive
AC ACTIVATED Activated
RE RESTART Restart
OH ON_HOLD On Hold
QW QUE_WAIT Queue Wait
RD Refresh Dependencies
RF Refresh Filewatcher

Reference

http://supportconnectw.ca.com/public/autosys/infodocs/autosys_cheatsheet.asp

Get our Articles via Email. Enter your email address.

You may also like...

100 Comments

  1. Vinod says:

    Hi,

    Can you suggest some AutoSys freeware? I would want to try it.

    Thanks
    Vinod

  2. Karthick says:

    Autosys is from CA , You will not get any freeware or evaluation edition of autosys. But you have do the autosys features in CRON by writing your own components like autosys.

  3. Geeya says:

    Hi Hanumanth,

    This is a good article. Much appreciated!!

    Could you please let me know if there’s any java api which can create & control autosys jobs?

    Thanks,
    Geeya

  4. Krishna says:

    Hi,
    This Site is nice.I am having a doubt..can you please clarify..Actually there is a box job A which is in Success state,and the customer asked to Forcestart the job..As it is been Forcestarted the first job A is in running state,job B is in SU state,job C,D,E are in Active state..can you please explain me why the 3 jobs are in Active state and again as customer ran the jobs manually and asked us to kill the job and mark it as Success…And we did it the 3 jobs C,D,E are in INACTIVE state…can you please clarify my doubt…

    And a suggestion is in your next edition if you can explain about Box Job Logic and the scenarios….It will be very useful to all the people like me……

    Thanks
    Krishna

  5. Hanumant Shikhare says:

    Hi Geeya,

    Sorry I was not able to respond you on time. To answer your qn, if you want to create and manage autosys job there are different ways in my post I have already given different ways. And those are very effective. As per my understanding there is no such java API to create these jobs, but yes you can easily create one API which will read job spec and create autosys job accordingly.

    Hi Krishna,
    When we create a job as a part of Autosys box then the job status heavily depends on box status. If you start a box that will make all of the jobs inside box active that means ready to run. These jobs will start as per their start condition.
    If we take the example that you have given, then job A is in running condition which is force started (assuming A is box name), job B is in status Success because it completed successfully, and remaining jobs C,D,E are in active state because those are part of the Box which is in running state.
    Now when you kill the box the active jobs becomes inactive because they are part of the Autosys box which was killed.

    And remember you cannot change the status of any job to ACTIVE. This is not permitted. Although you can set following status. RUNNING, STARTING, SUCCESS, FAILURE, INACTIVE, and TERMINATED.
    Imp: Changing the status to RUNNING doesn’t start the job.

    Hanumant.

  6. karthik says:

    We had problem with one of our autosys jobs, even though the conditions were met the job did not start. so we forcestarted . Could someone advise what the problem would be.

    Below is the event status:

    Job Name Last Start Last End ST Run Pri/Xit
    ________________________________________________________________ ____________________ ____________________ __ _______ ___

    au_cba_fc04_498_ds_11_pfca_file_flg_chk_f 09/09/2009 00:30:36 09/09/2009 01:57:57 SU 6324888/1

    Status/[Event] Time Ntry ES ProcessTime Machine
    ————– ——————— — — ——————— —————————————-
    STARTING 09/09/2009 00:30:27 1 PD 09/09/2009 00:30:36 syd0498
    RUNNING 09/09/2009 00:30:36 1 PD 09/09/2009 00:31:02 syd0498
    [JOB_ON_HOLD] 09/09/2009 01:47:41 0 PD 09/09/2009 01:47:54 syd0498
    [*** ALARM ***]
    JOBNOT_ONICEHOLD 09/09/2009 01:47:53 0 PD 09/09/2009 01:48:01 syd0498

    INACTIVE 09/09/2009 01:49:15 0 PD 09/09/2009 01:49:24
    SUCCESS 09/09/2009 01:57:57 1 PD 09/09/2009 01:58:05
    [JOB_ON_HOLD] 09/09/2009 05:13:19 0 PD 09/09/2009 05:13:35 syd0498
    INACTIVE 09/09/2009 05:14:44 0 PD 09/09/2009 05:14:53
    [JOB_ON_HOLD] 09/10/2009 05:40:31 0 PD 09/10/2009 05:40:39 syd0498
    INACTIVE 09/10/2009 05:42:06 0 PD 09/10/2009 05:42:17
    [FORCE_STARTJOB] 09/10/2009 05:53:00 0 PD 09/10/2009 05:53:08 syd0498

  7. rakesh says:

    Apart from starting conditions does it have any job dependencies . If yes then can you chk if the dependent jobs gone to success if no can you paste the jil over here.

  8. Jay says:

    Hi

    I have a question regarding mutually exclusive conditions. There are two sets of jobs (around 12 in each set) that need to be run in mutually exclusive mode. Can I define a box for each set and set the condition of not running at the box level?

    Would appreciate a response.

    thx
    Jay

  9. Siva says:

    Hi,
    I am trying to validate the jil file programmatically. I plan to use the SDK provided by Autosys. Is CA provide any SDK for this?

    Another thing : What is Jil syntax checker or Jil verifier or Jil validator? Where is it available in autosys?

    Regards,
    Siva

  10. ratul says:

    hi,
    I installed unicentre autosys job management tool.
    But i was enable to create a database while installation.
    I have sql server 2000 sp4 and autosys is 4.5.1 version can you please help me regarding this.

    Thank you

  11. Sundar says:

    How can you perform batch testing using autosys. Especially Batch testing for data validation using SQL on TOAD.

  12. srinath says:

    hi rahul where you get freeware autosys tool?

  13. dinesh says:

    Suggest me a complete autosys tutorial..

  14. Ashwani says:

    I need to put multiple jobs (same server/different server) on ice.please let me know the procedure to do so.

  15. Deepanshu says:

    good information about AutoSys Job Scheduler. Nice Work

  16. Sathiya says:

    Hi…I want to configure the dual event server in autosys and configure the event processor and install the remote agent. Please let me know how to define the priority for the job.

  17. murali says:

    This mateial is good for the beginners of the Auto Sys

  18. Sanjay says:

    Hi,
    can we change the status of running job to inactive ?

  19. Sathiya says:

    You can not change the running job to Inactive.

  20. Murthy says:

    Sanjay,

    If you want you to run an Inactive job. you can FORCES_START it.

  21. Sanjay says:

    Thanks Sathiya and Murthy.
    can we use sendevent command in command property?If yes please provide syntax for it.

  22. Sanjay says:

    how to use sendevent command in command properties?

  23. madhuri says:

    can anyone tell me whats the exit code 130 in autosys mean?

  24. Sathiya says:

    can any please tell…what for override_job: ?

  25. Sanjay says:

    can anyone explain advantages of using Autosys over maestro?

  26. Devang says:

    Hi,

    First of all, Thanks for such good article.

    I ahve one question: I have 2 jobs, job A and JOb B. Job B will start on success of JOb A. Now if I forece start the Job A then after completion of JOb A, Job B will be executed or not ?

    Thanks & Regards,
    Devang

  27. Abhishek Tripathi says:

    Nice Article.Give some more examples and trouble shooting on autosys.
    Thanx

  28. wakyakala says:

    Hi,

    Can anyone suggest me how to schedule an autosys job in windows?

    kala

  29. Sanjay says:

    @Devang
    After completion of Job A job B will get started.

  30. Ryan says:

    Hi All,
    I have installed the autosys client on windows 2008 server(server name = ARC). I created a local account (user = autosysuser) and gave the required permissions to login remotely. I can remotely login and execute my job. But when I run from autosys it fails with an error “No authentication performed”. In the JIL i have mentioned owner: [email protected] What are the permissions/policies do I need to set for this local account?

  31. Babu Vijay Prasad Kamineni says:

    Can any one tell me how to generate a .csv file from an autosys job? i.e. a job will execute some set of comands and the output should be in .csv file.

  32. ragesh says:

    Is there any method in autosys jil definition to run same job at different times on different days?

    • Akhil says:

      Yes , you could do that in two ways.
      1. using jil update_job :
      start_times: “01:00,04:00”
      days_of_week: “th,fr”
      2.Changing the job definition using GUI

  33. Mohd says:

    If an autosys backup job has failed/terminated ,what should we set the status of that job so it can run at its next schedule cycle? Can we restart a production job if it has failed/yerminated?Also in the JIL what des max run time, Min run time before alarm and terminate job if run time exceeds xyz hours means?

    Thanks
    Mohd

  34. Rose says:

    Is it possible to change the status of an autosys job based on a return status code obtained from the command that the autosys job executes.
    For e.x., an autosys job calls a batch script which executes a sql command. we get a status code of 0 or errno when sql command is executed and the batch script will complete successfully. So can we change the autosys job status to SU if status code returned is 0, and FA if errno.

  35. Halibaboo says:

    Superb.. wow, great

  36. Gary says:

    I currently have autosys submitting jobs to a peoplesoft server residing on one machine. I have now added a second peoplesoft server residing on a different machine. Is there a way to have autosys submit a job to either machine based on the fact that one or the other is down. Basically a failover situation, I can get this to work in peoplesoft manually, but autosys only submits to the first machine and stays queued on peoplesoft side if it’s down. I did notice in the command parms that only the first machine name is entered. Is there a way to put both machine names in so that it checks both servers to see if they are available and sends work to the one that is.

  37. asish says:

    need autosys material and pdf ..

  38. vinoth says:

    how to get the status of the job in JIL file and how to call the FORCE START JOB if the status of another job is SUCCESS.

  39. Udaya Sankar says:

    Good Article for beginners….

  40. Suresh Nelakurthi says:

    Dear author,

    This article is really helpful.

  41. Bose says:

    This site was helpful, Thanks so much…
    Could you please upload any video tutorial when you have some time, this will be much more useful.

    Regards,
    Bose

  42. mathew says:

    Nice article.
    We have an autosys batch job runing on our Windows 2008 Production servers. We would like to move the job to run from a new servers..what all things we need to do for making it to happend.

    Please reply as soon as possible since we are struggling with this.

  43. Josie says:

    In R11.3, how do I open a command prompt? I am used to command line in xterm.

  44. asish says:

    very nice artile.. for basic command …….

  45. guru says:

    what is meaning of refresh dependencies

  46. Donald Rhodes says:

    Can a Autosys File Watcher watch for a file on a server other then the autosys client server ?

  47. Pallavi says:

    Can I put more than one jobs ON ICE via sendevent?
    I mean in a single command can I put more than one jobs ON ICE??
    Also, does ‘sendevent’ work in a UNIX shell script ?

  48. kitty says:

    Please tell me in steps how to schedule a job

  49. Bikash says:

    Hi All,

    I have a doubt on autosys JIL scheduling. The requirement as below. Have 2 jobs,one is running in US time zone and another in Singapore time zone and both are running in different instance .
    Requirement is on Success of Singapore job , the US job will trigger.Though i am aware i have to put condition like on US jJIL as condition:S(Singapore job) but it won’t solve the requirement as both are running in different instance, please do let me know what additional parameter is needed to solve the requirement.

    Thanks in advance.

  50. Amith says:

    Can I have two events handled by a single SENDEVENT command? Or is it possible to set 2 global variables in a single SENDEVENT command?If not is it possible to have 2 SENDEVENT command on a job ? Please help.
    Thanks in advance

  51. Tinshuk Singh says:

    Is it possible to define time for a job which is inside the box for which time has already defined ? for eg.
    suppose there is a box Box1 which has run time defined as 10:00 and contains two jobs job1 and job2, consider if time for job2 has defined as 12:00.
    can we do like this ?
    if yes then what will be expected behavior?

    • Laxman says:

      We could, but such case we create one more Box with job2 runs at 12:00 clock instead of keeping same box

    • neha says:

      Hi Tinshuk Singh ,

      The Box 1 will kick OFF at 10:00 & the jobs inside the box will wait until its conditions are meet , the job2 will kick off at 12:00

  52. Naresh says:

    Can we able to hold all the job in autosys in the same time.. if yes can u explain how..

    • Laxman says:

      We can HOLD or OFF hold all jobs same time, To hold it you need to create one sendevent job and test file which conatain all jobs with sendevent command.

  53. ABCD says:

    hi guys

  54. Urvashi says:

    Has anyone worked on job dependencies across instances? The one in which we use the caps char “^” to define a condition if a job has dependency on another job in a different instance? Need some help on it.

    Job A on Instance X
    Job B on instance Y
    Condition on job A: s(B^Y)
    Need some info on this

  55. Shubh says:

    Hi Urvashi,

    Job A on Instance X
    Job B on instance Y
    Condition on job A: s(B^Y)

    The above condition is absolutely correct. Please let me know what query do you have..

    Thanks

  56. sushanth says:

    Can we have a condition like ‘not running’ in autosys job
    I have a requirement –> in one of the job the condition should be if previous job doesn’t run at 7pm, then run the present job.

  57. K.Vasanth says:

    Hi,

    Can some one say how to extract active Jobs email id? I know it can be sone through extracting JIL and from there. Is there anyway it can be done directly?

  58. newbie says:

    Hi

    I get the following error:
    CHASE 09/29/2013 04:13:07 0 PD 09/29/2013 04:13:15

    I have checked the remote agent process and its up and running, I also issued a autosttaus command to see whats the status of the job in the eventsystem,

    can some one please explain why this error occurs and how to fix it.
    I’d appreciate a detail explaination.

    thanks

  59. newbie says:

    Hi

    I get the following error:
    CHASE 09/29/2013 04:13:07 0 PD 09/29/2013 04:13:15

    I have checked the remote agent process and its up and running, I also issued an autostatus command to see whats the status of the job in the eventsystem,

    can some one please explain why this error occurs and how to fix it.
    I’d appreciate a detail explaination.
    Also,would like to know how to start a remote agent. I mean,do we need to have a process running on the remote machine where the actual shell script is executed ?

    thanks

  60. Sowmya says:

    Can we put all the jobs in a box ONICE by just giving the Box name?

  61. Raj Patel says:

    Viral,

    What are best practice server component requirements (CPU, RAM, disk space, etc) we would need to build to efficiently run 5000 simultaneous jobs?

    Raj

  62. Confused_user says:

    If it possible to set a starting condition below

    RU(JobA) & S(JobB)

    SO basically i want a job to trigger if and only if job A is still in Running and job B is in success

  63. Sneha says:

    Hi,

    I have defined box B1 which has two jobs J1 and J2. If I force start the box B1, the job J1 didn’t run. Both the job status just changed to Activated. But if I force the jobs individual, the job runs successfully. Can anyone please tell me is this because of any configure issue in JIL and which attribute must be included.

    • SamsHaja says:

      Hi Sneha,

      you shouldn’t put any starting time condition like “start_times:” for job “J1” inside the box “B1”

      ex:
      JIL for box:

      job_name: B1
      job_type: b
      date_condision: 1
      days_of_week: all
      start_times: “10:00”
      timezone: India

      JIL for job J1

      job_name: J1
      job_type: c
      box_name: B1
      command: sleep 100
      permission: wx, mx
      owner: haja
      machine: localhost
      timezone: India

      JIL for job J2

      job_name: J2
      job_type: c
      box_name: B1
      command: sleep 100
      permission: wx, mx
      conditiond: s(J1)
      owner: haja
      machine: localhost
      timezone: India

      • Sneha says:

        Thanks, that helped :)

  64. Arun says:

    Hi,

    We don’t have access to autosys server and we have only GUI access.
    i wanted to know how to create JIL file in autosys server

  65. Pradhan says:

    Need to know if there are classes held for autosys as me and my team would like to learn about autosys, job scheduling and agent installation. So let me know more about it

  66. VIPIN KUmAR says:

    Do we have any simulator for autosys, so that we can practise at home…
    it will be very helpful for me to create jil and do r n d on that…

    Thanks in advanced…

  67. Srinivas Jami says:

    Hi Viral,
    I have a requirement to migrate Windows & Unix jobs to Autosys. May I know the process and steps to implement this migration?

  68. Kumar says:

    We are running a web URL using the autosys jobs. Now we are getting always the success state even though we got errors in the application.

    How can we assign the return code from web application to the autosys job exit code ?

    Am a newbie and didn’t done through the documentation much..

    Any inputs highly appreciated..

  69. Sneha says:

    Hi,

    Is there a way to add a new calendar date using JIL?

  70. Vasu says:

    Hi,

    Is it possible to assign or submit multiple jobs to the multiple instances of remote agent running on client server?

    Rgds,
    Vasu.

  71. Shivam says:

    Is there any command to check any jobs scheduled date/time?

    • venshh says:

      autorep -j -d

  72. sowmya says:

    Can I use a sendevent command to change a RUNNING filewatcher job to INACTIVE. Will it have an issues at the backgroud?

    • venshh says:

      you can put as inactive but job will be running in back ground

  73. diana tavolario says:

    If a job is in a RUNNING status, if it is put ON ICE, will the job complete then go into the on-ice status? Also, if the job is a .bat file and runs on another machine… so autosys shows status of SUCCESS, but the job is still running on another server, if put on ice at that point, will job in background continue running?

  74. Venu says:

    Hello All,
    I am a new bee in DEVOPS. I have limited knowldge about autosys. I am looking at automating the job to put on ON ICE, ON OFF state from an external tool which is runnng on unix m/c. I came to know there is a JIL language to do this. can any one help me how to script this and test ? It would be great if there is any sample code for this.

    Thanks in advance.

  75. Jaya says:

    Hi, I am a beginner and keen to learn Autosys, Could you pls guide me where should I practice Autosys commands? Is there a unix or windows server for practice?

  76. Vechoorian says:

    Hi,

    can any one help me to launch autosys GUI from unix server

  77. Toroop says:

    Where to download autosys software from .

  78. Peter says:

    How can I move a box from test autosys into production autosys using JIL?

    • jagadeesh says:

      change the machine name , instead of autosys(test) to Prod Autosys.then insert the jil into prod server.

  79. Hi
    Could you please list out the GUI availble to connect to autosys . as I am using Humming bird excced tool till now. But from 1 month i am unable to connect to Hummin bird excced . Please help me

  80. aaditya says:

    Is Autosys having any Java API ? If yes then can you please point me to it ?

    Thanks

  81. amit says:

    is it possible to make a script through which ticket gets auto resolved once the job is marked to success?? if yes, please help

  82. preity says:

    Will a job which is not part of any box job go to Activated state if the starting conditions are not met? Suppose a job A has start time: 4:00, and also dependency on success of Job B. At 4:00, Job B is still running, will the Job A go to activated state or it will remain in SU status(of previous day’s run).

    • venshh says:

      it will be active state only and waiting for job b to get complete

  83. Kiran says:

    Hi,

    We have some scheduled Job’s in AutoSys. As and when the command got executed it is returning sucess even though the script returned some errors. Is there any way in AutoSys to put the return code based on the execution of the script…Please help me..

  84. Pritam Dey says:

    How to practice Autosys in Home Environment..??

  85. mayur says:

    I need to create a command job which will run on weekend only if weekend appears on monthend

  86. Dao Shi says:

    Can one set a limit on how many concurrent jobs within a box be run? I have more than 100 jobs within a box, they don’t have dependency among each other. The problem is that our system cannot handle too many concurrent jobs at once, so I need to put a limit of the number of the jobs run within the box.

    Cannot find any information for this from the manual.

  87. gajendra says:

    Could you please assist me to debug the issue, shell script has the nohup java classname &.
    If it is executed manually it create java process but it is executed from autosys it does not create java process.
    echo path and class path in both ways but it is same. Please what are all other possible ways.

  88. venkat says:

    we installed autosys on a windows machine. i am able to generate the job statistics report from the autosys console. but i need it from the command line. i tried autorep command, but it is giving the report for a particular job or for a particular pattern of the job. i need the report for all the jobs.

  89. Mansi says:

    I have a question – Suppose A job is showing success in logs but Autosys Status is Still RU instead of SU , what can be the issue ?

  90. rishab singh says:

    does the below effect the autosys jobs:

    insert_job: b

    changed to ->

    insert_job: BOX

    Both staement syas that is is box joob but previously it was b now NOW so will it make any difference

Leave a Reply

Your email address will not be published. Required fields are marked *