Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
proview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Esteban Blanc
proview
Commits
0501e23c
Commit
0501e23c
authored
May 15, 2019
by
Christoffer Ackelman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Web: Changed Gdh to use Promises
parent
115edd49
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
820 additions
and
1014 deletions
+820
-1014
java/jsw/co/src/gdh.ts
java/jsw/co/src/gdh.ts
+392
-563
java/jsw/ev/src/ev.ts
java/jsw/ev/src/ev.ts
+64
-70
java/jsw/flow/src/flow.ts
java/jsw/flow/src/flow.ts
+1
-4
java/jsw/ge/src/ge_appl.ts
java/jsw/ge/src/ge_appl.ts
+8
-8
java/jsw/ge/src/ge_dyn.ts
java/jsw/ge/src/ge_dyn.ts
+119
-127
java/jsw/ge/src/ge_graph.ts
java/jsw/ge/src/ge_graph.ts
+7
-11
java/jsw/opwind/src/opwind.ts
java/jsw/opwind/src/opwind.ts
+9
-10
java/jsw/xtt/src/xtt.ts
java/jsw/xtt/src/xtt.ts
+220
-221
No files found.
java/jsw/co/src/gdh.ts
View file @
0501e23c
This diff is collapsed.
Click to expand it.
java/jsw/ev/src/ev.ts
View file @
0501e23c
...
...
@@ -95,7 +95,7 @@ class Ev {
console
.
log
(
"
toolitem2
"
,
o
.
userdata
.
e
.
supObject
.
vid
,
o
.
userdata
.
e
.
supObject
.
oix
);
this
.
ctx
.
gdh
.
getObjectFromAref
(
o
.
userdata
.
e
.
supObject
,
GdhOp
.
GET_OP_SELF
,
this
.
open_navigator_cb
,
null
);
GdhOp
.
GET_OP_SELF
).
then
(
this
.
open_navigator_cb
);
console
.
log
(
"
toolitem2 event
"
);
});
// Trace sup object
...
...
@@ -106,18 +106,16 @@ class Ev {
if
(
o
===
null
)
{
return
;
}
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObjectFromAref
(
o
.
userdata
.
e
.
supObject
,
GdhOp
.
GET_OP_METHOD_PLC
,
this
.
open_plc_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_PLC
).
then
(
this
.
open_plc_cb
);
});
// Graph event name
document
.
getElementById
(
"
toolitem4
"
)
.
addEventListener
(
"
click
"
,
function
(
event
)
{
let
o
=
this
.
ctx
.
get_select
();
if
(
o
.
userdata
instanceof
EvItemAlarm
)
{
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObjectFromName
(
o
.
userdata
.
e
.
eventName
,
GdhOp
.
GET_OP_METHOD_GRAPH
,
this
.
open_graph_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_GRAPH
).
then
(
this
.
open_graph_cb
);
}
});
// Object raph event name
...
...
@@ -125,9 +123,8 @@ class Ev {
.
addEventListener
(
"
click
"
,
function
(
event
)
{
let
o
=
this
.
ctx
.
get_select
();
if
(
o
.
userdata
instanceof
EvItemAlarm
)
{
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObjectFromName
(
o
.
userdata
.
e
.
eventName
,
GdhOp
.
GET_OP_METHOD_OBJECTGRAPH
,
this
.
open_graph_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_OBJECTGRAPH
).
then
(
this
.
open_graph_cb
);
}
});
// Navigator event name
...
...
@@ -147,9 +144,8 @@ class Ev {
if
(
o
===
null
)
{
return
;
}
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObjectFromName
(
o
.
userdata
.
e
.
eventName
,
GdhOp
.
GET_OP_METHOD_PLC
,
this
.
open_plc_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_PLC
).
then
(
this
.
open_plc_cb
);
console
.
log
(
"
toolitem7 event
"
);
});
// History event name
...
...
@@ -175,7 +171,7 @@ class Ev {
if
(
o
===
null
)
{
return
;
}
this
.
ctx
.
gdh
.
crrSignal
(
o
.
userdata
.
e
.
eventName
,
this
.
open_crr_cb
,
o
);
this
.
ctx
.
gdh
.
crrSignal
(
o
.
userdata
.
e
.
eventName
).
then
(
this
.
open_crr_cb
(
o
)
);
console
.
log
(
"
toolitem10 event
"
);
});
// Help event name
...
...
@@ -192,12 +188,10 @@ class Ev {
return
;
}
if
(
o
.
userdata
instanceof
EvItemAlarm
)
{
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObjectFromName
(
o
.
userdata
.
e
.
eventName
,
GdhOp
.
GET_OP_METHOD_HELPCLASS
,
this
.
open_helpclass_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_HELPCLASS
).
then
(
this
.
open_helpclass_cb
);
}
});
}
is_authorized
(
access
)
{
...
...
@@ -206,25 +200,26 @@ class Ev {
gdh_init_cb
()
{
if
(
!
this
.
priv
)
{
this
.
ctx
.
gdh
.
login
(
""
,
""
,
this
.
login_cb
,
this
);
this
.
ctx
.
gdh
.
login
(
""
,
""
).
then
(
this
.
login_cb
);
}
//this.ctx.gdh.mhSync(
this.mhSyncIdx, this.sync_cb, this
);
//this.ctx.gdh.mhSync(
this.mhSyncIdx).then(this.sync_cb
);
this
.
ctx
.
gdh
.
listSent
=
true
;
this
.
trace_cyclic
();
}
login_cb
(
id
,
data
,
sts
,
result
)
{
console
.
log
(
"
Login:
"
,
sts
,
result
);
this
.
priv
=
(
sts
&
1
)
?
result
:
0
;
login_cb
(
res
)
{
console
.
log
(
"
Login:
"
,
res
.
sts
,
res
.
value
);
this
.
priv
=
(
res
.
sts
&
1
)
?
res
.
value
:
0
;
}
sync_cb
(
id
,
data
,
sts
,
result
)
{
if
(
!
(
sts
&
1
))
{
sync_cb
(
res
)
{
if
(
!
(
res
.
sts
&
1
))
{
return
;
}
let
result
=
res
.
value
;
if
(
result
.
length
===
0
)
{
return
;
}
...
...
@@ -326,7 +321,7 @@ class Ev {
let
item
=
node
.
get_userdata
();
console
.
log
(
"
Ack
"
,
item
.
e
.
eventText
);
this
.
ctx
.
gdh
.
mhAcknowledge
(
item
.
e
.
eventId
,
this
.
ack_cb
,
this
);
this
.
ctx
.
gdh
.
mhAcknowledge
(
item
.
e
.
eventId
).
then
(
this
.
ack_cb
);
if
(
item
.
e
.
eventStatus
&
EventStatus
.
NotRet
)
{
item
.
e
.
eventStatus
&=
~
EventStatus
.
NotAck
;
...
...
@@ -338,24 +333,28 @@ class Ev {
this
.
ctx
.
draw
();
}
ack_cb
(
id
,
data
,
st
s
)
{
console
.
log
(
"
ack sts
"
,
sts
);
ack_cb
(
re
s
)
{
console
.
log
(
"
ack sts
"
,
res
.
sts
);
}
open_objectgraph_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_objectgraph_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
data
.
location
.
href
=
let
result
=
res
.
value
;
w
.
location
.
href
=
"
ge.html?graph=
"
+
result
.
param1
+
"
&instance=
"
+
result
.
fullname
;
data
.
document
.
title
=
result
.
fullname
;
w
.
document
.
title
=
result
.
fullname
;
}
}
open_graph_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_graph_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
let
result
=
res
.
value
;
let
idx
=
result
.
param1
.
indexOf
(
'
.
'
);
if
(
idx
!==
-
1
)
{
result
.
param1
=
result
.
param1
.
substring
(
0
,
idx
);
...
...
@@ -366,62 +365,61 @@ class Ev {
instancestr
=
"
&instance=
"
+
result
.
fullname
;
}
data
.
location
.
href
=
"
ge.html?graph=
"
+
result
.
param1
+
instancestr
;
data
.
document
.
title
=
result
.
param1
;
w
.
location
.
href
=
"
ge.html?graph=
"
+
result
.
param1
+
instancestr
;
w
.
document
.
title
=
result
.
param1
;
}
}
open_plc_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_plc_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
let
param1
;
if
(
result
.
param1
===
""
)
{
param1
=
""
;
}
else
{
param1
=
"
&obj=
"
+
result
.
param1
;
}
let
result
=
res
.
value
;
let
param1
=
result
.
param1
?
(
"
&obj=
"
+
result
.
param1
)
:
""
;
console
.
log
(
"
flow.html?vid=
"
+
result
.
objid
.
vid
+
"
&oix=
"
+
result
.
objid
.
oix
+
param1
);
data
.
location
.
href
=
w
.
location
.
href
=
"
flow.html?vid=
"
+
result
.
objid
.
vid
+
"
&oix=
"
+
result
.
objid
.
oix
+
param1
;
data
.
document
.
title
=
"
Trace
"
+
result
.
fullname
;
w
.
document
.
title
=
"
Trace
"
+
result
.
fullname
;
}
}
open_navigator_cb
(
id
,
data
,
sts
,
result
)
{
console
.
log
(
"
Open navigator
"
,
sts
);
if
((
sts
&
1
)
===
0
)
{
console
.
log
(
"
Error status
"
+
sts
);
open_navigator_cb
(
res
)
{
console
.
log
(
"
Open navigator
"
,
res
.
sts
);
if
((
res
.
sts
&
1
)
===
0
)
{
console
.
log
(
"
Error status
"
+
res
.
sts
);
}
else
{
localStorage
.
setItem
(
"
XttMethodNavigator
"
,
res
ult
.
fullname
);
localStorage
.
setItem
(
"
XttMethodNavigator
"
,
res
.
value
.
fullname
);
console
.
log
(
"
storage
"
,
localStorage
.
getItem
(
"
XttMethodNavigator
"
));
}
}
open_objectgraph_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_objectgraph_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
let
classname
=
res
ult
.
classname
.
toLowerCase
();
let
classname
=
res
.
value
.
classname
.
toLowerCase
();
if
(
classname
.
substring
(
0
,
1
)
===
"
$
"
)
{
classname
=
classname
.
substring
(
1
);
}
let
graphname
=
"
pwr_c_
"
+
classname
;
data
.
location
.
href
=
"
ge.html?graph=
"
+
graphname
+
"
&instance=
"
+
res
ult
.
fullname
;
data
.
document
.
title
=
graphname
+
"
"
+
result
.
fullname
;
w
.
location
.
href
=
"
ge.html?graph=
"
+
graphname
+
"
&instance=
"
+
res
.
value
.
fullname
;
w
.
document
.
title
=
graphname
+
"
"
+
res
.
value
.
fullname
;
}
}
open_helpclass_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_helpclass_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
console
.
log
(
"
open_helpclass
"
,
res
ult
.
param1
);
data
.
location
.
href
=
location
.
protocol
+
"
//
"
+
location
.
host
+
res
ult
.
param1
;
console
.
log
(
"
open_helpclass
"
,
res
.
value
.
param1
);
w
.
location
.
href
=
location
.
protocol
+
"
//
"
+
location
.
host
+
res
.
value
.
param1
;
}
}
...
...
@@ -442,12 +440,12 @@ class Ev {
}
trace_cyclic
()
{
this
.
ctx
.
gdh
.
mhSync
(
this
.
mhSyncIdx
,
this
.
sync_cb
,
this
);
this
.
ctx
.
gdh
.
mhSync
(
this
.
mhSyncIdx
).
then
(
this
.
sync_cb
);
this
.
timer
=
setTimeout
(
this
.
trace_cyclic
,
1000
);
}
trace_scan
(
id
,
st
s
)
{
trace_scan
(
re
s
)
{
this
.
scan_update
=
false
;
if
(
this
.
scan_update
)
{
this
.
ctx
.
draw
();
...
...
@@ -581,17 +579,13 @@ class Ev {
case
Event
.
Key_CtrlL
:
let
o
=
this
.
ctx
.
get_select
();
if
(
o
.
userdata
instanceof
EvItemAlarm
)
{
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObject
(
o
.
userdata
.
objid
,
GdhOp
.
GET_OP_METHOD_PLC
,
this
.
open_plc_cb
,
newwindow
);
this
.
ctx
.
gdh
.
getObject
(
o
.
userdata
.
objid
,
GdhOp
.
GET_OP_METHOD_PLC
).
then
(
this
.
open_plc_cb
);
}
break
;
case
Event
.
Key_CtrlG
:
let
o
=
this
.
ctx
.
get_select
();
if
(
o
.
userdata
instanceof
EvItemAlarm
)
{
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
ctx
.
gdh
.
getObject
(
o
.
userdata
.
objid
,
GdhOp
.
GET_OP_METHOD_PLC
,
this
.
open_objectgraph_cb
,
newwindow
);
this
.
ctx
.
gdh
.
getObject
(
o
.
userdata
.
objid
,
GdhOp
.
GET_OP_METHOD_PLC
).
then
(
this
.
open_objectgraph_cb
);
}
break
;
default
:
...
...
java/jsw/flow/src/flow.ts
View file @
0501e23c
...
...
@@ -1775,10 +1775,8 @@ class FlowFrame {
}
flow_open
()
{
console
.
log
(
"
flow_open
"
);
console
.
log
(
"
ctx.gdh
"
,
this
.
ctx
.
gdh
);
this
.
ctx
.
connect
();
this
.
ctx
.
gdh
.
refObjectInfoList
(
this
.
ctx
.
gdh
.
refObjectInfoListReply
);
this
.
ctx
.
gdh
.
refObjectInfoList
();
this
.
timer
=
setTimeout
(
this
.
flow_cyclic
,
1000
);
}
...
...
@@ -1793,7 +1791,6 @@ class FlowFrame {
}
flow_close
()
{
console
.
log
(
"
Close function
"
,
this
.
timer
);
clearTimeout
(
this
.
timer
);
for
(
let
i
in
this
.
ctx
.
gdh
.
pending
)
{
delete
this
.
ctx
.
gdh
.
pending
[
i
];
...
...
java/jsw/ge/src/ge_appl.ts
View file @
0501e23c
...
...
@@ -74,10 +74,8 @@ class Appl {
}
if
(
classGraph
)
{
console
.
log
(
"
Cmd classGraph
"
);
let
newwindow
=
window
.
open
(
""
,
"
_blank
"
);
this
.
graph
.
gdh
.
getObjectFromName
(
instanceValue
,
GdhOp
.
GET_OP_METHOD_OBJECTGRAPH
,
this
.
open_objectgraph_cb
,
newwindow
);
GdhOp
.
GET_OP_METHOD_OBJECTGRAPH
).
then
(
this
.
open_objectgraph_cb
);
}
else
{
let
graphName
=
cli
.
getQualValue
(
"
cli_arg2
"
).
toLowerCase
();
if
(
!
graphName
)
{
...
...
@@ -266,14 +264,16 @@ class Appl {
}
}
open_objectgraph_cb
(
id
,
data
,
sts
,
result
)
{
if
((
sts
&
1
)
===
0
)
{
data
.
document
.
write
(
"
Error status
"
+
sts
);
open_objectgraph_cb
(
res
)
{
let
w
=
window
.
open
(
""
,
"
_blank
"
);
if
((
res
.
sts
&
1
)
===
0
)
{
w
.
document
.
write
(
"
Error status
"
+
res
.
sts
);
}
else
{
let
result
=
res
.
value
;
console
.
log
(
"
param1
"
,
result
.
param1
);
data
.
location
.
href
=
w
.
location
.
href
=
"
ge.html?graph=
"
+
result
.
param1
+
"
&instance=
"
+
result
.
fullname
;
data
.
document
.
title
=
result
.
param1
+
"
"
+
result
.
fullname
;
w
.
document
.
title
=
result
.
param1
+
"
"
+
result
.
fullname
;
}
}
}
...
...
java/jsw/ge/src/ge_dyn.ts
View file @
0501e23c
This diff is collapsed.
Click to expand it.
java/jsw/ge/src/ge_graph.ts
View file @
0501e23c
...
...
@@ -249,31 +249,27 @@ class Graph {
gdh_init_cb
()
{
if
(
this
.
priv
===
null
)
{
this
.
gdh
.
login
(
""
,
""
,
this
.
login_cb
,
this
);
this
.
gdh
.
login
(
""
,
""
).
then
(
this
.
login_cb
);
}
this
.
ctx
.
traceConnect
();
this
.
gdh
.
refObjectInfoList
(
this
.
trace_connected
);
this
.
gdh
.
refObjectInfoList
(
).
then
(
e
=>
this
.
trace_cyclic
()
);
}
login_cb
(
id
,
data
,
sts
,
result
)
{
console
.
log
(
"
Login:
"
,
sts
,
result
);
this
.
priv
=
(
sts
&
1
)
?
result
:
0
;
}
trace_connected
(
id
,
sts
)
{
this
.
trace_cyclic
();
login_cb
(
res
)
{
console
.
log
(
"
Login:
"
,
res
.
sts
,
res
.
value
);
this
.
priv
=
(
res
.
sts
&
1
)
?
res
.
value
:
0
;
}
trace_cyclic
()
{
if
(
this
.
frame
.
nogdh
)
{
this
.
trace_scan
(
0
,
0
);
this
.
trace_scan
();
}
else
{
this
.
gdh
.
getRefObjectInfoAll
(
this
.
trace_scan
);
}
}
trace_scan
(
id
,
sts
)
{
trace_scan
()
{
this
.
scan_time
=
this
.
ctx
.
scantime
;
this
.
fast_scan_time
=
this
.
ctx
.
fast_scantime
;
this
.
animation_scan_time
=
this
.
ctx
.
animation_scantime
;
...
...
java/jsw/opwind/src/opwind.ts
View file @
0501e23c
...
...
@@ -32,8 +32,8 @@ class OpWindMenu {
gdh_init_cb
()
{
let
oid
=
new
PwrtObjid
(
0
,
0
);
this
.
user
=
"
Default
"
;
this
.
gdh
.
login
(
""
,
""
,
this
.
login_cb
,
this
);
this
.
gdh
.
getOpwindMenu
(
this
.
get_opplace
()
,
this
.
get_menu_cb
,
999
);
this
.
gdh
.
login
(
""
,
""
).
then
(
this
.
login_cb
);
this
.
gdh
.
getOpwindMenu
(
this
.
get_opplace
()
).
then
(
this
.
get_menu_cb
);
}
add_menu_button
(
context
,
text
)
{
...
...
@@ -49,9 +49,9 @@ class OpWindMenu {
return
button
;
}
get_menu_cb
(
id
,
data
,
sts
,
result
)
{
get_menu_cb
(
res
)
{
let
result
=
res
.
value
;
this
.
info
=
result
;
console
.
log
(
"
Menu received
"
,
sts
,
data
,
result
.
buttons
.
length
);
let
context
=
document
.
getElementById
(
"
opwindmenu
"
);
document
.
getElementById
(
"
opwind_title
"
).
innerHTML
=
result
.
title
;
...
...
@@ -89,7 +89,7 @@ class OpWindMenu {
passwd
=
c
.
crypt
(
"
aa
"
,
passwd
);
this
.
user
=
user
;
this
.
gdh
.
login
(
user
,
passwd
,
this
.
login_cb
,
this
);
this
.
gdh
.
login
(
user
,
passwd
).
then
(
this
.
login_cb
);
});
document
.
getElementById
(
"
cancel_button
"
)
.
addEventListener
(
"
click
"
,
function
(
event
)
{
...
...
@@ -102,7 +102,7 @@ class OpWindMenu {
document
.
getElementById
(
"
login_frame
"
).
style
.
height
=
'
0px
'
;
this
.
priv
=
0
;
this
.
user
=
"
Default
"
;
this
.
gdh
.
login
(
""
,
""
,
this
.
login_cb
,
this
);
this
.
gdh
.
login
(
""
,
""
).
then
(
this
.
login_cb
);
});
document
.
getElementById
(
"
login_user
"
).
innerHTML
=
""
;
...
...
@@ -200,10 +200,9 @@ class OpWindMenu {
}
}
login_cb
(
id
,
data
,
sts
,
result
)
{
console
.
log
(
"
Login:
"
,
sts
,
result
);
if
(
sts
&
1
)
{
this
.
priv
=
result
;
login_cb
(
res
)
{
if
(
res
.
sts
&
1
)
{
this
.
priv
=
res
.
value
;
sessionStorage
.
setItem
(
"
pwr_privilege
"
,
String
(
this
.
priv
));
if
(
this
.
user_text
!==
null
)
{
this
.
user_text
.
textContent
=
this
.
user
+
"
on
"
+
this
.
host
;
...
...
java/jsw/xtt/src/xtt.ts
View file @
0501e23c
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment