Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
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
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
5d90377c
Commit
5d90377c
authored
Sep 01, 2018
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'upstream/master' into ce-to-ee-2018-09-01
parents
4584d760
f9b96bd2
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
164 additions
and
65 deletions
+164
-65
app/assets/javascripts/ide/components/repo_file.vue
app/assets/javascripts/ide/components/repo_file.vue
+7
-5
app/assets/stylesheets/framework/typography.scss
app/assets/stylesheets/framework/typography.scss
+1
-1
app/assets/stylesheets/framework/variables.scss
app/assets/stylesheets/framework/variables.scss
+1
-0
app/assets/stylesheets/page_bundles/ide.scss
app/assets/stylesheets/page_bundles/ide.scss
+1
-1
app/assets/stylesheets/pages/diff.scss
app/assets/stylesheets/pages/diff.scss
+0
-4
app/helpers/submodule_helper.rb
app/helpers/submodule_helper.rb
+20
-17
app/models/concerns/triggerable_hooks.rb
app/models/concerns/triggerable_hooks.rb
+1
-0
app/workers/background_migration_worker.rb
app/workers/background_migration_worker.rb
+1
-13
changelogs/unreleased/37356-relative-submodule-link.yml
changelogs/unreleased/37356-relative-submodule-link.yml
+5
-0
changelogs/unreleased/47765-group-visibility-error-due-to-string-conversion.yml
...47765-group-visibility-error-due-to-string-conversion.yml
+6
-0
changelogs/unreleased/ide-row-hover-scroll.yml
changelogs/unreleased/ide-row-hover-scroll.yml
+5
-0
changelogs/unreleased/remove-background-migration-worker-feature-flag.yml
...eased/remove-background-migration-worker-feature-flag.yml
+5
-0
changelogs/unreleased/sh-fix-confidential-note-option.yml
changelogs/unreleased/sh-fix-confidential-note-option.yml
+5
-0
changelogs/unreleased/update-padding-markdown.yml
changelogs/unreleased/update-padding-markdown.yml
+5
-0
lib/gitlab/git_access.rb
lib/gitlab/git_access.rb
+6
-0
lib/gitlab/import_export/project_tree_restorer.rb
lib/gitlab/import_export/project_tree_restorer.rb
+4
-1
qa/qa/page/view.rb
qa/qa/page/view.rb
+3
-1
spec/controllers/projects/hooks_controller_spec.rb
spec/controllers/projects/hooks_controller_spec.rb
+1
-0
spec/helpers/submodule_helper_spec.rb
spec/helpers/submodule_helper_spec.rb
+55
-20
spec/javascripts/ide/components/repo_file_spec.js
spec/javascripts/ide/components/repo_file_spec.js
+21
-0
spec/lib/gitlab/import_export/importer_spec.rb
spec/lib/gitlab/import_export/importer_spec.rb
+10
-0
spec/spec_helper.rb
spec/spec_helper.rb
+1
-0
spec/support/rspec.rb
spec/support/rspec.rb
+0
-2
No files found.
app/assets/javascripts/ide/components/repo_file.vue
View file @
5d90377c
...
@@ -95,16 +95,18 @@ export default {
...
@@ -95,16 +95,18 @@ export default {
return
this
.
file
.
changed
||
this
.
file
.
tempFile
||
this
.
file
.
staged
;
return
this
.
file
.
changed
||
this
.
file
.
tempFile
||
this
.
file
.
staged
;
},
},
},
},
watch
:
{
'
file.active
'
:
function
fileActiveWatch
(
active
)
{
if
(
this
.
file
.
type
===
'
blob
'
&&
active
)
{
this
.
scrollIntoView
();
}
},
},
mounted
()
{
mounted
()
{
if
(
this
.
hasPathAtCurrentRoute
())
{
if
(
this
.
hasPathAtCurrentRoute
())
{
this
.
scrollIntoView
(
true
);
this
.
scrollIntoView
(
true
);
}
}
},
},
updated
()
{
if
(
this
.
file
.
type
===
'
blob
'
&&
this
.
file
.
active
)
{
this
.
scrollIntoView
();
}
},
methods
:
{
methods
:
{
...
mapActions
([
'
toggleTreeOpen
'
]),
...
mapActions
([
'
toggleTreeOpen
'
]),
clickFile
()
{
clickFile
()
{
...
...
app/assets/stylesheets/framework/typography.scss
View file @
5d90377c
...
@@ -327,7 +327,7 @@ h6 {
...
@@ -327,7 +327,7 @@ h6 {
pre
{
pre
{
font-family
:
$monospace-font
;
font-family
:
$monospace-font
;
display
:
block
;
display
:
block
;
padding
:
$gl-padding-8
;
padding
:
$gl-padding-8
$input-horizontal-padding
;
margin
:
0
0
$gl-padding-8
;
margin
:
0
0
$gl-padding-8
;
font-size
:
13px
;
font-size
:
13px
;
word-break
:
break-all
;
word-break
:
break-all
;
...
...
app/assets/stylesheets/framework/variables.scss
View file @
5d90377c
...
@@ -237,6 +237,7 @@ $gl-vert-padding: 6px;
...
@@ -237,6 +237,7 @@ $gl-vert-padding: 6px;
$gl-padding-top
:
10px
;
$gl-padding-top
:
10px
;
$gl-sidebar-padding
:
22px
;
$gl-sidebar-padding
:
22px
;
$gl-bar-padding
:
3px
;
$gl-bar-padding
:
3px
;
$input-horizontal-padding
:
12px
;
/*
/*
* Misc
* Misc
...
...
app/assets/stylesheets/page_bundles/ide.scss
View file @
5d90377c
...
@@ -1145,7 +1145,7 @@ $ide-tree-text-start: $ide-activity-bar-width + $ide-tree-padding;
...
@@ -1145,7 +1145,7 @@ $ide-tree-text-start: $ide-activity-bar-width + $ide-tree-padding;
}
}
.avatar-container
{
.avatar-container
{
flex
:
initial
;
flex
:
0
0
auto
;
margin-right
:
0
;
margin-right
:
0
;
}
}
...
...
app/assets/stylesheets/pages/diff.scss
View file @
5d90377c
...
@@ -25,10 +25,6 @@
...
@@ -25,10 +25,6 @@
color
:
$gl-text-color
;
color
:
$gl-text-color
;
border-radius
:
0
0
3px
3px
;
border-radius
:
0
0
3px
3px
;
.code
{
padding
:
0
;
}
.unfold
{
.unfold
{
cursor
:
pointer
;
cursor
:
pointer
;
}
}
...
...
app/helpers/submodule_helper.rb
View file @
5d90377c
...
@@ -64,8 +64,7 @@ module SubmoduleHelper
...
@@ -64,8 +64,7 @@ module SubmoduleHelper
end
end
def
relative_self_url?
(
url
)
def
relative_self_url?
(
url
)
# (./)?(../repo.git) || (./)?(../../project/repo.git) )
url
.
start_with?
(
'../'
,
'./'
)
url
=~
%r{
\A
((
\.
/)?(
\.\.
/))(?!(
\.\.
)|(.*/)).*(
\.
git)?
\z
}
||
url
=~
%r{
\A
((
\.
/)?(
\.\.
/){2})(?!(
\.\.
))([^/]*)/(?!(
\.\.
)|(.*/)).*(
\.
git)?
\z
}
end
end
def
standard_links
(
host
,
namespace
,
project
,
commit
)
def
standard_links
(
host
,
namespace
,
project
,
commit
)
...
@@ -73,25 +72,29 @@ module SubmoduleHelper
...
@@ -73,25 +72,29 @@ module SubmoduleHelper
[
base
,
[
base
,
'/tree/'
,
commit
].
join
(
''
)]
[
base
,
[
base
,
'/tree/'
,
commit
].
join
(
''
)]
end
end
def
relative_self_links
(
url
,
commit
,
project
)
def
relative_self_links
(
relative_path
,
commit
,
project
)
url
.
rstrip!
relative_path
.
rstrip!
# Map relative links to a namespace and project
absolute_project_path
=
"/"
+
project
.
full_path
# For example:
# ../bar.git -> same namespace, repo bar
# Resolve `relative_path` to target path
# ../foo/bar.git -> namespace foo, repo bar
# Assuming `absolute_project_path` is `/g1/p1`:
# ../../foo/bar/baz.git -> namespace bar, repo baz
# ../p2.git -> /g1/p2
components
=
url
.
split
(
'/'
)
# ../g2/p3.git -> /g1/g2/p3
base
=
components
.
pop
.
gsub
(
/.git$/
,
''
)
# ../../g3/g4/p4.git -> /g3/g4/p4
namespace
=
components
.
pop
.
gsub
(
/^\.\.$/
,
''
)
submodule_project_path
=
File
.
absolute_path
(
relative_path
,
absolute_project_path
)
target_namespace_path
=
File
.
dirname
(
submodule_project_path
)
if
namespace
.
empty?
namespace
=
project
.
namespace
.
full_path
if
target_namespace_path
==
'/'
||
target_namespace_path
.
start_with?
(
absolute_project_path
)
return
[
nil
,
nil
]
end
end
target_namespace_path
.
sub!
(
%r{^/}
,
''
)
submodule_base
=
File
.
basename
(
submodule_project_path
,
'.git'
)
begin
begin
[
[
namespace_project_path
(
namespace
,
base
),
namespace_project_path
(
target_namespace_path
,
submodule_
base
),
namespace_project_tree_path
(
namespace
,
base
,
commit
)
namespace_project_tree_path
(
target_namespace_path
,
submodule_
base
,
commit
)
]
]
rescue
ActionController
::
UrlGenerationError
rescue
ActionController
::
UrlGenerationError
[
nil
,
nil
]
[
nil
,
nil
]
...
...
app/models/concerns/triggerable_hooks.rb
View file @
5d90377c
...
@@ -6,6 +6,7 @@ module TriggerableHooks
...
@@ -6,6 +6,7 @@ module TriggerableHooks
push_hooks: :push_events
,
push_hooks: :push_events
,
tag_push_hooks: :tag_push_events
,
tag_push_hooks: :tag_push_events
,
issue_hooks: :issues_events
,
issue_hooks: :issues_events
,
confidential_note_hooks: :confidential_note_events
,
confidential_issue_hooks: :confidential_issues_events
,
confidential_issue_hooks: :confidential_issues_events
,
note_hooks: :note_events
,
note_hooks: :note_events
,
merge_request_hooks: :merge_requests_events
,
merge_request_hooks: :merge_requests_events
,
...
...
app/workers/background_migration_worker.rb
View file @
5d90377c
...
@@ -10,17 +10,7 @@ class BackgroundMigrationWorker
...
@@ -10,17 +10,7 @@ class BackgroundMigrationWorker
# maintenance related tasks have plenty of time to clean up after a migration
# maintenance related tasks have plenty of time to clean up after a migration
# has been performed.
# has been performed.
def
self
.
minimum_interval
def
self
.
minimum_interval
if
enable_health_check?
2
.
minutes
.
to_i
2
.
minutes
.
to_i
else
5
.
minutes
.
to_i
end
end
def
self
.
enable_health_check?
Rails
.
env
.
development?
||
Rails
.
env
.
test?
||
Feature
.
enabled?
(
'background_migration_health_check'
)
end
end
# Performs the background migration.
# Performs the background migration.
...
@@ -86,8 +76,6 @@ class BackgroundMigrationWorker
...
@@ -86,8 +76,6 @@ class BackgroundMigrationWorker
# class_name - The name of the background migration that we might want to
# class_name - The name of the background migration that we might want to
# run.
# run.
def
healthy_database?
def
healthy_database?
return
true
unless
self
.
class
.
enable_health_check?
return
true
unless
Gitlab
::
Database
.
postgresql?
return
true
unless
Gitlab
::
Database
.
postgresql?
!
Postgresql
::
ReplicationSlot
.
lag_too_great?
!
Postgresql
::
ReplicationSlot
.
lag_too_great?
...
...
changelogs/unreleased/37356-relative-submodule-link.yml
0 → 100644
View file @
5d90377c
---
title
:
Fix git submodule link for subgroup projects with relative path
merge_request
:
21154
author
:
type
:
fixed
changelogs/unreleased/47765-group-visibility-error-due-to-string-conversion.yml
0 → 100644
View file @
5d90377c
---
title
:
Importing a project no longer fails when visibility level holds a string value
type
merge_request
:
21242
author
:
type
:
fixed
changelogs/unreleased/ide-row-hover-scroll.yml
0 → 100644
View file @
5d90377c
---
title
:
Fixed IDE file row scrolling into view when hovering
merge_request
:
author
:
type
:
fixed
changelogs/unreleased/remove-background-migration-worker-feature-flag.yml
0 → 100644
View file @
5d90377c
---
title
:
Remove health check feature flag in BackgroundMigrationWorker
merge_request
:
author
:
type
:
changed
changelogs/unreleased/sh-fix-confidential-note-option.yml
0 → 100644
View file @
5d90377c
---
title
:
Fix "Confidential comments" button not saving in project hooks
merge_request
:
21289
author
:
type
:
fixed
changelogs/unreleased/update-padding-markdown.yml
0 → 100644
View file @
5d90377c
---
title
:
Increase padding in code blocks
merge_request
:
author
:
type
:
fixed
lib/gitlab/git_access.rb
View file @
5d90377c
...
@@ -237,6 +237,8 @@ module Gitlab
...
@@ -237,6 +237,8 @@ module Gitlab
end
end
elsif
user
elsif
user
# User access is verified in check_change_access!
# User access is verified in check_change_access!
elsif
authed_via_jwt?
# Authenticated via JWT
else
else
raise
UnauthorizedError
,
ERROR_MESSAGES
[
:upload
]
raise
UnauthorizedError
,
ERROR_MESSAGES
[
:upload
]
end
end
...
@@ -344,6 +346,10 @@ module Gitlab
...
@@ -344,6 +346,10 @@ module Gitlab
!
Gitlab
.
config
.
gitlab_shell
.
receive_pack
!
Gitlab
.
config
.
gitlab_shell
.
receive_pack
end
end
def
authed_via_jwt?
false
end
protected
protected
def
check_size_limit?
def
check_size_limit?
...
...
lib/gitlab/import_export/project_tree_restorer.rb
View file @
5d90377c
...
@@ -94,7 +94,10 @@ module Gitlab
...
@@ -94,7 +94,10 @@ module Gitlab
end
end
def
restore_project
def
restore_project
@project
.
update_columns
(
project_params
)
Gitlab
::
Timeless
.
timeless
(
@project
)
do
@project
.
update
(
project_params
)
end
@project
@project
end
end
...
...
qa/qa/page/view.rb
View file @
5d90377c
require
'pathname'
module
QA
module
QA
module
Page
module
Page
class
View
class
View
...
@@ -9,7 +11,7 @@ module QA
...
@@ -9,7 +11,7 @@ module QA
end
end
def
pathname
def
pathname
@pathname
||=
Pathname
.
new
(
::
File
.
join
(
__dir__
,
'../../../'
,
@path
))
@pathname
||=
::
Pathname
.
new
(
::
File
.
join
(
__dir__
,
'../../../'
,
@path
))
.
cleanpath
.
expand_path
.
cleanpath
.
expand_path
end
end
...
...
spec/controllers/projects/hooks_controller_spec.rb
View file @
5d90377c
...
@@ -30,6 +30,7 @@ describe Projects::HooksController do
...
@@ -30,6 +30,7 @@ describe Projects::HooksController do
tag_push_events:
true
,
tag_push_events:
true
,
merge_requests_events:
true
,
merge_requests_events:
true
,
issues_events:
true
,
issues_events:
true
,
confidential_note_events:
true
,
confidential_issues_events:
true
,
confidential_issues_events:
true
,
note_events:
true
,
note_events:
true
,
job_events:
true
,
job_events:
true
,
...
...
spec/helpers/submodule_helper_spec.rb
View file @
5d90377c
...
@@ -162,42 +162,77 @@ describe SubmoduleHelper do
...
@@ -162,42 +162,77 @@ describe SubmoduleHelper do
end
end
context
'submodules with relative links'
do
context
'submodules with relative links'
do
let
(
:group
)
{
create
(
:group
,
name:
"
Master Project"
,
path:
"master-project
"
)
}
let
(
:group
)
{
create
(
:group
,
name:
"
top group"
,
path:
"top-group
"
)
}
let
(
:project
)
{
create
(
:project
,
group:
group
)
}
let
(
:project
)
{
create
(
:project
,
group:
group
)
}
let
(
:commit_id
)
{
sample_commit
[
:id
]
}
let
(
:repo
)
{
double
(
:repo
,
project:
project
)
}
def
expect_relative_link_to_resolve_to
(
relative_path
,
expected_path
)
allow
(
repo
).
to
receive
(
:submodule_url_for
).
and_return
(
relative_path
)
result
=
submodule_links
(
submodule_item
)
expect
(
result
).
to
eq
([
expected_path
,
"
#{
expected_path
}
/tree/
#{
submodule_item
.
id
}
"
])
end
it
'one level down'
do
it
'handles project under same group'
do
result
=
relative_self_links
(
'../test.git'
,
commit_id
,
project
)
expect_relative_link_to_resolve_to
(
'../test.git'
,
"/
#{
group
.
path
}
/test"
)
expect
(
result
).
to
eq
([
"/
#{
group
.
path
}
/test"
,
"/
#{
group
.
path
}
/test/tree/
#{
commit_id
}
"
])
end
end
it
'with trailing whitespace'
do
it
'handles trailing whitespace'
do
result
=
relative_self_links
(
'../test.git '
,
commit_id
,
project
)
expect_relative_link_to_resolve_to
(
'../test.git '
,
"/
#{
group
.
path
}
/test"
)
expect
(
result
).
to
eq
([
"/
#{
group
.
path
}
/test"
,
"/
#{
group
.
path
}
/test/tree/
#{
commit_id
}
"
])
end
end
it
'two levels down'
do
it
'handles project under another top group'
do
result
=
relative_self_links
(
'../../test.git'
,
commit_id
,
project
)
expect_relative_link_to_resolve_to
(
'../../baz/test.git '
,
"/baz/test"
)
expect
(
result
).
to
eq
([
"/
#{
group
.
path
}
/test"
,
"/
#{
group
.
path
}
/test/tree/
#{
commit_id
}
"
])
end
context
'repo path resolves to be located at root (namespace absent)'
do
it
'returns nil'
do
allow
(
repo
).
to
receive
(
:submodule_url_for
).
and_return
(
'../../test.git'
)
result
=
submodule_links
(
submodule_item
)
expect
(
result
).
to
eq
([
nil
,
nil
])
end
end
end
it
'one level down with namespace and repo'
do
context
'repo path resolves to be located underneath current project path'
do
result
=
relative_self_links
(
'../foobar/test.git'
,
commit_id
,
project
)
it
'returns nil because it is not possible to have repo nested under another repo'
do
expect
(
result
).
to
eq
([
"/foobar/test"
,
"/foobar/test/tree/
#{
commit_id
}
"
])
allow
(
repo
).
to
receive
(
:submodule_url_for
).
and_return
(
'./test.git'
)
result
=
submodule_links
(
submodule_item
)
expect
(
result
).
to
eq
([
nil
,
nil
])
end
end
end
it
'two levels down with namespace and repo'
do
context
'subgroup'
do
result
=
relative_self_links
(
'../foobar/baz/test.git'
,
commit_id
,
project
)
let
(
:sub_group
)
{
create
(
:group
,
parent:
group
,
name:
"sub group"
,
path:
"sub-group"
)
}
expect
(
result
).
to
eq
([
"/baz/test"
,
"/baz/test/tree/
#{
commit_id
}
"
])
let
(
:sub_project
)
{
create
(
:project
,
group:
sub_group
)
}
context
'project in sub group'
do
let
(
:project
)
{
sub_project
}
it
"handles referencing ancestor group's project"
do
expect_relative_link_to_resolve_to
(
'../../../top-group/test.git'
,
"/
#{
group
.
path
}
/test"
)
end
end
it
"handles referencing descendent group's project"
do
expect_relative_link_to_resolve_to
(
'../sub-group/test.git'
,
"/top-group/sub-group/test"
)
end
it
"handles referencing another top group's project"
do
expect_relative_link_to_resolve_to
(
'../../frontend/css/test.git'
,
"/frontend/css/test"
)
end
end
end
context
'personal project'
do
context
'personal project'
do
let
(
:user
)
{
create
(
:user
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
,
namespace:
user
.
namespace
)
}
let
(
:project
)
{
create
(
:project
,
namespace:
user
.
namespace
)
}
it
'one level down with personal project'
do
it
'handles referencing another personal project'
do
result
=
relative_self_links
(
'../test.git'
,
commit_id
,
project
)
expect_relative_link_to_resolve_to
(
'../test.git'
,
"/
#{
user
.
username
}
/test"
)
expect
(
result
).
to
eq
([
"/
#{
user
.
username
}
/test"
,
"/
#{
user
.
username
}
/test/tree/
#{
commit_id
}
"
])
end
end
end
end
end
end
...
...
spec/javascripts/ide/components/repo_file_spec.js
View file @
5d90377c
...
@@ -121,4 +121,25 @@ describe('RepoFile', () => {
...
@@ -121,4 +121,25 @@ describe('RepoFile', () => {
).
toContain
(
'
Locked by testuser
'
);
).
toContain
(
'
Locked by testuser
'
);
});
});
});
});
it
(
'
calls scrollIntoView if made active
'
,
done
=>
{
createComponent
({
file
:
{
...
file
(),
type
:
'
blob
'
,
active
:
false
,
},
level
:
0
,
});
spyOn
(
vm
,
'
scrollIntoView
'
);
vm
.
file
.
active
=
true
;
vm
.
$nextTick
(()
=>
{
expect
(
vm
.
scrollIntoView
).
toHaveBeenCalled
();
done
();
});
});
});
});
spec/lib/gitlab/import_export/importer_spec.rb
View file @
5d90377c
...
@@ -63,6 +63,16 @@ describe Gitlab::ImportExport::Importer do
...
@@ -63,6 +63,16 @@ describe Gitlab::ImportExport::Importer do
importer
.
execute
importer
.
execute
end
end
it
'sets the correct visibility_level when visibility level is a string'
do
project
.
create_or_update_import_data
(
data:
{
override_params:
{
visibility_level:
Gitlab
::
VisibilityLevel
::
PRIVATE
.
to_s
}
}
)
importer
.
execute
expect
(
project
.
visibility_level
).
to
eq
(
Gitlab
::
VisibilityLevel
::
PRIVATE
)
end
end
end
context
'when project successfully restored'
do
context
'when project successfully restored'
do
...
...
spec/spec_helper.rb
View file @
5d90377c
...
@@ -44,6 +44,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
...
@@ -44,6 +44,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
RSpec
.
configure
do
|
config
|
RSpec
.
configure
do
|
config
|
config
.
use_transactional_fixtures
=
false
config
.
use_transactional_fixtures
=
false
config
.
use_instantiated_fixtures
=
false
config
.
use_instantiated_fixtures
=
false
config
.
fixture_path
=
Rails
.
root
config
.
verbose_retry
=
true
config
.
verbose_retry
=
true
config
.
display_try_failure_messages
=
true
config
.
display_try_failure_messages
=
true
...
...
spec/support/rspec.rb
View file @
5d90377c
...
@@ -11,6 +11,4 @@ RSpec.configure do |config|
...
@@ -11,6 +11,4 @@ RSpec.configure do |config|
config
.
include
StubMetrics
config
.
include
StubMetrics
config
.
include
StubObjectStorage
config
.
include
StubObjectStorage
config
.
include
StubENV
config
.
include
StubENV
config
.
fixture_path
=
Rails
.
root
if
defined?
(
Rails
)
end
end
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