misc: deps cleanup + form validation fixes

This commit is contained in:
Nick 2019-09-15 23:20:40 -04:00
parent 1717f7a8d3
commit 309de5bc17
32 changed files with 761 additions and 1193 deletions

View File

@ -3,7 +3,6 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import VueClipboards from 'vue-clipboards'
import VeeValidate from 'vee-validate'
import { ApolloClient } from 'apollo-client'
import { BatchHttpLink } from 'apollo-link-batch-http'
import { ApolloLink, split } from 'apollo-link'
@ -18,7 +17,6 @@ import Vuescroll from 'vuescroll/dist/vuescroll-native'
import Hammer from 'hammerjs'
import moment from 'moment'
import VueMoment from 'vue-moment'
import VueTour from 'vue-tour'
import store from './store'
import Cookies from 'js-cookie'
@ -57,15 +55,17 @@ const graphQLWSEndpoint = ((window.location.protocol === 'https:') ? 'wss:' : 'w
const graphQLLink = ApolloLink.from([
new ErrorLink(({ graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.map(({ message, locations, path }) =>
console.error(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
)
)
let isAuthError = false
graphQLErrors.map(({ message, locations, path }) => {
if (message === `Forbidden`) {
isAuthError = true
}
console.error(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`)
})
store.commit('showNotification', {
style: 'red',
message: `An unexpected error occured.`,
icon: 'warning'
message: isAuthError ? `You are not authorized to access this resource.` : `An unexpected error occured.`,
icon: 'alert'
})
}
if (networkError) {
@ -73,7 +73,7 @@ const graphQLLink = ApolloLink.from([
store.commit('showNotification', {
style: 'red',
message: `Network Error: ${networkError.message}`,
icon: 'error'
icon: 'alert'
})
}
}),
@ -138,11 +138,9 @@ Vue.use(VueApollo)
Vue.use(VueClipboards)
Vue.use(localization.VueI18Next)
Vue.use(helpers)
Vue.use(VeeValidate, { mode: 'eager' })
Vue.use(Vuetify)
Vue.use(VueMoment, { moment })
Vue.use(Vuescroll)
Vue.use(VueTour)
Vue.prototype.Velocity = Velocity

View File

@ -1,7 +1,6 @@
/* eslint-disable import/first */
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import VeeValidate from 'vee-validate'
import boot from './modules/boot'
/* eslint-enable import/first */
@ -9,7 +8,6 @@ window.WIKI = null
window.boot = boot
Vue.use(Vuetify)
Vue.use(VeeValidate, { events: '' })
Vue.component('setup', () => import(/* webpackMode: "eager" */ './components/setup.vue'))

View File

@ -103,10 +103,12 @@
v-list-item(to='/dev-flags')
v-list-item-title {{ $t('admin:dev.flags.title') }}
v-list-item(to='/dev-graphiql')
v-list-item(href='/graphql')
v-list-item-title {{ $t('admin:dev.graphiql.title') }}
v-list-item(to='/dev-voyager')
v-list-item-title {{ $t('admin:dev.voyager.title') }}
//- v-list-item(to='/dev-graphiql')
//- v-list-item-title {{ $t('admin:dev.graphiql.title') }}
//- v-list-item(to='/dev-voyager')
//- v-list-item-title {{ $t('admin:dev.voyager.title') }}
v-divider.my-2
v-list-item(to='/contribute')
v-list-item-avatar(size='24'): v-icon mdi-heart-outline
@ -163,8 +165,6 @@ const router = new VueRouter({
{ path: '/utilities', component: () => import(/* webpackChunkName: "admin" */ './admin/admin-utilities.vue') },
{ path: '/webhooks', component: () => import(/* webpackChunkName: "admin" */ './admin/admin-webhooks.vue') },
{ path: '/dev-flags', component: () => import(/* webpackChunkName: "admin-dev" */ './admin/admin-dev-flags.vue') },
{ path: '/dev-graphiql', component: () => import(/* webpackChunkName: "admin-dev" */ './admin/admin-dev-graphiql.vue') },
{ path: '/dev-voyager', component: () => import(/* webpackChunkName: "admin-dev" */ './admin/admin-dev-voyager.vue') },
{ path: '/contribute', component: () => import(/* webpackChunkName: "admin" */ './admin/admin-contribute.vue') }
]
})

View File

@ -1,101 +0,0 @@
<template lang='pug'>
v-container(fluid, grid-list-lg)
v-layout(row, wrap)
v-flex(xs12)
.admin-header
img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
.admin-header-title
.headline.primary--text Developer Tools
.subtitle-1.grey--text GraphiQL
v-card.mt-3.white.grey--text.text--darken-3
#graphiql
</template>
<script>
import _ from 'lodash'
import React from 'react'
import ReactDOM from 'react-dom'
import GraphiQL from 'graphiql'
import 'graphiql/graphiql.css'
const fetcher = (qry, respType) => {
return fetch('/graphql', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(qry),
credentials: 'include'
}).then(response => {
if (respType === 'json') {
return response.json()
} else {
return response.text()
}
}).then(responseBody => {
try {
return JSON.parse(responseBody)
} catch (error) {
return responseBody
}
})
}
export default {
data() {
return { }
},
mounted() {
let graphiQLInstance
ReactDOM.render(
React.createElement(GraphiQL, {
ref(el) { graphiQLInstance = el },
async fetcher(qry) {
let resp = await fetcher(qry, 'text')
_.delay(() => {
graphiQLInstance.resultComponent.viewer.refresh()
}, 500)
return resp
},
response: null,
variables: '{}',
operationName: null,
websocketConnectionParams: null
}),
document.getElementById('graphiql')
)
graphiQLInstance.queryEditorComponent.editor.refresh()
graphiQLInstance.variableEditorComponent.editor.refresh()
graphiQLInstance.state.variableEditorOpen = true
graphiQLInstance.state.docExplorerOpen = true
}
}
</script>
<style lang='scss'>
#graphiql {
height: calc(100vh - 270px);
.topBar {
background-color: mc('grey', '200');
background-image: none;
padding: 1.5rem 0;
> .title {
display: none;
}
}
.toolbar {
background-color: initial;
box-shadow: initial;
}
.doc-explorer-title-bar, .history-title-bar {
height: auto;
}
}
</style>

View File

@ -1,93 +0,0 @@
<template lang='pug'>
v-container(fluid, grid-list-lg)
v-layout(row, wrap)
v-flex(xs12)
.admin-header
img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
.admin-header-title
.headline.primary--text Developer Tools
.subtitle-1.grey--text Voyager
v-card.mt-3.white.grey--text.text--darken-3
#voyager
</template>
<script>
import _ from 'lodash'
import React from 'react'
import ReactDOM from 'react-dom'
import { Voyager } from 'graphql-voyager'
import 'graphql-voyager/dist/voyager.css'
const fetcher = (qry, respType) => {
return fetch('/graphql', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(qry),
credentials: 'include'
}).then(response => {
if (respType === 'json') {
return response.json()
} else {
return response.text()
}
}).then(responseBody => {
try {
return JSON.parse(responseBody)
} catch (error) {
return responseBody
}
})
}
export default {
data() {
return {}
},
mounted() {
_.delay(() => {
ReactDOM.render(
React.createElement(Voyager, {
introspection: qry => fetcher({ query: qry }, 'json'),
workerURI: '/js/voyager.worker.js'
}),
document.getElementById('voyager')
)
}, 500)
}
}
</script>
<style lang='scss'>
#voyager {
height: calc(100vh - 270px);
.title-area {
display: none;
}
.type-doc {
margin-top: 5px;
}
.doc-navigation {
> span {
overflow-y: hidden;
display: block;
}
min-height: 40px;
}
.contents {
padding-bottom: 0;
color: #666;
}
.type-info-popover {
display: none;
}
}
</style>

View File

@ -23,12 +23,12 @@
<script>
import _ from 'lodash'
import { Terminal } from 'xterm'
import * as fit from 'xterm/lib/addons/fit/fit'
// import { Terminal } from 'xterm'
// import * as fit from 'xterm/lib/addons/fit/fit'
import livetrailSubscription from 'gql/admin/logging/logging-subscription-livetrail.gql'
Terminal.applyAddon(fit)
// Terminal.applyAddon(fit)
export default {
term: null,
@ -48,7 +48,7 @@ export default {
value(newValue, oldValue) {
if (newValue) {
_.delay(() => {
this.term = new Terminal()
// this.term = new Terminal()
this.term.open(this.$refs.consoleContainer)
this.term.writeln('Connecting to \x1B[1;3;31mconsole output\x1B[0m...')

View File

@ -70,6 +70,7 @@
:label='$t("navigation.label")'
prepend-icon='mdi-format-title'
v-model='current.label'
counter='255'
)
v-text-field(
outlined

View File

@ -23,11 +23,6 @@
prepend-icon='mdi-at'
v-model='email'
label='Email Address'
v-validate='{ required: true, email: true, min: 2, max: 255 }',
data-vv-name='email',
data-vv-as='Email Address',
data-vv-scope='newUser',
:error-messages='errors.collect(`newUser.email`)'
key='newUserEmail'
persistent-hint
ref='emailInput'
@ -41,11 +36,6 @@
:label='mustChangePwd ? `Temporary Password` : `Password`'
counter='255'
@click:append='generatePwd'
v-validate='{ required: true, min: 6, max: 255 }',
data-vv-name='password',
data-vv-as='Password',
data-vv-scope='newUser',
:error-messages='errors.collect(`newUser.password`)'
key='newUserPassword'
persistent-hint
)
@ -54,11 +44,6 @@
prepend-icon='mdi-account-outline'
v-model='name'
label='Name'
v-validate='{ required: true, min: 2, max: 255 }',
data-vv-name='name',
data-vv-as='Name',
data-vv-scope='newUser',
:error-messages='errors.collect(`newUser.name`)'
:hint='provider === `local` ? `Can be changed by the user.` : `May be overwritten by the provider during login.`'
key='newUserName'
persistent-hint
@ -94,16 +79,17 @@
v-card-chin
v-spacer
v-btn(text, @click='isShown = false') Cancel
v-btn.px-3(depressed, color='primary', @click='newUser(false)', :disabled='errors.any(`newUser`)')
v-btn.px-3(depressed, color='primary', @click='newUser(false)')
v-icon(left) mdi-chevron-right
span Create
v-btn.px-3(depressed, color='primary', @click='newUser(true)', :disabled='errors.any(`newUser`)')
v-btn.px-3(depressed, color='primary', @click='newUser(true)')
v-icon(left) mdi-chevron-double-right
span Create and Close
</template>
<script>
import _ from 'lodash'
import validate from 'validate.js'
import createUserMutation from 'gql/admin/users/users-mutation-create.gql'
import providersQuery from 'gql/admin/users/users-query-strategies.gql'
@ -138,20 +124,54 @@ export default {
watch: {
value(newValue, oldValue) {
if (newValue) {
this.$validator.reset()
this.$nextTick(() => {
this.$refs.emailInput.focus()
})
}
},
provider(newValue, oldValue) {
this.$validator.reset()
}
},
methods: {
async newUser(close = false) {
const validationSuccess = await this.$validator.validateAll('newUser')
if (!validationSuccess) {
let rules = {
email: {
presence: {
allowEmpty: false
},
email: true
},
name: {
presence: {
allowEmpty: false
},
length: {
minimum: 2,
maximum: 255
}
}
}
if (this.provider === `local`) {
rules.password = {
presence: {
allowEmpty: false
},
length: {
minimum: 6,
maximum: 255
}
}
}
const validationResults = validate({
email: this.email,
password: this.password,
name: this.name
}, rules, { format: 'flat' })
if (validationResults) {
this.$store.commit('showNotification', {
style: 'red',
message: validationResults[0],
icon: 'alert'
})
return
}
@ -192,7 +212,7 @@ export default {
this.$store.commit('showNotification', {
style: 'red',
message: _.get(resp, 'data.users.create.responseResult.message', 'An unexpected error occured.'),
icon: 'warning'
icon: 'alert'
})
}
} catch (err) {

View File

@ -1,13 +1,13 @@
<template lang='pug'>
v-card.wiki-form
v-card
v-toolbar(flat, color='primary', dark, dense)
.subtitle-1 {{ $t('admin:utilities.importv1Title') }}
v-card-text
.text-xs-center
.text-center
img.animated.fadeInUp.wait-p1s(src='/svg/icon-software.svg')
.body-2 Import from Wiki.js 1.x
v-divider.my-4
.body-1 Data from a Wiki.js 1.x installation can be imported easily using this tool. What do you want to import?
.body-2 Data from a Wiki.js 1.x installation can easily be imported using this tool. What do you want to import?
v-checkbox(
label='Content'
value='content'
@ -29,9 +29,9 @@
v-model='importFilters'
hide-details
)
v-divider.my-3
v-divider.my-5
v-text-field.mt-3(
outline
outlined
label='MongoDB Connection String'
hint='The connection string to connect to the Wiki.js 1.x MongoDB database.'
persistent-hint
@ -39,7 +39,7 @@
v-if='needDB'
)
v-text-field.mt-3(
outline
outlined
label='Content Repo Path'
hint='The full path to where the Wiki.js 1.x content is stored on disk.'
persistent-hint
@ -47,18 +47,39 @@
v-if='needDisk'
)
v-card-chin
v-btn(depressed, color='deep-orange darken-2', :disabled='!needDB && !needDisk').ml-0
v-icon(left, color='white') label_important
v-btn.px-3(depressed, color='deep-orange darken-2', :disabled='!needDB && !needDisk', @click='startImport').ml-0
v-icon(left, color='white') mdi-database-import
span.white--text Start Import
v-dialog(
v-model='isLoading'
persistent
max-width='350'
)
v-card(color='deep-orange darken-2', dark)
v-card-text.pa-10.text-center
semipolar-spinner.animated.fadeIn(
:animation-duration='1500'
:size='65'
color='#FFF'
style='margin: 0 auto;'
)
.mt-5.body-1.white--text Importing from Wiki.js 1.x...
.caption Please wait
</template>
<script>
import { SemipolarSpinner } from 'epic-spinners'
export default {
components: {
SemipolarSpinner
},
data() {
return {
importFilters: ['content', 'uploads'],
importFilters: ['content', 'uploads', 'users'],
dbConnStr: 'mongodb://',
contentPath: '/wiki-v1/repo'
contentPath: '/wiki-v1/repo',
isLoading: false
}
},
computed: {
@ -68,6 +89,11 @@ export default {
needDisk() {
return this.importFilters.indexOf('content') >= 0 || this.importFilters.indexOf('uploads') >= 0
}
},
methods: {
async startImport () {
this.isLoading = true
}
}
}
</script>

View File

@ -72,7 +72,7 @@ export default {
key: 'UtilityImportv1',
icon: 'mdi-database-import',
i18nKey: 'importv1',
isAvailable: false
isAvailable: true
},
{
key: 'UtilityTelemetry',

View File

@ -209,6 +209,10 @@ export default {
.highlighted {
background: #FFF linear-gradient(to bottom, #FFF, mc('orange', '100'));
@at-root .theme--dark & {
background: mc('grey', '900') linear-gradient(to bottom, mc('orange', '900'), darken(mc('orange', '900'), 15%));
}
}
}

View File

@ -65,7 +65,6 @@ export default {
editorCode: () => import(/* webpackChunkName: "editor-code", webpackMode: "lazy" */ './editor/editor-code.vue'),
editorCkeditor: () => import(/* webpackChunkName: "editor-ckeditor", webpackMode: "lazy" */ './editor/editor-ckeditor.vue'),
editorMarkdown: () => import(/* webpackChunkName: "editor-markdown", webpackMode: "lazy" */ './editor/editor-markdown.vue'),
editorWysiwyg: () => import(/* webpackChunkName: "editor-wysiwyg", webpackMode: "lazy" */ './editor/editor-wysiwyg.vue'),
editorModalEditorselect: () => import(/* webpackChunkName: "editor", webpackMode: "eager" */ './editor/editor-modal-editorselect.vue'),
editorModalProperties: () => import(/* webpackChunkName: "editor", webpackMode: "eager" */ './editor/editor-modal-properties.vue'),
editorModalUnsaved: () => import(/* webpackChunkName: "editor", webpackMode: "eager" */ './editor/editor-modal-unsaved.vue'),

View File

@ -1,12 +1,64 @@
<template lang='pug'>
.editor-code
.editor-code-main
.editor-code-sidebar
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.animated.fadeInLeft(icon, tile, v-on='on', dark, disabled).mx-0
v-icon mdi-link-plus
span {{$t('editor:markup.insertLink')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p1s(icon, tile, v-on='on', dark, @click='toggleModal(`editorModalMedia`)').mx-0
v-icon(:color='activeModal === `editorModalMedia` ? `teal` : ``') mdi-folder-multiple-image
span {{$t('editor:markup.insertAssets')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p2s(icon, tile, v-on='on', dark, @click='toggleModal(`editorModalBlocks`)', disabled).mx-0
v-icon(:color='activeModal === `editorModalBlocks` ? `teal` : ``') mdi-view-dashboard-outline
span {{$t('editor:markup.insertBlock')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p3s(icon, tile, v-on='on', dark, disabled).mx-0
v-icon mdi-code-braces
span {{$t('editor:markup.insertCodeBlock')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p4s(icon, tile, v-on='on', dark, disabled).mx-0
v-icon mdi-library-video
span {{$t('editor:markup.insertVideoAudio')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p5s(icon, tile, v-on='on', dark, disabled).mx-0
v-icon mdi-chart-multiline
span {{$t('editor:markup.insertDiagram')}}
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p6s(icon, tile, v-on='on', dark, disabled).mx-0
v-icon mdi-function-variant
span {{$t('editor:markup.insertMathExpression')}}
template(v-if='$vuetify.breakpoint.mdAndUp')
v-spacer
v-tooltip(right, color='teal')
template(v-slot:activator='{ on }')
v-btn.mt-3.animated.fadeInLeft.wait-p8s(icon, tile, v-on='on', dark, @click='toggleFullscreen').mx-0
v-icon mdi-arrow-expand-all
span {{$t('editor:markup.distractionFreeMode')}}
.editor-code-editor
codemirror(ref='cm', v-model='code', :options='cmOptions', @ready='onCmReady', @input='onCmInput')
textarea(ref='cm')
v-system-bar.editor-code-sysbar(dark, status, color='grey darken-3')
.caption.editor-code-sysbar-locale {{locale.toUpperCase()}}
.caption.px-3 /{{path}}
template(v-if='$vuetify.breakpoint.mdAndUp')
v-spacer
.caption Code
v-spacer
.caption Ln {{cursorPos.line + 1}}, Col {{cursorPos.ch + 1}}
</template>
<script>
import _ from 'lodash'
import { get, sync } from 'vuex-pathify'
// ========================================
// IMPORTS
@ -17,24 +69,21 @@ import CodeMirror from 'codemirror'
import 'codemirror/lib/codemirror.css'
// Language
import 'codemirror/mode/markdown/markdown.js'
import 'codemirror/mode/htmlmixed/htmlmixed.js'
// Addons
import 'codemirror/addon/selection/active-line.js'
import 'codemirror/addon/display/fullscreen.js'
import 'codemirror/addon/display/fullscreen.css'
import 'codemirror/addon/selection/mark-selection.js'
import 'codemirror/addon/scroll/annotatescrollbar.js'
import 'codemirror/addon/search/matchesonscrollbar.js'
import 'codemirror/addon/search/searchcursor.js'
import 'codemirror/addon/search/match-highlighter.js'
// ========================================
// INIT
// ========================================
// Platform detection
const CtrlKey = /Mac/.test(navigator.platform) ? 'Cmd' : 'Ctrl'
// const CtrlKey = /Mac/.test(navigator.platform) ? 'Cmd' : 'Ctrl'
// ========================================
// Vue Component
@ -43,57 +92,170 @@ const CtrlKey = /Mac/.test(navigator.platform) ? 'Cmd' : 'Ctrl'
export default {
data() {
return {
code: '<h1>Title</h1>\n\n<p>Some text here</p>',
cmOptions: {
tabSize: 2,
mode: 'text/html',
theme: 'wikijs-dark',
lineNumbers: true,
lineWrapping: true,
line: true,
styleActiveLine: true,
highlightSelectionMatches: {
annotateScrollbar: true
},
viewportMargin: 50
}
cm: null,
cursorPos: { ch: 0, line: 1 }
}
},
computed: {
cm() {
return this.$refs.cm.codemirror
},
isMobile() {
return this.$vuetify.breakpoint.smAndDown
}
},
locale: get('page/locale'),
path: get('page/path'),
mode: get('editor/mode'),
activeModal: sync('editor/activeModal')
},
methods: {
onCmReady(cm) {
let self = this
const keyBindings = {
'F11' (cm) {
cm.setOption('fullScreen', !cm.getOption('fullScreen'))
},
'Esc' (cm) {
if (cm.getOption('fullScreen')) cm.setOption('fullScreen', false)
}
}
_.set(keyBindings, `${CtrlKey}-S`, cm => {
self.$parent.save()
})
cm.setSize(null, 'calc(100vh - 64px)')
cm.setOption('extraKeys', keyBindings)
this.onCmInput(this.code)
toggleModal(key) {
this.activeModal = (this.activeModal === key) ? '' : key
this.helpShown = false
},
onCmInput: _.debounce(function (newContent) {
this.$store.set('editor/content', newContent)
}, 500)
closeAllModal() {
this.activeModal = ''
this.helpShown = false
},
/**
* Insert content at cursor
*/
insertAtCursor({ content }) {
const cursor = this.cm.doc.getCursor('head')
this.cm.doc.replaceRange(content, cursor)
},
/**
* Insert content after current line
*/
insertAfter({ content, newLine }) {
const curLine = this.cm.doc.getCursor('to').line
const lineLength = this.cm.doc.getLine(curLine).length
this.cm.doc.replaceRange(newLine ? `\n${content}\n` : content, { line: curLine, ch: lineLength + 1 })
},
/**
* Insert content before current line
*/
insertBeforeEachLine({ content, after }) {
let lines = []
if (!this.cm.doc.somethingSelected()) {
lines.push(this.cm.doc.getCursor('head').line)
} else {
lines = _.flatten(this.cm.doc.listSelections().map(sl => {
const range = Math.abs(sl.anchor.line - sl.head.line) + 1
const lowestLine = (sl.anchor.line > sl.head.line) ? sl.head.line : sl.anchor.line
return _.times(range, l => l + lowestLine)
}))
}
lines.forEach(ln => {
let lineContent = this.cm.doc.getLine(ln)
const lineLength = lineContent.length
if (_.startsWith(lineContent, content)) {
lineContent = lineContent.substring(content.length)
}
this.cm.doc.replaceRange(content + lineContent, { line: ln, ch: 0 }, { line: ln, ch: lineLength })
})
if (after) {
const lastLine = _.last(lines)
this.cm.doc.replaceRange(`\n${after}\n`, { line: lastLine, ch: this.cm.doc.getLine(lastLine).length + 1 })
}
},
/**
* Update cursor state
*/
positionSync(cm) {
this.cursorPos = cm.getCursor('head')
},
toggleFullscreen () {
this.cm.setOption('fullScreen', true)
},
refresh() {
this.$nextTick(() => {
this.cm.refresh()
})
}
},
mounted() {
this.$store.set('editor/editorKey', 'code')
if (this.mode === 'create') {
this.$store.set('editor/content', '<h1>Title</h1>\n\n<p>Some text here</p>')
}
// Initialize CodeMirror
this.cm = CodeMirror.fromTextArea(this.$refs.cm, {
tabSize: 2,
mode: 'text/html',
theme: 'wikijs-dark',
lineNumbers: true,
lineWrapping: true,
line: true,
styleActiveLine: true,
highlightSelectionMatches: {
annotateScrollbar: true
},
viewportMargin: 50,
inputStyle: 'contenteditable',
allowDropFileTypes: ['image/jpg', 'image/png', 'image/svg', 'image/jpeg', 'image/gif']
})
this.cm.setValue(this.$store.get('editor/content'))
this.cm.on('change', c => {
this.$store.set('editor/content', c.getValue())
})
if (this.$vuetify.breakpoint.mdAndUp) {
this.cm.setSize(null, 'calc(100vh - 64px - 24px)')
} else {
this.cm.setSize(null, 'calc(100vh - 56px - 16px)')
}
// Set Keybindings
const keyBindings = {
'F11' (c) {
c.setOption('fullScreen', !c.getOption('fullScreen'))
},
'Esc' (c) {
if (c.getOption('fullScreen')) c.setOption('fullScreen', false)
}
}
this.cm.setOption('extraKeys', keyBindings)
// Handle cursor movement
this.cm.on('cursorActivity', c => {
this.positionSync(c)
})
// Render initial preview
this.$root.$on('editorInsert', opts => {
switch (opts.kind) {
case 'IMAGE':
let img = `<img src="${opts.path}" alt="${opts.text}"`
if (opts.align && opts.align !== '') {
img += ` class="align-${opts.align}"`
}
img += ` />`
this.insertAtCursor({
content: img
})
break
case 'BINARY':
this.insertAtCursor({
content: `<a href="${opts.path}" title="${opts.text}">${opts.text}</a>`
})
break
}
})
},
beforeDestroy() {
this.$root.$off('editorInsert')
}
}
</script>
<style lang='scss'>
$editor-height: calc(100vh - 64px - 24px);
$editor-height-mobile: calc(100vh - 56px - 16px);
.editor-code {
&-main {
display: flex;
@ -104,7 +266,7 @@ export default {
background-color: darken(mc('grey', '900'), 4.5%);
flex: 1 1 50%;
display: block;
height: calc(100vh - 96px);
height: $editor-height;
position: relative;
&-title {
@ -130,6 +292,35 @@ export default {
}
}
&-sidebar {
background-color: mc('grey', '900');
width: 64px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
padding: 24px 0;
@include until($tablet) {
padding: 12px 0;
width: 40px;
}
}
&-sysbar {
padding-left: 0;
&-locale {
background-color: rgba(255,255,255,.25);
display:inline-flex;
padding: 0 12px;
height: 24px;
width: 63px;
justify-content: center;
align-items: center;
}
}
// ==========================================
// CODE MIRROR
// ==========================================
@ -180,10 +371,10 @@ export default {
background: mc('blue','800');
}
.cm-s-wikijs-dark .CodeMirror-line::selection, .cm-s-wikijs-dark .CodeMirror-line > span::selection, .cm-s-wikijs-dark .CodeMirror-line > span > span::selection {
background: mc('red', '500');
background: mc('amber', '500');
}
.cm-s-wikijs-dark .CodeMirror-line::-moz-selection, .cm-s-wikijs-dark .CodeMirror-line > span::-moz-selection, .cm-s-wikijs-dark .CodeMirror-line > span > span::-moz-selection {
background: mc('red', '500');
background: mc('amber', '500');
}
.cm-s-wikijs-dark .CodeMirror-gutters {
background: darken(mc('grey','900'), 6%);

View File

@ -26,25 +26,15 @@
)
.body-2.mt-7 Coming Soon
v-flex(xs4)
v-hover
template(v-slot:default='{ hover }')
v-card.radius-7.grey.animated.fadeInUp.wait-p1s(
hover
light
ripple
)
v-card-text.text-center(@click='')
img(src='/svg/editor-icon-code.svg', alt='Code', style='width: 36px;')
.body-2.mt-2.grey--text.text--darken-2 Code
.caption.grey--text.text--darken-1 Raw HTML
v-fade-transition
v-overlay(
v-if='hover'
absolute
color='primary'
opacity='.8'
)
.body-2.mt-7 Coming Soon
v-card.radius-7.animated.fadeInUp.wait-p1s(
hover
light
ripple
)
v-card-text.text-center(@click='selectEditor("code")')
img(src='/svg/editor-icon-code.svg', alt='Code', style='width: 36px;')
.body-2.primary--text.mt-2 Code
.caption.grey--text Raw HTML
v-flex(xs4)
v-card.radius-7.animated.fadeInUp.wait-p2s(
hover
@ -75,17 +65,6 @@
opacity='.8'
)
.body-2.mt-7 Coming Soon
//- v-flex(xs4)
//- v-card.radius-7.grey(
//- hover
//- light
//- ripple
//- disabled
//- )
//- v-card-text.text-center(@click='selectEditor("wysiwyg")')
//- img(src='/svg/icon-open-in-browser.svg', alt='Visual Builder', style='width: 36px;')
//- .body-2.mt-2.grey--text.text--darken-2 Visual Builder
//- .caption.grey--text.text--darken-1 Drag-n-drop
v-flex(xs4)
v-card.radius-7.animated.fadeInUp.wait-p4s(
hover

View File

@ -568,6 +568,16 @@ export default {
}
}
&.is-editor-code {
top: 64px;
height: calc(100vh - 64px - 26px);
@include until($tablet) {
top: 56px;
height: calc(100vh - 56px - 24px);
}
}
.filepond--root {
margin-bottom: 0;
}

View File

@ -1,62 +0,0 @@
<template lang='pug'>
.editor-wysiwyg
div(ref='editor')
</template>
<script>
import 'grapesjs/dist/css/grapes.min.css'
import grapesjs from 'grapesjs'
let editor // eslint-disable-line no-unused-vars
export default {
mounted() {
editor = grapesjs.init({
container: this.$refs.editor,
width: 'auto',
height: 'calc(100vh - 64px)',
storageManager: { type: null },
// panels: { defaults: [] }
blockManager: {
blocks: [
{
id: 'section', // id is mandatory
label: '<b>Section</b>', // You can use HTML/SVG inside labels
attributes: { class: 'gjs-block-section' },
content: `<section>
<h1>This is a simple title</h1>
<div>This is just a Lorem text: Lorem ipsum dolor sit amet</div>
</section>`
}, {
id: 'text',
label: 'Text',
content: '<div data-gjs-type="text">Insert your text here</div>'
}, {
id: 'image',
label: 'Image',
// Select the component once it's dropped
select: true,
// You can pass components as a JSON instead of a simple HTML string,
// in this case we also use a defined component type `image`
content: { type: 'image' },
// This triggers `active` event on dropped components and the `image`
// reacts by opening the AssetManager
activate: true
}
]
}
})
}
}
</script>
<style lang="scss">
.gjs-block {
width: auto;
height: auto;
min-height: auto;
}
</style>

View File

@ -4,15 +4,16 @@
v-container
v-layout
v-flex(xs12, lg6, offset-lg3)
v-card.radius-7
v-card.radius-7.animated.fadeInUp
.text-center
img.setup-logo(src='/svg/logo-wikijs.svg', alt='Wiki.js Logo')
v-alert(tile, color='indigo lighten-5', :value='true')
img.setup-logo.animated.fadeInUp.wait-p2s(src='/svg/logo-wikijs-full.svg', alt='Wiki.js Logo')
v-alert(v-model='error', type='error', icon='mdi-alert', tile, dismissible) {{ errorMessage }}
v-alert(v-if='!error', tile, color='indigo lighten-5', :value='true')
v-icon.mr-3(color='indigo') mdi-package-variant
span.indigo--text You are about to install Wiki.js #[strong {{wikiVersion}}].
v-card-text
.overline.pl-3 Create Administrator Account
v-container.pa-3(grid-list-xl)
.overline.pl-3 Administrator Account
v-container.pa-3.mt-3(grid-list-xl)
v-layout(row, wrap)
v-flex(xs12)
v-text-field(
@ -21,11 +22,7 @@
label='Administrator Email',
hint='The email address of the administrator account.',
persistent-hint
v-validate='{ required: true, email: true }',
data-vv-name='adminEmail',
data-vv-as='Administrator Email',
data-vv-scope='admin',
:error-messages='errors.collect(`admin.adminEmail`)'
required
ref='adminEmailInput'
)
v-flex(xs6)
@ -40,11 +37,6 @@
:type="pwdMode ? 'password' : 'text'"
hint='At least 8 characters long.',
persistent-hint
v-validate='{ required: true, min: 8 }',
data-vv-name='adminPassword',
data-vv-as='Password',
data-vv-scope='admin',
:error-messages='errors.collect(`admin.adminPassword`)'
)
v-flex(xs6)
v-text-field(
@ -58,11 +50,6 @@
:type="pwdConfirmMode ? 'password' : 'text'"
hint='Verify your password again.',
persistent-hint
v-validate='{ required: true, min: 8 }',
data-vv-name='adminPasswordConfirm',
data-vv-as='Confirm Password',
data-vv-scope='admin',
:error-messages='errors.collect(`admin.adminPasswordConfirm`)'
@keyup.enter='install'
)
v-divider.mb-4
@ -73,10 +60,9 @@
persistent-hint,
hint='Help Wiki.js developers improve this app with anonymized telemetry.'
)
v-alert(:value='error', type='error', icon='mdi-alert') {{ errorMessage }}
v-divider.mt-3(v-if='!error')
v-divider.mt-2
v-card-actions
v-btn(color='primary', @click='install', :disabled='loading', x-large, flat, block)
v-btn(color='primary', @click='install', :disabled='loading', x-large, depressed, block)
v-icon(left) mdi-check
span Install
@ -98,8 +84,8 @@
</template>
<script>
import axios from 'axios'
import _ from 'lodash'
import validate from 'validate.js'
import { BreedingRhombusSpinner } from 'epic-spinners'
export default {
@ -135,27 +121,60 @@ export default {
},
methods: {
async install () {
const validationSuccess = await this.$validator.validateAll('admin')
if (!validationSuccess || this.conf.adminPassword !== this.conf.adminPasswordConfirm) {
this.error = false
const validationResults = validate(this.conf, {
adminEmail: {
presence: {
allowEmpty: false
},
email: true
},
adminPassword: {
presence: {
allowEmpty: false
},
length: {
minimum: 6,
maximum: 255
}
},
adminPasswordConfirm: {
equality: 'adminPassword'
}
}, {
format: 'flat'
})
if (validationResults) {
this.error = true
this.errorMessage = validationResults[0]
this.$forceUpdate()
return
}
this.loading = true
this.success = false
this.error = false
this.$forceUpdate()
_.delay(async () => {
try {
const resp = await axios.post('/finalize', this.conf)
if (resp.data.ok === true) {
const resp = await fetch('/finalize', {
method: 'POST',
cache: 'no-cache',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(this.conf)
}).then(res => res.json())
if (resp.ok === true) {
this.success = true
_.delay(() => {
window.location.assign('/login')
}, 3000)
} else {
this.error = true
this.errorMessage = resp.data.error
this.errorMessage = resp.error
this.loading = false
}
} catch (err) {
@ -178,8 +197,8 @@ export default {
}
&-logo {
width: 300px;
margin: 3rem 0 2rem 0;
width: 400px;
margin: 2rem 0 2rem 0;
}
}
</style>

View File

@ -1,6 +1,6 @@
query {
search {
searchEngines(orderBy: "title ASC") {
searchEngines(orderBy: "title") {
isEnabled
key
title

View File

@ -14,8 +14,8 @@
// @import '../libs/twemoji/twemoji-awesome';
// @import '../libs/prism/prism.css';
@import '~vue-tour/dist/vue-tour.css';
@import '~xterm/dist/xterm.css';
// @import '~vue-tour/dist/vue-tour.css';
// @import '~xterm/dist/xterm.css';
// @import 'node_modules/diff2html/dist/diff2html.min';
@import 'pages/new';

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 398 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="M218.013,20.338c-1.206,1.206 -1.809,2.688 -1.809,4.447c0,1.76 0.603,3.255 1.809,4.486c1.206,1.231 2.688,1.846 4.449,1.846c1.758,0 3.252,-0.615 4.484,-1.846c1.231,-1.231 1.847,-2.726 1.847,-4.486c0,-1.759 -0.616,-3.241 -1.847,-4.447c-1.232,-1.206 -2.726,-1.81 -4.484,-1.81c-1.761,0 -3.243,0.604 -4.449,1.81Zm0.339,14.661c-1.13,1.131 -1.695,2.502 -1.695,4.109l0,30.53c0,0.805 0.15,1.572 0.452,2.3c0.301,0.729 0.716,1.356 1.243,1.884c0.528,0.528 1.143,0.943 1.848,1.244c0.703,0.301 1.457,0.452 2.262,0.452c1.606,0 2.988,-0.577 4.145,-1.734c1.155,-1.155 1.734,-2.536 1.734,-4.146l0,-30.53c0,-0.803 -0.15,-1.557 -0.452,-2.261c-0.303,-0.703 -0.717,-1.32 -1.243,-1.848c-0.529,-0.527 -1.158,-0.942 -1.886,-1.243c-0.729,-0.302 -1.495,-0.452 -2.298,-0.452c-1.61,0 -2.978,0.565 -4.11,1.695Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
<path d="M277.263,20.338c-1.206,1.206 -1.809,2.688 -1.809,4.447c0,1.76 0.603,3.255 1.809,4.486c1.207,1.231 2.688,1.846 4.449,1.846c1.758,0 3.253,-0.615 4.484,-1.846c1.231,-1.231 1.848,-2.726 1.848,-4.486c0,-1.759 -0.617,-3.241 -1.848,-4.447c-1.231,-1.206 -2.726,-1.81 -4.484,-1.81c-1.761,0 -3.242,0.604 -4.449,1.81Zm0.34,14.661c-1.13,1.131 -1.696,2.502 -1.696,4.109l0,30.53c0,0.805 0.15,1.572 0.452,2.3c0.301,0.729 0.716,1.356 1.244,1.884c0.527,0.528 1.142,0.943 1.847,1.244c0.703,0.301 1.457,0.452 2.262,0.452c1.607,0 2.988,-0.577 4.146,-1.734c1.154,-1.155 1.734,-2.536 1.734,-4.146l0,-30.53c0,-0.803 -0.151,-1.557 -0.453,-2.261c-0.303,-0.703 -0.717,-1.32 -1.243,-1.848c-0.529,-0.527 -1.157,-0.942 -1.886,-1.243c-0.729,-0.302 -1.495,-0.452 -2.298,-0.452c-1.61,0 -2.978,0.565 -4.109,1.695Z" style="fill:url(#_Linear2);fill-rule:nonzero;"/>
<path d="M296.485,61.384c-0.904,0.377 -1.684,0.905 -2.338,1.584c-0.652,0.678 -1.168,1.457 -1.545,2.336c-0.375,0.88 -0.565,1.822 -0.565,2.827c0,2.061 0.703,3.807 2.11,5.239c1.407,1.433 3.141,2.148 5.202,2.148c2.061,0 3.808,-0.715 5.241,-2.148c1.431,-1.432 2.147,-3.178 2.147,-5.239c0,-1.005 -0.188,-1.947 -0.565,-2.827c-0.377,-0.879 -0.904,-1.658 -1.582,-2.336c-0.679,-0.679 -1.471,-1.207 -2.376,-1.584c-0.905,-0.377 -1.859,-0.566 -2.865,-0.566c-1.005,0 -1.959,0.189 -2.864,0.566Z" style="fill:url(#_Linear3);fill-rule:nonzero;"/>
<path d="M312.466,20.338c-1.207,1.206 -1.81,2.688 -1.81,4.447c0,1.76 0.603,3.255 1.81,4.486c1.205,1.231 2.687,1.846 4.448,1.846c1.758,0 3.252,-0.615 4.485,-1.846c1.231,-1.231 1.846,-2.726 1.846,-4.486c0,-1.759 -0.615,-3.241 -1.846,-4.447c-1.233,-1.206 -2.727,-1.81 -4.485,-1.81c-1.761,0 -3.243,0.604 -4.448,1.81Zm0.338,14.661c-1.13,1.131 -1.695,2.502 -1.695,4.109l0,36.41c0,1.406 -0.202,2.5 -0.603,3.28c-0.403,0.778 -0.894,1.432 -1.47,1.96c-0.579,0.528 -1.206,0.954 -1.884,1.281c-0.679,0.326 -1.308,0.728 -1.886,1.206c-0.577,0.477 -1.067,1.08 -1.47,1.81c-0.401,0.728 -0.603,1.721 -0.603,2.978c0,1.607 0.592,2.826 1.772,3.656c1.182,0.828 2.601,1.243 4.26,1.243c1.857,0 3.618,-0.365 5.277,-1.093c1.656,-0.729 3.101,-1.809 4.334,-3.241c1.231,-1.433 2.197,-3.242 2.902,-5.428c0.704,-2.186 1.055,-4.737 1.055,-7.652l0,-36.41c0,-0.803 -0.151,-1.557 -0.452,-2.261c-0.301,-0.703 -0.715,-1.32 -1.244,-1.848c-0.528,-0.527 -1.157,-0.942 -1.885,-1.243c-0.729,-0.302 -1.495,-0.452 -2.298,-0.452c-1.611,0 -2.979,0.565 -4.11,1.695Z" style="fill:url(#_Linear4);fill-rule:nonzero;"/>
<path d="M143.046,19.621c-0.828,0.428 -1.508,0.969 -2.036,1.621c-0.527,0.653 -0.931,1.37 -1.206,2.149c-0.277,0.78 -0.415,1.521 -0.415,2.224c0,0.753 0.101,1.432 0.303,2.034l13.401,42.573c2.151,-5.941 4.474,-12.397 6.864,-19.098l-7.752,-27.545c-0.402,-1.406 -1.181,-2.525 -2.337,-3.355c-1.156,-0.829 -2.463,-1.244 -3.921,-1.244c-1.104,0 -2.073,0.215 -2.901,0.641Z" style="fill:url(#_Linear5);fill-rule:nonzero;"/>
<path d="M172.22,20.149c-1.082,0.78 -1.898,1.898 -2.451,3.355l-9.8,27.666l-0.012,-0.046c-2.39,6.701 -4.713,13.157 -6.864,19.098l0.243,0.774c0.452,1.407 1.206,2.513 2.261,3.317c1.056,0.804 2.311,1.205 3.769,1.205c1.458,0 2.715,-0.388 3.77,-1.168c1.055,-0.778 1.834,-1.872 2.336,-3.279l10.631,-29.928l10.493,29.549c1.813,-6.071 3.752,-12.822 5.582,-19.679l-9.744,-27.509c-0.503,-1.457 -1.308,-2.575 -2.412,-3.355c-1.106,-0.778 -2.413,-1.169 -3.919,-1.169c-1.509,0 -2.803,0.391 -3.883,1.169Z" style="fill:url(#_Linear6);fill-rule:nonzero;"/>
<path d="M202.335,20.224c-1.157,0.83 -1.935,1.949 -2.337,3.355l-7.764,27.591l-0.056,-0.157c-1.83,6.857 -3.769,13.608 -5.582,19.679l0.134,0.379c0.503,1.407 1.283,2.501 2.338,3.279c1.054,0.78 2.311,1.168 3.769,1.168c1.458,0 2.714,-0.401 3.769,-1.205c1.055,-0.804 1.809,-1.91 2.261,-3.317l13.645,-43.347c0.2,-0.602 0.301,-1.281 0.301,-2.034c0,-0.703 -0.139,-1.444 -0.415,-2.224c-0.276,-0.779 -0.678,-1.496 -1.206,-2.149c-0.526,-0.652 -1.204,-1.193 -2.035,-1.621c-0.829,-0.426 -1.797,-0.641 -2.901,-0.641c-1.458,0 -2.765,0.415 -3.921,1.244Z" style="fill:url(#_Linear7);fill-rule:nonzero;"/>
<path d="M262.038,34.66l-15.683,12.589l0,10.861l14.25,15.298c0.652,0.705 1.419,1.232 2.299,1.584c0.878,0.351 1.746,0.526 2.6,0.526c0.554,0 1.157,-0.1 1.811,-0.301c0.651,-0.2 1.254,-0.528 1.809,-0.981c0.552,-0.452 1.017,-1.054 1.395,-1.809c0.375,-0.753 0.564,-1.657 0.564,-2.713c0,-0.754 -0.139,-1.508 -0.414,-2.262c-0.277,-0.753 -0.717,-1.406 -1.32,-1.959l-13.116,-12.665l13.267,-9.423c0.704,-0.502 1.206,-1.131 1.508,-1.884c0.301,-0.754 0.452,-1.533 0.452,-2.337c0,-1.056 -0.202,-1.96 -0.603,-2.715c-0.403,-0.753 -0.893,-1.368 -1.47,-1.846c-0.578,-0.477 -1.194,-0.816 -1.847,-1.018c-0.654,-0.2 -1.257,-0.301 -1.81,-0.301c-1.357,0 -2.588,0.452 -3.692,1.356Z" style="fill:url(#_Linear8);fill-rule:nonzero;"/>
<g opacity="0.1">
<path d="M159.969,51.17l-6.877,19.052l-1.606,-5.102l8.483,-13.95Z" style="fill-rule:nonzero;"/>
</g>
<g opacity="0.1">
<path d="M192.234,51.17l-5.638,19.522l-1.808,-5.092l7.446,-14.43Z" style="fill-rule:nonzero;"/>
</g>
<g opacity="0.1">
<path d="M246.433,47.174l3.604,14.88l-3.682,-3.945l0.078,-10.935Z" style="fill-rule:nonzero;"/>
</g>
<path d="M236.444,20.677c-1.13,1.131 -1.696,2.501 -1.696,4.108l0,44.853c0,0.805 0.151,1.572 0.452,2.3c0.303,0.729 0.717,1.356 1.244,1.884c0.528,0.528 1.144,0.943 1.846,1.244c0.705,0.301 1.458,0.452 2.262,0.452c1.608,0 2.991,-0.577 4.146,-1.734c1.156,-1.155 1.735,-2.536 1.735,-4.146l0,-44.853c0,-0.803 -0.151,-1.557 -0.452,-2.261c-0.302,-0.703 -0.717,-1.319 -1.244,-1.847c-0.528,-0.528 -1.156,-0.942 -1.885,-1.245c-0.729,-0.3 -1.496,-0.452 -2.3,-0.452c-1.608,0 -2.977,0.566 -4.108,1.697Z" style="fill:url(#_Linear9);fill-rule:nonzero;"/>
<path d="M329.615,60.253c-1.031,0.981 -1.545,2.476 -1.545,4.485c0,1.659 0.589,3.167 1.771,4.524c1.18,1.356 2.651,2.538 4.41,3.543c1.759,1.005 3.643,1.784 5.654,2.336c2.01,0.553 3.844,0.829 5.503,0.829c2.31,0 4.485,-0.3 6.521,-0.904c2.035,-0.603 3.831,-1.494 5.389,-2.676c0.582,-0.442 1.104,-0.94 1.596,-1.466c-0.772,-4.296 -3.93,-8.44 -11.441,-11.435c0.494,0.22 0.955,0.448 1.364,0.689c0.981,0.578 1.471,1.345 1.471,2.299c0,1.006 -0.479,1.721 -1.432,2.148c-0.956,0.428 -1.936,0.641 -2.94,0.641c-1.157,0 -2.225,-0.339 -3.204,-1.017c-0.981,-0.678 -1.935,-1.419 -2.865,-2.224c-0.93,-0.803 -1.898,-1.546 -2.902,-2.224c-1.006,-0.679 -2.061,-1.018 -3.166,-1.018c-1.76,0 -3.155,0.49 -4.184,1.47Z" style="fill:url(#_Linear10);fill-rule:nonzero;"/>
<g opacity="0.1">
<path d="M358.914,70.921c-0.772,-4.297 -3.929,-8.441 -11.441,-11.435c0.494,0.219 0.955,0.447 1.365,0.689c0.23,0.135 0.427,0.283 0.603,0.44c0,-0.001 0,-0.001 -0.001,-0.002c0.001,0.001 0.001,0.002 0.002,0.003c0.023,0.02 0.045,0.04 0.068,0.061c4.582,4.051 7.041,7.921 8.022,11.529c0.495,-0.397 0.954,-0.827 1.382,-1.285" style="fill-rule:nonzero;"/>
</g>
<path d="M338.322,33.831c-1.76,0.654 -3.231,1.558 -4.41,2.714c-1.182,1.157 -2.049,2.514 -2.601,4.07c-0.554,1.559 -0.829,3.268 -0.829,5.127c0,2.363 0.49,4.272 1.47,5.729c0.98,1.459 2.198,2.652 3.656,3.581c1.457,0.931 3.053,1.647 4.787,2.148c1.733,0.503 3.329,0.98 4.787,1.433c0.847,0.263 1.605,0.55 2.291,0.856c7.511,2.995 10.669,7.139 11.441,11.435c0.822,-0.88 1.532,-1.865 2.098,-2.982c0.905,-1.783 1.357,-3.882 1.357,-6.294c0,-2.513 -0.49,-4.535 -1.471,-6.069c-0.979,-1.533 -2.197,-2.751 -3.655,-3.656c-1.458,-0.904 -3.042,-1.594 -4.749,-2.073c-1.71,-0.477 -3.293,-0.929 -4.749,-1.357c-1.459,-0.426 -2.677,-0.929 -3.656,-1.507c-0.981,-0.577 -1.471,-1.445 -1.471,-2.601c0,-0.552 0.189,-0.98 0.567,-1.281c0.375,-0.302 0.839,-0.452 1.394,-0.452c0.954,0 1.771,0.188 2.449,0.564c0.679,0.378 1.368,0.78 2.073,1.207c0.703,0.428 1.47,0.828 2.3,1.205c0.829,0.378 1.847,0.567 3.052,0.567c1.407,0 2.601,-0.503 3.582,-1.509c0.947,-0.971 1.425,-2.11 1.457,-3.411l-6.08,0c-1.294,0 -2.352,-1.059 -2.352,-2.351l0,-5.323c-0.139,-0.035 -0.27,-0.075 -0.414,-0.108c-1.835,-0.427 -3.856,-0.642 -6.067,-0.642c-2.413,0 -4.499,0.327 -6.257,0.98Z" style="fill:url(#_Linear11);fill-rule:nonzero;"/>
<path d="M364.105,34.43c0,1.136 0.929,2.065 2.065,2.065l6.222,0c1.136,0 2.065,-0.929 2.065,-2.065l0,-6.222c0,-1.136 -0.929,-2.066 -2.065,-2.066l-6.222,0c-1.136,0 -2.065,0.93 -2.065,2.066l0,6.222Z" style="fill:#3f51b5;fill-rule:nonzero;"/>
<path d="M381.136,36.6c0,1.137 0.93,2.066 2.066,2.066l3.216,0c1.136,0 2.065,-0.929 2.065,-2.066l0,-3.216c0,-1.136 -0.929,-2.065 -2.065,-2.065l-3.216,0c-1.136,0 -2.066,0.929 -2.066,2.065l0,3.216Z" style="fill:#3f51b5;fill-rule:nonzero;"/>
<path d="M374.457,53.131c0,1.136 0.929,2.066 2.066,2.066l4.551,0c1.137,0 2.066,-0.93 2.066,-2.066l0,-4.552c0,-1.136 -0.929,-2.065 -2.066,-2.065l-4.551,0c-1.137,0 -2.066,0.929 -2.066,2.065l0,4.552Z" style="fill:#3f51b5;fill-rule:nonzero;"/>
<path d="M392.491,44.615c0,1.137 0.929,2.066 2.065,2.066l0.879,0c1.136,0 2.065,-0.929 2.065,-2.066l0,-0.879c0,-1.135 -0.929,-2.064 -2.065,-2.064l-0.879,0c-1.136,0 -2.065,0.929 -2.065,2.064l0,0.879Z" style="fill:#3f51b5;fill-rule:nonzero;"/>
<path d="M65.686,50.653c0,0 20.812,0.75 30.375,9c9.562,8.25 16.125,24 13.312,37.688c-5.625,-1.313 -29.625,-5.438 -39.375,-17.438c-9.75,-12 -9.375,-20.437 -8.25,-25.5c1.125,-5.062 3.938,-3.75 3.938,-3.75" style="fill:#1c9cf3;fill-rule:nonzero;"/>
<path d="M62.038,54.454c-0.475,2.139 -0.988,5.498 0.046,9.953c1.125,4.848 3.801,10.068 8.198,15.31c10.06,11.993 38.391,16.857 38.735,16.932c1.077,-6.234 0.35,-12.729 -2.175,-19.516c-2.494,-6.704 -6.5,-12.668 -11.279,-16.793c-9.415,-8.121 -30.26,-8.963 -30.469,-8.97l-0.215,-0.008l-0.155,-0.081c-0.002,0 -0.177,-0.067 -0.418,-0.067c-0.998,0 -1.803,1.15 -2.268,3.24Z" style="fill:url(#_Radial12);fill-rule:nonzero;"/>
<path d="M60.248,50.653c0,0 2.625,5.438 -3.562,13.688c-6.188,8.25 -19.125,21.562 -51.375,18.75c1.125,-7.688 6.75,-15.563 12.937,-21.188c6.188,-5.625 20.063,-11.437 29.25,-11.625c9.188,-0.187 12.75,0.375 12.75,0.375" style="fill:#04bbf3;fill-rule:nonzero;"/>
<path d="M47.661,51.007c-4.286,0.087 -10.037,1.469 -15.783,3.792c-5.597,2.262 -10.53,5.127 -13.534,7.858c-6.762,6.148 -11.115,13.417 -12.413,19.94c2.596,0.201 7.447,0.302 7.447,0.302c11.549,0 21.195,-2.117 29.11,-6.626c7.017,-3.996 11.231,-8.995 13.79,-12.407c4.909,-6.545 4.149,-11.122 3.717,-12.555c-1.08,-0.116 -3.81,-0.344 -8.669,-0.344c-1.165,0 -2.398,0.013 -3.665,0.04Z" style="fill:url(#_Linear13);fill-rule:nonzero;"/>
<path d="M125.873,31.528c0,0 -3.75,10.875 -22.125,16.125c-18.375,5.25 -38.062,1.875 -38.062,1.875c0,0 4.687,-12.375 18.187,-18.187c13.5,-5.813 37.313,-0.563 42,0.187" style="fill:#02bef3;fill-rule:nonzero;"/>
<path d="M83.538,32.552c-10.988,4.731 -16.174,13.887 -17.695,17.055c2.266,0.309 7.463,0.902 13.983,0.902c8.656,0 16.566,-1.006 23.51,-2.99c14.825,-4.235 20.235,-12.672 21.72,-15.505c-0.243,-0.043 -17.126,-3.378 -26.758,-3.378c-6.903,0 -10.593,2.121 -14.76,3.916Z" style="fill:url(#_Radial14);fill-rule:nonzero;"/>
<path d="M59.915,51.278c0,0 -26.74,-1.259 -42.435,-12.71c-15.696,-11.451 -15.334,-15.226 -15.334,-15.226c0,0 17.599,-0.054 26.286,3.078c8.688,3.133 22.336,11.948 31.483,24.858" style="fill:#02bef3;fill-rule:nonzero;"/>
<path d="M18.403,38.359c6.069,4.428 13.396,7.558 22.006,9.664c0.002,0.001 0.002,0.001 0.004,0.001c9.149,1.098 16.735,2.791 18.559,2.947c-4.016,-5.463 -9.015,-10.405 -14.381,-14.518c-5.193,-3.99 -10.674,-7.143 -15.228,-8.942c-0.845,-0.337 -1.74,-0.639 -2.662,-0.915c-8.018,-2.397 -21.465,-2.554 -23.533,-2.584c0.509,0.942 2.299,4.909 15.235,14.347Z" style="fill:url(#_Radial15);fill-rule:nonzero;"/>
<path d="M60.107,53.87c2.377,0.304 3.66,5.62 2.862,11.865c-0.798,6.244 -3.376,11.067 -5.754,10.763c-2.377,-0.303 -3.66,-5.62 -2.862,-11.864c0.798,-6.245 3.376,-11.068 5.754,-10.764Z" style="fill:url(#_Radial16);"/>
<g>
<path d="M63.623,50.523c-7.957,1.497 3.291,37.119 15.337,42.529c23.156,10.401 35.993,-9.611 35.993,-16.859c0,-7.249 -31.884,-29.326 -51.33,-25.67Z" style="fill:url(#_Radial17);fill-rule:nonzero;"/>
<path d="M52.38,60.705c-2.895,5.261 20.366,23.165 30.768,21.166c10.402,-1.999 24.271,-12.529 23.192,-18.252c-1.079,-5.724 -19.995,-21.583 -35.131,-15.913c-9.929,3.719 -15.934,7.738 -18.829,12.999Z" style="fill:url(#_Radial18);fill-rule:nonzero;"/>
<path d="M62.304,63.032c-2.177,5.597 13.08,21.534 23.128,18.182c10.048,-3.352 22.409,-15.617 20.586,-21.148c-1.824,-5.531 -22.664,-18.761 -36.921,-11.146c-9.352,4.994 -4.616,8.515 -6.793,14.112Z" style="fill:url(#_Radial19);fill-rule:nonzero;"/>
<path d="M60.721,60.475c-1.854,4.721 11.081,18.141 19.616,15.304c8.535,-2.837 19.043,-13.191 17.501,-17.853c-1.542,-4.662 -19.221,-15.793 -31.334,-9.357c-7.945,4.221 -3.928,7.185 -5.783,11.906Z" style="fill:url(#_Radial20);fill-rule:nonzero;"/>
</g>
<g>
<path d="M63.547,59.973c-1.577,4.793 -19.173,24.596 -31.312,27.374c-12.14,2.779 -24.093,-9.922 -25.212,-15.785c-1.119,-5.862 17.202,-22.572 35.975,-24.02c12.314,-0.95 23.195,4.395 20.549,12.431" style="fill:url(#_Radial21);fill-rule:nonzero;"/>
<path d="M63.205,57.315c-1.214,5.58 -17.369,27.784 -29.357,30.149c-11.989,2.368 -24.988,-13.673 -26.567,-20.736c-1.578,-7.063 15.545,-25.529 34.305,-25.798c12.304,-0.177 23.656,7.026 21.619,16.385" style="fill:url(#_Radial22);fill-rule:nonzero;"/>
<path d="M54.504,60.754c-1.717,3.102 -15.803,13.833 -23.882,13.516c-8.079,-0.316 -13.708,-11.577 -13.531,-15.946c0.177,-4.369 14.255,-12.768 26.319,-10.259c7.913,1.647 13.974,7.488 11.094,12.689" style="fill:url(#_Radial23);fill-rule:nonzero;"/>
</g>
<path d="M36.741,55.538c-3.519,0.436 -20.482,-4.644 -24.978,-11.365c-4.497,-6.719 1.299,-17.895 4.937,-20.322c3.637,-2.426 18.71,4.018 23.777,15.251c3.323,7.368 2.164,15.705 -3.736,16.436" style="fill:url(#_Radial24);fill-rule:nonzero;"/>
<g>
<path d="M98.43,26.371c15.231,-2.015 28.385,2.308 29.356,9.649c0.972,7.34 -10.605,14.936 -25.836,16.951c-15.231,2.015 -28.384,-2.308 -29.356,-9.648c-0.971,-7.341 10.606,-14.936 25.836,-16.952Z" style="fill:url(#_Radial25);"/>
<path d="M101.52,27.364c13.736,1.417 24.292,8.341 23.559,15.452c-0.734,7.111 -12.482,11.734 -26.218,10.316c-13.737,-1.417 -24.293,-8.341 -23.559,-15.452c0.734,-7.111 12.481,-11.734 26.218,-10.316Z" style="fill:url(#_Radial26);"/>
<path d="M91.728,29.668c11.581,-1.43 21.601,2.407 22.36,8.562c0.76,6.154 -8.027,12.311 -19.608,13.74c-11.582,1.429 -21.602,-2.407 -22.361,-8.562c-0.76,-6.154 8.027,-12.311 19.609,-13.74Z" style="fill:url(#_Radial27);"/>
</g>
<path d="M61.347,51.035c0.022,0.368 0.979,7.845 -5.49,10.653c-5.003,2.171 -11.153,3.242 -24.791,-2.947c-13.639,-6.188 -18.378,-15.179 -18.378,-15.179c0,0 7.629,2.802 12.367,3.153c4.739,0.35 16.99,2.101 20.111,2.685c3.12,0.584 8.668,0.117 10.749,-0.35c2.08,-0.468 5.201,-1.752 5.432,1.985" style="fill:#b3c3ce;fill-rule:nonzero;"/>
<path d="M31.065,58.366c13.639,6.189 19.79,5.118 24.792,2.948c6.468,-2.809 5.512,-10.286 5.49,-10.655c-0.232,-3.736 -3.352,-2.451 -5.432,-1.984c-2.081,0.467 -7.49,0.137 -11.979,-0.178c-5.344,-0.375 -13.969,-1.5 -18.88,-2.158c-4.71,-0.63 -12.368,-3.153 -12.368,-3.153c0,0 4.74,8.991 18.377,15.18Z" style="fill:url(#_Linear28);fill-rule:nonzero;"/>
<path d="M57.256,44.227c0,0 -4.342,-3.433 -7.875,-7.168c-3.534,-3.736 -14.943,-14.539 -17.77,-17.467c-2.826,-2.927 -10.5,-12.923 -11.51,-17.164c-2.322,5.15 -3.836,14.539 -1.009,23.626c2.826,9.087 9.39,15.649 18.072,19.284c8.683,3.634 16.255,3.433 18.375,3.433c2.121,0 5.049,-1.414 1.717,-4.544" style="fill:#f5f6f2;fill-rule:nonzero;"/>
<path d="M19.467,26.054c2.827,9.086 9.39,15.649 18.073,19.283c8.682,3.636 16.254,3.687 18.375,3.687c1.197,0 4.989,-0.152 5.177,-0.714c0.403,-1.211 -1.926,-2.108 -3.375,-3.469c-3.848,-3.042 -3.776,-3.358 -7.961,-7.782c-3.534,-3.736 -14.943,-14.539 -17.769,-17.467c-2.827,-2.928 -10.502,-12.923 -11.511,-17.164c-2.322,5.149 -3.837,14.539 -1.009,23.626Z" style="fill:url(#_Linear29);fill-rule:nonzero;"/>
<path d="M105.331,7.54c-3.75,3.375 -10.395,7.863 -16.77,11.988c-6.375,4.125 -10.5,11.063 -15.375,18.375c-4.875,7.313 -9.75,10.875 -9.75,10.875c0,0 7.687,1.125 15,1.125c11.256,0 24,-9.375 28.687,-14.437c4.688,-5.063 7.838,-13.31 7.875,-21.75c0.043,-9.861 -4.519,-11.792 -4.519,-11.792c0,0 -1.398,2.241 -5.148,5.616Z" style="fill:url(#_Linear30);fill-rule:nonzero;"/>
<path d="M105.859,6.779c-3.751,3.375 -11.298,8.624 -17.673,12.749c-6.375,4.125 -10.5,11.063 -15.375,18.375c-3.75,5.626 -8.444,8.724 -10.41,10.329c-0.59,0.482 -0.934,1.765 -0.934,1.765c6.769,0.99 8.351,-0.094 16.594,-0.094c11.255,0 24,-9.375 28.687,-14.437c4.688,-5.063 7.688,-13.313 7.875,-21.75c0.188,-8.438 -4.125,-11.813 -4.125,-11.813c0,0 -0.89,1.501 -4.639,4.876Z" style="fill:url(#_Linear31);fill-rule:nonzero;"/>
<g>
<path d="M44.632,31.45c8.133,5.258 12.662,12.735 10.107,16.686c-2.555,3.952 -11.232,2.89 -19.364,-2.368c-8.133,-5.259 -12.662,-12.736 -10.107,-16.687c2.555,-3.951 11.232,-2.89 19.364,2.369Z" style="fill:url(#_Radial32);"/>
<path d="M43.849,30.894c7.726,5.84 12.066,13.139 9.684,16.29c-2.382,3.151 -10.588,0.968 -18.314,-4.871c-7.726,-5.839 -12.065,-13.139 -9.684,-16.29c2.382,-3.151 10.588,-0.968 18.314,4.871Z" style="fill:url(#_Radial33);"/>
</g>
<g>
<path d="M78.741,36.006c8.038,-4.494 15.958,-5.648 17.675,-2.577c1.716,3.071 -3.415,9.212 -11.453,13.706c-8.038,4.493 -15.957,5.648 -17.674,2.577c-1.717,-3.071 3.415,-9.212 11.452,-13.706Z" style="fill:url(#_Radial34);"/>
<path d="M81.132,32.187c7.951,-4.445 15.94,-5.31 17.83,-1.93c1.89,3.38 -3.032,9.733 -10.983,14.178c-7.951,4.445 -15.94,5.31 -17.829,1.93c-1.89,-3.38 3.031,-9.733 10.982,-14.178Z" style="fill:url(#_Radial35);"/>
<path d="M80.126,35.267c7.501,-5.169 15.482,-6.621 17.812,-3.24c2.331,3.381 -1.867,10.323 -9.367,15.493c-7.5,5.169 -15.481,6.621 -17.812,3.24c-2.33,-3.381 1.867,-10.323 9.367,-15.493Z" style="fill:url(#_Radial36);"/>
<path d="M89.308,27.918c2.879,-6.448 7.508,-10.659 10.333,-9.399c2.824,1.261 2.78,7.52 -0.098,13.967c-2.879,6.448 -7.509,10.659 -10.333,9.399c-2.824,-1.261 -2.78,-7.519 0.098,-13.967Z" style="fill:url(#_Radial37);"/>
</g>
<path d="M26.696,18.134c-0.805,5.903 0.586,11.978 3.363,15.977c2.778,4.002 10.763,11.808 18.631,12.918c5.111,0.719 10.596,0.69 10.596,0.69c0,0 -3.058,-2.97 -5.745,-8.562c-2.687,-5.591 -4.888,-10.846 -8.937,-14.358c-4.05,-3.51 -8.254,-7.302 -10.543,-10.031c-2.288,-2.728 -3.044,-4.431 -3.044,-4.431c0,0 -3.38,0.899 -4.321,7.797Z" style="fill:url(#_Linear38);fill-rule:nonzero;"/>
<path d="M26.959,18.171c-0.7,5.916 0.585,11.978 3.363,15.978c2.778,4 10.762,11.808 18.63,12.916c5.762,0.812 6.31,1.127 11.139,1.101c0,0 -3.6,-3.381 -6.288,-8.972c-2.688,-5.591 -4.887,-10.847 -8.937,-14.358c-4.05,-3.51 -8.808,-7.923 -11.097,-10.651c-2.289,-2.728 -2.764,-3.865 -2.764,-3.865c0,0 -3.347,1.934 -4.046,7.851Z" style="fill:url(#_Linear39);fill-rule:nonzero;"/>
<g>
<path d="M57.708,51.938c1.06,3.068 -2.837,7.203 -8.697,9.227c-5.861,2.024 -11.479,1.176 -12.539,-1.892c-1.059,-3.069 2.838,-7.203 8.698,-9.227c5.86,-2.024 11.479,-1.176 12.538,1.892Z" style="fill:url(#_Radial40);"/>
<path d="M55.199,53.999c0.119,2.902 -4.178,5.44 -9.592,5.663c-5.413,0.223 -9.904,-1.952 -10.024,-4.854c-0.12,-2.903 4.178,-5.44 9.591,-5.664c5.413,-0.223 9.905,1.953 10.025,4.855Z" style="fill:url(#_Radial41);"/>
<path d="M60.024,52.648c0.852,2.014 -2.078,5.179 -6.538,7.064c-4.459,1.885 -8.771,1.781 -9.622,-0.233c-0.851,-2.014 2.079,-5.179 6.538,-7.064c4.46,-1.885 8.771,-1.78 9.622,0.233Z" style="fill:url(#_Radial42);"/>
</g>
<path d="M33.667,51.566c2.166,3.131 5.442,5.398 8.477,6.086c3.035,0.69 10.168,0.927 14.358,-1.941c2.722,-1.866 5.295,-4.245 5.295,-4.245c0,0 -2.723,-0.081 -6.401,-1.56c-3.679,-1.479 -6.984,-3.009 -10.407,-2.919c-3.425,0.09 -7.043,0.115 -9.299,-0.185c-2.257,-0.299 -3.348,-0.777 -3.348,-0.777c0,0 -1.205,1.882 1.325,5.541Z" style="fill:url(#_Linear43);fill-rule:nonzero;"/>
<path d="M33.807,51.471c2.221,3.091 5.441,5.396 8.476,6.086c3.036,0.688 10.17,0.928 14.358,-1.942c3.068,-2.103 3.462,-2.19 5.729,-4.285c0,0 -3.155,-0.041 -6.835,-1.52c-3.679,-1.478 -6.982,-3.009 -10.407,-2.918c-3.424,0.091 -7.572,0.062 -9.828,-0.238c-2.256,-0.3 -2.97,-0.632 -2.97,-0.632c0,0 -0.745,2.356 1.477,5.449Z" style="fill:url(#_Linear44);fill-rule:nonzero;"/>
<path d="M100.92,50.491c-3.373,1.42 -18.374,0.622 -23.876,0c-5.503,-0.621 -11.189,-0.525 -12.25,-0.621c-3.796,-0.342 -3.106,0.887 -3.373,4.704c-0.621,10.563 3.373,12.693 6.302,13.137c2.93,0.444 5.593,-0.976 5.593,-0.976c0,0 29.024,-13.137 31.687,-14.558c0.496,-2.724 0.376,-3.586 -0.232,-3.586c-0.7,0 -2.047,1.141 -3.851,1.9Z" style="fill:url(#_Radial45);fill-rule:nonzero;"/>
<g>
<path d="M73.82,53.958c4.948,3.511 7.617,8.26 5.958,10.598c-1.66,2.339 -7.024,1.386 -11.971,-2.126c-4.948,-3.511 -7.617,-8.26 -5.958,-10.599c1.66,-2.338 7.024,-1.385 11.971,2.127Z" style="fill:url(#_Radial46);"/>
<path d="M72.54,53.958c3.799,2.696 5.535,6.783 3.876,9.121c-1.66,2.338 -6.091,2.047 -9.889,-0.649c-3.799,-2.696 -5.535,-6.783 -3.876,-9.121c1.66,-2.338 6.091,-2.047 9.889,0.649Z" style="fill:url(#_Radial47);"/>
<path d="M76.317,54.251c3.798,2.696 5.534,6.783 3.875,9.121c-1.66,2.338 -6.091,2.048 -9.889,-0.648c-3.798,-2.696 -5.535,-6.783 -3.875,-9.122c1.659,-2.338 6.09,-2.047 9.889,0.649Z" style="fill:url(#_Radial48);"/>
</g>
<path d="M63.496,55.18c2.637,4.341 9.236,7.059 12.286,7.681c3.05,0.622 6.968,-0.097 10.231,-2.059c3.811,-2.292 3.487,-4.503 3.487,-4.503c0,0 -1.191,-0.015 -3.37,-0.669c-2.18,-0.657 -5.468,-2.168 -8.551,-3.66c-3.083,-1.491 -6.724,-1.457 -10.686,-1.624c-3.961,-0.167 -6.476,-1.212 -6.476,-1.212c0,0 1.366,3.228 3.079,6.046Z" style="fill:url(#_Linear49);fill-rule:nonzero;"/>
<path d="M63.409,55.036c2.635,4.341 9.235,7.059 12.285,7.68c3.05,0.622 6.933,-0.154 10.23,-2.058c3.298,-1.903 3.588,-4.356 3.588,-4.356c0,0 -0.786,0.007 -2.965,-0.648c-2.18,-0.656 -5.972,-2.337 -9.056,-3.828c-3.083,-1.492 -6.724,-1.458 -10.686,-1.624c-3.961,-0.168 -6.854,-1.429 -6.854,-1.429c1.203,2.843 1.527,3.085 3.458,6.263Z" style="fill:url(#_Linear50);fill-rule:nonzero;"/>
<path d="M104.029,52.622c0,0 1.219,-0.937 1.125,-2.812c-0.093,-1.875 0.375,-4.688 -9.562,-10.782c-3.281,5.907 -14.625,21.657 -19.594,25.219c-4.969,3.563 -5.765,3.442 -5.765,3.442c0,0 2.871,-0.343 5.39,-2.223c2.723,-2.032 28.406,-12.844 28.406,-12.844" style="fill:#cbd3dd;fill-rule:nonzero;"/>
<path d="M76.373,64.435c-3.085,2.212 -4.026,2.655 -4.716,2.945c0.257,-0.077 2.189,-0.583 4.341,-1.726c3,-1.594 28.406,-12.844 28.406,-12.844c0,0 1.219,-0.938 1.125,-2.813c-0.093,-1.875 0.375,-4.687 -9.562,-10.781c-3.281,5.906 -14.625,21.657 -19.594,25.219Z" style="fill:url(#_Linear51);fill-rule:nonzero;"/>
<path d="M60.909,53.32c-0.618,-0.001 -6.022,9.819 -3.491,21.069c0,0 3.615,-4.338 4.058,-15.247c0.183,-4.5 -0.133,-5.822 -0.567,-5.822Z" style="fill:url(#_Linear52);fill-rule:nonzero;"/>
<path d="M46.823,22.051c1.272,-1.24 5.598,-0.248 6.615,1.116c0.995,1.333 6.118,6.458 5.875,14.213c0.788,0.033 1.832,0.17 3.031,0.17c1.036,0 1.994,-0.102 2.781,-0.152c-0.252,-7.765 4.878,-12.897 5.873,-14.231c1.017,-1.364 5.343,-2.356 6.615,-1.116c1.273,1.24 -2.035,1.116 -3.562,0.744c-4.941,1.094 -8.097,12.039 -8.769,14.594c1.152,-0.063 1.896,0.018 1.896,0.781c0,1.156 -1.619,3.021 -3.872,3.221c0.092,0.464 0.627,3.053 0.024,5.777c-0.245,1.107 -2.519,2.36 -2.519,2.36c-2.415,-7.912 -0.023,-8.682 0.01,-8.748c-1.978,-0.296 -3.057,-1.549 -3.057,-2.61c0,-0.676 0.517,-0.817 1.387,-0.796c-0.681,-2.582 -3.835,-13.487 -8.765,-14.579c-1.527,0.372 -4.835,0.496 -3.563,-0.744" style="fill:#00c6f9;fill-rule:nonzero;"/>
<path d="M70.998,23.542c-0.995,1.335 -6.125,6.465 -5.873,14.232c-0.787,0.049 -1.746,0.151 -2.781,0.151c-1.199,0 -2.243,-0.136 -3.031,-0.17c0.243,-7.755 -4.88,-12.88 -5.874,-14.213c-1.018,-1.365 -5.344,-2.356 -6.616,-1.116c-1.272,1.24 2.036,1.116 3.563,0.744c4.93,1.092 8.084,11.997 8.765,14.579c-0.87,-0.02 -1.387,0.12 -1.387,0.796c0,1.061 0.786,2.39 2.763,2.684c-0.033,0.066 -1.658,1.243 0.284,8.674c0,0 3.102,-0.292 2.628,-6.639c-0.054,-0.733 -0.13,-1.319 -0.223,-1.783c2.252,-0.201 3.962,-1.781 3.962,-2.936c0,-0.762 -0.744,-0.843 -1.897,-0.781c0.674,-2.555 3.829,-13.5 8.77,-14.594c1.527,0.372 4.835,0.496 3.562,-0.744c-0.408,-0.398 -1.13,-0.566 -1.956,-0.566c-1.75,0 -3.968,0.755 -4.659,1.682Z" style="fill:url(#_Radial53);fill-rule:nonzero;"/>
<path d="M50.005,10.069c-0.937,1.89 2.368,2.172 3.493,1.605c3.635,1.665 5.958,18.288 6.46,22.224c-0.641,-0.032 -1.022,0.182 -1.022,1.212c0,1.617 0.873,3.929 2.329,4.38c-0.024,0.1 -0.037,0.16 -0.037,0.16c0,0 -2.48,4.628 -0.417,14.753c0,0 2.307,-5.062 2.307,-12.099c0,-1.119 -0.096,-2.01 -0.165,-2.718c1.66,-0.306 2.92,-2.714 2.92,-4.476c0,-1.161 -0.547,-1.285 -1.397,-1.189c0.387,-4.644 1.969,-20.385 6.463,-22.247c1.125,0.567 4.286,0.354 3.348,-1.536c-0.937,-1.89 -4.255,-0.383 -5.571,1.387c-1.445,1.942 -4.932,10.629 -4.747,22.466c-0.579,0.076 -0.896,0.174 -1.658,0.174c-0.883,0 -1.653,-0.208 -2.234,-0.259c0.179,-11.822 -3.677,-19.606 -4.329,-21.665c-0.616,-1.95 -2.533,-3.102 -4.027,-3.102c-0.755,0 -1.401,0.295 -1.716,0.93Z" style="fill:url(#_Linear54);fill-rule:nonzero;"/>
<path d="M50.005,10.437c-0.937,1.874 2.368,2.154 3.493,1.591c3.635,1.652 5.958,18.142 6.46,22.047c-0.641,-0.031 -1.022,0.181 -1.022,1.203c0,1.604 0.873,3.897 2.329,4.344c-0.024,0.099 -0.037,0.159 -0.037,0.159c0,0 -4.295,14.834 -1.47,24.548c0,0 3.708,-12.317 3.36,-21.915c-0.04,-1.109 -0.096,-1.994 -0.165,-2.697c1.66,-0.302 2.92,-2.691 2.92,-4.439c0,-1.153 -0.547,-1.275 -1.397,-1.181c0.387,-4.606 1.969,-20.221 6.463,-22.069c1.125,0.563 4.286,0.352 3.348,-1.523c-0.937,-1.875 -4.255,-0.38 -5.571,1.376c-1.445,1.926 -4.932,10.544 -4.747,22.287c-0.579,0.075 -0.896,0.173 -1.658,0.173c-0.883,0 -1.653,-0.207 -2.234,-0.257c0.179,-11.729 -3.677,-19.449 -4.329,-21.493c-0.616,-1.934 -2.533,-3.077 -4.027,-3.077c-0.754,0.001 -1.401,0.293 -1.716,0.923Z" style="fill:url(#_Linear55);fill-rule:nonzero;"/>
<path d="M66.278,44.291c0,0 3.743,-2.96 6.791,-6.181c3.047,-3.222 12.885,-12.537 15.323,-15.063c2.438,-2.524 9.055,-11.144 9.926,-14.801c2.003,4.441 3.308,12.538 0.87,20.373c-2.437,7.836 -8.097,13.496 -15.584,16.63c-7.488,3.134 -14.018,2.96 -15.845,2.96c-1.829,0 -4.354,-1.219 -1.481,-3.918" style="fill:#f5f6f2;fill-rule:nonzero;"/>
<path d="M88.069,23.047c-2.439,2.526 -12.276,11.841 -15.323,15.063c-3.609,3.815 -3.547,4.087 -6.865,6.711c-1.25,1.173 -3.205,2.507 -2.946,3.072c0.259,0.564 3.467,0.316 4.5,0.316c1.828,0 8.358,0.174 15.846,-2.96c7.487,-3.134 13.146,-8.794 15.584,-16.629c2.439,-7.836 1.132,-15.933 -0.871,-20.374c-0.87,3.658 -7.487,12.277 -9.925,14.801Z" style="fill:url(#_Linear56);fill-rule:nonzero;"/>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,56.99,-56.99,0,222.499,18.5284)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear2" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,56.99,-56.99,0,281.749,18.5284)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-56.6692,56.6692,-0,299.387,73.7943)"><stop offset="0" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="0.01" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear4" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-56.6692,56.6692,-0,313.219,73.7943)"><stop offset="0" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="0.01" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(17.0441,33.7943,-33.7943,17.0441,139.694,21.0801)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear6" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(23.1173,-6.36705,6.36705,23.1173,153.941,52.2409)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear7" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(11.4607,-35.1657,35.1657,11.4607,195.608,59.0142)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear8" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-19.0116,-0.0985055,0.0985055,-19.0116,266.325,54.4147)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear9" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(7.05273,-52.9934,52.9934,7.05273,237.313,71.8385)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#313a78;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear10" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-12.1464,7.83636,-7.83636,-12.1464,353.869,59.5849)"><stop offset="0" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="0.01" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear11" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-6.465,27.8191,-27.8191,-6.465,351.575,31.532)"><stop offset="0" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="0.01" style="stop-color:#2196f3;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial12" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-66.1387,0,-0,66.1387,62.5747,49.8221)"><stop offset="0" style="stop-color:#3d4ead;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></radialGradient>
<linearGradient id="_Linear13" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-54.7355,0,0,-32.1015,60.3147,67.0176)"><stop offset="0" style="stop-color:#3f51b4;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial14" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-66.1374,0,-0,66.1374,62.5749,49.8221)"><stop offset="0" style="stop-color:#3d4ead;stop-opacity:1"/><stop offset="1" style="stop-color:#00c0f3;stop-opacity:1"/></radialGradient>
<radialGradient id="_Radial15" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-52.6361,-107.604,-12.8428,112.241,50.7804,124.457)"><stop offset="0" style="stop-color:#0072e9;stop-opacity:1"/><stop offset="1" style="stop-color:#00fdfe;stop-opacity:1"/></radialGradient>
<radialGradient id="_Radial16" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.0052,0.526563,-1.46889,11.3112,58.6611,65.1843)"><stop offset="0" style="stop-color:#153e68;stop-opacity:0.34"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0.01"/></radialGradient>
<radialGradient id="_Radial17" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-10.3568,10.999,26.0381,24.5177,76.5301,64.2632)"><stop offset="0" style="stop-color:#00336f;stop-opacity:1"/><stop offset="1" style="stop-color:#00336f;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial18" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-6.51962,11.4057,24.5674,14.4231,74.7463,58.6441)"><stop offset="0" style="stop-color:#00336f;stop-opacity:0.5"/><stop offset="1" style="stop-color:#00336f;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial19" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-4.96046,12.1651,26.2531,11.0614,74.0442,59.2965)"><stop offset="0" style="stop-color:#00336f;stop-opacity:0.5"/><stop offset="1" style="stop-color:#00336f;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial20" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-4.22491,10.2622,22.277,9.29717,70.6931,57.3125)"><stop offset="0" style="stop-color:#00336f;stop-opacity:1"/><stop offset="1" style="stop-color:#00336f;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial21" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-9.78901,-10.0451,-28.1355,22.8978,44.6851,58.4131)"><stop offset="0" style="stop-color:#002d68;stop-opacity:1"/><stop offset="1" style="stop-color:#002d68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial22" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-10.6184,-12.7117,-26.5102,25.0697,44.123,53.9971)"><stop offset="0" style="stop-color:#002d68;stop-opacity:1"/><stop offset="1" style="stop-color:#002d68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial23" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-4.66402,-8.96904,-21.2029,10.9396,42.8368,56.0939)"><stop offset="0" style="stop-color:#002d68;stop-opacity:1"/><stop offset="1" style="stop-color:#002d68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial24" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.51007,-9.04744,-21.3185,-10.7126,33.6469,43.3607)"><stop offset="0" style="stop-color:#002d68;stop-opacity:1"/><stop offset="1" style="stop-color:#002d68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial25" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(55.5618,-7.25333,2.08197,15.9483,72.5849,43.2523)"><stop offset="0" style="stop-color:#00326d;stop-opacity:1"/><stop offset="1" style="stop-color:#003b79;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial26" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(50.0892,5.26339,-1.61895,15.4438,75.3088,37.6118)"><stop offset="0" style="stop-color:#00326d;stop-opacity:1"/><stop offset="1" style="stop-color:#003b79;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial27" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(42.2509,-5.13094,1.62846,13.3715,72.1116,43.3493)"><stop offset="0" style="stop-color:#00326d;stop-opacity:1"/><stop offset="1" style="stop-color:#003b79;stop-opacity:0"/></radialGradient>
<linearGradient id="_Linear28" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-48.7206,0,-0,48.7206,61.4089,53.1008)"><stop offset="0" style="stop-color:#f5f7fa;stop-opacity:1"/><stop offset="0.53" style="stop-color:#f1f4f2;stop-opacity:1"/><stop offset="1" style="stop-color:#bad7e9;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear29" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-43.2077,0,-0,43.2077,61.1382,25.6029)"><stop offset="0" style="stop-color:#fafafa;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f6f8;stop-opacity:1"/><stop offset="0.73" style="stop-color:#dce5eb;stop-opacity:1"/><stop offset="1" style="stop-color:#bbcfda;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear30" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-47.9791,-47.9791,-0,89.2171,49.9033)"><stop offset="0" style="stop-color:#fdfdff;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f2f2;stop-opacity:1"/><stop offset="0.73" style="stop-color:#bfd2e0;stop-opacity:1"/><stop offset="1" style="stop-color:#afc0cc;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear31" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-48.0543,-48.0543,-0,88.4231,49.9576)"><stop offset="0" style="stop-color:#f1f6f6;stop-opacity:1"/><stop offset="0.41" style="stop-color:#fdfdfd;stop-opacity:1"/><stop offset="0.55" style="stop-color:#f5f8fa;stop-opacity:1"/><stop offset="0.89" style="stop-color:#d6e1e7;stop-opacity:1"/><stop offset="0.98" style="stop-color:#c3d3dd;stop-opacity:1"/><stop offset="1" style="stop-color:#c3d3dd;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial32" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.7354,9.52776,-4.62893,7.15901,40.0035,38.6087)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial33" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(13.9988,10.5803,-4.31511,5.70934,39.5341,36.6037)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial34" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.5634,-8.14176,3.11074,5.56427,81.8521,41.5703)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial35" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(14.4062,-8.05386,3.42371,6.12408,84.5558,38.3112)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial36" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(13.5894,-9.36638,4.22241,6.1262,84.3487,41.3934)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#1a426b;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial37" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(5.21516,-11.6826,5.1171,2.2843,94.4254,30.2021)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#1b436c;stop-opacity:0"/></radialGradient>
<linearGradient id="_Linear38" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.72457,-33.536,33.536,4.72457,41.1538,45.9665)"><stop offset="0" style="stop-color:#fdfdff;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f2f2;stop-opacity:1"/><stop offset="0.73" style="stop-color:#bfd2e0;stop-opacity:1"/><stop offset="1" style="stop-color:#afc0cc;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear39" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-33.3203,-0.000343575,0.000343575,-33.3203,60.0913,29.2441)"><stop offset="0" style="stop-color:#fafafa;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f6f8;stop-opacity:1"/><stop offset="0.73" style="stop-color:#dce5eb;stop-opacity:1"/><stop offset="1" style="stop-color:#bbcfda;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial40" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.92018,5.55941,-10.6179,3.66735,47.0904,55.6053)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial41" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.21678,5.25887,-9.80783,0.404296,45.3907,54.4033)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial42" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.54211,3.64848,-8.0801,3.41524,51.9443,56.0636)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<linearGradient id="_Linear43" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-12.2342,-17.8556,17.8556,-12.2342,52.4894,58.4592)"><stop offset="0" style="stop-color:#fdfdff;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f2f2;stop-opacity:1"/><stop offset="0.73" style="stop-color:#bfd2e0;stop-opacity:1"/><stop offset="1" style="stop-color:#afc0cc;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear44" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-15.7162,14.3692,-14.3692,-15.7162,54.2101,42.4051)"><stop offset="0" style="stop-color:#fafafa;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f6f8;stop-opacity:1"/><stop offset="0.73" style="stop-color:#dce5eb;stop-opacity:1"/><stop offset="1" style="stop-color:#bbcfda;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial45" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-16.9591,0,-0,16.9591,83.3344,58.1937)"><stop offset="0" style="stop-color:#f9f9fa;stop-opacity:1"/><stop offset="1" style="stop-color:#f5f7f7;stop-opacity:1"/></radialGradient>
<radialGradient id="_Radial46" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(8.96408,6.36252,-3.00685,4.23632,70.8134,58.194)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial47" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(6.8821,4.88477,-3.00685,4.23632,69.5335,58.194)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<radialGradient id="_Radial48" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(6.8821,4.88477,-3.00685,4.23632,73.3098,58.4873)"><stop offset="0" style="stop-color:#153e68;stop-opacity:1"/><stop offset="1" style="stop-color:#153e68;stop-opacity:0"/></radialGradient>
<linearGradient id="_Linear49" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(18.4986,-11.2373,-11.2373,-18.4986,66.0219,59.3376)"><stop offset="0" style="stop-color:#fdfdff;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f2f2;stop-opacity:1"/><stop offset="0.73" style="stop-color:#bfd2e0;stop-opacity:1"/><stop offset="1" style="stop-color:#afc0cc;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear50" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(8.40915,19.5646,19.5646,-8.40915,71.0611,43.9983)"><stop offset="0" style="stop-color:#fafafa;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f6f8;stop-opacity:1"/><stop offset="0.73" style="stop-color:#dce5eb;stop-opacity:1"/><stop offset="1" style="stop-color:#bbcfda;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear51" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(6.46873,14.3437,14.3437,-6.46873,82.3507,45.5017)"><stop offset="0" style="stop-color:#aebcd0;stop-opacity:1"/><stop offset="0.22" style="stop-color:#859bb9;stop-opacity:1"/><stop offset="0.53" style="stop-color:#a1b1c9;stop-opacity:1"/><stop offset="1" style="stop-color:#97a9c3;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear52" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-21.0692,-21.0692,0,59.0903,74.3882)"><stop offset="0" style="stop-color:#c0cbda;stop-opacity:1"/><stop offset="0.02" style="stop-color:#c0cbda;stop-opacity:1"/><stop offset="0.11" style="stop-color:#d4dbe5;stop-opacity:1"/><stop offset="0.45" style="stop-color:#f5f6f9;stop-opacity:1"/><stop offset="0.59" style="stop-color:#fdfdfd;stop-opacity:1"/><stop offset="1" style="stop-color:#fcfdfd;stop-opacity:1"/></linearGradient>
<radialGradient id="_Radial53" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-18.2184,0,-0,12.4951,62.2182,35.8819)"><stop offset="0" style="stop-color:#3f51b5;stop-opacity:1"/><stop offset="1" style="stop-color:#04bbf3;stop-opacity:1"/></radialGradient>
<linearGradient id="_Linear54" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-45.2637,-45.2637,-0,62.1493,54.4033)"><stop offset="0" style="stop-color:#afc0cc;stop-opacity:1"/><stop offset="0.24" style="stop-color:#afc0cc;stop-opacity:1"/><stop offset="0.74" style="stop-color:#f1f2f2;stop-opacity:1"/><stop offset="1" style="stop-color:#fdfdff;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear55" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-46.5257,-46.5257,-0,62.1493,56.0403)"><stop offset="0" style="stop-color:#fafafa;stop-opacity:1"/><stop offset="0.26" style="stop-color:#f1f6f8;stop-opacity:1"/><stop offset="0.73" style="stop-color:#dce5eb;stop-opacity:1"/><stop offset="1" style="stop-color:#bbcfda;stop-opacity:1"/></linearGradient>
<linearGradient id="_Linear56" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-39.9686,39.9686,-0,81.5604,48.215)"><stop offset="0" style="stop-color:#f1f6f6;stop-opacity:1"/><stop offset="0.41" style="stop-color:#fdfdfd;stop-opacity:1"/><stop offset="0.55" style="stop-color:#f5f8fa;stop-opacity:1"/><stop offset="0.89" style="stop-color:#d6e1e7;stop-opacity:1"/><stop offset="0.98" style="stop-color:#c3d3dd;stop-opacity:1"/><stop offset="1" style="stop-color:#c3d3dd;stop-opacity:1"/></linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -54,7 +54,7 @@ export default new Vuex.Store({
WIKI.$store.commit('showNotification', {
style: 'red',
message: _.get(err, 'graphQLErrors[0].message', err.message),
icon: 'warning'
icon: 'alert'
})
}
},

View File

@ -173,18 +173,6 @@ module.exports = {
outputPath: 'fonts/'
}
}]
},
{
test: /.jsx$/,
loader: 'babel-loader',
exclude: /node_modules/,
options: {
presets: ['es2015', 'react']
}
},
{
test: /\.flow$/,
loader: 'ignore-loader'
}
]
},
@ -193,8 +181,7 @@ module.exports = {
new VuetifyLoaderPlugin(),
new CopyWebpackPlugin([
{ from: 'client/static' },
{ from: './node_modules/prismjs/components', to: 'js/prism' },
{ from: './node_modules/graphql-voyager/dist/voyager.worker.js', to: 'js/' }
{ from: './node_modules/prismjs/components', to: 'js/prism' }
], {}),
new HtmlWebpackPlugin({
template: 'dev/templates/master.pug',
@ -227,8 +214,7 @@ module.exports = {
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('development'),
'process.env.CURRENT_THEME': JSON.stringify(_.defaultTo(yargs.theme, 'default')),
'__REACT_DEVTOOLS_GLOBAL_HOOK__': '({ isDisabled: true })'
'process.env.CURRENT_THEME': JSON.stringify(_.defaultTo(yargs.theme, 'default'))
}),
new WriteFilePlugin(),
new webpack.HotModuleReplacementPlugin(),
@ -270,7 +256,6 @@ module.exports = {
extensions: [
'.js',
'.json',
'.jsx',
'.vue'
],
modules: [

View File

@ -177,18 +177,6 @@ module.exports = {
outputPath: 'fonts/'
}
}]
},
{
test: /.jsx$/,
loader: 'babel-loader',
exclude: /node_modules/,
options: {
presets: ['es2015', 'react']
}
},
{
test: /\.flow$/,
loader: 'ignore-loader'
}
]
},
@ -198,8 +186,7 @@ module.exports = {
new webpack.BannerPlugin('Wiki.js - wiki.js.org - Licensed under AGPL'),
new CopyWebpackPlugin([
{ from: 'client/static' },
{ from: './node_modules/prismjs/components', to: 'js/prism' },
{ from: './node_modules/graphql-voyager/dist/voyager.worker.js', to: 'js/' }
{ from: './node_modules/prismjs/components', to: 'js/prism' }
], {}),
new MiniCssExtractPlugin({
filename: 'css/bundle.[hash].css',
@ -245,8 +232,7 @@ module.exports = {
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production'),
'process.env.CURRENT_THEME': JSON.stringify(_.defaultTo(yargs.theme, 'default')),
'__REACT_DEVTOOLS_GLOBAL_HOOK__': '({ isDisabled: true })'
'process.env.CURRENT_THEME': JSON.stringify(_.defaultTo(yargs.theme, 'default'))
})
],
optimization: {
@ -273,7 +259,6 @@ module.exports = {
extensions: [
'.js',
'.json',
'jsx',
'.vue'
],
modules: [

View File

@ -42,8 +42,7 @@
"apollo-server": "2.9.3",
"apollo-server-express": "2.9.3",
"auto-load": "3.0.4",
"aws-sdk": "2.524.0",
"axios": "0.19.0",
"aws-sdk": "2.528.0",
"azure-search-client": "3.1.5",
"bcryptjs-then": "1.0.1",
"bluebird": "3.5.5",
@ -69,27 +68,27 @@
"express-brute": "1.0.1",
"express-session": "1.16.2",
"file-type": "12.3.0",
"filesize": "4.1.2",
"filesize": "4.2.0",
"fs-extra": "8.1.0",
"getos": "3.1.1",
"graphql": "14.5.4",
"graphql": "14.5.6",
"graphql-list-fields": "2.0.2",
"graphql-rate-limit-directive": "1.1.0",
"graphql-subscriptions": "1.1.0",
"graphql-tools": "4.0.5",
"highlight.js": "9.15.10",
"i18next": "17.0.13",
"i18next": "17.0.15",
"i18next-express-middleware": "1.8.2",
"i18next-node-fs-backend": "2.1.3",
"image-size": "0.7.4",
"image-size": "0.7.5",
"js-base64": "2.5.1",
"js-binary": "1.2.0",
"js-yaml": "3.13.1",
"jsonwebtoken": "8.5.1",
"klaw": "3.0.0",
"knex": "0.19.3",
"knex": "0.19.4",
"lodash": "4.17.15",
"markdown-it": "9.1.0",
"markdown-it": "10.0.0",
"markdown-it-abbr": "1.0.4",
"markdown-it-anchor": "5.2.4",
"markdown-it-attrs": "3.0.1",
@ -98,7 +97,7 @@
"markdown-it-external-links": "0.0.6",
"markdown-it-footnote": "3.0.2",
"markdown-it-imsize": "2.0.1",
"markdown-it-mark": "2.0.0",
"markdown-it-mark": "3.0.0",
"markdown-it-mathjax": "2.0.0",
"markdown-it-sub": "1.0.0",
"markdown-it-sup": "1.0.0",
@ -111,7 +110,7 @@
"mssql": "5.1.0",
"multer": "1.4.2",
"mysql2": "1.7.0",
"nanoid": "2.1.0",
"nanoid": "2.1.1",
"node-2fa": "1.1.2",
"node-cache": "4.2.1",
"nodemailer": "6.3.0",
@ -133,7 +132,7 @@
"passport-oauth2": "1.5.0",
"passport-okta-oauth": "0.0.1",
"passport-openidconnect": "0.0.2",
"passport-saml": "1.1.0",
"passport-saml": "1.2.0",
"passport-twitch": "1.0.3",
"pem-jwk": "2.0.0",
"pg": "7.12.1",
@ -148,7 +147,7 @@
"request-promise": "4.2.4",
"safe-regex": "2.0.2",
"sanitize-filename": "1.6.3",
"scim-query-filter-parser": "1.1.1",
"scim-query-filter-parser": "2.0.0",
"semver": "6.3.0",
"serve-favicon": "2.5.0",
"simple-git": "1.126.0",
@ -161,8 +160,6 @@
"uslug": "1.0.4",
"uuid": "3.3.3",
"validate.js": "0.13.1",
"validator": "11.1.0",
"validator-as-promised": "1.0.2",
"winston": "3.2.1",
"yargs": "14.0.0"
},
@ -180,7 +177,7 @@
"@babel/plugin-syntax-import-meta": "^7.2.0",
"@babel/polyfill": "^7.6.0",
"@babel/preset-env": "^7.6.0",
"@mdi/font": "4.3.95",
"@mdi/font": "4.4.95",
"@panter/vue-i18next": "0.15.1",
"@requarks/ckeditor5": "12.4.0-wiki.14",
"@vue/babel-preset-app": "3.11.0",
@ -203,7 +200,6 @@
"babel-plugin-lodash": "3.3.4",
"babel-plugin-prismjs": "1.1.1",
"babel-plugin-transform-imports": "2.0.0",
"brace": "0.11.1",
"cache-loader": "4.1.0",
"chart.js": "2.8.0",
"clean-webpack-plugin": "3.0.0",
@ -214,7 +210,7 @@
"cssnano": "4.1.10",
"duplicate-package-checker-webpack-plugin": "3.0.0",
"epic-spinners": "1.1.0",
"eslint": "6.3.0",
"eslint": "6.4.0",
"eslint-config-requarks": "1.0.7",
"eslint-config-standard": "14.1.0",
"eslint-plugin-import": "2.18.2",
@ -224,14 +220,12 @@
"eslint-plugin-vue": "5.2.3",
"fibers": "4.0.1",
"file-loader": "4.2.0",
"filepond": "4.6.1",
"filepond": "4.7.1",
"filepond-plugin-file-validate-type": "1.2.4",
"filesize.js": "1.0.2",
"grapesjs": "0.15.5",
"graphiql": "0.14.2",
"graphql-persisted-document-loader": "1.0.1",
"graphql-tag": "^2.10.1",
"graphql-voyager": "1.0.0-rc.28",
"hammerjs": "2.0.8",
"html-webpack-plugin": "4.0.0-beta.8",
"html-webpack-pug-plugin": "2.0.0",
@ -257,45 +251,39 @@
"pug-loader": "2.4.0",
"pug-plain-loader": "1.0.0",
"raw-loader": "3.1.0",
"react": "16.9.0",
"react-dom": "16.9.0",
"resolve-url-loader": "3.1.0",
"sass": "1.22.10",
"sass": "1.22.12",
"sass-loader": "8.0.0",
"sass-resources-loader": "2.0.1",
"script-ext-html-webpack-plugin": "2.1.4",
"simple-progress-webpack-plugin": "1.1.2",
"style-loader": "1.0.0",
"terser": "4.3.0",
"terser": "4.3.1",
"twemoji-awesome": "1.0.6",
"url-loader": "2.1.0",
"vee-validate": "2.2.15",
"velocity-animate": "1.5.2",
"viz.js": "2.1.2",
"vue": "2.6.10",
"vue-apollo": "3.0.0-rc.2",
"vue-apollo": "3.0.0-rc.4",
"vue-chartjs": "3.4.2",
"vue-clipboards": "1.3.0",
"vue-filepond": "5.1.3",
"vue-hot-reload-api": "2.3.3",
"vue-hot-reload-api": "2.3.4",
"vue-loader": "15.7.1",
"vue-material-design-icons": "3.4.0",
"vue-moment": "4.0.0",
"vue-router": "3.1.3",
"vue-simple-breakpoints": "1.0.3",
"vue-status-indicator": "1.2.1",
"vue-template-compiler": "2.6.10",
"vue-tour": "1.1.0",
"vue2-animate": "2.1.2",
"vuedraggable": "2.23.0",
"vuescroll": "4.14.3",
"vuetify": "2.0.15",
"vuescroll": "4.14.4",
"vuetify": "2.0.17",
"vuetify-loader": "1.3.0",
"vuex": "3.1.1",
"vuex-pathify": "1.4.0",
"vuex-persistedstate": "2.5.4",
"webpack": "4.39.3",
"webpack-bundle-analyzer": "3.4.1",
"webpack": "4.40.2",
"webpack-bundle-analyzer": "3.5.0",
"webpack-cli": "3.3.8",
"webpack-dev-middleware": "3.7.1",
"webpack-hot-middleware": "2.25.0",
@ -304,7 +292,7 @@
"webpackbar": "4.0.0",
"whatwg-fetch": "3.0.0",
"write-file-webpack-plugin": "4.5.1",
"xterm": "3.14.5",
"xterm": "4.0.1",
"zxcvbn": "4.4.2"
},
"browserslist": [

View File

@ -1,5 +1,5 @@
const _ = require('lodash')
const axios = require('axios')
const request = require('request-promise')
const bugsnag = require('@bugsnag/node')
const uuid = require('uuid/v4')
const qs = require('querystring')
@ -65,13 +65,13 @@ module.exports = {
},
sendBatchEvents(events) {
if (!this.enabled || WIKI.IS_DEBUG) { return false }
axios({
method: 'post',
request({
method: 'POST',
url: WIKI.data.telemetry.GA_REMOTE,
headers: {
'Content-type': 'text/plain'
},
data: events.map(ev => {
body: events.map(ev => {
return qs.stringify({
v: 1, // API version
tid: WIKI.data.telemetry.GA_ID, // Tracking ID

View File

@ -35,8 +35,8 @@ module.exports = {
}, []), 'key')
}
})
if (args.filter) { loggers = graphHelper.filter(loggers, args.filter) }
if (args.orderBy) { loggers = graphHelper.orderBy(loggers, args.orderBy) }
// if (args.filter) { loggers = graphHelper.filter(loggers, args.filter) }
if (args.orderBy) { loggers = _.sortBy(loggers, [args.orderBy]) }
return loggers
}
},

View File

@ -30,8 +30,8 @@ module.exports = {
}, []), 'key')
}
})
if (args.filter) { renderers = graphHelper.filter(renderers, args.filter) }
if (args.orderBy) { renderers = graphHelper.orderBy(renderers, args.orderBy) }
// if (args.filter) { renderers = graphHelper.filter(renderers, args.filter) }
if (args.orderBy) { renderers = _.sortBy(renderers, [args.orderBy]) }
return renderers
}
},

View File

@ -32,8 +32,8 @@ module.exports = {
}, []), 'key')
}
})
if (args.filter) { searchEngines = graphHelper.filter(searchEngines, args.filter) }
if (args.orderBy) { searchEngines = graphHelper.orderBy(searchEngines, args.orderBy) }
// if (args.filter) { searchEngines = graphHelper.filter(searchEngines, args.filter) }
if (args.orderBy) { searchEngines = _.sortBy(searchEngines, [args.orderBy]) }
return searchEngines
}
},

View File

@ -35,8 +35,8 @@ module.exports = {
}, []), 'key')
}
})
if (args.filter) { targets = graphHelper.filter(targets, args.filter) }
if (args.orderBy) { targets = graphHelper.orderBy(targets, args.orderBy) }
// if (args.filter) { targets = graphHelper.filter(targets, args.filter) }
if (args.orderBy) { targets = _.sortBy(targets, [args.orderBy]) }
return targets
},
async status(obj, args, context, info) {

View File

@ -1,5 +1,4 @@
const _ = require('lodash')
const Filter = require('scim-query-filter-parser')
module.exports = {
generateSuccess (msg) {
@ -18,13 +17,5 @@ module.exports = {
message: err.message || 'An unexpected error occured.'
}
return (complete) ? { responseResult: error } : error
},
filter (arr, filterString) {
const prvFilter = new Filter(_.toString(filterString).replace(/'/g, `"`))
return arr.filter(prvFilter.test)
},
orderBy (arr, orderString) {
let orderParams = _.zip(...orderString.split(',').map(ord => _.trim(ord).split(' ').map(_.trim)))
return _.orderBy(arr, orderParams[0], orderParams[1])
}
}

View File

@ -0,0 +1,6 @@
key: code
title: Code
description: Raw HTML editor
contentType: html
author: requarks.io
props: {}

817
yarn.lock

File diff suppressed because it is too large Load Diff