Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
openairinterface5G
Commits
1dea1590
Commit
1dea1590
authored
May 04, 2016
by
Cédric Roux
Browse files
gui "text_list" becomes "textlist"
view "textlist" becomes "view_textlist" (this one may change at some point)
parent
4d7440bf
Changes
10
Hide whitespace changes
Inline
Side-by-side
common/utils/T/tracer/event_selector.c
View file @
1dea1590
...
...
@@ -27,7 +27,7 @@ static void scroll(void *private, gui *g,
int
new_line
;
int
inc
;
text
_
list_state
(
g
,
w
,
&
visible_lines
,
&
start_line
,
&
number_of_lines
);
textlist_state
(
g
,
w
,
&
visible_lines
,
&
start_line
,
&
number_of_lines
);
inc
=
10
;
if
(
inc
>
visible_lines
-
2
)
inc
=
visible_lines
-
2
;
if
(
inc
<
1
)
inc
=
1
;
...
...
@@ -38,7 +38,7 @@ static void scroll(void *private, gui *g,
new_line
=
number_of_lines
-
visible_lines
;
if
(
new_line
<
0
)
new_line
=
0
;
text
_
list_set_start_line
(
g
,
w
,
new_line
);
textlist_set_start_line
(
g
,
w
,
new_line
);
}
static
void
click
(
void
*
private
,
gui
*
g
,
...
...
@@ -59,21 +59,21 @@ static void click(void *private, gui *g,
if
(
button
==
1
)
set_on
=
1
;
else
set_on
=
0
;
if
(
w
==
this
->
events
)
text
_
list_get_line
(
this
->
g
,
this
->
events
,
line
,
&
text
,
&
color
);
textlist_get_line
(
this
->
g
,
this
->
events
,
line
,
&
text
,
&
color
);
else
text
_
list_get_line
(
this
->
g
,
this
->
groups
,
line
,
&
text
,
&
color
);
textlist_get_line
(
this
->
g
,
this
->
groups
,
line
,
&
text
,
&
color
);
on_off
(
this
->
database
,
text
,
this
->
is_on
,
set_on
);
for
(
i
=
0
;
i
<
this
->
nevents
;
i
++
)
text
_
list_set_color
(
this
->
g
,
this
->
events
,
i
,
textlist_set_color
(
this
->
g
,
this
->
events
,
i
,
this
->
is_on
[
database_pos_to_id
(
this
->
database
,
i
)]
?
this
->
green
:
this
->
red
);
for
(
i
=
0
;
i
<
this
->
ngroups
;
i
++
)
text
_
list_set_color
(
this
->
g
,
this
->
groups
,
i
,
FOREGROUND_COLOR
);
textlist_set_color
(
this
->
g
,
this
->
groups
,
i
,
FOREGROUND_COLOR
);
if
(
w
==
this
->
groups
)
text
_
list_set_color
(
this
->
g
,
this
->
groups
,
line
,
textlist_set_color
(
this
->
g
,
this
->
groups
,
line
,
set_on
?
this
->
green
:
this
->
red
);
t
=
1
;
...
...
@@ -124,8 +124,8 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
widget_add_child
(
g
,
left
,
new_label
(
g
,
"Events"
),
-
1
);
widget_add_child
(
g
,
right
,
new_label
(
g
,
"Groups"
),
-
1
);
events
=
new_text
_
list
(
g
,
235
,
10
,
new_color
(
g
,
"#b3c1e1"
));
groups
=
new_text
_
list
(
g
,
235
,
10
,
new_color
(
g
,
"#edd6cb"
));
events
=
new_textlist
(
g
,
235
,
10
,
new_color
(
g
,
"#b3c1e1"
));
groups
=
new_textlist
(
g
,
235
,
10
,
new_color
(
g
,
"#edd6cb"
));
widget_add_child
(
g
,
left
,
events
,
-
1
);
widget_add_child
(
g
,
right
,
groups
,
-
1
);
...
...
@@ -134,7 +134,7 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
n
=
database_get_ids
(
database
,
&
ids
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
text
_
list_add
(
g
,
events
,
ids
[
i
],
-
1
,
textlist_add
(
g
,
events
,
ids
[
i
],
-
1
,
is_on
[
database_pos_to_id
(
database
,
i
)]
?
green
:
red
);
}
free
(
ids
);
...
...
@@ -143,7 +143,7 @@ event_selector *setup_event_selector(gui *g, void *database, int socket,
n
=
database_get_groups
(
database
,
&
gps
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
text
_
list_add
(
g
,
groups
,
gps
[
i
],
-
1
,
FOREGROUND_COLOR
);
textlist_add
(
g
,
groups
,
gps
[
i
],
-
1
,
FOREGROUND_COLOR
);
}
free
(
gps
);
...
...
common/utils/T/tracer/gui/Makefile
View file @
1dea1590
...
...
@@ -2,7 +2,7 @@ CC=gcc
CFLAGS
=
-Wall
-g
-pthread
OBJS
=
init.o loop.o toplevel_window.o x.o container.o widget.o
\
gui.o label.o event.o xy_plot.o text
_
list.o notify.o
gui.o label.o event.o xy_plot.o textlist.o notify.o
gui.a
:
$(OBJS)
ar cr gui.a
$(OBJS)
...
...
common/utils/T/tracer/gui/gui.h
View file @
1dea1590
...
...
@@ -23,7 +23,7 @@ widget *new_container(gui *gui, int vertical);
widget
*
new_label
(
gui
*
gui
,
const
char
*
text
);
widget
*
new_xy_plot
(
gui
*
gui
,
int
width
,
int
height
,
char
*
label
,
int
vruler_width
);
widget
*
new_text
_
list
(
gui
*
_gui
,
int
width
,
int
nlines
,
int
background_color
);
widget
*
new_textlist
(
gui
*
_gui
,
int
width
,
int
nlines
,
int
background_color
);
void
container_set_child_growable
(
gui
*
_gui
,
widget
*
_this
,
widget
*
child
,
int
growable
);
...
...
@@ -33,18 +33,18 @@ void xy_plot_set_range(gui *gui, widget *this,
void
xy_plot_set_points
(
gui
*
gui
,
widget
*
this
,
int
npoints
,
float
*
x
,
float
*
y
);
void
text
_
list_add
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
void
textlist_add
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
int
color
);
void
text
_
list_del
(
gui
*
gui
,
widget
*
this
,
int
position
);
void
text
_
list_add_silent
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
void
textlist_del
(
gui
*
gui
,
widget
*
this
,
int
position
);
void
textlist_add_silent
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
int
color
);
void
text
_
list_del_silent
(
gui
*
gui
,
widget
*
this
,
int
position
);
void
text
_
list_state
(
gui
*
_gui
,
widget
*
_this
,
void
textlist_del_silent
(
gui
*
gui
,
widget
*
this
,
int
position
);
void
textlist_state
(
gui
*
_gui
,
widget
*
_this
,
int
*
visible_lines
,
int
*
start_line
,
int
*
number_of_lines
);
void
text
_
list_set_start_line
(
gui
*
gui
,
widget
*
this
,
int
line
);
void
text
_
list_get_line
(
gui
*
gui
,
widget
*
this
,
int
line
,
void
textlist_set_start_line
(
gui
*
gui
,
widget
*
this
,
int
line
);
void
textlist_get_line
(
gui
*
gui
,
widget
*
this
,
int
line
,
char
**
text
,
int
*
color
);
void
text
_
list_set_color
(
gui
*
gui
,
widget
*
this
,
int
line
,
int
color
);
void
textlist_set_color
(
gui
*
gui
,
widget
*
this
,
int
line
,
int
color
);
void
gui_loop
(
gui
*
gui
);
...
...
@@ -55,7 +55,7 @@ int new_color(gui *gui, char *color);
/* notifications */
/* known notifications:
* - text
_
list:
* - textlist:
* - scrollup { void *: NULL }
* - scrolldown { void *: NULL }
* - click { int [2]: line, button }
...
...
common/utils/T/tracer/gui/gui_defs.h
View file @
1dea1590
...
...
@@ -76,7 +76,7 @@ struct container_widget {
int
nchildren
;
};
struct
text
_
list_widget
{
struct
textlist_widget
{
struct
widget
common
;
char
**
text
;
int
*
color
;
...
...
common/utils/T/tracer/gui/test.c
View file @
1dea1590
...
...
@@ -31,11 +31,11 @@ int main(void)
#endif
tlcol
=
new_color
(
g
,
"#ddf"
);
tl
=
new_text
_
list
(
g
,
300
,
10
,
tlcol
);
tl
=
new_textlist
(
g
,
300
,
10
,
tlcol
);
widget_add_child
(
g
,
c1
,
tl
,
-
1
);
text
_
list_add
(
g
,
tl
,
"hello"
,
-
1
);
text
_
list_add
(
g
,
tl
,
"world"
,
-
1
);
textlist_add
(
g
,
tl
,
"hello"
,
-
1
,
FOREGROUND_COLOR
);
textlist_add
(
g
,
tl
,
"world"
,
-
1
,
FOREGROUND_COLOR
);
w
=
new_toplevel_window
(
g
,
500
,
400
,
"test window"
);
widget_add_child
(
g
,
w
,
c1
,
0
);
...
...
common/utils/T/tracer/gui/text
_
list.c
→
common/utils/T/tracer/gui/textlist.c
View file @
1dea1590
...
...
@@ -8,9 +8,9 @@
static
void
paint
(
gui
*
_gui
,
widget
*
_this
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
int
i
,
j
;
LOGD
(
"PAINT text
_
list %p xywh %d %d %d %d starting line %d allocated nlines %d text_count %d
\n
"
,
_this
,
this
->
common
.
x
,
this
->
common
.
y
,
this
->
common
.
width
,
this
->
common
.
height
,
this
->
starting_line
,
this
->
allocated_nlines
,
this
->
text_count
);
LOGD
(
"PAINT textlist %p xywh %d %d %d %d starting line %d allocated nlines %d text_count %d
\n
"
,
_this
,
this
->
common
.
x
,
this
->
common
.
y
,
this
->
common
.
width
,
this
->
common
.
height
,
this
->
starting_line
,
this
->
allocated_nlines
,
this
->
text_count
);
x_fill_rectangle
(
g
->
x
,
g
->
xwin
,
this
->
background_color
,
this
->
common
.
x
,
this
->
common
.
y
,
this
->
common
.
width
,
this
->
common
.
height
);
...
...
@@ -26,29 +26,29 @@ static void paint(gui *_gui, widget *_this)
static
void
hints
(
gui
*
_gui
,
widget
*
_w
,
int
*
width
,
int
*
height
)
{
struct
text
_
list_widget
*
w
=
_w
;
struct
textlist_widget
*
w
=
_w
;
*
width
=
w
->
wanted_width
;
*
height
=
w
->
wanted_nlines
*
w
->
line_height
;
LOGD
(
"HINTS text
_
list wh %d %d
\n
"
,
*
width
,
*
height
);
LOGD
(
"HINTS textlist wh %d %d
\n
"
,
*
width
,
*
height
);
}
static
void
allocate
(
gui
*
gui
,
widget
*
_this
,
int
x
,
int
y
,
int
width
,
int
height
)
{
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
this
->
common
.
x
=
x
;
this
->
common
.
y
=
y
;
this
->
common
.
width
=
width
;
this
->
common
.
height
=
height
;
this
->
allocated_nlines
=
height
/
this
->
line_height
;
LOGD
(
"ALLOCATE text
_
list %p xywh %d %d %d %d nlines %d
\n
"
,
this
,
x
,
y
,
width
,
height
,
this
->
allocated_nlines
);
LOGD
(
"ALLOCATE textlist %p xywh %d %d %d %d nlines %d
\n
"
,
this
,
x
,
y
,
width
,
height
,
this
->
allocated_nlines
);
}
static
void
button
(
gui
*
_g
,
widget
*
_this
,
int
x
,
int
y
,
int
button
,
int
up
)
{
struct
gui
*
g
=
_g
;
struct
text
_
list_widget
*
this
=
_this
;
LOGD
(
"BUTTON text
_
list %p xy %d %d button %d up %d
\n
"
,
_this
,
x
,
y
,
button
,
up
);
struct
textlist_widget
*
this
=
_this
;
LOGD
(
"BUTTON textlist %p xy %d %d button %d up %d
\n
"
,
_this
,
x
,
y
,
button
,
up
);
/* scroll up */
if
(
button
==
4
&&
up
==
0
)
{
gui_notify
(
g
,
"scrollup"
,
_this
,
NULL
);
...
...
@@ -65,15 +65,15 @@ static void button(gui *_g, widget *_this, int x, int y, int button, int up)
}
}
widget
*
new_text
_
list
(
gui
*
_gui
,
int
width
,
int
nlines
,
int
bgcol
)
widget
*
new_textlist
(
gui
*
_gui
,
int
width
,
int
nlines
,
int
bgcol
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
w
;
struct
textlist_widget
*
w
;
int
dummy
;
glock
(
g
);
w
=
new_widget
(
g
,
TEXT_LIST
,
sizeof
(
struct
text
_
list_widget
));
w
=
new_widget
(
g
,
TEXT_LIST
,
sizeof
(
struct
textlist_widget
));
w
->
wanted_nlines
=
nlines
;
x_text_get_dimensions
(
g
->
x
,
"."
,
&
dummy
,
&
w
->
line_height
,
&
w
->
baseline
);
...
...
@@ -95,11 +95,11 @@ widget *new_text_list(gui *_gui, int width, int nlines, int bgcol)
/* public functions */
/*************************************************************************/
static
void
_text
_
list_add
(
gui
*
_gui
,
widget
*
_this
,
const
char
*
text
,
static
void
_textlist_add
(
gui
*
_gui
,
widget
*
_this
,
const
char
*
text
,
int
position
,
int
color
,
int
silent
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
@@ -125,10 +125,10 @@ static void _text_list_add(gui *_gui, widget *_this, const char *text,
gunlock
(
g
);
}
static
void
_text
_
list_del
(
gui
*
_gui
,
widget
*
_this
,
int
position
,
int
silent
)
static
void
_textlist_del
(
gui
*
_gui
,
widget
*
_this
,
int
position
,
int
silent
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
@@ -157,33 +157,33 @@ done:
gunlock
(
g
);
}
void
text
_
list_add
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
void
textlist_add
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
int
color
)
{
_text
_
list_add
(
gui
,
this
,
text
,
position
,
color
,
0
);
_textlist_add
(
gui
,
this
,
text
,
position
,
color
,
0
);
}
void
text
_
list_del
(
gui
*
gui
,
widget
*
this
,
int
position
)
void
textlist_del
(
gui
*
gui
,
widget
*
this
,
int
position
)
{
_text
_
list_del
(
gui
,
this
,
position
,
0
);
_textlist_del
(
gui
,
this
,
position
,
0
);
}
void
text
_
list_add_silent
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
void
textlist_add_silent
(
gui
*
gui
,
widget
*
this
,
const
char
*
text
,
int
position
,
int
color
)
{
_text
_
list_add
(
gui
,
this
,
text
,
position
,
color
,
1
);
_textlist_add
(
gui
,
this
,
text
,
position
,
color
,
1
);
}
void
text
_
list_del_silent
(
gui
*
gui
,
widget
*
this
,
int
position
)
void
textlist_del_silent
(
gui
*
gui
,
widget
*
this
,
int
position
)
{
_text
_
list_del
(
gui
,
this
,
position
,
1
);
_textlist_del
(
gui
,
this
,
position
,
1
);
}
void
text
_
list_state
(
gui
*
_gui
,
widget
*
_this
,
void
textlist_state
(
gui
*
_gui
,
widget
*
_this
,
int
*
visible_lines
,
int
*
start_line
,
int
*
number_of_lines
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
@@ -194,10 +194,10 @@ void text_list_state(gui *_gui, widget *_this,
gunlock
(
g
);
}
void
text
_
list_set_start_line
(
gui
*
_gui
,
widget
*
_this
,
int
line
)
void
textlist_set_start_line
(
gui
*
_gui
,
widget
*
_this
,
int
line
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
@@ -208,11 +208,11 @@ void text_list_set_start_line(gui *_gui, widget *_this, int line)
gunlock
(
g
);
}
void
text
_
list_get_line
(
gui
*
_gui
,
widget
*
_this
,
int
line
,
void
textlist_get_line
(
gui
*
_gui
,
widget
*
_this
,
int
line
,
char
**
text
,
int
*
color
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
@@ -227,10 +227,10 @@ void text_list_get_line(gui *_gui, widget *_this, int line,
gunlock
(
g
);
}
void
text
_
list_set_color
(
gui
*
_gui
,
widget
*
_this
,
int
line
,
int
color
)
void
textlist_set_color
(
gui
*
_gui
,
widget
*
_this
,
int
line
,
int
color
)
{
struct
gui
*
g
=
_gui
;
struct
text
_
list_widget
*
this
=
_this
;
struct
textlist_widget
*
this
=
_this
;
glock
(
g
);
...
...
common/utils/T/tracer/remote.c
View file @
1dea1590
...
...
@@ -169,14 +169,14 @@ int main(int n, char **v)
if
(
gui_mode
)
{
widget
*
w
,
*
win
;
// w = new_text
_
list(g, 600, 20, 0);
w
=
new_text
_
list
(
g
,
800
,
50
,
BACKGROUND_COLOR
);
// w = new_textlist(g, 600, 20, 0);
w
=
new_textlist
(
g
,
800
,
50
,
BACKGROUND_COLOR
);
win
=
new_toplevel_window
(
g
,
800
,
50
*
12
,
"textlog"
);
widget_add_child
(
g
,
win
,
w
,
-
1
);
out
=
new_textlist
(
1000
,
10
,
g
,
w
);
//tout = new_textlist(7, 4, g, w);
out
=
new_
view_
textlist
(
1000
,
10
,
g
,
w
);
//tout = new_
view_
textlist(7, 4, g, w);
}
else
{
out
=
new_stdout
();
out
=
new_
view_
stdout
();
}
for
(
i
=
0
;
i
<
number_of_events
;
i
++
)
{
...
...
common/utils/T/tracer/view/stdout.c
View file @
1dea1590
...
...
@@ -21,7 +21,7 @@ static void append(view *_this, char *s)
if
(
pthread_mutex_unlock
(
&
this
->
lock
))
abort
();
}
view
*
new_stdout
(
void
)
view
*
new_
view_
stdout
(
void
)
{
struct
stdout
*
ret
=
calloc
(
1
,
sizeof
(
struct
stdout
));
if
(
ret
==
NULL
)
abort
();
...
...
common/utils/T/tracer/view/textlist.c
View file @
1dea1590
...
...
@@ -20,11 +20,11 @@ struct textlist {
static
void
_append
(
struct
textlist
*
this
,
char
*
s
,
int
*
deleted
)
{
if
(
this
->
cursize
==
this
->
maxsize
)
{
text
_
list_del_silent
(
this
->
g
,
this
->
w
,
0
);
textlist_del_silent
(
this
->
g
,
this
->
w
,
0
);
this
->
cursize
--
;
(
*
deleted
)
++
;
}
text
_
list_add_silent
(
this
->
g
,
this
->
w
,
s
,
-
1
,
FOREGROUND_COLOR
);
textlist_add_silent
(
this
->
g
,
this
->
w
,
s
,
-
1
,
FOREGROUND_COLOR
);
this
->
cursize
++
;
}
...
...
@@ -46,15 +46,15 @@ static void *textlist_thread(void *_this)
free
(
s
);
}
if
(
dirty
)
{
text
_
list_state
(
this
->
g
,
this
->
w
,
&
visible_lines
,
&
start_line
,
textlist_state
(
this
->
g
,
this
->
w
,
&
visible_lines
,
&
start_line
,
&
number_of_lines
);
if
(
this
->
autoscroll
)
start_line
=
number_of_lines
-
visible_lines
;
else
start_line
-=
deleted
;
if
(
start_line
<
0
)
start_line
=
0
;
text
_
list_set_start_line
(
this
->
g
,
this
->
w
,
start_line
);
/* this call is not necessary, but if things change in text
_
list... */
textlist_set_start_line
(
this
->
g
,
this
->
w
,
start_line
);
/* this call is not necessary, but if things change in textlist... */
widget_dirty
(
this
->
g
,
this
->
w
);
}
if
(
pthread_mutex_unlock
(
&
this
->
lock
))
abort
();
...
...
@@ -92,7 +92,7 @@ static void scroll(void *private, gui *g,
if
(
pthread_mutex_lock
(
&
this
->
lock
))
abort
();
text
_
list_state
(
g
,
w
,
&
visible_lines
,
&
start_line
,
&
number_of_lines
);
textlist_state
(
g
,
w
,
&
visible_lines
,
&
start_line
,
&
number_of_lines
);
inc
=
10
;
if
(
inc
>
visible_lines
-
2
)
inc
=
visible_lines
-
2
;
if
(
inc
<
1
)
inc
=
1
;
...
...
@@ -103,7 +103,7 @@ static void scroll(void *private, gui *g,
new_line
=
number_of_lines
-
visible_lines
;
if
(
new_line
<
0
)
new_line
=
0
;
text
_
list_set_start_line
(
g
,
w
,
new_line
);
textlist_set_start_line
(
g
,
w
,
new_line
);
if
(
new_line
+
visible_lines
<
number_of_lines
)
this
->
autoscroll
=
0
;
...
...
@@ -127,7 +127,7 @@ static void click(void *private, gui *g,
if
(
pthread_mutex_unlock
(
&
this
->
lock
))
abort
();
}
view
*
new_textlist
(
int
maxsize
,
float
refresh_rate
,
gui
*
g
,
widget
*
w
)
view
*
new_
view_
textlist
(
int
maxsize
,
float
refresh_rate
,
gui
*
g
,
widget
*
w
)
{
struct
textlist
*
ret
=
calloc
(
1
,
sizeof
(
struct
textlist
));
if
(
ret
==
NULL
)
abort
();
...
...
common/utils/T/tracer/view/view.h
View file @
1dea1590
...
...
@@ -10,7 +10,7 @@ typedef struct view {
void
(
*
append
)(
struct
view
*
this
,
...);
}
view
;
view
*
new_stdout
(
void
);
view
*
new_textlist
(
int
maxsize
,
float
refresh_rate
,
gui
*
g
,
widget
*
w
);
view
*
new_
view_
stdout
(
void
);
view
*
new_
view_
textlist
(
int
maxsize
,
float
refresh_rate
,
gui
*
g
,
widget
*
w
);
#endif
/* _VIEW_H_ */
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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