@@ -2,11 +2,14 @@ | |||||
In this document, Mod is Ctrl on Windows/Linux and Cmd on Mac. | In this document, Mod is Ctrl on Windows/Linux and Cmd on Mac. | ||||
### 1.2.0 (in development) | |||||
- Enable app notarization on Mac, removing the "Apple cannot check for malicious software" message on launch. | |||||
### 1.1.2 (2019-07-20) | |||||
- Add app notarization on Mac, which removes the "Apple cannot check for malicious software" message on launch. | |||||
- Write stack trace to log.txt and display dialog box when Rack crashes. | |||||
- Re-enable JACK MIDI driver on Linux. | - Re-enable JACK MIDI driver on Linux. | ||||
- Fix scroll speed for mice and trackpads on Mac. | - Fix scroll speed for mice and trackpads on Mac. | ||||
- Fix undo history bug when dragging patch file to the Rack window. | - Fix undo history bug when dragging patch file to the Rack window. | ||||
- Fix crash when pasting presets to an empty rack space with Mod-V. | |||||
- Fix module expanders being assigned incorrectly when loading presets. | |||||
- Add check for duplicate port IDs for modules. | - Add check for duplicate port IDs for modules. | ||||
### 1.1.1 (2019-07-01) | ### 1.1.1 (2019-07-01) | ||||
@@ -0,0 +1,77 @@ | |||||
# Contributor Covenant Code of Conduct | |||||
## Our Pledge | |||||
In the interest of fostering an open and welcoming environment, we as | |||||
contributors and maintainers pledge to making participation in our project and | |||||
our community a harassment-free experience for everyone, regardless of age, body | |||||
size, disability, ethnicity, sex characteristics, gender identity and expression, | |||||
level of experience, education, socio-economic status, nationality, personal | |||||
appearance, race, religion, or sexual identity and orientation. | |||||
## Our Standards | |||||
Examples of behavior that contributes to creating a positive environment | |||||
include: | |||||
* Using welcoming and inclusive language | |||||
* Being respectful of differing viewpoints and experiences | |||||
* Gracefully accepting constructive criticism | |||||
* Focusing on what is best for the community | |||||
* Showing empathy towards other community members | |||||
Examples of unacceptable behavior by participants include: | |||||
* The use of sexualized language or imagery and unwelcome sexual attention or | |||||
advances | |||||
* Trolling, insulting/derogatory comments, and personal or political attacks | |||||
* Public or private harassment | |||||
* Publishing others' private information, such as a physical or electronic | |||||
address, without explicit permission | |||||
* Other conduct which could reasonably be considered inappropriate in a | |||||
professional setting | |||||
## Our Responsibilities | |||||
Project maintainers are responsible for clarifying the standards of acceptable | |||||
behavior and are expected to take appropriate and fair corrective action in | |||||
response to any instances of unacceptable behavior. | |||||
Project maintainers have the right and responsibility to remove, edit, or | |||||
reject comments, commits, code, wiki edits, issues, and other contributions | |||||
that are not aligned to this Code of Conduct, or to ban temporarily or | |||||
permanently any contributor for other behaviors that they deem inappropriate, | |||||
threatening, offensive, or harmful. | |||||
## Scope | |||||
This Code of Conduct applies within all project spaces, and it also applies when | |||||
an individual is representing the project or its community in public spaces. | |||||
Examples of representing a project or community include using an official | |||||
project e-mail address, posting via an official social media account, or acting | |||||
as an appointed representative at an online or offline event. Representation of | |||||
a project may be further defined and clarified by project maintainers. | |||||
## Enforcement | |||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be | |||||
reported by contacting the project team at contact@vcvrack.com. All | |||||
complaints will be reviewed and investigated and will result in a response that | |||||
is deemed necessary and appropriate to the circumstances. The project team is | |||||
obligated to maintain confidentiality with regard to the reporter of an incident. | |||||
Further details of specific enforcement policies may be posted separately. | |||||
Project maintainers who do not follow or enforce the Code of Conduct in good | |||||
faith may face temporary or permanent repercussions as determined by other | |||||
members of the project's leadership. | |||||
## Attribution | |||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, | |||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html | |||||
[homepage]: https://www.contributor-covenant.org | |||||
For answers to common questions about this code of conduct, see | |||||
https://www.contributor-covenant.org/faq | |||||
@@ -1,7 +1,7 @@ | |||||
{ | { | ||||
"slug": "Core", | "slug": "Core", | ||||
"name": "Core", | "name": "Core", | ||||
"version": "1.0.0", | |||||
"version": "1.1.2", | |||||
"license": "GPL-3.0-only", | "license": "GPL-3.0-only", | ||||
"author": "VCV", | "author": "VCV", | ||||
"brand": "VCV", | "brand": "VCV", | ||||
@@ -12,19 +12,19 @@ All VCV Rack **source code** is copyright © 2019 Andrew Belt and licensed under | |||||
This means that non-commercial plugins do not need to be licensed under the GPLv3 and can be released under any license of your choice (open-source or proprietary freeware). However, plugins that copy a significant portion of non-API source code from Rack must be licensed under GPLv3. | This means that non-commercial plugins do not need to be licensed under the GPLv3 and can be released under any license of your choice (open-source or proprietary freeware). However, plugins that copy a significant portion of non-API source code from Rack must be licensed under GPLv3. | ||||
If you wish to release a proprietary commercial plugin, email contact@vcvrack.com for commercial licensing. A commercial license is included for plugins sold in the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||||
If you wish to release a proprietary commercial plugin, email contact@vcvrack.com for commercial licensing. A commercial license is included for plugins sold in the [VCV Library](https://vcvrack.com/plugins.html). | |||||
--- | --- | ||||
Licenses of **third-party libraries** are listed in [LICENSE-dist.txt](LICENSE-dist.txt). | Licenses of **third-party libraries** are listed in [LICENSE-dist.txt](LICENSE-dist.txt). | ||||
The **Component Library graphics** in the `res/ComponentLibrary` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). | The **Component Library graphics** in the `res/ComponentLibrary` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). | ||||
You may not freely sell plugins using Component Library graphics. | |||||
However, a free commercial license is available for plugins sold through the [VCV Plugin Manager](https://vcvrack.com/plugins.html). | |||||
Email contact@vcvrack.com for more information about licensing or the VCV Plugin Manager. | |||||
This means you may not freely sell plugins using Component Library graphics. | |||||
However, a free commercial license is available for plugins sold through the [VCV Library](https://vcvrack.com/plugins.html). | |||||
Email contact@vcvrack.com for more information about licensing or the VCV Library. | |||||
The **Core panel graphics** in the `res/Core` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). | The **Core panel graphics** in the `res/Core` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). | ||||
You may not distribute modified adaptations of these graphics. | |||||
This means you may not distribute modified adaptations of these graphics. | |||||
The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works. | The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works. | ||||
@@ -1,6 +1,6 @@ | |||||
RACK_DIR ?= . | RACK_DIR ?= . | ||||
VERSION := 1.dev.$(shell git rev-parse --short HEAD) | |||||
# VERSION := 1.1.1 | |||||
# VERSION := 1.dev.$(shell git rev-parse --short HEAD) | |||||
VERSION := 1.1.2 | |||||
FLAGS += -DVERSION=$(VERSION) | FLAGS += -DVERSION=$(VERSION) | ||||
FLAGS += -Iinclude -Idep/include | FLAGS += -Iinclude -Idep/include | ||||
@@ -38,8 +38,8 @@ endif | |||||
ifdef ARCH_WIN | ifdef ARCH_WIN | ||||
SOURCES += dep/osdialog/osdialog_win.c | SOURCES += dep/osdialog/osdialog_win.c | ||||
LDFLAGS += -Wl,--export-all-symbols,--out-implib,libRack.a -mwindows \ | LDFLAGS += -Wl,--export-all-symbols,--out-implib,libRack.a -mwindows \ | ||||
dep/lib/libglew32.a dep/lib/libglfw3.a dep/lib/libjansson.a dep/lib/libspeexdsp.a dep/lib/libzip.a dep/lib/libz.a dep/lib/libcurl.a dep/lib/libssl.a dep/lib/libcrypto.a dep/lib/librtaudio.a dep/lib/librtmidi.a \ | |||||
-lpthread -lopengl32 -lgdi32 -lws2_32 -lcomdlg32 -lole32 -ldsound -lwinmm -lksuser -lshlwapi -lmfplat -lmfuuid -lwmcodecdspuuid -ldbghelp | |||||
dep/lib/libglew32.a dep/lib/libglfw3.a dep/lib/libjansson.a dep/lib/libspeexdsp.a dep/lib/libzip.a dep/lib/libz.a dep/lib/libcurl.a dep/lib/librtaudio.a dep/lib/librtmidi.a \ | |||||
-lpthread -lopengl32 -lgdi32 -lws2_32 -lcomdlg32 -lole32 -lcrypt32 -ldsound -lwinmm -lksuser -lshlwapi -lmfplat -lmfuuid -lwmcodecdspuuid -ldbghelp | |||||
TARGET := Rack.exe | TARGET := Rack.exe | ||||
OBJECTS += Rack.res | OBJECTS += Rack.res | ||||
endif | endif | ||||
@@ -130,7 +130,6 @@ ifdef ARCH_MAC | |||||
# This will only work if you have the private key to my certificate | # This will only work if you have the private key to my certificate | ||||
codesign --verbose --sign "Developer ID Application: Andrew Belt (VRF26934X5)" --options runtime --entitlements Entitlements.plist --deep dist/$(TARGET).app | codesign --verbose --sign "Developer ID Application: Andrew Belt (VRF26934X5)" --options runtime --entitlements Entitlements.plist --deep dist/$(TARGET).app | ||||
codesign --verify --deep --strict --verbose=2 dist/$(TARGET).app | codesign --verify --deep --strict --verbose=2 dist/$(TARGET).app | ||||
# spctl --assess --type execute --ignore-cache --no-cache -vv dist/$(TARGET).app | |||||
# Make ZIP | # Make ZIP | ||||
cd dist && zip -q -9 -r Rack-$(VERSION)-$(ARCH).zip $(TARGET).app | cd dist && zip -q -9 -r Rack-$(VERSION)-$(ARCH).zip $(TARGET).app | ||||
endif | endif | ||||
@@ -171,6 +170,7 @@ ifdef ARCH_MAC | |||||
xcrun altool --notarize-app -f dist/Rack-$(VERSION)-$(ARCH).zip --primary-bundle-id=com.vcvrack.rack -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/UploadInfo.plist | xcrun altool --notarize-app -f dist/Rack-$(VERSION)-$(ARCH).zip --primary-bundle-id=com.vcvrack.rack -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/UploadInfo.plist | ||||
# Wait for Apple's servers to approve the app | # Wait for Apple's servers to approve the app | ||||
while true; do \ | while true; do \ | ||||
echo "Waiting on Apple servers..." ; \ | |||||
xcrun altool --notarization-info `/usr/libexec/PlistBuddy -c "Print :notarization-upload:RequestUUID" dist/UploadInfo.plist` -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/RequestInfo.plist ; \ | xcrun altool --notarization-info `/usr/libexec/PlistBuddy -c "Print :notarization-upload:RequestUUID" dist/UploadInfo.plist` -u "andrewpbelt@gmail.com" -p @keychain:notarize --output-format xml > dist/RequestInfo.plist ; \ | ||||
if [ "`/usr/libexec/PlistBuddy -c "Print :notarization-info:Status" dist/RequestInfo.plist`" != "in progress" ]; then \ | if [ "`/usr/libexec/PlistBuddy -c "Print :notarization-info:Status" dist/RequestInfo.plist`" != "in progress" ]; then \ | ||||
break ; \ | break ; \ | ||||
@@ -119,11 +119,24 @@ curl-7.64.1: | |||||
$(UNTAR) curl-7.64.1.tar.gz | $(UNTAR) curl-7.64.1.tar.gz | ||||
rm curl-7.64.1.tar.gz | rm curl-7.64.1.tar.gz | ||||
$(libcurl): $(openssl) curl-7.64.1 | |||||
cd curl-7.64.1 && PKG_CONFIG_PATH= $(CONFIGURE) \ | |||||
--disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-shared --disable-symbol-hiding \ | |||||
--without-zlib --without-libpsl --without-libmetalink --without-libssh2 --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-brotli \ | |||||
--without-ca-bundle --with-ca-fallback --with-ssl="$(DEP_PATH)" | |||||
CURL_FLAGS += --disable-ftp --disable-file --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-shared --disable-symbol-hiding | |||||
CURL_FLAGS += --without-zlib --without-libpsl --without-libmetalink --without-libssh2 --without-librtmp --without-winidn --without-libidn2 --without-nghttp2 --without-brotli | |||||
ifdef ARCH_LIN | |||||
CURL_FLAGS += --with-ssl="$(DEP_PATH)" | |||||
CURL_DEPS += $(openssl) | |||||
endif | |||||
ifdef ARCH_MAC | |||||
# Since Rack supports Mac 10.7 but Apple's Secure Transport only supports TLS 1.0 on that OS, use OpenSSL instead. | |||||
# CURL_FLAGS += --with-secure-transport | |||||
CURL_FLAGS += --with-ssl="$(DEP_PATH)" | |||||
CURL_DEPS += $(openssl) | |||||
endif | |||||
ifdef ARCH_WIN | |||||
CURL_FLAGS += --with-schannel --without-ssl | |||||
endif | |||||
$(libcurl): $(CURL_DEPS) curl-7.64.1 | |||||
cd curl-7.64.1 && PKG_CONFIG_PATH= $(CONFIGURE) $(CURL_FLAGS) | |||||
$(MAKE) -C curl-7.64.1 | $(MAKE) -C curl-7.64.1 | ||||
$(MAKE) -C curl-7.64.1 install | $(MAKE) -C curl-7.64.1 install | ||||
@@ -163,15 +176,15 @@ rtmidi-4.0.0: | |||||
rm rtmidi-4.0.0.tar.gz | rm rtmidi-4.0.0.tar.gz | ||||
RTMIDI_FLAGS += --enable-shared=no | RTMIDI_FLAGS += --enable-shared=no | ||||
ifdef ARCH_LIN | |||||
RTMIDI_FLAGS += --with-jack --with-alsa | |||||
endif | |||||
ifdef ARCH_MAC | ifdef ARCH_MAC | ||||
RTMIDI_FLAGS += --with-core --without-jack | RTMIDI_FLAGS += --with-core --without-jack | ||||
endif | endif | ||||
ifdef ARCH_WIN | ifdef ARCH_WIN | ||||
RTMIDI_FLAGS += --with-winmm | RTMIDI_FLAGS += --with-winmm | ||||
endif | endif | ||||
ifdef ARCH_LIN | |||||
RTMIDI_FLAGS += --with-jack --with-alsa | |||||
endif | |||||
$(rtmidi): rtmidi-4.0.0 | $(rtmidi): rtmidi-4.0.0 | ||||
cd rtmidi-4.0.0 && $(CONFIGURE) $(RTMIDI_FLAGS) | cd rtmidi-4.0.0 && $(CONFIGURE) $(RTMIDI_FLAGS) | ||||
@@ -179,15 +192,15 @@ $(rtmidi): rtmidi-4.0.0 | |||||
$(MAKE) -C rtmidi-4.0.0 install | $(MAKE) -C rtmidi-4.0.0 install | ||||
RTAUDIO_FLAGS += -DRTAUDIO_BUILD_STATIC_LIBS=ON | RTAUDIO_FLAGS += -DRTAUDIO_BUILD_STATIC_LIBS=ON | ||||
ifdef ARCH_LIN | |||||
RTAUDIO_FLAGS += -DRTAUDIO_API_ALSA=ON -DRTAUDIO_API_JACK=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_OSS=OFF | |||||
endif | |||||
ifdef ARCH_MAC | ifdef ARCH_MAC | ||||
RTAUDIO_FLAGS += -DRTAUDIO_API_CORE=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_JACK=OFF | RTAUDIO_FLAGS += -DRTAUDIO_API_CORE=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_JACK=OFF | ||||
endif | endif | ||||
ifdef ARCH_WIN | ifdef ARCH_WIN | ||||
RTAUDIO_FLAGS += -DRTAUDIO_API_DS=ON -DRTAUDIO_API_WASAPI=ON -DRTAUDIO_API_ASIO=ON | RTAUDIO_FLAGS += -DRTAUDIO_API_DS=ON -DRTAUDIO_API_WASAPI=ON -DRTAUDIO_API_ASIO=ON | ||||
endif | endif | ||||
ifdef ARCH_LIN | |||||
RTAUDIO_FLAGS += -DRTAUDIO_API_ALSA=ON -DRTAUDIO_API_JACK=ON -DRTAUDIO_API_PULSE=OFF -DRTAUDIO_API_OSS=OFF | |||||
endif | |||||
$(rtaudio): rtaudio | $(rtaudio): rtaudio | ||||
cd rtaudio && mkdir -p build | cd rtaudio && mkdir -p build | ||||
@@ -26,6 +26,7 @@ std::string plugin(plugin::Plugin *plugin, std::string filename); | |||||
extern std::string systemDir; | extern std::string systemDir; | ||||
extern std::string userDir; | extern std::string userDir; | ||||
extern std::string logPath; | |||||
extern std::string pluginsPath; | extern std::string pluginsPath; | ||||
extern std::string settingsPath; | extern std::string settingsPath; | ||||
extern std::string autosavePath; | extern std::string autosavePath; | ||||
@@ -447,6 +447,12 @@ struct BlueLight : GrayModuleLightWidget { | |||||
} | } | ||||
}; | }; | ||||
struct WhiteLight : GrayModuleLightWidget { | |||||
WhiteLight() { | |||||
addBaseColor(SCHEME_WHITE); | |||||
} | |||||
}; | |||||
/** Reads two adjacent lightIds, so `lightId` and `lightId + 1` must be defined */ | /** Reads two adjacent lightIds, so `lightId` and `lightId + 1` must be defined */ | ||||
struct GreenRedLight : GrayModuleLightWidget { | struct GreenRedLight : GrayModuleLightWidget { | ||||
GreenRedLight() { | GreenRedLight() { | ||||
@@ -26,8 +26,6 @@ json_t *requestJson(Method method, std::string url, json_t *dataJ); | |||||
bool requestDownload(std::string url, const std::string &filename, float *progress); | bool requestDownload(std::string url, const std::string &filename, float *progress); | ||||
/** URL-encodes `s` */ | /** URL-encodes `s` */ | ||||
std::string encodeUrl(const std::string &s); | std::string encodeUrl(const std::string &s); | ||||
/** Computes the SHA256 of the file at `filename` */ | |||||
std::string computeSHA256File(const std::string &filename); | |||||
/** Gets the path portion of the URL. */ | /** Gets the path portion of the URL. */ | ||||
std::string urlPath(const std::string &url); | std::string urlPath(const std::string &url); | ||||
@@ -1,2 +0,0 @@ | |||||
Component Library graphics by Grayscale (http://grayscale.info/) | |||||
Licensed under CC BY-NC 4.0 (https://creativecommons.org/licenses/by-nc/4.0/) |
@@ -1,3 +0,0 @@ | |||||
Core panel and VCV logo design © 2018 by Grayscale | |||||
Derivative works may not use Core panel and VCV logo design. |
@@ -1,12 +0,0 @@ | |||||
All icons are licensed under CC BY 3.0. | |||||
https://creativecommons.org/licenses/by/3.0/ | |||||
https://thenounproject.com/ | |||||
Paper by Madeleine Bennett from the Noun Project | |||||
Folder by Icon Solid from the Noun Project | |||||
Save by Landan Lloyd from the Noun Project | |||||
Cat by Nabilauzwa from the Noun Project | |||||
Stopwatch by Arthur Shlain from the Noun Project | |||||
Sound by Gregor Cresnar from the Noun Project | |||||
Refresh by un·delivered from the Noun Project | |||||
Lock by Andres Gleixner from the Noun Project |
@@ -1,61 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
data-name="Your Icon" | |||||
viewBox="0 0 16 16" | |||||
x="0px" | |||||
y="0px" | |||||
version="1.1" | |||||
id="svg53" | |||||
sodipodi:docname="noun_1084369_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||||
<metadata | |||||
id="metadata59"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title>Cycles</dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs57" /> | |||||
<sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
id="namedview55" | |||||
showgrid="false" | |||||
inkscape:zoom="2.784" | |||||
inkscape:cx="27.43027" | |||||
inkscape:cy="86.426288" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg53" /> | |||||
<title | |||||
id="title45">Cycles</title> | |||||
<path | |||||
d="M 9.0117134,7.367368 11.174158,5.206575 a 4.1778634,4.1778634 0 1 0 0.728524,4.460353 h 1.90804 0.01652 q -0.0413,0.15033 -0.09416,0.297357 A 6,6 0 1 1 12.462704,3.919681 l 1.473568,-1.473568 v 4.921255 z" | |||||
id="path47" | |||||
inkscape:connector-curvature="0" | |||||
style="stroke-width:0.16519824;fill:#b4b4b4;fill-opacity:1" /> | |||||
</svg> |
@@ -1,47 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
viewBox="0 0 16 16" | |||||
xml:space="preserve" | |||||
id="svg9404" | |||||
sodipodi:docname="noun_1240789_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata9410"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>111all</dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs9408" /><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
id="namedview9406" | |||||
showgrid="false" | |||||
inkscape:zoom="1.888" | |||||
inkscape:cx="50" | |||||
inkscape:cy="62.5" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg9404" /><title | |||||
id="title9396">111all</title><path | |||||
d="M 9.324675,3.5188325 C 9.041322,3.1363055 8.517119,3.0654675 8.134593,3.3346525 7.978749,3.4479935 7.865407,3.6180055 7.822904,3.8021855 L 6.292798,9.5400835 5.159386,7.1457505 C 5.01771,6.8482295 4.720189,6.6640505 4.3943329,6.6640505 H 2 v 1.700118 H 3.8559622 L 5.754427,12.345278 c 0.141677,0.297521 0.439198,0.4817 0.765054,0.4817 h 0.07084 c 0.354191,-0.02833 0.651712,-0.283353 0.736718,-0.623377 l 1.671782,-6.2621005 1.530107,2.068477 c 0.155844,0.212515 0.410861,0.340023 0.680047,0.340023 H 14 v -1.700118 h -2.337662 z" | |||||
id="path9398" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.1416765" /></svg> |
@@ -1,71 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
viewBox="0 0 16 16" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
id="svg5499" | |||||
sodipodi:docname="noun_1343811_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||||
<metadata | |||||
id="metadata5505"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title>7.3</dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs5503" /> | |||||
<sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
id="namedview5501" | |||||
showgrid="false" | |||||
inkscape:zoom="1.888" | |||||
inkscape:cx="-36.334746" | |||||
inkscape:cy="62.5" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg5499" /> | |||||
<title | |||||
id="title5485">7.3</title> | |||||
<desc | |||||
id="desc5487">Created with Sketch.</desc> | |||||
<g | |||||
id="g5493" | |||||
transform="matrix(0.3,0,0,0.3,-7,-7)" | |||||
style="fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"> | |||||
<g | |||||
id="g5491" | |||||
style="fill:#b4b4b4;fill-opacity:1"> | |||||
<path | |||||
d="m 42,31 v 10 0 c 0,0.552285 0.447715,1 1,1 h 14 v 0 c 0.552285,0 1,-0.447715 1,-1 v -10 0 c 0,-0.552285 0.447715,-1 1,-1 h 2.171573 v 0 c 0.530433,0 1.039141,0.210714 1.414213,0.585786 l 6.828428,6.828428 v 0 C 69.789286,37.789286 70,38.297994 70,38.828427 V 68 68 c 0,1.104569 -0.895431,2 -2,2 H 32 v 0 c -1.10457,0 -2,-0.895431 -2,-2 v -36 0 c 0,-1.10457 0.89543,-2 2,-2 h 9 v 0 c 0.552285,0 1,0.447715 1,1 z m 9,-1 h 2 v 0 c 0.552285,0 1,0.447715 1,1 v 6 0 c 0,0.552285 -0.447715,1 -1,1 h -2 v 0 c -0.552285,0 -1,-0.447715 -1,-1 v -6 0 c 0,-0.552285 0.447715,-1 1,-1 z m -8,26 v 0 0 c 0,3.865993 3.134007,7 7,7 v 0 0 c 3.865993,0 7,-3.134007 7,-7 v 0 0 c 0,-3.865993 -3.134007,-7 -7,-7 v 0 0 c -3.865993,0 -7,3.134007 -7,7 z" | |||||
id="path5489" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1" /> | |||||
</g> | |||||
</g> | |||||
</svg> |
@@ -1,71 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
viewBox="0 0 16 16" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
id="svg4854" | |||||
sodipodi:docname="noun_1343816_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"> | |||||
<metadata | |||||
id="metadata4860"> | |||||
<rdf:RDF> | |||||
<cc:Work | |||||
rdf:about=""> | |||||
<dc:format>image/svg+xml</dc:format> | |||||
<dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | |||||
<dc:title>8.3</dc:title> | |||||
</cc:Work> | |||||
</rdf:RDF> | |||||
</metadata> | |||||
<defs | |||||
id="defs4858" /> | |||||
<sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
id="namedview4856" | |||||
showgrid="false" | |||||
inkscape:zoom="1.888" | |||||
inkscape:cx="-36.334746" | |||||
inkscape:cy="62.5" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg4854" /> | |||||
<title | |||||
id="title4840">8.3</title> | |||||
<desc | |||||
id="desc4842">Created with Sketch.</desc> | |||||
<g | |||||
id="g4848" | |||||
transform="matrix(0.3,0,0,0.3,-7,-7)" | |||||
style="fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"> | |||||
<g | |||||
id="g4846" | |||||
style="fill:#b4b4b4;fill-opacity:1"> | |||||
<path | |||||
d="m 42,31 v 10 0 c 0,0.552285 0.447715,1 1,1 h 14 v 0 c 0.552285,0 1,-0.447715 1,-1 v -10 0 c 0,-0.552285 0.447715,-1 1,-1 h 2.171573 v 0 c 0.530433,0 1.039141,0.210714 1.414213,0.585786 l 6.828428,6.828428 v 0 C 69.789286,37.789286 70,38.297994 70,38.828427 V 68 68 c 0,1.104569 -0.895431,2 -2,2 H 32 v 0 c -1.10457,0 -2,-0.895431 -2,-2 v -36 0 c 0,-1.10457 0.89543,-2 2,-2 h 9 v 0 c 0.552285,0 1,0.447715 1,1 z m 9,-1 h 2 v 0 c 0.552285,0 1,0.447715 1,1 v 6 0 c 0,0.552285 -0.447715,1 -1,1 h -2 v 0 c -0.552285,0 -1,-0.447715 -1,-1 v -6 0 c 0,-0.552285 0.447715,-1 1,-1 z" | |||||
id="path4844" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1" /> | |||||
</g> | |||||
</g> | |||||
</svg> |
@@ -1,56 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
viewBox="0 0 16 16" | |||||
enable-background="new 0 0 90 90" | |||||
xml:space="preserve" | |||||
id="svg12754" | |||||
sodipodi:docname="noun_146097_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata12760"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs12758" /><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="882" | |||||
id="namedview12756" | |||||
showgrid="false" | |||||
inkscape:zoom="2.0977778" | |||||
inkscape:cx="-32.701271" | |||||
inkscape:cy="56.25" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="18" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg12754" /><path | |||||
stroke-miterlimit="10" | |||||
d="M 8.0000005,3.115294" | |||||
id="path12744" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.14117648;stroke-miterlimit:10" | |||||
inkscape:connector-curvature="0" /><path | |||||
d="M 12.531765,13.195294 V 6.122353 l -3.4164705,0.01412 c -0.465883,-2e-6 -0.847059,-0.381179 -0.847059,-0.847061 V 2 H 4.1317645 C 3.7647065,2 3.4682355,2.296471 3.4682355,2.663529 V 13.195294 C 3.4682355,13.632941 3.8211765,14 4.2729415,14 h 7.4541175 c 0.437647,0 0.804705,-0.367059 0.804706,-0.804706 z" | |||||
id="path12746" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.14117648" | |||||
inkscape:connector-curvature="0" /><path | |||||
d="m 8.8188235,2.042353 v 3.063529 c 0,0.254118 0.211765,0.465883 0.465883,0.465883 h 3.1905885 z" | |||||
id="path12748" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.14117648" | |||||
inkscape:connector-curvature="0" /></svg> |
@@ -1,57 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
xml:space="preserve" | |||||
version="1.1" | |||||
style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision" | |||||
viewBox="0 0 16 16" | |||||
x="0px" | |||||
y="0px" | |||||
id="svg3034" | |||||
sodipodi:docname="noun_1745061_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata3038"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="900" | |||||
id="namedview3036" | |||||
showgrid="false" | |||||
inkscape:zoom="2.9385214" | |||||
inkscape:cx="24.568026" | |||||
inkscape:cy="49.947022" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="0" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg3034" /><defs | |||||
id="defs3024"><style | |||||
type="text/css" | |||||
id="style3022"> | |||||
.fil0 {fill:black} | |||||
</style></defs><g | |||||
id="g3028" | |||||
transform="matrix(0.04669261,0,0,0.04669261,2.6002034,1.9999996)" | |||||
style="fill:#b4b4b4;fill-opacity:1"><path | |||||
class="fil0" | |||||
d="M 57,228 C -2,177 107,127 84,71 71,41 32,31 8,52 -7,64 2,79 17,69 34,55 56,62 64,81 c 12,29 -36,75 -43,102 -8,27 12,74 49,74 h 74 c 0,-9 -4,-13 -12,-14 20,-18 23,-40 1,-67 24,20 25,51 10,66 7,4 8,10 9,15 h 29 c -3,-4 -6,-8 -11,-10 -3,-50 25,-65 34,-94 6,-23 -3,-47 -10,-67 11,-8 25,6 37,-16 -10,-16 -5,-38 -26,-44 -4,-10 1,-17 6,-26 -52,18 -60,31 -65,73 -8,56 -22,34 -61,63 -37,27 -29,57 -28,92 z" | |||||
id="path3026" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1" /></g></svg> |
@@ -1,62 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
viewBox="0 0 16 16" | |||||
enable-background="new 0 0 100 100" | |||||
xml:space="preserve" | |||||
id="svg11502" | |||||
sodipodi:docname="noun_305536_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata11508"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs11506" /><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="882" | |||||
id="namedview11504" | |||||
showgrid="false" | |||||
inkscape:zoom="5.3400704" | |||||
inkscape:cx="46.20989" | |||||
inkscape:cy="9.786758" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="18" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg11502" /><path | |||||
d="M 8.666667,4.04 V 3.333333 H 9.333333 V 2 H 6.666667 V 3.333333 H 7.333333 V 4.04 C 4.893333,4.373333 3,6.466667 3,9 c 0,2.76 2.24,5 5,5 2.76,0 5,-2.24 5,-5 C 13,6.466667 11.106667,4.373333 8.666667,4.04 Z M 8,12.666667 c -2.026667,0 -3.666667,-1.64 -3.666667,-3.666667 0,-2.026667 1.64,-3.666667 3.666667,-3.666667 2.026667,0 3.666667,1.64 3.666667,3.666667 0,2.026667 -1.64,3.666667 -3.666667,3.666667 z" | |||||
id="path11490" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><path | |||||
d="M 3.013333,4.08 3.96,5.013333 C 4.493333,4.466667 5.12,4.053333 5.826667,3.76 L 5.32,2.533333 c -0.866667,0.36 -1.653333,0.88 -2.306667,1.546667 z" | |||||
id="path11492" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><path | |||||
d="m 12.92,4.013333 c -0.653333,-0.64 -1.4,-1.133333 -2.24,-1.48 L 10.173333,3.76 c 0.68,0.28 1.293334,0.68 1.813334,1.2 z" | |||||
id="path11494" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13333334" /><rect | |||||
x="-12.687092" | |||||
y="-0.70676142" | |||||
transform="rotate(-135.00405)" | |||||
width="1.3334148" | |||||
height="2.8268394" | |||||
id="rect11496" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.13334148" /></svg> |
@@ -1,47 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
viewBox="0 0 16 16" | |||||
enable-background="new 0 0 512 512" | |||||
xml:space="preserve" | |||||
id="svg10862" | |||||
sodipodi:docname="noun_31859_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata10868"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs10866" /><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="882" | |||||
id="namedview10864" | |||||
showgrid="false" | |||||
inkscape:zoom="0.36875" | |||||
inkscape:cx="212.61017" | |||||
inkscape:cy="271.18644" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="18" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg10862" /><path | |||||
d="m 13.957459,7.579605 -1.650881,4.54537 H 3.2451096 l 1.7050678,-4.54757 c 0.1450069,-0.38599 0.6013088,-0.7024 1.0136657,-0.7024 h 7.4999549 c 0.412357,0 0.635012,0.31713 0.493661,0.7046 z m -11.2301744,3.79099 1.5212251,-4.05614 c 0.2534282,-0.67823 0.990955,-1.18944 1.7153334,-1.18944 h 6.5360939 c 0,-0.41456 -0.335459,-0.75 -0.749996,-0.75 H 6.4999727 L 5.7499772,3.875025 H 2.7499954 c -0.41456,0 -0.7499955,0.33546 -0.7499955,0.75 v 5.99996 c 0,0.4065 0.3237168,0.73242 0.7272847,0.74561 z" | |||||
id="path10856" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1;stroke-width:0.02343736" /></svg> |
@@ -1,56 +0,0 @@ | |||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<svg | |||||
xmlns:dc="http://purl.org/dc/elements/1.1/" | |||||
xmlns:cc="http://creativecommons.org/ns#" | |||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||||
xmlns:svg="http://www.w3.org/2000/svg" | |||||
xmlns="http://www.w3.org/2000/svg" | |||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||||
version="1.1" | |||||
x="0px" | |||||
y="0px" | |||||
viewBox="-7074.5 3413.5 16 16" | |||||
enable-background="new -7074.5 3413.5 24 24" | |||||
xml:space="preserve" | |||||
id="svg12" | |||||
sodipodi:docname="noun_468341_cc.svg" | |||||
width="16" | |||||
height="16" | |||||
inkscape:version="0.92.2 2405546, 2018-03-11"><metadata | |||||
id="metadata18"><rdf:RDF><cc:Work | |||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | |||||
id="defs16" /><sodipodi:namedview | |||||
pagecolor="#ffffff" | |||||
bordercolor="#666666" | |||||
borderopacity="1" | |||||
objecttolerance="10" | |||||
gridtolerance="10" | |||||
guidetolerance="10" | |||||
inkscape:pageopacity="0" | |||||
inkscape:pageshadow="2" | |||||
inkscape:window-width="1600" | |||||
inkscape:window-height="882" | |||||
id="namedview14" | |||||
showgrid="false" | |||||
inkscape:zoom="7.8666667" | |||||
inkscape:cx="-9.7372881" | |||||
inkscape:cy="15" | |||||
inkscape:window-x="0" | |||||
inkscape:window-y="18" | |||||
inkscape:window-maximized="0" | |||||
inkscape:current-layer="svg12" /><g | |||||
id="g6" | |||||
transform="matrix(0.49999833,0,0,0.49999833,-3535.2618,1708.7557)" | |||||
style="fill:#b4b4b4;fill-opacity:1"><path | |||||
d="m -7066.5,3420.5 c 0,-2 1.054,-4.287 4,-4.287 2.973,0 4,2.287 4,4.287 v 3 h 3 v -3.509 c 0,-3.491 -3.196,-6.478 -7,-6.491 -4.063,-0.018 -7.002,2.991 -7,7 -0.01,0.084 0,3 0,3 h 3 z" | |||||
id="path2" | |||||
inkscape:connector-curvature="0" | |||||
style="fill:#b4b4b4;fill-opacity:1" /><rect | |||||
x="-7071.5" | |||||
y="3424.5" | |||||
width="18" | |||||
height="13" | |||||
id="rect4" | |||||
style="fill:#b4b4b4;fill-opacity:1" /></g></svg> |
@@ -249,16 +249,16 @@ struct ModelBox : widget::OpaqueWidget { | |||||
std::string text; | std::string text; | ||||
text = model->plugin->brand; | text = model->plugin->brand; | ||||
text += " " + model->name; | text += " " + model->name; | ||||
if (model->description != "") | |||||
text += "\n" + model->description; | |||||
// Tags | // Tags | ||||
if (!model->tags.empty()) { | |||||
text += "\nTags: "; | |||||
for (size_t i = 0; i < model->tags.size(); i++) { | |||||
if (i > 0) | |||||
text += ", "; | |||||
text += model->tags[i]; | |||||
} | |||||
text += "\nTags: "; | |||||
for (size_t i = 0; i < model->tags.size(); i++) { | |||||
if (i > 0) | |||||
text += ", "; | |||||
text += model->tags[i]; | |||||
} | |||||
// Description | |||||
if (model->description != "") { | |||||
text += "\n" + model->description; | |||||
} | } | ||||
ui::Tooltip *tooltip = new ui::Tooltip; | ui::Tooltip *tooltip = new ui::Tooltip; | ||||
tooltip->text = text; | tooltip->text = text; | ||||
@@ -112,6 +112,7 @@ void init() { | |||||
templatePath = userDir + "/template.vcv"; | templatePath = userDir + "/template.vcv"; | ||||
} | } | ||||
else { | else { | ||||
logPath = userDir + "/log.txt"; | |||||
pluginsPath = userDir + "/plugins-v" + app::ABI_VERSION; | pluginsPath = userDir + "/plugins-v" + app::ABI_VERSION; | ||||
settingsPath = userDir + "/settings-v" + app::ABI_VERSION + ".json"; | settingsPath = userDir + "/settings-v" + app::ABI_VERSION + ".json"; | ||||
autosavePath = userDir + "/autosave-v" + app::ABI_VERSION + ".vcv"; | autosavePath = userDir + "/autosave-v" + app::ABI_VERSION + ".vcv"; | ||||
@@ -139,6 +140,7 @@ std::string plugin(plugin::Plugin *plugin, std::string filename) { | |||||
std::string systemDir; | std::string systemDir; | ||||
std::string userDir; | std::string userDir; | ||||
std::string logPath; | |||||
std::string pluginsPath; | std::string pluginsPath; | ||||
std::string settingsPath; | std::string settingsPath; | ||||
std::string autosavePath; | std::string autosavePath; | ||||
@@ -21,10 +21,9 @@ void init() { | |||||
return; | return; | ||||
} | } | ||||
std::string logFilename = asset::user("log.txt"); | |||||
outputFile = fopen(logFilename.c_str(), "w"); | |||||
outputFile = fopen(asset::logPath.c_str(), "w"); | |||||
if (!outputFile) { | if (!outputFile) { | ||||
fprintf(stderr, "Could not open log at %s\n", logFilename.c_str()); | |||||
fprintf(stderr, "Could not open log at %s\n", asset::logPath.c_str()); | |||||
} | } | ||||
} | } | ||||
@@ -22,7 +22,6 @@ | |||||
#include <thread> | #include <thread> | ||||
#include <unistd.h> // for getopt | #include <unistd.h> // for getopt | ||||
#include <signal.h> // for signal | #include <signal.h> // for signal | ||||
#if defined ARCH_WIN | #if defined ARCH_WIN | ||||
#include <windows.h> // for CreateMutex | #include <windows.h> // for CreateMutex | ||||
#endif | #endif | ||||
@@ -31,18 +30,19 @@ using namespace rack; | |||||
static void fatalSignalHandler(int sig) { | static void fatalSignalHandler(int sig) { | ||||
// Only catch one signal | |||||
static bool caught = false; | |||||
bool localCaught = caught; | |||||
caught = true; | |||||
if (localCaught) | |||||
exit(1); | |||||
// Ignore this signal to avoid recursion. | |||||
signal(sig, NULL); | |||||
// Ignore abort() since we call it below. | |||||
signal(SIGABRT, NULL); | |||||
FATAL("Fatal signal %d. Stack trace:\n%s", sig, system::getStackTrace().c_str()); | FATAL("Fatal signal %d. Stack trace:\n%s", sig, system::getStackTrace().c_str()); | ||||
// osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Rack has crashed. See log.txt for details."); | |||||
// This might fail because we might not be in the main thread. | |||||
// But oh well, we're crashing anyway. | |||||
std::string text = app::APP_NAME + " has crashed. See " + asset::logPath + " for details."; | |||||
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, text.c_str()); | |||||
exit(1); | |||||
abort(); | |||||
} | } | ||||
@@ -56,6 +56,9 @@ int main(int argc, char *argv[]) { | |||||
exit(1); | exit(1); | ||||
} | } | ||||
(void) instanceMutex; | (void) instanceMutex; | ||||
// Don't display "Assertion failed!" dialog message. | |||||
_set_error_mode(_OUT_TO_STDERR); | |||||
#endif | #endif | ||||
std::string patchPath; | std::string patchPath; | ||||
@@ -98,8 +101,6 @@ int main(int argc, char *argv[]) { | |||||
logger::init(); | logger::init(); | ||||
// We can now install a signal handler and log the output | // We can now install a signal handler and log the output | ||||
// Mac has its own decent crash handler | |||||
#if 0 | |||||
if (!settings::devMode) { | if (!settings::devMode) { | ||||
signal(SIGABRT, fatalSignalHandler); | signal(SIGABRT, fatalSignalHandler); | ||||
signal(SIGFPE, fatalSignalHandler); | signal(SIGFPE, fatalSignalHandler); | ||||
@@ -107,7 +108,6 @@ int main(int argc, char *argv[]) { | |||||
signal(SIGSEGV, fatalSignalHandler); | signal(SIGSEGV, fatalSignalHandler); | ||||
signal(SIGTERM, fatalSignalHandler); | signal(SIGTERM, fatalSignalHandler); | ||||
} | } | ||||
#endif | |||||
// Log environment | // Log environment | ||||
INFO("%s v%s", app::APP_NAME.c_str(), app::APP_VERSION.c_str()); | INFO("%s v%s", app::APP_NAME.c_str(), app::APP_VERSION.c_str()); | ||||
@@ -1,7 +1,6 @@ | |||||
#include <network.hpp> | #include <network.hpp> | ||||
#define CURL_STATICLIB | #define CURL_STATICLIB | ||||
#include <curl/curl.h> | #include <curl/curl.h> | ||||
#include <openssl/sha.h> | |||||
namespace rack { | namespace rack { | ||||
@@ -79,12 +78,11 @@ json_t *requestJson(Method method, std::string url, json_t *dataJ) { | |||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, reqStr); | curl_easy_setopt(curl, CURLOPT_POSTFIELDS, reqStr); | ||||
std::string resText; | std::string resText; | ||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); | |||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeStringCallback); | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeStringCallback); | ||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | ||||
// Perform request | // Perform request | ||||
// INFO("Requesting %s", url.c_str()); | |||||
// DEBUG("Requesting %s", url.c_str()); | |||||
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | ||||
CURLcode res = curl_easy_perform(curl); | CURLcode res = curl_easy_perform(curl); | ||||
@@ -132,7 +130,6 @@ bool requestDownload(std::string url, const std::string &filename, float *progre | |||||
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | ||||
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | ||||
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); | curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); | ||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); | |||||
// Fail on 4xx and 5xx HTTP codes | // Fail on 4xx and 5xx HTTP codes | ||||
curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); | curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); | ||||
@@ -157,37 +154,6 @@ std::string encodeUrl(const std::string &s) { | |||||
return ret; | return ret; | ||||
} | } | ||||
std::string computeSHA256File(const std::string &filename) { | |||||
FILE *f = fopen(filename.c_str(), "rb"); | |||||
if (!f) | |||||
return ""; | |||||
uint8_t hash[SHA256_DIGEST_LENGTH]; | |||||
SHA256_CTX sha256; | |||||
SHA256_Init(&sha256); | |||||
const int bufferLen = 1 << 15; | |||||
uint8_t *buffer = new uint8_t[bufferLen]; | |||||
int len = 0; | |||||
while ((len = fread(buffer, 1, bufferLen, f))) { | |||||
SHA256_Update(&sha256, buffer, len); | |||||
} | |||||
SHA256_Final(hash, &sha256); | |||||
delete[] buffer; | |||||
fclose(f); | |||||
// Convert binary hash to hex | |||||
char hashHex[64]; | |||||
const char hexTable[] = "0123456789abcdef"; | |||||
for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { | |||||
uint8_t h = hash[i]; | |||||
hashHex[2*i + 0] = hexTable[h >> 4]; | |||||
hashHex[2*i + 1] = hexTable[h & 0x0f]; | |||||
} | |||||
std::string str(hashHex, sizeof(hashHex)); | |||||
return str; | |||||
} | |||||
std::string urlPath(const std::string &url) { | std::string urlPath(const std::string &url) { | ||||
CURLU *curl = curl_url(); | CURLU *curl = curl_url(); | ||||
DEFER({ | DEFER({ | ||||
@@ -138,8 +138,9 @@ void PatchManager::saveAsDialog() { | |||||
std::free(pathC); | std::free(pathC); | ||||
}); | }); | ||||
// Append .vcv extension if no extension was given. | |||||
std::string pathStr = pathC; | std::string pathStr = pathC; | ||||
if (string::filenameExtension(pathStr).empty()) { | |||||
if (string::filenameExtension(string::filename(pathStr)) == "") { | |||||
pathStr += ".vcv"; | pathStr += ".vcv"; | ||||
} | } | ||||
@@ -247,7 +247,7 @@ static void extractPackages(std::string path) { | |||||
std::string message; | std::string message; | ||||
for (std::string packagePath : system::getEntries(path)) { | for (std::string packagePath : system::getEntries(path)) { | ||||
if (string::filenameExtension(packagePath) != "zip") | |||||
if (string::filenameExtension(string::filename(packagePath)) != "zip") | |||||
continue; | continue; | ||||
INFO("Extracting package %s", packagePath.c_str()); | INFO("Extracting package %s", packagePath.c_str()); | ||||
// Extract package | // Extract package | ||||
@@ -2,8 +2,10 @@ | |||||
#include <string.hpp> | #include <string.hpp> | ||||
#include <thread> | #include <thread> | ||||
#include <regex> | |||||
#include <dirent.h> | #include <dirent.h> | ||||
#include <sys/stat.h> | #include <sys/stat.h> | ||||
#include <cxxabi.h> // for __cxxabiv1::__cxa_demangle | |||||
#if defined ARCH_LIN || defined ARCH_MAC | #if defined ARCH_LIN || defined ARCH_MAC | ||||
#include <pthread.h> | #include <pthread.h> | ||||
@@ -166,10 +168,36 @@ std::string getStackTrace() { | |||||
stackLen = backtrace(stack, stackLen); | stackLen = backtrace(stack, stackLen); | ||||
char **strings = backtrace_symbols(stack, stackLen); | char **strings = backtrace_symbols(stack, stackLen); | ||||
// Skip the first line because it's this function. | |||||
for (int i = 1; i < stackLen; i++) { | for (int i = 1; i < stackLen; i++) { | ||||
s += string::f("%d: %s\n", stackLen - i - 1, strings[i]); | |||||
s += string::f("%d: ", stackLen - i - 1); | |||||
std::string line = strings[i]; | |||||
#if 0 | |||||
// Parse line | |||||
std::regex r(R"((.*)\((.*)\+(.*)\) (.*))"); | |||||
std::smatch match; | |||||
if (std::regex_search(line, match, r)) { | |||||
s += match[1].str(); | |||||
s += "("; | |||||
std::string symbol = match[2].str(); | |||||
// Demangle symbol | |||||
char *symbolD = __cxxabiv1::__cxa_demangle(symbol.c_str(), NULL, NULL, NULL); | |||||
if (symbolD) { | |||||
symbol = symbolD; | |||||
free(symbolD); | |||||
} | |||||
s += symbol; | |||||
s += "+"; | |||||
s += match[3].str(); | |||||
s += ")"; | |||||
} | |||||
#else | |||||
s += line; | |||||
#endif | |||||
s += "\n"; | |||||
} | } | ||||
free(strings); | free(strings); | ||||
#elif defined ARCH_WIN | #elif defined ARCH_WIN | ||||
HANDLE process = GetCurrentProcess(); | HANDLE process = GetCurrentProcess(); | ||||
SymInitialize(process, NULL, true); | SymInitialize(process, NULL, true); | ||||