Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
wolf
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mobile_robotics
wolf_projects
wolf_lib
wolf
Commits
1adfeae8
Commit
1adfeae8
authored
3 years ago
by
Joan Vallvé Navarro
Browse files
Options
Downloads
Patches
Plain Diff
[skip ci] wip
parent
99829e8b
No related branches found
No related tags found
1 merge request
!448
Draft: Resolve "Implementation of new nodes creation"
Pipeline
#11217
skipped
Changes
1
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
test/gtest_sensor_base.cpp
+80
-65
80 additions, 65 deletions
test/gtest_sensor_base.cpp
with
80 additions
and
65 deletions
test/gtest_sensor_base.cpp
+
80
−
65
View file @
1adfeae8
...
...
@@ -50,8 +50,12 @@ MatrixXd p_cov_2D = p_std_2D.cwiseAbs2().asDiagonal();
MatrixXd
p_cov_3D
=
p_std_3D
.
cwiseAbs2
().
asDiagonal
();
MatrixXd
o_cov_2D
=
o_std_2D
.
cwiseAbs2
().
asDiagonal
();
MatrixXd
o_cov_3D
=
o_std_3D
.
cwiseAbs2
().
asDiagonal
();
VectorXd
noise_std
=
Vector2d
::
Constant
(
0.1
);
MatrixXd
noise_cov
=
noise_std
.
cwiseAbs2
().
asDiagonal
();
double
noise_p_std
=
0.1
;
double
noise_o_std
=
0.01
;
VectorXd
noise_std_2D
=
(
Vector3d
()
<<
noise_p_std
,
noise_p_std
,
noise_o_std
).
finished
();
VectorXd
noise_std_3D
=
(
Vector3d
()
<<
noise_p_std
,
noise_p_std
,
noise_p_std
,
noise_o_std
,
noise_o_std
,
noise_o_std
).
finished
();
MatrixXd
noise_cov_2D
=
noise_std_2D
.
cwiseAbs2
().
asDiagonal
();
MatrixXd
noise_cov_3D
=
noise_std_3D
.
cwiseAbs2
().
asDiagonal
();
void
checkSensor
(
SensorBasePtr
S
,
char
_key
,
...
...
@@ -101,16 +105,17 @@ void checkSensor(SensorBasePtr S,
// 2D Fix
TEST
(
SensorBase
,
POfix2D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
2
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
2
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_2D
)},
//default "fix", not dynamic
{
'O'
,
Prior
(
"O"
,
o_state_2D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_2D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_2D
,
Constants
::
EPS
);
// checks
checkSensor
(
S
,
'P'
,
p_state_2D
,
true
,
vector0
,
false
,
vector0
);
...
...
@@ -120,16 +125,17 @@ TEST(SensorBase, POfix2D)
// 3D Fix
TEST
(
SensorBase
,
POfix3D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
)},
//default "fix", not dynamic
{
'O'
,
Prior
(
"O"
,
o_state_3D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -142,16 +148,17 @@ TEST(SensorBase, POfix3D)
// 2D Initial guess
TEST
(
SensorBase
,
POinitial_guess2D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
2
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
2
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_2D
,
"initial_guess"
)},
{
'O'
,
Prior
(
"O"
,
o_state_2D
,
"initial_guess"
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_2D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_2D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -164,16 +171,17 @@ TEST(SensorBase, POinitial_guess2D)
// 3D Initial guess
TEST
(
SensorBase
,
POinitial_guess3D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
,
"initial_guess"
)},
{
'O'
,
Prior
(
"O"
,
o_state_3D
,
"initial_guess"
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -186,16 +194,17 @@ TEST(SensorBase, POinitial_guess3D)
// 2D Factor
TEST
(
SensorBase
,
POfactor2D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
2
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
2
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_2D
,
"factor"
,
p_std_2D
)},
{
'O'
,
Prior
(
"O"
,
o_state_2D
,
"factor"
,
o_std_2D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_2D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_2D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
2
);
...
...
@@ -208,16 +217,17 @@ TEST(SensorBase, POfactor2D)
// 3D Factor
TEST
(
SensorBase
,
POfactor3D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
,
"factor"
,
p_std_3D
)},
{
'O'
,
Prior
(
"O"
,
o_state_3D
,
"factor"
,
o_std_3D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
2
);
...
...
@@ -230,16 +240,17 @@ TEST(SensorBase, POfactor3D)
// 2D Initial guess dynamic
TEST
(
SensorBase
,
POinitial_guess_dynamic2D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
2
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
2
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_2D
,
"initial_guess"
,
vector0
,
true
)},
{
'O'
,
Prior
(
"O"
,
o_state_2D
,
"initial_guess"
,
vector0
,
true
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_2D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_2D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -252,16 +263,17 @@ TEST(SensorBase, POinitial_guess_dynamic2D)
// 3D Initial guess dynamic
TEST
(
SensorBase
,
POinitial_guess_dynamic3D
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
,
"initial_guess"
,
vector0
,
true
)},
{
'O'
,
Prior
(
"O"
,
o_state_3D
,
"initial_guess"
,
vector0
,
true
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -274,16 +286,17 @@ TEST(SensorBase, POinitial_guess_dynamic3D)
// 2D Initial guess dynamic drift
TEST
(
SensorBase
,
POinitial_guess_dynamic2D_drift
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
2
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
2
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_2D
,
"initial_guess"
,
vector0
,
true
,
p_std_2D
)},
{
'O'
,
Prior
(
"O"
,
o_state_2D
,
"initial_guess"
,
vector0
,
true
,
o_std_2D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_2D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_2D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -296,16 +309,17 @@ TEST(SensorBase, POinitial_guess_dynamic2D_drift)
// 3D Initial guess dynamic drift
TEST
(
SensorBase
,
POinitial_guess_dynamic3D_drift
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
,
"initial_guess"
,
vector0
,
true
,
p_std_3D
)},
{
'O'
,
Prior
(
"O"
,
o_state_3D
,
"initial_guess"
,
vector0
,
true
,
o_std_3D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
0
);
...
...
@@ -318,20 +332,21 @@ TEST(SensorBase, POinitial_guess_dynamic3D_drift)
// 3D POI mixed
TEST
(
SensorBase
,
POI_mixed
)
{
auto
params
=
std
::
make_shared
<
ParamsSensorBase
>
();
params
->
noise_std
=
noise_std
;
auto
params
=
std
::
make_shared
<
ParamsSensorDummy
>
();
params
->
noise_p_std
=
noise_p_std
;
params
->
noise_o_std
=
noise_o_std
;
VectorXd
i_state_3D
=
VectorXd
::
Random
(
5
);
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor1"
,
3
,
params
,
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor1"
,
3
,
params
,
Priors
({{
'P'
,
Prior
(
"P"
,
p_state_3D
,
"fix"
,
vector0
,
true
)},
{
'O'
,
Prior
(
"O"
,
o_state_3D
,
"factor"
,
o_std_3D
,
true
,
o_std_3D
)},
{
'I'
,
Prior
(
"StateBlock"
,
i_state_3D
,
"initial_guess"
)},
{
'A'
,
Prior
(
"StateQuaternion"
,
o_state_3D
,
"factor"
,
o_std_3D
)}}));
// noise
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseStd
(),
noise_std
_3D
,
Constants
::
EPS
);
ASSERT_MATRIX_APPROX
(
S
->
getNoiseCov
(),
noise_cov
_3D
,
Constants
::
EPS
);
// factors
ASSERT_EQ
(
S
->
getPriorFeatures
().
size
(),
2
);
...
...
@@ -376,8 +391,8 @@ TEST(SensorBase, server_PO)
// CORRECT YAML
WOLF_INFO
(
"Creating sensor from name "
,
name
);
auto
params
=
std
::
make_shared
<
ParamsSensor
Base
>
(
name
,
server
);
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
name
,
dim
,
params
,
server
);
auto
params
=
std
::
make_shared
<
ParamsSensor
Dummy
>
(
name
,
server
);
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
name
,
dim
,
params
,
server
);
auto
p_size
=
dim
;
auto
o_size
=
dim
==
2
?
1
:
4
;
...
...
@@ -400,8 +415,8 @@ TEST(SensorBase, server_PO)
// INCORRECT YAML
WOLF_INFO
(
"Creating sensor from name "
,
name
+
"_wrong"
);
ASSERT_THROW
(
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
name
+
"_wrong"
,
dim
,
std
::
make_shared
<
ParamsSensor
Base
>
(
name
+
"_wrong"
,
server
),
ASSERT_THROW
(
std
::
make_shared
<
Sensor
Dummy
>
(
name
+
"_wrong"
,
dim
,
std
::
make_shared
<
ParamsSensor
Dummy
>
(
name
+
"_wrong"
,
server
),
server
),
std
::
runtime_error
);
}
}
...
...
@@ -421,8 +436,8 @@ TEST(SensorBase, server_POIA)
// POIA - 3D - CORRECT YAML
WOLF_INFO
(
"Creating sensor from name sensor_POIA_3D"
);
auto
params
=
std
::
make_shared
<
ParamsSensor
Base
>
(
"sensor_POIA_3D"
,
server
);
auto
S
=
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor_POIA_3D"
,
3
,
params
,
server
,
auto
params
=
std
::
make_shared
<
ParamsSensor
Dummy
>
(
"sensor_POIA_3D"
,
server
);
auto
S
=
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor_POIA_3D"
,
3
,
params
,
server
,
std
::
unordered_map
<
char
,
std
::
string
>
({{
'I'
,
"StateBlock"
},
{
'A'
,
"StateQuaternion"
}}));
...
...
@@ -449,8 +464,8 @@ TEST(SensorBase, server_POIA_wrong)
// POIA - 3D - INCORRECT YAML
WOLF_INFO
(
"Creating sensor from name sensor_POIA_3D_wrong"
);
ASSERT_THROW
(
std
::
make_shared
<
Sensor
Base
>
(
"SensorBase"
,
"sensor_POIA_3D_wrong"
,
3
,
std
::
make_shared
<
ParamsSensor
Base
>
(
"sensor_POIA_3D_wrong"
,
server
),
ASSERT_THROW
(
std
::
make_shared
<
Sensor
Dummy
>
(
"sensor_POIA_3D_wrong"
,
3
,
std
::
make_shared
<
ParamsSensor
Dummy
>
(
"sensor_POIA_3D_wrong"
,
server
),
server
,
std
::
unordered_map
<
char
,
std
::
string
>
({{
'I'
,
"StateBlock"
},
{
'A'
,
"StateQuaternion"
}})),
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
register
or
sign in
to comment