Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
open-source
MetaGer
Commits
ffe30296
Commit
ffe30296
authored
Feb 26, 2018
by
Karl Hasselbring
Browse files
Merge-Folgereparaturen
parent
e5aa5b61
Changes
11
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
ffe30296
...
...
@@ -24,3 +24,5 @@ langfiles.zip
**/*.map
/.buildpath
/.project
composer.lock
\ No newline at end of file
app/MetaGer.php
View file @
ffe30296
...
...
@@ -690,8 +690,7 @@ class MetaGer
return
$sumaName
===
"qualigo"
||
$sumaName
===
"similar_product_ads"
||
(
!
$overtureEnabled
&&
$sumaName
===
"overtureAds"
)
||
$sumaName
==
"rlvproduct"
;
||
(
!
$overtureEnabled
&&
$sumaName
===
"overtureAds"
);
}
public
function
sumaIsDisabled
(
$suma
)
...
...
@@ -780,7 +779,7 @@ class MetaGer
$realEngNames
=
[];
foreach
(
$enabledSearchengines
as
$realEng
)
{
$nam
=
$realEng
[
"name"
]
->
__toString
();
if
(
$nam
!==
"qualigo"
&&
$nam
!==
"overtureAds"
&&
$nam
!==
"rlvproduct"
)
{
if
(
$nam
!==
"qualigo"
&&
$nam
!==
"overtureAds"
)
{
$realEngNames
[]
=
$nam
;
}
}
...
...
public/js/searchbar.js
View file @
ffe30296
$
(
function
()
{
loadLocalStorage
();
setSearchbarActionListeners
();
});
/**
...
...
@@ -12,10 +11,6 @@ function loadLocalStorage () {
}
}
function
setSearchbarActionListeners
()
{
$
(
'
#toggleOptBtn
'
).
click
(
toggleOptionsDialog
);
}
function
setSettings
()
{
var
acceptedParams
=
[
'
autocomplete
'
,
'
key
'
,
'
lang
'
,
'
newtab
'
,
'
sprueche
'
];
for
(
var
key
in
localStorage
)
{
...
...
@@ -41,385 +36,4 @@ function setSettings () {
if
(
requestMethod
!==
null
&&
(
requestMethod
===
'
GET
'
||
requestMethod
===
'
POST
'
))
{
$
(
'
#searchForm
'
).
attr
(
'
method
'
,
requestMethod
);
}
}
function
toggleOptionsDialog
()
{
var
btnMode
=
$
(
'
#toggleOptBtn
'
).
attr
(
'
data-mode
'
);
if
(
btnMode
==
'
o
'
)
{
openOptionsDialog
();
}
else
{
closeOptionsDialog
();
}
}
function
openOptionsDialog
()
{
$
(
'
#toggleOptBtn
'
).
html
(
'
<i class="fa fa-chevron-up" aria-hidden="true"></i>
'
);
$
(
'
#toggleOptBtn
'
).
attr
(
'
data-mode
'
,
'
c
'
);
$
(
'
.search-option-frame
'
).
removeClass
(
'
hide
'
);
}
function
closeOptionsDialog
()
{
$
(
'
#toggleOptBtn
'
).
html
(
'
<i class="fa fa-sliders" aria-hidden="true"></i>
'
);
$
(
'
#toggleOptBtn
'
).
attr
(
'
data-mode
'
,
'
o
'
);
$
(
'
.search-option-frame
'
).
addClass
(
'
hide
'
);
}
$
(
function
()
{
setFocusCreatorActionListeners
();
loadInitialCustomFocuses
();
loadInitialSelectedFocus
();
focusChanged
();
});
/**
* Sets all action listeners for this page
*/
function
setFocusCreatorActionListeners
()
{
$
(
'
.focusCheckbox
'
).
click
(
checkboxCheckListener
);
$
(
'
#addFocusBtn
'
).
click
(()
=>
showFocusCreateDialog
(
''
));
$
(
'
#editFocusBtn
'
).
click
(
editCurrentFocus
);
$
(
'
.save-focus-btn
'
).
click
(
saveFocus
);
$
(
'
.delete-focus-btn
'
).
click
(
deleteFocus
);
$
(
'
#focus-select
'
).
change
(
focusChanged
);
// Save Focus on clicking enter while in the focus name input
$
(
'
#focus-name
'
).
keyup
(
function
(
event
)
{
if
(
event
.
keyCode
==
13
)
{
saveFocus
();
}
});
$
(
'
#create-focus-modal
'
).
on
(
'
shown.bs.modal
'
,
function
()
{
$
(
'
#focus-name
'
).
focus
();
});
}
/**
* Loads all the custom focuses stored in local storage
*/
function
loadInitialCustomFocuses
()
{
for
(
var
key
in
localStorage
)
{
if
(
key
.
startsWith
(
'
focus_
'
))
{
var
focus
=
loadFocusById
(
key
);
addFocus
(
focus
.
name
);
}
}
}
function
loadInitialSelectedFocus
()
{
setFocus
(
getFocusInUrl
());
}
/**
* Shows the focus create dialog
* If an id is given it will try to load a focus for the given id
*/
function
showFocusCreateDialog
(
id
)
{
if
(
id
===
undefined
)
{
id
=
''
;
}
document
.
getElementById
(
'
original-id
'
).
value
=
id
;
$
(
'
#create-focus-modal
'
).
modal
(
'
show
'
);
var
storedFocus
=
loadFocusById
(
id
);
var
focus
=
{};
// Try to load a focus for the given id
$
(
'
#focus-name
'
).
val
(
''
);
uncheckAll
();
if
(
storedFocus
!==
null
)
{
try
{
focus
=
JSON
.
parse
(
localStorage
.
getItem
(
id
));
$
(
'
#focus-name
'
).
val
(
focus
.
name
);
for
(
var
key
in
focus
)
{
if
(
key
.
startsWith
(
'
engine_
'
))
{
$
(
'
.focusCheckbox[name=
'
+
key
+
'
]
'
).
prop
(
'
checked
'
,
true
);
}
}
}
catch
(
ex
)
{
console
.
error
(
ex
);
}
}
toggleDeleteButton
();
}
/**
* Shows the focus create dialog for a given id
*/
function
showFocusEditDialog
(
id
)
{
showFocusCreateDialog
(
id
);
}
function
getCurrentFocus
()
{
return
$
(
"
#foki > div.active
"
).
attr
(
"
id
"
);
}
/**
* Shows an edit dialog for the current selected focus
*/
function
editCurrentFocus
()
{
var
currentFocus
=
getCurrentFocus
();
showFocusEditDialog
(
currentFocus
);
}
/**
* Shows/Hides the delete button if (no) checkboxes are selected
*/
function
toggleDeleteButton
()
{
if
(
atLeastOneChecked
())
{
$
(
'
.delete-focus-btn
'
).
show
();
}
else
{
$
(
'
.delete-focus-btn
'
).
hide
();
}
}
/**
* Save the current Focus
* Listens for save button
*/
function
saveFocus
()
{
/* Vorprüfungen */
// Falls keine Suchmaschine ausgewählt wurde
if
(
!
atLeastOneChecked
())
{
switch
(
document
.
documentElement
.
lang
)
{
case
'
en
'
:
alert
(
'
Please select at least 1 search engine.
'
);
break
;
case
'
es
'
:
alert
(
'
Por favor, seleccione al menos un motor de búsqueda.
'
);
break
;
default
:
alert
(
'
Bitte mindestens 1 Suchmaschine auswählen.
'
);
break
;
}
return
;
}
// Falls der Name zu kurz ist oder ungültige Zeichen enthält
var
name
=
document
.
getElementById
(
'
focus-name
'
).
value
;
if
(
!
isValidName
(
name
))
{
switch
(
document
.
documentElement
.
lang
)
{
case
'
en
'
:
alert
(
'
No characters other than a-z, A-Z, 0-9, ä, ö, ü, ß, -, _ allowed, at least 1 character
'
);
break
;
case
'
es
'
:
alert
(
'
Por favor, introduzca un nombre válido
'
);
break
;
default
:
alert
(
'
Bitte gültigen Namen eingeben:
\n
* Keine Sonderzeichen
\n
* Mindestens 1 Buchstabe
\n
'
);
break
;
}
return
;
}
// Liest die original-id des aktuellen fokus-dialogs (gesetzt wenn man einen Fokus bearbeitet)
var
oldId
=
document
.
getElementById
(
'
original-id
'
).
value
;
var
id
=
getIdFromName
(
name
);
var
overwrite
=
true
;
// Wenn bereits ein Fokus mit dem Namen existiert, man diesen aber nicht editiert sondern gerade einen Neuen erstellt
if
(
alreadyInUse
(
name
)
&&
oldId
!==
id
)
{
// Fragt den Nutzer ob er den Fokus überschreiben möchte
if
(
!
confirm
(
'
Name bereits genutzt
\n
überschreiben?
'
))
{
// Falls nicht wird das Speichern abgebrochen
return
;
}
// Ansonsten wird der andere Fokus gelöscht
deleteFocusById
(
id
);
}
/* Fokus speichern */
var
focus
=
{};
// Ausgewählte Suchmaschinen lesen und zu Fokus hinzufügen
$
(
'
input[type=checkbox]:checked
'
).
each
(
function
(
el
)
{
focus
[
$
(
this
).
attr
(
'
name
'
)]
=
$
(
this
).
val
();
});
// Name setzen
focus
[
'
name
'
]
=
name
;
// Alte Version des Fokus löschen (aus localStorage und von der Webseite, falls eine existiert)
if
(
oldId
!==
''
)
{
localStorage
.
removeItem
(
oldId
);
removeFocusById
(
oldId
);
}
// Neue Version des Fokus hinzufügen (zu localStorage und der Webseite)
localStorage
.
setItem
(
id
,
JSON
.
stringify
(
focus
));
addFocus
(
name
);
setFocus
(
id
);
// Fokus-Formular verbergen
$
(
'
#create-focus-modal
'
).
modal
(
'
hide
'
);
}
/**
* Delete current Focus
* Listens for delete button
*/
function
deleteFocusById
(
id
)
{
localStorage
.
removeItem
(
id
);
removeFocusById
(
id
);
$
(
'
#focus-select
'
).
change
();
}
/**
* Delete current Focus
* Listens for delete button
*/
function
deleteFocus
()
{
var
oldId
=
document
.
getElementById
(
'
original-id
'
).
value
;
deleteFocusById
(
oldId
);
$
(
'
#create-focus-modal
'
).
modal
(
'
hide
'
);
$
(
'
#focus-select
'
).
change
();
}
/**
* Is the name valid (in terms of characters)?
*/
function
isValidName
(
name
)
{
// no Characters other then a-z, A-Z, 0-9, ä, ö, ü, ß, -, _ allowed
// at least 1 character
return
/^
[
a-zA-Z0-9äöüß
\-
_
]
+$/
.
test
(
name
);
}
/**
* Is at least one focus selected?
*/
function
atLeastOneChecked
()
{
return
$
(
'
.focusCheckbox:checked
'
).
length
>
0
;
}
/**
* Is there already a focus with this name?
*/
function
alreadyInUse
(
name
)
{
return
localStorage
.
hasOwnProperty
(
getIdFromName
(
name
));
}
/**
* Adds an option to the focus selector
*/
function
addFocus
(
name
)
{
var
id
=
getIdFromName
(
name
);
var
customFocus
=
$
(
'
<div id="
'
+
id
+
'
"><a href="#" target="_self">
'
+
name
+
'
</a><a class="edit-focus" data-id="
'
+
id
+
'
" href="#"><i class="fa fa-wrench"></i></div>
'
);
$
(
customFocus
).
find
(
"
.edit-focus
"
).
click
(
function
(){
showFocusEditDialog
(
$
(
this
).
attr
(
"
data-id
"
));
});
$
(
"
#foki .search-option-frame
"
).
before
(
customFocus
);
}
/**
* Remove the focuses html-elements
*/
function
removeFocus
(
name
)
{
removeFocusById
(
getIdFromName
(
name
));
}
/**
* Remove the focuses html-elements
*/
function
removeFocusById
(
id
)
{
if
(
id
==
''
)
{
return
;
}
$
(
'
#focus-select option[value="
'
+
id
+
'
"]
'
).
remove
();
}
/**
* Turns a name into an id
* Converts special characters and spaces
*/
function
getIdFromName
(
name
)
{
name
=
name
.
toLowerCase
();
name
=
name
.
split
(
'
'
).
join
(
'
_
'
);
name
=
name
.
split
(
'
ä
'
).
join
(
'
ae
'
);
name
=
name
.
split
(
'
ö
'
).
join
(
'
oe
'
);
name
=
name
.
split
(
'
ü
'
).
join
(
'
ue
'
);
return
'
focus_
'
+
name
;
}
/**
* Loads the focus object for the given id from local storage
*/
function
loadFocusById
(
id
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
id
));
}
/**
* Unchecks all focuses from the focus creator dialog
*/
function
uncheckAll
()
{
$
(
'
.focusCheckbox
'
).
prop
(
'
checked
'
,
false
);
}
/**
* Sets the selected focus to default
*/
function
setFocusToDefault
()
{
setFocus
(
DEFAULT_FOCUS
);
}
/**
* Sets the selected focus
* @param {String} focusID The id of the focus, without #
*/
function
setFocus
(
focusID
)
{
$
(
'
#focus-select option[value="
'
+
focusID
+
'
"]
'
).
prop
(
'
selected
'
,
true
);
$
(
'
#focus-select
'
).
change
();
}
function
focusChanged
()
{
var
selectedFocus
=
getCurrentFocus
();
if
(
focusIsEditable
(
selectedFocus
))
{
enableEditFocusBtn
();
}
else
{
disableEditFocusBtn
();
}
loadFocusForSearch
(
selectedFocus
);
}
function
focusIsEditable
(
focus
)
{
if
(
focus
.
startsWith
(
'
focus_
'
))
{
return
true
;
}
else
{
return
false
;
}
}
function
enableEditFocusBtn
()
{
$
(
'
#editFocusBtn
'
).
removeClass
(
'
disabled
'
).
click
(
editCurrentFocus
);
}
function
disableEditFocusBtn
()
{
$
(
'
#editFocusBtn
'
).
addClass
(
'
disabled
'
).
off
(
'
click
'
);
}
function
loadFocusForSearch
(
focus
)
{
var
focus
=
loadFocusById
(
focus
);
var
url
=
"
/meta/meta.ger3?eingabe=x&focus=
"
;
console
.
log
(
focus
,
url
);
clearCustomSearch
();
for
(
var
key
in
focus
)
{
if
(
key
.
startsWith
(
'
engine_
'
)
&&
focus
[
key
]
==
'
on
'
)
{
addSumaToCustomSearch
(
key
);
}
}
}
function
getFocusInUrl
()
{
var
url
=
window
.
location
;
var
focReg
=
/focus=
(
focus_
\w
+
)
/
.
exec
(
url
);
if
(
focReg
&&
focReg
[
1
])
{
return
focReg
[
1
];
}
}
function
checkboxCheckListener
(
event
)
{
toggleDeleteButton
();
var
elem
=
event
.
target
;
if
(
elem
.
name
)
{
if
(
elem
.
checked
)
{
setCheckedForAllWithName
(
elem
.
name
,
true
);
}
else
{
setCheckedForAllWithName
(
elem
.
name
,
false
);
}
}
}
function
setCheckedForAllWithName
(
name
,
checked
)
{
$
(
'
.focusCheckbox[name=
'
+
name
+
'
]
'
).
prop
(
'
checked
'
,
checked
);
}
//# sourceMappingURL=searchbar.js.map
}
\ No newline at end of file
resources/assets/js/scriptStartPage.js
View file @
ffe30296
...
...
@@ -155,10 +155,6 @@ var isChrome = !!window.chrome && !!window.chrome.webstore;
// Blink engine detection
var
isBlink
=
(
isChrome
||
isOpera
)
&&
!!
window
.
CSS
;
// Prüft, ob der URL-Parameter "usage" auf "once" gesetzt ist.
alert
(
t
(
'
select-valid-name
'
));
}
else
if
(
atLeastOneChecked
())
{
alert
(
t
(
'
select-engine
'
));
}
else
{
function
loadSavedResults
()
{
var
results
=
new
Results
();
...
...
resources/assets/less/metager/result.less
View file @
ffe30296
...
...
@@ -42,7 +42,7 @@
text-overflow: ellipsis;
white-space: nowrap;
font-size: @result-font-small;
width:
fit-content
;
width:
auto
;
&,
&:active,
&:hover,
...
...
resources/views/index.blade.php
View file @
ffe30296
...
...
@@ -11,14 +11,6 @@
@
include
(
'parts.searchbar'
,
[
'class'
=>
'startpage-searchbar'
])
<
script
type
=
"text/javascript"
src
=
"{{ elixir('js/scriptStartPage.js') }}"
></
script
>
<
script
type
=
"text/javascript"
src
=
"{{ elixir('js/searchbar.js') }}"
></
script
>
<
hr
>
<
h4
>
{{
trans
(
'index.plugin.head.8'
)
}}
</
h4
>
<
ol
>
<
li
>
{
!!
trans
(
'index.plugin.firefox-klar.1'
)
!!
}
</
li
>
<
li
>
{{
trans
(
'index.plugin.firefox-klar.2'
)}}
<
img
src
=
"/img/FirefoxKlar-Settings.png"
width
=
"100%"
/></
li
>
<
li
>
{{
trans
(
'index.plugin.firefox-klar.3'
)
}}
<
img
src
=
"/img/FirefoxKlar-addSearchengine.png"
width
=
"100%"
/></
li
>
<
li
>
{{
trans
(
'index.plugin.firefox-klar.4'
)
}}
</
li
>
</
ol
>
<
script
src
=
"{{ elixir('js/translations.js') }}"
></
script
>
@
endsection
...
...
resources/views/layouts/staticPages.blade.php
View file @
ffe30296
...
...
@@ -35,12 +35,6 @@
<body>
<header>
@yield('homeIcon')
@if(LaravelLocalization::getCurrentLocale() == "de")
<li>
<a
href=
"https://shop.spreadshirt.de/metager/"
rel=
"noopener"
target=
"_blank"
>
MetaGer-Fanshop
</a>
</li>
@endif
</header>
@include('parts.sidebar', ['id' => 'staticPagesSideBar'])
<div
class=
"wrapper"
>
...
...
@@ -60,26 +54,6 @@
@yield('content')
</main>
@yield('optionalContent')
<div
class=
"hidden-xs mg-img"
>
</div>
<div
id=
"info"
>
<div
class=
"links"
>
<a
href=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
kontakt
")
}}"
>
{{ trans('staticPages.nav5') }}
</a>
<span>
-
</span>
<a
href=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
impressum
")
}}"
>
{{ trans('staticPages.nav8') }}
</a>
@if(LaravelLocalization::getCurrentLocale() == "de")
<span>
-
</span>
<a
href=
"https://shop.spreadshirt.de/metager/"
rel=
"noopener"
target=
"_blank"
>
Fanshop
</a>
@endif
</div>
<div>
{{ trans('staticPages.sumaev.1') }}
<a
href=
"https://www.suma-ev.de/"
>
{{ trans('staticPages.sumaev.2') }}
</a>
<div
class=
"hidden-xs mg-img"
>
<img
src=
"{{ action('ImageController@generateImage')}}?site={{ urlencode(url()->current()) }}"
class=
"hidden"
/>
</div>
@if (isset($page)
&&
$page === 'startpage')
@include('parts.footer', ['type' => 'startpage', 'id' => 'startPageFooter'])
...
...
resources/views/metager3.blade.php
View file @
ffe30296
...
...
@@ -22,17 +22,13 @@
</
div
>
@
endif
<
main
id
=
"results"
>
{{
--
Show
initial
products
or
ads
--
}}
@
if
(
$m
etager
->
getFokus
()
!==
"produktsuche"
&&
!
$apiAuthorized
)
@
include
(
'layouts.
products'
,
[
'products
'
=>
$metager
->
getProducts
()])
{{
--
Show
initial
ads
--
}}
@
if
(
$m
obile
)
@
include
(
'layouts.
ad'
,
[
'ad
'
=>
$metager
->
popAd
()])
@
else
@
if
(
$mobile
)
@
for
(
$i
=
0
;
$i
<=
2
;
$i
++
)
@
include
(
'layouts.ad'
,
[
'ad'
=>
$metager
->
popAd
()])
@
else
@
for
(
$i
=
0
;
$i
<=
2
;
$i
++
)
@
include
(
'layouts.ad'
,
[
'ad'
=>
$metager
->
popAd
()])
@
endfor
@
endif
@
endfor
@
endif
{{
--
Show
map
--
}}
{{
--
Create
results
and
ongoing
ads
--
}}
...
...
resources/views/metager3results.blade.php
View file @
ffe30296
...
...
@@ -19,16 +19,12 @@
</
div
>
@
endif
<
div
id
=
"results"
>
@
if
(
$m
etager
->
getFokus
()
!==
"produktsuche"
&&
!
$apiAuthorized
)
@
include
(
'layouts.
products'
,
[
'products
'
=>
$metager
->
getProducts
()])
@
if
(
$m
obile
)
@
include
(
'layouts.
ad'
,
[
'ad
'
=>
$metager
->
popAd
()])
@
else
@
if
(
$mobile
)
@
for
(
$i
=
0
;
$i
<=
2
;
$i
++
)
@
include
(
'layouts.ad'
,
[
'ad'
=>
$metager
->
popAd
()])
@
else
@
for
(
$i
=
0
;
$i
<=
2
;
$i
++
)
@
include
(
'layouts.ad'
,
[
'ad'
=>
$metager
->
popAd
()])
@
endfor
@
endif
@
endfor
@
endif
{{
--
Show
map
--
}}
{{
--
Create
results
and
ongoing
ads
--
}}
...
...
resources/views/parts/footer.blade.php
View file @
ffe30296
@
if
(
$type
===
'startpage'
||
$type
===
'subpage'
||
$type
===
'resultpage'
)
<
footer
class
=
"{{
$id
}} noprint"
>
<
div
id
=
"info"
>
<
span
><
a
href
=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
kontakt
") }}"
>
{{
trans
(
'staticPages.nav5'
)
}}
</
a
>
-
<
a
href
=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
impressum
") }}"
>
{{
trans
(
'staticPages.nav8'
)
}}
</
a
></
span
>
<
span
><
a
href
=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
kontakt
") }}"
>
{{
trans
(
'staticPages.nav5'
)
}}
</
a
>
-
<
a
href
=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
impressum
") }}"
>
{{
trans
(
'staticPages.nav8'
)
}}
</
a
>
@
if
(
LaravelLocalization
::
getCurrentLocale
()
==
"de"
)
-
<
a
href
=
"https://shop.spreadshirt.de/metager/"
rel
=
"noopener"
target
=
"_blank"
>
Fanshop
</
a
>@
endif
</
span
>
<
span
class
=
"hidden-xs"
>
{{
trans
(
'staticPages.sumaev.1'
)
}}
<
a
href
=
"https://www.suma-ev.de/"
>
{{
trans
(
'staticPages.sumaev.2'
)
}}
</
a
></
span
>
</
div
>
</
footer
>
...
...
resources/views/parts/sidebar.blade.php
View file @
ffe30296
...
...
@@ -82,6 +82,11 @@
<li>
<a
href=
"{{ LaravelLocalization::getLocalizedURL(LaravelLocalization::getCurrentLocale(), "
/
beitritt
/")
}}"
tabindex=
"203"
>
{{ trans('staticPages.nav23') }}
</a>
</li>
@if(LaravelLocalization::getCurrentLocale() == "de")
<li>
<a
href=
"https://shop.spreadshirt.de/metager/"
rel=
"noopener"
target=
"_blank"
>
MetaGer-Fanshop
</a>
</li>
@endif
<li>
<a
href=
"https://www.boost-project.com/de/shops?charity_id=1129&tag=bl"
tabindex=
"204"
>
{{ trans('staticPages.nav17') }}
</a>
</li>
...
...
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