|
POST
|
OK, so then it sounds like it shouldn't be a permissions issue at the DB side and the account you are using is able to execute the admin commands that are necessary. So for permissions that's really all there is other than having the local permissions to be able to execute the .py from whatever system it is run off of (local or server). Now I am wondering if you possibly missed 1 of the most common pieces of using a direct Python call into Windows Task Scheduler. Where you have added this into Windows Task Scheduler can you send me a screen shot of what the "Edit Action" Window has in it? Launch Task -> Actions tab -> Edit button -> Edit Action Window Should have a drop down that lists the Action to be performed, a box for the Program/Script that you can Browse to, a box to Add Arguments and a box to set the Start in.
... View more
02-28-2017
05:52 AM
|
0
|
7
|
9617
|
|
POST
|
Got ya, ok so now that we are narrowing this down let's try to eliminate/confirm a few more things. If you have removed the SMTP calls then this script is literally just connecting "A user" to the SDE "as admin" and performing some administrative functions. So what database are you using for your SDE (Oracle, SQL, Postgre)? Is your account (sounds like you use AD?) an admin within the database? Hoping we can avoid the dive into ESRI database security model that is outdated but depending on how you have things configured we can still get this resolved just will come down to if it's done using your account or service account.
... View more
02-28-2017
05:31 AM
|
0
|
9
|
9617
|
|
POST
|
We use this you will just have to create the local FGDB with a FC and table then follow #7 for modifying the script to fit your use 1) Create local file geodatabase to hold data and attachments you want to download from ArcGIS Online (called data.gdb in script) 2) Create feature class (called myLayer in script), enable attachments, add globalID's 3) Add the following field to the feature class -GlobalID_str, text, length: 50 4) Create table called MatchTable (called MatchTable in script). 5) Add the following fields to the MatchTable table: - GlobalID_Str, text, length: 50 - PhotoPath, text length: 255 6) Enable "sync" on hosted feature service (http://resources.arcgis.com/en/help/arcgisonline/index.html#//010q000000n0000000) 7) Open AGOL_pullFeatures script in text editor and modify the following: -ArcGIS Online username/password -REST url to feature service to pull from -path to and name of local file geodatabase -fields to pull from the hosted feature service (must match local feature class) -name of local feature class (this will hold the data from the hosted service and the attachments) import os, urllib, urllib2, datetime, arcpy, json
## ============================================================================== ##
## function to update a field - basically converts longs to dates for date fields ##
## since json has dates as a long (milliseconds since unix epoch) and geodb wants ##
## a proper date, not a long.
## ============================================================================== ##
def updateValue(row,field_to_update,value):
outputfield=next((f for f in fields if f.name ==field_to_update),None) #find the output field
if outputfield == None or value == None: #exit if no field found or empty (null) value passed in
return
if outputfield.type == 'Date':
if value > 0 : # filter "zero" dates
value = datetime.datetime.fromtimestamp(value/1000) # convert to date - this is local time, to use utc time
row.setValue(field_to_update,value) # change "fromtimestamp" to "utcfromtimestamp"
else:
row.setValue(field_to_update,value)
return
## ============================================================================== ##
### Generate Token ###
gtUrl = 'https://www.arcgis.com/sharing/rest/generateToken'
gtValues = {'username' : '<YOUR_USERNAME>',
'password' : '<YOUR_PASSWORD>',
'referer' : 'http://www.arcgis.com',
'f' : 'json' }
gtData = urllib.urlencode(gtValues)
gtRequest = urllib2.Request(gtUrl, gtData)
gtResponse = urllib2.urlopen(gtRequest)
gtJson = json.load(gtResponse)
token = gtJson['token']
### Create Replica ###
### Update service url HERE ###
crUrl = 'http://services1.arcgis.com/1AlElnGrgBM62OSj/arcgis/rest/services/<YOUR_FC>/FeatureServer/CreateReplica'
crValues = {'f' : 'json',
'layers' : '0',
'returnAttachments' : 'true',
'token' : token }
crData = urllib.urlencode(crValues)
crRequest = urllib2.Request(crUrl, crData)
crResponse = urllib2.urlopen(crRequest)
crJson = json.load(crResponse)
replicaUrl = crJson['URL']
urllib.urlretrieve(replicaUrl, 'myLayer.json')
### Get Attachment ###
cwd = os.getcwd()
with open('myLayer.json') as data_file:
data = json.load(data_file)
for x in data['layers'][0]['attachments']:
gaUrl = x['url']
gaFolder = cwd + '\\photos\\' + x['parentGlobalId']
if not os.path.exists(gaFolder):
os.makedirs(gaFolder)
gaName = x['name']
gaValues = {'token' : token }
gaData = urllib.urlencode(gaValues)
urllib.urlretrieve(url=gaUrl + '/' + gaName, filename=os.path.join(gaFolder, gaName),data=gaData)
### Create Features ###
rows = arcpy.InsertCursor(cwd + '/data.gdb/myLayer')
fields = arcpy.ListFields(cwd + '/data.gdb/myLayer')
for cfX in data['layers'][0]['features']:
pnt = arcpy.Point()
pnt.X = cfX['geometry']['x']
pnt.Y = cfX['geometry']['y']
row = rows.newRow()
row.shape = pnt
### Set Attribute columns HERE ###
## makes use of the "updatevalue function to deal with dates ##
updateValue(row,'OBJECTID', cfX['attributes']['OBJECTID'])
updateValue(row,'Route_Code', cfX['attributes']['Route_Code'])
updateValue(row,'Primary_Route', cfX['attributes']['Primary_Route'])
updateValue(row,'Street_Name', cfX['attributes']['Street_Name'])
updateValue(row,'Structure_Type', cfX['attributes']['Structure_Type'])
updateValue(row,'Pole_Designation_Number', cfX['attributes']['Pole_Designation_Number'])
updateValue(row,'Visible_Cracks', cfX['attributes']['Visible_Cracks'])
updateValue(row,'Number_Of_Cracks', cfX['attributes']['Number_Of_Cracks'])
updateValue(row,'Longest_Crack_Length', cfX['attributes']['Longest_Crack_Length'])
updateValue(row,'Pole_Multi_Sided', cfX['attributes']['Pole_Multi_Sided'])
updateValue(row,'Number_Of_Sides', cfX['attributes']['Number_Of_Sides'])
updateValue(row,'Number_Of_Anchor_Bolts', cfX['attributes']['Number_Of_Anchor_Bolts'])
updateValue(row,'Anchor_Bolt_Cracked', cfX['attributes']['Anchor_Bolt_Cracked'])
updateValue(row,'Nuts_Loose', cfX['attributes']['Nuts_Loose'])
updateValue(row,'Lock_Washers_OK', cfX['attributes']['Lock_Washers_OKs'])
updateValue(row,'FollowUp_Status', cfX['attributes']['FollowUp_Status'])
updateValue(row,'FollowUp_Comments ', cfX['attributes']['FollowUp_Comments '])
updateValue(row,'FollowUp_Complete', cfX['attributes']['FollowUp_Complete'])
updateValue(row,'District', cfX['attributes']['District'])
updateValue(row,'County', cfX['attributes']['County'])
updateValue(row,'Latitude', cfX['attributes']['Latitude'])
updateValue(row,'Longitude', cfX['attributes']['Longitude'])
updateValue(row,'NLFID', cfX['attributes']['NLFID'])
updateValue(row,'GlobalID', cfX['attributes']['GlobalID'])
updateValue(row,'NLFID', cfX['attributes']['NLFID'])
# leave GlobalID out - you cannot edit this field in the destination geodb
#comment out below fields if you don't have them in your online or destination geodb (editor tracking)
updateValue(row,'CreationDate', cfX['attributes']['CreationDate'])
updateValue(row,'Creator', cfX['attributes']['Creator'])
updateValue(row,'EditDate', cfX['attributes']['EditDate'])
updateValue(row,'Editor', cfX['attributes']['Editor'])
updateValue(row,'GlobalID_str', cfX['attributes']['GlobalID'])
rows.insertRow(row)
del row
del rows
### Add Attachments ###
### Create Match Table ###
rows = arcpy.InsertCursor(cwd + '/data.gdb/MatchTable')
for cmtX in data['layers'][0]['attachments']:
row = rows.newRow()
row.setValue('GlobalID_Str', cmtX['parentGlobalId'])
row.setValue('PhotoPath', cwd + '\\photos\\' + cmtX['parentGlobalId'] + '\\' + cmtX['name'])
rows.insertRow(row)
del row
del rows
### Add Attachments ###
arcpy.AddAttachments_management(cwd + '/data.gdb/myLayer', 'GlobalID_Str', cwd + '/data.gdb/MatchTable', 'GlobalID_Str', 'PhotoPath')
... View more
02-28-2017
04:59 AM
|
0
|
0
|
2132
|
|
POST
|
This is accessed via MyESRI but you must have the extra Training tab available correct? Which by default only the Organizations primary point of contact has and that person must assign other Organizational admins to have the Training permissions within MyESRI as I recall.
... View more
02-27-2017
09:47 AM
|
0
|
1
|
2314
|
|
POST
|
When you say it works when you run it manually are you meaning it works when you run it manually from Windows Task Scheduler? Or it works when you run it manually as a standalone Python tool? So you have the python script established to run in Windows Task Scheduler and the Security Options shows to run using your Windows login? If that is the case then it would seem the issue is 1 of two things: 1) Check the account used to author the Task and confirm if it's in the Admin group https://technet.microsoft.com/en-us/library/cc722152(v=ws.11).aspx 2) Assuming all things are correct and meet the outlines of that Microsoft page then your individual account lacks sufficient execute permissions for something. Given that you are leveraging the SMTP call a first guess is checking with your AD/Outlook people and confirm your account has permissions to make the SMTP call. That might explain why when you are made Network Admin it works but once removed it doesn't.
... View more
02-27-2017
09:43 AM
|
0
|
11
|
9617
|
|
POST
|
Sounds like you just need to configure a Service Account. With Windows Task Scheduler you can assign the task to run as a different user and so you would use the Service account which can be assigned limited and elevated permissions, may have a static password and that can be controlled by your Network Admin. The easy button on this assuming you are using AD or similar is the Network Admin creates the account, you assign the account permissions in Task Scheduler, assign any needed NTFS permissions on any files/folders needed, your DBA adds the service account and grants needed permissions and now all your admins can limit and maintain complete control of the accounts access keeping things locked down for security reasons but still accomplishing the tasks you need. The part I am questioning is the scripts ability to execute because Windows Task Scheduler says it completed. This means whatever failed occurred inside your script and Task Scheduler can't see it and nothing in your script is e-mailing you or otherwise able to generate notifications on the issue. I wrap all my GP's inside an e-mail script and then call published GP REST services into batch files where I can also build in timeout rules, etc. This ensures I receive e-mails if anything in the python script or model fails/errors and also hard kills anything that hangs or runs longer than we want ensuring system resources don't peg and 1 task can't linger forward and impact another. My first guess is that you don't have the DB credentials embedded in your .py and the connection to the DB is using Windows credentials that can't be pulled because you aren't logged in but if I'm wrong and it is truly limited to something else permissions then it depends on how you wrote the task but here are some basics: 1) Is the Windows Task Schedule not only authored by you but set to run using your account as well (Security Options on General Tab) 2)Execution permission on the .py you are using as well as python.exe (for whatever account is in Security Options) 3) You mention SDE, so does your .py have login credentials embedded in it that have access to execute objects in the DBO/SDE schema (SQL Server try starting here http://desktop.arcgis.com/en/arcmap/10.3/manage-data/gdbs-in-sql-server/comparison-geodatabase-owners-sqlserver.htm for Oracle you could try looking here http://desktop.arcgis.com/en/arcmap/10.3/manage-data/gdbs-in-oracle/privileges-oracle.htm) and any other read/write/execute permissions on any other schemas you might be doing work on, using a stored procedure from, etc. If that's not embedded into the script and it's pulling your IWA credentials then your script isn't running because without you logged in under your account at the time the script is running there are no credentials for it to pull from.
... View more
02-27-2017
06:43 AM
|
0
|
13
|
9617
|
|
POST
|
We have looked for this as well and while we know it's possible for the individual users to obtain copies of their personal transcripts there's no easy way for admins to get those details. It'd be great if administrators could pull reports for all their Organizational linked users to understand and see what courses are being taken, how many complete the courses they start, and much more that our organization could benefit from knowing how the users are utilizing the trainings.
... View more
02-27-2017
05:56 AM
|
0
|
0
|
2314
|
|
BLOG
|
While this backend improvement is a great step forward I am curious if there is plans to extend this to include organizations using Enterprise logins? It would seem to me those are the customers with the greatest needs for streamlined account management. While it will surely help some higher learning institutes and that's great, it doesn't alleviate those of us trying to do true Enterprise work. This in fairness is a minor item on our list of much bigger items in which ESRI falls short of entering something close to being an Enterprise application. In large part it seems the most common issues have been the inability to truly leverage Active Directory or some other authorization tools and carry those end-to-end in all ESRI products while keeping to singular accounts and a SSO experience for the users. Just really hope to see this extended because we are managing 500+ users in our AGO currently with that expected to grow to 1000+ over the next year. The current workflows to get users Enterprise accounts established into our AGOL Organization account are tedious enough. We then have the additional steps after we enable their ESRI access where we must link them in MyESRI to get them access to the training that we train as an option to backup and expand upon our formal user trainings. Lots and lots of account administration stuff being duplicated after the fact since it's all done initially and correctly in Active Directory.
... View more
02-27-2017
05:37 AM
|
1
|
0
|
995
|
|
POST
|
So I agree with both Rebecca Strauch, GISP and Jonathan Quinn I am trying to wrap my head around where the real issue lies but it feels like IIS. You said you can get to http://stateparkmap.okstate.edu:6080/arcgis/rest/services which means your name is being resolved correctly otherwise you'd fail and only have access over http://<ServerName>:6080/arcgis/rest/services However as they mentioned 6080 is your internal exposed port for direct connections. Accessing either http://stateparkmap.okstate.edu/index.html or http://stateparkmap.okstate.edu/arcgis/rest/services both trigger the IWA login prompts. So starting with IIS and working backwards if you go into IIS for stateparkmap.okstate.edu and go into your Authentication it would need to look like this (which is what Jonathan Quinn) is referencing It seems as though your current configuration has "Windows Authentication" set as "Enabled" If for some reason once you ensure this is how the site is configured the next thing to try would be on the right side of IIS for the site you can browse so if you choose " Browse localhost on *:80 (http)" what are you getting?
... View more
02-24-2017
11:02 AM
|
1
|
0
|
5460
|
|
POST
|
Good to hear and can't say what causes this or why it fixes things. Logic would be that cycling the ArcServer service or entire server itself would work but we have seen this issue in servers back to 10.2. Happens every once in a while after we do OS updates/patching and all I have ever reasonably deduced is that the ArcServer service is a delayed start service but the publishing tools spin up within that service so possibly the delayed start isn't enough for other necessary things to come up at the time the publishing tools initialize. Not sure, just know its been another of our identified ESRI quirks but the recycle of the Publish Tools itself hasn't failed us yet.
... View more
02-24-2017
10:09 AM
|
0
|
0
|
4836
|
|
POST
|
So we had issues although I didn't go digging for the logs I immediately remembered the publishing patches in last few releases. Dug in and sure enough there is one for 10.5 already. Can't guarantee it's the silver lining as I don't know if you are doing publishing from Pro or not. If you install this I will say that after we did it our publishing was killed for not just Pro but desktop as well (desktop had been publishing fine prior to patch). Simple stop and restart of the publishing tools in manager fixed things and we have not seen issues since publishing from either. Can also say that a reboot of the server or the ArcServer service didn't correct things after the patch install either and only the recycling of the running Publishing Tools service resolved it. http://support.esri.com/Products/Enterprise/arcgis-server/ArcGIS-GIS-Server/10-5#downloads?id=7464
... View more
02-24-2017
07:02 AM
|
3
|
3
|
4836
|
|
POST
|
Ours was a point data set and that piece is building the records. Can't quote off top of my head but should be a somewhat similar logic to generate and build polygon records instead of point records. Quick Google search I did find this page which at the bottom provides logic for looping to generate the polygons. http://pro.arcgis.com/en/pro-app/arcpy/get-started/reading-geometries.htm
... View more
02-08-2017
09:19 AM
|
0
|
1
|
4301
|
|
POST
|
We ran into this and if you are comfortable with some python then this will work. It will bring everything down to your FGDB and create folders named by GUID with the appropriate JPEG's extracted inside of them. Here are the instructions for the python tool: 1) Create local file geodatabase to hold data and attachments you want to download from ArcGIS Online (called data.gdb in script) 2) Create feature class (called myLayer in script), enable attachments, add globalID's 3) Add the following field to the feature class -GlobalID_str, text, length: 50 4) Create table called MatchTable (called MatchTable in script). 5) Add the following fields to the MatchTable table: - GlobalID_Str, text, length: 50 - PhotoPath, text length: 255 6) Enable "sync" on hosted feature service (http://resources.arcgis.com/en/help/arcgisonline/index.html#//010q000000n0000000) 7) Open AGOL_pullFeatures script in text editor and modify the following: -ArcGIS Online username/password -REST url to feature service to pull from -path to and name of local file geodatabase -fields to pull from the hosted feature service (must match local feature class) -name of local feature class (this will hold the data from the hosted service and the attachments) import os, urllib, urllib2, datetime, arcpy, json
## ============================================================================== ##
## function to update a field - basically converts longs to dates for date fields ##
## since json has dates as a long (milliseconds since unix epoch) and geodb wants ##
## a proper date, not a long.
## ============================================================================== ##
def updateValue(row,field_to_update,value):
outputfield=next((f for f in fields if f.name ==field_to_update),None) #find the output field
if outputfield == None or value == None: #exit if no field found or empty (null) value passed in
return
if outputfield.type == 'Date':
if value > 0 : # filter "zero" dates
value = datetime.datetime.fromtimestamp(value/1000) # convert to date - this is local time, to use utc time
row.setValue(field_to_update,value) # change "fromtimestamp" to "utcfromtimestamp"
else:
row.setValue(field_to_update,value)
return
## ============================================================================== ##
### Generate Token ###
gtUrl = 'https://www.arcgis.com/sharing/rest/generateToken'
gtValues = {'username' : 'XXX',
'password' : 'XXX',
'referer' : 'http://www.arcgis.com',
'f' : 'json' }
gtData = urllib.urlencode(gtValues)
gtRequest = urllib2.Request(gtUrl, gtData)
gtResponse = urllib2.urlopen(gtRequest)
gtJson = json.load(gtResponse)
token = gtJson['token']
### Create Replica ###
### Update service url HERE ###
crUrl = 'http://services1.arcgis.com/XXX/arcgis/rest/services/FeatureLayerName/FeatureServer/CreateReplica'
crValues = {'f' : 'json',
'layers' : '0',
'returnAttachments' : 'true',
'token' : token }
crData = urllib.urlencode(crValues)
crRequest = urllib2.Request(crUrl, crData)
crResponse = urllib2.urlopen(crRequest)
crJson = json.load(crResponse)
replicaUrl = crJson['URL']
urllib.urlretrieve(replicaUrl, 'myLayer.json')
### Get Attachment ###
cwd = os.getcwd()
with open('myLayer.json') as data_file:
data = json.load(data_file)
for x in data['layers'][0]['attachments']:
gaUrl = x['url']
gaFolder = cwd + '\\photos\\' + x['parentGlobalId']
if not os.path.exists(gaFolder):
os.makedirs(gaFolder)
gaName = x['name']
gaValues = {'token' : token }
gaData = urllib.urlencode(gaValues)
urllib.urlretrieve(url=gaUrl + '/' + gaName, filename=os.path.join(gaFolder, gaName),data=gaData)
### Create Features ###
rows = arcpy.InsertCursor(cwd + '/data.gdb/myLayer')
fields = arcpy.ListFields(cwd + '/data.gdb/myLayer')
for cfX in data['layers'][0]['features']:
pnt = arcpy.Point()
pnt.X = cfX['geometry']['x']
pnt.Y = cfX['geometry']['y']
row = rows.newRow()
row.shape = pnt
### Set Attribute columns HERE ###
## makes use of the "updatevalue function to deal with dates ##
updateValue(row,'OBJECTID', cfX['attributes']['OBJECTID'])
updateValue(row,'Route_Code', cfX['attributes']['Route_Code'])
updateValue(row,'Primary_Route', cfX['attributes']['Primary_Route'])
updateValue(row,'Street_Name', cfX['attributes']['Street_Name'])
updateValue(row,'Structure_Type', cfX['attributes']['Structure_Type'])
updateValue(row,'Pole_Designation_Number', cfX['attributes']['Pole_Designation_Number'])
updateValue(row,'Visible_Cracks', cfX['attributes']['Visible_Cracks'])
updateValue(row,'Number_Of_Cracks', cfX['attributes']['Number_Of_Cracks'])
updateValue(row,'Longest_Crack_Length', cfX['attributes']['Longest_Crack_Length'])
updateValue(row,'Pole_Multi_Sided', cfX['attributes']['Pole_Multi_Sided'])
updateValue(row,'Number_Of_Sides', cfX['attributes']['Number_Of_Sides'])
updateValue(row,'Number_Of_Anchor_Bolts', cfX['attributes']['Number_Of_Anchor_Bolts'])
updateValue(row,'Anchor_Bolt_Cracked', cfX['attributes']['Anchor_Bolt_Cracked'])
updateValue(row,'Nuts_Loose', cfX['attributes']['Nuts_Loose'])
updateValue(row,'Lock_Washers_OK', cfX['attributes']['Lock_Washers_OKs'])
updateValue(row,'FollowUp_Status', cfX['attributes']['FollowUp_Status'])
updateValue(row,'FollowUp_Comments ', cfX['attributes']['FollowUp_Comments '])
updateValue(row,'FollowUp_Complete', cfX['attributes']['FollowUp_Complete'])
updateValue(row,'District', cfX['attributes']['District'])
updateValue(row,'County', cfX['attributes']['County'])
updateValue(row,'Latitude', cfX['attributes']['Latitude'])
updateValue(row,'Longitude', cfX['attributes']['Longitude'])
updateValue(row,'NLFID', cfX['attributes']['NLFID'])
updateValue(row,'GlobalID', cfX['attributes']['GlobalID'])
updateValue(row,'NLFID', cfX['attributes']['NLFID'])
# leave GlobalID out - you cannot edit this field in the destination geodb
#comment out below fields if you don't have them in your online or destination geodb (editor tracking)
updateValue(row,'CreationDate', cfX['attributes']['CreationDate'])
updateValue(row,'Creator', cfX['attributes']['Creator'])
updateValue(row,'EditDate', cfX['attributes']['EditDate'])
updateValue(row,'Editor', cfX['attributes']['Editor'])
updateValue(row,'GlobalID_str', cfX['attributes']['GlobalID'])
rows.insertRow(row)
del row
del rows
### Add Attachments ###
### Create Match Table ###
rows = arcpy.InsertCursor(cwd + '/data.gdb/MatchTable')
for cmtX in data['layers'][0]['attachments']:
row = rows.newRow()
row.setValue('GlobalID_Str', cmtX['parentGlobalId'])
row.setValue('PhotoPath', cwd + '\\photos\\' + cmtX['parentGlobalId'] + '\\' + cmtX['name'])
rows.insertRow(row)
del row
del rows
### Add Attachments ###
arcpy.AddAttachments_management(cwd + '/data.gdb/myLayer', 'GlobalID_Str', cwd + '/data.gdb/MatchTable', 'GlobalID_Str', 'PhotoPath')
... View more
01-31-2017
10:31 AM
|
1
|
5
|
4301
|
|
POST
|
Appears it might be a multiple step process but here's some details and ideas. 1) Export selection as new table or FC 2) Using the Water Network Editing Add-in Batch upload as Barriers (FEB 2016 update for ENH-000086166) a) if you already have an existing barriers file then you may need to simply do an append or build an ETL https://github.com/Esri/local-government-desktop-addins/issues/39 http://solutions.arcgis.com/utilities/water/help/network-editing/
... View more
01-31-2017
04:09 AM
|
1
|
1
|
1578
|
|
POST
|
Ohhh ok, sorry I see so I gave you details regarding the individual model level but left out overall environment variables, etc. So below is the screen shot from our desktop environment where we leave those blank and that allows ESRI to use the default paths I had given you before for C:\<user name> Here is a screen shot of what the published service looks like from the server and as you can see there is no physical scratch.gdb being used the way that there is an output.gdb which is by design because we run a process to zip the output.gdb and provide it through the front end interface for user downloads.
... View more
01-26-2017
06:22 AM
|
2
|
0
|
5050
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | 08-30-2017 03:41 AM | |
| 1 | 03-01-2017 08:50 AM | |
| 1 | 03-17-2017 10:37 AM | |
| 2 | 05-24-2017 07:57 AM | |
| 1 | 03-16-2017 10:06 AM |
| Online Status |
Offline
|
| Date Last Visited |
03-07-2022
02:41 PM
|