Compare commits

...

21 Commits

Author SHA1 Message Date
218a65068a docs(wiki): publish refonte 126 modules to wiki/ — MODULES + CATEGORIES ×4 langues (ref #742)
Some checks are pending
License Headers / check (push) Waiting to run
2026-06-26 11:56:20 +02:00
0bd3b9e035 Merge branch 'docs/742-wiki-refonte-snapshots-webui-determinist' 2026-06-26 11:56:05 +02:00
c01f10c474 docs(wiki): refonte 126 modules — snapshots WebUI déterministes + READMEs 4 langues (ref #742)
Capture des 126 dashboards authentifiés (JWT minté serveur, injection localStorage)
avec attente de COMPLÉTION d'affichage déterministe (sentinelles de chargement
purgées + réseau calmé, plafond --delay) au lieu d'un sleep fixe. 126/126 OK.

- capture-screenshots.py: _wait_content_ready déterministe, mode --token (bypass
  login), goto domcontentloaded (plus de stall networkidle sur dashboards live)
- generate-docs.py: 23 modules jusqu'ici non documentés ajoutés (descriptions
  réelles depuis debian/control, EN/FR/DE/ZH), licence MIT→LicenseRef-CMSD-1.0,
  images wiki en URL raw.githubusercontent absolue (relatif = 404 sur GitHub wiki)
- 126 snapshots + thumbnails régénérés
- 126 READMEs paquet succincts + pages wiki MODULES/CATEGORIES ×4 langues

Gap modules documentés vs découverts: 23 → 0.
2026-06-26 10:14:14 +02:00
165dc21842 fix(security-posture): RuntimeDirectoryPreserve=yes (last unit missing it) (#741)
The shared /run/secubox RuntimeDirectory is wiped on any sibling restart unless
every unit sets RuntimeDirectoryPreserve=yes (85/86 already did; this was the
straggler that could still trigger the board-wide socket wipe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 16:37:59 +02:00
e53f6a3f46 fix(waf): feed Threats/Blocked/Protected from CrowdSec (zero-metrics) (#733)
The dashboard's Threats 24h / Blocked cards and the severity/category donuts read
the inline mitmproxy threat log (THREATS_LOG), which is normally EMPTY because
CrowdSec + the firewall bouncer do the real detection/blocking — so they showed 0
while bans (from cscli decisions) worked.

- _get_crowdsec_alerts(): cscli alerts list -o json (same source as bans), with a
  scenario-derived severity.
- _overlay_crowdsec_stats(): fold alert counts into total_threats / threats_today
  / blocked_24h + by_severity / by_category / top_countries + last_threat.
- _protected_vhost_count(): Protected = HAProxy->mitmproxy route-map size.
- Wired into the warm-loop refresh (background; cscli never blocks a request).

Verified on gk2 (1.2.7): Threats 50, Blocked 50, Protected 255, donut
crit 16 / high 13 / med 21, live last_threat — was all 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:59:06 +02:00
bda86be02a fix(threatmesh): move navbar entry into the Wall master section (#728)
ThreatMesh was in an ad-hoc 'security' category — not one of the 6 master
sections (auth/boot/mesh/mind/root/wall) — so it sat alone in an unsanctioned
section. It's sovereign threat-intel + blocklist enforcement, so it belongs in
WALL alongside CrowdSec / IP Blocklist / CyberFeed / Threats (order 706). The
'security' section is now empty/removed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:49:21 +02:00
220f996928 feat(mediaflow): reconstruct multi-part HLS streams for full clone (#736)
video.twimg.com (and HLS generally) is fetched as hundreds of .m4s/.ts segments
+ a few .m3u8 playlists. That flooded Discovered Media with useless fragments and
none was cloneable on its own.

- _collapse_streams: group every multi-part stream to ONE entry (Twitter by media
  id; generic HLS by segment directory). Reconstruct the fully-cloneable URL —
  the master .m3u8 (video+audio) when seen, else the highest-res video variant +
  an audio variant. Collapse happens at ingest so the segment flood never reaches
  the durable store; part counts take max (no inflation).
- clone: audio_url support → ffmpeg muxes separate video+audio variant playlists
  (-map 0✌️0 -map 1🅰️0) when there's no master.
- UI: kind=stream with a "N parts (+audio)" count; Clone passes url+audio_url via
  an index lookup (no escaping pitfalls). Discovered URLs already clickable.

Verified on gk2 (2.2.0): ~1800 twimg segments collapsed to one entry per video;
cloning a stream's master playlist produced a complete 720x1280 h264 + aac mp4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:21:05 +02:00
6a34dee598 feat(mediaflow): make Discovered Media URLs clickable (#736)
Render the discovered media URL as a new-tab link (rel=noopener) instead of
plain truncated text, so the operator can open the manifest/watch URL directly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 08:12:23 +02:00
b6db15ca03 docs: HISTORY for R4 recos + catch-log ownership fix (#736)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:15:39 +02:00
75241d0774 feat(mediaflow): persist Discovered Media + package yt-dlp refresh (#736)
- _read_catch merges the tmpfs catch log into a durable capped store
  (discovered.json, 2000 max) — discovery survives reboots; idempotent override
  merge (no hit inflation). Surfaces kind=page (YouTube watch URLs).
- control Recommends ffmpeg/yt-dlp/curl; ship secubox-yt-dlp-refresh + a weekly
  timer that pulls the latest standalone yt-dlp to /usr/local/bin (apt's is months
  behind and can't self-update; YouTube extractors change often). postinst creates
  the library dir + kicks one refresh.

Verified on gk2 (2.1.1): durable store holds YouTube watch pages + manifests;
yt-dlp refreshed to 2026.06.09 (parses YouTube); timer active.
2026-06-24 17:14:50 +02:00
7f1b1727d4 feat(catcher): capture YouTube watch pages + fix catch-log ownership (#736)
- mediacatch.go: also record cloneable video PAGES (YouTube watch/shorts/live,
  youtu.be) as kind=page — the watch URL is what yt-dlp clones; signed chunk URLs
  aren't reusable. Pages dedup by full URL so each video id is kept distinct.
- tmpfiles.d: pre-create /run/secubox/media-catch.jsonl owned by the writer
  (secubox-toolbox). A stale secubox-owned file in the sticky /run dir was making
  the worker's O_APPEND fail silently -> catcher disabled itself -> nothing
  captured. Now correctly owned every boot; mediaflow reads it as other (0644).

Verified on gk2 (0.1.22): YouTube watch URLs captured as kind=page, distinct ids.
2026-06-24 17:14:50 +02:00
25e41c1fba feat(toolbox): R4 analyst tier in the banner level switch (#736)
Add R4 to the inline banner topbar (R0..R4) + /__toolbox/set-level + the by-MAC
change-level validation + the 7d level-distribution analytics buckets. R4 is the
deepest analyst / media-reverse-catcher tier, gated to the wg path like R3.
Functionally the box already runs MITM-everything by default (Phase 1-2); this is
the selectable affordance.

Verified on gk2: R4 button renders in the served banner; set-level returns
{"ok":true,"level":"r4"} and the bundle reads it back.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:47:57 +02:00
c709c3e9df docs: HISTORY for R4 analyst mode + media reverse-catcher (#736)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:42:48 +02:00
8fd451f6ba feat(mediaflow): R4 Discovered Media + Clone library (#736)
New dashboard cards driven by the sbxmitm media reverse-catcher:
- /discovered reads /run/secubox/media-catch.jsonl (caught media URLs, grouped,
  newest first) + reports the active downloader.
- /clone enqueues a download (yt-dlp if present, else ffmpeg stream-copy for
  HLS/DASH manifests + direct media) into a durable library; single async
  worker, 30-min cap, lazily (re)started per-request so it runs under the
  aggregator too (no sub-app lifespan).
- /library + /clone/jobs list jobs; /download/{id} serves the file; DELETE
  removes it.
- Frontend: "Discovered Media" (Clone buttons) + "Cloned Library" (Download/
  delete) cards.

Verified end-to-end on gk2 (mediaflow 2.1.0): caught an HLS manifest → cloned via
ffmpeg → 464 MiB mp4 in the library. yt-dlp installed for broader site support.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:41:23 +02:00
44c751154c feat(R4): MITM-everything splice doctrine + sbxmitm media reverse-catcher (#736)
R4 / analyst mode foundation — performance is explicitly secondary to visibility:

- tls-splice-seed.conf: flip doctrine from "splice media CDNs for speed" to
  "MITM everything; splice ONLY hosts that genuinely break under MITM (cert
  pinning)". Seed reduced to api.anthropic.com. The banner now reaches every
  HTML page; the catcher can see media URLs. (Live: learned splices cleared;
  splice autolearn already gated off via tls_splice=off.)
- sbxmitm media reverse-catcher (mediacatch.go): on 2xx MITM'd flows, record
  cloneable media URLs (HLS/DASH manifests + direct audio/video + googlevideo
  videoplayback) to /run/secubox/media-catch.jsonl — URLs only, never bodies,
  deduped per worker, atomic appends, best-effort/fail-open. Gated --media-catch
  (default on).
- worker unit: ReadWritePaths=/run/secubox so the catcher can write under
  ProtectSystem=strict.

Verified on gk2 (toolbox-ng 0.1.20): captured an HLS manifest + a direct MP4
through a worker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:32:43 +02:00
e33a19d38e fix(mediaflow): Top Media Services from DPI cumulative store (#728)
/exfil is live-window only (~60s), so the services table blinked empty whenever
nothing was streaming that instant. _media_services_list() now reads the DPI
7-day cumulative store (/var/lib/secubox/dpi/cumulative.json, same schema) so the
ranking persists; cards + Active Streams stay live (active-now). Falls back to
live exfil if cumulative is absent. Bandwidth cell = cumulative total transferred.

Verified on gk2 (mediaflow 2.0.3): Top Media Services shows YouTube 33.3 MB.
Note: dashboard routes via the aggregator (in-process import) — restart
secubox-aggregator to pick up mediaflow code changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:21:23 +02:00
220bdd6c1f fix(mediaflow): restore dashboard — align API with frontend contract (#728)
The 2.0.x DPI-exfil rewrite changed the response shapes the dashboard reads, so
every card/table fell back to 0 even when media flows were present:

- /status now returns video_streams / audio_streams / bandwidth_mbps /
  active_clients (the frontend's card fields), alongside the diagnostics.
- add the missing /streams endpoint → {streams:[{client_ip,type,service,
  bandwidth,duration}]} (frontend called /streams; backend only had
  /get_active_streams).
- /services now returns {services:[...]} with streams/bandwidth/percent cells
  (was a bare array → frontend's `.services` was undefined). Refactored into
  _media_services_list() so /services/by-category keeps working.
- split media flows into video/audio (service name + host hint) and derive Mbps
  from the DPI capture window (SECUBOX_DPI_WINDOW, 60s).
- add missing `import os`.

Verified on gk2 (mediaflow 2.0.2): endpoints return the correct shape; cards
read 0 only when no media is streaming (exfil media-category empty that instant).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:13:01 +02:00
d476b2fb18 docs: HISTORY for nonce-CSP banner + Claude API splice + youtube unblock (#728, #735)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 15:59:51 +02:00
49a6fb5af8 fix(sbxmitm): banner runs on nonce-CSP sites + splice Claude API (#728)
The transparency banner is inlined (service-worker-proof), but on nonce-based
CSP sites (YouTube, most news) a nonce/hash makes 'unsafe-inline' IGNORED, so the
bare inline <script> was silently blocked and the banner never appeared.

- csp.go: relaxCSPForLoader now BORROWS the page's own nonce and returns it; the
  injected <script nonce=…> is stamped with it (surgical — the page's CSP, nonces
  and hashes stay intact). Falls back to forcing 'unsafe-inline' (dropping
  nonce/hash/strict-dynamic) only when there is no nonce to borrow. Nonce values
  are validated to the base64 charset to prevent attribute breakout.
- banner.go/gzip.go/main.go: thread the borrowed nonce through injectIntoBody →
  injectHTML → injectInlineBanner onto the <script> tag.
- Keeps the earlier Trusted-Types drop (0.1.17).
- tls-splice-seed.conf: splice api.anthropic.com — cert-pinned Claude API/SDK
  clients reject the MITM CA; pass them through (claude.ai web stays MITM'd).

Tests rewritten for inline semantics + nonce borrow/validation; all pass.
Deployed gk2 toolbox-ng 0.1.18, R3 workers 1-4. Verified end-to-end on YouTube
(200, banner nonce == page nonce) and lemonde/lefigaro (unsafe-inline fallback).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 15:58:33 +02:00
c30680fcf3 docs: HISTORY entry for YouTube bannering Trusted Types fix (#728)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 15:15:31 +02:00
361ceb8393 fix(sbxmitm): strip Trusted Types CSP so the transparency banner mounts on YouTube (#728)
YouTube (and other strict-CSP sites) send `require-trusted-types-for 'script'`,
which blocks the R3 transparency banner's DOM injection even when the loader
script is allowed to run — the banner silently never appeared.

relaxCSPForLoader now drops the `require-trusted-types-for` and `trusted-types`
directives alongside the existing script-src relax, and omits the resulting
empty CSP header line (YouTube's TT directive is a standalone header). Covered
by a local Go unit test; deployed to gk2 (toolbox-ng 0.1.17, R3 workers 1-4).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 15:11:54 +02:00
430 changed files with 9189 additions and 7041 deletions

View File

@ -3,6 +3,79 @@
---
## 2026-06-24 (cont.) — R4 analyst mode: MITM-everything + media reverse-catcher + clone (#736)
New "R4" doctrine — visibility over performance. Delivered + live on gk2:
- **Splice flip**`tls-splice-seed.conf` reduced from a media-CDN perf list to
breakers-only (`api.anthropic.com`); splice now applied ONLY where MITM provably
breaks (cert pinning). Banner reaches every page; catcher sees media URLs. Live:
learned splices cleared, autolearn gated (`tls_splice=off`).
- **sbxmitm media reverse-catcher** (`cmd/sbxmitm/mediacatch.go`, toolbox-ng 0.1.20)
— 2xx MITM'd flows → cloneable media URLs (HLS/DASH manifests, direct A/V,
googlevideo videoplayback) appended to `/run/secubox/media-catch.jsonl` (URLs
only, deduped, atomic, fail-open). `--media-catch` default on; worker unit
`ReadWritePaths=/run/secubox`.
- **mediaflow Discovered Media + Clone** (2.1.0) — `/discovered`, `/clone`
(yt-dlp→ffmpeg queue, lazy worker for the aggregator), `/library`,
`/download/{id}`, DELETE; dashboard cards. Verified: HLS caught → ffmpeg →
464 MiB mp4 in library. yt-dlp installed.
- Also fixed the empty mediaflow dashboard (2.0.2 contract + 2.0.3 cumulative
services): cards/streams live, Top Media Services from DPI cumulative store.
KEY: dashboard routes via the **aggregator** (in-process import) — restart
`secubox-aggregator` to pick up mediaflow code changes.
- Phase 4 done — R4 button added to the banner topbar (R0..R4) + set-level + by-MAC
validation + analytics buckets; gated to the wg path like R3 (secubox-toolbox 2.7.20).
- yt-dlp upgraded 2023.03.04 → 2026.06.09 (standalone binary; YouTube works).
- Recos: catcher now captures YouTube watch **pages** (kind=page, toolbox-ng 0.1.22);
Discovered Media persisted off tmpfs into a durable capped store (mediaflow 2.1.1);
yt-dlp packaged (Recommends + weekly refresh timer + postinst).
- **Catch-log ownership bug**`/run/secubox/media-catch.jsonl` was created
`secubox`-owned while the worker runs as `secubox-toolbox`, so O_APPEND failed
silently → nothing captured. Fixed with a tmpfiles.d entry pre-creating it owned
by the writer every boot (zz-secubox-toolbox-ng.conf). Live: rm + worker recreate.
## 2026-06-24 (cont.) — Banner on nonce-CSP sites + Claude API splice + YouTube unblock (#728)
Three distinct root causes behind "no banner on youtube / news", fixed in order:
1. **Trusted Types** (0.1.17) — `require-trusted-types-for` blocked DOM injection. Stripped.
2. **Nonce-based CSP** (0.1.18) — the banner is *inlined* (service-worker-proof), but a CSP
nonce/hash makes `'unsafe-inline'` IGNORED → the bare inline `<script>` was silently
blocked. `relaxCSPForLoader` now **borrows the page's own nonce** and stamps it on the
injected `<script nonce=…>` (surgical: page CSP/nonces/hashes untouched), falling back to
forcing `unsafe-inline` (drop nonce/hash/strict-dynamic) only when there's no nonce.
Nonce validated to base64 charset (attribute-breakout guard). Threaded nonce through
injectIntoBody → injectHTML → injectInlineBanner. Tests rewritten for inline semantics.
3. **YouTube wholly blocked** (runtime) — autolearn false-positive put `youtube.com` in
`/var/lib/secubox/toolbox/learned-trackers.txt``Decide()` returned `block` (204) →
page never loaded. Removed from learned + added to `ad-allowlist.txt` (hot-reloaded).
Latent-bug tracker: **#735** (autolearn must not block apex/first-party nav targets).
**Claude API splice** (user request) — `api.anthropic.com` added to `tls-splice-seed.conf`
(+ live seed): cert-pinned Claude API/SDK clients reject the MITM CA, so pass them through;
`claude.ai` web stays MITM'd (browser trusts the CA → still gets the banner).
Verified end-to-end on gk2: YouTube 200 + banner nonce == page nonce; lemonde/lefigaro
banner via unsafe-inline fallback. DPI confirmed healthy — collector writes to
`/var/lib/secubox/dpi/` (state.json/cumulative.json fresh), `/exfil` returns categorized
flows; the earlier "empty" was me checking the wrong paths (`/run/secubox/dpi`).
## 2026-06-24 — DPI YouTube bannering: strip Trusted Types CSP (#728)
- **Root cause** — YouTube serves a standalone `Content-Security-Policy:
require-trusted-types-for 'script'` header. sbxmitm's `relaxCSPForLoader` already
relaxed `script-src` (drop `strict-dynamic`, add `'self'`/`'unsafe-inline'`) so the
banner loader runs, but Trusted Types still blocked the banner's DOM injection →
banner silently never mounted on YouTube.
- **Fix** (`cmd/sbxmitm/csp.go`, toolbox-ng 0.1.17) — drop `require-trusted-types-for`
and `trusted-types` directives during the relax; omit the resulting empty CSP header
line. Local Go unit tests cover both the relax and the empty-header drop.
- **DPI capture half** — collector `state.json` was stale (frozen 09:44); restarted
`secubox-dpi-flowcap` → fresh windows, YouTube/media flows now visible in mediaflow.
- Deployed to gk2; R3 workers `secubox-toolbox-ng-worker@1..4` restarted on 0.1.17.
- Filed for later: #729 wireguard peers/tabs, #730 yacy, #731 lyrion, #732 magicmirror,
#733 firewall dashboard misreport, #734 webui.conf hardcoded-route cleanup.
## 2026-06-22 — DPI exfil engine + Netrunner report (HTML+PDF) + sbxmitm fixes
Big session: full per-device DPI exfiltration pipeline, the kbin report reborn as a

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Some files were not shown because too many files have changed in this diff Show More