Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
vig
Sublinear Algorithms for VA
pseudo
Commits
dcd02d1e
Commit
dcd02d1e
authored
Sep 18, 2020
by
Kruyff,D.L.W. (Dylan)
Browse files
Sampled windows as MTS data
parent
97a23c50
Changes
9
Show whitespace changes
Inline
Side-by-side
AngularApp/prototype/src/app/labeling-window/labeling-window.component.css
View file @
dcd02d1e
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
margin-right
:
20px
;
margin-right
:
20px
;
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
border-right
:
groove
;
}
}
.subplot-container
{
.subplot-container
{
...
...
AngularApp/prototype/src/app/labeling-window/labeling-window.component.ts
View file @
dcd02d1e
...
@@ -78,19 +78,34 @@ export class LabelingWindowComponent implements OnInit {
...
@@ -78,19 +78,34 @@ export class LabelingWindowComponent implements OnInit {
}
}
}
}
this
.
topk
=
topk
;
this
.
topk
=
topk
;
this
.
subplots
=
[];
this
.
subplots
=
[];
for
(
const
window
of
this
.
topk
)
{
for
(
const
windowIndex
of
this
.
topk
)
{
this
.
subplots
.
push
(
const
window
=
this
.
service
.
rawValues
.
map
((
channel
)
=>
channel
.
slice
(
windowIndex
.
index
,
windowIndex
.
index
+
this
.
service
.
windowSize
));
{
const
data
=
[];
index
:
window
.
index
,
window
.
forEach
((
channel
,
index
)
=>
{
data
:
[{
data
.
push
({
x
:
[...
Array
(
this
.
service
.
windowSize
).
keys
()],
x
:
[...
Array
(
channel
.
length
).
keys
()],
y
:
this
.
service
.
rawValues
[
0
].
slice
(
window
.
index
,
window
.
index
+
this
.
service
.
windowSize
),
y
:
channel
,
type
:
'
line
'
type
:
'
line
'
,
}],
xaxis
:
'
x
'
,
yaxis
:
`y
${
index
+
2
}
`
,
});
});
const
subplots
=
[];
window
.
forEach
((
channel
,
index
)
=>
{
subplots
.
push
([
`xy
${
index
+
2
}
`
]);
});
const
plot
=
{
index
:
windowIndex
.
index
,
data
:
data
,
layout
:
{
layout
:
{
title
:
`Index:
${
window
.
index
.
toString
()}
Similarity:
${
window
.
frequency
.
toString
()}
%`
,
grid
:
{
rows
:
this
.
service
.
queryWindow
.
length
,
columns
:
1
,
subplots
:
subplots
,
},
showlegend
:
false
,
title
:
`Index:
${
windowIndex
.
index
.
toString
()}
Similarity:
${
windowIndex
.
frequency
.
toString
()}
%`
,
hovermode
:
'
closest
'
,
hovermode
:
'
closest
'
,
autosize
:
true
,
autosize
:
true
,
margin
:
{
margin
:
{
...
@@ -100,7 +115,7 @@ export class LabelingWindowComponent implements OnInit {
...
@@ -100,7 +115,7 @@ export class LabelingWindowComponent implements OnInit {
b
:
0
,
b
:
0
,
pad
:
4
pad
:
4
},
},
height
:
15
0
,
height
:
30
0
,
width
:
150
,
width
:
150
,
titlefont
:
{
titlefont
:
{
size
:
9
size
:
9
...
@@ -115,8 +130,14 @@ export class LabelingWindowComponent implements OnInit {
...
@@ -115,8 +130,14 @@ export class LabelingWindowComponent implements OnInit {
showticklabels
:
false
,
showticklabels
:
false
,
}
}
}
}
}
};
);
window
.
forEach
((
channel
,
index
)
=>
{
plot
.
layout
[
`yaxis
${
index
+
2
}
`
]
=
{
zeroline
:
false
,
showticklabels
:
false
,
};
});
this
.
subplots
.
push
(
plot
);
}
}
}
}
}
}
AngularApp/prototype/src/app/overview-window/overview-window.component.ts
View file @
dcd02d1e
...
@@ -73,7 +73,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -73,7 +73,7 @@ export class OverviewWindowComponent implements OnInit {
marker
:
{
marker
:
{
backgroundColor
:
'
#4caf50
'
backgroundColor
:
'
#4caf50
'
},
},
zIndex
:
20
,
zIndex
:
3
,
},
},
{
{
type
:
'
scatter
'
,
type
:
'
scatter
'
,
...
@@ -82,7 +82,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -82,7 +82,7 @@ export class OverviewWindowComponent implements OnInit {
marker
:
{
marker
:
{
backgroundColor
:
'
#f44336
'
backgroundColor
:
'
#f44336
'
},
},
zIndex
:
2
0
,
zIndex
:
2
,
},
},
{
{
type
:
'
scatter
'
,
type
:
'
scatter
'
,
...
@@ -91,7 +91,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -91,7 +91,7 @@ export class OverviewWindowComponent implements OnInit {
marker
:
{
marker
:
{
backgroundColor
:
'
#b1a343
'
backgroundColor
:
'
#b1a343
'
},
},
zIndex
:
20
,
zIndex
:
1
,
}
}
]
]
});
});
...
@@ -189,7 +189,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -189,7 +189,7 @@ export class OverviewWindowComponent implements OnInit {
backgroundColor
:
"
#4caf50
"
,
backgroundColor
:
"
#4caf50
"
,
});
});
}
else
{
}
else
{
this
.
badLabels
.
push
([
Number
(
index
),
0
]);
this
.
badLabels
.
push
([
Number
(
index
),
-
1
]);
this
.
markers
.
push
({
this
.
markers
.
push
({
type
:
'
area
'
,
type
:
'
area
'
,
// BUG: For some reason the range values are multiplied by 10
// BUG: For some reason the range values are multiplied by 10
...
@@ -204,6 +204,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -204,6 +204,7 @@ export class OverviewWindowComponent implements OnInit {
}
else
{
}
else
{
channel
.
series
[
0
].
values
=
this
.
goodLabels
;
channel
.
series
[
0
].
values
=
this
.
goodLabels
;
channel
.
series
[
1
].
values
=
this
.
badLabels
;
channel
.
series
[
1
].
values
=
this
.
badLabels
;
channel
.
series
[
2
].
values
=
[];
}
}
}
}
this
.
chart
.
setdata
({
this
.
chart
.
setdata
({
...
@@ -221,7 +222,7 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -221,7 +222,7 @@ export class OverviewWindowComponent implements OnInit {
const
labels
=
[];
const
labels
=
[];
const
markers
=
[];
const
markers
=
[];
for
(
const
index
of
candidates
)
{
for
(
const
index
of
candidates
)
{
labels
.
push
([
Number
(
index
),
0
]);
labels
.
push
([
Number
(
index
),
1
]);
markers
.
push
({
markers
.
push
({
type
:
'
area
'
,
type
:
'
area
'
,
// BUG: For some reason the range values are multiplied by 10
// BUG: For some reason the range values are multiplied by 10
...
@@ -231,10 +232,9 @@ export class OverviewWindowComponent implements OnInit {
...
@@ -231,10 +232,9 @@ export class OverviewWindowComponent implements OnInit {
}
}
for
(
const
channel
of
this
.
config
.
graphset
)
{
for
(
const
channel
of
this
.
config
.
graphset
)
{
if
(
channel
.
type
===
'
line
'
)
{
if
(
channel
.
type
===
'
line
'
)
{
channel
.
scaleX
.
markers
=
this
.
markers
;
channel
.
scaleX
.
markers
=
channel
.
scaleX
.
markers
.
concat
(
markers
)
;
}
else
{
}
else
{
channel
.
series
[
0
].
values
=
this
.
goodLabels
;
channel
.
series
[
2
].
values
=
labels
;
channel
.
series
[
1
].
values
=
this
.
badLabels
;
}
}
}
}
this
.
chart
.
setdata
({
this
.
chart
.
setdata
({
...
...
AngularApp/prototype/src/app/progress-view/progress-view.component.ts
View file @
dcd02d1e
...
@@ -139,6 +139,6 @@ export class ProgressViewComponent implements OnInit {
...
@@ -139,6 +139,6 @@ export class ProgressViewComponent implements OnInit {
}
}
public
get
amountOfCandidates
()
{
public
get
amountOfCandidates
()
{
return
1
;
//
this.similarity[this._sliderValue.toString()].length;
return
this
.
similarity
[
this
.
_sliderValue
.
toString
()].
length
;
}
}
}
}
AngularApp/prototype/src/app/query-window/query-window.component.ts
View file @
dcd02d1e
...
@@ -53,7 +53,7 @@ export class QueryWindowComponent implements OnInit {
...
@@ -53,7 +53,7 @@ export class QueryWindowComponent implements OnInit {
b
:
5
,
b
:
5
,
pad
:
4
pad
:
4
},
},
height
:
15
0
,
height
:
30
0
,
width
:
150
,
width
:
150
,
titlefont
:
{
titlefont
:
{
size
:
9
size
:
9
...
...
AngularApp/prototype/src/app/table-overview/table-overview.component.ts
View file @
dcd02d1e
...
@@ -105,7 +105,7 @@ export class TableOverviewComponent implements OnInit {
...
@@ -105,7 +105,7 @@ export class TableOverviewComponent implements OnInit {
return
this
.
distanceMetric
(
hash1
)
-
this
.
distanceMetric
(
hash2
);
return
this
.
distanceMetric
(
hash1
)
-
this
.
distanceMetric
(
hash2
);
});
});
if
(
this
.
service
.
queryWindow
)
{
if
(
this
.
service
.
queryWindow
)
{
const
queryEntry
=
this
.
calculateSignature
(
table
.
hash
,
this
.
service
.
queryWindow
);
const
queryEntry
=
this
.
calculateSignature
(
table
.
hash
,
this
.
service
.
queryWindow
[
0
]
);
listOfWindows
.
push
(
table
.
entries
[
queryEntry
]);
listOfWindows
.
push
(
table
.
entries
[
queryEntry
]);
opacity
=
orderedHashes
.
map
((
hash
:
string
)
=>
{
opacity
=
orderedHashes
.
map
((
hash
:
string
)
=>
{
return
hash
===
queryEntry
?
1.0
:
0.5
;
return
hash
===
queryEntry
?
1.0
:
0.5
;
...
...
Flaskserver/.idea/workspace.xml
View file @
dcd02d1e
...
@@ -3,7 +3,6 @@
...
@@ -3,7 +3,6 @@
<component
name=
"ChangeListManager"
>
<component
name=
"ChangeListManager"
>
<list
default=
"true"
id=
"556080ba-825c-4b55-a92a-867a4df4fb32"
name=
"Default Changelist"
comment=
""
>
<list
default=
"true"
id=
"556080ba-825c-4b55-a92a-867a4df4fb32"
name=
"Default Changelist"
comment=
""
>
<change
beforePath=
"$PROJECT_DIR$/main.py"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/main.py"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/main.py"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/main.py"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/processed-data.npy"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/processed-data.npy"
afterDir=
"false"
/>
</list>
</list>
<option
name=
"EXCLUDED_CONVERTED_TO_IGNORED"
value=
"true"
/>
<option
name=
"EXCLUDED_CONVERTED_TO_IGNORED"
value=
"true"
/>
<option
name=
"SHOW_DIALOG"
value=
"false"
/>
<option
name=
"SHOW_DIALOG"
value=
"false"
/>
...
@@ -16,8 +15,8 @@
...
@@ -16,8 +15,8 @@
<file
pinned=
"false"
current-in-tab=
"true"
>
<file
pinned=
"false"
current-in-tab=
"true"
>
<entry
file=
"file://$PROJECT_DIR$/main.py"
>
<entry
file=
"file://$PROJECT_DIR$/main.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
19
9"
>
<state
relative-caret-position=
"
-5
9"
>
<caret
line=
"
199
"
column=
"3
1
"
lean-forward=
"true"
selection-start-line=
"
199
"
selection-start-column=
"3
1
"
selection-end-line=
"
199
"
selection-end-column=
"3
1
"
/>
<caret
line=
"
275
"
column=
"3
8
"
lean-forward=
"true"
selection-start-line=
"
275
"
selection-start-column=
"3
8
"
selection-end-line=
"
275
"
selection-end-column=
"3
8
"
/>
<folding>
<folding>
<element
signature=
"e#0#41#0"
expanded=
"true"
/>
<element
signature=
"e#0#41#0"
expanded=
"true"
/>
</folding>
</folding>
...
@@ -58,9 +57,9 @@
...
@@ -58,9 +57,9 @@
</list>
</list>
</option>
</option>
</component>
</component>
<component
name=
"ProjectFrameBounds"
extendedState=
"
6
"
>
<component
name=
"ProjectFrameBounds"
extendedState=
"
7
"
>
<option
name=
"x"
value=
"-1
1
"
/>
<option
name=
"x"
value=
"-1
2
"
/>
<option
name=
"y"
value=
"-1
1
"
/>
<option
name=
"y"
value=
"-1
2
"
/>
<option
name=
"width"
value=
"1890"
/>
<option
name=
"width"
value=
"1890"
/>
<option
name=
"height"
value=
"960"
/>
<option
name=
"height"
value=
"960"
/>
</component>
</component>
...
@@ -70,7 +69,6 @@
...
@@ -70,7 +69,6 @@
<foldersAlwaysOnTop
value=
"true"
/>
<foldersAlwaysOnTop
value=
"true"
/>
</navigator>
</navigator>
<panes>
<panes>
<pane
id=
"Scope"
/>
<pane
id=
"ProjectPane"
>
<pane
id=
"ProjectPane"
>
<subPane>
<subPane>
<expand>
<expand>
...
@@ -82,6 +80,7 @@
...
@@ -82,6 +80,7 @@
<select
/>
<select
/>
</subPane>
</subPane>
</pane>
</pane>
<pane
id=
"Scope"
/>
</panes>
</panes>
</component>
</component>
<component
name=
"PropertiesComponent"
>
<component
name=
"PropertiesComponent"
>
...
@@ -144,17 +143,18 @@
...
@@ -144,17 +143,18 @@
<workItem
from=
"1599578907139"
duration=
"8436000"
/>
<workItem
from=
"1599578907139"
duration=
"8436000"
/>
<workItem
from=
"1599661275060"
duration=
"1249000"
/>
<workItem
from=
"1599661275060"
duration=
"1249000"
/>
<workItem
from=
"1600001984238"
duration=
"16778000"
/>
<workItem
from=
"1600001984238"
duration=
"16778000"
/>
<workItem
from=
"1600348467353"
duration=
"2026000"
/>
</task>
</task>
<servers
/>
<servers
/>
</component>
</component>
<component
name=
"TimeTrackingManager"
>
<component
name=
"TimeTrackingManager"
>
<option
name=
"totallyTimeSpent"
value=
"11
0834
000"
/>
<option
name=
"totallyTimeSpent"
value=
"11
2860
000"
/>
</component>
</component>
<component
name=
"ToolWindowManager"
>
<component
name=
"ToolWindowManager"
>
<frame
x=
"-7"
y=
"-7"
width=
"1295"
height=
"695"
extended-state=
"
6
"
/>
<frame
x=
"-7"
y=
"-7"
width=
"1295"
height=
"695"
extended-state=
"
7
"
/>
<editor
active=
"true"
/>
<editor
active=
"true"
/>
<layout>
<layout>
<window_info
active=
"true"
content_ui=
"combo"
id=
"Project"
order=
"0"
visible=
"true"
weight=
"0.2
8698465
"
/>
<window_info
active=
"true"
content_ui=
"combo"
id=
"Project"
order=
"0"
visible=
"true"
weight=
"0.2
918351
"
/>
<window_info
id=
"Structure"
order=
"1"
side_tool=
"true"
weight=
"0.25"
/>
<window_info
id=
"Structure"
order=
"1"
side_tool=
"true"
weight=
"0.25"
/>
<window_info
id=
"Favorites"
order=
"2"
side_tool=
"true"
/>
<window_info
id=
"Favorites"
order=
"2"
side_tool=
"true"
/>
<window_info
anchor=
"bottom"
id=
"Message"
order=
"0"
/>
<window_info
anchor=
"bottom"
id=
"Message"
order=
"0"
/>
...
@@ -210,8 +210,8 @@
...
@@ -210,8 +210,8 @@
</entry>
</entry>
<entry
file=
"file://$PROJECT_DIR$/main.py"
>
<entry
file=
"file://$PROJECT_DIR$/main.py"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"
19
9"
>
<state
relative-caret-position=
"
-5
9"
>
<caret
line=
"
199
"
column=
"3
1
"
lean-forward=
"true"
selection-start-line=
"
199
"
selection-start-column=
"3
1
"
selection-end-line=
"
199
"
selection-end-column=
"3
1
"
/>
<caret
line=
"
275
"
column=
"3
8
"
lean-forward=
"true"
selection-start-line=
"
275
"
selection-start-column=
"3
8
"
selection-end-line=
"
275
"
selection-end-column=
"3
8
"
/>
<folding>
<folding>
<element
signature=
"e#0#41#0"
expanded=
"true"
/>
<element
signature=
"e#0#41#0"
expanded=
"true"
/>
</folding>
</folding>
...
...
Flaskserver/__pycache__/main.cpython-38.pyc
View file @
dcd02d1e
No preview for this file type
Flaskserver/main.py
View file @
dcd02d1e
...
@@ -126,7 +126,6 @@ def create_tables():
...
@@ -126,7 +126,6 @@ def create_tables():
window_size
=
int
(
raw_data
[
'parameters'
][
"windowsize"
])
window_size
=
int
(
raw_data
[
'parameters'
][
"windowsize"
])
hash_size
=
int
(
raw_data
[
'parameters'
][
"hashsize"
])
hash_size
=
int
(
raw_data
[
'parameters'
][
"hashsize"
])
table_size
=
int
(
raw_data
[
'parameters'
][
"tablesize"
])
table_size
=
int
(
raw_data
[
'parameters'
][
"tablesize"
])
data
=
np
.
array
(
data
)
print
(
'Starting: '
+
str
(
time
()
-
t0
))
print
(
'Starting: '
+
str
(
time
()
-
t0
))
tables_hash_function
=
[
np
.
random
.
uniform
(
-
1
,
1
,
size
=
(
window_size
,
hash_size
))
for
_
in
range
(
table_size
)]
tables_hash_function
=
[
np
.
random
.
uniform
(
-
1
,
1
,
size
=
(
window_size
,
hash_size
))
for
_
in
range
(
table_size
)]
print
(
'Init time: '
+
str
(
time
()
-
t0
))
print
(
'Init time: '
+
str
(
time
()
-
t0
))
...
@@ -235,7 +234,7 @@ def average_progress():
...
@@ -235,7 +234,7 @@ def average_progress():
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
for
windows
in
all_windows
:
for
windows
in
all_windows
:
t1
=
time
()
t1
=
time
()
actual_windows
.
extend
(
data
[
windows
])
actual_windows
.
extend
(
[
item
[
0
]
for
item
in
data
[
windows
]
]
)
if
len
(
actual_windows
)
==
0
:
if
len
(
actual_windows
)
==
0
:
output
.
append
([])
output
.
append
([])
continue
continue
...
@@ -262,7 +261,7 @@ def average_table():
...
@@ -262,7 +261,7 @@ def average_table():
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
for
windows
in
all_windows
:
for
windows
in
all_windows
:
t1
=
time
()
t1
=
time
()
actual_windows
=
data
[
windows
]
actual_windows
=
[
item
[
0
]
for
item
in
data
[
windows
]
]
print
(
len
(
actual_windows
))
print
(
len
(
actual_windows
))
average_values
=
np
.
average
(
actual_windows
,
0
)
average_values
=
np
.
average
(
actual_windows
,
0
)
# average_values = (np.sum(actual_windows, 0) / len(actual_windows))
# average_values = (np.sum(actual_windows, 0) / len(actual_windows))
...
@@ -303,7 +302,8 @@ def update():
...
@@ -303,7 +302,8 @@ def update():
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
print
(
"Initialized: "
+
str
(
time
()
-
t0
))
for
t
in
tables
.
values
():
for
t
in
tables
.
values
():
valid
=
True
valid
=
True
signature
=
''
.
join
((
np
.
dot
(
window
,
t
[
"hash"
])
>
0
).
astype
(
'int'
).
astype
(
'str'
))
signature_bool
=
np
.
dot
([
1
,
1
,
1
],
np
.
dot
(
window
,
t
[
"hash"
]))
>
0
signature
=
''
.
join
([
'1'
if
x
else
'0'
for
x
in
signature_bool
])
neighbours
=
t
[
"entries"
][
signature
]
neighbours
=
t
[
"entries"
][
signature
]
for
index
in
correct_indices
:
for
index
in
correct_indices
:
if
index
not
in
neighbours
:
if
index
not
in
neighbours
:
...
@@ -321,7 +321,7 @@ def update():
...
@@ -321,7 +321,7 @@ def update():
t1
=
time
()
t1
=
time
()
while
True
:
while
True
:
hash_function
=
np
.
random
.
randn
(
window_size
,
hash_size
)
hash_function
=
np
.
random
.
randn
(
window_size
,
hash_size
)
correct_signatures
=
[
''
.
join
((
np
.
dot
(
data
[
i
],
hash_function
)
>
0
).
astype
(
'int'
).
astype
(
'str'
))
for
correct_signatures
=
[
''
.
join
(
np
.
dot
([
1
,
1
,
1
],
(
np
.
dot
(
data
[
i
],
hash_function
)
>
0
)
)
.
astype
(
'int'
).
astype
(
'str'
))
for
i
in
i
in
correct_indices
]
correct_indices
]
incorrect_signatures
=
[
''
.
join
((
np
.
dot
(
data
[
i
],
hash_function
)
>
0
).
astype
(
'int'
).
astype
(
'str'
))
for
incorrect_signatures
=
[
''
.
join
((
np
.
dot
(
data
[
i
],
hash_function
)
>
0
).
astype
(
'int'
).
astype
(
'str'
))
for
...
@@ -333,7 +333,7 @@ def update():
...
@@ -333,7 +333,7 @@ def update():
break
break
print
(
"first: "
+
str
(
time
()
-
t1
))
print
(
"first: "
+
str
(
time
()
-
t1
))
t2
=
time
()
t2
=
time
()
signatures_bool
=
np
.
dot
(
data
,
hash_function
)
>
0
signatures_bool
=
np
.
dot
([
1
,
1
,
1
],
np
.
dot
(
data
,
hash_function
)
)
>
0
signatures
=
[
''
.
join
([
'1'
if
x
else
'0'
for
x
in
lst
])
for
lst
in
signatures_bool
]
signatures
=
[
''
.
join
([
'1'
if
x
else
'0'
for
x
in
lst
])
for
lst
in
signatures_bool
]
for
i
in
range
(
len
(
signatures
)):
for
i
in
range
(
len
(
signatures
)):
entries
[
signatures
[
i
]].
append
(
i
)
entries
[
signatures
[
i
]].
append
(
i
)
...
...
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