Merge branch '2.0/develop' of bitbucket.org:pypeclub/pype into 2.0/develop

This commit is contained in:
jezschaj 2019-04-26 17:19:13 +02:00
commit 7845825b21
57 changed files with 1332 additions and 289 deletions

View file

@ -35,6 +35,28 @@ class ClockifyModule:
self.set_menu_visibility()
def process_modules(self, modules):
if 'FtrackModule' in modules:
actions_path = os.path.sep.join([
os.path.dirname(__file__),
'ftrack_actions'
])
current = os.environ('FTRACK_ACTIONS_PATH', '')
if current:
current += os.pathsep
os.environ['FTRACK_ACTIONS_PATH'] = current + actions_path
if 'AvalonApps' in modules:
from launcher import lib
actions_path = os.path.sep.join([
os.path.dirname(__file__),
'launcher_actions'
])
current = os.environ.get('AVALON_ACTIONS', '')
if current:
current += os.pathsep
os.environ['AVALON_ACTIONS'] = current + actions_path
def start_timer_check(self):
self.bool_thread_check_running = True
if self.thread_timer_check is None:

View file

@ -1,3 +1,4 @@
import os
import sys
import argparse
import logging
@ -17,7 +18,9 @@ class StartClockify(BaseAction):
#: Action description.
description = 'Starts timer on clockify'
#: roles that are allowed to register this action
icon = 'https://clockify.me/assets/images/clockify-logo.png'
icon = '{}/app_icons/clockify.png'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
#: Clockify api
clockapi = ClockifyAPI()

View file

@ -1,3 +1,4 @@
import os
import sys
import argparse
import logging
@ -21,7 +22,9 @@ class SyncClocify(BaseAction):
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']
#: icon
icon = 'https://clockify.me/assets/images/clockify-logo-white.svg'
icon = '{}/app_icons/clockify-white.png'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
#: CLockifyApi
clockapi = ClockifyAPI()

View file

@ -1,9 +1,7 @@
from avalon import api, io
from pype.api import Logger
try:
from pype.clockify import ClockifyAPI
except Exception:
pass
from pype.clockify import ClockifyAPI
log = Logger().get_logger(__name__, "clockify_start")
@ -14,13 +12,10 @@ class ClockifyStart(api.Action):
label = "Clockify - Start Timer"
icon = "clockify_icon"
order = 500
exec("try: clockapi = ClockifyAPI()\nexcept: clockapi = None")
clockapi = ClockifyAPI()
def is_compatible(self, session):
"""Return whether the action is compatible with the session"""
if self.clockapi is None:
return False
if "AVALON_TASK" in session:
return True
return False

View file

@ -1,8 +1,5 @@
from avalon import api, io
try:
from pype.clockify import ClockifyAPI
except Exception:
pass
from pype.clockify import ClockifyAPI
from pype.api import Logger
log = Logger().get_logger(__name__, "clockify_sync")
@ -13,16 +10,11 @@ class ClockifySync(api.Action):
label = "Sync to Clockify"
icon = "clockify_white_icon"
order = 500
exec(
"try:\n\tclockapi = ClockifyAPI()"
"\n\thave_permissions = clockapi.validate_workspace_perm()"
"\nexcept:\n\tclockapi = None"
)
clockapi = ClockifyAPI()
have_permissions = clockapi.validate_workspace_perm()
def is_compatible(self, session):
"""Return whether the action is compatible with the session"""
if self.clockapi is None:
return False
return self.have_permissions
def process(self, session, **kwargs):

View file

@ -1,3 +1,4 @@
import os
import toml
import time
from pype.ftrack import AppAction
@ -35,10 +36,15 @@ def registerApp(app, session):
label = apptoml.get('ftrack_label', app.get('label', name))
icon = apptoml.get('ftrack_icon', None)
description = apptoml.get('description', None)
preactions = apptoml.get('preactions', [])
if icon:
icon = icon.format(os.environ.get('PYPE_STATICS_SERVER', ''))
# register action
AppAction(
session, label, name, executable, variant, icon, description
session, label, name, executable, variant,
icon, description, preactions
).register()

View file

