fix: pass config+config_path to WebServerDeps so audio profile persists to disk; add boot-time period/rate override loading from config.yaml
@@ -0,0 +1,175 @@
|
||||
# API ↔ Frontend Gap Analysis — Pi Multi-FX Pedal Web UI
|
||||
|
||||
**Date:** June 14, 2026
|
||||
**Scope:** All backend API routes vs. calls from Legacy Jinja2 UI + React SPA
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Metric | Count |
|
||||
|--------|-------|
|
||||
| Total backend API routes | **76** |
|
||||
| Routes called by at least one frontend | **57** |
|
||||
| Routes with NO frontend consumer | **10** (+ 2 alias endpoints) |
|
||||
| Critical bugs found | **2** |
|
||||
| Missing features (backend exists, no UI) | **5** |
|
||||
|
||||
---
|
||||
|
||||
## Changes Applied — Fixed Items
|
||||
|
||||
| # | Item | Status | Files Changed |
|
||||
|---|------|--------|--------------|
|
||||
| B1 | IR Install on IRs page broken — `installToneIR` added to irs.js | ✅ Fixed | `irs.js`, `models.js` |
|
||||
| G6 | Tuner pitch display — note + cents bar + string indicator on dashboard | ✅ Added | `app.js`, `dashboard.html`, `style.css` |
|
||||
| G1–G3 | Audio profile selector — dropdown with JACK status in Settings > Audio | ✅ Added | `app.js`, `settings.html`, `style.css` |
|
||||
| G4 | FX chain clickable toggles — each block toggles ON/OFF via `PATCH /api/blocks` | ✅ Added | `app.js`, `style.css` |
|
||||
| O1 | FX type labels — proper label map (FX_TYPE_LABELS) instead of `replace(/_/g,' ')` | ✅ Added | `app.js` |
|
||||
| B2 | `installToneIR` removed from models.js (was duplicated, used wrong localStorage key) | ✅ Fixed | `models.js` |
|
||||
|
||||
---
|
||||
|
||||
## 1. Backend APIs NOT Called by Any Frontend
|
||||
|
||||
These are routes defined in `server.py` that neither the legacy UI (`static/`) nor the React SPA (`ui-dist/`) ever calls.
|
||||
|
||||
### Tier 1 — Full Features Without UI
|
||||
|
||||
| # | Route | Method | Endpoint exists but | Why it matters |
|
||||
|---|-------|--------|--------------------|---------------|
|
||||
| G1 | `/api/audio/profile` | GET | No UI to read current audio profile | Users can't see what latency profile is active |
|
||||
| G2 | `/api/audio/profiles` | GET | No UI to list available profiles | Users can't see what options exist |
|
||||
| G3 | `/api/audio/profile` | POST | No UI to switch profiles | Users can't switch between standard/low latency! |
|
||||
| G4 | `PATCH /api/blocks` | PATCH | No UI to enable/disable individual FX blocks | FX chain shown on dashboard is display-only — can't toggle blocks on/off |
|
||||
| G5 | `PATCH /api/block` | PATCH | No UI to update individual block params | Can't tweak per-block settings (drive, level, mix, etc.) |
|
||||
| G6 | `GET /api/tuner/pitch` | GET | No tuner pitch display UI | Tuner toggle works but you can't *see* what note you're playing |
|
||||
|
||||
### Tier 2 — Secondary / Alternative Endpoints
|
||||
|
||||
| # | Route | Method | Notes |
|
||||
|---|-------|--------|-------|
|
||||
| G7 | `GET /api/routing` | GET | Both UIs only POST routing changes and rely on WS for state — GET is defined but never read separately |
|
||||
| G8 | `GET /api/channel-mode` | GET | SPA POSTs to set channel mode but never GETs current mode — relies on `/api/state` snapshot |
|
||||
| G9 | `POST /api/bypass/toggle` | POST | Alias — both UIs call `/api/bypass` directly |
|
||||
|
||||
### Tier 3 — External Content Sources (No UI)
|
||||
|
||||
| # | Route | Method | Notes |
|
||||
|---|-------|--------|-------|
|
||||
| G10 | `GET /api/tonedownload/status` | GET | Tone3000 connection status — never queried by UI |
|
||||
| G11 | `GET /api/tonehub/search` | GET | ToneHub search — never called (Tone3000 preferred) |
|
||||
| G12 | `GET /api/tonehub/search/irs` | GET | ToneHub IR search — never called |
|
||||
|
||||
### Tier 4 — Unused Alias
|
||||
|
||||
| # | Route | Method | Notes |
|
||||
|---|-------|--------|-------|
|
||||
| G13 | `POST /api/volume` | POST | POST alias for volume — legacy UI calls `apiPut('/volume')`, SPA... see below |
|
||||
|
||||
---
|
||||
|
||||
## 2. Critical Bugs Found
|
||||
|
||||
### Bug B1 — IR Install on IRs Page is Broken
|
||||
|
||||
**File:** `src/web/static/irs.js:197` calls `installToneIR()` but function only exists in `models.js:235`
|
||||
|
||||
**Root cause:** The Tone3000 IR search results on the `/irs` page render "Install" buttons that call `installToneIR()`. This function is defined in `models.js`, which is loaded on the **Models page** (`/models`). The **IRs page** (`/irs`) loads `irs.js`, which does NOT define `installToneIR()` — the function appears in `irs.js` only as a call reference (line 197), not a definition.
|
||||
|
||||
**Impact:** Clicking "Install" on any Tone3000 IR result from the IRs page throws `ReferenceError: installToneIR is not defined`. The button action silently fails.
|
||||
|
||||
**Fix:** Either (a) copy the entire `installToneIR()` function (lines 235-256) from `models.js` into `irs.js`, or (b) extract the shared Tone3000 install logic into a shared module loaded by both pages.
|
||||
|
||||
```bash
|
||||
# Confirm the gap
|
||||
grep -n 'function installToneIR' src/web/static/*.js
|
||||
# → only in models.js:235, NOT in irs.js
|
||||
grep -n 'installToneIR' src/web/static/irs.js
|
||||
# → line 197 is a CALL to it (onclick=...), not a definition
|
||||
```
|
||||
|
||||
### Bug B2 — `installToneIR` Duplicated Across Files
|
||||
|
||||
**File:** Models page (`/models`) also has IR install logic.
|
||||
|
||||
`installToneIR` is defined in `models.js:235` (not just `installToneModel`). This means the Models page can install IR files via the Tone3000 button embedded in model search results — which makes no sense. The function is cargo-culted but only the `installToneModel` variant is relevant to the Models page.
|
||||
|
||||
---
|
||||
|
||||
## 3. Underserved Features (Present in Backend, Weak UI)
|
||||
|
||||
| # | Feature | Has UI? | Details |
|
||||
|---|---------|---------|---------|
|
||||
| F1 | **Tuner pitch display** | ❌ | `GET /api/tuner/pitch` returns frequency, note name, cents, string — but zero UI renders it. The tuner toggle exists but you get no visual feedback about what note you're playing |
|
||||
| F2 | **Per-block FX control** | ❌ | `PATCH /api/blocks` (toggle) and `PATCH /api/block` (params) are never called. The dashboard shows an FX chain but it's display-only — can't toggle blocks or tweak knobs from the web UI |
|
||||
| F3 | **Audio profile switching** | ❌ | `GET/POST /api/audio/profile` and `GET /api/audio/profiles` exist but no UI anywhere. Users must use curl to switch latency profiles |
|
||||
| F4 | **Channel mode display** | ⚠️ | SPA shows channel mode in the header (STEREO badge or GUITAR/BASS toggle). But `GET /api/channel-mode` is never called — the value comes from the `/api/state` snapshot. Legacy UI has no channel mode awareness at all |
|
||||
| F5 | **Snapshots** | ⚠️ | Snapshots exist in SPA only (save/recall/rename/delete via modal). Legacy UI has zero snapshot support |
|
||||
|
||||
---
|
||||
|
||||
## 4. Feature Parity: Legacy UI vs React SPA
|
||||
|
||||
| Feature | Legacy (`static/`) | React SPA (`ui-dist/`) |
|
||||
|---------|-------------------|----------------------|
|
||||
| Dashboard + status | ✅ Full | ✅ Full |
|
||||
| Preset browse + activate | ✅ Full | ✅ Full |
|
||||
| Preset edit (rename, volume) | ✅ Modal-based | ✅ Inline |
|
||||
| Preset create | ❌ | ✅ "New Preset" button |
|
||||
| Preset delete | ✅ With confirm | ✅ With confirm (inline) |
|
||||
| Model browse + load | ✅ Full | ✅ Full |
|
||||
| Model upload | ✅ | ✅ |
|
||||
| Tone3000 search (models) | ✅ | ✅ |
|
||||
| Tone3000 install (models) | ✅ | ✅ |
|
||||
| IR browse + load | ✅ Full | ✅ Full |
|
||||
| IR upload | ✅ | ✅ |
|
||||
| Tone3000 search (IRs) | ✅ | ❌ Broken (Bug B1) |
|
||||
| Tone3000 install (IRs) | ❌ Broken (Bug B1) | ✅ |
|
||||
| Bypass toggle | ✅ | ✅ |
|
||||
| Volume control | ✅ | ✅ |
|
||||
| Tuner toggle | ✅ | ✅ |
|
||||
| **Tuner pitch display** | **❌** | **❌** |
|
||||
| 4CM routing toggle | ✅ | ✅ |
|
||||
| **Per-block FX toggle** | **❌** | **❌** |
|
||||
| **Per-block param edit** | **❌** | **⚠️** (block-params schema fetched) |
|
||||
| **Audio profile switch** | **❌** | **❌** |
|
||||
| WiFi scan + connect | ✅ | ✅ |
|
||||
| Hotspot enable/disable | ✅ | ✅ |
|
||||
| Bluetooth scan + pair + connect | ✅ | ✅ |
|
||||
| Bluetooth MIDI enable/disable | ✅ | ✅ |
|
||||
| Snapshots save/recall | ❌ | ✅ Full (CRUD) |
|
||||
| Capture/record audio | ❌ | ✅ Full (start/stop/list/play) |
|
||||
| Channel mode (dual-mono/stereo) | ❌ | ✅ (Settings → Routing) |
|
||||
|
||||
---
|
||||
|
||||
## 5. Source of Truth Verification
|
||||
|
||||
```bash
|
||||
# Complete list of backend API routes:
|
||||
grep -oP '@app\.\w+\(["'"'"']/api/[^"'"'"']+' src/web/server.py | sed "s/@app\.//" | sort
|
||||
|
||||
# Complete list of API calls from legacy JS:
|
||||
grep -roP "apiGet\('/[^']+|apiPost\('/[^']+|apiPut\('/[^']+|apiDelete\('/[^']+|fetch\('/api[^']+" src/web/static/ | sed "s/.*api\(Get\|Post\|Put\|Delete\)('//;s/fetch('/\/api/" | sort -u
|
||||
|
||||
# Complete list of API calls from React SPA bundle:
|
||||
grep -oP '`/api/[^`]+`' src/web/ui-dist/assets/index-CxlwZhqE.js | sort -u
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Remaining Gaps (Not Addressed)
|
||||
|
||||
These are lower-priority items that still have no frontend consumer:
|
||||
|
||||
| # | Route | Method | Notes |
|
||||
|---|-------|--------|-------|
|
||||
| G7 | `GET /api/routing` | GET | Both UIs only POST routing and rely on WS for state — GET exists but is redundant |
|
||||
| G8 | `GET /api/channel-mode` | GET | SPA POSTs to set mode but gets current state from `/api/state` snapshot — low value |
|
||||
| G9 | `POST /api/bypass/toggle` | POST | Alias endpoint — both UIs call `/api/bypass` directly |
|
||||
| G10 | `GET /api/tonedownload/status` | GET | Tone3000 connection status — no UI indicator, minor |
|
||||
| G11 | `GET /api/tonehub/search` | GET | ToneHub — never wired up in favor of Tone3000 |
|
||||
| G12 | `GET /api/tonehub/search/irs` | GET | ToneHub IR search — never wired up |
|
||||
| G13 | `POST /api/volume` | POST | POST alias — legacy calls PUT, SPA calls POST; both work |
|
||||
| G14 | Per-block param editing (`PATCH /api/block`, `GET /api/block-params/{fx_type}`) | PATCH/GET | Block param sliders still need a UI — tracked in UX review test plan |
|
||||
@@ -0,0 +1,441 @@
|
||||
# UX Review Test Plan — Pi Multi-FX Pedal Web UI
|
||||
|
||||
**Date:** June 14, 2026
|
||||
**Scope:** Full web UI — React SPA + legacy Jinja2 pages
|
||||
**Target URL:** http://pedal.local:8080
|
||||
**Methodology:** Nielsen's 10 Usability Heuristics + Flow Analysis + Visual Cohesion Audit
|
||||
|
||||
---
|
||||
|
||||
## 1. Scope & Personas
|
||||
|
||||
### Personas
|
||||
|
||||
| Persona | Goal | Context |
|
||||
|---------|------|---------|
|
||||
| **Session Guitarist** | Dial in a tone fast during a live session or recording | On a phone/tablet near the amp, tweaking EQs and effects between takes. Wants minimal taps to hear results. |
|
||||
| **Preset Tweaker** | Browse, load, save, and edit presets from a laptop | Sitting at a desk building a pedalboard. Wants deep control over FX chain, NAM models, IR cab sims. |
|
||||
| **Headless Stage User** | Switch presets, toggle bypass, check tuner — with footswitches only | Never touches the web UI during performance. Uses it *only* for setup/config behind the scenes. |
|
||||
| **Admin / Integrator** | Configure WiFi, Bluetooth MIDI, audio profiles, hotspot | Technical user connecting the pedal to different environments (studio, stage, rehearsal space). |
|
||||
|
||||
### Flows to Test
|
||||
|
||||
| # | Flow | Steps | Priority |
|
||||
|---|------|-------|----------|
|
||||
| F1 | **Load pedal dashboard → check status** | 2 | Critical |
|
||||
| F2 | **Browse preset banks → load a preset** | 4 | Critical |
|
||||
| F3 | **Edit preset parameters (name, volume, FX chain)** | 5 | High |
|
||||
| F4 | **Toggle bypass and adjust master volume** | 3 | Critical |
|
||||
| F5 | **Browse and install a NAM model from Tone3000** | 6 | High |
|
||||
| F6 | **Upload and load an IR cab sim file** | 4 | High |
|
||||
| F7 | **Switch audio latency profile** | 3 | Medium |
|
||||
| F8 | **Configure and enable WiFi hotspot** | 5 | Low |
|
||||
| F9 | **Scan for, connect to WiFi network** | 4 | Low |
|
||||
| F10 | **Bluetooth scan, pair, and view MIDI status** | 5 | Low |
|
||||
| F11 | **Toggle 4CM routing mode and set breakpoint** | 3 | Medium |
|
||||
| F12 | **Check tuner display with guitar input** | 2 | Medium |
|
||||
| F13 | **Save/recall snapshot slots** | 4 | Medium |
|
||||
| F14 | **Empty state: unload model, view dashboard with no presets** | 2 | High |
|
||||
|
||||
### UI Surfaces Reviewed
|
||||
|
||||
- [ ] React SPA (`/` — root URL)
|
||||
- [ ] Legacy Dashboard (`/` — fallback without React build)
|
||||
- [ ] Presets page (`/presets`)
|
||||
- [ ] Models page (`/models`)
|
||||
- [ ] IRs page (`/irs`)
|
||||
- [ ] Settings > Connection tab
|
||||
- [ ] Settings > Audio tab
|
||||
- [ ] Settings > 4CM Routing tab
|
||||
- [ ] Settings > Network tab (WiFi scan, hotspot)
|
||||
- [ ] Settings > Bluetooth tab
|
||||
- [ ] Settings > About tab
|
||||
- [ ] Preset Edit modal
|
||||
- [ ] WiFi Connect modal
|
||||
- [ ] Connection status indicator (global header)
|
||||
|
||||
---
|
||||
|
||||
## 2. Heuristic Walkthrough
|
||||
|
||||
### H1 — Visibility of System Status
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H1.1 | Page load indicator | Navigate to `/` | Loading placeholder or skeleton while API/WS connects | Browser |
|
||||
| H1.2 | Connection status | Open page when pedal is off | "Disconnected" badge (red) in header | Browser |
|
||||
| H1.3 | Connection status | Open page when pedal is on | "Connected" badge (green) in header | Browser |
|
||||
| H1.4 | Preset activation feedback | Click a preset card | Card highlights, dashboard preset name updates, WS broadcast visible | Browser |
|
||||
| H1.5 | Volume slider feedback | Drag volume slider | Value % text updates in real time | Browser |
|
||||
| H1.6 | Bypass toggle feedback | Click bypass button | Button text toggles BYPASSED/ACTIVE, color changes | Browser |
|
||||
| H1.7 | Tuner toggle feedback | Click tuner button | Button toggles ON/OFF, color changes | Browser |
|
||||
| H1.8 | WebSocket reconnection | Kill server, wait, restart | "Disconnected" → "Connected" after auto-reconnect | Browser |
|
||||
| H1.9 | Model load progress | Click Load on a NAM model | Loading state on the button, list refreshes after | Browser |
|
||||
| H1.10 | Tone3000 search feedback | Search Tone3000 for models | "Searching..." spinner shown, results appear, offline warning shown if 503 | Browser |
|
||||
| H1.11 | Tone3000 install feedback | Install a model from Tone3000 | Button shows "Downloading...", then "✓ Done", list refreshes | Browser |
|
||||
| H1.12 | File upload feedback | Upload a .nam or .wav file | Input clears, list refreshes with new entry | Browser |
|
||||
| H1.13 | Audio profile switch | Switch to low latency profile | "restarted: true" in response, brief JACK restart pause | API + Browser |
|
||||
| H1.14 | RSSI/connection data in settings | Open Network tab | WiFi SSID, IP, signal % shown, visible from refresh | Browser |
|
||||
| H1.15 | BT status indicators | Open Bluetooth tab | Power, discoverable, adapter name visible | Browser |
|
||||
| H1.16 | WS client count | Open Settings → Connection | Connected clients count shows active WS sessions | Browser |
|
||||
|
||||
**Grep for verification:**
|
||||
```bash
|
||||
# Loading states in source
|
||||
grep -n "loading\|spinner\|skeleton\|Loading" src/web/static/*.js src/web/static/style.css
|
||||
|
||||
# Connection status toggle
|
||||
grep -n "connection-status\|Connected\|Disconnected" src/web/static/*.js src/web/templates/base.html
|
||||
|
||||
# Button disabled states on async actions
|
||||
grep -n "\.disabled\|disabled =" src/web/static/*.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### H2 — Match Between System and Real World
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H2.1 | FX type labels in UI | View FX chain, preset edit modal | Labels use real-world names (e.g., "Noise Gate" not "noise_gate") | Source + Browser |
|
||||
| H2.2 | Model/IR list readability | View Models or IRs page | File names appear as human-readable labels | Browser |
|
||||
| H2.3 | 4CM routing description | Enable 4CM in Settings | Plain language: "Input 1 (Guitar) → Pre blocks → Send \| Input 2 (Return) → Post blocks → Output" | Browser |
|
||||
| H2.4 | Tuner note display | Enable tuner with guitar plugged in | Shows musical note names (A, A#, Bb...) not frequencies only | Browser |
|
||||
| H2.5 | Preset meta labels | View preset card | Shows "Bank 0 · Program 2" — accessible musician language | Browser |
|
||||
| H2.6 | Audio profile names | View profiles list | "Standard", "Low" — musician-friendly not technical | Browser |
|
||||
| H2.7 | NAM architecture info | View model details | Shows "featherwave-v2" or architecture name, not internal paths | Browser |
|
||||
|
||||
**Grep for verification:**
|
||||
```bash
|
||||
# Check for snake_case / internal names leaking into UI
|
||||
grep -n "fx_type\|replace.*_/g\|FXType" src/web/static/presets.js | head -20
|
||||
# presets.js line 92: const label = block.fx_type.replace(/_/g, ' '); — detects raw fx_type
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### H3 — User Control and Freedom
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H3.1 | Modal close options | Open preset edit modal | Close on ✕ button, close on overlay click, close on Cancel button | Browser |
|
||||
| H3.2 | Modal close on Escape | Open modal, press Escape | Modal closes | Browser |
|
||||
| H3.3 | Delete preset confirmation | Click Delete in preset modal | `confirm()` dialog appears before deletion | Browser |
|
||||
| H3.4 | Cancel WiFi connect | Open WiFi modal, click Cancel | Modal closes, no connection attempted | Browser |
|
||||
| H3.5 | Back navigation | Navigate to any page, press Back | Browser back works, returns to previous page | Browser |
|
||||
| H3.6 | Tab navigation persists | Switch to Network tab, navigate away and back | Active tab remembered via URL hash | Browser |
|
||||
| H3.7 | Tuner toggle graceful | Toggle tuner ON while playing | Audio mutes or tuner activates without loud pop/clip | Browser + Audio |
|
||||
| H3.8 | Bypass toggle graceful | Toggle bypass ON while playing | Clean DI signal, no pop/clip | Browser + Audio |
|
||||
| H3.9 | Unload model without issues | Click Unload on loaded model | Model unloads, dashboard shows "None loaded", audio still flows | Browser |
|
||||
|
||||
---
|
||||
|
||||
### H4 — Consistency and Standards
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H4.1 | Navigation active state | Click each nav link | Active link highlighted, consistent style across all pages | Browser |
|
||||
| H4.2 | Button style consistency | Compare primary/secondary/danger across pages | Same styles everywhere (colors, padding, font size) | Browser |
|
||||
| H4.3 | Toggle button pattern | Compare bypass, tuner, 4CM toggles | Same ON/OFF pattern, same active/inactive colors | Browser |
|
||||
| H4.4 | Slider pattern | Compare volume sliders on Dashboard vs Settings | Same visual, same behavior, synced values | Browser |
|
||||
| H4.5 | Connection status in header | Navigate through all pages | Connection indicator always present, same position | Browser |
|
||||
| H4.6 | Page header pattern | Visit Presets, Models, IRs, Settings pages | Consistent page-header with h1, same spacing | Browser |
|
||||
| H4.7 | Card structure | Compare all card components | Uniform header/body/footer pattern — identical padding, border, radius | Browser |
|
||||
| H4.8 | Danger button meaning | Compare Delete preset, Unload model/IR | All red danger buttons are destructive actions | Browser |
|
||||
| H4.9 | Tab pattern (Settings) | Switch between all 6 settings tabs | Underline active indicator, same transition | Browser |
|
||||
|
||||
---
|
||||
|
||||
### H5 — Error Prevention
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H5.1 | Disabled submit during load | Click Load on model rapidly | Button disabled after first click, no duplicate load | Browser |
|
||||
| H5.2 | Disabled submit during upload | Upload a file, click multiple times | Button disabled during upload | Source |
|
||||
| H5.3 | Delete preset confirmation | Click Delete | Confirm dialog: "Delete this preset?" | Browser |
|
||||
| H5.4 | File type validation on upload | Try uploading a .txt file | Rejected at client or server level | Browser |
|
||||
| H5.5 | Audio profile double-switch | Switch to same profile twice | `restarted: false`, no unnecessary JACK restart | API |
|
||||
| H5.6 | 4CM breakpoint bounds | Drag breakpoint slider min/max | Clamped 0–16 | Browser |
|
||||
| H5.7 | Volume clamping | Set volume > 100% or < 0% via API | Clamped to 0.0–1.0 | API |
|
||||
| H5.8 | Empty preset name | Save preset with empty name | Should default to "Preset" or reject with validation | Browser |
|
||||
| H5.9 | Hotspot password length | Try password > 63 chars | Maxlength on input field prevents it | Browser |
|
||||
|
||||
**Code verification:**
|
||||
```bash
|
||||
grep -n "confirm\|showModal\|are you sure" src/web/static/*.js
|
||||
grep -n "\.disabled" src/web/static/models.js src/web/static/irs.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### H6 — Recognition Rather Than Recall
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H6.1 | Current preset name visible | Load any page | Preset name clearly shown in Dashboard or in header | Browser |
|
||||
| H6.2 | Currently loaded model/IR | View Models/IRs page | "CURRENT" badge visible on active model/IR | Browser |
|
||||
| H6.3 | Active preset card highlighted | Browse presets | The active preset card has a distinct border/background | Browser |
|
||||
| H6.4 | Bank/program location | View preset card | "Bank N · Slot N" visible without clicking | Browser |
|
||||
| H6.5 | Navigation labels visible | All pages | All 5 nav links visible, no hamburger hiding | Browser |
|
||||
| H6.6 | FX chain status on dashboard | Connected, preset loaded | Blocks visible with ON/OFF badges | Browser |
|
||||
| H6.7 | Modal title shows preset name | Click to edit preset | "Edit: [Preset Name]" — user knows what they're editing | Browser |
|
||||
| H6.8 | Routing mode visible from dashboard | Any page | Badge shows "Mono" or "4CM" | Browser |
|
||||
| H6.9 | Tone3000 installed state | Revisit after install | Previously installed models show ✓ Installed badge (localStorage) | Browser |
|
||||
|
||||
---
|
||||
|
||||
### H7 — Flexibility and Efficiency
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H7.1 | Keyboard submit on search | Type in Tone3000 search, press Enter | Triggers search | Browser |
|
||||
| H7.2 | FAQ: Keyboard shortcuts | Test Tab order through form fields | Logical focus order, all interactive elements reachable | Browser |
|
||||
| H7.3 | Bulk actions | Models/IRs pages | No bulk select/load/delete — note as missing efficiency | Browser |
|
||||
| H7.4 | Auto-refresh on preset save | Save preset edit | Modal closes, preset list auto-refreshes | Browser |
|
||||
| H7.5 | Auto-refresh after model/IR upload | Upload model/IR | List auto-refreshes after upload completes | Browser |
|
||||
| H7.6 | Trending option on Tone3000 | Click "Trending" | Fetches trending models/IRs without typing a query | Browser |
|
||||
| H7.7 | Tab navigation in Settings | URL hash (`#network`, `#bluetooth`) | Deep-linkable settings tabs | Browser |
|
||||
| H7.8 | WS-driven live updates | Change volume on another tab | Dashboard and Settings sliders sync in real time | Browser |
|
||||
|
||||
---
|
||||
|
||||
### H8 — Aesthetic and Minimalist Design
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H8.1 | Content-to-chrome ratio | View Dashboard | Essential info above the fold: preset, bypass, volume, FX chain | Browser |
|
||||
| H8.2 | Visual hierarchy | View any page | Most important element draws eye first (preset name, status) | Browser |
|
||||
| H8.3 | Information density | Dashboard page | Not overcrowded — cards with clear sections | Browser |
|
||||
| H8.4 | Typography consistency | Compare h1/h2 across pages | Same font sizes, weights, colors for each heading level | Browser |
|
||||
| H8.5 | Line length readability | Any card body | Text doesn't span full viewport — contained by max-width | Browser |
|
||||
| H8.6 | Dark theme cohesion | All pages | Consistent dark palette, no jarring color changes | Browser |
|
||||
| H8.7 | Redundant elements | Check for duplicate info | No data shown in multiple places unnecessarily | Browser |
|
||||
| H8.8 | Empty states visual | Unload model, clear presets | Helpful empty states, not just blank areas | Browser |
|
||||
| H8.9 | Modal sizing | Open preset edit modal | Appropriate width, doesn't overwhelm on mobile | Browser |
|
||||
|
||||
---
|
||||
|
||||
### H9 — Help Users Recognize, Diagnose, and Recover from Errors
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H9.1 | API error → user message | Trigger a 500 on preset load | User-facing error, not raw JSON or console-only | Browser |
|
||||
| H9.2 | Tone3000 offline state | Disconnect internet, search | "⚠ Offline — search unavailable" warning shown | Browser |
|
||||
| H9.3 | Upload error handling | Upload corrupt .nam file | Alert with error message: "Upload error: ..." | Browser |
|
||||
| H9.4 | Model load failure | Try to load corrupt model | Alert: "Failed to load model: ..." | Browser |
|
||||
| H9.5 | Preset load failure | Access empty slot via direct URL | 404 — "Preset not found" | Browser |
|
||||
| H9.6 | WiFi connect error | Wrong password on WiFi modal | Error message shown in modal, modal stays open | Browser |
|
||||
| H9.7 | JACK restart failure | Kill JACK, switch profile | API returns 500 with "Failed to start JACK — rolled back" | API |
|
||||
| H9.8 | API error on Dashboard | Kill backend, load dashboard | Silent catch with console.warn — check for user-facing message | Browser |
|
||||
| H9.9 | Empty preset slot styling | Presets page, empty slot | Shows "— Empty —" with reduced opacity | Browser |
|
||||
|
||||
**Code verification:**
|
||||
```bash
|
||||
# Error handling patterns — check for user-facing messages vs silent console
|
||||
grep -n "\.catch\|catch(" src/web/static/*.js | grep -v "console.warn\|console.error"
|
||||
grep -n "alert(" src/web/static/*.js
|
||||
grep -n "text-muted\|network-error\|Error:" src/web/static/*.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### H10 — Help and Documentation
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| H10.1 | Tooltips on controls | Hover over any button | No tooltips currently — add recommendation | Browser |
|
||||
| H10.2 | Upload hints | Check upload sections | "Upload .nam model files to the pedal's model directory." — clear | Browser |
|
||||
| H10.3 | Tone3000 hints | Check Tone3000 section | "Search and download NAM models directly from the Tone3000 community." | Browser |
|
||||
| H10.4 | Empty state guidance | No models/presets/IRs | Actionable: "No .nam models found" + upload option visible | Browser |
|
||||
| H10.5 | About page | Navigate to About tab | Version, platform, repo link available | Browser |
|
||||
| H10.6 | Help within the app | Check for question marks, help links | None found — add recommendation for critical flows | Browser |
|
||||
| H10.7 | IR details context | View IR list | Shows "1024 taps · 21.3ms @ 48000Hz" — helpful technical detail | Browser |
|
||||
|
||||
---
|
||||
|
||||
## 3. Flow Friction Map
|
||||
|
||||
Each flow from Section 1 tested step-by-step. Score 1-5:
|
||||
|
||||
| Flow | Step | Friction | Issue Ref | Notes |
|
||||
|------|------|----------|-----------|-------|
|
||||
| **F1 — Load dashboard** | Navigate to `pedal.local:8080` | 1 | — | React SPA loads (or legacy fallback) |
|
||||
| **F1** | Check connection status | 1 | — | Color-coded badge in header |
|
||||
| **F1** | View current state | 1 | — | WS pushes state on connect |
|
||||
| **F2 — Browse presets** | Click Presets nav | 1 | — | |
|
||||
| **F2** | Wait for bank list | 2 | H1-like | Loading indicator present |
|
||||
| **F2** | Click preset card | 1 | — | |
|
||||
| **F2** | Preset loads, dashboard updates | 1 | — | WS pushes update |
|
||||
| **F3 — Edit preset** | Click preset card to open modal | 1 | — | |
|
||||
| **F3** | Change name | 1 | — | Text input clear |
|
||||
| **F3** | Adjust volume | 1 | — | Slider works |
|
||||
| **F3** | View FX chain in modal | 2 | H2, H6 | Labels use `replace(/_/g,' ')` — see notes |
|
||||
| **F3** | Click Save | 1 | — | Modal closes, list refreshes |
|
||||
| **F3** | Click Delete | 1 | — | Confirm dialog appears |
|
||||
| **F4 — Bypass & volume** | Click bypass button | 1 | — | Immediate toggle |
|
||||
| **F4** | Verify bypassed audio | 1 | — | Clean DI signal |
|
||||
| **F4** | Drag volume slider | 1 | — | Real-time update |
|
||||
| **F5 — Tone3000 browse** | Go to Models page | 1 | — | |
|
||||
| **F5** | Type search query | 1 | — | Enter triggers search |
|
||||
| **F5** | Wait for results | 3 | H1 | "Searching..." spinner, but no timeout info |
|
||||
| **F5** | Click Install on result | 2 | H1 | Button shows "Downloading..." |
|
||||
| **F5** | Verify model appears in list | 1 | — | Auto-refreshes |
|
||||
| **F6 — Upload IR** | Go to IRs page | 1 | — | |
|
||||
| **F6** | Click file input | 1 | — | |
|
||||
| **F6** | Select .wav file | 1 | — | File type restricted |
|
||||
| **F6** | Click Upload | 2 | H1 | No upload progress bar — just button state |
|
||||
| **F6** | Verify in list | 1 | — | Refreshes |
|
||||
| **F7 — Audio profile switch** | Go to Settings > Audio | 1 | — | |
|
||||
| **F7** | Profiles are visible | 2 | — | No explicit "switch profile" button in UI — needs API |
|
||||
| **F7** | Switch profile | 2 | H10 | No in-UI profile switcher visible in Audio tab |
|
||||
| **F8 — Hotspot config** | Go to Network tab | 1 | — | |
|
||||
| **F8** | Edit SSID/password | 1 | — | Input fields ready |
|
||||
| **F8** | Click Enable Hotspot | 2 | H1 | No "enabling..." state |
|
||||
| **F8** | Verify clients listed | 2 | H1 | Auto-polls or manual refresh? |
|
||||
| **F9 — WiFi scan** | Go to Network tab | 1 | — | |
|
||||
| **F9** | Click Scan | 2 | H1 | "Scanning..." button state, results appear |
|
||||
| **F9** | Click Connect on network | 1 | — | Modal opens |
|
||||
| **F9** | Enter password | 1 | — | |
|
||||
| **F9** | Click Connect | 2 | H1/H9 | Modal error if fails |
|
||||
| **F10 — BT scan** | Go to Bluetooth tab | 1 | — | |
|
||||
| **F10** | Scan for devices | 2 | H1 | "Scanning (12s)..." — shows expected duration |
|
||||
| **F10** | Pair with device | 2 | H1 | No pairing feedback beyond spinner |
|
||||
| **F11 — 4CM routing** | Go to Settings > 4CM Routing | 1 | — | |
|
||||
| **F11** | Toggle 4CM ON | 1 | — | Breakpoint row enables |
|
||||
| **F11** | Drag breakpoint | 1 | — | Description updates live |
|
||||
| **F12 — Tuner** | Toggle tuner ON | 1 | — | |
|
||||
| **F12** | Check note detection | 1 | — | Fast poll endpoint |
|
||||
| **F13 — Snapshots** | Go to snapshot section | 3 | — | No snapshot UI on dashboard — check React SPA |
|
||||
| **F13** | Save snapshot to slot | 2 | — | Via API or in-app? |
|
||||
| **F14 — Empty states** | Unload all models | 1 | H6 | "None loaded" shown clearly |
|
||||
| **F14** | Delete all presets | 1 | H9 | "No presets found. Create one from the Dashboard." |
|
||||
|
||||
---
|
||||
|
||||
## 4. Visual & Interaction Checklist
|
||||
|
||||
| Check | Pass? | Issues | Notes |
|
||||
|-------|-------|--------|-------|
|
||||
| Consistent spacing / grid | ✅ | — | Cards share `--radius`, `--border`, `padding: 10-14px` |
|
||||
| Typography hierarchy | ✅ | — | h1=1.1rem, h2=0.9-0.95rem, body=0.85rem — clear hierarchy |
|
||||
| Color consistency | ✅ | — | Single accent `#4fc3f7`, consistent danger/success |
|
||||
| Interactive states | ⚠️ | See below | Hover, active states defined; missing focus-visible styles |
|
||||
| Responsive layout | ✅ | — | 82% max-width mobile, 600px/720px breakpoints |
|
||||
| Loading states | ⚠️ | H1-series | Most pages have loading indicators; Tone3000 spinner lacks progress |
|
||||
| Empty states | ✅ | — | Clear messages: "No models found", "None loaded" |
|
||||
| Error states | ⚠️ | H9-series | API errors shown via alert(); silent catches on Dashboard WS |
|
||||
| Edge cases (long text, rapid click) | ⚠️ | H5, H8 | Long preset names handled with ellipsis; Button disabled states present |
|
||||
| Touch targets ≥ 48px | ⚠️ | — | `.btn` padding 8px 16px — may be borderline on mobile |
|
||||
| Dark theme readability | ✅ | — | High contrast: `#e0e0e0` on `#0d0d0d` background |
|
||||
| Smooth transitions | ✅ | — | `transition: background 0.2s, border-color 0.2s` on interactive elements |
|
||||
|
||||
---
|
||||
|
||||
## 5. Responsive & Mobile UX Checks
|
||||
|
||||
| # | Test | Viewport | Expected | Method |
|
||||
|---|------|----------|----------|--------|
|
||||
| R1 | Dashboard on mobile | 375px wide | Status row stacks (grid → 1 column), nav links compact | Browser |
|
||||
| R2 | Presets grid on mobile | 375px wide | 2-column grid intact, cards shrink appropriately | Browser |
|
||||
| R3 | Settings tabs on mobile | 375px wide | Horizontal scrollable tabs with hidden scrollbar | Browser |
|
||||
| R4 | Modal on mobile | 375px wide | Modal fills width with padding, scrollable body | Browser |
|
||||
| R5 | Touch targets on mobile | 375px, touch | Buttons have `touch-action: manipulation`, no 300ms delay | Source |
|
||||
| R6 | Nav overflow | Very long nav labels | `overflow-x: auto` with hidden scrollbar | Browser |
|
||||
| R7 | Header sticky on scroll | Scroll down on any page | Header stays at top (`position: sticky; z-index: 100`) | Browser |
|
||||
| R8 | Input fields on mobile | Focus any input | No viewport zoom (`user-scalable=no` set) — intentional? | Browser |
|
||||
| R9 | Content max-width on large screen | 1920px wide | `--max-width: 720px` — content centered, not stretched | Browser |
|
||||
|
||||
---
|
||||
|
||||
## 6. Real-Time & WebSocket UX
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| WS1 | Multiple tabs sync | Open 2 browser tabs, change volume on tab 1 | Tab 2 slider and value update within 1s | Browser |
|
||||
| WS2 | Bypass sync across tabs | Toggle bypass on tab 1 | Tab 2 button text and color update | Browser |
|
||||
| WS3 | Preset change broadcast | Activate preset via /presets page | Dashboard preset card updates on all connected clients | Browser |
|
||||
| WS4 | Reconnection UX | Unplug network cable, wait 10s, reconnect | "Disconnected" appears, then auto-reconnects showing "Connected" | Browser |
|
||||
| WS5 | WS reconnection backoff | Keep pedal disconnected for 1 min | Reconnect delay increases from 1s to max 15s | Browser |
|
||||
| WS6 | Concurrency: 3 tabs + API | Open 3 browser tabs + curl API calls | All clients receive broadcasts, no dropped messages | Multi-browser |
|
||||
| WS7 | Initial state on WS connect | Open fresh browser tab | Receives `{"type": "connected", "state": {...}}` with full current state | Browser |
|
||||
|
||||
---
|
||||
|
||||
## 7. Accessibility Quick Checks
|
||||
|
||||
| # | Test | Expected | Method |
|
||||
|---|------|----------|--------|
|
||||
| A1 | Tab navigation through nav links | All 5 nav links focused in order | Browser |
|
||||
| A2 | Tab navigation through preset grid | Each preset card focusable | Browser |
|
||||
| A3 | Tab navigation through modal | Input, slider, Save, Delete, Cancel in logical order | Browser |
|
||||
| A4 | Focus-visible styles on interactive | Visible focus ring on buttons, links, inputs | Browser |
|
||||
| A5 | Color contrast: text on bg | `#e0e0e0` on `#1a1a1a` — passes WCAG AA | Source |
|
||||
| A6 | Color contrast: accent on bg | `#4fc3f7` on `#222` — passes WCAG AA | Source |
|
||||
| A7 | Alt text on Tone3000 thumbnails | `alt=""` (decorative) — acceptable | Source |
|
||||
| A8 | ARIA labels on toggle buttons | No ARIA — buttons have text content (ON/OFF) so passable | Source |
|
||||
| A9 | Form labels associated with inputs | File inputs have no explicit `<label>` — just adjacent text | Source |
|
||||
|
||||
---
|
||||
|
||||
## 8. React SPA-Specific Tests (if mounted at root)
|
||||
|
||||
The React SPA at `src/web/ui-dist/` replaces the legacy dashboard at `/`.
|
||||
|
||||
| # | Test | Action | Expected | Method |
|
||||
|---|------|--------|----------|--------|
|
||||
| SPA1 | SPA loads at root | GET `/` | Returns React SPA `index.html` (not legacy dashboard) | Browser |
|
||||
| SPA2 | Fallback if no ui-dist | Delete ui-dist dir, restart | Falls back to legacy dashboard at `/` | Browser |
|
||||
| SPA3 | SPA navigation | Click through the SPA | Client-side routing, no full page reloads | Browser |
|
||||
| SPA4 | SPA ↔ legacy pages | Navigate from SPA root to `/presets` | Full page navigation to legacy page — smooth transition? | Browser |
|
||||
| SPA5 | Favicon loads | Check browser tab icon | SVG favicon at `/ui/favicon.svg` | Browser |
|
||||
| SPA6 | JS bundle errors | Open browser console on SPA | No console errors, no uncaught exceptions | Browser |
|
||||
|
||||
---
|
||||
|
||||
## 9. Key UX Observations from Source Code (Pre-Findings)
|
||||
|
||||
These are issues visible from code review alone. Confirm in browser during execution.
|
||||
|
||||
| # | Observation | Heuristic | Source |
|
||||
|---|-------------|-----------|--------|
|
||||
| O1 | FX type labels use `block.fx_type.replace(/_/g, ' ')` — simple replace, no proper label map. Some types may render with underscores if unmatched. | H2 | `presets.js:92` |
|
||||
| O2 | WS `preset_changed` handler updates name/meta but doesn't re-render FX chain on dashboard. Block bypass states may visually lag. | H1 | `app.js:62-69` |
|
||||
| O3 | `toggle4cm()` reads button state from DOM classList, not from server — race risk if another client or WS event flips state between read and POST. | H5 | `app.js:142-143` |
|
||||
| O4 | No keyboard shortcut support (Ctrl+S for save, / for search). | H7 | Whole codebase |
|
||||
| O5 | No undo for any action — delete is permanent after confirm. | H3 | `presets.js:132` |
|
||||
| O6 | Signal strength icons for WiFi use the same emoji for all levels (`📶` — same Unicode codepoint, different on each platform). | H8 | `network.js:83-88` |
|
||||
| O7 | SN: signal icon `📶` vs `📶` — same char repeated, 4 levels collapse to same visual. | H8 | `network.js:23-26` |
|
||||
| O8 | BT scan timeout (12s) displayed to user — good. No cancel option on scan. | H3 + H1 | `bluetooth.js:72` |
|
||||
| O9 | No feedback when JACK restarts during profile switch — audio dropout with no visual indicator. | H1 | `server.py:1402-1443` |
|
||||
| O10 | Volume slider on Dashboard and Settings page both update via REST per `oninput` — may cause excessive API calls during drag. | H7 | `app.js:227-230` |
|
||||
| O11 | Connection status `_handlers` check (`pedalWS._handlers ? '1' : '0'`) looks for handler registration, not actual WS count. | H1 | `app.js:261` |
|
||||
|
||||
---
|
||||
|
||||
## 10. Pre-Completion Checklist
|
||||
|
||||
Before marking a section complete, verify:
|
||||
|
||||
- [ ] Browser tested: each test executed and result recorded
|
||||
- [ ] JS console checked for errors after each interaction
|
||||
- [ ] WS messages confirmed where applicable (via browser console: `pedalWS._handlers`)
|
||||
- [ ] Responsive view tested for mobile flows (R1-R9)
|
||||
- [ ] Code findings (O1-O11) confirmed in live browser session
|
||||
- [ ] Screenshots captured for visual issues (use `browser_vision`)
|
||||
- [ ] Cross-device sync tested for at least one flow (WS1)
|
||||
|
||||
---
|
||||
|
||||
## 11. Test Annotation Legend
|
||||
|
||||
| Symbol | Meaning |
|
||||
|--------|---------|
|
||||
| ✅ | Passes — expected behavior confirmed |
|
||||
| ❌ | Fails — bug discovered (create Gitea issue) |
|
||||
| ⚠️ | Non-critical / minor friction (note in recommendations) |
|
||||
| ⏭️ | Skipped — explain why (e.g., "no pedal hardware connected") |
|
||||
| 🔄 | Needs retest after fix |
|
||||
|
||||
---
|
||||
|
||||
*Generated by Hermes Agent UX Review Skill — based on Nielsen's 10 Usability Heuristics and ux-review methodology.*
|
||||
@@ -22,7 +22,7 @@ from typing import Optional
|
||||
import yaml
|
||||
|
||||
# ── Subsystem imports ─────────────────────────────────────────────────────────
|
||||
from src.system.audio import AudioConfig, AudioSystem, JackAudioClient, _jack_is_running
|
||||
from src.system.audio import AudioConfig, AudioSystem, JackAudioClient, LATENCY_PROFILES, _jack_is_running
|
||||
from src.system.defaults import ensure_defaults_exist
|
||||
from src.dsp.pipeline import AudioPipeline
|
||||
from src.dsp.nam_engine_host import FastNAMHost
|
||||
@@ -69,6 +69,7 @@ class PedalApp:
|
||||
|
||||
def __init__(self, config_path: Path = DEFAULT_CONFIG_PATH) -> None:
|
||||
self._config = load_config(config_path)
|
||||
self._config_path = config_path
|
||||
|
||||
# ── Runtime state ──────────────────────────────────────────────
|
||||
self._running = False
|
||||
@@ -116,9 +117,26 @@ class PedalApp:
|
||||
# ── 1. Audio config + system ──────────────────────────
|
||||
acfg = self._config["audio"]
|
||||
audio_mode = acfg.get("mode", "mono")
|
||||
|
||||
# Support custom period/rate overrides saved by the API
|
||||
boot_profile = acfg.get("profile", "standard")
|
||||
custom_period = acfg.get("period")
|
||||
custom_rate = acfg.get("rate")
|
||||
if custom_period is not None or custom_rate is not None:
|
||||
if boot_profile in LATENCY_PROFILES:
|
||||
overridden = dict(LATENCY_PROFILES[boot_profile])
|
||||
else:
|
||||
overridden = dict(LATENCY_PROFILES.get("stable", LATENCY_PROFILES["standard"]))
|
||||
if custom_period is not None:
|
||||
overridden["period"] = custom_period
|
||||
if custom_rate is not None:
|
||||
overridden["rate"] = custom_rate
|
||||
LATENCY_PROFILES[f"{boot_profile}_boot"] = overridden
|
||||
boot_profile = f"{boot_profile}_boot"
|
||||
|
||||
self.audio_config = AudioConfig(
|
||||
hat_type=acfg.get("hat_type", "audioinjector"),
|
||||
profile=acfg.get("profile", "standard"),
|
||||
profile=boot_profile,
|
||||
mode=audio_mode,
|
||||
input_device=acfg.get("input_device", "hw:0,0"),
|
||||
output_device=acfg.get("output_device", "hw:0,0"),
|
||||
@@ -251,6 +269,8 @@ class PedalApp:
|
||||
ir_loader=self.ir_loader,
|
||||
audio_system=self.audio_system,
|
||||
jack_audio=self.jack_audio,
|
||||
config=self._config,
|
||||
config_path=self._config_path,
|
||||
),
|
||||
host="0.0.0.0",
|
||||
port=8080,
|
||||
|
||||
@@ -184,7 +184,7 @@ User=pi
|
||||
ExecStart=/usr/bin/jackd -P70 -p128 -n2 -r48000 -dalsa -dhw:0 -i2 -o2
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
LimitRTPRIO=95
|
||||
LimitRTPRIO=99
|
||||
LimitMEMLOCK=infinity
|
||||
|
||||
[Install]
|
||||
|
||||
@@ -301,6 +301,10 @@ class AudioPipeline:
|
||||
self._master_volume: float = 0.8
|
||||
self._tuner_enabled: bool = False
|
||||
self._bypassed: bool = False # Global bypass
|
||||
self._last_bypassed: bool = False # Track bypass transitions for clickless toggle
|
||||
self._bypass_xfade_pos: int = 0 # Crossfade position (samples)
|
||||
self._bypass_xfade_len: int = 128 # Crossfade length (samples)
|
||||
self._bypass_xfade_buf: Optional[np.ndarray] = None # Last processed buffer
|
||||
|
||||
# 4-Cable Method routing
|
||||
self._routing_mode: str = "mono" # "mono" or "4cm"
|
||||
@@ -402,12 +406,32 @@ class AudioPipeline:
|
||||
return np.zeros_like(audio_in)
|
||||
|
||||
if self._bypassed:
|
||||
return audio_in * self._master_volume
|
||||
out = audio_in * self._master_volume
|
||||
# Detect bypass OFF→ON transition — start crossfade
|
||||
if not self._last_bypassed:
|
||||
self._bypass_xfade_pos = 0
|
||||
self._last_bypassed = True
|
||||
# Apply crossfade if active (blend from last processed buffer)
|
||||
if self._bypass_xfade_buf is not None and self._bypass_xfade_pos < self._bypass_xfade_len:
|
||||
buf_out = out.copy()
|
||||
self._apply_bypass_crossfade(buf_out)
|
||||
return buf_out
|
||||
return out
|
||||
|
||||
# Bypass was active last frame — going back to processed
|
||||
if self._last_bypassed:
|
||||
self._bypass_xfade_pos = 0
|
||||
# Capture the current output start for crossfade
|
||||
self._bypass_xfade_buf = (audio_in * self._master_volume).copy()
|
||||
self._last_bypassed = False
|
||||
|
||||
if self._routing_mode == "4cm":
|
||||
return self._process_4cm(audio_in)
|
||||
out = self._process_4cm(audio_in)
|
||||
else:
|
||||
return self._process_mono(audio_in)
|
||||
out = self._process_mono(audio_in)
|
||||
# Save processed buffer for crossfade on next bypass toggle
|
||||
self._bypass_xfade_buf = out.copy()
|
||||
return out
|
||||
|
||||
# ── Pitch detection for tuner ──────────────────────────────────────────────
|
||||
|
||||
@@ -2980,6 +3004,36 @@ class AudioPipeline:
|
||||
|
||||
return (buf * (1.0 - mix) + wet * mix).astype(np.float32)
|
||||
|
||||
# ── Bypass crossfade ────────────────────────────────────────────────
|
||||
|
||||
def _apply_bypass_crossfade(self, buf: np.ndarray) -> None:
|
||||
"""Apply pop-suppression crossfade when bypass state changes.
|
||||
|
||||
Blends from the last processed buffer into the current bypassed
|
||||
output using a cosine-squared fade. Operates in-place on *buf*.
|
||||
"""
|
||||
if self._bypass_xfade_buf is None:
|
||||
return
|
||||
remain = min(self._bypass_xfade_len - self._bypass_xfade_pos, len(buf))
|
||||
if remain <= 0:
|
||||
return
|
||||
# Cosine fade: old signal out, new signal in
|
||||
fade_out = np.cos(np.linspace(0, np.pi / 2, remain)) ** 2
|
||||
fade_in = 1.0 - fade_out
|
||||
# Match channel count (mono or stereo)
|
||||
if buf.ndim == 2 and self._bypass_xfade_buf.ndim == 2:
|
||||
for ch in range(min(buf.shape[0], self._bypass_xfade_buf.shape[0])):
|
||||
buf[ch, :remain] = (
|
||||
fade_out * self._bypass_xfade_buf[ch, :remain]
|
||||
+ fade_in * buf[ch, :remain]
|
||||
)
|
||||
else:
|
||||
buf[:remain] = (
|
||||
fade_out * self._bypass_xfade_buf[:remain]
|
||||
+ fade_in * buf[:remain]
|
||||
)
|
||||
self._bypass_xfade_pos += remain
|
||||
|
||||
# ── Properties ─────────────────────────────────────────────────
|
||||
|
||||
@property
|
||||
@@ -2996,7 +3050,11 @@ class AudioPipeline:
|
||||
|
||||
@bypassed.setter
|
||||
def bypassed(self, value: bool) -> None:
|
||||
was = self._bypassed
|
||||
self._bypassed = value
|
||||
if was != value:
|
||||
self._bypass_xfade_pos = 0
|
||||
self._last_bypassed = was
|
||||
logger.info("Global bypass: %s", "ON" if value else "OFF")
|
||||
|
||||
@property
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import hashlib
|
||||
import enum
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Optional
|
||||
@@ -92,6 +94,13 @@ class FXBlock:
|
||||
subtype: str = "" # Algorithm variant (e.g. "hall"/"spring"/"plate" for reverb)
|
||||
nam_model_path: str = "" # Path to .nam file (for NAM_AMP type)
|
||||
ir_file_path: str = "" # Path to .wav IR file (for IR_CAB type)
|
||||
block_id: str = "" # Unique instance ID within a chain (auto-filled if empty)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
"""Auto-generate block_id if empty."""
|
||||
if not self.block_id:
|
||||
raw = f"{self.fx_type.value}_{datetime.datetime.now(datetime.timezone.utc).timestamp()}_{id(self)}"
|
||||
self.block_id = hashlib.md5(raw.encode()).hexdigest()[:12]
|
||||
|
||||
|
||||
@dataclass
|
||||
|
||||
@@ -288,7 +288,9 @@ class AudioSystem:
|
||||
# Scarlett 2i2 needs 2 channels even in mono mode
|
||||
n_in = max(2, self.config.capture_channels)
|
||||
n_out = max(2, self.config.playback_channels)
|
||||
# Use chrt to enforce SCHED_FIFO — JACK's -P flag can silently fail
|
||||
cmd = [
|
||||
"chrt", "-f", str(profile['rt_priority']),
|
||||
"jackd",
|
||||
"-P", str(profile['rt_priority']),
|
||||
"-d", "alsa",
|
||||
@@ -652,6 +654,7 @@ class AudioSystem:
|
||||
"""
|
||||
profile = config.latency_profile
|
||||
exec_start = (
|
||||
f"/usr/bin/chrt -f {profile['rt_priority']} "
|
||||
f"/usr/bin/jackd -P{profile['rt_priority']} "
|
||||
f"-p{profile['period']} -n{profile['nperiods']} "
|
||||
f"-r{profile['rate']} -dalsa -d{config.output_device} "
|
||||
@@ -668,7 +671,7 @@ User=pi
|
||||
ExecStart={exec_start}
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
LimitRTPRIO=95
|
||||
LimitRTPRIO=99
|
||||
LimitMEMLOCK=infinity
|
||||
|
||||
[Install]
|
||||
|
||||
@@ -55,6 +55,22 @@ DEFAULT_CONFIG: dict = {
|
||||
}
|
||||
|
||||
|
||||
def save_config(cfg: dict, path: Path = DEFAULT_CONFIG_PATH) -> bool:
|
||||
"""Save config dict to YAML file (preserves existing keys, overwrites in-memory state).
|
||||
|
||||
Returns True on success, False on failure.
|
||||
"""
|
||||
try:
|
||||
import yaml
|
||||
with open(path, "w") as f:
|
||||
yaml.dump(cfg, f, default_flow_style=False)
|
||||
logger.info("Saved config to %s", path)
|
||||
return True
|
||||
except (ImportError, OSError) as e:
|
||||
logger.warning("Failed to save config to %s: %s", path, e)
|
||||
return False
|
||||
|
||||
|
||||
def load_config(path: Path = DEFAULT_CONFIG_PATH) -> dict:
|
||||
"""Load config from YAML, merging with defaults for any missing keys."""
|
||||
cfg = dict(DEFAULT_CONFIG) # shallow copy top level
|
||||
|
||||
@@ -71,7 +71,7 @@ TimeoutStopSec=10
|
||||
KillMode=process
|
||||
|
||||
# Real-time audio priority
|
||||
LimitRTPRIO=95
|
||||
LimitRTPRIO=99
|
||||
LimitMEMLOCK=infinity
|
||||
LimitNICE=-20
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ from ..system.tonedownload import (
|
||||
format_size,
|
||||
)
|
||||
from ..system.audio import AudioSystem, JackAudioClient, LATENCY_PROFILES
|
||||
from ..system.config import save_config
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -207,6 +208,10 @@ class WebServerDeps:
|
||||
# JACK audio client (needs restart when JACK restarts)
|
||||
jack_audio: Optional[JackAudioClient] = None
|
||||
|
||||
# Full config dict (for saving profile/rate/period changes to disk)
|
||||
config: Optional[dict] = None
|
||||
config_path: Optional[Path] = None
|
||||
|
||||
@property
|
||||
def is_connected(self) -> bool:
|
||||
"""True if we're wired to a live pedal instance (any channel)."""
|
||||
@@ -394,11 +399,21 @@ class WebServer:
|
||||
"chain": [
|
||||
{
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
"nam_model_path": b.nam_model_path,
|
||||
"nam_model_name": Path(b.nam_model_path).stem if b.nam_model_path else "",
|
||||
"ir_file_path": b.ir_file_path,
|
||||
"ir_file_name": Path(b.ir_file_path).stem if b.ir_file_path else "",
|
||||
"name": (
|
||||
Path(b.nam_model_path).stem.replace("_", " ")
|
||||
if b.nam_model_path
|
||||
else Path(b.ir_file_path).stem.replace("_", " ")
|
||||
if b.ir_file_path
|
||||
else b.fx_type.value.replace("_", " ").title()
|
||||
),
|
||||
}
|
||||
for b in p.chain
|
||||
],
|
||||
@@ -429,11 +444,21 @@ class WebServer:
|
||||
"chain": [
|
||||
{
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
"nam_model_path": b.nam_model_path,
|
||||
"nam_model_name": Path(b.nam_model_path).stem if b.nam_model_path else "",
|
||||
"ir_file_path": b.ir_file_path,
|
||||
"ir_file_name": Path(b.ir_file_path).stem if b.ir_file_path else "",
|
||||
"name": (
|
||||
Path(b.nam_model_path).stem.replace("_", " ")
|
||||
if b.nam_model_path
|
||||
else Path(b.ir_file_path).stem.replace("_", " ")
|
||||
if b.ir_file_path
|
||||
else b.fx_type.value.replace("_", " ").title()
|
||||
),
|
||||
}
|
||||
for b in p.chain
|
||||
],
|
||||
@@ -535,6 +560,7 @@ class WebServer:
|
||||
for b in preset.chain:
|
||||
chain_data.append({
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
@@ -562,6 +588,7 @@ class WebServer:
|
||||
for b in snap.chain:
|
||||
chain.append({
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
@@ -721,6 +748,7 @@ class WebServer:
|
||||
"chain": [
|
||||
{
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
@@ -737,13 +765,13 @@ class WebServer:
|
||||
if not pl:
|
||||
raise HTTPException(status_code=503)
|
||||
if data and "bypass" in data:
|
||||
pl._bypassed = bool(data["bypass"])
|
||||
pl.bypassed = bool(data["bypass"])
|
||||
else:
|
||||
pl._bypassed = not pl._bypassed
|
||||
pl.bypassed = not pl.bypassed
|
||||
await self._manager.broadcast({
|
||||
"type": "bypass_changed",
|
||||
"channel": channel,
|
||||
"bypass": pl._bypassed,
|
||||
"bypass": pl.bypassed,
|
||||
})
|
||||
return {"ok": True, "bypass": pl._bypassed}
|
||||
|
||||
@@ -790,6 +818,12 @@ class WebServer:
|
||||
raise HTTPException(status_code=503)
|
||||
vol = max(0.0, min(1.0, float(data.get("volume", 0.8))))
|
||||
pl._master_volume = vol
|
||||
import asyncio
|
||||
asyncio.ensure_future(self._manager.broadcast({
|
||||
"type": "volume_changed",
|
||||
"channel": channel,
|
||||
"volume": vol,
|
||||
}))
|
||||
return {"ok": True, "volume": vol, "channel": channel}
|
||||
|
||||
# ── POST alias for volume (UI uses POST, server had PUT) ──
|
||||
@@ -801,6 +835,12 @@ class WebServer:
|
||||
raise HTTPException(status_code=503)
|
||||
vol = max(0.0, min(1.0, float(data.get("volume", 0.8))))
|
||||
pl._master_volume = vol
|
||||
import asyncio
|
||||
asyncio.ensure_future(self._manager.broadcast({
|
||||
"type": "volume_changed",
|
||||
"channel": channel,
|
||||
"volume": vol,
|
||||
}))
|
||||
return {"ok": True, "volume": vol, "channel": channel}
|
||||
|
||||
# ── Toggle bypass alias (UI calls /api/bypass/toggle) ─────
|
||||
@@ -811,40 +851,48 @@ class WebServer:
|
||||
if not pl:
|
||||
raise HTTPException(status_code=503)
|
||||
if data and "bypass" in data:
|
||||
pl._bypassed = bool(data["bypass"])
|
||||
pl.bypassed = bool(data["bypass"])
|
||||
else:
|
||||
pl._bypassed = not pl._bypassed
|
||||
pl.bypassed = not pl.bypassed
|
||||
await self._manager.broadcast({
|
||||
"type": "bypass_changed",
|
||||
"channel": channel,
|
||||
"bypass": pl._bypassed,
|
||||
"bypass": pl.bypassed,
|
||||
})
|
||||
return {"ok": True, "bypass": pl._bypassed}
|
||||
|
||||
# ── Block toggle (UI: PATCH /api/blocks {id, enabled}) ──
|
||||
@app.patch("/api/blocks")
|
||||
async def toggle_block(data: dict, channel: str = "guitar"):
|
||||
"""Enable/disable a block by its fx_type id — sets both enabled and bypass."""
|
||||
"""Enable/disable a block by block_id or fx_type id — sets both enabled and bypass."""
|
||||
from ..presets.types import Channel
|
||||
pm, pl, nam, ir = self._channel_deps(channel)
|
||||
if not pm:
|
||||
raise HTTPException(status_code=503)
|
||||
block_id = data.get("id")
|
||||
# Support both block_id (preferred) and id (fx_type, backward compat)
|
||||
block_id = data.get("block_id") or data.get("id")
|
||||
enabled = data.get("enabled")
|
||||
if not block_id or enabled is None:
|
||||
raise HTTPException(status_code=400, detail="Missing 'id' or 'enabled'")
|
||||
raise HTTPException(status_code=400, detail="Missing 'block_id'/'id' or 'enabled'")
|
||||
try:
|
||||
bank = pm.current_bank
|
||||
program = pm.current_program
|
||||
preset = pm.load(bank, program, channel=Channel(channel))
|
||||
for b in preset.chain:
|
||||
if b.fx_type.value == block_id:
|
||||
if b.block_id == block_id or (not data.get("block_id") and b.fx_type.value == block_id):
|
||||
b.enabled = bool(enabled)
|
||||
b.bypass = not bool(enabled) # <-- added: sync bypass with enabled
|
||||
b.bypass = not bool(enabled) # sync bypass with enabled
|
||||
pm.save(preset, channel=Channel(channel))
|
||||
# Reload pipeline if needed
|
||||
if pl:
|
||||
pl.load_preset(preset)
|
||||
await self._manager.broadcast({
|
||||
"type": "block_toggled",
|
||||
"channel": channel,
|
||||
"id": block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
})
|
||||
return {"ok": True, "id": block_id, "enabled": b.enabled, "bypass": b.bypass}
|
||||
raise HTTPException(status_code=404, detail=f"Block '{block_id}' not found")
|
||||
except Exception as e:
|
||||
@@ -853,12 +901,13 @@ class WebServer:
|
||||
# ── Block param update (UI: PATCH /api/block {id, ...params}) ──
|
||||
@app.patch("/api/block")
|
||||
async def update_block_params(data: dict, channel: str = "guitar"):
|
||||
"""Update parameters for a block by its fx_type id."""
|
||||
"""Update parameters for a block by block_id or fx_type id."""
|
||||
from ..presets.types import Channel, FXBlock
|
||||
pm, pl, nam, ir = self._channel_deps(channel)
|
||||
if not pm:
|
||||
raise HTTPException(status_code=503)
|
||||
block_id = data.get("id")
|
||||
# Support both block_id (preferred) and id (fx_type, backward compat)
|
||||
block_id = data.get("block_id") or data.get("id")
|
||||
if not block_id:
|
||||
raise HTTPException(status_code=400, detail="Missing 'id'")
|
||||
try:
|
||||
@@ -866,7 +915,7 @@ class WebServer:
|
||||
program = pm.current_program
|
||||
preset = pm.load(bank, program, channel=Channel(channel))
|
||||
for b in preset.chain:
|
||||
if b.fx_type.value == block_id:
|
||||
if b.block_id == block_id or (not data.get("block_id") and b.fx_type.value == block_id):
|
||||
# Update params from request body (skip 'id' key)
|
||||
for key, val in data.items():
|
||||
if key == "id":
|
||||
@@ -874,8 +923,10 @@ class WebServer:
|
||||
if key in ("nam_model_path", "ir_file_path", "bypass", "enabled", "subtype"):
|
||||
if key == "bypass":
|
||||
b.bypass = bool(val)
|
||||
b.enabled = not b.bypass # sync: bypass=true → enabled=false
|
||||
elif key == "enabled":
|
||||
b.enabled = bool(val)
|
||||
b.bypass = not b.enabled # sync: enabled=false → bypass=true
|
||||
elif key == "subtype":
|
||||
b.subtype = str(val)
|
||||
else:
|
||||
@@ -886,6 +937,14 @@ class WebServer:
|
||||
pm.save(preset, channel=Channel(channel))
|
||||
if pl:
|
||||
pl.load_preset(preset)
|
||||
await self._manager.broadcast({
|
||||
"type": "block_params_changed",
|
||||
"channel": channel,
|
||||
"id": block_id,
|
||||
"params": dict(b.params),
|
||||
"bypass": b.bypass,
|
||||
"enabled": b.enabled,
|
||||
})
|
||||
return {"ok": True, "id": block_id, "params": dict(b.params)}
|
||||
raise HTTPException(status_code=404, detail=f"Block '{block_id}' not found")
|
||||
except Exception as e:
|
||||
@@ -1015,6 +1074,10 @@ class WebServer:
|
||||
if not nam:
|
||||
raise HTTPException(status_code=503)
|
||||
nam.unload()
|
||||
await self._manager.broadcast({
|
||||
"type": "model_unloaded",
|
||||
"channel": channel,
|
||||
})
|
||||
return {"ok": True}
|
||||
|
||||
@app.get("/api/irs")
|
||||
@@ -1064,6 +1127,10 @@ class WebServer:
|
||||
if not ir:
|
||||
raise HTTPException(status_code=503)
|
||||
ir.unload()
|
||||
await self._manager.broadcast({
|
||||
"type": "ir_unloaded",
|
||||
"channel": channel,
|
||||
})
|
||||
return {"ok": True}
|
||||
|
||||
# ── File upload endpoints ─────────────────────────────────
|
||||
@@ -1321,61 +1388,148 @@ class WebServer:
|
||||
|
||||
@app.post("/api/audio/profile")
|
||||
async def set_audio_profile(data: dict):
|
||||
"""Switch JACK latency profile (restarts JACK server).
|
||||
"""Switch JACK latency profile and/or set custom period/rate.
|
||||
|
||||
Body: { "profile": "standard" | "low" }
|
||||
Body — at least one of:
|
||||
{ "profile": "stable" } → switch to a named profile
|
||||
{ "period": 256, "rate": 48000 } → custom settings
|
||||
{ "profile": "stable", → named profile with rate override
|
||||
"rate": 44100 }
|
||||
|
||||
The switch takes effect immediately by restarting JACK with the
|
||||
new period / nperiods / priority settings.
|
||||
Changes are saved to ~/.pedal/config.yaml so they survive reboot.
|
||||
The switch restarts JACK (brief audio dropout ~1s).
|
||||
"""
|
||||
profile_key = data.get("profile", "")
|
||||
if profile_key not in LATENCY_PROFILES:
|
||||
audio_sys = self.deps.audio_system
|
||||
if not audio_sys:
|
||||
raise HTTPException(status_code=503, detail="Audio system not available")
|
||||
|
||||
profile_key = data.get("profile")
|
||||
custom_period = data.get("period")
|
||||
custom_rate = data.get("rate")
|
||||
|
||||
# ── Resolve target profile ───────────────────────────────
|
||||
if profile_key and profile_key not in LATENCY_PROFILES and profile_key != "custom":
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"Unknown profile: {profile_key!r}. Options: {list(LATENCY_PROFILES.keys())}",
|
||||
)
|
||||
audio_sys = self.deps.audio_system
|
||||
if not audio_sys:
|
||||
raise HTTPException(status_code=503, detail="Audio system not available")
|
||||
|
||||
if profile_key and profile_key in LATENCY_PROFILES:
|
||||
# Named profile — start from profile defaults
|
||||
target_profile = dict(LATENCY_PROFILES[profile_key])
|
||||
else:
|
||||
# Custom — use current as base, or fall back to stable
|
||||
current = audio_sys.config.latency_profile
|
||||
target_profile = dict(current)
|
||||
|
||||
# Apply overrides
|
||||
if custom_period is not None:
|
||||
if custom_period not in (16, 32, 64, 128, 256, 512, 1024, 2048):
|
||||
raise HTTPException(status_code=400, detail=f"Invalid period: {custom_period}. Must be power of 2 (16-2048)")
|
||||
target_profile["period"] = custom_period
|
||||
if custom_rate is not None:
|
||||
if custom_rate not in (44100, 48000, 96000, 192000):
|
||||
raise HTTPException(status_code=400, detail=f"Invalid rate: {custom_rate}. Must be 44100, 48000, 96000, or 192000")
|
||||
target_profile["rate"] = custom_rate
|
||||
|
||||
# Build effective profile name
|
||||
if profile_key and profile_key in LATENCY_PROFILES:
|
||||
if custom_period is not None or custom_rate is not None:
|
||||
effective_key = f"{profile_key}_custom"
|
||||
else:
|
||||
effective_key = profile_key
|
||||
else:
|
||||
effective_key = "custom"
|
||||
|
||||
old_key = audio_sys.config.profile
|
||||
if old_key == profile_key:
|
||||
return {"ok": True, "profile": profile_key, "restarted": False}
|
||||
# Apply new profile
|
||||
audio_sys.config.profile = profile_key
|
||||
profile = audio_sys.config.latency_profile
|
||||
logger.info("Switching audio profile: %s → %s (period=%d, nperiods=%d)",
|
||||
old_key, profile_key, profile["period"], profile["nperiods"])
|
||||
# Stop JACK audio client first (holds a live JACK C client)
|
||||
# Check if anything actually changed
|
||||
cur_profile = audio_sys.config.latency_profile
|
||||
if (audio_sys.config.profile == effective_key
|
||||
and cur_profile["period"] == target_profile["period"]
|
||||
and cur_profile["rate"] == target_profile["rate"]):
|
||||
return {"ok": True, "profile": effective_key, "restarted": False}
|
||||
|
||||
# ── Apply new profile on the fly ─────────────────────────
|
||||
# Update AudioConfig — store named overrides inline in profile key
|
||||
audio_sys.config.profile = effective_key
|
||||
|
||||
logger.info(
|
||||
"Switching audio: %s → %s (period=%d, rate=%d)",
|
||||
old_key, effective_key,
|
||||
target_profile["period"], target_profile["rate"],
|
||||
)
|
||||
|
||||
# Stop JACK audio client first
|
||||
jack_client = self.deps.jack_audio
|
||||
if jack_client:
|
||||
jack_client.stop()
|
||||
# Restart JACK server with new parameters
|
||||
ok = audio_sys.restart_jack(timeout=10)
|
||||
|
||||
# Update LATENCY_PROFILES with custom entry so latency_profile resolves it
|
||||
LATENCY_PROFILES[effective_key] = target_profile
|
||||
|
||||
# ── Kill JACK server FIRST (breaks any client deadlock) ──
|
||||
# This interrupts the audio callback thread, releasing any lock
|
||||
# that jack_client.stop() would need.
|
||||
try:
|
||||
audio_sys.stop_jack()
|
||||
except Exception:
|
||||
logger.warning("stop_jack() failed during profile switch")
|
||||
if jack_client:
|
||||
try:
|
||||
jack_client.stop()
|
||||
except Exception:
|
||||
logger.warning("jack_client.stop() failed (expected if JACK was mid-callback)")
|
||||
|
||||
# Start JACK with new parameters
|
||||
ok = audio_sys.start_jack(timeout=10)
|
||||
if not ok:
|
||||
# Rollback on failure
|
||||
audio_sys.config.profile = old_key
|
||||
logger.warning("JACK restart failed — attempting rollback to %s", old_key)
|
||||
audio_sys.start_jack(timeout=10)
|
||||
if jack_client:
|
||||
jack_client.start()
|
||||
raise HTTPException(status_code=500, detail=f"Failed to start JACK with profile {profile_key!r} — rolled back to {old_key!r}")
|
||||
try:
|
||||
jack_client.start()
|
||||
except Exception:
|
||||
pass
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to start JACK with period={target_profile['period']}, rate={target_profile['rate']} — rolled back",
|
||||
)
|
||||
|
||||
# Restart JACK audio client
|
||||
if jack_client:
|
||||
jack_client.start()
|
||||
# Sync NAM engine block size with new period
|
||||
try:
|
||||
jack_client.start()
|
||||
except Exception as e:
|
||||
logger.warning("jack_client.start() failed after profile switch: %s", e)
|
||||
|
||||
# Sync NAM engine block size
|
||||
nam_host = self.deps.nam_host
|
||||
if nam_host and hasattr(nam_host, 'set_block_size'):
|
||||
nam_host.set_block_size(profile["period"])
|
||||
nam_host.set_block_size(target_profile["period"])
|
||||
|
||||
# ── Persist to config.yaml ──────────────────────────────
|
||||
if self.deps.config is not None:
|
||||
audio_cfg = self.deps.config.setdefault("audio", {})
|
||||
audio_cfg["profile"] = effective_key
|
||||
# Store custom period/rate in config too
|
||||
audio_cfg["period"] = target_profile["period"]
|
||||
audio_cfg["rate"] = target_profile["rate"]
|
||||
save_config(self.deps.config, self.deps.config_path)
|
||||
|
||||
await self._manager.broadcast({
|
||||
"type": "audio_profile_changed",
|
||||
"profile": profile_key,
|
||||
"period": profile["period"],
|
||||
"nperiods": profile["nperiods"],
|
||||
"profile": effective_key,
|
||||
"period": target_profile["period"],
|
||||
"rate": target_profile["rate"],
|
||||
})
|
||||
|
||||
return {
|
||||
"ok": True,
|
||||
"profile": profile_key,
|
||||
"period": profile["period"],
|
||||
"nperiods": profile["nperiods"],
|
||||
"profile": effective_key,
|
||||
"period": target_profile["period"],
|
||||
"rate": target_profile["rate"],
|
||||
"restarted": True,
|
||||
}
|
||||
|
||||
@@ -1853,6 +2007,31 @@ class WebServer:
|
||||
"nam_model": current_model_name,
|
||||
"ir_loaded": bool(ir and ir.is_loaded) if ir else False,
|
||||
"ir_name": current_ir_name,
|
||||
"blocks": (
|
||||
[
|
||||
{
|
||||
"fx_type": b.fx_type.value,
|
||||
"block_id": b.block_id,
|
||||
"enabled": b.enabled,
|
||||
"bypass": b.bypass,
|
||||
"params": dict(b.params),
|
||||
"nam_model_path": b.nam_model_path,
|
||||
"nam_model_name": Path(b.nam_model_path).stem if b.nam_model_path else "",
|
||||
"ir_file_path": b.ir_file_path,
|
||||
"ir_file_name": Path(b.ir_file_path).stem if b.ir_file_path else "",
|
||||
"name": (
|
||||
Path(b.nam_model_path).stem.replace("_", " ")
|
||||
if b.nam_model_path
|
||||
else Path(b.ir_file_path).stem.replace("_", " ")
|
||||
if b.ir_file_path
|
||||
else b.fx_type.value.replace("_", " ").title()
|
||||
),
|
||||
}
|
||||
for b in (preset.chain if preset else [])
|
||||
]
|
||||
if preset
|
||||
else []
|
||||
),
|
||||
"channel_mode": self._channel_mgr.mode,
|
||||
# Audio levels from pipeline (RMS float32 normalized 0.0-1.0, scaled to 0-100)
|
||||
"input_level": (
|
||||
|
||||
@@ -48,6 +48,16 @@ async function apiDelete(path) {
|
||||
return res.json();
|
||||
}
|
||||
|
||||
async function apiPatch(path, body = {}) {
|
||||
const res = await fetch(`/api${path}`, {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
if (!res.ok) throw new Error(`API PATCH ${path}: ${res.status}`);
|
||||
return res.json();
|
||||
}
|
||||
|
||||
/* ── Dashboard updates (via WebSocket) ──────────────────────────── */
|
||||
|
||||
pedalWS.on('connected', (msg) => {
|
||||
@@ -64,6 +74,7 @@ pedalWS.on('preset_changed', (msg) => {
|
||||
const metaEl = document.getElementById('preset-meta');
|
||||
if (nameEl) nameEl.textContent = msg.preset.name;
|
||||
if (metaEl) metaEl.textContent = `Bank ${msg.preset.bank} — Program ${msg.preset.program}`;
|
||||
renderFXChain(msg.preset.bank, msg.preset.program);
|
||||
}
|
||||
if (msg.state) updateDashboardState(msg.state);
|
||||
});
|
||||
@@ -87,6 +98,7 @@ pedalWS.on('tuner_changed', (msg) => {
|
||||
sBtn.textContent = msg.tuner_enabled ? 'ON' : 'OFF';
|
||||
sBtn.classList.toggle('active', msg.tuner_enabled);
|
||||
}
|
||||
if (msg.tuner_enabled) startTunerPoll(); else stopTunerPoll();
|
||||
});
|
||||
|
||||
pedalWS.on('routing_changed', (msg) => {
|
||||
@@ -166,6 +178,8 @@ function updateDashboardState(state) {
|
||||
const metaEl = document.getElementById('preset-meta');
|
||||
if (nameEl) nameEl.textContent = state.current_preset.name;
|
||||
if (metaEl) metaEl.textContent = `Bank ${state.current_preset.bank} — Program ${state.current_preset.program}`;
|
||||
// Render FX chain
|
||||
renderFXChain(state.current_preset.bank, state.current_preset.program);
|
||||
}
|
||||
|
||||
// Bypass
|
||||
@@ -186,6 +200,8 @@ function updateDashboardState(state) {
|
||||
sTunerBtn.textContent = state.tuner_enabled ? 'ON' : 'OFF';
|
||||
sTunerBtn.classList.toggle('active', state.tuner_enabled);
|
||||
}
|
||||
// Start/stop tuner polling based on current state
|
||||
if (state.tuner_enabled) startTunerPoll(); else stopTunerPoll();
|
||||
|
||||
// Volume
|
||||
const volSlider = document.getElementById('volume-slider');
|
||||
@@ -212,6 +228,64 @@ function updateDashboardState(state) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Tuner pitch polling ────────────────────────────────────────── */
|
||||
|
||||
const STRING_NAMES = {1: 'E', 2: 'A', 3: 'D', 4: 'G', 5: 'B', 6: 'e'};
|
||||
let _tunerPollTimer = null;
|
||||
|
||||
async function pollTunerPitch() {
|
||||
try {
|
||||
const data = await apiGet('/tuner/pitch');
|
||||
const display = document.getElementById('tuner-display');
|
||||
if (!display) return;
|
||||
|
||||
if (!data.enabled) {
|
||||
display.style.display = 'none';
|
||||
stopTunerPoll();
|
||||
return;
|
||||
}
|
||||
|
||||
display.style.display = 'flex';
|
||||
document.getElementById('tuner-note').textContent = data.note || '--';
|
||||
|
||||
// Cents bar: -50 to +50 maps to 0%–100% fill
|
||||
const cents = Math.max(-50, Math.min(50, data.cents || 0));
|
||||
const fillPct = ((cents + 50) / 100) * 100;
|
||||
const fillEl = document.getElementById('tuner-cents-fill');
|
||||
if (fillEl) fillEl.style.width = fillPct + '%';
|
||||
|
||||
document.getElementById('tuner-cents-text').textContent =
|
||||
(data.cents > 0 ? '+' : '') + data.cents + '¢';
|
||||
|
||||
const strEl = document.getElementById('tuner-string');
|
||||
if (strEl) {
|
||||
const str = data.string;
|
||||
if (str >= 1 && str <= 6) {
|
||||
strEl.textContent = STRING_NAMES[str] || '—';
|
||||
strEl.className = 'tuner-string-active';
|
||||
} else {
|
||||
strEl.textContent = '—';
|
||||
strEl.className = '';
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
// Silent — tuner endpoint may 503 if pedal disconnected
|
||||
}
|
||||
}
|
||||
|
||||
function startTunerPoll() {
|
||||
stopTunerPoll();
|
||||
pollTunerPitch(); // immediate first poll
|
||||
_tunerPollTimer = setInterval(pollTunerPitch, 100); // 100ms for responsive tuning
|
||||
}
|
||||
|
||||
function stopTunerPoll() {
|
||||
if (_tunerPollTimer) {
|
||||
clearInterval(_tunerPollTimer);
|
||||
_tunerPollTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Dashboard action handlers ─────────────────────────────────── */
|
||||
|
||||
async function toggleBypass() {
|
||||
@@ -222,6 +296,7 @@ async function toggleBypass() {
|
||||
async function toggleTuner() {
|
||||
const enabled = !document.getElementById('tuner-btn')?.classList.contains('active');
|
||||
const data = await apiPost('/tuner', { enabled });
|
||||
if (enabled) startTunerPoll(); else stopTunerPoll();
|
||||
}
|
||||
|
||||
async function setVolume(val) {
|
||||
@@ -240,6 +315,226 @@ async function activatePreset(direction, delta) {
|
||||
await apiPost(`/presets/${bank}/${clamped}/activate`);
|
||||
}
|
||||
|
||||
/* ── FX Chain renderer ───────────────────────────────────────── */
|
||||
|
||||
const FX_TYPE_LABELS = {
|
||||
noise_gate: 'Noise Gate',
|
||||
compressor: 'Compressor',
|
||||
expander: 'Expander',
|
||||
de_esser: 'De-esser',
|
||||
transient_shaper: 'Transient Shaper',
|
||||
sidechain_comp: 'Sidechain Comp',
|
||||
boost: 'Boost',
|
||||
overdrive: 'Overdrive',
|
||||
distortion: 'Distortion',
|
||||
fuzz: 'Fuzz',
|
||||
bitcrusher: 'Bitcrusher',
|
||||
wavefolder: 'Wavefolder',
|
||||
rectifier: 'Rectifier',
|
||||
nam_amp: 'NAM Amp',
|
||||
ir_cab: 'IR Cab',
|
||||
chorus: 'Chorus',
|
||||
flanger: 'Flanger',
|
||||
phaser: 'Phaser',
|
||||
tremolo: 'Tremolo',
|
||||
vibrato: 'Vibrato',
|
||||
ring_mod: 'Ring Mod',
|
||||
auto_wah: 'Auto-Wah',
|
||||
envelope_filter: 'Env Filter',
|
||||
rotary_speaker: 'Rotary',
|
||||
uni_vibe: 'Uni-Vibe',
|
||||
auto_pan: 'Auto-Pan',
|
||||
stereo_widener: 'Stereo Widener',
|
||||
delay: 'Delay',
|
||||
ping_pong_delay: 'Ping-Pong',
|
||||
multi_tap_delay: 'Multi-Tap',
|
||||
reverse_delay: 'Reverse',
|
||||
tape_echo: 'Tape Echo',
|
||||
reverb: 'Reverb',
|
||||
shimmer_reverb: 'Shimmer',
|
||||
early_reflections: 'Early Refl.',
|
||||
looper: 'Looper',
|
||||
octaver: 'Octaver',
|
||||
detune: 'Detune',
|
||||
harmonizer: 'Harmonizer',
|
||||
whammy: 'Whammy',
|
||||
pitch_shifter: 'Pitch Shift',
|
||||
eq: 'EQ',
|
||||
parametric_eq: 'Param EQ',
|
||||
high_pass: 'High Pass',
|
||||
low_pass: 'Low Pass',
|
||||
band_pass: 'Band Pass',
|
||||
notch: 'Notch',
|
||||
formant: 'Formant',
|
||||
wah: 'Wah',
|
||||
volume: 'Volume',
|
||||
};
|
||||
|
||||
const FX_CATEGORY_COLORS = {
|
||||
dynamics: { bg: '#1b5e20', text: '#a5d6a7' },
|
||||
drive: { bg: '#bf360c', text: '#ffccbc' },
|
||||
amp: { bg: '#4a148c', text: '#ce93d8' },
|
||||
modulation: { bg: '#01579b', text: '#81d4fa' },
|
||||
time: { bg: '#33691e', text: '#c5e1a5' },
|
||||
pitch: { bg: '#e65100', text: '#ffe0b2' },
|
||||
filter: { bg: '#263238', text: '#b0bec5' },
|
||||
utility: { bg: '#37474f', text: '#cfd8dc' },
|
||||
};
|
||||
|
||||
function fxCategory(fxType) {
|
||||
const cat = {
|
||||
noise_gate: 'dynamics', compressor: 'dynamics', expander: 'dynamics',
|
||||
de_esser: 'dynamics', transient_shaper: 'dynamics', sidechain_comp: 'dynamics',
|
||||
boost: 'drive', overdrive: 'drive', distortion: 'drive', fuzz: 'drive',
|
||||
bitcrusher: 'drive', wavefolder: 'drive', rectifier: 'drive',
|
||||
nam_amp: 'amp', ir_cab: 'amp',
|
||||
chorus: 'modulation', flanger: 'modulation', phaser: 'modulation',
|
||||
tremolo: 'modulation', vibrato: 'modulation', ring_mod: 'modulation',
|
||||
auto_wah: 'modulation', envelope_filter: 'modulation', rotary_speaker: 'modulation',
|
||||
uni_vibe: 'modulation', auto_pan: 'modulation', stereo_widener: 'modulation',
|
||||
delay: 'time', ping_pong_delay: 'time', multi_tap_delay: 'time',
|
||||
reverse_delay: 'time', tape_echo: 'time', reverb: 'time',
|
||||
shimmer_reverb: 'time', early_reflections: 'time', looper: 'time',
|
||||
octaver: 'pitch', detune: 'pitch', harmonizer: 'pitch',
|
||||
whammy: 'pitch', pitch_shifter: 'pitch',
|
||||
eq: 'filter', parametric_eq: 'filter', high_pass: 'filter',
|
||||
low_pass: 'filter', band_pass: 'filter', notch: 'filter',
|
||||
formant: 'filter', wah: 'filter',
|
||||
volume: 'utility',
|
||||
}[fxType] || 'utility';
|
||||
return FX_CATEGORY_COLORS[cat] || FX_CATEGORY_COLORS.utility;
|
||||
}
|
||||
|
||||
function fxLabel(fxType) {
|
||||
return FX_TYPE_LABELS[fxType] || fxType.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
|
||||
}
|
||||
|
||||
async function renderFXChain(bank, program) {
|
||||
const container = document.getElementById('fx-chain');
|
||||
const placeholder = document.getElementById('fx-chain-placeholder');
|
||||
if (!container) return;
|
||||
|
||||
if (bank == null || program == null) {
|
||||
if (placeholder) placeholder.style.display = 'block';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const preset = await apiGet(`/presets/${bank}/${program}`);
|
||||
const chain = preset.chain || [];
|
||||
if (placeholder) placeholder.style.display = 'none';
|
||||
|
||||
if (chain.length === 0) {
|
||||
container.innerHTML = '<div class="fx-block-chain-placeholder"><p>No FX blocks in chain.</p></div>';
|
||||
return;
|
||||
}
|
||||
|
||||
let html = '';
|
||||
for (const block of chain) {
|
||||
const isOn = block.enabled && !block.bypass;
|
||||
let label = fxLabel(block.fx_type);
|
||||
// Show actual model/IR name instead of generic type label
|
||||
if (block.fx_type === 'nam_amp' && block.nam_model_name) {
|
||||
label = block.nam_model_name.replace(/_/g, ' ');
|
||||
} else if (block.fx_type === 'ir_cab' && block.ir_file_name) {
|
||||
label = block.ir_file_name.replace(/_/g, ' ');
|
||||
}
|
||||
const cat = fxCategory(block.fx_type);
|
||||
const bid = block.block_id || block.fx_type;
|
||||
html += `<div class="fx-block ${isOn ? '' : 'bypassed'}"
|
||||
data-block-id="${bid}"
|
||||
onclick="toggleFXBlock(this)"
|
||||
style="cursor:pointer; border-color: ${isOn ? cat.bg : 'var(--border)'}">
|
||||
<span class="fx-badge" style="background: ${isOn ? cat.bg : 'var(--text-muted)'}">
|
||||
${isOn ? 'ON' : 'OFF'}
|
||||
</span>
|
||||
<span class="fx-name">${label}</span>
|
||||
</div>`;
|
||||
}
|
||||
container.innerHTML = html;
|
||||
} catch (e) {
|
||||
console.warn('Failed to load FX chain:', e);
|
||||
if (placeholder) placeholder.style.display = 'block';
|
||||
}
|
||||
}
|
||||
|
||||
async function toggleFXBlock(el) {
|
||||
// Read current state from the DOM element
|
||||
const bid = el.dataset.blockId;
|
||||
const currentEnabled = !el.classList.contains('bypassed');
|
||||
try {
|
||||
await apiPatch('/blocks', { block_id: bid, enabled: !currentEnabled });
|
||||
// Re-fetch and re-render
|
||||
const state = await apiGet('/state');
|
||||
if (state.connected && state.current_preset) {
|
||||
await renderFXChain(state.current_preset.bank, state.current_preset.program);
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('Failed to toggle block:', e);
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Audio profile functions ──────────────────────────────────── */
|
||||
|
||||
async function refreshAudioProfile() {
|
||||
const select = document.getElementById('audio-profile-select');
|
||||
const status = document.getElementById('jack-status');
|
||||
if (!select) return;
|
||||
|
||||
try {
|
||||
// Fetch available profiles
|
||||
const profilesData = await apiGet('/audio/profiles');
|
||||
const current = profilesData.current || 'standard';
|
||||
const sortedKeys = (profilesData.profiles || []).map(p => p.key);
|
||||
|
||||
// Build dropdown
|
||||
let opts = '';
|
||||
for (const key of sortedKeys) {
|
||||
const p = profilesData.profiles.find(x => x.key === key) || {};
|
||||
const label = key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');
|
||||
const selected = key === current ? 'selected' : '';
|
||||
opts += `<option value="${key}" ${selected}>${label}</option>`;
|
||||
}
|
||||
select.innerHTML = opts;
|
||||
|
||||
// Fetch current profile detail
|
||||
const detail = await apiGet('/audio/profile');
|
||||
if (status) {
|
||||
const running = detail.jack_running ? '🟢 Running' : '🔴 Stopped';
|
||||
const xruns = detail.xrun_count != null ? ` · ${detail.xrun_count} xruns` : '';
|
||||
status.textContent = `${running} · ${detail.period}/${detail.rate}${xruns}`;
|
||||
}
|
||||
} catch (e) {
|
||||
select.innerHTML = '<option value="">Offline</option>';
|
||||
if (status) status.textContent = '🔴 Offline';
|
||||
}
|
||||
}
|
||||
|
||||
async function switchAudioProfile(profileKey) {
|
||||
if (!profileKey) return;
|
||||
const select = document.getElementById('audio-profile-select');
|
||||
const status = document.getElementById('jack-status');
|
||||
if (status) status.textContent = '⏳ Switching...';
|
||||
select.disabled = true;
|
||||
|
||||
try {
|
||||
const result = await apiPost('/audio/profile', { profile: profileKey });
|
||||
if (status) {
|
||||
if (result.restarted) {
|
||||
status.textContent = `✅ Switched to ${profileKey} (JACK restarted)`;
|
||||
} else {
|
||||
status.textContent = `✅ Already on ${profileKey}`;
|
||||
}
|
||||
}
|
||||
await refreshAudioProfile();
|
||||
} catch (e) {
|
||||
if (status) status.textContent = `❌ Failed: ${e.message}`;
|
||||
await refreshAudioProfile();
|
||||
} finally {
|
||||
select.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Initial page load: fetch state ─────────────────────────────── */
|
||||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
@@ -261,4 +556,9 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||
wsCount.textContent = pedalWS._handlers ? '1' : '0';
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
// If on settings page with audio profile selector, load profiles
|
||||
if (document.getElementById('audio-profile-select')) {
|
||||
refreshAudioProfile();
|
||||
}
|
||||
});
|
||||
@@ -202,4 +202,28 @@ function renderToneIRResults(container, results) {
|
||||
</div>`;
|
||||
}
|
||||
container.innerHTML = html;
|
||||
}
|
||||
|
||||
async function installToneIR(downloadUrl, displayName, size, filename) {
|
||||
const btn = event.target;
|
||||
btn.disabled = true;
|
||||
btn.textContent = 'Downloading...';
|
||||
|
||||
try {
|
||||
await apiPost('/irs/tonedownload/install', {
|
||||
download_url: downloadUrl,
|
||||
name: filename || displayName + '.wav',
|
||||
display_name: displayName,
|
||||
size: size,
|
||||
});
|
||||
markIRInstalled(downloadUrl);
|
||||
btn.textContent = '✓ Done';
|
||||
btn.style.background = 'var(--success)';
|
||||
btn.style.borderColor = 'var(--success)';
|
||||
loadIRs();
|
||||
} catch (e) {
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'Install';
|
||||
alert('Install failed: ' + e.message);
|
||||
}
|
||||
}
|
||||
@@ -232,26 +232,3 @@ async function installToneModel(downloadUrl, displayName, size, filename) {
|
||||
}
|
||||
}
|
||||
|
||||
async function installToneIR(downloadUrl, displayName, size, filename) {
|
||||
const btn = event.target;
|
||||
btn.disabled = true;
|
||||
btn.textContent = 'Downloading...';
|
||||
|
||||
try {
|
||||
const data = await apiPost('/irs/tonedownload/install', {
|
||||
download_url: downloadUrl,
|
||||
name: filename || displayName + '.wav',
|
||||
display_name: displayName,
|
||||
size: size,
|
||||
});
|
||||
markInstalled(downloadUrl);
|
||||
btn.textContent = '✓ Done';
|
||||
btn.style.background = 'var(--success)';
|
||||
btn.style.borderColor = 'var(--success)';
|
||||
loadIRs();
|
||||
} catch (e) {
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'Install';
|
||||
alert('Install failed: ' + e.message);
|
||||
}
|
||||
}
|
||||
@@ -203,6 +203,77 @@ body {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Tuner Display ──────────────────────────────────────────── */
|
||||
|
||||
.tuner-display {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
margin-top: 8px;
|
||||
padding: 8px 10px;
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tuner-note {
|
||||
font-size: 2rem;
|
||||
font-weight: 800;
|
||||
color: var(--accent);
|
||||
font-family: 'Courier New', monospace;
|
||||
line-height: 1;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.tuner-cents-bar {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
border-radius: 3px;
|
||||
background: var(--border);
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tuner-cents-bar::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 50%;
|
||||
width: 2px;
|
||||
height: 100%;
|
||||
background: var(--text-muted);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.tuner-cents-fill {
|
||||
height: 100%;
|
||||
border-radius: 3px;
|
||||
background: var(--success);
|
||||
transition: width 0.1s ease;
|
||||
}
|
||||
|
||||
.tuner-cents-text {
|
||||
font-size: 0.72rem;
|
||||
color: var(--text-secondary);
|
||||
font-family: 'Courier New', monospace;
|
||||
}
|
||||
|
||||
.tuner-string {
|
||||
font-size: 0.85rem;
|
||||
font-weight: 700;
|
||||
color: var(--text-muted);
|
||||
padding: 2px 10px;
|
||||
border-radius: 4px;
|
||||
background: var(--bg-card);
|
||||
}
|
||||
|
||||
.tuner-string-active {
|
||||
color: var(--accent) !important;
|
||||
border: 1px solid var(--accent-dark);
|
||||
}
|
||||
|
||||
.status-label {
|
||||
font-size: 0.75rem;
|
||||
color: var(--text-secondary);
|
||||
@@ -346,8 +417,21 @@ body {
|
||||
padding: 6px 10px;
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-sm);
|
||||
border-radius: var(--radius);
|
||||
font-size: 0.8rem;
|
||||
cursor: pointer;
|
||||
transition: background 0.15s, border-color 0.15s, opacity 0.15s;
|
||||
user-select: none;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
.fx-block:hover {
|
||||
background: var(--bg-card-hover);
|
||||
border-color: var(--accent-dark);
|
||||
}
|
||||
|
||||
.fx-block:active {
|
||||
transform: scale(0.97);
|
||||
}
|
||||
|
||||
.fx-block.bypassed {
|
||||
@@ -517,6 +601,31 @@ body {
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
|
||||
.profile-select {
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-sm);
|
||||
color: var(--text-primary);
|
||||
padding: 4px 8px;
|
||||
font-size: 0.82rem;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.profile-select:focus {
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.profile-select:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.jack-check {
|
||||
font-size: 0.78rem;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.about-info p {
|
||||
margin-bottom: 4px;
|
||||
font-size: 0.85rem;
|
||||
|
||||
@@ -35,6 +35,14 @@
|
||||
<button class="btn toggle-btn {% if tuner_enabled %}active{% endif %}" id="tuner-btn" onclick="toggleTuner()">
|
||||
{% if tuner_enabled %}ON{% else %}OFF{% endif %}
|
||||
</button>
|
||||
<div id="tuner-display" class="tuner-display" style="display:none">
|
||||
<div class="tuner-note" id="tuner-note">--</div>
|
||||
<div class="tuner-cents-bar" id="tuner-cents-bar">
|
||||
<div class="tuner-cents-fill" id="tuner-cents-fill" style="width:50%"></div>
|
||||
</div>
|
||||
<div class="tuner-cents-text" id="tuner-cents-text">0¢</div>
|
||||
<div class="tuner-string" id="tuner-string">-</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card status-card">
|
||||
@@ -56,7 +64,7 @@
|
||||
<div class="card-body">
|
||||
<div class="fx-chain" id="fx-chain">
|
||||
<div class="fx-block-chain-placeholder" id="fx-chain-placeholder">
|
||||
<p>Connect to pedal to see active FX chain.</p>
|
||||
<p>Connect to pedal to see active FX chain. Click a block to toggle it on/off.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -60,6 +60,22 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting-row">
|
||||
<div class="setting-label">Latency Profile</div>
|
||||
<div class="setting-value">
|
||||
<select id="audio-profile-select" class="profile-select"
|
||||
onchange="switchAudioProfile(this.value)">
|
||||
<option value="">Loading...</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting-row" style="border-bottom:none">
|
||||
<div class="setting-label">JACK Status</div>
|
||||
<div class="setting-value">
|
||||
<span id="jack-status" class="jack-check">—</span>
|
||||
<button class="btn btn-secondary btn-sm" onclick="refreshAudioProfile()">⟳</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
*{box-sizing:border-box;margin:0;padding:0}body{color:#f0ede6;background:#0a0a0c}
|
||||
|
After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 42 KiB |
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1">
|
||||
<g>
|
||||
<path d="M47,13V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v6H47z M24.186,4.766c1.524,0,2.761,1.236,2.761,2.76
|
||||
c0,1.525-1.236,2.761-2.761,2.761s-2.761-1.236-2.761-2.761C21.425,6.002,22.661,4.766,24.186,4.766z M16.497,4.766
|
||||
c1.525,0,2.761,1.236,2.761,2.76c0,1.525-1.236,2.761-2.761,2.761c-1.524,0-2.76-1.236-2.76-2.761
|
||||
C13.736,6.002,14.972,4.766,16.497,4.766z M8.808,4.766c1.525,0,2.761,1.236,2.761,2.76c0,1.525-1.236,2.761-2.761,2.761
|
||||
c-1.524,0-2.76-1.236-2.76-2.761C6.047,6.002,7.283,4.766,8.808,4.766z"/>
|
||||
<path d="M1,16v25c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6V16H1z M24.394,43.261c-6.613,0-11.975-5.361-11.975-11.975
|
||||
s5.361-11.975,11.975-11.975s11.975,5.361,11.975,11.975S31.007,43.261,24.394,43.261z"/>
|
||||
</g>
|
||||
<circle cx="24.394" cy="31.286" r="3.993"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="23.5" y1="10" x2="23.5" y2="22"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="43" y1="13.546" x2="19.938" y2="53.489"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="5" y1="13.545" x2="11.904" y2="25.504"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h13.798l20.037-34.704l4.33,2.5L26.571,47H41c3.313,0,6-2.687,6-6V7
|
||||
C47,3.687,44.313,1,41,1z M9.739,26.754L2.835,14.795l4.33-2.5l6.904,11.958L9.739,26.754z M26,22h-5V10h5V22z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,72 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<circle cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path id="full_sin_1_" display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-6.638,31.942
|
||||
M-6.64,31.94c1.398,3.74,2.795,7.481,4.388,7.481 M2.129,31.94c-1.397,3.739-2.793,7.481-4.386,7.481 M2.128,31.94
|
||||
c1.397-3.74,2.795-7.481,4.387-7.481 M10.896,31.941C9.5,28.2,8.104,24.459,6.511,24.459 M10.896,31.942
|
||||
c1.398,3.741,2.795,7.481,4.385,7.481 M19.665,31.942c-1.398,3.741-2.795,7.481-4.387,7.481 M19.665,31.943
|
||||
c1.396-3.741,2.792-7.481,4.385-7.481 M28.432,31.943c-1.397-3.741-2.794-7.481-4.386-7.481 M28.432,31.941
|
||||
c1.397,3.74,2.792,7.481,4.386,7.481 M37.197,31.941c-1.396,3.74-2.792,7.481-4.386,7.481 M37.197,31.941
|
||||
c1.399-3.74,2.796-7.48,4.387-7.48 M45.966,31.942c-1.396-3.741-2.794-7.481-4.385-7.481 M45.966,31.941
|
||||
c1.396,3.74,2.793,7.481,4.389,7.481 M54.733,31.941c-1.396,3.74-2.791,7.481-4.385,7.481 M54.733,31.942
|
||||
c1.398-3.741,2.793-7.481,4.387-7.481 M63.501,31.942c-1.398-3.741-2.793-7.481-4.387-7.481 M63.501,31.94
|
||||
c1.395,3.74,2.793,7.481,4.387,7.481 M72.269,31.94c-1.395,3.739-2.793,7.481-4.385,7.481 M72.269,31.94
|
||||
c1.396-3.74,2.791-7.481,4.385-7.481 M81.038,31.941c-1.398-3.741-2.797-7.482-4.387-7.482 M81.038,31.942
|
||||
c1.396,3.741,2.795,7.481,4.385,7.481 M89.806,31.942c-1.396,3.741-2.795,7.481-4.385,7.481 M89.806,31.943"/>
|
||||
<path id="full_sin_2_" display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-4.638,16.942
|
||||
M-4.64,16.94c1.398,3.74,2.795,7.481,4.388,7.481 M4.129,16.94c-1.397,3.739-2.793,7.481-4.386,7.481 M4.128,16.94
|
||||
c1.397-3.74,2.795-7.481,4.387-7.481 M12.896,16.941C11.5,13.2,10.104,9.459,8.511,9.459 M12.896,16.942
|
||||
c1.398,3.741,2.795,7.481,4.385,7.481 M21.665,16.942c-1.398,3.741-2.795,7.481-4.387,7.481 M21.665,16.943
|
||||
c1.396-3.741,2.792-7.481,4.385-7.481 M30.432,16.943c-1.397-3.741-2.794-7.481-4.386-7.481 M30.432,16.941
|
||||
c1.397,3.74,2.792,7.481,4.386,7.481 M39.197,16.941c-1.396,3.74-2.792,7.481-4.386,7.481 M39.197,16.941
|
||||
c1.399-3.74,2.796-7.48,4.387-7.48 M47.966,16.942c-1.396-3.741-2.794-7.481-4.385-7.481 M47.966,16.941
|
||||
c1.396,3.74,2.793,7.481,4.389,7.481 M56.733,16.941c-1.396,3.74-2.791,7.481-4.385,7.481 M56.733,16.942
|
||||
c1.398-3.741,2.793-7.481,4.387-7.481 M65.501,16.942c-1.398-3.741-2.793-7.481-4.387-7.481 M65.501,16.94
|
||||
c1.395,3.74,2.793,7.481,4.387,7.481 M74.269,16.94c-1.395,3.739-2.793,7.481-4.385,7.481 M74.269,16.94
|
||||
c1.396-3.74,2.791-7.481,4.385-7.481 M83.038,16.941c-1.398-3.741-2.797-7.482-4.387-7.482 M83.038,16.942
|
||||
c1.396,3.741,2.795,7.481,4.385,7.481 M91.806,16.942c-1.396,3.741-2.795,7.481-4.385,7.481 M91.806,16.943"/>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<polygon points="2.15,32 2.148,31.998 2.147,32 "/>
|
||||
<path d="M35.904,31.415C37.664,26.709,38.952,23,41.573,23c0.002,0,0.005,0,0.01,0h0.001c0.003,0,0.006,0,0.008,0
|
||||
c2.533,0,3.745,3.462,5.408,7.938V18.679c-0.141-0.374-0.283-0.753-0.428-1.141c-0.004-0.01-0.008-0.056-0.012-0.066
|
||||
c-0.801-2.146-2.11-5.649-2.978-6.419c-0.864,0.768-2.173,4.273-2.974,6.413c-0.002,0.006-0.004,0.032-0.007,0.039
|
||||
C38.845,22.216,37.455,26,34.834,26c-0.006,0-0.014,0-0.02,0c-0.008,0-0.014,0-0.02,0c-2.613,0-4-3.763-5.752-8.451
|
||||
c-0.006-0.014-0.011-0.067-0.017-0.081l-0.002-0.004c-0.801-2.146-2.11-5.652-2.977-6.42c-0.868,0.768-2.177,4.277-2.978,6.424
|
||||
c-0.004,0.01-0.008,0.021-0.012,0.031c-1.759,4.705-3.15,8.418-5.773,8.425c-0.002,0-0.003-0.002-0.006,0
|
||||
c-0.002-0.002-0.004,0-0.006,0c-2.625-0.007-4.016-3.73-5.778-8.444c-0.004-0.011-0.008-0.021-0.011-0.032
|
||||
c-0.802-2.148-2.105-5.639-2.971-6.406c-0.866,0.769-2.177,4.277-2.979,6.423l-1.405-0.52l0.166,0.067l-0.147-0.045l1.378,0.559
|
||||
c-1.458,3.9-2.664,7.153-4.526,8.152v5.03c1.636-4.362,3.016-7.735,5.5-7.749c0.004,0,0.008,0.002,0.013,0
|
||||
c0.003,0.001,0.009,0,0.013,0c2.625,0.014,4.016,3.742,5.775,8.458c0.004,0.01,0.007,0.02,0.011,0.029
|
||||
c0.802,2.145,1.978,5.631,2.84,6.396C16.017,37.076,17,33.576,18,31.434v0.005c0-0.003,0.13,0.003,0.132-0.001
|
||||
C19.891,26.723,21.409,23,24.035,23c0.004,0,0.007,0,0.013,0c0.002,0,0.009-0.019,0.013-0.019
|
||||
c2.615,0.014,4.005,3.699,5.759,8.393c0.006,0.014,0.011,0.029,0.017,0.043l0.009,0.023c0.799,2.139,2.209,5.636,3.072,6.403
|
||||
C33.785,37.074,35,33.568,36,31.422v0.004C36,31.419,35.902,31.422,35.904,31.415z"/>
|
||||
<polygon points="2.11,32 2.108,31.999 2.108,32 "/>
|
||||
<path d="M44.572,32.497c-0.004-0.01-0.008-0.02-0.012-0.03c-0.801-2.146-2.11-5.654-2.978-6.424
|
||||
c-0.864,0.768-2.173,4.264-2.974,6.403c-0.002,0.007-0.004,0.013-0.007,0.02c-1.758,4.711-3.147,8.436-5.769,8.457
|
||||
c-0.006,0-0.014,0.002-0.02,0c-0.008,0.002-0.014,0.001-0.02,0.001c-2.613-0.021-4-3.959-5.752-8.646
|
||||
C27.037,32.264,27.032,32,27.026,32h-0.002c-0.801-2-2.111-5.413-2.977-6.181c-0.867,0.768-2.176,4.403-2.977,6.55
|
||||
c-0.004,0.01-0.008,0.099-0.012,0.109C19.3,37.183,17.908,41,15.286,41c-0.002,0-0.005,0-0.006,0
|
||||
c-0.004,0-0.004-0.037-0.006-0.037c-2.625-0.007-4.016-3.769-5.778-8.482c-0.004-0.01-0.008-0.02-0.011-0.03
|
||||
c-0.802-2.148-2.105-5.636-2.971-6.402c-0.866,0.769-2.177,4.282-2.979,6.429l-1.228-0.445l1.219,0.495
|
||||
C2.658,34.848,1.88,36.94,1,38.466V41c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6v-2.769
|
||||
C46.159,36.735,45.406,34.731,44.572,32.497z"/>
|
||||
<path d="M2.716,16.453l0.011,0.004C4.487,11.748,5.879,8,8.5,8c0.004,0,0.008,0,0.013,0c0.003,0,0.009-0.02,0.013-0.02
|
||||
c2.625,0.014,4.016,3.721,5.775,8.438c0.004,0.01,0.007,0.02,0.011,0.03c0.802,2.145,1.978,5.631,2.84,6.397
|
||||
C18.017,22.077,19,18.577,20,16.433v0.005c0-0.004,0.13,0.003,0.132,0C21.891,11.722,23.409,8,26.035,8c0.004,0,0.007,0,0.013,0
|
||||
c0.004,0,0.009,0,0.013,0c2.615,0,4.019,3.699,5.772,8.393c0.006,0.014,0.024,0.009,0.03,0.023l0.034,0.023
|
||||
c0.799,2.139,2.157,5.634,3.021,6.401C35.785,22.072,37,18.563,38,16.417c0,0,0-0.001,0-0.001c0-0.007-0.098,0.006-0.096-0.001
|
||||
C39.664,11.709,40.952,8,43.573,8c0.002,0,0.005,0,0.01,0h0.001c0.003,0,0.006,0,0.008,0c1.464,0,2.485,1.156,3.408,2.995V7
|
||||
c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v13.737C1.619,19.383,2.252,17.693,2.716,16.453z"/>
|
||||
<polygon points="1,31.557 1,31.558 1.046,31.575 "/>
|
||||
<polygon points="4.11,17 4.108,17 4.108,17 "/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.6 KiB |
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<polyline id="Limiter_Path" fill="none" stroke="#FFFFFF" stroke-width="5" points="5.5,53.25 24,12.5 65.5,12.5 "/>
|
||||
<path id="Compressor_Path" display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" d="M8.5,53.25
|
||||
c0,0,15.445-34.126,16.146-35.565c1.929-3.964,2.947-5.192,8.477-5.186c1.39,0.001,35.378,0,35.378,0"/>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<path d="M8.585,47c4.368-9.646,13.269-29.291,13.813-30.409C24.576,12.113,26.345,10,33.088,10c0.013,0,0.024,0,0.037,0
|
||||
C33.703,10,39.93,10,47,10V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6H8.585z"/>
|
||||
<path d="M33.119,15c-0.021,0-0.043,0-0.063,0c-4.323,0-4.574,0.515-6.162,3.779C26.449,19.691,19.506,35.006,14.074,47H41
|
||||
c3.313,0,6-2.688,6-6V15C39.928,15,33.698,15,33.119,15z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<text transform="matrix(1 0 0 1 9.8389 32.5723)" fill="#FFFFFF" font-family="'PalatinoLinotype-BoldItalic'" font-size="34">fx</text>
|
||||
|
||||
<text id="k" transform="matrix(1 0 0 1 14.5454 35.5723)" display="inline" fill="#FFFFFF" font-family="'PalatinoLinotype-BoldItalic'" font-size="34">k</text>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M26.805,26.91
|
||||
c0.648,1.788,1.178,3.092,1.586,3.91c0.41,0.819,0.711,1.303,0.904,1.453c0.195,0.148,0.375,0.224,0.541,0.224
|
||||
c0.42,0,1.211-0.398,2.373-1.195l0.184,0.017l0.365,0.647l-0.051,0.232c-0.441,0.276-0.885,0.57-1.328,0.88
|
||||
c-2.113,1.472-3.529,2.208-4.25,2.208c-0.199,0-0.381-0.044-0.547-0.133s-0.369-0.302-0.607-0.64
|
||||
c-0.236-0.337-0.492-0.852-0.763-1.543c-0.271-0.692-0.681-1.777-1.229-3.254c-0.548-1.479-0.911-2.493-1.087-3.047
|
||||
c-0.62,0.643-1.054,1.148-1.303,1.52s-0.429,0.708-0.54,1.012c-0.111,0.305-0.26,0.922-0.448,1.852
|
||||
c-0.188,0.93-0.315,1.613-0.382,2.051c-0.066,0.437-0.1,0.882-0.1,1.336c-1.118,0.056-2.374,0.276-3.769,0.664l-0.282-0.415
|
||||
c0.93-3.243,1.887-7.509,2.872-12.8c0.985-5.29,1.478-8.19,1.478-8.699c0-0.266-0.075-0.465-0.224-0.598s-0.379-0.208-0.689-0.224
|
||||
c-0.31-0.017-0.896-0.03-1.76-0.042L17.6,12.177l0.116-0.714l0.149-0.149c2.413-0.299,4.665-0.819,6.757-1.561l0.414,0.365
|
||||
c-0.553,2.214-1.776,7.836-3.668,16.867c0.044-0.044,0.47-0.559,1.278-1.544c1.04-1.272,1.961-2.341,2.764-3.204
|
||||
c0.802-0.863,1.612-1.607,2.433-2.233c0.818-0.625,1.537-1.054,2.158-1.287c0.619-0.232,1.268-0.349,1.941-0.349
|
||||
c0.299,0,0.604,0.033,0.914,0.1l0.066,0.199c-0.332,1.118-0.537,1.959-0.615,2.523l-0.182,0.133
|
||||
c-0.654-0.21-1.156-0.315-1.512-0.315c-0.719,0-1.521,0.21-2.406,0.631c-0.887,0.421-1.738,1.107-2.557,2.059
|
||||
C25.773,24.053,26.158,25.123,26.805,26.91z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="-11" y1="18.5" x2="28" y2="18.5"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="-18" y1="29.5" x2="28" y2="29.5"/>
|
||||
<polyline display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" points="19.25,9.504 33.746,24 19.25,38.496 "/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<polygon points="30.211,24 27.211,21 1,21 1,27 27.211,27 "/>
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v9h21.21l-4.728-4.728l3.535-3.535L37.281,24L21.018,40.264l-3.535-3.535L22.211,32H1v9
|
||||
c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6V7C47,3.687,44.313,1,41,1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<polyline display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-miterlimit="10" points="-47,33.5 9,33.5
|
||||
11.353,22.952 15.154,40.249 19.336,33.5 83,33.5 "/>
|
||||
<polyline display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-miterlimit="10" points="-27,20.5 29,20.5
|
||||
31.354,9.952 35.154,27.249 39.336,20.5 103,20.5 "/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<polygon points="31.343,16.89 30.202,22 12.68,22 15.826,36.317 18.501,32 47,32 47,22 40.171,22 34.482,31.182 "/>
|
||||
<path d="M10.698,19l0.666-2.986L12.02,19h15.778l3.566-15.986l4.462,20.303L38.501,19H47V7c0-3.313-2.687-6-6-6H7
|
||||
C3.687,1,1,3.687,1,7v12H10.698z"/>
|
||||
<path d="M20.171,35l-5.688,9.181l-3.14-14.29L10.202,35H1v6c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6v-6H20.171z"/>
|
||||
<polygon points="7.798,32 10.028,22 1,22 1,32 "/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1">
|
||||
<path d="M31.5,2.262v8.767C35.976,13.628,39,18.462,39,24c0,8.271-6.729,15-15,15c-8.271,0-15-6.729-15-15
|
||||
c0-5.538,3.024-10.372,7.5-12.971V2.262C7.49,5.38,1,13.943,1,24c0,12.682,10.318,23,23,23c12.683,0,23-10.318,23-23
|
||||
C47,13.943,40.51,5.379,31.5,2.262z"/>
|
||||
<path d="M20,25.5h8V1.354C26.7,1.126,25.365,1,24,1s-2.7,0.126-4,0.354V25.5z"/>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 857 B |
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Original" display="none">
|
||||
<circle display="inline" cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" d="M-29.056,27.166 M-15.749,27.162
|
||||
c-0.524,2.555-1.05,5.108-1.578,7.51l-10.135,0.07c-0.534-2.42-1.064-4.999-1.594-7.58 M-2.44,27.164
|
||||
c-1.035-5.03-2.067-10.06-3.134-13.896l-7.039-0.01c-1.068,3.837-2.102,8.872-3.136,13.904 M-2.44,27.162 M-2.44,27.166
|
||||
M10.868,27.162c-0.524,2.555-1.05,5.108-1.579,7.51l-10.134,0.07c-0.534-2.42-1.063-4.999-1.595-7.58 M24.176,27.164
|
||||
c-1.034-5.031-2.066-10.06-3.133-13.896l-7.04-0.01c-1.067,3.837-2.101,8.872-3.136,13.904 M24.176,27.162 M24.176,27.166
|
||||
M37.483,27.162c-0.525,2.555-1.052,5.11-1.58,7.51l-10.132,0.07c-0.536-2.418-1.065-4.999-1.596-7.58 M50.791,27.164
|
||||
c-1.035-5.031-2.065-10.06-3.134-13.896l-7.04-0.01c-1.065,3.837-2.099,8.872-3.134,13.904 M50.791,27.162 M50.791,27.166
|
||||
M64.102,27.162c-0.524,2.555-1.052,5.11-1.581,7.51l-10.133,0.07c-0.536-2.418-1.064-4.999-1.597-7.58 M77.408,27.164
|
||||
c-1.037-5.031-2.066-10.06-3.137-13.896l-7.037-0.01c-1.063,3.837-2.1,8.872-3.133,13.904 M77.408,27.162 M77.408,27.166
|
||||
M90.714,27.162c-0.523,2.555-1.048,5.108-1.575,7.51l-10.137,0.07c-0.534-2.42-1.063-4.999-1.594-7.58 M104.024,27.164
|
||||
c-1.037-5.031-2.066-10.06-3.136-13.896l-7.039-0.01c-1.069,3.837-2.1,8.872-3.136,13.904 M104.024,27.162 M104.024,27.166
|
||||
M117.33,27.162c-0.521,2.555-1.048,5.108-1.574,7.51l-10.137,0.07c-0.536-2.42-1.063-4.999-1.595-7.58 M130.641,27.164
|
||||
c-1.037-5.031-2.065-10.06-3.137-13.896l-7.037-0.01c-1.067,3.837-2.1,8.872-3.137,13.904 M130.641,27.162 M130.641,27.166
|
||||
M143.947,27.162c-0.524,2.555-1.052,5.112-1.58,7.51l-10.133,0.07c-0.534-2.416-1.065-4.999-1.594-7.58 M157.253,27.164
|
||||
c-1.032-5.031-2.063-10.06-3.132-13.896l-7.037-0.01c-1.071,3.837-2.101,8.872-3.137,13.904 M157.253,27.162 M157.253,27.166
|
||||
M170.563,27.162c-0.519,2.555-1.052,5.112-1.578,7.51l-10.133,0.07c-0.535-2.416-1.067-4.999-1.599-7.58 M183.869,27.164
|
||||
c-1.033-5.031-2.062-10.06-3.133-13.896l-7.037-0.01c-1.066,3.837-2.1,8.872-3.137,13.904 M183.869,27.162"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M7.674,32.683c0.413-1.925,0.824-3.923,1.234-5.922c0-0.003,0.001-0.005,0.001-0.008l0.02-0.094
|
||||
c1.017-4.945,2.069-10.059,3.147-13.937l0.408-1.467l10.079,0.015l0.406,1.462c1.079,3.879,2.13,8.994,3.146,13.94
|
||||
c0.003,0.012,0.005,0.022,0.007,0.034c0.004,0.018,0.008,0.035,0.012,0.053l0.038,0.183c0.401,1.956,0.803,3.909,1.207,5.789
|
||||
l7.147-0.049C34.939,30.759,35,28.759,36,26.759c0-0.002,0-0.004,0-0.006l-0.212-0.12c1.015-4.936,1.946-10.039,3.021-13.91
|
||||
l0.349-1.467l4.022,0.006C39.058,5.077,32.006,1,24.015,1C11.312,1,1.007,11.296,1.007,23.999c0,3.087,0.609,6.029,1.711,8.719
|
||||
L7.674,32.683z"/>
|
||||
<path d="M42.153,15.261c-0.907,3.534-1.809,7.919-2.685,12.178l-0.026,0.127c-0.001,0.002-0.001,0.005-0.002,0.007
|
||||
c-0.526,2.562-1.054,5.124-1.584,7.529l-0.343,1.56l-13.345,0.092l-0.35-1.578c-0.525-2.37-1.045-4.896-1.564-7.427l-0.029-0.143
|
||||
c-0.003-0.013-0.006-0.025-0.008-0.039l-0.018-0.088c-0.878-4.271-1.782-8.669-2.692-12.212l-3.967-0.005
|
||||
c-0.91,3.541-1.814,7.936-2.692,12.204l-0.021,0.101c0,0.002-0.001,0.004-0.001,0.006c-0.525,2.563-1.053,5.123-1.583,7.53
|
||||
l-0.343,1.56l-6.071,0.042C8.947,42.908,15.994,47,24,47c12.703,0,23-10.297,23-23.001c0-3.093-0.614-6.041-1.722-8.734
|
||||
L42.153,15.261z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 477 B |
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" d="M-5,12.5c0,0,11.333,0.167,21,0
|
||||
c6.754-0.116,11.413,19.888,18.167,20c10,0.167,24.833,0,24.833,0"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M15.957,10c4.848-0.12,8.015,5.42,11.34,11.248c1.981,3.473,4.976,8.72,6.912,8.752c3.898,0.066,8.564,0.08,12.791,0.072
|
||||
V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v3.057C5.137,10.082,10.806,10.089,15.957,10z"/>
|
||||
<path d="M45.021,35.073c-3.692,0-7.569-0.018-10.896-0.073c-4.784-0.08-7.887-5.518-11.171-11.273
|
||||
C20.97,20.249,17.975,15,16.061,15c-0.006,0-0.012,0-0.018,0C10.861,15,5.165,15,1,15.001V41c0,3.313,2.687,6,6,6h34
|
||||
c3.313,0,6-2.687,6-6v-5.929C46.349,35.072,45.689,35.073,45.021,35.073z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<path fill="#800000" d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z
|
||||
M39.436,34.23l-5.205,5.205L24,29.205l-10.23,10.23L8.564,34.23L18.795,24L8.564,13.769l5.205-5.204L24,18.795l10.23-10.23
|
||||
l5.205,5.204L29.205,24L39.436,34.23z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 784 B |
@@ -1,20 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" d="M-7,20.5c0,0,6.632,0,14.601,0
|
||||
c7.815,0,10.993-10.467,13.093-10.467c3.335,0,5.959,26.467,36.474,26.467c10.001,0,24.833,0,24.833,0"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M7.601,18c3.835,0,6.455-3.792,8.367-6.561c1.507-2.182,2.698-3.906,4.726-3.906c2.401,0,3.453,2.191,5.047,5.507
|
||||
c2.885,6.005,7.812,16.245,21.26,19.743V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v11H7.601z"/>
|
||||
<path d="M21.233,15.206c-0.235-0.49-0.494-1.028-0.74-1.518c-0.143,0.204-0.283,0.407-0.412,0.593
|
||||
C17.829,17.542,14.059,23,7.601,23H1v18c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6v-3.056
|
||||
C30.383,34.247,24.371,21.74,21.233,15.206z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" d="M-7,20.5c0,0,6.632,0,14.601,0
|
||||
c7.815,0,10.993-10.467,13.093-10.467c3.335,0,5.958,26.467,36.474,26.467c10.001,0,24.833,0,24.833,0"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M47.001,18V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v25.783c13.448-3.498,18.375-13.738,21.26-19.743
|
||||
c1.594-3.316,2.646-5.507,5.047-5.507c2.028,0,3.219,1.724,4.727,3.906C33.945,14.208,36.564,18,40.4,18H47.001z"/>
|
||||
<path d="M1.001,37.943V41c0,3.313,2.688,6,6,6h34c3.313,0,6-2.688,6-6V23H40.4c-6.459,0-10.229-5.458-12.48-8.719
|
||||
c-0.129-0.187-0.27-0.389-0.412-0.593c-0.246,0.49-0.505,1.028-0.74,1.518C23.63,21.74,17.618,34.247,1.001,37.943z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,114 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
<g id="Layer_2">
|
||||
<g>
|
||||
<path d="M8.5,17.824c0.004,0.003,0.008,0.006,0.013,0.006c0.003,0.002,0.009,0.003,0.013,0.004
|
||||
c2.625,0.971,4.016,5.203,5.775,10.561c0.004,0.012,0.007,0.021,0.011,0.033c0.802,2.437,2.106,6.396,2.968,7.477
|
||||
c0.865-0.452,2.175-3.479,2.976-5.33c0.001-0.002,0.002-0.006,0.003-0.008c1.759-4.076,3.149-7.297,5.775-6.355
|
||||
c0.004,0.001,0.007,0.002,0.013,0.005c0.003-0.001,0.01,0.003,0.014,0.005c2.614,0.966,4.006,5.175,5.76,10.507
|
||||
c0.006,0.018,0.011,0.032,0.017,0.049l0.009,0.027c0.799,2.43,2.104,6.398,2.969,7.48c0.867-0.452,2.178-3.485,2.979-5.34v-0.002
|
||||
c0.003-0.006,0.006-0.012,0.008-0.018c1.762-4.064,3.152-7.277,5.773-6.333c0.002,0.001,0.005,0.001,0.01,0.003l0.001,0.002
|
||||
c0.003,0,0.006,0.002,0.008,0.002c1.409,0.519,2.461,1.983,3.407,4.051V22.409c-0.506-1.334-1.013-2.493-1.422-3.005
|
||||
c-0.864,0.453-2.174,3.473-2.975,5.321c-0.002,0.006-0.004,0.012-0.006,0.018c-1.759,4.07-3.147,7.29-5.77,6.357
|
||||
c-0.006-0.002-0.014-0.006-0.02-0.008c-0.009-0.003-0.015-0.005-0.021-0.008c-2.613-0.973-4-5.18-5.752-10.505
|
||||
c-0.007-0.017-0.011-0.033-0.017-0.049l-0.002-0.005c-0.802-2.438-2.11-6.42-2.978-7.504c-0.868,0.452-2.177,3.485-2.978,5.341
|
||||
c-0.004,0.008-0.008,0.018-0.013,0.026c-1.759,4.064-3.15,7.271-5.773,6.323c-0.002,0-0.003-0.003-0.006-0.002
|
||||
c-0.002-0.002-0.004-0.001-0.006-0.002c-2.625-0.962-4.016-5.193-5.778-10.548c-0.004-0.013-0.008-0.024-0.011-0.036
|
||||
c-0.802-2.44-2.105-6.406-2.971-7.487c-0.866,0.453-2.177,3.483-2.979,5.338l-1.314-0.967L6.14,10.954l1.378,1.041
|
||||
c-1.757,4.063-3.146,7.272-5.764,6.338c-0.006-0.003-0.01-0.003-0.017-0.007c-0.004,0.001-0.011-0.004-0.017-0.006
|
||||
C1.468,18.227,1.23,18.094,1,17.942v9.917c0.619-1.13,1.251-2.591,1.714-3.66l1.412,1.018L4.108,25.2l0.002,0.001l-1.386-1.024
|
||||
C4.486,20.104,5.877,16.885,8.5,17.824z"/>
|
||||
<path d="M1.744,15.247c0.864-0.453,2.171-3.474,2.97-5.322l1.412,1.019l-0.02-0.015L6.11,10.93L4.724,9.904
|
||||
C6.485,5.831,7.877,2.612,10.5,3.553c0.004,0.002,0.008,0.002,0.013,0.005c0.003-0.001,0.009,0.003,0.013,0.005
|
||||
c2.625,0.97,4.016,5.203,5.775,10.56c0.004,0.011,0.007,0.022,0.011,0.033c0.802,2.437,2.106,6.396,2.968,7.477
|
||||
c0.865-0.453,2.175-3.479,2.976-5.331v0.001c0.001-0.003,0.002-0.006,0.003-0.009c1.759-4.076,3.148-7.297,5.775-6.355
|
||||
c0.004,0.002,0.007,0.002,0.013,0.005c0.004,0.001,0.01,0.003,0.014,0.005c2.614,0.966,4.006,5.176,5.76,10.509
|
||||
c0.006,0.017,0.011,0.032,0.017,0.048l0.009,0.026c0.799,2.43,2.104,6.399,2.969,7.481c0.867-0.453,2.178-3.484,2.979-5.341
|
||||
c0,0,0,0,0-0.001c0.003-0.006,0.006-0.012,0.008-0.018c1.762-4.065,3.152-7.276,5.773-6.333c0.002,0.001,0.005,0.002,0.01,0.004
|
||||
h0.001c0.003,0.001,0.006,0.002,0.008,0.003c0.513,0.188,0.977,0.505,1.407,0.926V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7
|
||||
v6.901C1.267,14.491,1.521,14.967,1.744,15.247z"/>
|
||||
<polygon points="4.157,25.236 4.175,25.25 4.188,25.26 4.147,25.229 "/>
|
||||
<path d="M46.568,41.219c-0.004-0.012-0.008-0.023-0.012-0.035c-0.802-2.438-2.111-6.422-2.979-7.508
|
||||
c-0.864,0.453-2.174,3.473-2.975,5.321c-0.002,0.006-0.004,0.011-0.006,0.017c-1.759,4.071-3.147,7.291-5.77,6.357
|
||||
c-0.006-0.002-0.014-0.002-0.02-0.007c-0.009-0.001-0.015-0.005-0.021-0.007c-2.613-0.974-4-5.182-5.752-10.506
|
||||
c-0.007-0.017-0.011-0.033-0.017-0.05l0.004-0.002c-0.801-2.437-2.109-6.421-2.978-7.503c-0.866,0.451-2.176,3.484-2.977,5.34
|
||||
c-0.004,0.01-0.008,0.019-0.012,0.027c-1.759,4.063-3.15,7.271-5.773,6.322c-0.002,0-0.005-0.004-0.006-0.002
|
||||
c-0.004-0.004-0.004-0.002-0.006-0.002c-2.625-0.963-4.016-5.193-5.778-10.549c-0.004-0.012-0.008-0.022-0.011-0.035
|
||||
c-0.802-2.439-2.105-6.405-2.971-7.486c-0.866,0.453-2.177,3.482-2.979,5.337L4.188,25.26L4.18,25.254l1.345,1.018
|
||||
C4.068,29.64,2.861,32.414,1,32.732V41c0,3.313,2.687,6,6,6h34c2.91,0,5.336-2.075,5.883-4.825
|
||||
C46.779,41.86,46.675,41.542,46.568,41.219z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Layer_1" style="display:none;">
|
||||
<circle cx="24" cy="23.999" r="23"/>
|
||||
<path style="display:inline;" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6
|
||||
V41z"/>
|
||||
<path style="display:inline;fill:#FFFFFF;" d="M87.423,64.516L87.423,64.516h-0.002c-0.002-0.002-0.004-0.002-0.006-0.002
|
||||
c-2.628-0.965-4.021-5.201-5.782-10.563c-0.004-0.012-0.007-0.021-0.011-0.033c-0.804-2.443-2.106-6.398-2.972-7.479
|
||||
c-0.863,0.451-2.172,3.476-2.971,5.326l0,0c-0.003,0.004-0.005,0.01-0.007,0.015c-1.759,4.075-3.147,7.297-5.774,6.354
|
||||
c-0.004-0.001-0.01-0.003-0.014-0.004c-0.006-0.003-0.009-0.004-0.013-0.005c-2.621-0.968-4.011-5.178-5.761-10.51
|
||||
c-0.006-0.018-0.012-0.031-0.018-0.049l-0.009-0.027c-0.8-2.43-2.104-6.398-2.97-7.479c-0.864,0.45-2.17,3.472-2.971,5.317
|
||||
l-1.414-1.017l0.051,0.037l-0.021-0.016l1.37,1.028c-1.756,4.063-3.144,7.274-5.762,6.344c-0.007-0.003-0.013-0.003-0.021-0.007
|
||||
c-0.007-0.001-0.013-0.005-0.02-0.008c-2.616-0.975-4.008-5.188-5.76-10.521c-0.004-0.012-0.008-0.023-0.012-0.035
|
||||
c-0.802-2.438-2.111-6.422-2.979-7.508c-0.864,0.453-2.174,3.473-2.975,5.321l0,0c-0.002,0.006-0.004,0.011-0.006,0.017
|
||||
c-1.759,4.071-3.147,7.291-5.77,6.357c-0.006-0.002-0.014-0.002-0.02-0.007c-0.009-0.001-0.015-0.005-0.021-0.007
|
||||
c-2.613-0.974-4-5.182-5.752-10.506c-0.007-0.017-0.011-0.033-0.017-0.05l0.004-0.002c-0.801-2.437-2.109-6.421-2.978-7.503
|
||||
c-0.866,0.451-2.176,3.484-2.977,5.34c-0.004,0.01-0.008,0.019-0.012,0.027c-1.759,4.063-3.15,7.271-5.773,6.322
|
||||
c-0.002,0-0.005-0.004-0.006-0.002c-0.004-0.004-0.004-0.002-0.006-0.002c-2.625-0.963-4.016-5.193-5.778-10.549
|
||||
c-0.004-0.012-0.008-0.022-0.011-0.035c-0.802-2.439-2.105-6.405-2.971-7.486c-0.866,0.453-2.177,3.482-2.979,5.337l-1.405-1.034
|
||||
l0.166,0.123l-0.147-0.109l1.378,1.043c-1.757,4.062-3.146,7.271-5.764,6.336c-0.006-0.002-0.011-0.002-0.017-0.006
|
||||
c-0.005,0-0.01-0.004-0.017-0.006C-2.89,31.625-4.28,27.4-6.039,22.057c-0.29-0.882,0.101-1.611,0.876-1.619
|
||||
c0.774-0.01,1.637,0.691,1.927,1.572l0.006,0.021c0.8,2.432,2.109,6.405,2.974,7.489c0.864-0.453,2.171-3.474,2.97-5.321
|
||||
l1.412,1.018L4.108,25.2l0.002,0.001l-1.386-1.024c1.762-4.073,3.153-7.292,5.776-6.353c0.004,0.003,0.008,0.006,0.013,0.006
|
||||
c0.003,0.002,0.009,0.003,0.013,0.004c2.625,0.971,4.016,5.203,5.775,10.561c0.004,0.012,0.007,0.021,0.011,0.033
|
||||
c0.802,2.437,2.106,6.396,2.968,7.477c0.865-0.452,2.175-3.479,2.976-5.33l0,0c0.001-0.002,0.002-0.006,0.003-0.008
|
||||
c1.759-4.076,3.149-7.297,5.775-6.355c0.004,0.001,0.007,0.002,0.013,0.005c0.003-0.001,0.01,0.003,0.014,0.005
|
||||
c2.614,0.966,4.006,5.175,5.76,10.507c0.006,0.018,0.011,0.032,0.017,0.049l0.009,0.027c0.799,2.43,2.104,6.398,2.969,7.48
|
||||
c0.867-0.452,2.178-3.485,2.979-5.34v-0.002l1.405,1.037l-1.405-1.037c0.003-0.006,0.006-0.012,0.008-0.018l0,0
|
||||
c1.762-4.064,3.152-7.277,5.773-6.333c0.002,0.001,0.005,0.001,0.01,0.003l0.001,0.002c0.003,0,0.006,0.002,0.008,0.002
|
||||
c2.621,0.965,4.013,5.184,5.769,10.524c0.004,0.012,0.008,0.022,0.012,0.034l0.001,0.003c0.802,2.438,2.11,6.425,2.979,7.506
|
||||
c0.864-0.452,2.172-3.476,2.972-5.327l1.411,1.023l-0.071-0.053l0.043,0.03l-1.367-1.034c1.757-4.06,3.144-7.268,5.761-6.337
|
||||
c0.006,0.003,0.014,0.005,0.02,0.009c0.008,0,0.014,0.004,0.02,0.006c2.613,0.974,4,5.18,5.754,10.506
|
||||
c0.006,0.017,0.012,0.033,0.017,0.05c0.801,2.438,2.108,6.425,2.979,7.509c0.868-0.451,2.178-3.484,2.979-5.341
|
||||
c0.002-0.004,0.004-0.009,0.006-0.015l0,0c1.76-4.07,3.148-7.287,5.775-6.338c0.002,0,0.004,0.002,0.007,0.002h0.001h0.001
|
||||
c0.002,0.002,0.004,0.002,0.006,0.004c2.625,0.962,4.021,5.199,5.784,10.562c0.004,0.013,0.008,0.022,0.011,0.035
|
||||
c0.804,2.442,2.104,6.396,2.968,7.476c0.868-0.453,2.178-3.484,2.979-5.34c0.29-0.672,1.153-0.75,1.93-0.179
|
||||
s1.171,1.579,0.881,2.25c-1.762,4.079-3.153,7.302-5.782,6.353C87.427,64.518,87.425,64.516,87.423,64.516z M21.665,31.6
|
||||
l1.405,1.037L21.665,31.6z M72.863,49.708l1.404,1.036L72.863,49.708z"/>
|
||||
<path style="display:inline;fill:#FFFFFF;" d="M89.423,50.243L89.423,50.243l-0.002-0.001c-0.002,0-0.004-0.001-0.006-0.002
|
||||
c-2.628-0.963-4.021-5.199-5.782-10.563c-0.004-0.011-0.007-0.021-0.011-0.033c-0.804-2.441-2.106-6.398-2.972-7.478
|
||||
c-0.863,0.45-2.172,3.476-2.971,5.326l0,0c-0.003,0.004-0.005,0.01-0.007,0.014c-1.759,4.076-3.147,7.298-5.774,6.354
|
||||
c-0.004-0.002-0.01-0.004-0.014-0.004c-0.006-0.002-0.009-0.004-0.013-0.006c-2.621-0.968-4.011-5.178-5.761-10.51
|
||||
c-0.006-0.016-0.012-0.031-0.018-0.047l-0.009-0.027c-0.8-2.43-2.104-6.399-2.97-7.48c-0.864,0.452-2.17,3.472-2.971,5.318
|
||||
l-1.414-1.017l0.051,0.036l-0.021-0.014l1.37,1.027c-1.756,4.063-3.144,7.274-5.762,6.344c-0.007-0.002-0.015-0.006-0.021-0.008
|
||||
c-0.008-0.002-0.013-0.005-0.02-0.007c-2.616-0.975-4.008-5.188-5.76-10.522c-0.004-0.01-0.008-0.021-0.012-0.033
|
||||
c-0.802-2.438-2.111-6.423-2.979-7.508c-0.864,0.453-2.174,3.473-2.975,5.321l0,0c-0.002,0.006-0.004,0.012-0.006,0.018
|
||||
c-1.759,4.07-3.147,7.29-5.77,6.357c-0.006-0.002-0.014-0.006-0.02-0.008c-0.009-0.003-0.015-0.005-0.021-0.008
|
||||
c-2.613-0.973-4-5.18-5.752-10.505c-0.007-0.017-0.011-0.033-0.017-0.049l-0.002-0.005c-0.802-2.438-2.11-6.42-2.978-7.504
|
||||
c-0.868,0.452-2.177,3.485-2.978,5.341c-0.004,0.008-0.008,0.018-0.013,0.026c-1.759,4.064-3.15,7.271-5.773,6.323
|
||||
c-0.002,0-0.003-0.003-0.006-0.002c-0.002-0.002-0.004-0.001-0.006-0.002c-2.625-0.962-4.016-5.193-5.778-10.548
|
||||
c-0.004-0.013-0.008-0.024-0.011-0.036c-0.802-2.44-2.105-6.406-2.971-7.487c-0.866,0.453-2.177,3.483-2.979,5.338L6.121,10.94
|
||||
l0.166,0.122L6.14,10.954l1.378,1.041c-1.757,4.063-3.146,7.272-5.764,6.338c-0.006-0.003-0.01-0.003-0.017-0.007
|
||||
c-0.004,0.001-0.011-0.004-0.017-0.006c-2.61-0.967-4-5.191-5.759-10.536c-0.29-0.882,0.101-1.612,0.876-1.619
|
||||
c0.776-0.009,1.637,0.691,1.927,1.573l0.006,0.018c0.8,2.433,2.109,6.408,2.974,7.491c0.864-0.453,2.171-3.474,2.97-5.322
|
||||
l1.412,1.019l-0.02-0.015L6.11,10.93L4.724,9.904C6.485,5.831,7.877,2.612,10.5,3.553c0.004,0.002,0.008,0.002,0.013,0.005
|
||||
c0.003-0.001,0.009,0.003,0.013,0.005c2.625,0.97,4.016,5.203,5.775,10.56c0.004,0.011,0.007,0.022,0.011,0.033
|
||||
c0.802,2.437,2.106,6.396,2.968,7.477c0.865-0.453,2.175-3.479,2.976-5.331v0.001c0.001-0.003,0.002-0.006,0.003-0.009
|
||||
c1.759-4.076,3.148-7.297,5.775-6.355c0.004,0.002,0.007,0.002,0.013,0.005c0.004,0.001,0.01,0.003,0.014,0.005
|
||||
c2.614,0.966,4.006,5.176,5.76,10.509c0.006,0.017,0.011,0.032,0.017,0.048l0.009,0.026c0.799,2.43,2.104,6.399,2.969,7.481
|
||||
c0.867-0.453,2.178-3.484,2.979-5.341c0,0,0,0,0-0.001l1.405,1.037l-1.405-1.037c0.003-0.006,0.006-0.012,0.008-0.018l0,0
|
||||
c1.762-4.065,3.152-7.276,5.773-6.333c0.002,0.001,0.005,0.002,0.01,0.004h0.001c0.003,0.001,0.006,0.002,0.008,0.003
|
||||
c2.621,0.964,4.013,5.183,5.769,10.523c0.004,0.013,0.008,0.023,0.012,0.035l0.001,0.004c0.802,2.438,2.11,6.424,2.979,7.504
|
||||
c0.864-0.451,2.172-3.476,2.972-5.326l1.411,1.023l-0.071-0.053l0.043,0.031l-1.367-1.036c1.757-4.06,3.144-7.267,5.761-6.335
|
||||
c0.006,0.002,0.014,0.005,0.02,0.007c0.008,0.003,0.014,0.005,0.02,0.007c2.613,0.973,4,5.18,5.754,10.506
|
||||
c0.006,0.018,0.012,0.033,0.017,0.051c0.801,2.438,2.108,6.424,2.979,7.508c0.868-0.452,2.178-3.484,2.979-5.34
|
||||
c0.002-0.006,0.004-0.011,0.006-0.016l0,0c1.76-4.07,3.148-7.287,5.775-6.338c0.002,0,0.004,0.001,0.007,0.002h0.001l0.001,0.001
|
||||
c0.002,0,0.004,0.001,0.006,0.002c2.625,0.962,4.021,5.199,5.784,10.562c0.004,0.014,0.008,0.024,0.011,0.035
|
||||
c0.804,2.441,2.104,6.396,2.968,7.477c0.868-0.454,2.178-3.485,2.979-5.34c0.29-0.674,1.155-0.749,1.93-0.18
|
||||
c0.776,0.572,1.171,1.58,0.881,2.25c-1.762,4.08-3.153,7.303-5.782,6.354C89.427,50.244,89.425,50.244,89.423,50.243z
|
||||
M23.665,17.328l1.405,1.037L23.665,17.328z M74.863,35.436l1.404,1.037L74.863,35.436z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,194 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Original" display="none">
|
||||
<circle display="inline" cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" fill="#FFFFFF" d="M70.464,39.718c-0.002,0-0.002,0-0.004,0c-0.006-0.002-0.012-0.003-0.017-0.003
|
||||
c-2.013-0.42-2.751-3.039-4.492-10.979c-0.002-0.009-0.004-0.016-0.005-0.024c-0.614-2.793-1.485-6.752-2.235-8.506
|
||||
c-0.751,1.455-1.621,5.067-2.233,7.609l-1.143-0.348l-1.131-0.396c1.745-7.239,2.48-9.554,4.498-9.159c0.002,0,0.006,0,0.008,0.001
|
||||
h0.001h0.001c0.003,0.001,0.005,0.001,0.008,0.002c2.021,0.411,2.756,3.027,4.503,10.982c0.002,0.006,0.004,0.016,0.005,0.022
|
||||
c0.614,2.794,1.483,6.755,2.234,8.506c0.75-1.451,1.618-5.06,2.231-7.6c0.001-0.012,0.003-0.021,0.007-0.034
|
||||
c1.748-7.271,2.485-9.587,4.514-9.182c0.637,0.127,1.153,0.613,1.153,1.088c0,0.376-0.325,0.631-0.776,0.657
|
||||
c-0.821,0.709-1.898,5.186-2.618,8.18l-1.135-0.372l1.135,0.372c-0.001,0-0.001,0-0.001,0c-0.001,0.007-0.003,0.016-0.005,0.022
|
||||
h0.002c-1.74,7.228-2.478,9.548-4.487,9.164C70.476,39.722,70.47,39.72,70.464,39.718z M16.458,28.942c-0.001,0-0.002,0-0.004,0
|
||||
c-0.004-0.002-0.008-0.002-0.012-0.003c-2.013-0.414-2.75-3.023-4.488-10.939c-0.003-0.015-0.008-0.028-0.01-0.043
|
||||
c-0.613-2.795-1.486-6.772-2.239-8.529c-0.752,1.456-1.625,5.081-2.238,7.628l-2.272-0.743c1.745-7.248,2.481-9.57,4.498-9.178
|
||||
c0.005,0,0.01,0.003,0.013,0.002c0.001,0.001,0.007,0.001,0.012,0.003c2.015,0.413,2.752,3.022,4.491,10.94
|
||||
c0.003,0.015,0.007,0.028,0.011,0.043c0.613,2.794,1.485,6.77,2.239,8.528c0.753-1.457,1.625-5.086,2.237-7.636
|
||||
c0.002-0.005,0.003-0.01,0.004-0.015c1.749-7.259,2.483-9.571,4.51-9.167C23.24,9.841,23.27,9.848,23.3,9.856
|
||||
c1.955,0.466,2.695,3.113,4.413,10.937c0.002,0.009,0.004,0.016,0.006,0.023c0.613,2.794,1.485,6.77,2.239,8.527
|
||||
c0.753-1.458,1.626-5.084,2.239-7.634c0-0.001,0-0.001,0-0.002c1.741-7.244,2.479-9.569,4.49-9.185
|
||||
c0.007,0.001,0.012,0.001,0.02,0.004c0.004-0.002,0.015,0.002,0.021,0.003c2.011,0.42,2.747,3.036,4.488,10.964
|
||||
c0.001,0.006,0.002,0.011,0.003,0.016c0.613,2.796,1.486,6.771,2.239,8.527c0.753-1.456,1.626-5.083,2.239-7.633
|
||||
c0.001-0.006,0.003-0.011,0.004-0.016c1.745-7.259,2.482-9.572,4.51-9.167c0.024,0.004,0.048,0.01,0.068,0.015
|
||||
c1.974,0.455,2.712,3.096,4.439,10.956c0.002,0.011,0.004,0.02,0.005,0.028c0.614,2.794,1.484,6.755,2.235,8.51
|
||||
c0.752-1.457,1.624-5.081,2.236-7.629l2.272,0.743c-1.742,7.246-2.479,9.567-4.495,9.179c-0.004,0-0.008-0.001-0.014-0.001
|
||||
c0-0.002-0.01-0.002-0.015-0.004c-2.017-0.416-2.754-3.033-4.496-10.98c-0.002-0.009-0.006-0.019-0.007-0.028
|
||||
c-0.613-2.789-1.482-6.745-2.232-8.497c-0.753,1.457-1.626,5.085-2.239,7.634c-0.001,0.005-0.003,0.01-0.004,0.016
|
||||
c-1.742,7.246-2.48,9.563-4.497,9.17c-0.004-0.003-0.006-0.003-0.01-0.003h-0.001l-0.001-0.001c-0.003,0-0.005,0-0.01-0.002
|
||||
c-2.017-0.411-2.754-3.021-4.497-10.963c0-0.005-0.001-0.01-0.003-0.017l-0.003-0.013c-0.613-2.79-1.485-6.759-2.238-8.515
|
||||
c-0.752,1.456-1.624,5.082-2.237,7.633c0,0,0,0,0,0.001c-1.744,7.247-2.48,9.571-4.494,9.186c-0.006-0.002-0.007,0.002-0.018-0.004
|
||||
c-0.006,0.002-0.012-0.003-0.017-0.003c-2.013-0.418-2.751-3.031-4.49-10.955c-0.002-0.008-0.004-0.016-0.006-0.023
|
||||
c-0.613-2.794-1.485-6.771-2.238-8.526c-0.752,1.455-1.623,5.075-2.236,7.622l0,0c-0.001,0.003-0.003,0.007-0.003,0.01
|
||||
c-1.744,7.252-2.48,9.576-4.497,9.188C16.467,28.944,16.463,28.944,16.458,28.942z M-37.549,18.168c-0.001,0-0.001,0-0.002-0.001
|
||||
c-0.003-0.001-0.005-0.001-0.009-0.002c-2.018-0.411-2.754-3.023-4.499-10.97c-0.002-0.008-0.004-0.016-0.005-0.022
|
||||
c-0.613-2.795-1.484-6.765-2.236-8.519c-0.753,1.456-1.626,5.083-2.24,7.633l-1.136-0.372l1.136,0.372
|
||||
c-0.002,0.008-0.004,0.017-0.007,0.025h0.001c-1.741,7.233-2.477,9.55-4.49,9.162c-0.005,0-0.008-0.002-0.015-0.003
|
||||
c-0.004-0.003-0.01-0.002-0.015-0.003c-2.015-0.415-2.752-3.032-4.498-10.981c-0.001-0.009-0.004-0.018-0.005-0.026
|
||||
c-0.613-2.792-1.482-6.749-2.233-8.499c-0.752,1.456-1.625,5.082-2.238,7.63l0,0c0,0.002-0.001,0.003-0.001,0.004
|
||||
c-1.744,7.25-2.48,9.574-4.497,9.185c-0.005-0.001-0.007-0.003-0.014-0.003c-0.004-0.003-0.01-0.002-0.015-0.003
|
||||
c-2.014-0.415-2.752-3.028-4.493-10.963c-0.001-0.005-0.003-0.011-0.004-0.016l-0.001-0.005c-0.613-2.793-1.486-6.768-2.238-8.523
|
||||
c-0.752,1.457-1.625,5.08-2.237,7.627l-2.273-0.743c1.745-7.249,2.481-9.569,4.498-9.178c0.005,0,0.011,0.001,0.012,0.002
|
||||
c0.003,0,0.009,0.001,0.014,0.002c2.016,0.414,2.753,3.026,4.495,10.964c0.002,0.006,0.003,0.011,0.004,0.017
|
||||
c0.613,2.795,1.486,6.77,2.239,8.528c0.752-1.458,1.625-5.086,2.238-7.635c0.001-0.005,0.002-0.009,0.004-0.014
|
||||
c1.747-7.26,2.482-9.573,4.509-9.168c0.022,0.004,0.044,0.009,0.066,0.014c1.976,0.451,2.715,3.091,4.443,10.964
|
||||
c0.002,0.01,0.004,0.019,0.006,0.028c0.613,2.793,1.483,6.749,2.233,8.502c0.75-1.454,1.621-5.068,2.233-7.609
|
||||
c0.002-0.008,0.004-0.017,0.005-0.025c1.745-7.253,2.483-9.576,4.5-9.185c0.004,0.001,0.008,0.002,0.013,0.002
|
||||
c0,0,0.008,0.002,0.013,0.002c2.017,0.415,2.754,3.031,4.498,10.981c0.002,0.008,0.003,0.015,0.005,0.023
|
||||
c0.613,2.792,1.483,6.753,2.234,8.507c0.753-1.456,1.626-5.085,2.239-7.635c0.001-0.005,0.003-0.01,0.004-0.015
|
||||
c1.746-7.259,2.483-9.572,4.51-9.167c0.031,0.006,0.062,0.014,0.092,0.021c1.955,0.468,2.695,3.115,4.412,10.938
|
||||
c0.002,0.008,0.003,0.015,0.005,0.023c0.613,2.794,1.486,6.77,2.239,8.527c0.751-1.452,1.621-5.062,2.233-7.61
|
||||
c0.002-0.009,0.003-0.017,0.005-0.025c1.746-7.253,2.482-9.575,4.499-9.185c0.004,0,0.007,0,0.013,0.002
|
||||
c-0.002,0,0.007,0.002,0.012,0.003c2.016,0.414,2.752,3.027,4.497,10.97c0.002,0.006,0.004,0.015,0.005,0.021
|
||||
c0.613,2.794,1.484,6.762,2.236,8.517c0.754-1.456,1.626-5.084,2.24-7.634c0.001-0.005,0.001-0.01,0.003-0.015
|
||||
c1.747-7.259,2.483-9.572,4.509-9.168C-3.773,4.45-3.751,4.455-3.729,4.46c1.976,0.45,2.714,3.09,4.442,10.963
|
||||
c0.001,0.002,0.001,0.003,0.001,0.003c0.613,2.796,1.485,6.771,2.239,8.528c0.752-1.454,1.625-5.079,2.238-7.628l2.272,0.743
|
||||
c-1.746,7.252-2.482,9.572-4.5,9.179c-0.003-0.001-0.006-0.001-0.01-0.001c-0.002-0.002-0.006-0.002-0.009-0.004
|
||||
c-2.02-0.41-2.757-3.024-4.501-10.974c0-0.002,0-0.004-0.001-0.005l0-0.005c-0.614-2.793-1.486-6.766-2.239-8.523
|
||||
c-0.753,1.457-1.625,5.085-2.239,7.635c-0.001,0.006-0.002,0.01-0.004,0.015c-1.74,7.236-2.477,9.557-4.491,9.17
|
||||
c-0.006,0-0.012,0.002-0.017-0.003c-0.011,0.001-0.012-0.002-0.017-0.003c-2.015-0.417-2.751-3.037-4.495-10.979
|
||||
c-0.002-0.008-0.003-0.015-0.005-0.022c-0.613-2.79-1.483-6.753-2.234-8.506c-0.75,1.452-1.62,5.061-2.232,7.609
|
||||
c-0.002,0.009-0.004,0.017-0.006,0.025c-1.745,7.25-2.482,9.574-4.498,9.185c-0.004,0-0.008-0.003-0.014-0.002
|
||||
c-0.004-0.003-0.01-0.003-0.015-0.003c-2.015-0.416-2.751-3.027-4.492-10.956c-0.002-0.007-0.003-0.016-0.006-0.022
|
||||
c-0.613-2.795-1.485-6.771-2.238-8.528c-0.752,1.457-1.625,5.084-2.239,7.635c-0.001,0.005-0.003,0.009-0.003,0.014
|
||||
c-1.743,7.245-2.479,9.564-4.499,9.17C-37.543,18.168-37.547,18.168-37.549,18.168z M-62.314,2.853l1.137,0.372L-62.314,2.853z
|
||||
M-78.053,10.083c-0.001,0-0.001,0-0.001,0c-0.001-0.001-0.009-0.001-0.013-0.002c-2.017-0.414-2.753-3.028-4.497-10.973
|
||||
c-0.001-0.005-0.002-0.01-0.004-0.016c-0.613-2.793-1.485-6.763-2.237-8.517c-0.753,1.457-1.625,5.084-2.238,7.634
|
||||
c-0.107,0.446-0.698,0.642-1.331,0.437c-0.628-0.206-1.049-0.733-0.942-1.179c1.749-7.271,2.484-9.587,4.513-9.183
|
||||
c0.031,0.006,0.061,0.013,0.091,0.02c1.957,0.468,2.696,3.118,4.418,10.958c0.001,0.005,0.002,0.01,0.003,0.016
|
||||
c0.613,2.792,1.484,6.76,2.236,8.515c0.752-1.456,1.625-5.081,2.238-7.63l2.272,0.743c-1.744,7.251-2.481,9.572-4.498,9.181
|
||||
C-78.046,10.085-78.049,10.084-78.053,10.083z"/>
|
||||
<path display="inline" fill="#FFFFFF" d="M144.627,63.129c-0.002,0-0.002,0-0.004,0c-0.006-0.002-0.012-0.004-0.017-0.004
|
||||
c-2.012-0.419-2.747-3.033-4.487-10.955c-0.002-0.009-0.003-0.016-0.006-0.023c0-0.002,0-0.003,0-0.003
|
||||
c-0.613-2.795-1.486-6.77-2.239-8.527c-0.749,1.449-1.618,5.052-2.228,7.583h-0.004c-0.001,0.017-0.005,0.032-0.009,0.049
|
||||
c-1.744,7.258-2.48,9.58-4.501,9.186c-0.003-0.001-0.005-0.001-0.009-0.001h-0.001l-0.001-0.003c-0.002,0-0.005,0-0.007-0.001
|
||||
c-2.019-0.41-2.757-3.024-4.504-10.978c-0.003-0.017-0.007-0.033-0.009-0.05c-0.613-2.791-1.481-6.73-2.229-8.478
|
||||
c-0.753,1.456-1.626,5.085-2.241,7.633c-0.001,0.006-0.002,0.011-0.004,0.014c-1.739,7.246-2.478,9.565-4.496,9.171
|
||||
c-0.002-0.001-0.006-0.001-0.009-0.001l-0.001-0.002h-0.002c-0.002,0-0.005,0-0.008-0.002c-2.016-0.411-2.754-3.021-4.499-10.964
|
||||
c-0.001-0.004-0.002-0.01-0.003-0.016l-0.005-0.025c-0.613-2.787-1.483-6.75-2.234-8.504c-0.754,1.457-1.626,5.085-2.24,7.636
|
||||
c0,0.001,0,0.003-0.001,0.003c-1.742,7.241-2.479,9.564-4.489,9.183c-0.008-0.002-0.012-0.002-0.02-0.003
|
||||
c-0.005,0-0.013-0.004-0.019-0.006c-2.014-0.419-2.752-3.033-4.488-10.954c-0.001-0.007-0.004-0.016-0.005-0.022
|
||||
c-0.614-2.795-1.486-6.77-2.24-8.527c-0.752,1.458-1.625,5.086-2.24,7.634c-0.001,0.005-0.002,0.01-0.003,0.015
|
||||
c-1.74,7.247-2.479,9.563-4.497,9.17c-0.003,0-0.006-0.001-0.009-0.001H90.62h-0.001c-0.002,0-0.005-0.003-0.009-0.003
|
||||
c-2.019-0.41-2.755-3.028-4.502-10.981c-0.002-0.009-0.003-0.015-0.006-0.023c-0.613-2.793-1.484-6.755-2.235-8.507
|
||||
c-0.751,1.452-1.622,5.067-2.232,7.61l-0.001-0.002c-0.002,0.008-0.004,0.017-0.006,0.025c-1.744,7.258-2.479,9.58-4.5,9.186
|
||||
c-0.003-0.001-0.006-0.001-0.01-0.001l0,0l-0.001-0.003c-0.002,0-0.007,0-0.008-0.001c-2.021-0.411-2.759-3.021-4.497-10.951
|
||||
c-0.003-0.009-0.006-0.02-0.007-0.026L72.6,38.649c-0.611-2.786-1.482-6.748-2.233-8.502c-0.75,1.454-1.62,5.069-2.232,7.61
|
||||
l-1.143-0.35l0.039,0.013l-0.021-0.005l1.113,0.389c-1.739,7.226-2.476,9.545-4.487,9.163c-0.006-0.002-0.014-0.003-0.019-0.005
|
||||
c-0.007,0-0.013-0.002-0.02-0.004c-2.014-0.419-2.749-3.036-4.488-10.963c-0.001-0.003-0.002-0.009-0.002-0.016
|
||||
c-0.616-2.795-1.488-6.77-2.241-8.528c-0.752,1.457-1.625,5.081-2.239,7.632c0,0,0,0.002-0.001,0.002
|
||||
c-1.74,7.246-2.477,9.571-4.493,9.188c-0.006-0.001-0.013-0.003-0.019-0.006c-0.007,0-0.012-0.002-0.019-0.003
|
||||
c-2.011-0.42-2.747-3.031-4.486-10.951v-0.002c-0.002-0.008-0.004-0.018-0.006-0.023c-0.613-2.795-1.486-6.771-2.239-8.528
|
||||
c-0.753,1.457-1.626,5.085-2.239,7.635c-0.001,0.005-0.002,0.011-0.003,0.015c-1.745,7.246-2.481,9.563-4.5,9.17
|
||||
c-0.002-0.002-0.006-0.002-0.007-0.002h-0.001l-0.002-0.001c-0.003,0-0.006,0-0.008,0c-2.019-0.413-2.754-3.025-4.5-10.972
|
||||
c-0.002-0.007-0.003-0.017-0.005-0.024c-0.612-2.793-1.484-6.762-2.236-8.518c-0.753,1.457-1.627,5.084-2.239,7.635l-1.136-0.372
|
||||
l1.136,0.372c-0.002,0.008-0.005,0.017-0.008,0.025h0.002c-1.741,7.232-2.478,9.549-4.491,9.16c-0.004,0-0.01-0.003-0.015-0.001
|
||||
c-0.006-0.006-0.009-0.004-0.014-0.004c-2.016-0.415-2.752-3.034-4.499-10.981c-0.001-0.009-0.002-0.017-0.004-0.026
|
||||
c-0.613-2.793-1.483-6.749-2.233-8.499c-0.753,1.455-1.625,5.082-2.238,7.63l0,0c-0.001,0.001-0.001,0.003-0.001,0.005
|
||||
c-1.745,7.25-2.481,9.573-4.497,9.185c-0.004-0.001-0.01,0-0.015-0.003c-0.006,0-0.01-0.003-0.015-0.003
|
||||
c-2.014-0.415-2.751-3.029-4.493-10.964C5.102,25.216,5.1,25.21,5.099,25.205l-0.001-0.006c-0.613-2.793-1.485-6.768-2.238-8.523
|
||||
c-0.753,1.456-1.624,5.081-2.237,7.629l-2.273-0.744c1.745-7.248,2.48-9.568,4.497-9.177c0.005,0,0.014,0.003,0.013,0.002
|
||||
c0.005,0.001,0.008,0.002,0.013,0.002c2.016,0.413,2.752,3.026,4.496,10.965c0.001,0.006,0.002,0.011,0.004,0.015
|
||||
c0.613,2.795,1.485,6.773,2.238,8.529c0.753-1.457,1.625-5.085,2.239-7.635c0.001-0.004,0.003-0.009,0.003-0.013
|
||||
c1.748-7.261,2.484-9.574,4.509-9.169c0.023,0.004,0.045,0.009,0.067,0.014c1.977,0.451,2.715,3.09,4.443,10.965
|
||||
c0.003,0.011,0.004,0.019,0.005,0.029c0.613,2.793,1.484,6.748,2.234,8.499c0.751-1.453,1.621-5.067,2.234-7.607
|
||||
c0.001-0.009,0.003-0.017,0.004-0.025c1.746-7.254,2.483-9.575,4.5-9.185c0.005,0.002,0.007,0,0.013,0.002
|
||||
c-0.001-0.002,0.009,0.003,0.013,0.003c2.018,0.414,2.754,3.03,4.499,10.982c0.002,0.007,0.003,0.014,0.004,0.021
|
||||
c0.613,2.79,1.484,6.754,2.235,8.507c0.751-1.455,1.623-5.078,2.236-7.625h0.001c0-0.003,0.001-0.005,0.002-0.009
|
||||
c1.749-7.271,2.484-9.587,4.513-9.183c0.032,0.007,0.063,0.013,0.093,0.021c1.955,0.468,2.694,3.114,4.411,10.938
|
||||
c0.002,0.008,0.004,0.016,0.005,0.021l0.008,0.027c0.61,2.785,1.48,6.748,2.231,8.501c0.755-1.455,1.626-5.082,2.239-7.632
|
||||
c0,0,0.001-0.001,0.001-0.003c1.747-7.257,2.482-9.578,4.501-9.185c0.004,0.002,0.006,0.002,0.01,0.002l0.001,0.001h0.001
|
||||
c0.004,0.001,0.006,0.001,0.009,0.002c2.018,0.411,2.754,3.023,4.498,10.966c0.001,0.007,0.004,0.011,0.005,0.016
|
||||
c0.613,2.794,1.484,6.771,2.238,8.528c0.751-1.454,1.621-5.068,2.233-7.611l1.142,0.347l-0.036-0.011l0.018,0.007l-1.111-0.389
|
||||
c1.746-7.253,2.481-9.565,4.508-9.159c0.023,0.003,0.047,0.008,0.069,0.015c1.97,0.452,2.709,3.09,4.432,10.937
|
||||
c0.004,0.011,0.007,0.02,0.008,0.028c0.613,2.797,1.484,6.773,2.239,8.53c0.753-1.456,1.626-5.087,2.238-7.637
|
||||
c0.002-0.009,0.003-0.017,0.006-0.023l0,0c1.743-7.24,2.479-9.555,4.498-9.161c0.002,0.002,0.005,0.002,0.007,0.002h0.001h0.003
|
||||
c0.002,0.001,0.004,0.001,0.008,0.003c2.019,0.411,2.755,3.026,4.502,10.98c0.003,0.009,0.004,0.017,0.005,0.023
|
||||
c0.614,2.795,1.484,6.755,2.235,8.507c0.753-1.454,1.625-5.085,2.237-7.634c0.002-0.006,0.004-0.01,0.005-0.015
|
||||
c1.746-7.26,2.484-9.571,4.51-9.167c0.03,0.005,0.061,0.013,0.09,0.02c1.955,0.467,2.696,3.112,4.415,10.938
|
||||
c0.003,0.009,0.005,0.018,0.006,0.023c0.612,2.796,1.483,6.769,2.238,8.528c0.752-1.458,1.625-5.083,2.238-7.629
|
||||
c0-0.002,0-0.004,0.002-0.005c1.74-7.246,2.477-9.571,4.491-9.188c0.007,0.003,0.012,0.001,0.02,0.005
|
||||
c0.006,0,0.013,0.002,0.019,0.003c2.012,0.419,2.747,3.033,4.487,10.954c0.001,0.003,0.001,0.005,0.002,0.008
|
||||
c0.001,0.006,0.002,0.012,0.003,0.017c0.615,2.795,1.486,6.771,2.24,8.528c0.753-1.457,1.625-5.085,2.238-7.634
|
||||
c0.001-0.004,0.002-0.009,0.004-0.014c1.747-7.26,2.483-9.572,4.51-9.168c0.023,0.004,0.047,0.01,0.07,0.015
|
||||
c1.973,0.454,2.712,3.097,4.44,10.968c0.003,0.018,0.007,0.033,0.009,0.047c0.613,2.792,1.481,6.73,2.229,8.479
|
||||
c0.753-1.458,1.625-5.085,2.239-7.636l0,0l1.135,0.372l-1.135-0.372c0.003-0.016,0.007-0.033,0.014-0.049h-0.004
|
||||
c1.744-7.219,2.478-9.528,4.492-9.136c0.002,0.002,0.007,0.002,0.009,0.002h0.001l0.001,0.002c0.003,0,0.006,0,0.009,0.002
|
||||
c2.019,0.41,2.754,3.026,4.502,10.979c0.002,0.009,0.003,0.017,0.006,0.025c0,0.002,0,0.002,0,0.002
|
||||
c0.612,2.785,1.482,6.748,2.233,8.504c0.751-1.455,1.621-5.07,2.233-7.612l0,0c0.002-0.006,0.004-0.014,0.007-0.022
|
||||
c1.744-7.271,2.481-9.588,4.513-9.182c0.638,0.126,1.152,0.613,1.152,1.087c0,0.376-0.324,0.631-0.775,0.657
|
||||
c-0.823,0.709-1.899,5.188-2.618,8.181c-0.001,0.007-0.005,0.016-0.006,0.022h0.001c-1.741,7.228-2.478,9.548-4.487,9.164
|
||||
C144.639,63.13,144.633,63.13,144.627,63.129z M39.988,32.022l1.136,0.372L39.988,32.022z M11.849,26.263l1.137,0.371
|
||||
L11.849,26.263z M-3.89,33.494c0,0-0.001-0.002-0.001-0.002c0.001,0.002-0.008-0.002-0.013-0.002
|
||||
c-2.017-0.414-2.753-3.027-4.498-10.973c-0.001-0.006-0.001-0.011-0.003-0.017c-0.613-2.792-1.485-6.762-2.237-8.517
|
||||
c-0.753,1.457-1.625,5.085-2.239,7.634c-0.107,0.447-0.7,0.645-1.331,0.437c-0.627-0.205-1.048-0.731-0.942-1.178
|
||||
c1.749-7.271,2.485-9.589,4.514-9.184c0.031,0.007,0.061,0.014,0.091,0.021c1.957,0.467,2.697,3.118,4.418,10.958
|
||||
c0.001,0.006,0.002,0.011,0.004,0.016c0.613,2.792,1.484,6.76,2.236,8.515c0.752-1.456,1.624-5.081,2.237-7.63l2.273,0.743
|
||||
c-1.745,7.251-2.48,9.571-4.498,9.181C-3.882,33.494-3.885,33.494-3.89,33.494z"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M38.945,23.334c-0.613-2.79-1.485-6.759-2.238-8.515c-0.752,1.456-1.624,5.082-2.237,7.633c0,0,0,0,0,0.001
|
||||
c-0.391,1.622-0.729,2.984-1.044,4.138c0.288,1.193,0.598,2.567,0.948,4.166c0.002,0.007,0.003,0.014,0.004,0.021
|
||||
c0.613,2.79,1.484,6.754,2.235,8.507c0.751-1.455,1.623-5.078,2.236-7.625h0.001c0-0.003,0.001-0.005,0.002-0.009
|
||||
c0.39-1.622,0.729-2.984,1.043-4.138c-0.287-1.189-0.595-2.558-0.944-4.15c0-0.005-0.001-0.01-0.003-0.017L38.945,23.334z"/>
|
||||
<path d="M5.092,16.735c0.033-0.136,0.067-0.279,0.099-0.409l2.272,0.743c-0.389,1.617-0.727,2.977-1.042,4.128
|
||||
c0.288,1.19,0.596,2.561,0.946,4.155c0.001,0.006,0.002,0.011,0.004,0.015c0.613,2.795,1.485,6.773,2.238,8.529
|
||||
c0.753-1.457,1.625-5.085,2.239-7.635c0.001-0.004,0.003-0.009,0.003-0.013c0.389-1.615,0.726-2.973,1.04-4.124
|
||||
c-0.285-1.183-0.592-2.544-0.939-4.125c-0.003-0.015-0.008-0.028-0.01-0.043c-0.613-2.795-1.486-6.772-2.239-8.529
|
||||
c-0.752,1.456-1.625,5.081-2.238,7.628l-2.272-0.743c1.745-7.248,2.481-9.57,4.498-9.178c0.005,0,0.01,0.003,0.013,0.002
|
||||
c0.001,0.001,0.007,0.001,0.012,0.003c2.015,0.413,2.752,3.022,4.491,10.94c0.003,0.015,0.007,0.028,0.011,0.043
|
||||
c0.012,0.053,0.025,0.113,0.037,0.167c0.584-1.045,1.223-1.387,2.107-1.21c0.023,0.004,0.045,0.009,0.067,0.014
|
||||
c0.913,0.208,1.562,0.894,2.166,2.337c0.033-0.137,0.068-0.282,0.1-0.414c0.002-0.005,0.003-0.01,0.004-0.015
|
||||
c1.749-7.259,2.483-9.571,4.51-9.167c0.031,0.006,0.06,0.013,0.09,0.021c1.955,0.466,2.694,3.113,4.412,10.937
|
||||
c0.002,0.009,0.003,0.016,0.005,0.023c0.012,0.053,0.022,0.113,0.034,0.168c0.581-1.04,1.21-1.385,2.087-1.215
|
||||
c0.005,0.002-0.005,0,0.001,0.002c-0.001-0.002-0.016,0.003-0.012,0.003c0.941,0.193,1.555,0.878,2.172,2.353
|
||||
C32.031,21.989,32,21.843,32,21.71c0-0.001,0-0.001,0-0.002c2-7.244,2.577-9.569,4.589-9.185c0.007,0.001,0.11,0.001,0.118,0.004
|
||||
c0.004-0.002,0.015,0.002,0.021,0.003c2.011,0.42,2.747,3.036,4.488,10.964c0.001,0.006,0.002,0.011,0.003,0.016
|
||||
c0.012,0.054,0.025,0.115,0.037,0.17c0.585-1.045,1.224-1.387,2.108-1.211c0.032,0.007,0.063,0.013,0.093,0.021
|
||||
c0.899,0.215,1.541,0.901,2.14,2.331c0.033-0.138,0.068-0.284,0.101-0.417c0.001-0.006,0.003-0.011,0.004-0.016
|
||||
c0.377-1.566,0.705-2.889,1.011-4.018C44.973,9.393,35.469,1,24,1C14.707,1,6.707,6.514,3.079,14.446
|
||||
C3.911,14.694,4.523,15.375,5.092,16.735z"/>
|
||||
<path d="M42.244,27.984c0.402,1.631,0.824,3.142,1.215,4.053c0.359-0.695,0.746-1.892,1.119-3.224
|
||||
c-0.402-1.632-0.824-3.143-1.215-4.054C43.004,25.456,42.617,26.652,42.244,27.984z"/>
|
||||
<path d="M28.742,25.288c0.402,1.632,0.824,3.144,1.216,4.056c0.359-0.696,0.747-1.893,1.12-3.226
|
||||
c-0.402-1.632-0.825-3.144-1.216-4.056C29.503,22.759,29.115,23.956,28.742,25.288z"/>
|
||||
<path d="M4.074,20.726c-0.402-1.63-0.824-3.139-1.214-4.05c-0.36,0.697-0.748,1.896-1.121,3.23
|
||||
c0.401,1.629,0.823,3.137,1.214,4.048C3.313,23.258,3.7,22.06,4.074,20.726z"/>
|
||||
<path d="M23.207,12.127c-0.752,1.455-1.623,5.075-2.236,7.622c-0.001,0.003-0.003,0.007-0.003,0.01
|
||||
c-0.39,1.622-0.728,2.984-1.043,4.138c0.288,1.192,0.597,2.564,0.947,4.162c0.003,0.011,0.004,0.019,0.005,0.029
|
||||
c0.613,2.793,1.484,6.748,2.234,8.499c0.751-1.453,1.621-5.067,2.234-7.607c0.001-0.009,0.003-0.017,0.004-0.025
|
||||
c0.391-1.622,0.729-2.984,1.044-4.137c-0.286-1.187-0.594-2.552-0.942-4.14c-0.002-0.008-0.004-0.016-0.006-0.023
|
||||
C24.832,17.859,23.96,13.883,23.207,12.127z"/>
|
||||
<path d="M43.47,34.332c-0.004-0.003-0.006-0.002-0.01-0.002l-0.001,0.001h-0.001c-0.003,0-0.005,0.004-0.01,0.002
|
||||
c-0.943-0.192-1.605-0.869-2.223-2.344c-0.034,0.139-0.069,0.298-0.102,0.432c-0.001,0.005-0.002,0.037-0.003,0.041
|
||||
c-1.745,7.246-2.289,9.616-4.307,9.223C36.813,41.683,37,41.789,37,41.789V42h-0.389c-0.003,0-0.006,0-0.008,0
|
||||
c-2.019-1-2.754-3.236-4.5-11.183c-0.002-0.007-0.003-0.228-0.005-0.235c-0.011-0.05-0.023-0.104-0.034-0.154
|
||||
c-0.58,1.036-1.214,1.388-2.089,1.22c-0.006-0.002-0.007,0.011-0.018,0.005c-0.006,0.002-0.012,0.014-0.017,0.014
|
||||
c-0.94-0.195-1.602-0.845-2.218-2.316c-0.033,0.139-0.068,0.354-0.101,0.486C27.621,29.844,27.618,30,27.615,30h0.002
|
||||
c-1.741,7-2.478,9.41-4.491,9.021c-0.004,0-0.01-0.141-0.015-0.139c-0.006-0.006-0.009-0.003-0.014-0.003
|
||||
c-2.016-0.415-2.752-3.032-4.499-10.979c-0.001-0.009-0.002-0.014-0.004-0.023c-0.01-0.045-0.021-0.087-0.031-0.132
|
||||
c-0.581,1.039-1.215,1.399-2.092,1.229C16.467,28.973,16.463,29,16.458,29c-0.001,0-0.002,0-0.004,0
|
||||
c-0.004,0-0.008-0.031-0.012-0.032c-0.941-0.193-1.603-0.906-2.219-2.378c-0.033,0.137-0.067,0.28-0.099,0.411
|
||||
c-0.001,0.001-0.001,0.002-0.001,0.004c-1.745,7.25-2.481,9.572-4.497,9.184c-0.004-0.001-0.01-0.002-0.015-0.005
|
||||
c-0.006,0-0.01-0.007-0.015-0.007c-2.014-0.415-2.751-3.037-4.493-10.972C5.102,25.2,5.1,25.179,5.099,25.174l-0.001-0.037
|
||||
c-0.012-0.053-0.025-0.175-0.037-0.229C4.479,25.95,3.843,26,2.963,26c-0.003,0-0.006,0-0.01,0c-0.002,0-0.02,0.121-0.023,0.119
|
||||
c-0.783-0.159-1.382-0.58-1.916-1.558C1.314,37.005,11.486,47,24,47c9.046,0,16.868-5.225,20.624-12.818
|
||||
C44.284,34.374,43.907,34.417,43.47,34.332z"/>
|
||||
<path d="M15.241,22.597c0.402,1.632,0.825,3.144,1.216,4.056c0.36-0.696,0.747-1.894,1.119-3.227
|
||||
c-0.402-1.632-0.824-3.143-1.215-4.054C16.001,20.067,15.614,21.264,15.241,22.597z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
|
||||
<text transform="matrix(1 0 0 1 9.8389 32.5723)" display="inline" fill="#FFFFFF" font-family="'PalatinoLinotype-BoldItalic'" font-size="34">fx</text>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<path d="M41,1H7C3.688,1,1,3.687,1,7v34c0,3.313,2.688,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M18.538,18.776
|
||||
l-1.295,5.761c-0.531,2.369-1.052,4.46-1.561,6.275c-0.675,2.435-1.336,4.28-1.984,5.537c-0.647,1.256-1.469,2.385-2.465,3.387
|
||||
c-0.996,1.001-1.893,1.69-2.689,2.066c-0.498,0.232-0.974,0.349-1.428,0.349c-0.398,0-0.819-0.1-1.262-0.299
|
||||
c0.531-1.372,0.896-2.601,1.096-3.686l0.531-0.1c0.432,1.007,0.985,1.511,1.66,1.511c0.232,0,0.457-0.059,0.672-0.174
|
||||
c0.216-0.117,0.417-0.308,0.606-0.573c0.188-0.266,0.423-0.946,0.706-2.042s0.623-2.695,1.021-4.798l1.229-6.425l1.295-6.79
|
||||
c-0.631-0.022-1.135-0.033-1.511-0.033c-0.576,0-1.085,0.011-1.527,0.033l-0.116-0.149l0.116-0.598l0.183-0.183
|
||||
c0.254-0.088,0.758-0.243,1.511-0.465c0.752-0.221,1.333-0.426,1.743-0.614c0.033-0.077,0.105-0.382,0.216-0.913
|
||||
c0.188-0.819,0.354-1.408,0.498-1.768c0.144-0.359,0.393-0.755,0.747-1.187c0.354-0.432,1.001-1.046,1.942-1.843
|
||||
c0.94-0.797,1.812-1.48,2.615-2.05c0.802-0.57,1.405-0.932,1.81-1.087c0.404-0.155,0.849-0.232,1.336-0.232
|
||||
c0.52,0,1.018,0.094,1.494,0.282c-0.432,1.472-0.747,2.905-0.946,4.3l-0.498,0.116c-0.853-1.306-1.705-1.959-2.557-1.959
|
||||
c-0.31,0-0.601,0.097-0.872,0.291c-0.271,0.194-0.481,0.454-0.631,0.78c-0.149,0.327-0.363,1.06-0.639,2.2
|
||||
c-0.277,1.14-0.509,2.252-0.697,3.337h0.382c0.221,0,0.838-0.027,1.851-0.083c1.013-0.055,1.674-0.116,1.984-0.183l0.166,0.266
|
||||
c-0.232,0.631-0.393,1.157-0.481,1.577l-0.183,0.166c-0.388-0.022-1.151-0.033-2.291-0.033
|
||||
C19.396,18.743,18.804,18.754,18.538,18.776z M37.364,20.403l-0.714,0.133l-0.315-0.946c-0.232-0.11-0.448-0.166-0.647-0.166
|
||||
c-0.598,0-1.195,0.269-1.793,0.805c-0.598,0.537-1.483,1.658-2.656,3.362c0.343,2.258,0.642,3.833,0.896,4.724
|
||||
s0.515,1.475,0.78,1.751s0.537,0.415,0.813,0.415c0.498,0,1.345-0.515,2.54-1.544l0.199,0.017l0.382,0.614l-0.033,0.199
|
||||
c-1.937,1.693-3.201,2.703-3.794,3.03c-0.592,0.326-1.109,0.489-1.552,0.489c-0.509,0-0.969-0.199-1.378-0.598
|
||||
s-0.705-0.94-0.889-1.627c-0.182-0.687-0.423-2.003-0.722-3.951c-1.295,1.882-2.216,3.157-2.765,3.827
|
||||
c-0.547,0.669-0.995,1.164-1.344,1.485c-0.349,0.321-0.687,0.545-1.013,0.673c-0.327,0.127-0.667,0.19-1.021,0.19
|
||||
c-0.222,0-0.396-0.02-0.523-0.058c-0.127-0.039-0.435-0.169-0.921-0.391c0.177-0.487,0.321-1.106,0.432-1.859
|
||||
c0.11-0.753,0.166-1.192,0.166-1.32c0-0.127-0.006-0.251-0.017-0.373l0.83-0.083l0.199,1.063c0.332,0.133,0.625,0.199,0.88,0.199
|
||||
c0.387,0,0.808-0.142,1.262-0.423c0.454-0.283,1.096-0.966,1.926-2.051c0.83-1.084,1.367-1.82,1.61-2.208
|
||||
c-0.343-2.059-0.606-3.505-0.788-4.341c-0.184-0.835-0.449-1.383-0.797-1.644c-0.35-0.26-0.689-0.39-1.021-0.39
|
||||
c-0.421,0-0.853,0.144-1.295,0.432c-0.443,0.288-0.775,0.637-0.996,1.046l-0.199,0.066l-0.548-0.315l-0.033-0.183
|
||||
c1.106-1.749,1.749-2.883,1.926-3.403c0.886-0.454,1.721-0.681,2.507-0.681c1.052,0,1.849,0.285,2.391,0.855
|
||||
c0.542,0.57,0.907,1.201,1.096,1.893c0.188,0.692,0.371,1.729,0.548,3.113c1.594-2.335,2.676-3.791,3.245-4.366
|
||||
c0.57-0.575,1.077-0.963,1.52-1.162s0.863-0.299,1.262-0.299c0.321,0,0.703,0.089,1.146,0.266
|
||||
C37.757,17.609,37.497,18.854,37.364,20.403z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<polyline display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" points="-22,12.5 24.5,12.5 24.5,32.5 62,32.5 "/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M27,10v20h20V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v3H27z"/>
|
||||
<path d="M22,35V15H1v26c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6v-6H22z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 954 B |
@@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<circle display="inline" cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path id="full_sin_2_" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-4.64,16.94
|
||||
c1.398,3.74,2.795,7.481,4.388,7.481 M4.129,16.94c-1.397,3.739-2.793,7.481-4.386,7.481 M4.128,16.94
|
||||
c1.397-3.74,2.795-7.481,4.387-7.481 M12.896,16.941C11.5,13.2,10.104,9.459,8.511,9.459 M12.896,16.942
|
||||
c1.398,3.741,2.795,7.481,4.385,7.481 M21.665,16.942c-1.398,3.741-2.795,7.481-4.387,7.481 M21.665,16.943
|
||||
c1.396-3.741,2.792-7.481,4.385-7.481 M30.432,16.943c-1.396-3.741-2.793-7.481-4.386-7.481 M30.432,16.941
|
||||
c1.397,3.74,2.793,7.481,4.387,7.481 M39.197,16.941c-1.396,3.74-2.793,7.481-4.387,7.481 M39.197,16.941
|
||||
c1.398-3.74,2.796-7.48,4.387-7.48 M47.966,16.942c-1.396-3.741-2.794-7.481-4.385-7.481 M47.966,16.941
|
||||
c1.396,3.74,2.793,7.481,4.39,7.481 M56.732,16.941c-1.396,3.74-2.791,7.481-4.385,7.481 M56.732,16.942
|
||||
c1.398-3.741,2.793-7.481,4.388-7.481 M65.501,16.942c-1.397-3.741-2.793-7.481-4.388-7.481 M65.501,16.94
|
||||
c1.396,3.74,2.793,7.481,4.388,7.481 M74.27,16.94c-1.396,3.739-2.793,7.481-4.386,7.481 M74.27,16.94
|
||||
c1.396-3.74,2.791-7.481,4.385-7.481 M83.038,16.941c-1.397-3.741-2.797-7.482-4.388-7.482 M83.038,16.942
|
||||
c1.396,3.741,2.795,7.481,4.385,7.481 M91.807,16.942c-1.396,3.741-2.795,7.481-4.386,7.481"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M2.705,16.465c0.006-0.017,0.012-0.033,0.018-0.05c1.761-4.714,3.153-8.439,5.775-8.456c0.006,0,0.01,0.001,0.015,0
|
||||
c0.003,0.001,0.01,0,0.015,0c2.623,0.017,4.014,3.742,5.773,8.456c0.004,0.01,0.007,0.02,0.011,0.03
|
||||
c0.803,2.147,2.106,5.629,2.969,6.396c0.866-0.769,2.177-4.275,2.979-6.421h0c0,0,0-0.001,0-0.001
|
||||
c1.76-4.716,3.15-8.442,5.775-8.457c0.004,0,0.007,0,0.013,0c0.004,0,0.009,0,0.013,0c2.616,0.014,4.007,3.717,5.76,8.412
|
||||
c0.006,0.014,0.011,0.028,0.017,0.042l0.006,0.015c0.8,2.141,2.106,5.639,2.972,6.408c0.867-0.77,2.176-4.276,2.978-6.421
|
||||
c0.001-0.003,0.002-0.007,0.003-0.01c1.763-4.712,3.155-8.436,5.778-8.446c0.002,0,0.005,0,0.01,0h0.001c0.003,0,0.006,0,0.008,0
|
||||
c1.41,0.005,2.463,1.087,3.408,2.811V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7v13.725C1.614,19.38,2.242,17.704,2.705,16.465z"
|
||||
/>
|
||||
<path d="M46.572,17.496c-0.004-0.01-0.008-0.02-0.012-0.03c-0.801-2.146-2.109-5.654-2.978-6.423
|
||||
c-0.866,0.768-2.176,4.271-2.978,6.415c-0.001,0.003-0.002,0.006-0.004,0.009c-1.757,4.706-3.146,8.427-5.761,8.455
|
||||
c-0.009,0-0.018,0.002-0.026,0c-0.01,0.001-0.018,0-0.026,0c-2.607-0.028-3.995-3.728-5.745-8.411
|
||||
c-0.006-0.014-0.011-0.029-0.017-0.043c-0.802-2.146-2.111-5.656-2.979-6.424c-0.867,0.768-2.176,4.277-2.978,6.424
|
||||
c-0.004,0.01-0.008,0.021-0.012,0.031c-1.757,4.701-3.148,8.412-5.767,8.425c-0.004,0-0.006-0.001-0.012,0
|
||||
c-0.006-0.001-0.009,0-0.012,0c-2.622-0.013-4.014-3.738-5.775-8.453c-0.004-0.01-0.008-0.021-0.011-0.031
|
||||
c-0.802-2.149-2.104-5.633-2.968-6.398c-0.867,0.768-2.178,4.277-2.98,6.423c0,0,0,0,0,0c-0.002,0.004-0.003,0.009-0.005,0.013
|
||||
h0.001C4.071,21.382,2.864,24.6,1,25.596V41c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V18.637
|
||||
C46.859,18.263,46.717,17.885,46.572,17.496z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<g id="Layer_1">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"
|
||||
/>
|
||||
<g display="inline">
|
||||
<rect x="5" y="10.828" fill="#FFFFFF" width="4.673" height="21.398"/>
|
||||
<rect x="10.404" y="10.828" fill="#FFFFFF" width="4.674" height="21.398"/>
|
||||
<rect x="15.81" y="10.828" fill="#FFFFFF" width="4.673" height="21.398"/>
|
||||
<rect x="21.215" y="10.828" fill="#FFFFFF" width="4.673" height="21.398"/>
|
||||
<rect x="8.417" y="10.828" width="3.243" height="12.333"/>
|
||||
<rect x="13.823" y="10.828" width="3.243" height="12.333"/>
|
||||
<rect x="26.619" y="10.828" fill="#FFFFFF" width="4.673" height="21.398"/>
|
||||
<rect x="19.227" y="10.828" width="3.244" height="12.333"/>
|
||||
<rect x="32.023" y="10.828" fill="#FFFFFF" width="4.674" height="21.398"/>
|
||||
<rect x="30.036" y="10.828" width="3.243" height="12.333"/>
|
||||
<rect x="37.429" y="10.828" fill="#FFFFFF" width="4.673" height="21.398"/>
|
||||
<rect x="35.441" y="10.828" width="3.243" height="12.333"/>
|
||||
</g>
|
||||
</g>
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M5,32.227V10.828
|
||||
h3.417V23.5h1.256v8.727H5z M10.404,32.227V23.5h1.256V10.828h2.163V23.5h1.256v8.727H10.404z M15.81,32.227V23.5h1.256V10.828
|
||||
h2.162V23.5h1.255v8.727H15.81z M25.888,32.227h-4.673V23.5h1.256V10.828h3.417V32.227z M26.619,32.227V10.828h3.417V23.5h1.256
|
||||
v8.727H26.619z M32.023,32.227V23.5h1.256V10.828h2.162V23.5h1.256v8.727H32.023z M42.102,32.227h-4.673V23.5h1.256V10.828h3.417
|
||||
V32.227z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<polyline display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" points="5.5,53.25 24,12.5 65.5,12.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M22.389,10H47V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7v34c0,2.853,1.994,5.236,4.662,5.845L22.389,10z"/>
|
||||
<path d="M25.61,15L11.083,47H41c3.313,0,6-2.688,6-6V15H25.61z"/>
|
||||
</g>
|
||||
<path d="M109,15"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 982 B |
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="6" d="M24,9.328c0,4.971-4.029,9-9,9H-0.605
|
||||
c-4.971,0-9-4.029-9-9V-9.328c0-4.971,4.029-9,9-9H15c4.971,0,9,4.029,9,9V9.328z"/>
|
||||
<path display="inline" fill="none" stroke="#FFFFFF" stroke-width="6" d="M24,57.328c0,4.971-4.029,9-9,9H-0.605
|
||||
c-4.971,0-9-4.029-9-9V38.672c0-4.971,4.029-9,9-9H15c4.971,0,9,4.029,9,9V57.328z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M41,1H28v8.328c0,6.617-5.383,12-12,12H1v5.344h15c6.617,0,12,5.383,12,12V47h13c3.313,0,6-2.688,6-6V7
|
||||
C47,3.687,44.313,1,41,1z"/>
|
||||
<path d="M16,32.672H1V41c0,3.313,2.687,6,6,6h15v-8.328C22,35.363,19.309,32.672,16,32.672z"/>
|
||||
<path d="M22,9.328V1H7C3.687,1,1,3.687,1,7v8.328h15C19.309,15.328,22,12.636,22,9.328z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<g display="inline">
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" x1="11.5" y1="29" x2="11.5" y2="38.5"/>
|
||||
<circle fill="#FFFFFF" cx="11.5" cy="13.5" r="2.5"/>
|
||||
<circle fill="#FFFFFF" cx="11.5" cy="20.5" r="2.5"/>
|
||||
</g>
|
||||
<g display="inline">
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" x1="21.5" y1="29" x2="21.5" y2="38.5"/>
|
||||
<circle fill="#FFFFFF" cx="21.5" cy="13.5" r="2.5"/>
|
||||
<circle fill="#FFFFFF" cx="21.5" cy="20.5" r="2.5"/>
|
||||
</g>
|
||||
<g display="inline">
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round" x1="31.5" y1="29" x2="31.5" y2="38.5"/>
|
||||
<circle fill="#FFFFFF" cx="31.5" cy="13.5" r="2.5"/>
|
||||
<circle fill="#FFFFFF" cx="31.5" cy="20.5" r="2.5"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Compound">
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M14,38.5
|
||||
c0,1.381-1.119,2.5-2.5,2.5S9,39.881,9,38.5V29c0-1.381,1.119-2.5,2.5-2.5S14,27.619,14,29V38.5z M11.5,23
|
||||
C10.119,23,9,21.88,9,20.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S12.881,23,11.5,23z M11.5,16C10.119,16,9,14.88,9,13.5
|
||||
s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S12.881,16,11.5,16z M24,38.5c0,1.381-1.119,2.5-2.5,2.5S19,39.881,19,38.5V29
|
||||
c0-1.381,1.119-2.5,2.5-2.5S24,27.619,24,29V38.5z M21.5,23c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5
|
||||
S22.881,23,21.5,23z M21.5,16c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S22.881,16,21.5,16z M34,38.5
|
||||
c0,1.381-1.119,2.5-2.5,2.5S29,39.881,29,38.5V29c0-1.381,1.119-2.5,2.5-2.5S34,27.619,34,29V38.5z M31.5,23
|
||||
c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S32.881,23,31.5,23z M31.5,16c-1.381,0-2.5-1.12-2.5-2.5
|
||||
s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S32.881,16,31.5,16z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<circle cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path id="full_sin_1_" display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-12.638,28.917
|
||||
M-12.64,28.914c1.498,5.253,2.994,10.507,4.7,10.507 M-3.248,28.914c-1.497,5.251-2.992,10.507-4.698,10.507 M-3.249,28.914
|
||||
c1.497-5.253,2.994-10.507,4.699-10.507 M6.143,28.915c-1.495-5.254-2.991-10.508-4.697-10.508 M6.143,28.917
|
||||
c1.498,5.254,2.994,10.507,4.696,10.507 M15.536,28.917c-1.498,5.254-2.994,10.507-4.699,10.507 M15.536,28.918
|
||||
c1.495-5.254,2.99-10.507,4.697-10.507 M24.926,28.918c-1.497-5.254-2.993-10.507-4.698-10.507 M24.926,28.915
|
||||
c1.496,5.253,2.99,10.508,4.697,10.508 M34.314,28.915c-1.495,5.253-2.99,10.508-4.697,10.508 M34.314,28.915
|
||||
c1.499-5.252,2.994-10.505,4.698-10.505 M43.706,28.917c-1.495-5.254-2.992-10.507-4.696-10.507 M43.706,28.915
|
||||
c1.496,5.253,2.992,10.508,4.701,10.508 M53.098,28.915c-1.496,5.253-2.99,10.508-4.697,10.508 M53.098,28.917
|
||||
c1.498-5.254,2.991-10.507,4.698-10.507 M62.488,28.917C60.99,23.663,59.497,18.41,57.79,18.41 M62.488,28.914
|
||||
c1.494,5.253,2.991,10.507,4.698,10.507 M71.879,28.914c-1.493,5.251-2.991,10.507-4.696,10.507 M71.879,28.914
|
||||
c1.496-5.253,2.99-10.507,4.697-10.507 M81.272,28.915c-1.498-5.254-2.996-10.508-4.698-10.508 M81.272,28.917
|
||||
c1.496,5.254,2.993,10.507,4.696,10.507 M90.663,28.917c-1.495,5.254-2.993,10.507-4.696,10.507 M90.663,28.918"/>
|
||||
<path id="full_sin_2_" display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-3.998,19.851
|
||||
M-4,19.848c1.498,5.253,2.994,10.508,4.7,10.508 M5.392,19.848C3.896,25.1,2.4,30.355,0.694,30.355 M5.391,19.848
|
||||
C6.888,14.595,8.385,9.341,10.09,9.341 M14.782,19.849c-1.495-5.254-2.991-10.508-4.697-10.508 M14.782,19.851
|
||||
c1.498,5.254,2.994,10.507,4.696,10.507 M24.176,19.851c-1.498,5.254-2.994,10.507-4.699,10.507 M24.176,19.852
|
||||
c1.494-5.254,2.99-10.507,4.695-10.507 M33.564,19.852c-1.496-5.254-2.992-10.507-4.697-10.507 M33.564,19.849
|
||||
c1.498,5.252,2.992,10.506,4.699,10.506 M42.953,19.849c-1.494,5.252-2.99,10.506-4.697,10.506 M42.953,19.849
|
||||
c1.5-5.253,2.996-10.506,4.699-10.506 M52.346,19.851C50.85,14.596,49.354,9.343,47.65,9.343 M52.346,19.849
|
||||
c1.496,5.252,2.992,10.506,4.701,10.506 M61.736,19.849c-1.494,5.252-2.988,10.506-4.695,10.506 M61.736,19.851
|
||||
c1.498-5.254,2.992-10.507,4.699-10.507 M71.129,19.851c-1.498-5.254-2.992-10.507-4.699-10.507 M71.129,19.848
|
||||
c1.492,5.253,2.99,10.508,4.697,10.508 M80.52,19.848c-1.494,5.252-2.992,10.508-4.697,10.508 M80.52,19.848
|
||||
c1.496-5.253,2.988-10.507,4.695-10.507 M89.912,19.849c-1.498-5.254-2.996-10.508-4.699-10.508 M89.912,19.851
|
||||
c1.496,5.254,2.994,10.507,4.697,10.507 M99.303,19.851c-1.496,5.254-2.992,10.507-4.695,10.507 M99.303,19.852"/>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<path d="M32.137,20.311c-0.006-0.016-0.011-0.032-0.015-0.048c-0.858-3.013-2.245-7.882-3.253-9.208
|
||||
c-1.01,1.325-2.394,6.195-3.251,9.207c-0.003,0.012-0.006,0.023-0.01,0.035c-0.293,1.029-0.569,1.985-0.835,2.88
|
||||
c0.492,1.501,1.004,3.257,1.581,5.28c0.005,0.016,0.01,0.031,0.014,0.047l0.007,0.023c0.855,3.005,2.239,7.861,3.245,9.185
|
||||
c1.008-1.325,2.394-6.191,3.25-9.202l2.239,0.637c-0.006-0.01-0.011-0.021-0.017-0.031l-0.778-0.2l-1.432-0.449
|
||||
c0.293-1.027,0.569-1.982,0.835-2.877C33.225,24.089,32.714,22.333,32.137,20.311z"/>
|
||||
<path d="M36.87,25.533c0.485,1.389,0.97,2.558,1.39,3.11c0.64-0.841,1.43-3.104,2.141-5.415c-0.484-1.389-0.969-2.557-1.389-3.108
|
||||
C38.373,20.96,37.582,23.225,36.87,25.533z"/>
|
||||
<path d="M1.433,17c0.005,0,0.009,0,0.015,0c0.009,0,0.011,0,0.015,0c1.069,0,1.911,0.599,2.674,1.826
|
||||
c2.052-7.168,3.316-10.967,5.936-10.984c0.004,0,0.007,0.004,0.015,0.001c0.007,0.003,0.01,0.003,0.015,0.002
|
||||
c2.702,0.017,3.959,3.999,6.123,11.604c0.003,0.011,0.006,0.033,0.009,0.044c0.109,0.383,0.227,0.818,0.351,1.249
|
||||
C17.616,18.25,18.683,17,20.213,17c0.006,0,0.011,0,0.017,0c0.007,0,0.012,0,0.017,0c1.069,0,1.911,0.68,2.673,1.909
|
||||
C24.969,11.737,26.232,8,28.855,8c0.005,0,0.009,0,0.014,0s0.009,0,0.014,0c2.694,0,3.953,3.901,6.11,11.475
|
||||
c0.005,0.015,0.01-0.042,0.014-0.026l0.012,0.051c0.108,0.381,0.226,0.814,0.35,1.243C36.401,18.247,37.469,17,39.001,17
|
||||
c0.004,0,0.011,0,0.01,0c0.005,0,0.007,0,0.011,0c1.071,0,1.915,0.675,2.679,1.903c1.88-6.559,3.102-10.227,5.3-10.811V7
|
||||
c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v10.046C1.142,17.022,1.283,17,1.433,17z"/>
|
||||
<path d="M44.396,20.26c-0.296,1.041-0.574,2.006-0.842,2.91c0.493,1.504,1.006,3.266,1.584,5.296
|
||||
c0.004,0.013,0.008,0.025,0.011,0.038l0.002,0.006c0.497,1.747,1.173,4.115,1.85,6.058V12.255
|
||||
c-0.894,2.018-1.911,5.579-2.595,7.97C44.402,20.236,44.399,20.248,44.396,20.26z"/>
|
||||
<path d="M1.448,20.117C1.306,20.305,1.155,20.571,1,20.885v7.27c0.576-1.054,1.235-2.969,1.838-4.927
|
||||
C2.353,21.838,1.868,20.669,1.448,20.117z"/>
|
||||
<path d="M4.602,19.619c0.003,0.007,0.007,0.014,0.011,0.021l0.778,0.208l-0.015-0.004l0.003,0.001L4.602,19.619z"/>
|
||||
<path d="M18.089,25.536c0.485,1.391,0.97,2.56,1.389,3.111c0.639-0.84,1.43-3.103,2.142-5.414
|
||||
c-0.485-1.391-0.971-2.56-1.391-3.112C19.59,20.961,18.8,23.225,18.089,25.536z"/>
|
||||
<path d="M42.275,29.424c-0.004-0.014-0.009-0.047-0.012-0.061c-0.111-0.392-0.232-0.779-0.359-1.223
|
||||
C40.876,30.627,39.812,32,38.286,32c-0.009,0-0.019,0-0.026,0c-0.011,0-0.019,0-0.026,0c-1.064,0-1.903-0.722-2.663-1.947
|
||||
c-2.049,7.167-3.313,10.85-5.93,10.871c-0.007,0-0.013,0.003-0.021,0.001c-0.006,0.002-0.014,0.003-0.021,0.003
|
||||
c-2.691-0.022-3.947-3.977-6.102-11.543c-0.005-0.016-0.01-0.022-0.014-0.038l-0.002,0.011c-0.111-0.391-0.231-0.776-0.359-1.217
|
||||
C22.088,30.64,21.02,32,19.484,32c-0.002,0-0.004,0-0.006,0c-0.003,0-0.005,0-0.006,0c-1.073,0-1.917-0.674-2.681-1.905
|
||||
C14.734,37.272,13.471,41,10.844,41c-0.001,0-0.003,0-0.005,0c-0.001,0-0.001,0-0.002,0c-0.002,0-0.004,0-0.005,0
|
||||
c-2.703,0-3.96-4-6.128-11.605c-0.004-0.012-0.007-0.046-0.011-0.059c-0.109-0.385-0.228-0.763-0.352-1.195
|
||||
C3.376,30.472,2.376,31.804,1,31.967V41c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6v-0.422
|
||||
C45.185,39.368,44.025,35.57,42.275,29.424z"/>
|
||||
<path d="M7.585,28.505c0.003,0.013,0.007,0.025,0.01,0.038c0.858,3.011,2.239,7.85,3.243,9.171
|
||||
c1.006-1.323,2.392-6.183,3.249-9.188h0c0.001-0.006,0.003-0.012,0.005-0.018c0.296-1.042,0.575-2.009,0.843-2.914
|
||||
c-0.496-1.511-1.012-3.28-1.593-5.321c-0.003-0.012-0.006-0.023-0.009-0.035c-0.857-3.015-2.239-7.865-3.246-9.187
|
||||
c-1.008,1.325-2.395,6.19-3.252,9.2l-1.444-0.404l0.053,0.015l-0.041-0.012l1.424,0.431c-0.294,1.032-0.571,1.992-0.837,2.889
|
||||
C6.487,24.686,7.003,26.459,7.585,28.505z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 7.0 KiB |
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M19.996,38.5
|
||||
c0,1.381-1.119,2.5-2.5,2.5s-2.5-1.119-2.5-2.5V8.984c0-1.381,1.119-2.5,2.5-2.5s2.5,1.119,2.5,2.5V38.5z M17.496,28.019
|
||||
c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S18.877,28.019,17.496,28.019z M29.996,38.5
|
||||
c0,1.381-1.119,2.5-2.5,2.5s-2.5-1.119-2.5-2.5V8.984c0-1.381,1.119-2.5,2.5-2.5s2.5,1.119,2.5,2.5V38.5z M37.504,31.021
|
||||
c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S38.885,31.021,37.504,31.021z M40.004,38.5
|
||||
c0,1.381-1.119,2.5-2.5,2.5s-2.5-1.119-2.5-2.5V8.984c0-1.381,1.119-2.5,2.5-2.5s2.5,1.119,2.5,2.5V38.5z M27.496,23.016
|
||||
c-1.381,0-2.5-1.12-2.5-2.5s1.119-2.5,2.5-2.5s2.5,1.12,2.5,2.5S28.877,23.016,27.496,23.016z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1_1_" display="none">
|
||||
<circle cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path id="full_sin_2_" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" d="M-4.64,16.94
|
||||
c1.398,3.74,2.795,7.481,4.388,7.481 M4.129,16.94c-1.397,3.739-2.793,7.481-4.386,7.481 M4.128,16.94
|
||||
c1.397-3.74,2.795-7.481,4.387-7.481 M12.896,16.941C11.5,13.2,10.104,9.459,8.511,9.459 M12.896,16.942
|
||||
c1.398,3.741,2.795,7.481,4.385,7.481 M21.665,16.942c-1.398,3.741-2.795,7.481-4.387,7.481 M21.665,16.943
|
||||
c1.396-3.741,2.792-7.481,4.385-7.481 M30.432,16.943c-1.396-3.741-2.793-7.481-4.386-7.481 M30.432,16.941
|
||||
c1.397,3.74,2.793,7.481,4.387,7.481 M39.197,16.941c-1.396,3.74-2.793,7.481-4.387,7.481 M39.197,16.941
|
||||
c1.398-3.74,2.796-7.48,4.387-7.48 M47.966,16.942c-1.396-3.741-2.794-7.481-4.385-7.481 M47.966,16.941
|
||||
c1.396,3.74,2.793,7.481,4.39,7.481 M56.732,16.941c-1.396,3.74-2.791,7.481-4.385,7.481 M56.732,16.942
|
||||
c1.398-3.741,2.793-7.481,4.388-7.481 M65.501,16.942c-1.397-3.741-2.793-7.481-4.388-7.481 M65.501,16.94
|
||||
c1.396,3.74,2.793,7.481,4.388,7.481 M74.27,16.94c-1.396,3.739-2.793,7.481-4.386,7.481 M74.27,16.94
|
||||
c1.396-3.74,2.791-7.481,4.385-7.481 M83.038,16.941c-1.397-3.741-2.797-7.482-4.388-7.482 M83.038,16.942
|
||||
c1.396,3.741,2.795,7.481,4.385,7.481 M91.807,16.942c-1.396,3.741-2.795,7.481-4.386,7.481"/>
|
||||
<polyline id="Saw" display="inline" fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" points="-6.75,27.423
|
||||
8.747,12.459 8.747,27.402 23.467,12.462 23.467,27.423 38.316,12.459 38.316,27 54.096,12.459 53.385,27.423 69.167,12.459 "/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M10.247,8.925v14.817l14.72-14.94v14.979l14.85-14.964v14.76L47,16.958V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7
|
||||
v10.854L10.247,8.925z"/>
|
||||
<path d="M36.816,30.422V16.1L21.967,31.064V16.122L7.247,31.062V15.993L1,22.024V41c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6
|
||||
V21.038L36.816,30.422z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,44 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="48px"
|
||||
height="48px"
|
||||
viewBox="0 0 48 48"
|
||||
enable-background="new 0 0 48 48"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="fx_multiband_eq.svg"
|
||||
inkscape:version="1.4.3 (1:1.4.3+202512261035+0d15f75042)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs1" /><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="17.75"
|
||||
inkscape:cy="23.34375"
|
||||
inkscape:window-width="2192"
|
||||
inkscape:window-height="1161"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" />
|
||||
|
||||
<path
|
||||
id="path1"
|
||||
style="display:inline"
|
||||
d="M 7,47 C 3.687,47 1,44.313 1,41 V 26.449219 h 6.9863281 c 3.4778329,0 4.5452949,0.863465 5.6289059,2.421875 1.083611,1.55841 1.841011,4.189524 3.126954,7.115234 0.414273,0.942222 1.373242,1.525093 2.40039,1.458984 1.0274,-0.06636 1.903735,-0.767895 2.19336,-1.755859 0.665691,-2.267781 1.974127,-6.82443 4.236328,-10.693359 2.262201,-3.86893 5.126754,-6.712891 9.136718,-6.712891 h 0.002 l 12.285156,-0.05078 -0.01953,-4.900391 -12.287109,0.05078 c -6.324566,0.02448 -10.662115,4.549066 -13.345703,9.138672 -1.12249,1.919738 -1.901359,3.854631 -2.609375,5.683594 C 18.383581,27.490279 18.117026,26.762101 17.63872,26.074219 15.837793,23.484191 12.594172,21.550781 7.9863761,21.550781 H 1 V 7 C 1,3.687 3.687,1 7,1 h 34 c 3.313,0 6,2.688 6,6 v 34 c 0,3.313 -2.687,6 -6,6 z"
|
||||
sodipodi:nodetypes="sscsscccssccccscsscsssssss" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Original" display="none">
|
||||
<circle display="inline" cx="24" cy="23.999" r="23"/>
|
||||
|
||||
<ellipse transform="matrix(0.9257 -0.3782 0.3782 0.9257 -6.8006 11.0334)" display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" cx="24.693" cy="22.832" rx="8.86" ry="12.838"/>
|
||||
<line display="inline" fill="none" stroke="#FFFFFF" stroke-width="5" x1="35.209" y1="-0.569" x2="13.625" y2="48.241"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M28.602,32.402c1.899-0.775,2.621-2.884,2.882-4.072c0.517-2.352,0.188-5.232-0.903-7.903
|
||||
c-0.302-0.739-0.646-1.417-1.017-2.049l-5.817,13.155c1.183,0.759,2.367,1.15,3.388,1.15
|
||||
C27.652,32.684,28.146,32.589,28.602,32.402z"/>
|
||||
<path d="M20.783,13.264c-1.898,0.775-2.62,2.884-2.881,4.071c-0.517,2.352-0.188,5.232,0.903,7.902
|
||||
c0.354,0.866,0.763,1.655,1.208,2.373l5.883-13.304c-1.268-0.873-2.551-1.323-3.647-1.323
|
||||
C21.733,12.983,21.24,13.077,20.783,13.264z"/>
|
||||
<path d="M35.807,4.261l-3.896,8.812c1.318,1.549,2.452,3.392,3.299,5.464c1.486,3.64,1.898,7.499,1.158,10.867
|
||||
c-0.803,3.65-2.943,6.431-5.875,7.628c-1.059,0.433-2.188,0.652-3.357,0.652c-1.847,0-3.696-0.549-5.431-1.532l-4.363,9.866
|
||||
C19.45,46.654,21.684,47,24,47c12.703,0,23-10.297,23-23.001C47,15.613,42.511,8.279,35.807,4.261z"/>
|
||||
<path d="M17.699,32.847c-1.414-1.601-2.628-3.531-3.522-5.719c-1.486-3.639-1.898-7.498-1.158-10.866
|
||||
c0.802-3.65,2.942-6.43,5.874-7.627c1.059-0.433,2.189-0.652,3.358-0.652c1.942,0,3.889,0.598,5.701,1.68l3.311-7.486
|
||||
C28.979,1.417,26.538,1,24,1C11.297,1,1,11.296,1,23.999c0,8.612,4.736,16.114,11.742,20.056L17.699,32.847z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<line display="inline" stroke="#FFFFFF" stroke-width="4" x1="-2.085" y1="35.585" x2="51.918" y2="35.585"/>
|
||||
<g display="inline">
|
||||
<line x1="-3.085" y1="17.585" x2="50.918" y2="17.585"/>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="4" x1="-3.085" y1="17.585" x2="-0.585" y2="17.585"/>
|
||||
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="4" stroke-dasharray="5.0003,4.0003" x1="3.415" y1="17.585" x2="46.418" y2="17.585"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="4" x1="48.418" y1="17.585" x2="50.918" y2="17.585"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Compound">
|
||||
<g>
|
||||
<path d="M47,33.585V7c0-3.313-2.688-6-6-6H7C3.687,1,1,3.687,1,7v26.585H47z M39.418,15.585h5v4h-5V15.585z M30.417,15.585h5v4h-5
|
||||
V15.585z M21.417,15.585h5v4h-5V15.585z M12.416,15.585h5v4h-5V15.585z M3.415,15.585h5v4h-5V15.585z"/>
|
||||
<path d="M1,37.585V41c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6v-3.415H1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Combined">
|
||||
<path d="M35.819,27C34.863,32.666,29.935,37,24,37c-4.43,0-8.298-2.419-10.376-6h5.103c1.41,1.24,3.253,2,5.274,2
|
||||
c4.411,0,8-3.589,8-8s-3.589-8-8-8c-2.021,0-3.864,0.759-5.274,2h-5.103c2.079-3.581,5.947-6,10.376-6
|
||||
c5.935,0,10.862,4.334,11.819,10H47V7c0-3.313-2.687-6-6-6H7C3.687,1,1,3.687,1,7v16h18.799c0.75-1.572,2.342-2.667,4.201-2.667
|
||||
c2.577,0,4.667,2.089,4.667,4.667c0,2.577-2.09,4.667-4.667,4.667c-1.858,0-3.45-1.095-4.201-2.667H1v14c0,3.313,2.687,6,6,6h34
|
||||
c3.313,0,6-2.687,6-6V27H35.819z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 900 B |
@@ -1,57 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<circle cx="24" cy="23.999" r="23"/>
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<g display="inline">
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="9.938" cy="59.874" r="10.865"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="9.938" cy="59.874" r="25.055"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="9.938" cy="59.874" r="37.472"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="9.938" cy="60.761" r="52.327"/>
|
||||
</g>
|
||||
<g display="inline">
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="50.938" cy="46.874" r="10.865"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="50.938" cy="46.874" r="25.055"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="50.938" cy="46.874" r="37.472"/>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" cx="50.938" cy="47.761" r="52.327"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<path d="M43.872,40.746c0.706,1.248,1.34,2.542,1.908,3.869C46.542,43.609,47,42.359,47,41v-2.618
|
||||
C45.798,38.944,44.733,39.755,43.872,40.746z"/>
|
||||
<path d="M34.719,29.817c2.885,2.382,5.421,5.171,7.522,8.277c1.326-1.313,2.952-2.32,4.759-2.931V26.06
|
||||
c-0.636-0.679-1.277-1.352-1.949-1.995C41.114,25.081,37.578,27.097,34.719,29.817z"/>
|
||||
<path d="M28.225,40.646c1.944,1.851,3.607,3.993,4.924,6.354h5.429c-0.001-0.042-0.005-0.084-0.005-0.126
|
||||
c0-2.287,0.635-4.423,1.722-6.263c-2.072-3.253-4.646-6.156-7.622-8.59C30.634,34.523,29.102,37.45,28.225,40.646z"/>
|
||||
<path d="M9.938,36.319c-3.144,0-6.144,0.624-8.889,1.747C1.03,38.161,1.018,38.259,1,38.354V41c0,3.313,2.687,6,6,6h4.969
|
||||
c0-0.042-0.003-0.084-0.003-0.126c0-3.566,0.491-7.019,1.393-10.304C12.241,36.407,11.1,36.319,9.938,36.319z"/>
|
||||
<path d="M24.383,46.874c0-1.773,0.178-3.506,0.512-5.184c-2.49-2.051-5.409-3.596-8.596-4.491
|
||||
c-0.862,3.08-1.333,6.323-1.333,9.675c0,0.042,0.003,0.084,0.003,0.126h9.417C24.386,46.958,24.383,46.916,24.383,46.874z"/>
|
||||
<path d="M45.951,20.795c0.347-0.066,0.697-0.123,1.049-0.175v-9.5c-3.709,0.408-7.249,1.382-10.535,2.832
|
||||
C39.874,15.893,43.058,18.185,45.951,20.795z"/>
|
||||
<path d="M42.103,43.797c-0.338,0.966-0.53,1.998-0.53,3.077c0,0.033,0.006,0.064,0.006,0.097c0.615-0.059,1.203-0.209,1.749-0.439
|
||||
C42.954,45.602,42.55,44.688,42.103,43.797z"/>
|
||||
<path d="M27.534,44.238c-0.097,0.866-0.151,1.744-0.151,2.636c0,0.042,0.006,0.084,0.006,0.126h2.236
|
||||
C28.989,46.032,28.301,45.101,27.534,44.238z"/>
|
||||
<path d="M33.163,12.209C37.389,10.034,42.061,8.618,47,8.116V7c0-3.313-2.687-6-6-6h-9.932c-4.141,1.77-8.006,4.064-11.5,6.813
|
||||
C24.346,8.681,28.911,10.167,33.163,12.209z"/>
|
||||
<path d="M7.774,20.965c0.716-0.04,1.437-0.063,2.163-0.063c3.709,0,7.295,0.532,10.696,1.504c2.637-3.26,5.789-6.083,9.331-8.354
|
||||
c-4.212-1.813-8.716-3.062-13.419-3.675C13.167,13.487,10.214,17.05,7.774,20.965z"/>
|
||||
<path d="M1,10.736v11.208c1.008-0.237,2.029-0.442,3.065-0.6c2.35-4.152,5.228-7.965,8.554-11.339
|
||||
c-0.888-0.046-1.782-0.072-2.682-0.072C6.887,9.934,3.904,10.219,1,10.736z"/>
|
||||
<path d="M9.938,6.934c1.904,0,3.785,0.103,5.639,0.297c2.699-2.358,5.641-4.441,8.771-6.23H7C3.687,1,1,3.687,1,7v0.689
|
||||
C3.909,7.201,6.892,6.934,9.938,6.934z"/>
|
||||
<path d="M5.96,24.127c-1.736,3.29-3.122,6.79-4.107,10.455c2.551-0.817,5.266-1.263,8.084-1.263c1.476,0,2.921,0.127,4.333,0.359
|
||||
c1.118-3.097,2.616-6.013,4.439-8.69c-2.809-0.707-5.747-1.086-8.772-1.086C8.593,23.902,7.267,23.982,5.96,24.127z"/>
|
||||
<path d="M1,27.711c0.406-1.01,0.834-2.007,1.299-2.985C1.863,24.821,1.431,24.927,1,25.038V27.711z"/>
|
||||
<path d="M17.221,34.344c3.104,0.887,5.979,2.319,8.508,4.197c1.013-3.056,2.563-5.866,4.544-8.318
|
||||
c-2.617-1.8-5.482-3.259-8.533-4.322C19.881,28.482,18.351,31.314,17.221,34.344z"/>
|
||||
<path d="M23.699,23.419c3.07,1.163,5.954,2.704,8.599,4.564c2.834-2.797,6.292-4.958,10.145-6.262
|
||||
c-2.834-2.364-5.933-4.417-9.237-6.126C29.603,17.646,26.389,20.299,23.699,23.419z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.6 KiB |
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<text transform="matrix(1 0 0 1 8.8398 22.1665)" display="inline" fill="#FFFFFF" font-family="'MyriadPro-Bold'" font-size="24">0</text>
|
||||
|
||||
<text transform="matrix(1 0 0 1 24.8398 22.1665)" display="inline" fill="#FFFFFF" font-family="'MyriadPro-Bold'" font-size="24">1</text>
|
||||
<text transform="matrix(1 0 0 1 25.3398 41.166)" display="inline" fill="#FFFFFF" font-family="'MyriadPro-Bold'" font-size="24">0</text>
|
||||
<text transform="matrix(1 0 0 1 8.3398 41.166)" display="inline" fill="#FFFFFF" font-family="'MyriadPro-Bold'" font-size="24">1</text>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<g>
|
||||
<path d="M32.013,28.062c-1.345,0-2.257,1.704-2.232,5.328c-0.024,3.577,0.84,5.28,2.256,5.28s2.185-1.775,2.185-5.328
|
||||
C34.221,29.886,33.477,28.062,32.013,28.062z"/>
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6V7C47,3.687,44.313,1,41,1z M31.009,7H34v15
|
||||
h-3V10h-0.544l-2.976,1.428L26.88,8.703L31.009,7z M18,41h-4V29h-0.044l-2.976,1.428l-0.601-2.725L14.509,26H18V41z M15.44,22.431
|
||||
c-4.032,0-5.809-3.625-5.833-8.041c0-4.512,1.921-8.088,5.953-8.088c4.176,0,5.809,3.72,5.809,7.993
|
||||
C21.369,19.118,19.425,22.431,15.44,22.431z M31.94,41.431c-4.032,0-5.809-3.624-5.833-8.041c0-4.513,1.921-8.089,5.953-8.089
|
||||
c4.176,0,5.809,3.721,5.809,7.993C37.869,38.118,35.925,41.431,31.94,41.431z"/>
|
||||
<path d="M15.513,9.062c-1.345,0-2.257,1.704-2.232,5.328c-0.024,3.577,0.84,5.281,2.256,5.281s2.185-1.776,2.185-5.329
|
||||
C17.721,10.886,16.977,9.062,15.513,9.062z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<g display="inline">
|
||||
<line x1="24" y1="24" x2="31.413" y2="11.541"/>
|
||||
<g>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="24" y1="24" x2="28.11" y2="17.091"/>
|
||||
<g>
|
||||
<polygon fill="#FFFFFF" points="31.296,20.515 31.413,11.541 23.583,15.925 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<circle display="inline" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" cx="24" cy="24" r="15.928"/>
|
||||
</g>
|
||||
<g id="Compound">
|
||||
<g>
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M24,40.928
|
||||
c-9.334,0-16.928-7.594-16.928-16.928S14.666,7.072,24,7.072S40.928,14.666,40.928,24S33.334,40.928,24,40.928z"/>
|
||||
<path d="M24,9.072C15.769,9.072,9.072,15.769,9.072,24c0,8.231,6.697,14.928,14.928,14.928c8.231,0,14.928-6.696,14.928-14.928
|
||||
C38.928,15.769,32.231,9.072,24,9.072z M31.296,20.515l-2.568-1.528l-4.205,7.069l-2.579-1.533l4.206-7.07l-2.567-1.527
|
||||
l7.831-4.384L31.296,20.515z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="x">
|
||||
</g>
|
||||
<g id="Layer_1">
|
||||
<path d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="10.167" y1="32.584" x2="38.584" y2="32.584"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="12.5" y1="32.584" x2="12.5" y2="12"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="20.5" y1="32.584" x2="20.5" y2="19"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="28.5" y1="32.584" x2="28.5" y2="15"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="square" x1="36.5" y1="32.584" x2="36.5" y2="23"/>
|
||||
</g>
|
||||
<g id="Compound" display="none">
|
||||
<g display="inline">
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z M24,40.928
|
||||
c-9.334,0-16.928-7.594-16.928-16.928S14.666,7.072,24,7.072S40.928,14.666,40.928,24S33.334,40.928,24,40.928z"/>
|
||||
<path d="M24,9.072C15.769,9.072,9.072,15.769,9.072,24c0,8.231,6.697,14.928,14.928,14.928c8.231,0,14.928-6.696,14.928-14.928
|
||||
C38.928,15.769,32.231,9.072,24,9.072z M31.296,20.515l-2.568-1.528l-4.205,7.069l-2.579-1.533l4.206-7.07l-2.567-1.527
|
||||
l7.831-4.384L31.296,20.515z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" fill="#004000" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34
|
||||
c3.313,0,6,2.687,6,6V41z"/>
|
||||
<text transform="matrix(1 0 0 1 11.7305 36.5205)" display="inline" fill="#FFFFFF" font-family="'Roboto-Black'" font-size="36">A</text>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<polygon fill="#004000" points="21.223,26.976 26.725,26.976 23.965,18.099 "/>
|
||||
<path fill="#004000" d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z
|
||||
M29.695,36.521l-1.494-4.781h-8.455l-1.477,4.781h-6.592l9.387-25.594h5.801l9.457,25.594H29.695z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" fill="#8A0000" d="M47,41c0,3.313-2.688,6-6,6H7c-3.313,0-6-2.688-6-6V7c0-3.313,2.687-6,6-6h34
|
||||
c3.313,0,6,2.687,6,6V41z"/>
|
||||
<text transform="matrix(1 0 0 1 12.3809 36.5205)" display="inline" fill="#FFFFFF" font-family="'Roboto-Black'" font-size="36">B</text>
|
||||
</g>
|
||||
<g id="Composed">
|
||||
<g>
|
||||
<path fill="#8A0000" d="M24.809,25.64h-4.324v6.135h4.043c1.113,0,1.969-0.255,2.566-0.765s0.896-1.228,0.896-2.153
|
||||
C27.99,26.724,26.93,25.651,24.809,25.64z"/>
|
||||
<path fill="#8A0000" d="M26.584,20.856c0.574-0.482,0.861-1.193,0.861-2.133c0-1.082-0.311-1.86-0.932-2.336
|
||||
c-0.621-0.476-1.623-0.714-3.006-0.714h-3.023v5.924h3.217C25.049,21.585,26.01,21.338,26.584,20.856z"/>
|
||||
<path fill="#8A0000" d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.688,6-6V7C47,3.687,44.313,1,41,1z
|
||||
M31.761,34.596c-1.588,1.26-3.94,1.901-7.058,1.925H14.314V10.927h9.193c3.293,0,5.798,0.604,7.515,1.811
|
||||
s2.575,2.959,2.575,5.256c0,1.324-0.305,2.455-0.914,3.393s-1.506,1.629-2.689,2.074c1.336,0.352,2.361,1.008,3.076,1.969
|
||||
s1.072,2.133,1.072,3.516C34.143,31.452,33.349,33.336,31.761,34.596z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<circle cx="24" cy="24" r="14"/>
|
||||
<path display="none" fill="none" stroke="#000000" stroke-width="3" d="M45.5,39.392c0,3.098-2.011,6.108-5.108,6.108H8.609
|
||||
c-3.098,0-6.109-3.011-6.109-6.108V7.609C2.5,4.511,5.511,2.5,8.609,2.5h31.783c3.098,0,5.108,2.011,5.108,5.109V39.392z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 755 B |
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="48px"
|
||||
height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
|
||||
<g id="Layer_1" display="none">
|
||||
<path display="inline" d="M47,41c0,3.313-2.687,6-6,6H7c-3.313,0-6-2.687-6-6V7c0-3.313,2.687-6,6-6h34c3.313,0,6,2.687,6,6V41z"/>
|
||||
<path display="inline" fill="#FFFFFF" d="M37.636,33.571L25.244,21.105c1.226-3.152,0.545-6.849-2.042-9.453
|
||||
c-2.723-2.739-6.808-3.288-10.075-1.78l5.855,5.89l-4.085,4.11l-5.992-5.891c-1.633,3.287-0.952,7.397,1.771,10.136
|
||||
c2.586,2.603,6.263,3.289,9.394,2.055L32.461,38.64c0.545,0.547,1.362,0.547,1.906,0l3.131-3.15
|
||||
C38.18,34.94,38.18,33.981,37.636,33.571z"/>
|
||||
</g>
|
||||
<g id="Combined">
|
||||
<path d="M41,1H7C3.687,1,1,3.687,1,7v34c0,3.313,2.687,6,6,6h34c3.313,0,6-2.687,6-6V7C47,3.687,44.313,1,41,1z M37.498,35.489
|
||||
l-3.131,3.15c-0.544,0.547-1.361,0.547-1.906,0L20.07,26.173c-3.131,1.233-6.808,0.548-9.394-2.055
|
||||
c-2.723-2.739-3.404-6.849-1.771-10.136l5.992,5.891l4.085-4.11l-5.855-5.89c3.267-1.507,7.352-0.959,10.075,1.78
|
||||
c2.587,2.604,3.268,6.301,2.042,9.453l12.392,12.466C38.18,33.981,38.18,34.94,37.498,35.489z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||
<path d="M18.993,8.993L18.99,5c0-1.1-0.891-2-1.99-2h-4h-3H6C4.9,3,4.01,3.9,4.01,5L4.007,8.993L4,9v10c0,1.1,0.891,2,1.99,2H6h11
|
||||
h0.01c1.1,0,1.99-0.9,1.99-2V9L18.993,8.993z M17,10v9H6v-9V5h5h1h5V10z"/>
|
||||
<rect x="8" y="7" width="2" height="2"/>
|
||||
<rect x="12" y="7" width="3" height="2"/>
|
||||
<rect x="8" y="11" width="2" height="2"/>
|
||||
<rect x="12" y="11" width="3" height="2"/>
|
||||
<rect x="8" y="15" width="2" height="2"/>
|
||||
<rect x="12" y="15" width="3" height="2"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 939 B |
|
Before Width: | Height: | Size: 870 KiB |
@@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="249px" height="64px" viewBox="0 0 249 64" enable-background="new 0 0 249 64" xml:space="preserve">
|
||||
<path fill="#FFFFFF" stroke="#231F20" stroke-width="2" stroke-miterlimit="10" d="M204,35.183c0,7.907-6.41,14.317-14.317,14.317
|
||||
H79.317C71.41,49.5,65,43.09,65,35.183v-0.365C65,26.91,71.41,20.5,79.317,20.5h110.365C197.59,20.5,204,26.91,204,34.817V35.183z"
|
||||
/>
|
||||
<circle fill="#BE1E2D" cx="80.767" cy="33.983" r="9.634"/>
|
||||
<g>
|
||||
<path d="M94.364,24.717h7.509c2.534,0,4.56,0.571,6.077,1.713c1.642,1.231,2.463,3.003,2.463,5.314
|
||||
c0,2.409-0.866,4.327-2.597,5.755c-1.642,1.348-3.748,2.021-6.318,2.021H96.84v4.149h-2.476V24.717z M101.833,37.271
|
||||
c1.821,0,3.257-0.455,4.31-1.365c1.098-0.945,1.646-2.279,1.646-4.002c0-1.65-0.616-2.909-1.847-3.774
|
||||
c-1.106-0.776-2.592-1.165-4.457-1.165H96.84v10.307H101.833z"/>
|
||||
<path d="M116.972,24.783c0,0.5-0.152,0.901-0.455,1.205c-0.303,0.303-0.705,0.455-1.205,0.455s-0.901-0.152-1.205-0.455
|
||||
c-0.303-0.304-0.455-0.705-0.455-1.205c0-0.499,0.152-0.898,0.455-1.198c0.303-0.299,0.705-0.448,1.205-0.448
|
||||
s0.901,0.149,1.205,0.448C116.82,23.885,116.972,24.284,116.972,24.783z M114.041,30.285h2.543V43.67h-2.543V30.285z"/>
|
||||
<path d="M121.509,24.717h7.508c2.535,0,4.561,0.571,6.078,1.713c1.641,1.231,2.463,3.003,2.463,5.314
|
||||
c0,2.409-0.865,4.327-2.598,5.755c-1.641,1.348-3.748,2.021-6.316,2.021h-4.659v4.149h-2.476V24.717z M128.979,37.271
|
||||
c1.82,0,3.256-0.455,4.311-1.365c1.098-0.945,1.646-2.279,1.646-4.002c0-1.65-0.617-2.909-1.848-3.774
|
||||
c-1.107-0.776-2.592-1.165-4.457-1.165h-4.646v10.307H128.979z"/>
|
||||
<path d="M151.833,33.25c0.272,0.718,0.409,1.475,0.409,2.269s-0.09,1.727-0.269,2.797h-9.315c0.196,1.08,0.633,1.93,1.312,2.55
|
||||
c0.678,0.621,1.638,0.931,2.878,0.931c1.659,0,3.181-0.303,4.564-0.91l0.428,1.914c-0.919,0.535-2.23,0.888-3.935,1.058
|
||||
c-0.474,0.054-1.089,0.08-1.848,0.08s-1.553-0.151-2.383-0.455c-0.829-0.303-1.517-0.749-2.061-1.339
|
||||
c-1.08-1.168-1.62-2.882-1.62-5.14c0-1.98,0.647-3.641,1.941-4.979c1.312-1.338,2.948-2.008,4.912-2.008
|
||||
c1.615,0,2.904,0.482,3.868,1.446C151.188,31.936,151.562,32.531,151.833,33.25z M149.819,36.349l0.053-0.724
|
||||
c0-1.633-0.611-2.717-1.833-3.252c-0.411-0.179-0.901-0.268-1.473-0.268s-1.096,0.111-1.573,0.334
|
||||
c-0.477,0.224-0.89,0.527-1.237,0.91c-0.715,0.785-1.116,1.785-1.205,2.999H149.819z"/>
|
||||
<path d="M165.722,42.398c-1.259,1.026-2.775,1.539-4.552,1.539c-1.918,0-3.467-0.634-4.645-1.9
|
||||
c-1.151-1.231-1.727-2.829-1.727-4.792c0-2.133,0.839-3.891,2.517-5.273c1.598-1.303,3.542-1.955,5.836-1.955
|
||||
c0.901,0,1.687,0.067,2.355,0.201v-7.442h2.544V43.67h-1.941L165.722,42.398z M165.507,32.479
|
||||
c-0.937-0.214-1.798-0.321-2.583-0.321s-1.518,0.112-2.195,0.335c-0.678,0.224-1.268,0.545-1.767,0.964
|
||||
c-1.08,0.91-1.62,2.119-1.62,3.627c0,1.321,0.349,2.423,1.044,3.307c0.741,0.937,1.728,1.405,2.959,1.405
|
||||
c1.392,0,2.543-0.348,3.453-1.044c0.285-0.223,0.521-0.481,0.709-0.776V32.479z"/>
|
||||
<path d="M181.716,41.957c-1.633,1.32-3.351,1.98-5.153,1.98c-1.258,0-2.315-0.33-3.172-0.99c-0.919-0.714-1.379-1.646-1.379-2.798
|
||||
c0-2.373,1.579-3.957,4.738-4.752c1.276-0.321,2.807-0.499,4.592-0.535c-0.054-1.454-0.764-2.311-2.129-2.57
|
||||
c-0.446-0.089-0.865-0.134-1.258-0.134s-0.741,0.019-1.044,0.054c-0.304,0.036-0.616,0.085-0.938,0.147
|
||||
c-0.705,0.134-1.303,0.299-1.793,0.495l-0.71-1.9c1.249-0.625,2.758-0.938,4.524-0.938c2.757,0,4.573,0.88,5.447,2.638
|
||||
c0.295,0.606,0.442,1.329,0.442,2.168v4.27c0,0.91,0.066,1.518,0.2,1.82c0.241,0.581,0.665,0.951,1.271,1.111l-0.374,1.646
|
||||
C183.313,43.866,182.225,43.295,181.716,41.957z M176.904,37.492c-0.835,0.317-1.435,0.665-1.801,1.045
|
||||
c-0.365,0.379-0.549,0.787-0.549,1.225s0.063,0.77,0.188,0.997s0.29,0.417,0.495,0.568c0.42,0.313,0.91,0.469,1.473,0.469
|
||||
s1.068-0.061,1.52-0.181c0.45-0.12,0.867-0.278,1.251-0.476c0.75-0.374,1.37-0.838,1.861-1.392v-2.892
|
||||
C179.218,36.964,177.738,37.176,176.904,37.492z"/>
|
||||
<path d="M189.052,22.775h2.543v16.316c0,0.91,0.063,1.518,0.188,1.82c0.25,0.581,0.678,0.951,1.285,1.111l-0.375,1.646
|
||||
c-1.383,0.179-2.369-0.188-2.958-1.098c-0.455-0.714-0.683-1.812-0.683-3.293V22.775z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.3 KiB |
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="218px" height="64px" viewBox="0 0 218 64" enable-background="new 0 0 218 64" xml:space="preserve">
|
||||
<rect x="-1" y="1" display="none" fill="#0032B1" width="219" height="64"/>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M55.069,23.069c2.359,2.28,3.54,5.4,3.54,9.36c0,1.24-0.12,2.521-0.36,3.84
|
||||
c-0.6,3.4-1.791,6.351-3.57,8.851c-1.78,2.5-3.98,4.42-6.6,5.76c-2.62,1.341-5.47,2.01-8.55,2.01c-3.76,0-6.75-0.999-8.97-3
|
||||
c-2.22-2-3.471-4.62-3.75-7.86l-4.56,25.681h-1.14l8.4-47.64h1.14l-1.8,10.44c1.44-3.24,3.62-5.859,6.54-7.86
|
||||
c2.919-2,6.26-3,10.02-3C49.489,19.649,52.708,20.789,55.069,23.069z M51.049,47.639c3.12-2.779,5.12-6.57,6-11.37
|
||||
c0.24-1.319,0.36-2.56,0.36-3.72c0-3.72-1.08-6.62-3.24-8.7c-2.16-2.079-5.16-3.12-9-3.12c-2.8,0-5.421,0.651-7.86,1.95
|
||||
c-2.44,1.3-4.5,3.12-6.18,5.46c-1.68,2.34-2.781,5.051-3.3,8.13c-0.201,1.001-0.3,2.141-0.3,3.42c0,3.721,1.1,6.671,3.3,8.851
|
||||
c2.2,2.181,5.16,3.27,8.88,3.27C44.149,51.809,47.929,50.419,51.049,47.639z"/>
|
||||
<path fill="#FFFFFF" d="M70.788,20.069l-5.76,32.4h-1.2l5.76-32.4H70.788z M70.878,9.089c0.38-0.36,0.83-0.54,1.35-0.54
|
||||
c0.36,0,0.669,0.12,0.93,0.36c0.259,0.24,0.39,0.54,0.39,0.9c0,0.6-0.19,1.08-0.57,1.44c-0.381,0.36-0.831,0.54-1.35,0.54
|
||||
c-0.36,0-0.67-0.12-0.93-0.36c-0.261-0.24-0.39-0.54-0.39-0.9C70.308,9.929,70.498,9.449,70.878,9.089z"/>
|
||||
<path fill="#FFFFFF" d="M112.248,8.069l-7.86,44.4h-1.14l1.86-10.44c-1.44,3.24-3.621,5.86-6.54,7.86c-2.92,2.001-6.261,3-10.02,3
|
||||
c-4.08,0-7.3-1.14-9.66-3.42c-2.36-2.28-3.54-5.4-3.54-9.36c0-1.239,0.12-2.52,0.36-3.84c0.6-3.399,1.779-6.35,3.54-8.85
|
||||
c1.76-2.5,3.96-4.419,6.6-5.76c2.64-1.34,5.499-2.01,8.58-2.01c3.72,0,6.69,1,8.91,3c2.22,2,3.489,4.62,3.81,7.86l3.96-22.44
|
||||
H112.248z M82.848,24.899c-3.12,2.78-5.1,6.57-5.94,11.37c-0.24,1.32-0.36,2.561-0.36,3.72c0,3.721,1.07,6.621,3.21,8.7
|
||||
c2.14,2.081,5.13,3.12,8.97,3.12c2.799,0,5.43-0.649,7.89-1.95c2.46-1.299,4.52-3.12,6.18-5.46c1.66-2.34,2.77-5.049,3.33-8.13
|
||||
c0.2-1.319,0.3-2.438,0.3-3.36c0-3.72-1.11-6.68-3.33-8.88c-2.22-2.199-5.17-3.3-8.85-3.3
|
||||
C89.767,20.729,85.967,22.119,82.848,24.899z"/>
|
||||
<path fill="#FFFFFF" d="M152.507,8.069l-7.86,44.4h-1.14l1.86-10.44c-1.44,3.24-3.621,5.86-6.54,7.86c-2.92,2.001-6.261,3-10.02,3
|
||||
c-4.08,0-7.3-1.14-9.66-3.42c-2.36-2.28-3.54-5.4-3.54-9.36c0-1.239,0.12-2.52,0.36-3.84c0.6-3.399,1.779-6.35,3.54-8.85
|
||||
c1.76-2.5,3.96-4.419,6.6-5.76c2.64-1.34,5.499-2.01,8.58-2.01c3.72,0,6.69,1,8.91,3c2.22,2,3.489,4.62,3.81,7.86l3.96-22.44
|
||||
H152.507z M123.107,24.899c-3.12,2.78-5.1,6.57-5.94,11.37c-0.24,1.32-0.36,2.561-0.36,3.72c0,3.721,1.07,6.621,3.21,8.7
|
||||
c2.14,2.081,5.13,3.12,8.97,3.12c2.799,0,5.43-0.649,7.89-1.95c2.46-1.299,4.52-3.12,6.18-5.46c1.66-2.34,2.77-5.049,3.33-8.13
|
||||
c0.2-1.319,0.3-2.438,0.3-3.36c0-3.72-1.11-6.68-3.33-8.88c-2.22-2.199-5.17-3.3-8.85-3.3
|
||||
C130.026,20.729,126.227,22.119,123.107,24.899z"/>
|
||||
<path fill="#FFFFFF" d="M165.046,8.069l-7.8,44.4h-1.2l7.8-44.4H165.046z"/>
|
||||
<path fill="#FFFFFF" d="M194.176,21.239c1.898,1.06,3.318,2.451,4.26,4.17c0.939,1.72,1.41,3.621,1.41,5.7
|
||||
c0,0.52-0.08,1.34-0.24,2.459c-0.281,1.44-0.561,2.521-0.84,3.24h-29.04c-0.201,1.32-0.3,2.421-0.3,3.3
|
||||
c0,3.841,1.14,6.75,3.42,8.73c2.28,1.979,5.16,2.97,8.64,2.97c3.64,0,6.87-0.93,9.69-2.79c2.821-1.859,4.77-4.369,5.85-7.53h1.199
|
||||
c-1.16,3.4-3.238,6.15-6.239,8.25c-3,2.101-6.561,3.15-10.68,3.15c-3.96,0-7.12-1.13-9.48-3.39c-2.36-2.26-3.54-5.39-3.54-9.391
|
||||
c0-1.2,0.12-2.479,0.36-3.84c0.6-3.399,1.79-6.36,3.57-8.88c1.779-2.52,3.969-4.44,6.57-5.76c2.6-1.32,5.4-1.98,8.4-1.98
|
||||
C189.945,19.649,192.275,20.179,194.176,21.239z M198.705,31.529c0-3.56-1.119-6.25-3.359-8.07c-2.241-1.82-5.021-2.73-8.34-2.73
|
||||
c-2.56,0-5.021,0.551-7.38,1.65c-2.361,1.101-4.41,2.77-6.15,5.01c-1.74,2.241-2.91,5.021-3.51,8.34h28.201
|
||||
C198.525,34.169,198.705,32.769,198.705,31.529z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.1 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M14 18.2 7.8 12 14 5.8 15.6 7.4 11 12 15.6 16.6Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 129 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M9.4 18.2 7.8 16.6 12.4 12 7.8 7.4 9.4 5.8 15.6 12Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 132 B |
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
|
||||
<path d="M20.953,7.993L20.949,4c0-1.1-0.891-2-1.99-2h-4h-3h-3c-1.1,0-1.99,0.9-1.99,2h1.99h4h1h5h0.006v16h0.004
|
||||
c1.1,0,1.99-0.9,1.99-2V8L20.953,7.993z"/>
|
||||
<path d="M17.993,10.993L17.99,7c0-1.1-0.891-2-1.99-2h-4H9H6C4.9,5,4.01,5.9,4.01,7l-0.003,3.993L4,11v10c0,1.1,0.891,2,1.99,2H6h10
|
||||
h0.01c1.1,0,1.99-0.9,1.99-2V11L17.993,10.993z M16,12v9H6v-9V7h4h1h5V12z"/>
|
||||
<rect x="8" y="9" width="6" height="2"/>
|
||||
<circle cx="11" cy="15.859" r="2"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 919 B |
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" fill="#FFFFFF">
|
||||
<path d="M20.953,7.993L20.949,4c0-1.1-0.891-2-1.99-2h-4h-3h-3c-1.1,0-1.99,0.9-1.99,2h1.99h4h1h5h0.006v16h0.004
|
||||
c1.1,0,1.99-0.9,1.99-2V8L20.953,7.993z"/>
|
||||
<path d="M17.993,10.993L17.99,7c0-1.1-0.891-2-1.99-2h-4H9H6C4.9,5,4.01,5.9,4.01,7l-0.003,3.993L4,11v10c0,1.1,0.891,2,1.99,2H6h10
|
||||
h0.01c1.1,0,1.99-0.9,1.99-2V11L17.993,10.993z M16,12v9H6v-9V7h4h1h5V12z"/>
|
||||
<rect x="8" y="9" width="6" height="2"/>
|
||||
<circle cx="11" cy="15.859" r="2"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 934 B |
@@ -2,12 +2,11 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
|
||||
<meta name="theme-color" content="#0A0A0C" />
|
||||
<title>NAM Pedal</title>
|
||||
<link rel="icon" type="image/svg+xml" href="/ui/favicon.svg" />
|
||||
<script type="module" crossorigin src="/ui/assets/index-CHS9Y8OM.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/ui/assets/index-B-zxH4pN.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Pi Multi-FX Pedal</title>
|
||||
<script type="module" crossorigin src="/ui/assets/index-CxlwZhqE.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/ui/assets/index-CuJgR-s6.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
@@ -164,7 +164,7 @@ def test_systemd_service_content_default():
|
||||
assert "-p128" in content
|
||||
assert "-n2" in content
|
||||
assert "-r48000" in content
|
||||
assert "LimitRTPRIO=95" in content
|
||||
assert "LimitRTPRIO=99" in content
|
||||
assert "LimitMEMLOCK=infinity" in content
|
||||
assert "WantedBy=multi-user.target" in content
|
||||
|
||||
|
||||
@@ -436,7 +436,7 @@ class TestSystemdServices:
|
||||
"""Service unit includes real-time audio priority limits."""
|
||||
from src.system.services import pedal_service_content
|
||||
content = pedal_service_content()
|
||||
assert "LimitRTPRIO=95" in content
|
||||
assert "LimitRTPRIO=99" in content
|
||||
assert "LimitMEMLOCK=infinity" in content
|
||||
assert "LimitNICE=-20" in content
|
||||
|
||||
|
||||