aboutsummaryrefslogtreecommitdiff
path: root/launcher
diff options
context:
space:
mode:
Diffstat (limited to 'launcher')
-rw-r--r--launcher/FileSystem.cpp189
-rw-r--r--launcher/FileSystem.h5
-rw-r--r--launcher/resources/OSX/OSX.qrc1
-rw-r--r--launcher/resources/OSX/scalable/shortcut.svg14
-rw-r--r--launcher/resources/breeze_dark/breeze_dark.qrc1
-rw-r--r--launcher/resources/breeze_dark/scalable/shortcut.svg18
-rw-r--r--launcher/resources/breeze_light/breeze_light.qrc1
-rw-r--r--launcher/resources/breeze_light/scalable/shortcut.svg18
-rw-r--r--launcher/resources/flat/flat.qrc1
-rw-r--r--launcher/resources/flat/scalable/shortcut.svg3
-rw-r--r--launcher/resources/flat_white/flat_white.qrc1
-rw-r--r--launcher/resources/flat_white/scalable/shortcut.svg3
-rw-r--r--launcher/resources/iOS/iOS.qrc1
-rw-r--r--launcher/resources/iOS/scalable/shortcut.svg13
-rw-r--r--launcher/resources/multimc/multimc.qrc9
-rw-r--r--launcher/resources/multimc/scalable/delete.svg282
-rw-r--r--launcher/resources/multimc/scalable/export.svg466
-rw-r--r--launcher/resources/multimc/scalable/launch.svg96
-rw-r--r--launcher/resources/multimc/scalable/rename.svg437
-rw-r--r--launcher/resources/multimc/scalable/shortcut.svg157
-rw-r--r--launcher/resources/multimc/scalable/tag.svg398
-rw-r--r--launcher/resources/pe_blue/pe_blue.qrc1
-rw-r--r--launcher/resources/pe_blue/scalable/shortcut.svg41
-rw-r--r--launcher/resources/pe_colored/pe_colored.qrc1
-rw-r--r--launcher/resources/pe_colored/scalable/shortcut.svg13
-rw-r--r--launcher/resources/pe_dark/pe_dark.qrc1
-rw-r--r--launcher/resources/pe_dark/scalable/shortcut.svg41
-rw-r--r--launcher/resources/pe_light/pe_light.qrc1
-rw-r--r--launcher/resources/pe_light/scalable/shortcut.svg41
-rw-r--r--launcher/ui/MainWindow.cpp138
-rw-r--r--launcher/ui/MainWindow.h2
31 files changed, 2368 insertions, 26 deletions
diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp
index 0c6527b1..1da50e21 100644
--- a/launcher/FileSystem.cpp
+++ b/launcher/FileSystem.cpp
@@ -49,6 +49,7 @@
#include "StringUtils.h"
#if defined Q_OS_WIN32
+#define WIN32_LEAN_AND_MEAN
#include <objbase.h>
#include <objidl.h>
#include <shlguid.h>
@@ -188,6 +189,8 @@ bool copy::operator()(const QString& offset, bool dryRun)
qDebug() << "Source file:" << src_path;
qDebug() << "Destination file:" << dst_path;
}
+ m_copied++;
+ emit fileCopied(relative_dst_path);
};
// We can't use copy_opts::recursive because we need to take into account the
@@ -341,12 +344,37 @@ QString getDesktopDir()
}
// Cross-platform Shortcut creation
-bool createShortCut(QString location, QString dest, QStringList args, QString name, QString icon)
+bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon)
{
-#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
- location = PathCombine(location, name + ".desktop");
+#if defined(Q_OS_MACOS)
+ destination += ".command";
- QFile f(location);
+ QFile f(destination);
+ f.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream stream(&f);
+
+ QString argstring;
+ if (!args.empty())
+ argstring = " \"" + args.join("\" \"") + "\"";
+
+ stream << "#!/bin/bash"
+ << "\n";
+ stream << "\""
+ << target
+ << "\" "
+ << argstring
+ << "\n";
+
+ stream.flush();
+ f.close();
+
+ f.setPermissions(f.permissions() | QFileDevice::ExeOwner | QFileDevice::ExeGroup | QFileDevice::ExeOther);
+
+ return true;
+#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
+ destination += ".desktop";
+
+ QFile f(destination);
f.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream stream(&f);
@@ -358,10 +386,12 @@ bool createShortCut(QString location, QString dest, QStringList args, QString na
<< "\n";
stream << "Type=Application"
<< "\n";
- stream << "TryExec=" << dest.toLocal8Bit() << "\n";
- stream << "Exec=" << dest.toLocal8Bit() << argstring.toLocal8Bit() << "\n";
+ stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n";
stream << "Name=" << name.toLocal8Bit() << "\n";
- stream << "Icon=" << icon.toLocal8Bit() << "\n";
+ if (!icon.isEmpty())
+ {
+ stream << "Icon=" << icon.toLocal8Bit() << "\n";
+ }
stream.flush();
f.close();
@@ -369,25 +399,132 @@ bool createShortCut(QString location, QString dest, QStringList args, QString na
f.setPermissions(f.permissions() | QFileDevice::ExeOwner | QFileDevice::ExeGroup | QFileDevice::ExeOther);
return true;
-#elif defined Q_OS_WIN
- // TODO: Fix
- // QFile file(PathCombine(location, name + ".lnk"));
- // WCHAR *file_w;
- // WCHAR *dest_w;
- // WCHAR *args_w;
- // file.fileName().toWCharArray(file_w);
- // dest.toWCharArray(dest_w);
-
- // QString argStr;
- // for (int i = 0; i < args.count(); i++)
- // {
- // argStr.append(args[i]);
- // argStr.append(" ");
- // }
- // argStr.toWCharArray(args_w);
-
- // return SUCCEEDED(CreateLink(file_w, dest_w, args_w));
- return false;
+#elif defined(Q_OS_WIN)
+ QFileInfo targetInfo(target);
+
+ if (!targetInfo.exists())
+ {
+ qWarning() << "Target file does not exist!";
+ return false;
+ }
+
+ target = targetInfo.absoluteFilePath();
+
+ if (target.length() >= MAX_PATH)
+ {
+ qWarning() << "Target file path is too long!";
+ return false;
+ }
+
+ if (!icon.isEmpty() && icon.length() >= MAX_PATH)
+ {
+ qWarning() << "Icon path is too long!";
+ return false;
+ }
+
+ destination += ".lnk";
+
+ if (destination.length() >= MAX_PATH)
+ {
+ qWarning() << "Destination path is too long!";
+ return false;
+ }
+
+ QString argStr;
+ int argCount = args.count();
+ for (int i = 0; i < argCount; i++)
+ {
+ if (args[i].contains(' '))
+ {
+ argStr.append('"').append(args[i]).append('"');
+ }
+ else
+ {
+ argStr.append(args[i]);
+ }
+
+ if (i < argCount - 1)
+ {
+ argStr.append(" ");
+ }
+ }
+
+ if (argStr.length() >= MAX_PATH)
+ {
+ qWarning() << "Arguments string is too long!";
+ return false;
+ }
+
+ HRESULT hres;
+
+ // ...yes, you need to initialize the entire COM stack just to make a shortcut
+ hres = CoInitialize(nullptr);
+ if (FAILED(hres))
+ {
+ qWarning() << "Failed to initialize COM!";
+ return false;
+ }
+
+ WCHAR wsz[MAX_PATH];
+
+ IShellLink* psl;
+
+ // create an IShellLink instance - this stores the shortcut's attributes
+ hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
+ if (SUCCEEDED(hres))
+ {
+ wmemset(wsz, 0, MAX_PATH);
+ target.toWCharArray(wsz);
+ psl->SetPath(wsz);
+
+ wmemset(wsz, 0, MAX_PATH);
+ argStr.toWCharArray(wsz);
+ psl->SetArguments(wsz);
+
+ wmemset(wsz, 0, MAX_PATH);
+ targetInfo.absolutePath().toWCharArray(wsz);
+ psl->SetWorkingDirectory(wsz); // "Starts in" attribute
+
+ if (!icon.isEmpty())
+ {
+ wmemset(wsz, 0, MAX_PATH);
+ icon.toWCharArray(wsz);
+ psl->SetIconLocation(wsz, 0);
+ }
+
+ // query an IPersistFile interface from our IShellLink instance
+ // this is the interface that will actually let us save the shortcut to disk!
+ IPersistFile* ppf;
+ hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
+ if (SUCCEEDED(hres))
+ {
+ wmemset(wsz, 0, MAX_PATH);
+ destination.toWCharArray(wsz);
+ hres = ppf->Save(wsz, TRUE);
+ if (FAILED(hres))
+ {
+ qWarning() << "IPresistFile->Save() failed";
+ qWarning() << "hres = " << hres;
+ }
+ ppf->Release();
+ }
+ else
+ {
+ qWarning() << "Failed to query IPersistFile interface from IShellLink instance";
+ qWarning() << "hres = " << hres;
+ }
+ psl->Release();
+ }
+ else
+ {
+ qWarning() << "Failed to create IShellLink instance";
+ qWarning() << "hres = " << hres;
+ }
+
+ // go away COM, nobody likes you
+ CoUninitialize();
+
+ return SUCCEEDED(hres);
#else
qWarning("Desktop Shortcuts not supported on your platform!");
return false;
diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h
index a9a81123..ac893725 100644
--- a/launcher/FileSystem.h
+++ b/launcher/FileSystem.h
@@ -172,4 +172,9 @@ QString getDesktopDir();
// Overrides one folder with the contents of another, preserving items exclusive to the first folder
// Equivalent to doing QDir::rename, but allowing for overrides
bool overrideFolder(QString overwritten_path, QString override_path);
+
+/**
+ * Creates a shortcut to the specified target file at the specified destination path.
+ */
+bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon);
}
diff --git a/launcher/resources/OSX/OSX.qrc b/launcher/resources/OSX/OSX.qrc
index 19fe312b..9d4511d1 100644
--- a/launcher/resources/OSX/OSX.qrc
+++ b/launcher/resources/OSX/OSX.qrc
@@ -39,5 +39,6 @@
<file>scalable/export.svg</file>
<file>scalable/rename.svg</file>
<file>scalable/launch.svg</file>
+ <file>scalable/shortcut.svg</file>
</qresource>
</RCC>
diff --git a/launcher/resources/OSX/scalable/shortcut.svg b/launcher/resources/OSX/scalable/shortcut.svg
new file mode 100644
index 00000000..a2b7488e
--- /dev/null
+++ b/launcher/resources/OSX/scalable/shortcut.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
+<rect fill="none" width="24" height="24"/>
+<g id="_x35__1_">
+ <g>
+ <path fill="#585858" d="M9.5,9.5C9.8,9.5,10,9.2,10,9l0-2.4l7.6,7.3c0.2,0.2,0.5,0.2,0.7,0c0.2-0.2,0.2-0.5,0-0.7L10.8,6L13,6
+ c0.3,0,0.5-0.2,0.5-0.5S13.3,5,13,5H9.5C9.2,5,9,5.2,9,5.5V9C9,9.2,9.2,9.5,9.5,9.5z M21,5h-5.5v1H21c0.5,0,1,0.5,1,1l0,10
+ c0,0.5-0.4,1-1,1l-10,0c-0.5,0-1-0.5-1-1v-5.5H9V17c0,1.1,1.1,2,2.2,2H21c1.1,0,2-0.9,2-2V7.2C23,6.1,22.1,5,21,5z"/>
+ </g>
+</g>
+</svg>
diff --git a/launcher/resources/breeze_dark/breeze_dark.qrc b/launcher/resources/breeze_dark/breeze_dark.qrc
index 4d7a69b2..97434abc 100644
--- a/launcher/resources/breeze_dark/breeze_dark.qrc
+++ b/launcher/resources/breeze_dark/breeze_dark.qrc
@@ -27,6 +27,7 @@
<file>scalable/refresh.svg</file>
<file>scalable/resourcepacks.svg</file>
<file>scalable/shaderpacks.svg</file>
+ <file>scalable/shortcut.svg</file>
<file>scalable/screenshots.svg</file>
<file>scalable/settings.svg</file>
<file>scalable/status-bad.svg</file>
diff --git a/launcher/resources/breeze_dark/scalable/shortcut.svg b/launcher/resources/breeze_dark/scalable/shortcut.svg
new file mode 100644
index 00000000..5559be1d
--- /dev/null
+++ b/launcher/resources/breeze_dark/scalable/shortcut.svg
@@ -0,0 +1,18 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+ <defs id="defs3051">
+ <style type="text/css" id="current-color-scheme">
+ .ColorScheme-Text {
+ color:#eff0f1;
+ }
+ </style>
+ </defs>
+ <g
+ transform="translate(-3,-1033.3622)">
+ <path
+ style="fill:currentColor;fill-opacity:1;stroke:none"
+ d="M 4,7 C 3.4459904,7 3,7.4459904 3,8 l 0,6 c 0,0.55401 0.4459904,1 1,1 l 5,0 c 0.55401,0 1,-0.44599 1,-1 l 0,-1 2,0 0,1 c 0,0.554 0.44599,1 1,1 l 5,0 c 0.55401,0 1,-0.446 1,-1 L 19,8 C 19,7.446 18.55401,7 18,7 l -5,0 c -0.55401,0 -1,0.446 -1,1 l 0,1 -2,0 0,-1 C 10,7.4459904 9.55401,7 9,7 Z M 4,8 7,8 9,8 9,9 C 8.4459904,9 8,9.4459904 8,10 l 0,2 c 0,0.55401 0.4459904,1 1,1 l 0,1 -2,0 -3,0 z m 9,0 3,0 2,0 0,6 -2,0 -3,0 0,-1 c 0.55401,0 1,-0.44599 1,-1 l 0,-2 C 14,9.4459904 13.55401,9 13,9 Z m -4,2 4,0 0,2 -4,0 z"
+ transform="translate(0,1030.3622)"
+ id="rect4161"
+ class="ColorScheme-Text" />
+ </g>
+</svg>
diff --git a/launcher/resources/breeze_light/breeze_light.qrc b/launcher/resources/breeze_light/breeze_light.qrc
index 7d9d99f5..6d868b18 100644
--- a/launcher/resources/breeze_light/breeze_light.qrc
+++ b/launcher/resources/breeze_light/breeze_light.qrc
@@ -27,6 +27,7 @@
<file>scalable/refresh.svg</file>
<file>scalable/resourcepacks.svg</file>
<file>scalable/shaderpacks.svg</file>
+ <file>scalable/shortcut.svg</file>
<file>scalable/screenshots.svg</file>
<file>scalable/settings.svg</file>
<file>scalable/status-bad.svg</file>
diff --git a/launcher/resources/breeze_light/scalable/shortcut.svg b/launcher/resources/breeze_light/scalable/shortcut.svg
new file mode 100644
index 00000000..426769d1
--- /dev/null
+++ b/launcher/resources/breeze_light/scalable/shortcut.svg
@@ -0,0 +1,18 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+ <defs id="defs3051">
+ <style type="text/css" id="current-color-scheme">
+ .ColorScheme-Text {
+ color:#232629;
+ }
+ </style>
+ </defs>
+ <g
+ transform="translate(-3,-1033.3622)">
+ <path
+ style="fill:currentColor;fill-opacity:1;stroke:none"
+ d="M 4,7 C 3.4459904,7 3,7.4459904 3,8 l 0,6 c 0,0.55401 0.4459904,1 1,1 l 5,0 c 0.55401,0 1,-0.44599 1,-1 l 0,-1 2,0 0,1 c 0,0.554 0.44599,1 1,1 l 5,0 c 0.55401,0 1,-0.446 1,-1 L 19,8 C 19,7.446 18.55401,7 18,7 l -5,0 c -0.55401,0 -1,0.446 -1,1 l 0,1 -2,0 0,-1 C 10,7.4459904 9.55401,7 9,7 Z M 4,8 7,8 9,8 9,9 C 8.4459904,9 8,9.4459904 8,10 l 0,2 c 0,0.55401 0.4459904,1 1,1 l 0,1 -2,0 -3,0 z m 9,0 3,0 2,0 0,6 -2,0 -3,0 0,-1 c 0.55401,0 1,-0.44599 1,-1 l 0,-2 C 14,9.4459904 13.55401,9 13,9 Z m -4,2 4,0 0,2 -4,0 z"
+ transform="translate(0,1030.3622)"
+ id="rect4161"
+ class="ColorScheme-Text" />
+ </g>
+</svg>
diff --git a/launcher/resources/flat/flat.qrc b/launcher/resources/flat/flat.qrc
index 508e0a9f..a846bd2d 100644
--- a/launcher/resources/flat/flat.qrc
+++ b/launcher/resources/flat/flat.qrc
@@ -35,6 +35,7 @@
<file>scalable/screenshot-placeholder.svg</file>
<file>scalable/screenshots.svg</file>
<file>scalable/settings.svg</file>
+ <file>scalable/shortcut.svg</file>
<file>scalable/star.svg</file>
<file>scalable/status-bad.svg</file>
<file>scalable/status-good.svg</file>
diff --git a/launcher/resources/flat/scalable/shortcut.svg b/launcher/resources/flat/scalable/shortcut.svg
new file mode 100644
index 00000000..83878d19
--- /dev/null
+++ b/launcher/resources/flat/scalable/shortcut.svg
@@ -0,0 +1,3 @@
+<svg fill="#757575" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
+ <path d="M5 21q-.825 0-1.413-.587Q3 19.825 3 19V5q0-.825.587-1.413Q4.175 3 5 3h7v2H5v14h14v-7h2v7q0 .825-.587 1.413Q19.825 21 19 21Zm4.7-5.3-1.4-1.4L17.6 5H14V3h7v7h-2V6.4Z"/>
+</svg>
diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc
index e11d6316..b0759d8f 100644
--- a/launcher/resources/flat_white/flat_white.qrc
+++ b/launcher/resources/flat_white/flat_white.qrc
@@ -35,6 +35,7 @@
<file>scalable/screenshot-placeholder.svg</file>
<file>scalable/screenshots.svg</file>
<file>scalable/settings.svg</file>
+ <file>scalable/shortcut.svg</file>
<file>scalable/star.svg</file>
<file>scalable/status-bad.svg</file>
<file>scalable/status-good.svg</file>
diff --git a/launcher/resources/flat_white/scalable/shortcut.svg b/launcher/resources/flat_white/scalable/shortcut.svg
new file mode 100644
index 00000000..b419a77d
--- /dev/null
+++ b/launcher/resources/flat_white/scalable/shortcut.svg
@@ -0,0 +1,3 @@
+<svg fill="#D8DEE9" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
+ <path d="M5 21q-.825 0-1.413-.587Q3 19.825 3 19V5q0-.825.587-1.413Q4.175 3 5 3h7v2H5v14h14v-7h2v7q0 .825-.587 1.413Q19.825 21 19 21Zm4.7-5.3-1.4-1.4L17.6 5H14V3h7v7h-2V6.4Z"/>
+</svg>
diff --git a/launcher/resources/iOS/iOS.qrc b/launcher/resources/iOS/iOS.qrc
index aa08d811..0b79efb2 100644
--- a/launcher/resources/iOS/iOS.qrc
+++ b/launcher/resources/iOS/iOS.qrc
@@ -39,5 +39,6 @@
<file>scalable/export.svg</file>
<file>scalable/rename.svg</file>
<file>scalable/launch.svg</file>
+ <file>scalable/shortcut.svg</file>
</qresource>
</RCC>
diff --git a/launcher/resources/iOS/scalable/shortcut.svg b/launcher/resources/iOS/scalable/shortcut.svg
new file mode 100644
index 00000000..16e9fa48
--- /dev/null
+++ b/launcher/resources/iOS/scalable/shortcut.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
+<g id="_x35__5_">
+ <g>
+ <path fill="#3366CC" d="M3,11c0.6,0,1-0.5,1-1l0-4.8l15.2,14.5c0.4,0.4,1,0.4,1.4,0c0.4-0.4,0.4-1,0-1.4L5.6,4L10,4
+ c0.6,0,1-0.5,1-1s-0.4-1-1-1H3C2.5,2,2,2.4,2,3v7C2,10.5,2.4,11,3,11z M26,2H15v2h11c1.1,0,2,0.9,2,2l0,20.1c0,1.1-0.9,2-2,2L6,28
+ c-1.1,0-2-0.9-2-2V15H2v11c0,2.2,2.2,4,4.4,4h19.7c2.2,0,3.9-1.8,3.9-3.9V6.4C30,4.2,28.2,2,26,2z"/>
+ </g>
+</g>
+</svg>
diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc
index 3f3d22fc..9741267c 100644
--- a/launcher/resources/multimc/multimc.qrc
+++ b/launcher/resources/multimc/multimc.qrc
@@ -312,5 +312,14 @@
<file>scalable/instances/fox.svg</file>
<file>scalable/instances/bee.svg</file>
<file>scalable/instances/prismlauncher.svg</file>
+
+ <!-- delete, tag, rename, shortcut CC-BY-SA 3.0, Oxygen icons.-->
+ <file>scalable/delete.svg</file>
+ <file>scalable/tag.svg</file>
+ <file>scalable/rename.svg</file>
+ <file>scalable/shortcut.svg</file>
+
+ <file>scalable/export.svg</file>
+ <file>scalable/launch.svg</file>
</qresource>
</RCC>
diff --git a/launcher/resources/multimc/scalable/delete.svg b/launcher/resources/multimc/scalable/delete.svg
new file mode 100644
index 00000000..414cbd5c
--- /dev/null
+++ b/launcher/resources/multimc/scalable/delete.svg
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="33.866665mm"
+ height="33.866665mm"
+ viewBox="0 0 33.866665 33.866665"
+ version="1.1"
+ id="svg2411"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs2408">
+ <linearGradient
+ xlink:href="#linearGradient3315"
+ id="linearGradient3321"
+ x1="20.961376"
+ y1="70.875"
+ x2="106.96138"
+ y2="70.875"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ id="linearGradient3315">
+ <stop
+ style="stop-color:#bf0303;stop-opacity:1;"
+ offset="0"
+ id="stop3317" />
+ <stop
+ id="stop3323"
+ offset="0.375"
+ style="stop-color:#fc3d3d;stop-opacity:1;" />
+ <stop
+ style="stop-color:#bf0303;stop-opacity:1;"
+ offset="0.75"
+ id="stop3325" />
+ <stop
+ style="stop-color:#bf0303;stop-opacity:1;"
+ offset="1"
+ id="stop3319" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient3335"
+ id="linearGradient3341"
+ x1="22.032"
+ y1="39.036999"
+ x2="105.967"
+ y2="39.036999"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ id="linearGradient3335">
+ <stop
+ style="stop-color:#9c0f0f;stop-opacity:0.28301886;"
+ offset="0"
+ id="stop3337" />
+ <stop
+ id="stop3343"
+ offset="0.5"
+ style="stop-color:#9c0f0f;stop-opacity:1;" />
+ <stop
+ style="stop-color:#9c0f0f;stop-opacity:0.1981132;"
+ offset="1"
+ id="stop3339" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient3347"
+ id="linearGradient3353"
+ x1="12.190286"
+ y1="21.738001"
+ x2="115.80972"
+ y2="21.738001"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ id="linearGradient3347">
+ <stop
+ style="stop-color:#d50303;stop-opacity:1;"
+ offset="0"
+ id="stop3349" />
+ <stop
+ id="stop3355"
+ offset="0.5"
+ style="stop-color:#feaeae;stop-opacity:1;" />
+ <stop
+ style="stop-color:#d50303;stop-opacity:1;"
+ offset="1"
+ id="stop3351" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient3371"
+ id="linearGradient3377"
+ x1="68.617584"
+ y1="9.6200819"
+ x2="68.617584"
+ y2="34.302147"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ id="linearGradient3371">
+ <stop
+ style="stop-color:#950000;stop-opacity:1;"
+ offset="0"
+ id="stop3373" />
+ <stop
+ style="stop-color:#350000;stop-opacity:1;"
+ offset="1"
+ id="stop3375" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient3418"
+ id="linearGradient3432"
+ gradientUnits="userSpaceOnUse"
+ x1="41.25"
+ y1="85.302696"
+ x2="86.75"
+ y2="85.302696"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ id="linearGradient3418">
+ <stop
+ id="stop3420"
+ offset="0"
+ style="stop-color:#390000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#da0303;stop-opacity:1;"
+ offset="0.375"
+ id="stop3422" />
+ <stop
+ id="stop3424"
+ offset="0.75"
+ style="stop-color:#7b0101;stop-opacity:1;" />
+ <stop
+ id="stop3426"
+ offset="1"
+ style="stop-color:#390000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient3418"
+ id="linearGradient3429"
+ gradientUnits="userSpaceOnUse"
+ x1="41.25"
+ y1="85.651398"
+ x2="86.75"
+ y2="85.651398"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <linearGradient
+ xlink:href="#linearGradient3418"
+ id="linearGradient3416"
+ gradientUnits="userSpaceOnUse"
+ x1="41.25"
+ y1="64.263702"
+ x2="86.75"
+ y2="64.263702"
+ gradientTransform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)" />
+ <radialGradient
+ r="63.912209"
+ fy="115.7093"
+ fx="63.912209"
+ cy="115.70919"
+ cx="63.912209"
+ gradientTransform="matrix(1,0,0,0.197802,0,92.82166)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3336"
+ xlink:href="#linearGradient3291" />
+ <linearGradient
+ id="linearGradient3291">
+ <stop
+ id="stop3293"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop3295"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ </defs>
+ <g
+ id="layer1"
+ transform="translate(196.3033,-17.933071)">
+ <g
+ id="g6686"
+ transform="translate(-43.45471,-96.01495)">
+ <path
+ d="m -135.91552,144.90744 c -3.41895,0 -6.36323,-0.76173 -8.22219,-1.87536 -0.49954,-0.0998 -0.96044,-0.2032 -1.37795,-0.3048 1.48722,1.68248 5.14376,2.97391 9.60014,2.97391 4.45664,0 8.11318,-1.29143 9.6004,-2.97391 -0.41751,0.10186 -0.87841,0.20505 -1.37795,0.3048 -1.85896,1.11363 -4.80298,1.87536 -8.22245,1.87536 z"
+ id="path202"
+ style="opacity:0.1;fill:#004d00;stroke-width:0.264583" />
+ <path
+ d="m -135.91552,145.17203 c -3.80127,0 -7.01569,-0.94112 -8.80295,-2.26192 -0.27993,-0.0606 -0.54743,-0.12198 -0.79719,-0.18283 1.48722,1.68248 5.14376,2.97391 9.60014,2.97391 4.45664,0 8.11318,-1.29143 9.6004,-2.97391 -0.24976,0.0608 -0.51726,0.1225 -0.79718,0.18283 -1.78727,1.3208 -5.00169,2.26192 -8.80322,2.26192 z"
+ id="path204"
+ style="opacity:0.2;fill:#004d00;stroke-width:0.264583" />
+ <path
+ d="m -135.91552,145.43661 c -4.1447,0 -7.59513,-1.11786 -9.25433,-2.62784 -0.11748,-0.027 -0.23442,-0.0542 -0.34581,-0.0818 1.48722,1.68249 5.14376,2.97392 9.60014,2.97392 4.45664,0 8.11318,-1.29143 9.6004,-2.97392 -0.11138,0.0275 -0.22833,0.0548 -0.34607,0.0818 -1.65894,1.50998 -5.10937,2.62784 -9.25433,2.62784 z"
+ id="path206"
+ style="opacity:0.3;fill:#004d00;stroke-width:0.264583" />
+ <path
+ style="fill:url(#linearGradient3321);fill-opacity:1;stroke-width:0.264583"
+ id="path3962"
+ d="m -147.30256,119.69953 1.05833,21.36828 c 0,2.41274 4.47384,4.63338 10.31849,4.63338 5.84517,0 10.31901,-2.22064 10.31901,-4.63338 l 1.05834,-21.36828 z" />
+ <rect
+ id="_x3C_Sezione_x3E_"
+ width="33.866665"
+ height="33.866665"
+ x="-152.84859"
+ y="113.94802"
+ style="fill:none;stroke-width:0.264583" />
+ <path
+ d="m -124.84059,122.62688 0.0291,-0.322 c -1.12712,2.10397 -5.6679,3.67851 -11.1043,3.67851 -5.43586,0 -9.9769,-1.57454 -11.1035,-3.67851 l 0.0288,0.322 c 1.17792,2.07539 5.68801,3.62135 11.07466,3.62135 5.38745,-2.6e-4 9.89727,-1.54596 11.0752,-3.62135 z"
+ id="path66"
+ style="opacity:0.5;fill:url(#linearGradient3341);fill-opacity:1;stroke-width:0.264583" />
+ <ellipse
+ cx="-135.91525"
+ cy="119.69953"
+ rx="11.377083"
+ ry="4.6963539"
+ id="ellipse75"
+ style="fill:url(#linearGradient3353);fill-opacity:1;stroke-width:0.264583" />
+ <path
+ d="m -146.34804,119.44606 c 0,1.9222 4.19206,3.97986 10.43252,3.97986 6.24073,0 10.43305,-2.05766 10.43305,-3.97986 0,-1.92193 -4.19232,-3.71528 -10.43305,-3.71528 -6.24046,0 -10.43252,1.79361 -10.43252,3.71528 z"
+ id="path90"
+ style="opacity:0.727778;fill:url(#linearGradient3377);fill-opacity:1;stroke-width:0.264583" />
+ <path
+ d="m -135.91552,115.73801 c -6.24046,0 -10.43252,1.92905 -10.43252,3.73061 0,0.47023 0.28786,0.94865 0.82074,1.39978 -0.0302,-0.13616 -0.0453,-0.27207 -0.0453,-0.40773 0,-2.65478 5.59455,-4.47464 9.65703,-4.47464 7.90334,0 11.98846,2.51962 9.65755,4.47464 -0.10375,0.087 -0.0153,0.27157 -0.0455,0.40773 0.53313,-0.45088 0.821,-0.92955 0.821,-1.39978 0,-1.80132 -4.19232,-3.73061 -10.43305,-3.73061 z"
+ id="path99"
+ style="opacity:0.494444;fill:#000000;fill-opacity:1;stroke-width:0.264583" />
+ <g
+ id="g335"
+ transform="matrix(0.26458333,0,0,0.26458333,-152.84859,113.94802)">
+ <path
+ d="m 63.999,32.22 c -21.36,0 -36.348,-6.18 -38.912,-12.556 -0.258,0.642 -0.393,1.286 -0.393,1.925 0,6.994 15.793,14.482 39.305,14.482 23.513,0 39.307,-7.488 39.307,-14.482 0,-0.639 -0.136,-1.283 -0.394,-1.925 C 100.35,26.04 85.36,32.22 63.999,32.22 Z"
+ id="path337"
+ style="opacity:0.1;fill:#555555" />
+ <path
+ d="m 63.999,33.184 c -21.897,0 -37.093,-6.496 -39.077,-13.037 -0.147,0.481 -0.228,0.964 -0.228,1.443 0,6.994 15.793,14.482 39.305,14.482 23.513,0 39.307,-7.488 39.307,-14.482 0,-0.479 -0.082,-0.962 -0.228,-1.443 -1.983,6.541 -17.18,13.037 -39.079,13.037 z"
+ id="path339"
+ style="opacity:0.15;fill:#555555" />
+ <path
+ d="m 63.999,34.146 c -22.435,0 -37.832,-6.818 -39.195,-13.519 -0.065,0.321 -0.109,0.642 -0.109,0.962 0,6.994 15.793,14.482 39.305,14.482 23.513,0 39.307,-7.488 39.307,-14.482 0,-0.32 -0.044,-0.641 -0.11,-0.962 -1.364,6.701 -16.762,13.519 -39.198,13.519 z"
+ id="path341"
+ style="opacity:0.2;fill:#555555" />
+ <path
+ d="m 63.999,35.109 c -22.973,0 -38.568,-7.148 -39.271,-14 -0.017,0.161 -0.034,0.321 -0.034,0.481 0,6.994 15.793,14.482 39.305,14.482 23.513,0 39.307,-7.488 39.307,-14.482 0,-0.16 -0.018,-0.32 -0.034,-0.481 -0.704,6.851 -16.299,14 -39.273,14 z"
+ id="path343"
+ style="opacity:0.25;fill:#555555" />