@ -1,8 +1,8 @@
import os
import sys
import argparse
import logging
import subprocess
import os
from pype.vendor import ftrack_api
from pype.ftrack import BaseAction
@ -15,9 +15,8 @@ class ComponentOpen(BaseAction):
# Action label
label = 'Open File'
# Action icon
icon = (
'https://cdn4.iconfinder.com/data/icons/rcons-application/32/'
'application_go_run-256.png'
icon = '{}/ftrack/action_icons/ComponentOpen.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):

View file

@ -114,10 +114,8 @@ class CustomAttributes(BaseAction):
description = 'Creates Avalon/Mongo ID for double check'
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']
icon = (
'https://cdn4.iconfinder.com/data/icons/'
'ios-web-user-interface-multi-circle-flat-vol-4/512/'
'Bullet_list_menu_lines_points_items_options-512.png'
icon = '{}/ftrack/action_icons/CustomAttributes.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def __init__(self, session):

View file

@ -3,11 +3,9 @@ import sys
import logging
import argparse
import re
# import json
from pype.vendor import ftrack_api
from pype.ftrack import BaseAction
# from pype import api as pype, lib as pypelib
from avalon import lib as avalonlib
from avalon.tools.libraryloader.io_nonsingleton import DbConnector
from pypeapp import config, Anatomy
@ -24,10 +22,10 @@ class CreateFolders(BaseAction):
label = 'Create Folders'
#: Action Icon.
icon = (
'https://cdn1.iconfinder.com/data/icons/hawcons/32/'
'698620-icon-105-folder-add-512.png'
icon = '{}/ftrack/action_icons/CreateFolders.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
db = DbConnector()
def discover(self, session, entities, event):
@ -239,17 +237,6 @@ class CreateFolders(BaseAction):
output.extend(self.get_notask_children(child))
return output
# def get_presets(self):
# fpath_items = [pypelib.get_presets_path(), 'tools', 'sw_folders.json']
# filepath = os.path.normpath(os.path.sep.join(fpath_items))
# presets = dict()
# try:
# with open(filepath) as data_file:
# presets = json.load(data_file)
# except Exception as e:
# self.log.warning('Wasn\'t able to load presets')
# return dict(presets)
def template_format(self, template, data):
partial_data = PartialDict(data)

View file

@ -20,9 +20,8 @@ class CreateProjectFolders(BaseAction):
description = 'Creates folder structure'
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']
icon = (
'https://cdn2.iconfinder.com/data/icons/'
'buttons-9/512/Button_Add-01.png'
icon = '{}/ftrack/action_icons/CreateProjectFolders.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
pattern_array = re.compile('\[.*\]')
@ -42,7 +41,7 @@ class CreateProjectFolders(BaseAction):
else:
project = entity['project']
presets = config.load_presets()['tools']['project_folder_structure']
presets = config.get_presets()['tools']['project_folder_structure']
try:
# Get paths based on presets
basic_paths = self.get_path_items(presets)
@ -142,28 +141,6 @@ class CreateProjectFolders(BaseAction):
self.session.commit()
return new_ent
# def load_presets(self):
# preset_items = [
# pypelib.get_presets_path(),
# 'tools',
# 'project_folder_structure.json'
# ]
# filepath = os.path.sep.join(preset_items)
#
# # Load folder structure template from presets
# presets = dict()
# try:
# with open(filepath) as data_file:
# presets = json.load(data_file)
# except Exception as e:
# msg = 'Unable to load Folder structure preset'
# self.log.warning(msg)
# return {
# 'success': False,
# 'message': msg
# }
# return presets
def get_path_items(self, in_dict):
output = []
for key, value in in_dict.items():

View file

@ -1,3 +1,4 @@
import os
import sys
import logging
from bson.objectid import ObjectId
@ -16,10 +17,8 @@ class DeleteAsset(BaseAction):
label = 'Delete Asset/Subsets'
#: Action description.
description = 'Removes from Avalon with all childs and asset from Ftrack'
icon = (
'https://cdn4.iconfinder.com/data/icons/'
'ios-web-user-interface-multi-circle-flat-vol-5/512/'
'Delete_dustbin_empty_recycle_recycling_remove_trash-512.png'
icon = '{}/ftrack/action_icons/DeleteAsset.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']

View file

@ -1,3 +1,4 @@
import os
import sys
import logging
import argparse
@ -17,10 +18,8 @@ class AssetsRemover(BaseAction):
description = 'Removes assets from Ftrack and Avalon db with all childs'
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']
icon = (
'https://cdn4.iconfinder.com/data/icons/'
'ios-web-user-interface-multi-circle-flat-vol-5/512/'
'Clipboard_copy_delete_minus_paste_remove-512.png'
icon = '{}/ftrack/action_icons/AssetsRemover.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
#: Db
db = DbConnector()

View file

@ -16,16 +16,16 @@ class DJVViewAction(BaseAction):
identifier = "djvview-launch-action"
label = "DJV View"
description = "DJV View Launcher"
icon = "http://a.fsdn.com/allura/p/djv/icon"
icon = '{}/app_icons/djvView.png'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
type = 'Application'
def __init__(self, session):
'''Expects a ftrack_api.Session instance'''
super().__init__(session)
self.djv_path = None
self.config_data = None
# self.load_config_data()
self.config_data = config.get_presets()['djv_view']['config']
self.set_djv_path()
@ -54,22 +54,6 @@ class DJVViewAction(BaseAction):
return True
return False
def load_config_data(self):
# path_items = [pypelib.get_presets_path(), 'djv_view', 'config.json']
path_items = config.get_presets()['djv_view']['config']
filepath = os.path.sep.join(path_items)
data = dict()
try:
with open(filepath) as data_file:
data = json.load(data_file)
except Exception as e:
log.warning(
'Failed to load data from DJV presets file ({})'.format(e)
)
self.config_data = data
def set_djv_path(self):
for path in self.config_data.get("djv_paths", []):
if os.path.exists(path):

View file

@ -1,6 +1,8 @@
import os
import sys
import argparse
import logging
import json
from pype.vendor import ftrack_api
from pype.ftrack import BaseAction
@ -17,9 +19,8 @@ class JobKiller(BaseAction):
description = 'Killing selected running jobs'
#: roles that are allowed to register this action
role_list = ['Pypeclub', 'Administrator']
icon = (
'https://cdn2.iconfinder.com/data/icons/new-year-resolutions/64/'
'resolutions-23-512.png'
icon = '{}/ftrack/action_icons/JobKiller.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):
@ -37,14 +38,18 @@ class JobKiller(BaseAction):
).all()
items = []
import json
item_splitter = {'type': 'label', 'value': '---'}
for job in jobs:
data = json.loads(job['data'])
try:
data = json.loads(job['data'])
desctiption = data['description']
except Exception:
desctiption = '*No description*'
user = job['user']['username']
created = job['created_at'].strftime('%d.%m.%Y %H:%M:%S')
label = '{} - {} - {}'.format(
data['description'], created, user
desctiption, created, user
)
item_label = {
'type': 'label',

View file

@ -1,3 +1,4 @@
import os
import sys
import argparse
import logging
@ -15,9 +16,8 @@ class MultipleNotes(BaseAction):
label = 'Multiple Notes'
#: Action description.
description = 'Add same note to multiple Asset Versions'
icon = (
'https://cdn2.iconfinder.com/data/icons/'
'mixed-rounded-flat-icon/512/note_1-512.png'
icon = '{}/ftrack/action_icons/MultipleNotes.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):

View file

@ -17,7 +17,9 @@ class RVAction(BaseAction):
identifier = "rv.launch.action"
label = "rv"
description = "rv Launcher"
icon = "https://img.icons8.com/color/48/000000/circled-play.png"
icon = '{}/ftrack/action_icons/RV.png'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
type = 'Application'
def __init__(self, session):
@ -39,7 +41,6 @@ class RVAction(BaseAction):
)
else:
# if not, fallback to config file location
# self.load_config_data()
self.config_data = config.get_presets()['djv_view']['config']
self.set_rv_path()
@ -61,21 +62,6 @@ class RVAction(BaseAction):
return True
return False
def load_config_data(self):
path_items = config.get_presets['rv']['config.json']
filepath = os.path.sep.join(path_items)
data = dict()
try:
with open(filepath) as data_file:
data = json.load(data_file)
except Exception as e:
log.warning(
'Failed to load data from RV presets file ({})'.format(e)
)
self.config_data = data
def set_rv_path(self):
self.rv_path = self.config_data.get("rv_path")

View file

@ -0,0 +1,79 @@
from pype.vendor import ftrack_api
from pype.ftrack import BaseAction
class StartTimer(BaseAction):
'''Starts timer.'''
identifier = 'start.timer'
label = 'Start timer'
description = 'Starts timer'
def discover(self, session, entities, event):
return False
def _handle_result(*arg):
return
def launch(self, session, entities, event):
entity = entities[0]
if entity.entity_type.lower() != 'task':
return
self.start_ftrack_timer(entity)
try:
self.start_clockify_timer(entity)
except Exception:
self.log.warning(
'Failed starting Clockify timer for task: ' + entity['name']
)
return
def start_ftrack_timer(self, task):
user_query = 'User where username is "{}"'.format(self.session.api_user)
user = self.session.query(user_query).one()
self.log.info('Starting Ftrack timer for task: ' + task['name'])
user.start_timer(task, force=True)
self.session.commit()
def start_clockify_timer(self, task):
# Validate Clockify settings if Clockify is required
clockify_timer = os.environ.get('CLOCKIFY_WORKSPACE', None)
if clockify_timer is None:
return
from pype.clockify import ClockifyAPI
clockapi = ClockifyAPI()
if clockapi.verify_api() is False:
return
task_type = task['type']['name']
project_name = task['project']['full_name']
def get_parents(entity):
output = []
if entity.entity_type.lower() == 'project':
return output
output.extend(get_parents(entity['parent']))
output.append(entity['name'])
return output
desc_items = get_parents(task['parent'])
desc_items.append(task['name'])
description = '/'.join(desc_items)
project_id = clockapi.get_project_id(project_name)
tag_ids = []
tag_ids.append(clockapi.get_tag_id(task_type))
clockapi.start_time_entry(
description, project_id, tag_ids=tag_ids
)
self.log.info('Starting Clockify timer for task: ' + task['name'])
def register(session, **kw):
'''Register plugin. Called when used as an plugin.'''
if not isinstance(session, ftrack_api.session.Session):
return
StartTimer(session).register()

View file

@ -50,9 +50,8 @@ class SyncToAvalon(BaseAction):
#: Action description.
description = 'Send data from Ftrack to Avalon'
#: Action icon.
icon = (
'https://cdn1.iconfinder.com/data/icons/hawcons/32/'
'699650-icon-92-inbox-download-512.png'
icon = '{}/ftrack/action_icons/SyncToAvalon-local.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
#: roles that are allowed to register this action
role_list = ['Pypeclub']

View file

@ -1,8 +1,8 @@
import os
import sys
import argparse
import logging
import collections
import os
import json
import re
@ -27,9 +27,8 @@ class TestAction(BaseAction):
priority = 10000
#: roles that are allowed to register this action
role_list = ['Pypeclub']
icon = (
'https://cdn4.iconfinder.com/data/icons/hospital-19/512/'
'8_hospital-512.png'
icon = '{}/ftrack/action_icons/TestAction.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):

View file

@ -1,3 +1,4 @@
import os
import sys
import argparse
import logging
@ -15,9 +16,8 @@ class ThumbToChildren(BaseAction):
# Action label
label = 'Thumbnail to Children'
# Action icon
icon = (
'https://cdn3.iconfinder.com/data/icons/transfers/100/'
'239322-download_transfer-128.png'
icon = '{}/ftrack/action_icons/thumbToChildren.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):

View file

@ -1,3 +1,4 @@
import os
import sys
import argparse
import logging
@ -14,9 +15,8 @@ class ThumbToParent(BaseAction):
# Action label
label = 'Thumbnail to Parent'
# Action icon
icon = (
"https://cdn3.iconfinder.com/data/icons/transfers/100/"
"239419-upload_transfer-512.png"
icon = '{}/ftrack/action_icons/thumbToParent.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def discover(self, session, entities, event):

View file

@ -1,72 +0,0 @@
from pype.vendor import ftrack_api
from pype.ftrack import BaseEvent
class CollectEntities(BaseEvent):
priority = 1
def _launch(self, event):
entities = self.translate_event(event)
event['data']['entities_object'] = entities
return
def translate_event(self, event):
selection = event['data'].get('selection', [])
entities = list()
for entity in selection:
ent = self.session.get(
self.get_entity_type(entity),
entity.get('entityId')
)
entities.append(ent)
return entities
def get_entity_type(self, entity):
'''Return translated entity type tht can be used with API.'''
# Get entity type and make sure it is lower cased. Most places except
# the component tab in the Sidebar will use lower case notation.
entity_type = entity.get('entityType').replace('_', '').lower()
for schema in self.session.schemas:
alias_for = schema.get('alias_for')
if (
alias_for and isinstance(alias_for, str) and
alias_for.lower() == entity_type
):
return schema['id']
for schema in self.session.schemas:
if schema['id'].lower() == entity_type:
return schema['id']
raise ValueError(
'Unable to translate entity type: {0}.'.format(entity_type)
)
def register(self):
self.session.event_hub.subscribe(
'topic=ftrack.action.discover'
' and source.user.username={0}'.format(self.session.api_user),
self._launch,
priority=self.priority
)
self.session.event_hub.subscribe(
'topic=ftrack.action.launch'
' and source.user.username={0}'.format(self.session.api_user),
self._launch,
priority=self.priority
)
def register(session, **kw):
'''Register plugin. Called when used as an plugin.'''
if not isinstance(session, ftrack_api.session.Session):
return
CollectEntities(session).register()

View file

@ -49,9 +49,8 @@ class Sync_To_Avalon(BaseAction):
#: Action description.
description = 'Send data from Ftrack to Avalon'
#: Action icon.
icon = (
'https://cdn1.iconfinder.com/data/icons/hawcons/32/'
'699650-icon-92-inbox-download-512.png'
icon = '{}/ftrack/action_icons/SyncToAvalon.svg'.format(
os.environ.get('PYPE_STATICS_SERVER', '')
)
def register(self):

View file

@ -153,6 +153,7 @@ class FtrackModule:
parent_menu.addMenu(self.menu)
def tray_start(self):
self.validate()
# Definition of visibility of each menu actions

View file

@ -66,6 +66,10 @@ class BaseAction(BaseHandler):
self.session, event
)
preactions_launched = self._handle_preactions(self.session, event)
if preactions_launched is False:
return
interface = self._interface(
self.session, *args
)

View file

@ -23,10 +23,11 @@ class AppAction(BaseHandler):
'''
type = 'Application'
preactions = ['start.timer']
def __init__(
self, session, label, name, executable,
variant=None, icon=None, description=None
variant=None, icon=None, description=None, preactions=[]
):
super().__init__(session)
'''Expects a ftrack_api.Session instance'''
@ -44,6 +45,7 @@ class AppAction(BaseHandler):
self.variant = variant
self.icon = icon
self.description = description
self.preactions.extend(preactions)
def register(self):
'''Registers the action, subscribing the discover and launch topics.'''
@ -117,6 +119,12 @@ class AppAction(BaseHandler):
self.session, event
)
preactions_launched = self._handle_preactions(
self.session, event
)
if preactions_launched is False:
return
response = self.launch(
self.session, *args
)
@ -148,25 +156,6 @@ class AppAction(BaseHandler):
entity = entities[0]
project_name = entity['project']['full_name']
# Validate Clockify settings if Clockify is required
clockify_timer = os.environ.get('CLOCKIFY_WORKSPACE', None)
if clockify_timer is not None:
from pype.clockify import ClockifyAPI
clockapi = ClockifyAPI()
if clockapi.verify_api() is False:
title = 'Launch message'
header = '# You Can\'t launch **any Application**'
message = (
'<p>You don\'t have set Clockify API'
' key in Clockify settings</p>'
)
items = [
{'type': 'label', 'value': header},
{'type': 'label', 'value': message}
]
self.show_interface(event, items, title)
return False
database = pypelib.get_avalon_database()
# Get current environments
@ -335,39 +324,6 @@ class AppAction(BaseHandler):
}
pass
# RUN TIMER IN FTRACK
username = event['source']['user']['username']
user_query = 'User where username is "{}"'.format(username)
user = session.query(user_query).one()
task = session.query('Task where id is {}'.format(entity['id'])).one()
self.log.info('Starting timer for task: ' + task['name'])
user.start_timer(task, force=True)
# RUN TIMER IN Clockify
if clockify_timer is not None:
task_type = task['type']['name']
project_name = task['project']['full_name']
def get_parents(entity):
output = []
if entity.entity_type.lower() == 'project':
return output
output.extend(get_parents(entity['parent']))
output.append(entity['name'])
return output
desc_items = get_parents(task['parent'])
desc_items.append(task['name'])
description = '/'.join(desc_items)
project_id = clockapi.get_project_id(project_name)
tag_ids = []
tag_ids.append(clockapi.get_tag_id(task_type))
clockapi.start_time_entry(
description, project_id, tag_ids=tag_ids
)
# Change status of task to In progress
config = get_config_data()

View file

@ -25,6 +25,7 @@ class BaseHandler(object):
priority = 100
# Type is just for logging purpose (e.g.: Action, Event, Application,...)
type = 'No-type'
preactions = []
def __init__(self, session):
'''Expects a ftrack_api.Session instance'''
@ -46,18 +47,7 @@ class BaseHandler(object):
else:
label = '{} {}'.format(self.label, self.variant)
try:
if hasattr(self, "role_list") and len(self.role_list) > 0:
username = self.session.api_user
user = self.session.query(
'User where username is "{}"'.format(username)
).one()
available = False
for role in user['user_security_roles']:
if role['security_role']['name'] in self.role_list:
available = True
break
if available is False:
raise MissingPermision
self._preregister()
start_time = time.perf_counter()
func(*args, **kwargs)
@ -119,6 +109,36 @@ class BaseHandler(object):
def reset_session(self):
self.session.reset()
def _preregister(self):
if hasattr(self, "role_list") and len(self.role_list) > 0:
username = self.session.api_user
user = self.session.query(
'User where username is "{}"'.format(username)
).one()
available = False
for role in user['user_security_roles']:
if role['security_role']['name'] in self.role_list:
available = True
break
if available is False:
raise MissingPermision
# Custom validations
result = self.preregister()
if result is True:
return
msg = "Pre-register conditions were not met"
if isinstance(result, str):
msg = result
raise Exception(msg)
def preregister(self):
'''
Preregister conditions.
Registration continues if returns True.
'''
return True
def register(self):
'''
Registers the action, subscribing the discover and launch topics.
@ -227,6 +247,10 @@ class BaseHandler(object):
self.session, event
)
preactions_launched = self._handle_preactions(self.session, event)
if preactions_launched is False:
return
interface = self._interface(
self.session, *args
)
@ -263,6 +287,47 @@ class BaseHandler(object):
'''
raise NotImplementedError()
def _handle_preactions(self, session, event):
# If preactions are not set
if len(self.preactions) == 0:
return True
# If no selection
selection = event.get('data', {}).get('selection', None)
if (selection is None):
return False
# If preactions were already started
if event['data'].get('preactions_launched', None) is True:
return True
# Launch preactions
for preaction in self.preactions:
event = ftrack_api.event.base.Event(
topic='ftrack.action.launch',
data=dict(
actionIdentifier=preaction,
selection=selection
),
source=dict(
user=dict(username=session.api_user)
)
)
session.event_hub.publish(event, on_error='ignore')
# Relaunch this action
event = ftrack_api.event.base.Event(
topic='ftrack.action.launch',
data=dict(
actionIdentifier=self.identifier,
selection=selection,
preactions_launched=True
),
source=dict(
user=dict(username=session.api_user)
)
)
session.event_hub.publish(event, on_error='ignore')
return False
def _interface(self, *args):
interface = self.interface(*args)
if interface:

View file

@ -2,14 +2,15 @@ import os
import logging
import weakref
from maya import utils, cmds, mel
from maya import utils, cmds
from avalon import api as avalon, pipeline, maya
from avalon.maya.pipeline import IS_HEADLESS
from avalon.tools import workfiles
from pyblish import api as pyblish
from pypeapp import config
from ..lib import (
update_task_from_path,
any_outdated
)
from . import menu
@ -107,19 +108,39 @@ def on_init(_):
# Force load objExport plug-in (requested by artists)
cmds.loadPlugin("objExport", quiet=True)
# Force load objExport plug-in (requested by artists)
cmds.loadPlugin("spore", quiet=True)
from .customize import (
override_component_mask_commands,
override_toolbox_ui
)
safe_deferred(override_component_mask_commands)
launch_workfiles = True
try:
presets = config.get_presets()
launch_workfiles = presets['tools']['workfiles']['start_on_app_launch']
except KeyError:
log.info(
"Workfiles app start on launch configuration was not found."
" Defaulting to False."
)
launch_workfiles = False
if launch_workfiles:
safe_deferred(launch_workfiles_app)
if not IS_HEADLESS:
safe_deferred(override_toolbox_ui)
def launch_workfiles_app(*args):
workfiles.show(
os.path.join(
cmds.workspace(query=True, rootDirectory=True),
cmds.workspace(fileRuleEntry="scene")
)
)
def on_before_save(return_code, _):
"""Run validation for scene's FPS prior to saving"""
return lib.validate_fps()

View file

@ -4,14 +4,18 @@ import pyblish.api
from avalon import io, api
class CollectAssumedDestination(pyblish.api.InstancePlugin):
class CollectAssumedDestination(pyblish.api.ContextPlugin):
"""Generate the assumed destination path where the file will be stored"""
label = "Collect Assumed Destination"
order = pyblish.api.CollectorOrder + 0.498
exclude_families = ["clip"]
def process(self, instance):
def process(self, context):
for instance in context:
self.process_item(instance)
def process_item(self, instance):
if [ef for ef in self.exclude_families
if instance.data["family"] in ef]:
return
@ -19,7 +23,6 @@ class CollectAssumedDestination(pyblish.api.InstancePlugin):
self.create_destination_template(instance)
template_data = instance.data["assumedTemplateData"]
template = instance.data["template"]
anatomy = instance.context.data['anatomy']
# self.log.info(anatomy.anatomy())

View file

@ -2,6 +2,4 @@ from .idle_manager import IdleManager
def tray_init(tray_widget, main_widget):
manager = IdleManager()
manager.start()
return manager
return IdleManager()

View file

@ -17,8 +17,12 @@ class IdleManager(QtCore.QThread):
super(IdleManager, self).__init__()
self.log = Logger().get_logger(self.__class__.__name__)
self.signal_reset_timer.connect(self._reset_time)
self._failed = False
self._is_running = False
def tray_start(self):
self.start()
def add_time_signal(self, emit_time, signal):
""" If any module want to use IdleManager, need to use add_time_signal
:param emit_time: time when signal will be emitted
@ -30,6 +34,10 @@ class IdleManager(QtCore.QThread):
self.time_signals[emit_time] = []
self.time_signals[emit_time].append(signal)
@property
def failed(self):
return self._failed
@property
def is_running(self):
return self._is_running
@ -60,6 +68,8 @@ class IdleManager(QtCore.QThread):
thread_keyboard.signal_stop.emit()
thread_keyboard.terminate()
thread_keyboard.wait()
self._failed = True
self._is_running = False
self.log.info('IdleManager has stopped')

View file

@ -0,0 +1,5 @@
from .statics_server import StaticsServer
def tray_init(tray_widget, main_widget):
return StaticsServer()

View file

@ -0,0 +1,190 @@
import os
import socket
import http.server
import urllib
import posixpath
import socketserver
from Qt import QtCore
from pypeapp import config, Logger
DIRECTORY = os.path.sep.join([os.environ['PYPE_MODULE_ROOT'], 'res'])
class Handler(http.server.SimpleHTTPRequestHandler):
directory=DIRECTORY
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def send_head(self):
"""Common code for GET and HEAD commands.
This sends the response code and MIME headers.
Return value is either a file object (which has to be copied
to the outputfile by the caller unless the command was HEAD,
and must be closed by the caller under all circumstances), or
None, in which case the caller has nothing further to do.
"""
path = self.translate_path(self.path)
f = None
if os.path.isdir(path):
parts = urllib.parse.urlsplit(self.path)
if not parts.path.endswith('/'):
# redirect browser - doing basically what apache does
self.send_response(HTTPStatus.MOVED_PERMANENTLY)
new_parts = (parts[0], parts[1], parts[2] + '/',
parts[3], parts[4])
new_url = urllib.parse.urlunsplit(new_parts)
self.send_header("Location", new_url)
self.end_headers()
return None
for index in "index.html", "index.htm":
index = os.path.join(path, index)
if os.path.exists(index):
path = index
break
else:
return self.list_directory(path)
ctype = self.guess_type(path)
try:
f = open(path, 'rb')
except OSError:
self.send_error(HTTPStatus.NOT_FOUND, "File not found")
return None
try:
fs = os.fstat(f.fileno())
# Use browser cache if possible
if ("If-Modified-Since" in self.headers
and "If-None-Match" not in self.headers):
# compare If-Modified-Since and time of last file modification
try:
ims = email.utils.parsedate_to_datetime(
self.headers["If-Modified-Since"])
except (TypeError, IndexError, OverflowError, ValueError):
# ignore ill-formed values
pass
else:
if ims.tzinfo is None:
# obsolete format with no timezone, cf.
# https://tools.ietf.org/html/rfc7231#section-7.1.1.1
ims = ims.replace(tzinfo=datetime.timezone.utc)
if ims.tzinfo is datetime.timezone.utc:
# compare to UTC datetime of last modification
last_modif = datetime.datetime.fromtimestamp(
fs.st_mtime, datetime.timezone.utc)
# remove microseconds, like in If-Modified-Since
last_modif = last_modif.replace(microsecond=0)
if last_modif <= ims:
self.send_response(HTTPStatus.NOT_MODIFIED)
self.end_headers()
f.close()
return None
self.send_response(HTTPStatus.OK)
self.send_header("Content-type", ctype)
self.send_header("Content-Length", str(fs[6]))
self.send_header("Last-Modified",
self.date_time_string(fs.st_mtime))
self.end_headers()
return f
except:
f.close()
raise
def translate_path(self, path):
"""Translate a /-separated PATH to the local filename syntax.
Components that mean special things to the local file system
(e.g. drive or directory names) are ignored. (XXX They should
probably be diagnosed.)
"""
# abandon query parameters
path = path.split('?',1)[0]
path = path.split('#',1)[0]
# Don't forget explicit trailing slash when normalizing. Issue17324
trailing_slash = path.rstrip().endswith('/')
try:
path = urllib.parse.unquote(path, errors='surrogatepass')
except UnicodeDecodeError:
path = urllib.parse.unquote(path)
path = posixpath.normpath(path)
words = path.split('/')
words = filter(None, words)
path = self.directory
for word in words:
if os.path.dirname(word) or word in (os.curdir, os.pardir):
# Ignore components that are not a simple file/directory name
continue
path = os.path.join(path, word)
if trailing_slash:
path += '/'
return path
class StaticsServer(QtCore.QThread):
""" Measure user's idle time in seconds.
Idle time resets on keyboard/mouse input.
Is able to emit signals at specific time idle.
"""
def __init__(self):
super(StaticsServer, self).__init__()
self._is_running = False
self._failed = False
self.log = Logger().get_logger(self.__class__.__name__)
try:
self.presets = config.get_presets().get(
'services', {}).get('statics_server')
except Exception:
self.presets = {'default_port': 8010, 'exclude_ports': []}
self.port = self.find_port()
def tray_start(self):
self.start()
@property
def is_running(self):
return self._is_running
@property
def failed(self):
return self._failed
def stop(self):
self._is_running = False
def run(self):
self._is_running = True
try:
with socketserver.TCPServer(("", self.port), Handler) as httpd:
while self._is_running:
httpd.handle_request()
except Exception:
self._failed = True
self._is_running = False
def find_port(self):
start_port = self.presets['default_port']
exclude_ports = self.presets['exclude_ports']
found_port = None
# port check takes time so it's lowered to 100 ports
for port in range(start_port, start_port+100):
if port in exclude_ports:
continue
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
result = sock.connect_ex(('localhost', port))
if result != 0:
found_port = port
if found_port is not None:
break
if found_port is None:
return None
os.environ['PYPE_STATICS_SERVER'] = 'http://localhost:{}'.format(found_port)
return found_port

View file

@ -25,6 +25,7 @@ class TimersManager(metaclass=Singleton):
when user idles for a long time (set in presets).
"""
modules = []
failed = False
is_running = False
last_task = None

BIN
res/app_icons/Aport.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
res/app_icons/clockify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
res/app_icons/djvView.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
res/app_icons/houdini.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
res/app_icons/maya.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
res/app_icons/nuke.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
res/app_icons/premiere.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
res/app_icons/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#00AEEE"/><stop offset="1" style="stop-color:#0095DA"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#0095DA"/><stop offset="1" style="stop-color:#00AEEE"/></linearGradient><path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><g><path d="M315.8906555,167.4933319h-28.3743896C287.5162659,154.4944,277.020813,144,264.0218811,144 c-13.0010834,0-23.4944153,10.4944-23.4944153,23.4933319h-28.3760071v40.6847992h103.7391968V167.4933319z" opacity="0.3"/><path d="M325.8906555,187.4895935v30.6885376H202.1504059v-30.6885376H164.354126V384h199.2911987V187.4895935 H325.8906555z M309.4405212,336.4693298l-7.0703735,7.0698853l-38.3712158-38.3712158l-38.3717346,38.3712158 l-7.0704041-7.0698853l38.3717346-38.3717346l-38.3717346-38.3717346l7.0704041-7.0698547l38.3717346,38.3711853 l38.3712158-38.3711853l7.0703735,7.0698547l-38.3717346,38.3717346L309.4405212,336.4693298z" opacity="0.3"/></g><g><path d="M307.8906555,159.4933319h-28.3743896C279.5162659,146.4944,269.020813,136,256.0218811,136 c-13.0010834,0-23.4944153,10.4944-23.4944153,23.4933319h-28.3760071v40.6847992h103.7391968V159.4933319z" fill="#FFFFFF"/><path d="M317.8906555,179.4895935v30.6885376H194.1504059v-30.6885376H156.354126V376h199.2911987V179.4895935 H317.8906555z M301.4405212,328.4693298l-7.0703735,7.0698853l-38.3712158-38.3712158l-38.3717346,38.3712158 l-7.0704041-7.0698853l38.3717346-38.3717346l-38.3717346-38.3717346l7.0704041-7.0698547l38.3717346,38.3711853 l38.3712158-38.3711853l7.0703735,7.0698547l-38.3717346,38.3717346L301.4405212,328.4693298z" fill="#FFFFFF"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="0.0000038" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#95A5A6"/><stop offset="1" style="stop-color:#7F8C8D"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666679" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#7F8C8D"/><stop offset="1" style="stop-color:#95A5A6"/></linearGradient><path d="M256,469.3338623c-117.6314697,0-213.3333282-95.7023926-213.3333282-213.3333435 c0-117.6314545,95.7018585-213.333313,213.3333282-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><g><path d="M172.7434692,226.2037354l-28.622406,139.9381409 c-0.0623932,0.275177,0.1472015,0.5370483,0.4293365,0.5370483h210.706131L384,226.2037354H172.7434692z" opacity="0.3"/><polygon opacity="0.3" points="355.2565308,216.2026672 355.2565308,187.7279968 245.9622192,187.7279968 218.8202667,161.3205261 144,161.3205261 144,316.8346558 164.5797272,216.2026672 "/></g><g><path d="M164.7434692,218.2037354l-28.622406,139.9381409 c-0.0623932,0.275177,0.1472015,0.5370483,0.4293365,0.5370483h210.706131L376,218.2037354H164.7434692z" fill="#FFFFFF"/><polygon fill="#FFFFFF" points="347.2565308,208.2026672 347.2565308,179.7279968 237.9622192,179.7279968 210.8202667,153.3205261 136,153.3205261 136,308.8346558 156.5797424,208.2026672 "/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,51 @@
<?xml version="1.0" ?>
<svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#8DC63F"/>
<stop offset="1" style="stop-color:#66A82F"/>
</linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#66A82F"/>
<stop offset="1" style="stop-color:#8DC63F"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g>
<g>
<path d="M144,301.7520142V384h120h120v-82.2479858v-81.3093414H144V301.7520142z M237.8101349,314.8128052
m -15, -5
a 45,45 0 1,1 100,0
a 45,45 0 1,1 -100,0
m 90, 0
a 15,15 0 1,0 -80,0
a 15,15 0 1,0 80,0
m -70, 5
v-10 h25 v-25 h10 v25 h25 v10 h-25 v25 h-10 v-25 h-25
" opacity="0.3"/>
<polygon opacity="0.3" points="259.8346558,176.3594666 229,144 144,144 144,210.4426727 384,210.4426727 384,176.3594666 "/>
</g>
<g>
<path d="
M136,293.7520142V376
h120h120
v-82.2479858
v-81.3093414
H136V293.7520142z
m 72, 0
a 45,45 0 1,1 100,0
a 45,45 0 1,1 -100,0
m 90, 0
a 15,15 0 1,0 -80,0
a 15,15 0 1,0 80,0
M229.8101349,296.8128052
v-10 h25 v-25 h10 v25 h25 v10 h-25 v25 h-10 v-25 h-25
" fill="#FFFFFF"/>
<polygon fill="#FFFFFF" points="251.834671,168.3594666 221,136 136,136 136,202.4426727 376,202.4426727 376,168.3594666 "/>
</g>
</g>
</svg>
<!-- A 45 45, 1, 1, 1, 175 265 Z -->
<!-- v-10 h25 v-25 h10 v25 h25 v10 h-25 v25 h-10 v-25 h-25 -->
<!-- A 45 45, 1, 1, 1, 125 275 -->

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1,51 @@
<?xml version="1.0" ?>
<svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#935BA2"/>
<stop offset="1" style="stop-color:#6E2B7B"/>
</linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#6E2B7B"/>
<stop offset="1" style="stop-color:#935BA2"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g>
<g>
<path d="M144,301.7520142V384h120h120v-82.2479858v-81.3093414H144V301.7520142z M237.8101349,314.8128052
m -40, -10
a 45,45 0 1,1 140,0
a 45,45 0 1,1 -140,0
m 125, 0
a 15,15 0 1,0 -115,0
a 15,15 0 1,0 115,0
m -95, 10
v-20 h25 v-25 h20 v25 h25 v20 h-25 v25 h-20 v-25 h-25
" opacity="0.3"/>
<polygon opacity="0.3" points="259.8346558,176.3594666 229,144 144,144 144,210.4426727 384,210.4426727 384,176.3594666 "/>
</g>
<g>
<path d="
M136,293.7520142V376
h120h120
v-82.2479858
v-81.3093414
H136V293.7520142z
m 48, 0
a 45,45 0 1,1 150,0
a 45,45 0 1,1 -150,0
m 135, 0
a 15,15 0 1,0 -120,0
a 15,15 0 1,0 120,0
m -95, 10
v-20 h25 v-25 h20 v25 h25 v20 h-25 v25 h-20 v-25 h-25
" fill="#FFFFFF"/>
<polygon fill="#FFFFFF" points="251.834671,168.3594666 221,136 136,136 136,202.4426727 376,202.4426727 376,168.3594666 "/>
</g>
</g>
</svg>
<!-- A 45 45, 1, 1, 1, 175 265 Z -->
<!-- v-10 h25 v-25 h10 v25 h25 v10 h-25 v25 h-10 v-25 h-25 -->
<!-- A 45 45, 1, 1, 1, 125 275 -->

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#33B49D"/><stop offset="1" style="stop-color:#00A185"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#00A185"/><stop offset="1" style="stop-color:#33B49D"/></linearGradient><path d="M256,469.3338623c-117.6315308,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018051-213.333313,213.3333435-213.333313c117.6362,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6362,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><g><circle cx="170.0324707" cy="174.964798" opacity="0.3" r="26.0319996"/><rect height="10" opacity="0.3" width="161.7552032" x="222.2442017" y="169.965332"/><circle cx="170.0324707" cy="264" opacity="0.3" r="26.0319996"/><rect height="10" opacity="0.3" width="161.7552032" x="222.2442017" y="259.0010681"/><circle cx="170.0324707" cy="353.034668" opacity="0.3" r="26.0319996"/><rect height="10" opacity="0.3" width="161.7552032" x="222.2442017" y="348.0341492"/></g><g><circle cx="162.0324707" cy="166.964798" fill="#FFFFFF" r="26.0319996"/><rect fill="#FFFFFF" height="10" width="161.7552032" x="214.2442017" y="161.965332"/><circle cx="162.0324707" cy="256" fill="#FFFFFF" r="26.0319996"/><rect fill="#FFFFFF" height="10" width="161.7552032" x="214.2442017" y="251.0010681"/><circle cx="162.0324707" cy="345.034668" fill="#FFFFFF" r="26.0319996"/><rect fill="#FFFFFF" height="10" width="161.7552032" x="214.2442017" y="340.0341492"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#F67950"/><stop offset="1" style="stop-color:#F15A29"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#F15A29"/><stop offset="1" style="stop-color:#F67950"/></linearGradient><path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.636261,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.636261,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><path d="M381.4981384,174.610672h-45.6714783v-21.6021423c0-4.9701233-4.0287781-8.9983978-8.9989319-8.9983978 H201.1704559c-4.9700775,0-8.9992065,4.0282745-8.9992065,8.9983978v21.6021423h-45.6693878v9.9989319h20.962677 l22.7453766,183.5509186c1.1203766,9.0400085,8.801712,15.8288269,17.9104004,15.8288269h111.7570038 c9.1093445,0,16.7904053-6.7888184,17.9109497-15.8288269l22.7456055-183.5509186h20.9642639V174.610672z M221.0897064,351.9584045 l-9.9256592-129.5248108l9.9696655-0.7615967l9.9261322,129.5248108L221.0897064,351.9584045z M268.9985657,351.5776062h-9.9991455 V222.0527954h9.9991455V351.5776062z M306.9077454,351.9584045l-9.9701538-0.7615967l9.9264221-129.5248108l9.969574,0.7615967 L306.9077454,351.9584045z" opacity="0.3"/><path d="M373.4981384,166.610672h-45.6714783v-21.6021423c0-4.9701233-4.0287781-8.9983978-8.9989319-8.9983978 H193.1704559c-4.9700775,0-8.9992523,4.0282745-8.9992523,8.9983978v21.6021423h-45.669342v9.9989319h20.962677 l22.7455902,183.5509186c1.1200104,9.0400085,8.8014984,15.8288269,17.9101868,15.8288269h111.7570038 c9.1093445,0,16.7904053-6.7888184,17.9109497-15.8288269l22.7456055-183.5509186h20.9642639V166.610672z M213.0897064,343.9584045 l-9.9256592-129.5248108l9.9696655-0.7615967l9.9261322,129.5248108L213.0897064,343.9584045z M260.9985657,343.5776062h-9.9991455 V214.0527954h9.9991455V343.5776062z M298.9077454,343.9584045l-9.9700928-0.7615967l9.9263611-129.5248108l9.969574,0.7615967 L298.9077454,343.9584045z" fill="#FFFFFF"/></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1,374 @@
<?xml version="1.0" ?>
<svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#ffffff"/>
<stop offset="1" style="stop-color:#aaaaaa"/>
</linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#aaaaaa"/>
<stop offset="1" style="stop-color:#ffffff"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g>
<g transform="translate(80 80) scale(0.5 0.5)">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M642.761,7.857c27.524-13.874,20.688-7.637,36.396,5.242
c21.389,17.531-47.403,113.702-85.56,101.273C597.209,66.095,628.271,15.159,642.761,7.857z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M388.764,16.05c10.221,28.978,21.564,101.561-24.58,98.322
C347.148,88.668,329.25,7.829,388.764,16.05z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M303.417,128.713c-9.341,33.239-52.357,26.405-65.547,0
C209.087,71.091,320.382,68.365,303.417,128.713z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M519.854,524.039c-24.021-0.559-30.431-18.727-40.963-32.773
c-15.603,3.518-20.585,17.65-40.968,16.385c-21.542-2.428-6.449,31.787-32.771,24.582c8.412-27.529-25.482-12.754-40.968-16.387
c-12.178,6.941-11.856,26.383-16.386,40.969c-14.608-19.396,16.189-66.479-40.968-57.357c-1.641-31.131-34.453-31.09-32.772-65.547
c-50.24,12.574-80.853,44.779-131.094,57.355c26.667-44.338,87.719-54.301,131.094-81.934c-5.64-32.949,7.849-46.771,8.193-73.74
c-16.702-18.804-68.042-2.965-98.322-8.193c21.309-16.93,59.1-17.375,98.322-16.386c23.035-10.227,27.083-33.584,16.386-57.354
c10.475,0.45,11.347,10.5,24.579,8.193c2.721-32.761-14.605-45.48-8.193-81.933c21.864,5.446,30.003,24.619,40.968,40.965
c10.298-3.356,16.748-10.566,16.386-24.579c6.384,1.809,9.526,6.86,8.193,16.386C464.654,198.51,397.173,40.41,495.275,81.598
c16.984,7.13,16.283,16.491,16.386,32.775c-3.441,15.665-2.963,35.265-24.576,32.772c-7.125,8.614-11.859,18.676-24.582,32.775
c51.397,11.42,94.795,30.834,106.515,81.933c32.949,5.641,46.771-7.848,73.743-8.193c-13.629,21.878-56.536,14.474-73.743,32.772
c-1.532,68.441,5.806,95.405-32.777,122.901c1.401,12.258-2.917,30.236,8.198,32.771c-11.423,13.158-40.435,8.727-49.163,24.582
C503.696,485.572,523.483,493.105,519.854,524.039z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M560.825,147.145
C591.118,171.985,535.943,174.746,560.825,147.145L560.825,147.145z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M749.27,220.884c17.286,2.513,8.66,15.924,0,16.389
c-8.66,0.461-23.257,1.407-24.579-8.196C726.069,219.534,731.983,218.372,749.27,220.884z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M708.305,237.273c1.556-9.304,8.222-4.549,8.193,0
C714.942,246.574,708.276,241.82,708.305,237.273z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M183.93,327.399C184.764,337.301,172.022,332.436,183.93,327.399
L183.93,327.399z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M85.611,335.592c3.008,24.861-26.687,17.007-40.968,24.579
C43.455,337.136,64.712,336.541,85.611,335.592z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M642.761,360.171c0.217-9.093,45.956-3.205,65.544-8.193
c-2.609,21.727,46.896,10.463,32.771,24.583C726.274,392.045,642.544,369.264,642.761,360.171z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M199.897,398.458c-12.073,32.979-66.239,39.39-68.1-9.286
C129.943,340.492,211.973,365.481,199.897,398.458z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M642.761,458.492c17.845,3.156,22.146,16.09,24.579,32.773
c31.985-16.23,70.102,20.02,65.544,40.967c-4.559,20.947-37.74,31.988-49.158,8.193c3.703,27.465-35.017,31.943-49.158,32.775
c-6.717,0.387-26.334-3.59-24.579-24.58c-24.311-3.002-42.555,0.217-49.163-32.775
C554.216,482.852,595.181,450.078,642.761,458.492z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M142.964,491.266
C143.796,501.166,131.054,496.301,142.964,491.266L142.964,491.266z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M298.637,507.65c0.464-4.996,1.225-9.697,8.193-8.193
C306.366,504.455,305.605,509.154,298.637,507.65z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M290.444,515.846c0.464-4.998,1.225-9.699,8.193-8.195
C298.173,512.646,297.413,517.352,290.444,515.846z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M101.997,540.426c-3.196,13.438-27.527,6.361-32.772-8.193
C63.98,517.672,105.193,526.988,101.997,540.426z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M290.444,515.846
C291.276,525.746,278.534,520.883,290.444,515.846L290.444,515.846z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M519.854,524.039
C529.757,523.207,524.891,535.947,519.854,524.039L519.854,524.039z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M3.678,573.201c-3.196-5.688-6.361-5.926,0-16.387
s67.646-29.844,57.354,16.387C55.537,602.986,6.874,578.881,3.678,573.201z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M405.152,556.814c2.823-9.891,21.799-6.627,24.579,0
C437.16,574.533,399.726,575.799,405.152,556.814z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M667.34,573.201c11.993,7.121,27.775,24.111,24.579,32.771
s-21.389,16.602-32.772,0C647.752,589.365,664.765,584.277,667.34,573.201z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M749.27,622.359c5.003,5.24,4.313,7.291,0,8.191
c-9.64-1.287-23.257,1.414-24.579-8.191C736.382,619.168,744.278,617.117,749.27,622.359z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M347.798,646.938c14.554,8.66,18.898,32.994,0,32.771
C328.899,679.492,333.244,638.277,347.798,646.938z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M577.211,646.938c12.928,14.381,37.62,17.002,40.971,40.965
C587.939,690.836,583.939,667.527,577.211,646.938z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M175.736,679.709
C174.905,669.807,187.647,674.674,175.736,679.709L175.736,679.709z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M175.736,679.709c-1,20.854-19.334,40.51-32.772,32.773
C129.527,704.756,150.086,675.914,175.736,679.709z"/>
</g>
<g transform="translate(80 70) scale(0.7 0.7)">
<path id="Selection"
fill="#e5e5e5"
d="M 413.00,255.00
C 413.00,255.00 408.00,255.00 408.00,255.00
408.00,255.00 408.00,439.00 408.00,439.00
401.94,437.78 374.70,423.25 373.82,420.55
373.14,418.48 374.09,98.55 374.09,98.55
374.09,95.17 374.22,92.97 373.36,89.64
368.51,70.71 345.00,57.64 328.82,57.27
328.82,57.27 249.00,56.00 249.00,56.00
249.00,56.00 105.64,57.09 105.64,57.09
90.17,57.11 75.87,66.25 69.64,80.82
67.20,86.51 64.76,93.81 64.73,100.00
64.73,100.00 64.91,397.09 64.91,397.09
64.95,422.07 85.64,446.45 110.64,446.73
110.64,446.73 214.00,448.00 214.00,448.00
214.00,448.00 404.91,446.91 404.91,446.91
426.82,447.00 454.59,424.12 454.64,395.64
454.64,395.64 454.73,225.45 454.73,225.45
454.71,212.87 449.50,203.71 437.09,199.27
431.28,197.20 416.91,197.64 412.73,202.82
411.27,204.73 408.19,206.11 408.18,208.36
408.18,208.36 413.00,255.00 413.00,255.00 Z" />
<g>
<linearGradient id="fadeGrad" y2="1" x2="0">
<stop offset="0.5" stop-color="#e5e5e5" stop-opacity="0"/>
<stop offset="1" stop-color="#e5e5e5" stop-opacity="1"/>
</linearGradient><path id="grey_fill"
fill="url(#fadeGrad)"
d="M 372.00,204.00
C 372.00,204.00 372.00,437.00 372.00,437.00
372.00,437.00 408.00,437.00 408.00,437.00
408.00,437.00 408.00,204.00 408.00,204.00
408.00,204.00 372.00,204.00 372.00,204.00 Z" />
</g>
<path id="border"
fill="#2c3e50"
d="M 97.00,56.12
C 92.47,57.54 89.03,58.99 85.00,61.35
74.99,67.21 66.62,78.52 64.12,90.00
64.12,90.00 64.12,112.00 64.12,112.00
64.12,112.00 64.12,141.00 64.12,141.00
64.12,141.00 64.12,399.00 64.12,399.00
64.04,421.84 82.68,447.71 107.00,448.00
107.00,448.00 214.00,448.00 214.00,448.00
214.00,448.00 407.00,448.00 407.00,448.00
432.43,447.96 455.96,423.15 456.00,398.00
456.00,398.00 456.00,225.00 456.00,225.00
455.97,208.44 444.97,196.00 428.00,196.00
422.37,196.00 418.95,196.42 414.01,199.48
403.91,205.73 400.02,217.75 400.00,229.00
400.00,229.00 400.00,385.00 400.00,385.00
400.00,388.14 399.82,392.11 401.31,394.95
404.11,400.27 410.69,400.91 414.15,395.87
416.23,392.83 415.99,388.53 416.00,385.00
416.00,385.00 416.00,227.00 416.00,227.00
416.01,223.53 415.73,220.08 417.74,217.04
422.00,210.58 432.71,210.16 437.57,216.11
440.32,219.47 439.99,222.95 440.00,227.00
440.00,227.00 440.00,396.00 440.00,396.00
439.99,399.36 440.10,401.68 439.24,405.00
435.84,418.21 422.05,431.64 408.00,431.99
387.86,432.47 376.09,417.15 376.00,398.00
376.00,398.00 376.00,356.00 376.00,356.00
376.00,356.00 376.00,98.00 376.00,98.00
375.96,73.58 350.92,56.04 328.00,56.12
328.00,56.12 175.00,56.12 175.00,56.12
175.00,56.12 125.00,56.12 125.00,56.12
125.00,56.12 97.00,56.12 97.00,56.12 Z
M 371.00,432.00
C 371.00,432.00 110.00,432.00 110.00,432.00
106.92,432.00 103.99,432.10 101.00,431.20
88.05,427.30 80.16,412.89 80.00,400.00
80.00,400.00 80.00,355.00 80.00,355.00
80.00,355.00 80.00,99.00 80.00,99.00
80.01,95.19 79.89,92.73 81.05,89.00
82.31,84.96 84.15,82.08 87.09,79.04
95.54,70.33 104.02,72.00 115.00,72.00
115.00,72.00 137.00,72.00 137.00,72.00
137.00,72.00 327.00,72.00 327.00,72.00
343.88,72.03 359.91,80.22 360.00,99.00
360.00,99.00 360.00,158.00 360.00,158.00
360.00,158.00 360.00,329.00 360.00,329.00
360.00,329.00 360.00,376.00 360.00,376.00
360.00,387.70 359.54,399.52 362.24,411.00
364.74,421.66 367.08,423.20 371.00,432.00 Z" />
<path id="text"
fill="#2c3e50"
d="M 183.00,110.64
C 179.64,111.42 176.99,112.23 174.00,114.13
157.51,124.60 159.97,141.24 160.00,158.00
160.01,163.24 160.33,167.99 162.10,173.00
166.51,185.43 179.93,193.80 193.00,190.98
208.62,187.62 215.82,175.17 216.00,160.00
216.23,140.44 218.24,117.01 194.00,110.64
190.07,109.75 186.95,109.89 183.00,110.64 Z
M 229.10,110.77
C 227.21,111.91 226.64,111.99 225.45,114.11
223.13,118.24 224.00,132.64 224.00,138.00
224.00,138.00 224.00,179.00 224.00,179.00
224.05,182.84 224.15,186.73 227.28,189.49
230.97,192.75 238.29,192.01 243.00,192.00
258.52,191.98 277.71,186.71 274.56,167.00
273.97,163.32 273.04,160.18 271.03,157.00
269.78,155.02 266.97,152.06 266.51,150.00
266.00,147.74 267.57,145.18 268.20,143.00
269.04,140.08 269.06,137.01 268.99,134.00
268.63,119.33 257.94,113.28 245.00,110.77
239.84,109.82 234.22,109.45 229.10,110.77 Z
M 320.00,164.00
C 319.29,166.34 318.67,168.92 317.28,170.93
312.51,177.90 302.17,177.38 298.30,170.93
296.06,167.14 296.74,162.14 294.41,159.28
291.16,155.30 285.55,156.17 282.74,160.13
277.83,167.04 285.08,179.04 290.04,183.96
300.83,194.65 316.52,193.80 326.90,182.96
329.03,180.72 330.34,178.74 331.72,176.00
340.59,158.44 327.85,149.91 313.00,143.42
309.43,141.86 296.86,137.96 296.66,133.89
296.37,128.22 304.01,124.60 309.00,125.57
313.67,126.48 316.77,129.55 318.20,134.00
319.62,138.40 318.92,143.38 325.00,144.67
334.12,146.59 334.63,135.91 332.78,130.00
329.78,120.39 321.94,112.67 312.00,110.52
299.03,107.70 285.65,116.60 281.55,129.00
280.62,132.69 279.59,137.37 281.55,141.00
283.97,146.59 289.75,149.61 295.00,152.25
295.00,152.25 320.00,164.00 320.00,164.00 Z
M 136.00,128.00
C 136.00,128.00 136.00,162.00 136.00,162.00
135.99,167.25 136.21,172.61 130.90,175.55
120.70,181.19 117.27,168.68 112.90,165.86
108.58,163.08 103.38,165.23 101.78,170.02
100.74,173.13 102.36,176.34 103.88,179.00
108.07,186.34 115.38,191.75 124.00,191.98
127.40,192.08 130.76,192.02 134.00,190.89
137.66,189.62 140.24,187.67 142.96,184.96
154.71,173.20 152.00,155.19 152.00,140.00
152.00,140.00 152.00,127.00 152.00,127.00
151.98,116.47 150.64,112.14 139.00,112.00
134.77,111.95 127.63,111.45 124.13,113.85
119.09,117.31 119.73,123.89 125.05,126.69
128.06,128.27 132.65,128.00 136.00,128.00 Z
M 186.00,125.32
C 190.79,125.04 195.35,125.73 198.26,130.06
200.13,132.83 199.98,135.82 200.00,139.00
200.00,139.00 200.00,164.00 200.00,164.00
199.92,169.87 198.61,174.57 192.00,175.88
192.00,175.88 187.00,175.88 187.00,175.88
177.07,175.73 176.01,170.43 176.00,162.00
176.00,162.00 176.00,148.00 176.00,148.00
176.00,143.84 175.41,134.40 177.17,131.02
179.19,127.16 182.05,126.16 186.00,125.32 Z
M 240.00,144.00
C 240.00,144.00 240.00,125.00 240.00,125.00
243.48,125.70 247.87,126.53 250.66,128.85
255.54,132.93 254.41,138.65 248.98,141.55
246.56,142.85 242.73,143.48 240.00,144.00 Z
M 240.00,177.00
C 240.00,177.00 240.00,160.00 240.00,160.00
243.26,160.15 253.37,160.99 255.86,162.45
260.04,164.92 261.00,171.96 256.77,174.91
252.86,177.64 244.73,177.00 240.00,177.00 Z
M 119.00,216.57
C 113.27,218.89 109.82,224.65 115.28,229.49
117.99,231.89 121.59,231.95 125.00,232.00
125.00,232.00 161.00,232.00 161.00,232.00
164.53,231.99 168.83,232.23 171.87,230.15
176.46,227.00 176.46,221.00 171.87,217.85
169.27,216.07 166.02,216.04 163.00,216.00
163.00,216.00 119.00,216.57 119.00,216.57 Z
M 239.00,216.57
C 232.65,219.14 229.74,225.77 236.13,230.15
239.17,232.23 243.47,231.99 247.00,232.00
247.00,232.00 289.00,232.00 289.00,232.00
292.53,231.99 296.83,232.23 299.87,230.15
304.46,227.00 304.46,221.00 299.87,217.85
297.03,215.91 293.29,216.02 290.00,216.00
290.00,216.00 239.00,216.57 239.00,216.57 Z
M 119.00,240.57
C 112.65,243.14 109.74,249.77 116.13,254.15
119.17,256.23 123.47,255.99 127.00,256.00
127.00,256.00 193.00,256.00 193.00,256.00
196.14,256.00 200.11,256.18 202.95,254.69
208.27,251.89 208.91,245.31 203.87,241.85
200.83,239.77 196.53,240.01 193.00,240.00
193.00,240.00 145.00,240.00 145.00,240.00
145.00,240.00 119.00,240.57 119.00,240.57 Z
M 239.00,240.57
C 232.65,243.14 229.74,249.77 236.13,254.15
239.17,256.23 243.47,255.99 247.00,256.00
247.00,256.00 313.00,256.00 313.00,256.00
316.53,255.99 320.83,256.23 323.87,254.15
328.91,250.69 328.27,244.11 322.95,241.31
320.11,239.82 316.14,240.00 313.00,240.00
313.00,240.00 265.00,240.00 265.00,240.00
265.00,240.00 239.00,240.57 239.00,240.57 Z
M 119.00,264.57
C 112.65,267.14 109.74,273.77 116.13,278.15
119.17,280.23 123.47,279.99 127.00,280.00
127.00,280.00 185.00,280.00 185.00,280.00
188.14,280.00 192.11,280.18 194.95,278.69
200.27,275.89 200.91,269.31 195.87,265.85
192.83,263.77 188.53,264.01 185.00,264.00
185.00,264.00 143.00,264.00 143.00,264.00
136.67,264.00 124.68,263.54 119.00,264.57 Z
M 239.00,264.57
C 232.65,267.14 229.74,273.77 236.13,278.15
239.17,280.23 243.47,279.99 247.00,280.00
247.00,280.00 305.00,280.00 305.00,280.00
308.14,280.00 312.11,280.18 314.95,278.69
320.27,275.89 320.91,269.31 315.87,265.85
312.83,263.77 308.53,264.01 305.00,264.00
305.00,264.00 263.00,264.00 263.00,264.00
256.67,264.00 244.68,263.54 239.00,264.57 Z
M 239.00,288.57
C 232.65,291.14 229.74,297.77 236.13,302.15
239.17,304.23 243.47,303.99 247.00,304.00
247.00,304.00 313.00,304.00 313.00,304.00
316.14,304.00 320.11,304.18 322.95,302.69
328.27,299.89 328.91,293.31 323.87,289.85
320.83,287.77 316.53,288.01 313.00,288.00
313.00,288.00 265.00,288.00 265.00,288.00
265.00,288.00 239.00,288.57 239.00,288.57 Z
M 119.00,312.57
C 112.65,315.14 109.74,321.77 116.13,326.15
119.17,328.23 123.47,327.99 127.00,328.00
127.00,328.00 169.00,328.00 169.00,328.00
172.53,327.99 176.83,328.23 179.87,326.15
184.46,323.00 184.46,317.00 179.87,313.85
177.03,311.91 173.29,312.02 170.00,312.00
170.00,312.00 119.00,312.57 119.00,312.57 Z
M 119.00,336.57
C 112.65,339.14 109.74,345.77 116.13,350.15
119.17,352.23 123.47,351.99 127.00,352.00
127.00,352.00 193.00,352.00 193.00,352.00
196.14,352.00 200.11,352.18 202.95,350.69
208.27,347.89 208.91,341.31 203.87,337.85
200.83,335.77 196.53,336.01 193.00,336.00
193.00,336.00 145.00,336.00 145.00,336.00
145.00,336.00 119.00,336.57 119.00,336.57 Z
M 239.00,336.57
C 233.27,338.89 229.82,344.65 235.28,349.49
237.99,351.89 241.59,351.95 245.00,352.00
245.00,352.00 281.00,352.00 281.00,352.00
284.53,351.99 288.83,352.23 291.87,350.15
296.33,347.09 296.33,340.91 291.87,337.85
289.27,336.07 286.02,336.04 283.00,336.00
283.00,336.00 239.00,336.57 239.00,336.57 Z
M 119.00,360.57
C 112.65,363.14 109.74,369.77 116.13,374.15
119.17,376.23 123.47,375.99 127.00,376.00
127.00,376.00 185.00,376.00 185.00,376.00
188.14,376.00 192.11,376.18 194.95,374.69
200.27,371.89 200.91,365.31 195.87,361.85
192.83,359.77 188.53,360.01 185.00,360.00
185.00,360.00 143.00,360.00 143.00,360.00
136.67,360.00 124.68,359.54 119.00,360.57 Z
M 239.00,360.57
C 232.65,363.14 229.74,369.77 236.13,374.15
239.17,376.23 243.47,375.99 247.00,376.00
247.00,376.00 313.00,376.00 313.00,376.00
316.14,376.00 320.11,376.18 322.95,374.69
328.27,371.89 328.91,365.31 323.87,361.85
320.83,359.77 316.53,360.01 313.00,360.00
313.00,360.00 265.00,360.00 265.00,360.00
265.00,360.00 239.00,360.57 239.00,360.57 Z
M 119.00,384.57
C 112.65,387.14 109.74,393.77 116.13,398.15
119.17,400.23 123.47,399.99 127.00,400.00
127.00,400.00 193.00,400.00 193.00,400.00
196.14,400.00 200.11,400.18 202.95,398.69
208.27,395.89 208.91,389.31 203.87,385.85
200.83,383.77 196.53,384.01 193.00,384.00
193.00,384.00 145.00,384.00 145.00,384.00
145.00,384.00 119.00,384.57 119.00,384.57 Z
M 239.00,384.57
C 232.65,387.14 229.74,393.77 236.13,398.15
239.17,400.23 243.47,399.99 247.00,400.00
247.00,400.00 305.00,400.00 305.00,400.00
308.53,399.99 312.83,400.23 315.87,398.15
320.91,394.69 320.27,388.11 314.95,385.31
312.11,383.82 308.14,384.00 305.00,384.00
305.00,384.00 263.00,384.00 263.00,384.00
256.67,384.00 244.68,383.54 239.00,384.57 Z" />
</g>
<g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#9C141C" d="M126.579,753.453c-7.296,8.654-15.924,8.414-24.582,0
c-8.657-8.416-11.982-46.715,16.386-40.971C139.233,713.313,133.872,744.797,126.579,753.453z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -0,0 +1,15 @@
<?xml version="1.0" ?>
<svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#ffd34e"/>
<stop offset="1" style="stop-color:#dfa32e"/>
</linearGradient>
<circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#dfa32e"/>
<stop offset="1" style="stop-color:#ffd34e"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g><g><path d="M278.319458,234.7162628H156.2111969c-6.7440033,0-12.2111969,5.4677429-12.2111969,12.212265v81.8735962 c0,6.7429504,5.4671936,12.2106628,12.2111969,12.2106628h16.5359955l0.2293396,26.0400085l39.5781403-26.0400085h65.7647858 c6.7440186,0,12.2106628-5.4677124,12.2106628-12.2106628v-81.8735962 C290.5301208,240.1840057,285.0634766,234.7162628,278.319458,234.7162628z M180.6330719,259.4090576h73.2639923v10h-73.2639923 V259.4090576z M253.8970642,317.2357483h-73.2639923v-10h73.2639923V317.2357483z M269.1605225,293.3247986H165.3690643v-10 h103.7914581V293.3247986z" opacity="0.3"/><path d="M371.7893372,160.9472046H249.6810608c-6.743988,0-12.2111969,5.4661255-12.2111969,12.2106628v51.5583954 h40.848526c12.2458801,0,22.211731,9.9664001,22.211731,22.212265v20.3141479h14.915741l39.5776062,26.0394592 l0.2298584-26.0394592h16.5360107c6.7434692,0,12.210144-5.4677429,12.210144-12.2112122v-81.8735962 C383.9994812,166.4133301,378.5328064,160.9472046,371.7893372,160.9472046z M347.366394,243.4618683h-38.7258606v-10h38.7258606 V243.4618683z M362.6298828,219.5503998H258.8384094v-10h103.7914734V219.5503998z M362.6298828,195.6394653H258.8384094v-10 h103.7914734V195.6394653z" opacity="0.3"/></g><g><path d="M270.319458,226.7162628H148.2111969c-6.7440033,0-12.2111969,5.4677429-12.2111969,12.212265v81.8735962 c0,6.7429504,5.4671936,12.2106628,12.2111969,12.2106628h16.5359955l0.2293396,26.0400085l39.5781403-26.0400085h65.7647858 c6.7440186,0,12.2106628-5.4677124,12.2106628-12.2106628v-81.8735962 C282.5301208,232.1840057,277.0634766,226.7162628,270.319458,226.7162628z M172.6330719,251.4090729h73.2639923v9.9999847 h-73.2639923V251.4090729z M245.8970642,309.2357483h-73.2639923v-10h73.2639923V309.2357483z M261.1605225,285.3247986 H157.3690643v-10h103.7914581V285.3247986z" fill="#FFFFFF"/><path d="M363.7893372,152.9472046H241.6810608c-6.743988,0-12.2111969,5.4661255-12.2111969,12.2106628v51.5583954 h40.848526c12.2458801,0,22.211731,9.9664001,22.211731,22.212265v20.3141479h14.915741l39.5776062,26.0394592 l0.2298584-26.0394592h16.5360107c6.7434692,0,12.210144-5.4677429,12.210144-12.2112122v-81.8735962 C375.9994812,158.4133301,370.5328064,152.9472046,363.7893372,152.9472046z M339.366394,235.4618683h-38.7258606v-10h38.7258606 V235.4618683z M354.6298828,211.5503998H250.8383942v-10h103.7914886V211.5503998z M354.6298828,187.6394653H250.8383942v-10 h103.7914886V187.6394653z" fill="#FFFFFF"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -0,0 +1 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="0.0000038" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#F35CB5"/><stop offset="1" style="stop-color:#EC008C"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666679" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#EC008C"/><stop offset="1" style="stop-color:#F35CB5"/></linearGradient><path d="M256,469.3338623c-117.6314697,0-213.3333282-95.7018738-213.3333282-213.3333435 c0-117.6309204,95.7018585-213.333313,213.3333282-213.333313c117.6357422,0,213.3333435,95.7024002,213.3333435,213.333313 C469.3333435,373.6319885,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><g><polygon opacity="0.3" points="341.5125427,245.7781372 334.3989258,238.6645355 269.0289001,304.0325317 269.0289001,148.352005 258.9679871,148.352005 258.9679871,304.0325317 193.6026611,238.6645355 186.4895935,245.7781372 263.9984131,323.2896118 "/><polygon opacity="0.3" points="337.4869385,265.3551941 264.3935852,339.2314758 190.517334,265.3551941 144,265.3551941 144,379.6485291 384,379.6485291 384,265.3551941 "/></g><g><polygon fill="#FFFFFF" points="333.5125427,237.7781372 326.3989258,230.6645355 261.0289001,296.0325317 261.0289001,140.352005 250.9680023,140.352005 250.9680023,296.0325317 185.6026611,230.6645355 178.4896088,237.7781372 255.9983978,315.2896118 "/><polygon fill="#FFFFFF" points="329.4869385,257.3551941 256.3935852,331.2314758 182.517334,257.3551941 136,257.3551941 136,371.6485291 376,371.6485291 376,257.3551941 "/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="180.6mm" height="180.6mm"
viewBox="0 0 512 512">
<path id="Selection"
fill="#929292"
d="M 256.00,80.00
C 256.00,80.00 256.00,255.00 256.00,255.00
256.00,255.00 233.00,232.00 233.00,232.00
233.00,232.00 220.00,219.00 220.00,219.00
217.40,216.40 207.79,206.03 205.00,205.34
201.21,204.39 192.39,213.21 193.34,217.00
194.04,219.82 205.30,230.30 208.00,233.00
208.00,233.00 247.00,272.00 247.00,272.00
247.00,272.00 258.00,282.98 258.00,282.98
259.51,284.42 261.76,286.80 264.00,286.80
266.24,286.80 268.49,284.42 270.00,282.98
270.00,282.98 281.00,272.00 281.00,272.00
281.00,272.00 320.00,233.00 320.00,233.00
322.70,230.30 333.96,219.82 334.66,217.00
335.61,213.21 326.79,204.39 323.00,205.34
320.21,206.03 310.60,216.40 308.00,219.00
308.00,219.00 295.00,232.00 295.00,232.00
295.00,232.00 272.00,255.00 272.00,255.00
272.00,255.00 272.00,80.00 272.00,80.00
272.00,80.00 256.00,80.00 256.00,80.00 Z
M 64.17,432.00
C 64.17,432.00 463.83,432.00 463.83,432.00
463.83,432.00 463.83,294.00 463.83,294.00
464.00,291.78 464.09,289.14 463.83,287.00
462.48,283.27 454.35,271.10 451.81,267.00
451.81,267.00 420.58,217.00 420.58,217.00
420.58,217.00 394.32,175.00 394.32,175.00
385.11,160.39 386.65,160.02 377.00,160.00
377.00,160.00 288.00,160.00 288.00,160.00
288.00,160.00 288.00,176.00 288.00,176.00
288.00,176.00 365.00,176.00 365.00,176.00
365.00,176.00 372.82,177.02 372.82,177.02
372.82,177.02 379.05,185.00 379.05,185.00
379.05,185.00 389.68,202.00 389.68,202.00
389.68,202.00 423.42,256.00 423.42,256.00
423.42,256.00 443.00,288.00 443.00,288.00
443.00,288.00 336.00,288.00 336.00,288.00
336.00,304.92 339.04,327.68 326.82,340.96
318.41,350.09 307.82,351.98 296.00,352.00
296.00,352.00 230.00,352.00 230.00,352.00
219.04,351.87 208.87,349.31 201.18,340.96
188.96,327.68 192.00,304.92 192.00,288.00
192.00,288.00 85.00,288.00 85.00,288.00
85.00,288.00 104.58,256.00 104.58,256.00
104.58,256.00 138.32,202.00 138.32,202.00
138.32,202.00 148.95,185.00 148.95,185.00
148.95,185.00 155.18,177.02 155.18,177.02
155.18,177.02 163.00,176.00 163.00,176.00
163.00,176.00 240.00,176.00 240.00,176.00
240.00,176.00 240.00,160.00 240.00,160.00
240.00,160.00 151.00,160.00 151.00,160.00
141.35,160.02 142.89,160.39 133.68,175.00
133.68,175.00 107.42,217.00 107.42,217.00
107.42,217.00 76.19,267.00 76.19,267.00
73.65,271.10 65.52,283.27 64.17,287.00
63.91,289.14 64.00,291.78 64.17,294.00
64.17,294.00 64.17,432.00 64.17,432.00 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -0,0 +1,84 @@
<?xml version="1.0" ?>
<svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#00adee"/>
<stop offset="1" style="stop-color:#007dce"/>
</linearGradient>
<circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#007dce"/>
<stop offset="1" style="stop-color:#00adee"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.636261,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.636261,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g>
<g id="cover-shadow">
<path id="Selection"
fill="#ffffff"
d="M 339.00,138.00
C 339.00,138.00 335.00,143.00 335.00,143.00
335.00,143.00 322.00,131.01 322.00,131.01
320.46,129.58 318.26,127.20 316.00,127.20
312.63,127.20 302.72,138.22 300.01,141.00
300.01,141.00 266.00,177.00 266.00,177.00
263.38,179.65 253.04,189.18 252.34,192.00
251.30,196.15 261.08,203.94 263.96,206.72
265.38,208.08 268.92,211.37 265.71,213.09
261.80,215.19 257.02,206.34 253.00,205.34
249.05,204.35 241.71,213.29 239.00,216.00
239.00,216.00 273.00,250.00 273.00,250.00
275.96,247.88 284.80,240.69 284.80,237.00
284.80,233.70 279.17,229.69 277.29,227.00
276.38,225.71 275.01,223.07 277.29,222.20
279.32,221.42 281.67,223.82 283.00,225.04
285.81,227.61 293.21,235.91 297.00,235.82
300.28,235.74 306.52,228.49 308.72,226.00
317.72,215.79 329.64,205.99 337.00,195.00
373.45,234.79 367.62,297.20 322.00,327.64
320.34,328.75 317.46,330.75 315.42,330.71
313.10,330.66 306.92,325.71 299.00,325.21
280.63,324.05 269.03,340.20 269.00,357.00
269.00,357.00 269.00,374.00 269.00,374.00
269.00,376.19 269.21,379.84 267.98,381.69
266.25,384.27 262.73,383.98 260.00,384.00
260.00,384.00 231.00,384.00 231.00,384.00
231.00,384.00 231.00,318.00 231.00,318.00
231.00,318.00 295.00,318.00 295.00,318.00
295.00,318.00 295.00,308.00 295.00,308.00
295.00,308.00 289.00,308.00 289.00,308.00
289.00,308.00 289.00,304.00 289.00,304.00
289.00,304.00 150.00,304.00 150.00,304.00
150.00,304.00 150.00,308.00 150.00,308.00
150.00,308.00 144.00,308.00 144.00,308.00
144.00,308.00 144.00,318.00 144.00,318.00
144.00,318.00 209.00,318.00 209.00,318.00
209.00,318.00 209.00,374.00 209.00,374.00
209.00,376.19 209.21,379.84 207.98,381.69
205.63,385.20 193.17,384.00 189.00,384.00
189.00,384.00 132.00,384.00 132.00,384.00
132.00,384.00 132.00,401.00 132.00,401.00
132.00,401.00 338.00,401.00 338.00,401.00
338.00,401.00 338.00,384.00 338.00,384.00
335.14,384.00 329.71,384.51 327.60,382.40
325.96,380.77 326.04,378.14 326.00,376.00
326.00,376.00 326.00,357.00 326.00,357.00
326.02,344.73 329.78,347.05 341.00,337.72
349.58,330.58 355.38,324.24 361.66,315.00
382.58,284.20 386.06,243.79 370.29,210.00
365.81,200.38 359.23,188.79 351.00,182.00
351.00,182.00 362.00,170.00 362.00,170.00
362.00,170.00 352.00,159.42 352.00,159.42
352.00,159.42 345.58,152.00 345.58,152.00
345.58,152.00 347.00,147.00 347.00,147.00
347.00,147.00 366.00,165.00 366.00,165.00
370.92,160.83 373.00,156.24 374.33,150.00
378.04,132.64 367.39,115.84 350.00,112.02
342.77,110.43 335.73,111.12 329.00,114.33
326.77,115.39 323.01,117.49 322.34,120.04
321.70,122.45 323.60,124.37 325.06,126.00
329.12,130.53 333.96,134.62 339.00,138.00 Z"
/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="0.426667in" height="0.426667in"
viewBox="0 0 128 128">
<path id="Selection"
fill="#cccccc"
d="M 0.00,0.00
C 0.00,0.00 0.00,24.00 0.00,24.00
0.00,24.00 8.00,24.00 8.00,24.00
8.00,24.00 8.00,8.00 8.00,8.00
8.00,8.00 24.00,8.00 24.00,8.00
24.00,8.00 24.00,0.00 24.00,0.00
24.00,0.00 0.00,0.00 0.00,0.00 Z
M 40.00,0.00
C 40.00,0.00 40.00,8.00 40.00,8.00
40.00,8.00 56.00,8.00 56.00,8.00
56.00,8.00 56.00,0.00 56.00,0.00
56.00,0.00 40.00,0.00 40.00,0.00 Z
M 72.00,0.00
C 72.00,0.00 72.00,8.00 72.00,8.00
72.00,8.00 88.00,8.00 88.00,8.00
88.00,8.00 88.00,0.00 88.00,0.00
88.00,0.00 72.00,0.00 72.00,0.00 Z
M 104.00,0.00
C 104.00,0.00 104.00,8.00 104.00,8.00
104.00,8.00 120.00,8.00 120.00,8.00
120.00,8.00 120.00,24.00 120.00,24.00
120.00,24.00 128.00,24.00 128.00,24.00
128.00,24.00 128.00,0.00 128.00,0.00
128.00,0.00 104.00,0.00 104.00,0.00 Z
M 48.00,24.00
C 48.00,24.00 48.00,64.00 48.00,64.00
48.00,64.00 24.00,64.00 24.00,64.00
28.68,70.53 46.26,87.26 53.00,94.00
55.21,96.21 60.93,102.80 64.00,102.80
67.07,102.80 72.79,96.21 75.00,94.00
81.74,87.26 99.32,70.53 104.00,64.00
104.00,64.00 80.00,64.00 80.00,64.00
80.00,64.00 80.00,24.00 80.00,24.00
80.00,24.00 48.00,24.00 48.00,24.00 Z
M 0.00,40.00
C 0.00,40.00 0.00,56.00 0.00,56.00
0.00,56.00 8.00,56.00 8.00,56.00
8.00,56.00 8.00,40.00 8.00,40.00
8.00,40.00 0.00,40.00 0.00,40.00 Z
M 120.00,40.00
C 120.00,40.00 120.00,56.00 120.00,56.00
120.00,56.00 128.00,56.00 128.00,56.00
128.00,56.00 128.00,40.00 128.00,40.00
128.00,40.00 120.00,40.00 120.00,40.00 Z
M 0.00,72.00
C 0.00,72.00 0.00,88.00 0.00,88.00
0.00,88.00 8.00,88.00 8.00,88.00
8.00,88.00 8.00,72.00 8.00,72.00
8.00,72.00 0.00,72.00 0.00,72.00 Z
M 120.00,72.00
C 120.00,72.00 120.00,88.00 120.00,88.00
120.00,88.00 128.00,88.00 128.00,88.00
128.00,88.00 128.00,72.00 128.00,72.00
128.00,72.00 120.00,72.00 120.00,72.00 Z
M 0.00,104.00
C 0.00,104.00 0.00,128.00 0.00,128.00
0.00,128.00 16.00,128.00 16.00,128.00
16.00,128.00 16.00,120.00 16.00,120.00
16.00,120.00 8.00,120.00 8.00,120.00
8.00,120.00 8.00,104.00 8.00,104.00
8.00,104.00 0.00,104.00 0.00,104.00 Z
M 120.00,104.00
C 120.00,104.00 120.00,120.00 120.00,120.00
120.00,120.00 104.00,120.00 104.00,120.00
104.00,120.00 104.00,128.00 104.00,128.00
104.00,128.00 128.00,128.00 128.00,128.00
128.00,128.00 128.00,104.00 128.00,104.00
128.00,104.00 120.00,104.00 120.00,104.00 Z
M 40.00,120.00
C 40.00,120.00 40.00,128.00 40.00,128.00
40.00,128.00 56.00,128.00 56.00,128.00
56.00,128.00 56.00,120.00 56.00,120.00
56.00,120.00 40.00,120.00 40.00,120.00 Z
M 72.00,120.00
C 72.00,120.00 72.00,128.00 72.00,128.00
72.00,128.00 88.00,128.00 88.00,128.00
88.00,128.00 88.00,120.00 88.00,120.00
88.00,120.00 72.00,120.00 72.00,120.00 Z" />
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="1.70667in" height="1.70667in"
viewBox="0 0 512 512">
<path id="Selection"
fill="#cccccc"
d="M 0.00,0.00
C 0.00,0.00 0.00,97.00 0.00,97.00
0.00,97.00 32.00,97.00 32.00,97.00
32.00,97.00 32.00,32.00 32.00,32.00
32.00,32.00 96.00,32.00 96.00,32.00
96.00,32.00 96.00,0.00 96.00,0.00
96.00,0.00 0.00,0.00 0.00,0.00 Z
M 160.00,0.00
C 160.00,0.00 160.00,32.00 160.00,32.00
160.00,32.00 224.00,32.00 224.00,32.00
224.00,32.00 224.00,0.00 224.00,0.00
224.00,0.00 160.00,0.00 160.00,0.00 Z
M 288.00,0.00
C 288.00,0.00 288.00,32.00 288.00,32.00
288.00,32.00 352.00,32.00 352.00,32.00
352.00,32.00 352.00,0.00 352.00,0.00
352.00,0.00 288.00,0.00 288.00,0.00 Z
M 416.00,0.00
C 416.00,0.00 416.00,32.00 416.00,32.00
416.00,32.00 480.00,32.00 480.00,32.00
480.00,32.00 480.00,96.00 480.00,96.00
480.00,96.00 512.00,96.00 512.00,96.00
512.00,96.00 512.00,0.00 512.00,0.00
512.00,0.00 416.00,0.00 416.00,0.00 Z
M 96.00,256.00
C 96.00,256.00 192.00,256.00 192.00,256.00
192.00,256.00 192.00,416.00 192.00,416.00
192.00,416.00 320.00,416.00 320.00,416.00
320.00,416.00 320.00,256.00 320.00,256.00
320.00,256.00 416.00,256.00 416.00,256.00
416.00,256.00 375.00,214.00 375.00,214.00
375.00,214.00 296.00,135.00 296.00,135.00
296.00,135.00 268.00,107.00 268.00,107.00
265.67,104.67 259.16,97.20 256.00,97.20
252.84,97.20 246.33,104.67 244.00,107.00
244.00,107.00 216.00,135.00 216.00,135.00
216.00,135.00 137.00,214.00 137.00,214.00
137.00,214.00 96.00,256.00 96.00,256.00 Z
M 0.00,160.00
C 0.00,160.00 0.00,224.00 0.00,224.00
0.00,224.00 32.00,224.00 32.00,224.00
32.00,224.00 32.00,160.00 32.00,160.00
32.00,160.00 0.00,160.00 0.00,160.00 Z
M 480.00,160.00
C 480.00,160.00 480.00,224.00 480.00,224.00
480.00,224.00 512.00,224.00 512.00,224.00
512.00,224.00 512.00,160.00 512.00,160.00
512.00,160.00 480.00,160.00 480.00,160.00 Z
M 0.00,288.00
C 0.00,288.00 0.00,352.00 0.00,352.00
0.00,352.00 32.00,352.00 32.00,352.00
32.00,352.00 32.00,288.00 32.00,288.00
32.00,288.00 0.00,288.00 0.00,288.00 Z
M 480.00,288.00
C 480.00,288.00 480.00,352.00 480.00,352.00
480.00,352.00 512.00,352.00 512.00,352.00
512.00,352.00 512.00,288.00 512.00,288.00
512.00,288.00 480.00,288.00 480.00,288.00 Z
M 0.00,416.00
C 0.00,416.00 0.00,512.00 0.00,512.00
0.00,512.00 64.00,512.00 64.00,512.00
64.00,512.00 64.00,480.00 64.00,480.00
64.00,480.00 32.00,480.00 32.00,480.00
32.00,480.00 32.00,416.00 32.00,416.00
32.00,416.00 0.00,416.00 0.00,416.00 Z
M 480.00,416.00
C 480.00,416.00 480.00,480.00 480.00,480.00
480.00,480.00 450.00,480.00 450.00,480.00
450.00,480.00 432.00,479.01 432.00,479.01
432.00,479.01 416.00,479.01 416.00,479.01
416.00,479.01 415.00,480.00 415.00,480.00
415.00,480.00 416.00,512.00 416.00,512.00
416.00,512.00 512.00,512.00 512.00,512.00
512.00,512.00 512.00,416.00 512.00,416.00
512.00,416.00 480.00,416.00 480.00,416.00 Z
M 160.00,480.00
C 160.00,480.00 160.00,512.00 160.00,512.00
160.00,512.00 224.00,512.00 224.00,512.00
224.00,512.00 224.00,480.00 224.00,480.00
224.00,480.00 160.00,480.00 160.00,480.00 Z
M 288.00,480.00
C 288.00,480.00 288.00,512.00 288.00,512.00
288.00,512.00 352.00,512.00 352.00,512.00
352.00,512.00 352.00,480.00 352.00,480.00
352.00,480.00 288.00,480.00 288.00,480.00 Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB