diff --git a/.DS_Store b/.DS_Store
index 21d951d5f..b6edf605a 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.ai/skills/location-system/SKILL.md b/.ai/skills/location-system/SKILL.md
new file mode 100644
index 000000000..0e8e944cf
--- /dev/null
+++ b/.ai/skills/location-system/SKILL.md
@@ -0,0 +1,148 @@
+---
+name: location-system
+description: Countries, states, cities, ResolveLocationAction, Location base model, LocationType enum, geocoding, and location-level Redis data.
+---
+
+# Location System
+
+Location tables store identity only (name, shortcode, FKs). All aggregates live in the `metrics` table and Redis. The `Location` base model computes all stats from Redis on access via `$appends`.
+
+## Key Files
+
+- `app/Models/Location/Location.php` — Abstract base model with Redis-backed computed attributes
+- `app/Models/Location/Country.php` — Route key: `shortcode` (ISO 3166-1 alpha-2)
+- `app/Models/Location/State.php` — Belongs to Country
+- `app/Models/Location/City.php` — Belongs to Country + State
+- `app/Actions/Locations/ResolveLocationAction.php` — Lat/lon -> Country/State/City via geocoding
+- `app/Actions/Locations/ReverseGeocodeLocationAction.php` — LocationIQ API wrapper
+- `app/Actions/Locations/LocationResult.php` — DTO returned by ResolveLocationAction
+- `app/Enums/LocationType.php` — Global(0), Country(1), State(2), City(3)
+- `app/Enums/Timescale.php` — AllTime(0), Daily(1), Weekly(2), Monthly(3), Yearly(4)
+
+## Invariants
+
+1. **Location tables store identity only.** No `total_*` counters, no `manual_verify`, no aggregates. All stats come from Redis or the `metrics` table.
+2. **Photo table uses FK columns only:** `country_id`, `state_id`, `city_id`. Deprecated string columns (`country`, `county`, `city`, `display_name`, `location`, `road`) are dropped.
+3. **Redis is a derived cache.** All Redis location data is rebuildable from the `metrics` table.
+4. **HyperLogLog for contributor counts.** `PFCOUNT` gives ~0.81% error, O(1) space, append-only (cannot decrement).
+5. **Country uses `shortcode` as route key**, not `id`. Routes: `/countries/{shortcode}`.
+
+## Patterns
+
+### ResolveLocationAction
+
+```php
+// app/Actions/Locations/ResolveLocationAction.php
+public function run(float $lat, float $lon): LocationResult
+{
+ $address = $this->reverseGeocode->run($lat, $lon);
+
+ $country = $this->resolveCountry($address); // firstOrCreate by country_code
+ $state = $this->resolveState($country, $address);
+ $city = $this->resolveCity($country, $state, $address);
+
+ return new LocationResult($country, $state, $city, $address, $displayName);
+}
+```
+
+**Lookup strategy for city:** Searches keys in order: `city`, `town`, `city_district`, `village`, `hamlet`, `locality`, `county`.
+
+### LocationResult DTO
+
+```php
+readonly class LocationResult
+{
+ public function __construct(
+ public Country $country,
+ public State $state,
+ public City $city,
+ public array $addressArray,
+ public string $displayName,
+ ) {}
+}
+```
+
+### LocationType enum
+
+```php
+enum LocationType: int
+{
+ case Global = 0; // dbColumn: null, scopePrefix: {g}
+ case Country = 1; // dbColumn: country_id, scopePrefix: {c:$id}
+ case State = 2; // dbColumn: state_id, scopePrefix: {s:$id}
+ case City = 3; // dbColumn: city_id, scopePrefix: {ci:$id}
+
+ public function dbColumn(): ?string
+ public function scopePrefix(int $id = 0): string
+ public function modelClass(): ?string
+ public function parentType(): ?self
+}
+```
+
+### Location model computed attributes (from Redis)
+
+```php
+// All appended attributes on Country/State/City models:
+$country->total_litter_redis // HGET {c:$id}:stats litter
+$country->total_photos_redis // HGET {c:$id}:stats uploads
+$country->total_contributors_redis // PFCOUNT {c:$id}:hll
+$country->total_xp // HGET {c:$id}:stats xp
+$country->litter_data // HGETALL {c:$id}:cat (resolved to names)
+$country->objects_data // top 20 from {c:$id}:obj
+$country->materials_data // HGETALL {c:$id}:mat
+$country->brands_data // HGETALL {c:$id}:brands
+$country->ppm // Cached time-series from metrics table (15min TTL)
+$country->recent_activity // Last 7 days daily counts (5min TTL)
+```
+
+### Location hierarchy rankings
+
+```php
+RedisKeys::globalCountryLitterRanking() // {g}:rank:c:litter (ZSET)
+RedisKeys::globalCountryPhotosRanking() // {g}:rank:c:photos
+RedisKeys::countryStateRanking($countryId, $metric) // {c:$id}:rank:s:$metric
+RedisKeys::stateCityRanking($stateId, $metric) // {s:$id}:rank:ci:$metric
+```
+
+### Database schema (identity only)
+
+```sql
+countries (id, country, shortcode UNIQUE, created_by, timestamps)
+states (id, state, country_id, created_by, timestamps, UNIQUE(country_id, state))
+cities (id, city, country_id, state_id, created_by, timestamps, UNIQUE(country_id, state_id, city))
+```
+
+## LocationController API (v1)
+
+`app/Http/Controllers/Location/LocationController.php` serves the locations browsing UI.
+
+### Endpoints
+- `GET /api/v1/locations` — Global view: list of countries with stats
+- `GET /api/v1/locations/{type}/{id}` — Drill into country/state/city
+
+### Response keys
+```json
+{
+ "stats": { "countries": 120, "states": 450, "cities": 1200, ... },
+ "locations": [ ... ],
+ "location_type": "country",
+ "breadcrumbs": [ ... ],
+ "activity": [ ... ]
+}
+```
+
+**Key naming:** Response uses `locations` (not `children`) and `location_type` (not `children_type`). The Pinia store `useLocationsStore` reads these exact keys.
+
+### Time filtering
+Supports `?period=today|yesterday|this_month|last_month|this_year` and `?year=2024` query params. Mutually exclusive — year clears period and vice versa.
+
+## Common Mistakes
+
+- **Adding aggregate columns to location tables.** Aggregates live in `metrics` table and Redis. Location tables are identity only.
+- **Using deprecated photo string columns.** `country`, `county`, `city`, `display_name`, `location`, `road` are dropped. Use `country_id`, `state_id`, `city_id` FKs.
+- **Routing countries by ID instead of shortcode.** Country model has `getRouteKeyName(): 'shortcode'`.
+- **Treating Redis location stats as authoritative.** They're derived caches. The `metrics` table is source of truth.
+- **Decrementing HyperLogLog.** PFCOUNT is append-only. You cannot remove a contributor from HLL.
+- **Forgetting `GeocodingException`.** `ResolveLocationAction::run()` throws `GeocodingException` when geocoding fails. Always handle this.
+- **Using `children` or `children_type` in API responses.** The correct keys are `locations` and `location_type`.
+- **Filtering locations by `manual_verify`.** This deprecated column is no longer used. Don't scope queries with it.
diff --git a/.ai/skills/metrics-pipeline/SKILL.md b/.ai/skills/metrics-pipeline/SKILL.md
new file mode 100644
index 000000000..25aaef41b
--- /dev/null
+++ b/.ai/skills/metrics-pipeline/SKILL.md
@@ -0,0 +1,125 @@
+---
+name: metrics-pipeline
+description: MetricsService, RedisMetricsCollector, ProcessPhotoMetrics, metrics table, Redis stats, leaderboards, XP processing, and photo processing state (processed_at/fp/tags/xp).
+---
+
+# Metrics Pipeline
+
+MetricsService is the **single writer** for all metrics — MySQL time-series and Redis aggregates. Nothing else touches metric counters. This is the golden rule.
+
+## Key Files
+
+- `app/Services/Metrics/MetricsService.php` — Single writer for MySQL + Redis
+- `app/Services/Redis/RedisMetricsCollector.php` — Redis operations (stats, HLL, rankings, tags)
+- `app/Services/Redis/RedisKeys.php` — All Redis key builders (single source of truth for naming)
+- `app/Listeners/Metrics/ProcessPhotoMetrics.php` — Queued listener on `TagsVerifiedByAdmin`
+- `app/Events/TagsVerifiedByAdmin.php` — Trigger event for metrics processing
+- `app/Enums/LocationType.php` — Global(0), Country(1), State(2), City(3) with scope prefixes
+
+## Invariants
+
+1. **Single writer rule.** Only `MetricsService` writes to the `metrics` table and Redis metric keys. No other code may increment/decrement counters.
+2. **Processing state is four columns:** `processed_at`, `processed_fp`, `processed_tags`, `processed_xp`. A photo with `processed_at = null` has never affected aggregates.
+3. **Fingerprint-based idempotency.** MetricsService diffs old `processed_tags` JSON against new summary and writes only non-zero deltas. Safe to call repeatedly on any photo.
+4. **Summary must exist before metrics fire.** `GeneratePhotoSummaryService::run()` MUST be called before `TagsVerifiedByAdmin` dispatches. MetricsService reads from `photo.summary`.
+5. **Redis is a derived cache.** Rebuildable from the `metrics` table. `RedisKeys::*` is single source of truth for key naming.
+6. **`processed_xp` must be INT UNSIGNED**, not TINYINT. Overflow bug documented in migration `2026_02_23_182605`.
+7. **Tags count excludes categories** to avoid double-counting: `tags_count = objects + materials + brands + custom_tags`.
+
+## Patterns
+
+### How MetricsService processes a photo
+
+```php
+// MetricsService::processPhoto() — called by ProcessPhotoMetrics listener
+DB::transaction(function () use ($photo) {
+ $photo = Photo::whereKey($photo->id)->lockForUpdate()->first();
+ $metrics = $this->extractMetricsFromPhoto($photo); // reads photo.summary
+ $fingerprint = $this->computeFingerprint($metrics['tags']);
+
+ // Skip if nothing changed (fingerprint + XP both match)
+ if ($photo->processed_fp === $fingerprint &&
+ (int)$photo->processed_xp === (int)$metrics['xp']) {
+ return;
+ }
+
+ // Route to create (first time) or update (re-tag)
+ if ($photo->processed_at !== null) {
+ $this->doUpdate($photo, $metrics, $fingerprint);
+ } else {
+ $this->doCreate($photo, $metrics, $fingerprint);
+ }
+});
+```
+
+### MySQL upsert across timescales and locations
+
+Each photo writes up to **20 rows**: 5 timescales (all-time, daily, weekly, monthly, yearly) x 4 location scopes (global, country, state, city).
+
+```php
+DB::table('metrics')->upsert($rows,
+ ['timescale', 'location_type', 'location_id', 'user_id', 'year', 'month', 'week', 'bucket_date'],
+ [
+ 'uploads' => DB::raw('GREATEST(uploads + VALUES(uploads), 0)'),
+ 'tags' => DB::raw('GREATEST(tags + VALUES(tags), 0)'),
+ // ... same for brands, materials, custom_tags, litter, xp
+ ]
+);
+```
+
+Uploads delta: `+1` for create, `0` for update, `-1` for delete. `GREATEST(..., 0)` prevents negative counters.
+
+### Redis operations happen after MySQL commit
+
+```php
+private function updateRedis(Photo $photo, array $payload, string $operation): void
+{
+ DB::afterCommit(function () use ($photo, $payload, $operation) {
+ RedisMetricsCollector::processPhoto($photo, $payload, $operation);
+ });
+}
+```
+
+### Redis key patterns (cluster-safe with hash tags)
+
+```php
+RedisKeys::global() // {g}
+RedisKeys::country($id) // {c:$id}
+RedisKeys::state($id) // {s:$id}
+RedisKeys::city($id) // {ci:$id}
+RedisKeys::user($userId) // {u:$userId}
+
+RedisKeys::stats($scope) // $scope:stats (HASH: uploads, tags, litter, xp, ...)
+RedisKeys::hll($scope) // $scope:hll (HyperLogLog for contributor count)
+RedisKeys::objects($scope) // $scope:obj (HASH: object_id => count)
+RedisKeys::ranking($scope, $dim) // $scope:rank:$dim (ZSET)
+RedisKeys::userBitmap($userId) // {u:$userId}:bitmap (activity bitmap)
+```
+
+### Where TagsVerifiedByAdmin fires
+
+1. **Trusted users tag a photo (web):** `AddTagsToPhotoAction::updateVerification()` — dispatches immediately after summary + XP.
+2. **Teacher approves school photos:** `TeamPhotosController::approve()` — dispatches per photo after atomic `is_public = true` update.
+3. **Trusted users tag a photo (mobile):** `ConvertV4TagsAction::run()` — dispatches after v4→v5 conversion + summary generation.
+
+### Delete flow (metrics reversal)
+
+```php
+// MetricsService::deletePhoto() — called synchronously in controllers before soft-delete
+// Reads processed_tags JSON, applies negative deltas, clears processed_* columns
+$photo->update([
+ 'processed_at' => null,
+ 'processed_fp' => null,
+ 'processed_tags' => null,
+ 'processed_xp' => null,
+]);
+```
+
+## Common Mistakes
+
+- **Writing metrics outside MetricsService.** Never `DB::table('metrics')->increment(...)` or `Redis::hincrby(...)` directly.
+- **Dispatching `TagsVerifiedByAdmin` before summary generation.** MetricsService reads `photo.summary` — null summary = zero metrics.
+- **Comparing `processed_xp` as TINYINT.** Values above 127 overflow. Column must be UNSIGNED INT.
+- **Forgetting row locking.** Always use `Photo::whereKey($id)->lockForUpdate()->first()` inside the transaction.
+- **Assuming Redis is source of truth.** Redis is a cache. The `metrics` table is authoritative.
+- **Including categories in `tags_count`.** Categories are groupings, not countable items. Only objects + materials + brands + custom_tags.
diff --git a/.ai/skills/mobile-shim/SKILL.md b/.ai/skills/mobile-shim/SKILL.md
new file mode 100644
index 000000000..db4495e5e
--- /dev/null
+++ b/.ai/skills/mobile-shim/SKILL.md
@@ -0,0 +1,127 @@
+---
+name: mobile-shim
+description: Mobile API endpoints, v4 tag format conversion, AddTagsToUploadedImageController, old mobile tagging routes, and ConvertV4TagsAction shim design.
+---
+
+# Mobile API Shim
+
+The mobile app sends v4 tag format (`{smoking: {butts: 3}}`) to old endpoints. The backend must convert this to v5 PhotoTags. Zero mobile app changes — the shim is backend-only.
+
+## Key Files
+
+- `app/Actions/Tags/ConvertV4TagsAction.php` — Shim: v4 payload → UpdateTagsService → v5 PhotoTags
+- `app/Http/Controllers/API/AddTagsToUploadedImageController.php` — Mobile tag endpoint (wired to shim)
+- `app/Http/Controllers/ApiPhotosController.php` — Upload-with-tags endpoint (wired to shim)
+- `app/Http/Requests/Api/AddTagsRequest.php` — Validation for old mobile format
+- `app/Services/Tags/UpdateTagsService.php` — Reused: same pipeline as olm:v5 migration
+- `app/Services/Tags/ClassifyTagsService.php` — Tag classification + deprecated key mapping
+- `tests/Feature/Mobile/ConvertV4TagsTest.php` — 7 tests (payload, summary, idempotency, verification)
+- `readme/Mobile.md` — Design document for the shim
+
+## Current State — DEPLOYED
+
+The `ConvertV4TagsAction` shim is built and wired into both mobile tagging controllers. Mobile users contribute to v5 metrics immediately without an app update. The shim reuses the same `UpdateTagsService` pipeline as the `olm:v5` migration script (battle-tested against 500k+ photos).
+
+### Old endpoints (routes/api.php)
+
+```php
+// Root API (legacy)
+Route::post('add-tags', 'API\AddTagsToUploadedImageController')
+ ->middleware('auth:api');
+
+// V2 (still active for mobile)
+Route::group(['prefix' => 'v2', 'middleware' => 'auth:api'], function () {
+ Route::post('/add-tags-to-uploaded-image', 'API\AddTagsToUploadedImageController');
+});
+
+// Upload endpoints that accept optional tags
+Route::post('photos/submit-with-tags', ...);
+Route::post('photos/upload-with-tags', ...);
+Route::post('photos/upload/with-or-without-tags', ...);
+```
+
+### Old request format (v4)
+
+```json
+{
+ "photo_id": 123,
+ "tags": {
+ "smoking": { "butts": 5, "cigaretteBox": 1 },
+ "softdrinks": { "tinCan": 2 },
+ "brands": { "marlboro": 3 }
+ },
+ "picked_up": true,
+ "custom_tags": ["my_custom_tag"]
+}
+```
+
+### AddTagsRequest validation
+
+```php
+// photo_id: required, exists:photos,id
+// tags: required_without_all:litter,custom_tags, array, min:1
+// picked_up: nullable, boolean
+// custom_tags: array, max:3
+// custom_tags.*: distinct, min:3, max:100
+```
+
+## Invariants
+
+1. **Zero mobile app changes.** The shim converts v4 payloads to v5 on the backend.
+2. **Must handle mobile retries (idempotency).** Mobile may re-send the same tags.
+3. **Must handle trust/verification gating.** Same rules as v5: trusted users get immediate `TagsVerifiedByAdmin`, school students stop at `VERIFIED(1)`.
+4. **Brand matching is deferred.** Same as migration — brands extracted but not attached to specific objects.
+5. **Summary must be generated.** After converting to PhotoTags, call `GeneratePhotoSummaryService::run()`.
+6. **Endpoints eventually deprecated** when mobile app refactored to send v5 format to `POST /api/v3/tags`.
+
+## Patterns
+
+### Conversion flow (ConvertV4TagsAction — BUILT)
+
+```php
+class ConvertV4TagsAction
+{
+ public function __construct(
+ private OldAddTagsToPhotoAction $oldAddTagsAction, // Writes v4 data to category columns
+ private AddCustomTagsToPhotoAction $oldAddCustomTagsAction,
+ private UpdateTagsService $updateTagsService, // v4→v5 conversion (same as olm:v5)
+ ) {}
+
+ public function run(int $userId, int $photoId, array $v4Tags, bool $pickedUp, array $customTags = []): void
+ {
+ // Idempotency: skip if already converted
+ if ($photo->migrated_at !== null || $photo->photoTags()->exists()) return;
+
+ // Step 1: Set remaining (affects XP picked_up bonus)
+ // Step 2: Filter to known categories via Photo::categories()
+ // Step 3: Old action writes v4 data to category columns
+ // Step 4: UpdateTagsService reads back, creates v5 PhotoTags + summary + XP
+ // Step 5: Handle verification (trusted/school/untrusted)
+ }
+}
+```
+
+### Key deprecated mappings used by mobile
+
+```php
+ClassifyTagsService::normalizeDeprecatedTag('beerBottle')
+// → ['object' => 'beer_bottle', 'materials' => ['glass']]
+
+ClassifyTagsService::normalizeDeprecatedTag('tinCan')
+// → ['object' => 'soda_can', 'materials' => ['aluminium']]
+
+ClassifyTagsService::normalizeDeprecatedTag('coffeeCups')
+// → ['object' => 'cup', 'materials' => ['paper']]
+```
+
+### Old AddTags job flow (REPLACED by ConvertV4TagsAction)
+
+The old `AddTags` job has been replaced. Both `AddTagsToUploadedImageController` and `ApiPhotosController::uploadWithOrWithoutTags()` now call `ConvertV4TagsAction::run()` synchronously instead of dispatching the old job.
+
+## Common Mistakes
+
+- **Building ConvertV4TagsAction without handling the `brands` category.** Mobile sends brands under `tags.brands.{brandKey}`. These need brand-only PhotoTags.
+- **Not using `ClassifyTagsService::normalizeDeprecatedTag()`.** Old mobile keys like `beerBottle`, `tinCan` must be normalized before lookup.
+- **Skipping summary generation.** Without summary, MetricsService processes zero metrics.
+- **Duplicating tag records on retry.** Use `PhotoTag::firstOrCreate()` or check existing tags before creating.
+- **Modifying the mobile API contract.** The shim must accept the exact same request format. No new required fields.
diff --git a/.ai/skills/photo-pipeline/SKILL.md b/.ai/skills/photo-pipeline/SKILL.md
new file mode 100644
index 000000000..bee663a67
--- /dev/null
+++ b/.ai/skills/photo-pipeline/SKILL.md
@@ -0,0 +1,173 @@
+---
+name: photo-pipeline
+description: Photo upload, tagging, verification status, summary generation, XP calculation, AddTagsToPhotoAction, UploadPhotoController, and the VerificationStatus enum.
+---
+
+# Photo Pipeline
+
+Photos flow through three phases: Upload (observation only) -> Tag (summary + XP) -> Verify (metrics). Each phase is independent and idempotent.
+
+## Key Files
+
+- `app/Http/Controllers/Uploads/UploadPhotoController.php` — Web upload entry point
+- `app/Http/Controllers/API/Tags/PhotoTagsController.php` — V5 tagging endpoint (`POST /api/v3/tags`)
+- `app/Actions/Tags/AddTagsToPhotoAction.php` — Core tagging logic (v5)
+- `app/Services/Tags/GeneratePhotoSummaryService.php` — Builds summary JSON + calculates XP
+- `app/Services/Tags/XpCalculator.php` — XP scoring rules
+- `app/Enums/VerificationStatus.php` — Photo verification state machine
+- `app/Enums/XpScore.php` — XP values per tag type
+- `app/Http/Requests/Api/PhotoTagsRequest.php` — V5 tag request validation
+- `app/Observers/PhotoObserver.php` — Sets `is_public = false` for school team photos
+
+## Invariants
+
+1. **Upload creates observation only.** No tags, no XP, no summary, no metrics. Just the photo record with location FKs.
+2. **Summary generation is unconditional.** `GeneratePhotoSummaryService::run()` MUST run regardless of trust level. School photos need a summary at tag time so it exists when the teacher approves later. Gating summary behind a trust check causes null summary at approval = zero metrics.
+3. **XP calculation is unconditional.** Runs for all users, before verification.
+4. **`TagsVerifiedByAdmin` only fires for trusted users.** School students' photos stop at `VERIFIED(1)` and wait for teacher approval.
+5. **VerificationStatus is an enum cast.** `$photo->verified` returns the enum, not an int. Use `->value` for `>=`/`<` comparisons, `===` for equality checks. Never compare enum to raw int.
+
+## VerificationStatus Enum
+
+```php
+enum VerificationStatus: int
+{
+ case UNVERIFIED = 0; // Uploaded, no tags
+ case VERIFIED = 1; // Tagged (school students land here, awaiting teacher)
+ case ADMIN_APPROVED = 2; // Verified by admin/trusted user OR teacher-approved
+ case BBOX_APPLIED = 3; // Bounding boxes drawn
+ case BBOX_VERIFIED = 4; // Bounding boxes verified
+ case AI_READY = 5; // Ready for OpenLitterAI training
+
+ public function isPublicReady(): bool // >= ADMIN_APPROVED
+ public function isVerified(): bool // >= VERIFIED
+}
+```
+
+## Patterns
+
+### Phase 1: Upload
+
+`UploadPhotoController::__invoke()` flow:
+1. `MakeImageAction::run($file)` — extract EXIF
+2. `UploadPhotoAction::run()` x2 — S3 full image + bbox thumbnail
+3. `ResolveLocationAction::run($lat, $lon)` — Country/State/City FKs
+4. `Photo::create()` — observation record with FKs only
+5. `event(new ImageUploaded(...))` — real-time broadcast
+
+### Phase 2: Tagging
+
+`PhotoTagsController::store()` -> `AddTagsToPhotoAction::run()`:
+
+```php
+public function run(int $userId, int $photoId, array $tags): array
+{
+ $photoTags = $this->addTagsToPhoto($userId, $photoId, $tags);
+ // Creates PhotoTag + PhotoTagExtraTags (materials, brands, custom)
+ // Handles 4 tag types: object, custom-only, brand-only, material-only
+
+ $photo->generateSummary();
+ // ALWAYS — generates summary JSON from PhotoTag records
+
+ $photo->xp = $this->calculateXp($photoTags);
+ // ALWAYS — sets XP before verification
+
+ $this->updateVerification($userId, $photo);
+ // Routes to trusted path or school-pending path
+}
+```
+
+### Frontend tag types handled by AddTagsToPhotoAction
+
+The web frontend sends 4 distinct tag types. `resolveTag()` handles each:
+
+1. **Object tag** — `{ object: { id, key }, quantity, materials?, brands? }`. Category auto-resolved from `object->categories()->first()`.
+2. **Custom-only** — `{ custom: true, key: "dirty-bench", quantity }`. Uses `$tag['key']` (not `$tag['custom']`).
+3. **Brand-only** — `{ brand_only: true, brand: { id, key }, quantity }`. PhotoTag with null category/object.
+4. **Material-only** — `{ material_only: true, material: { id, key }, quantity }`. Same as brand-only pattern.
+
+### Verification routing
+
+```php
+protected function updateVerification(int $userId, Photo $photo): void
+{
+ $user = User::find($userId);
+
+ if ($user->verification_required) {
+ if ($photo->team_id) {
+ $team = Team::find($photo->team_id);
+ if ($team && $team->isSchool()) {
+ $photo->verified = VerificationStatus::VERIFIED->value;
+ // STOP here — no TagsVerifiedByAdmin, no metrics
+ }
+ }
+ } else {
+ // Trusted user — immediate approval
+ $photo->verified = VerificationStatus::ADMIN_APPROVED->value;
+ event(new TagsVerifiedByAdmin(
+ $photo->id, $photo->user_id,
+ $photo->country_id, $photo->state_id,
+ $photo->city_id, $photo->team_id
+ ));
+ }
+}
+```
+
+### XP calculation
+
+```php
+// XpScore enum values:
+Upload => 5 // Base for every photo
+Object => 1 // Per litter item (default)
+Material => 2 // Per material tag
+Brand => 3 // Per brand tag
+CustomTag => 1 // Per custom tag
+PickedUp => 5 // Bonus if photo.remaining = false
+Small => 10 // Special objects: 'small'
+Medium => 25 // Special objects: 'medium'
+Large => 50 // Special objects: 'large'
+BagsLitter => 10 // Special objects: 'bagsLitter'
+```
+
+### Summary JSON structure
+
+```json
+{
+ "tags": {
+ "2": {
+ "65": {
+ "quantity": 5,
+ "materials": {"16": 3, "15": 2},
+ "brands": {"12": 3}
+ }
+ }
+ },
+ "totals": {
+ "total_tags": 15, "total_objects": 5,
+ "by_category": {"2": 10},
+ "materials": 8, "brands": 3, "custom_tags": 0
+ },
+ "keys": {
+ "categories": {"2": "smoking"},
+ "objects": {"65": "wrapper"},
+ "materials": {"16": "plastic"},
+ "brands": {"12": "marlboro"}
+ }
+}
+```
+
+### Photo model hidden attribute
+
+```php
+protected $hidden = ['geom']; // Binary spatial data — breaks JSON serialization
+```
+
+Always ensure `geom` stays in `$hidden`. If you need coordinates, use `lat`/`lon` columns.
+
+## Common Mistakes
+
+- **Gating summary generation behind trust check.** Summary MUST be unconditional. This is the #1 cause of broken metrics for school photos.
+- **Comparing VerificationStatus enum to int.** `$photo->verified >= 2` fails. Use `$photo->verified->value >= VerificationStatus::ADMIN_APPROVED->value`.
+- **Dispatching `TagsVerifiedByAdmin` for school students.** School photos must wait for teacher approval. Only trusted users get immediate dispatch.
+- **Including `geom` in API responses.** Binary spatial data. Keep it in `$hidden`.
+- **Forgetting `city_id` in factory.** PhotoFactory doesn't include `city_id` by default. Add `'city_id' => City::factory()` when testing location-dependent features.
diff --git a/.ai/skills/tagging-system/SKILL.md b/.ai/skills/tagging-system/SKILL.md
new file mode 100644
index 000000000..af08b9aed
--- /dev/null
+++ b/.ai/skills/tagging-system/SKILL.md
@@ -0,0 +1,206 @@
+---
+name: tagging-system
+description: PhotoTag, PhotoTagExtraTags, categories, litter objects, materials, brands, ClassifyTagsService, GeneratePhotoSummaryService, tag migration, and the v4-to-v5 conversion.
+---
+
+# Tagging System
+
+V5 uses a normalized hierarchy: Photo -> PhotoTag (category + object + quantity) -> PhotoTagExtraTags (materials, brands, custom tags). All tag data lives in `photo_tags` and `photo_tag_extra_tags` tables — not the old per-category tables.
+
+## Key Files
+
+- `app/Models/Litter/Tags/PhotoTag.php` — Primary tag record (category + object)
+- `app/Models/Litter/Tags/PhotoTagExtraTags.php` — Materials, brands, custom tags per tag
+- `app/Models/Litter/Tags/Category.php` — Tag categories (smoking, food, etc.)
+- `app/Models/Litter/Tags/LitterObject.php` — Taggable objects (butts, wrapper, etc.)
+- `app/Models/Litter/Tags/BrandList.php` — Brand records (`brandslist` table)
+- `app/Models/Litter/Tags/Materials.php` — Material records (`materials` table)
+- `app/Models/Litter/Tags/CustomTagNew.php` — Custom tags (`custom_tags_new` table)
+- `app/Models/Litter/Tags/CategoryObject.php` — Pivot: `category_litter_object`
+- `app/Services/Tags/ClassifyTagsService.php` — Tag classification + deprecated key mapping
+- `app/Services/Tags/UpdateTagsService.php` — V4->V5 migration per photo
+- `app/Services/Tags/GeneratePhotoSummaryService.php` — Summary JSON + XP from PhotoTags
+- `app/Services/Tags/XpCalculator.php` — XP scoring rules
+- `app/Enums/Dimension.php` — Tag type enum (object, category, material, brand, custom_tag)
+
+## Invariants
+
+1. **`photo_tags` uses FK columns:** `category_id` and `litter_object_id` (not string columns). Tests must create Category/LitterObject records and use their IDs.
+2. **`photo_tag_extra_tags` is polymorphic:** `tag_type` is `'material'|'brand'|'custom_tag'`, `tag_type_id` is the FK to the respective table.
+3. **Namespace is `App\Models\Litter\Tags\PhotoTag`**, not `App\Models\PhotoTag`.
+4. **Summary generation MUST follow any tag change.** Call `$photo->generateSummary()` after creating/updating/deleting PhotoTags.
+5. **Unknown tags are auto-created:** `LitterObject::firstOrCreate(['key' => $key], ['crowdsourced' => true])`.
+
+## Patterns
+
+### Creating a tag with extras
+
+```php
+// Create primary tag
+$photoTag = PhotoTag::create([
+ 'photo_id' => $photo->id,
+ 'category_id' => $category->id,
+ 'litter_object_id' => $object->id,
+ 'quantity' => 5,
+ 'picked_up' => true,
+]);
+
+// Attach materials
+$photoTag->attachExtraTags([
+ ['id' => $plasticId, 'quantity' => 5],
+ ['id' => $paperId, 'quantity' => 3],
+], 'material', 0);
+
+// Attach brands
+$photoTag->attachExtraTags([
+ ['id' => $marlboroId, 'quantity' => 3],
+], 'brand', 0);
+```
+
+### Custom-tag-only tags (no category/object)
+
+```php
+$photoTag = PhotoTag::create([
+ 'photo_id' => $photo->id,
+ 'custom_tag_primary_id' => $customTag->id,
+ 'quantity' => $quantity,
+ 'picked_up' => $pickedUp,
+]);
+```
+
+### Brand-only tags (no specific object)
+
+```php
+$photoTag = PhotoTag::create([
+ 'photo_id' => $photo->id,
+ 'category_id' => Category::where('key', 'brands')->value('id'),
+ 'quantity' => array_sum($brandQuantities),
+]);
+$photoTag->attachExtraTags($brands, Dimension::BRAND->value, 0);
+```
+
+### Deprecated key normalization (v4 -> v5)
+
+```php
+// ClassifyTagsService::normalizeDeprecatedTag('beerBottle')
+// Returns: ['object' => 'beer_bottle', 'materials' => ['glass']]
+
+// ClassifyTagsService::normalizeDeprecatedTag('coffeeCups')
+// Returns: ['object' => 'cup', 'materials' => ['paper']]
+
+// ClassifyTagsService::normalizeDeprecatedTag('butts')
+// Returns: ['object' => 'butts', 'materials' => ['plastic', 'paper']]
+```
+
+130+ mappings from old camelCase keys to normalized keys with inferred materials.
+
+### Dimension enum
+
+```php
+enum Dimension: string
+{
+ case LITTER_OBJECT = 'object'; // table: litter_objects
+ case CATEGORY = 'category'; // table: categories
+ case MATERIAL = 'material'; // table: materials
+ case BRAND = 'brand'; // table: brandslist
+ case CUSTOM_TAG = 'custom_tag'; // table: custom_tags_new
+
+ public function table(): string
+ public static function fromTable(string $table): ?self
+}
+```
+
+### Database schema
+
+```sql
+-- photo_tags: FK columns, NOT strings
+photo_tags (
+ id, photo_id, category_id, litter_object_id,
+ custom_tag_primary_id, -- for custom-only tags
+ quantity, picked_up,
+ created_at, updated_at
+)
+
+-- photo_tag_extra_tags: polymorphic extras
+photo_tag_extra_tags (
+ id, photo_tag_id,
+ tag_type, -- 'material'|'brand'|'custom_tag'
+ tag_type_id, -- FK to materials/brandslist/custom_tags_new
+ quantity, index,
+ created_at, updated_at
+)
+
+-- Reference tables
+categories (id, key, parent_id)
+litter_objects (id, key, crowdsourced)
+materials (id, key)
+brandslist (id, key, crowdsourced)
+custom_tags_new (id, key)
+category_litter_object (id, category_id, litter_object_id) -- pivot
+```
+
+### TagKeyCache for performance
+
+```php
+use App\Services\Achievements\Tags\TagKeyCache;
+
+// Lookup
+$id = TagKeyCache::idFor('material', 'glass'); // null if not found
+$id = TagKeyCache::getOrCreateId('material', 'glass'); // creates if missing
+$key = TagKeyCache::keyFor('material', $id); // reverse lookup
+
+// Bulk preload (call once at script startup)
+TagKeyCache::preloadAll();
+```
+
+Three-layer cache: in-memory array -> Redis hash (24h TTL) -> database fallback.
+
+## Web Frontend Tag Types (POST /api/v3/tags)
+
+The Vue frontend sends 4 distinct tag types to `AddTagsToPhotoAction`:
+
+### 1. Object tag (with optional materials/brands/custom_tags)
+```json
+{ "object": { "id": 5, "key": "butts" }, "quantity": 3, "picked_up": true,
+ "materials": [{ "id": 2, "key": "plastic" }], "brands": [], "custom_tags": [] }
+```
+Backend auto-resolves category from `object->categories()->first()`. Category need NOT be sent.
+
+### 2. Custom-only tag
+```json
+{ "custom": true, "key": "dirty-bench", "quantity": 1, "picked_up": null }
+```
+`$tag['custom']` is boolean true (flag), `$tag['key']` is the actual tag name. Creates `CustomTagNew` via `$tag['key']`.
+
+### 3. Brand-only tag
+```json
+{ "brand_only": true, "brand": { "id": 1, "key": "coca-cola" }, "quantity": 1 }
+```
+Creates PhotoTag with null category/object, attaches brand as extra tag.
+
+### 4. Material-only tag
+```json
+{ "material_only": true, "material": { "id": 2, "key": "plastic" }, "quantity": 1 }
+```
+Same pattern as brand-only — PhotoTag with null FKs, material as extra tag.
+
+### Frontend files
+| File | Purpose |
+|---|---|
+| `resources/js/views/General/Tagging/v2/AddTags.vue` | Main tagging page |
+| `resources/js/views/General/Tagging/v2/components/UnifiedTagSearch.vue` | Tag search combobox |
+| `resources/js/views/General/Tagging/v2/components/TagCard.vue` | Individual tag card |
+| `resources/js/stores/photos/requests.js` | `UPLOAD_TAGS()` → POST /api/v3/tags |
+| `resources/js/stores/tags/requests.js` | `GET_ALL_TAGS()` → GET /api/tags/all |
+
+## Common Mistakes
+
+- **Using string keys in `photo_tags`.** The table uses `category_id` and `litter_object_id` (integer FKs), not string columns like `'smoking'` or `'butts'`.
+- **Forgetting to regenerate summary after tag changes.** Always call `$photo->generateSummary()` after modifying PhotoTags.
+- **Looking for PhotoTag in `App\Models\`.** The namespace is `App\Models\Litter\Tags\PhotoTag`.
+- **Confusing `brandslist` table name.** Not `brands` — the table is literally `brandslist`.
+- **Attaching brands directly to objects.** Brand matching is deferred. Brands go through `attachExtraTags()` or as brand-only PhotoTags.
+- **Not handling `custom_tag_primary_id`.** Custom-only tags have no `category_id` or `litter_object_id` — they use `custom_tag_primary_id` instead.
+- **Expecting category from frontend.** The web frontend sends `object.id` but NOT `category`. Backend auto-resolves category from `object->categories()->first()`.
+- **Reading `$tag['custom']` as the tag name.** It's a boolean flag. The actual name is `$tag['key']`.
+- **Checking `$tag['brands']` for brand-only tags.** Brand-only tags use `$tag['brand']` (singular) + `$tag['brand_only']` flag.
diff --git a/.ai/skills/teams-safeguarding/SKILL.md b/.ai/skills/teams-safeguarding/SKILL.md
new file mode 100644
index 000000000..75a3e544c
--- /dev/null
+++ b/.ai/skills/teams-safeguarding/SKILL.md
@@ -0,0 +1,152 @@
+---
+name: teams-safeguarding
+description: Teams, school teams, team photos, approval flow, TeamPhotosController, privacy, is_public, PhotoObserver, MasksStudentIdentity, and safeguarding.
+---
+
+# Teams & Safeguarding
+
+School teams enforce a private-by-default pipeline. Photos are invisible to the public until a teacher approves them. This protects minors and ensures data quality.
+
+## Key Files
+
+- `app/Http/Controllers/Teams/TeamPhotosController.php` — Photo listing, approval, tag editing, map points
+- `app/Observers/PhotoObserver.php` — Sets `is_public = false` on school team photo creation
+- `app/Traits/MasksStudentIdentity.php` — Masks student names as "Student N"
+- `app/Models/Teams/Team.php` — `isSchool()`, `isLeader()`, `hasSafeguarding()`
+- `app/Models/Teams/TeamType.php` — `team` column: `'school'` or `'community'`
+- `app/Actions/Teams/CreateTeamAction.php` — Team creation with school-specific fields
+- `app/Http/Requests/Teams/CreateTeamRequest.php` — Validation + `school_manager` role check
+- `app/Events/SchoolDataApproved.php` — Private broadcast on `team.{id}` channel
+- `app/Listeners/NotifyTeamOfApproval.php` — Notifies team members after approval
+
+## Invariants
+
+1. **School photos start private.** `PhotoObserver::creating()` sets `is_public = false` when `team.isSchool()`. This is non-negotiable.
+2. **All public queries use `Photo::public()` or `where('is_public', true)`.** Missing this leaks school data to maps, clusters, exports, and points API.
+3. **School teams must NOT be `is_trusted`.** Trust bypasses the teacher approval step entirely. School teams default to `is_trusted = false`.
+4. **Teacher approval is atomic and idempotent.** The `WHERE is_public = false` clause prevents double-processing of already-approved photos.
+5. **Safeguarding uses deterministic numbering.** Student names are masked based on `team_user.id` (creation order), not photo data or pagination.
+6. **SchoolDataApproved broadcasts on a private channel** (`team.{id}`). School team names (e.g., "St. X 1st Years 2026") must never appear on public channels.
+
+## Patterns
+
+### PhotoObserver — automatic privacy
+
+```php
+// app/Observers/PhotoObserver.php
+public function creating(Photo $photo): void
+{
+ if (! $photo->team_id) {
+ return;
+ }
+
+ $team = Team::find($photo->team_id);
+
+ if ($team && $team->isSchool()) {
+ $photo->is_public = false;
+ }
+}
+```
+
+### Teacher approval flow
+
+```php
+// TeamPhotosController::approve()
+DB::transaction(function () {
+ // Atomic update — WHERE is_public = false prevents double-processing
+ Photo::whereIn('id', $approvedIds)
+ ->where('is_public', false)
+ ->update([
+ 'is_public' => true,
+ 'verified' => VerificationStatus::ADMIN_APPROVED->value,
+ 'team_approved_at' => now(),
+ 'team_approved_by' => $user->id,
+ ]);
+
+ // Fire metrics for each newly-approved photo
+ foreach ($affectedPhotos as $photo) {
+ event(new TagsVerifiedByAdmin(
+ photo_id: $photo->id,
+ user_id: $photo->user_id,
+ country_id: $photo->country_id,
+ state_id: $photo->state_id,
+ city_id: $photo->city_id,
+ team_id: $photo->team_id
+ ));
+ }
+
+ event(new SchoolDataApproved($team, $teacher, $count));
+});
+```
+
+### Photo scopes for team queries
+
+```php
+// All public photos (excludes unapproved school photos + soft-deleted)
+Photo::public() // ->where('is_public', true)
+
+// All photos for a team (private view — members see everything)
+Photo::forTeam($teamId)
+
+// Pending teacher approval
+Photo::pendingTeamApproval($teamId)
+// ->where('team_id', $teamId)->where('is_public', false)
+// ->where('verified', '>=', VERIFIED)->whereNull('team_approved_at')
+
+// Already approved by teacher
+Photo::teamApproved($teamId)
+// ->where('team_id', $teamId)->whereNotNull('team_approved_at')
+```
+
+### Safeguarding identity masking
+
+```php
+// MasksStudentIdentity trait
+// Builds stable mapping: user_id -> "Student N" from team_user.id order
+if ($team->hasSafeguarding() && !$team->isLeader($viewer->id)
+ && !$viewer->hasPermissionTo('view student identities')) {
+ // Mask names to "Student 1", "Student 2", etc.
+}
+```
+
+### Team model key methods
+
+```php
+$team->isSchool() // type_name === 'school'
+$team->isLeader($userId) // leader === $userId
+$team->hasSafeguarding() // (bool) safeguarding
+```
+
+### Database indexes for team photo queries
+
+```sql
+-- Approval queue: team_id + is_public + verified + created_at
+INDEX photos_team_approval_idx ON photos(team_id, is_public, verified, created_at)
+
+-- Team photo listing
+INDEX photos_team_public_idx ON photos(team_id, is_public)
+
+-- Public queries
+INDEX photos_public_verified_idx ON photos(is_public, verified)
+```
+
+### Controllers/queries that must use `is_public = true`
+
+- `Maps/GlobalMapController` — global map points
+- `HomeController` — homepage stats
+- `CommunityController` — community page
+- `Leaderboard/LeaderboardController` — leaderboards
+- `DisplayTagsOnMapController` — tag map
+- `History/GetPaginatedHistoryController` — public history
+- `Points/PointsController` — points API
+- `MapController` — map clusters
+- `User/ProfileController` — public profile
+
+## Common Mistakes
+
+- **Querying photos without `Photo::public()` scope on public-facing endpoints.** This leaks school team photos.
+- **Setting `is_trusted = true` on school teams.** Trusted teams bypass teacher approval. School teams must always be `is_trusted = false`.
+- **Broadcasting school data on public channels.** `SchoolDataApproved` must use private channel `team.{id}`.
+- **Using non-deterministic ordering for safeguarding masks.** Masks must be based on `team_user.id` (join order), not photo data.
+- **Forgetting `PhotoObserver` when creating photos in tests.** The observer auto-fires on `Photo::create()`. If testing non-school behavior, ensure `team_id` is null or team is community type.
+- **Double-approving photos.** The `WHERE is_public = false` clause in the approval query prevents this, but don't remove it.
diff --git a/.ai/skills/testing-patterns/SKILL.md b/.ai/skills/testing-patterns/SKILL.md
new file mode 100644
index 000000000..cbcdfc20a
--- /dev/null
+++ b/.ai/skills/testing-patterns/SKILL.md
@@ -0,0 +1,195 @@
+---
+name: testing-patterns
+description: Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.
+---
+
+# Testing Patterns
+
+516 tests passing, 0 failures. PHPUnit 10 with `RefreshDatabase`. Deprecated tests (40 files) excluded via `#[Group('deprecated')]` in phpunit.xml.
+
+## Key Files
+
+- `phpunit.xml` — Config: excludes `deprecated` group, uses `olm_test` DB, Redis DB 2
+- `tests/TestCase.php` — Base class: `RefreshDatabase` + Redis flush + `TagKeyCache::forgetAll()`
+- `tests/Feature/HasPhotoUploads.php` — Trait for old upload-based tests (deprecated)
+- `database/factories/PhotoFactory.php` — Photo with user, country, state, geom
+- `database/factories/Location/CountryFactory.php` — Country with shortcode
+- `database/factories/Location/StateFactory.php` — State with country FK
+- `database/factories/Location/CityFactory.php` — City with country + state FKs
+- `database/factories/Litter/Tags/CategoryFactory.php` — Category with unique key
+- `database/factories/Litter/Tags/LitterObjectFactory.php` — LitterObject with unique key
+
+## Invariants
+
+1. **RefreshDatabase on every test.** The base `TestCase` uses `RefreshDatabase` and flushes Redis in `setUp()` and `tearDown()`.
+2. **`photo_tags` uses FK columns.** Tests must create Category/LitterObject records and use their IDs — not strings.
+3. **Deprecated tests are excluded by default.** Run with `--group=deprecated` to include them. They use old routes (`/submit`, `/add-tags`) that no longer work with v5.
+4. **`Event::fake()` prevents listeners.** If testing event dispatch AND listener side effects (metrics), split into two tests or don't fake.
+5. **Notifications table may not exist.** Fake events if testing notification-dispatching code, or create the `notifications` table.
+
+## Patterns
+
+### Base TestCase setup
+
+```php
+// tests/TestCase.php
+abstract class TestCase extends BaseTestCase
+{
+ use CreatesApplication, RefreshDatabase;
+
+ protected function setUp(): void
+ {
+ parent::setUp();
+ Redis::connection()->flushdb();
+ TagKeyCache::forgetAll();
+ }
+
+ protected function tearDown(): void
+ {
+ Redis::connection()->flushdb();
+ parent::tearDown();
+ }
+}
+```
+
+### Auth guard patterns
+
+```php
+// API guard (Passport) — for /api/* routes
+$this->actingAs($user, 'api')->postJson('/api/v3/tags', [...]);
+
+// Web guard (default) — for web routes
+$this->actingAs($user)->postJson('/add-tags', [...]);
+
+// IMPORTANT: actingAs() bypasses auth middleware entirely.
+// It does NOT test real auth guards (Passport vs Sanctum).
+// 'auth:api' and 'auth:web' will both pass with actingAs().
+```
+
+### Event::fake patterns
+
+```php
+// Pattern 1: Fake specific events (others still fire)
+Event::fake([TagsVerifiedByAdmin::class]);
+// ... do stuff ...
+Event::assertDispatched(TagsVerifiedByAdmin::class, 1);
+Event::assertNotDispatched(SchoolDataApproved::class);
+
+// Pattern 2: Assert with callback
+Event::assertDispatched(
+ TagsVerifiedByAdmin::class,
+ fn (TagsVerifiedByAdmin $e) => $e->photo_id === $photo->id
+);
+
+// Pattern 3: Test both event AND side effects (no fake)
+// Don't fake — let ProcessPhotoMetrics listener run
+$this->postJson('/api/v3/tags', $payload);
+$photo->refresh();
+$this->assertNotNull($photo->processed_at); // MetricsService ran
+```
+
+### Spatie Permissions setup (required for team tests)
+
+```php
+use Spatie\Permission\Models\Permission;
+use Spatie\Permission\Models\Role;
+use Spatie\Permission\PermissionRegistrar;
+
+protected function setUp(): void
+{
+ parent::setUp();
+
+ // CRITICAL: Reset cached permissions between tests
+ app()[PermissionRegistrar::class]->forgetCachedPermissions();
+
+ $permissions = collect([
+ 'create school team', 'manage school team',
+ 'toggle safeguarding', 'view student identities',
+ ])->map(fn ($name) => Permission::firstOrCreate([
+ 'name' => $name, 'guard_name' => 'web'
+ ]));
+
+ $role = Role::firstOrCreate(['name' => 'school_manager', 'guard_name' => 'web']);
+ $role->syncPermissions($permissions);
+}
+```
+
+### Factory usage — let factories create related models
+
+```php
+// GOOD: Let factory handle related models
+$photo = Photo::factory()->create([
+ 'is_public' => true,
+ 'verified' => VerificationStatus::ADMIN_APPROVED->value,
+ 'city_id' => City::factory(), // PhotoFactory doesn't include city_id by default
+]);
+
+// BAD: Hardcoding IDs
+$photo = Photo::factory()->create(['country_id' => 1]); // May not exist
+```
+
+### Team type setup (required for team tests)
+
+```php
+// team_types.price has no default — always provide it
+$communityType = TeamType::create(['team' => 'community', 'price' => 0]);
+$schoolType = TeamType::create(['team' => 'school', 'price' => 0]);
+```
+
+### Seeding tags for tagging tests
+
+```php
+protected function setUp(): void
+{
+ parent::setUp();
+ $this->seed([
+ GenerateTagsSeeder::class,
+ GenerateBrandsSeeder::class,
+ ]);
+}
+```
+
+### VerificationStatus in assertions
+
+```php
+// GOOD: Compare enum values
+$photo->refresh();
+$this->assertEquals(VerificationStatus::ADMIN_APPROVED, $photo->verified);
+// or for ordering:
+$this->assertTrue($photo->verified->value >= VerificationStatus::ADMIN_APPROVED->value);
+
+// BAD: Compare to raw int (fails after enum cast)
+$this->assertEquals(2, $photo->verified); // Comparing enum to int
+```
+
+### Soft-delete assertions
+
+```php
+// After SoftDeletes trait added to Photo model:
+$this->assertSoftDeleted('photos', ['id' => $photo->id]);
+
+// NOT:
+$this->assertDatabaseMissing('photos', ['id' => $photo->id]);
+// (row still exists, just has deleted_at set)
+```
+
+### Running tests
+
+```bash
+php artisan test --compact # All (excludes deprecated)
+php artisan test --compact tests/Feature/Teams/ # Directory
+php artisan test --compact tests/Feature/Photos/AddTagsToPhotoTest.php # Single file
+php artisan test --compact --filter=test_method_name # Single test
+php artisan test --compact --group=deprecated # Deprecated only
+```
+
+## Common Mistakes
+
+- **Forgetting `PermissionRegistrar::forgetCachedPermissions()` in setUp.** Spatie caches permissions across tests. Reset explicitly.
+- **Not providing `'price' => 0` for TeamType.** Column has no default — insert fails.
+- **Faking events when you need side effects.** `Event::fake()` prevents all listeners. If you need MetricsService to run, don't fake `TagsVerifiedByAdmin`.
+- **Using `assertDatabaseMissing` for soft-deleted records.** Use `assertSoftDeleted` instead.
+- **Creating PhotoTags with string keys.** `photo_tags.category_id` and `litter_object_id` are integer FKs. Create Category/LitterObject records first.
+- **Missing `city_id` in photo factory.** The default PhotoFactory doesn't include `city_id`. Add `'city_id' => City::factory()` when testing location-dependent features.
+- **Testing auth guards with `actingAs()`.** This bypasses middleware. It doesn't verify that `auth:api` vs `auth:web` actually works.
+- **Expecting `geom` in JSON responses.** `Photo::$hidden = ['geom']` — binary spatial data is excluded from serialization.
diff --git a/.ai/skills/v5-migration/SKILL.md b/.ai/skills/v5-migration/SKILL.md
new file mode 100644
index 000000000..f2209409c
--- /dev/null
+++ b/.ai/skills/v5-migration/SKILL.md
@@ -0,0 +1,127 @@
+---
+name: v5-migration
+description: The olm:v5 migration script, UpdateTagsService, batch processing, migrated_at, ClassifyTagsService deprecated mappings, and data migration from v4 category tables.
+---
+
+# V5 Migration
+
+`php artisan olm:v5` migrates photos from v4 category-based tags (14 separate tables like `smoking`, `food`, `coffee`) to v5 normalized PhotoTags. Processes per-user, in batches, with idempotency via `migrated_at`.
+
+## Key Files
+
+- `app/Console/Commands/tmp/v5/Migration/MigrationScript.php` — Artisan command
+- `app/Services/Tags/UpdateTagsService.php` — Per-photo v4->v5 conversion
+- `app/Services/Tags/ClassifyTagsService.php` — Tag classification + deprecated key mapping
+- `app/Services/Tags/GeneratePhotoSummaryService.php` — Summary JSON + XP after migration
+- `app/Services/Achievements/Tags/TagKeyCache.php` — Cached tag ID lookups
+- `app/Services/Metrics/MetricsService.php` — Processes metrics post-migration
+
+## Invariants
+
+1. **`migrated_at` prevents reprocessing.** Once set, the photo is skipped on subsequent runs. Re-running processes 0 photos.
+2. **Migration is per-user, batched.** Default 500 photos per batch. Memory managed with `gc_collect_cycles()` between users.
+3. **Three-step per photo:** `UpdateTagsService::updateTags()` -> `GeneratePhotoSummaryService::run()` -> `MetricsService::processPhoto()` -> mark `migrated_at`.
+4. **Errors are logged and skipped.** A failed photo doesn't halt the migration. The next run retries it (no `migrated_at` set).
+5. **Seeds reference tables if empty.** Categories, brands, achievements seeded on first run.
+
+## Patterns
+
+### Command usage
+
+```bash
+php artisan olm:v5 # All users
+php artisan olm:v5 --user=123 # Single user
+php artisan olm:v5 --batch=1000 # Custom batch size
+php artisan olm:v5 --skip-locations # Skip location cleanup step
+```
+
+### Migration flow per photo
+
+```php
+// UpdateTagsService::updateTags($photo)
+public function updateTags(Photo $photo): void
+{
+ // 1. Read v4 data from old category relationships
+ [$tags, $customTagsOld] = $this->getTags($photo);
+
+ // 2. Classify each tag (handles deprecated key mapping)
+ $parsed = $this->parseTags($tags, $customTagsOld, $photo->id);
+ // Returns: ['groups' => [...], 'globalBrands' => [...], 'customTags' => [...]]
+
+ // 3. Create v5 PhotoTag + PhotoTagExtraTags records
+ $this->createPhotoTags($photo, $parsed);
+}
+```
+
+### Tag parsing (v4 -> v5 classification)
+
+```php
+// Input: ['smoking' => ['butts' => 5, 'cigaretteBox' => 1], 'brands' => ['marlboro' => 3]]
+
+// For each tag:
+$result = $this->classifyTags->classify($tagKey);
+// 1. Check normalizeDeprecatedTag() — maps old keys to new + materials
+// 2. Look up Category by key
+// 3. Look up LitterObject by key (or auto-create as crowdsourced)
+// 4. Return classification with materials list
+
+// Output groups structure:
+[
+ 'groups' => [
+ 'smoking' => [
+ 'category_id' => 2,
+ 'objects' => [
+ ['id' => 45, 'key' => 'butts', 'quantity' => 5, 'materials' => ['plastic', 'paper']],
+ ]
+ ]
+ ],
+ 'globalBrands' => [['id' => 12, 'key' => 'marlboro', 'quantity' => 3]],
+ 'customTags' => [...]
+]
+```
+
+### TagKeyCache preloading
+
+```php
+// Called once at script startup for performance
+TagKeyCache::preloadAll();
+
+// Three-layer cache: in-memory array -> Redis hash (24h TTL) -> database
+$id = TagKeyCache::idFor('material', 'glass'); // fast lookup
+$id = TagKeyCache::getOrCreateId('material', 'glass'); // upsert if missing
+```
+
+### Memory management
+
+```php
+// In migration loop:
+DB::disableQueryLog(); // Prevent query log from growing
+gc_collect_cycles(); // Between users
+// Batch stats: time, speed (photos/sec), memory delta per batch
+```
+
+### MigrationScript command structure
+
+```php
+protected $signature = 'olm:v5
+ {--skip-locations : Skip the locations cleanup step}
+ {--user= : Specific user ID to migrate}
+ {--batch=500 : Number of photos per batch}';
+
+public function handle(): int
+{
+ $this->ensureProcessingColumns(); // Add processed_* if missing
+ $this->seedReferenceTables(); // Categories, brands, achievements
+ TagKeyCache::preloadAll();
+ DB::disableQueryLog();
+ $this->runMigration(); // Per-user, batched
+}
+```
+
+## Common Mistakes
+
+- **Removing `migrated_at` check.** This is the idempotency guard. Without it, photos get double-migrated.
+- **Running without `TagKeyCache::preloadAll()`.** Cold lookups hit the database per tag. Preload caches first.
+- **Not calling `GeneratePhotoSummaryService` after tag creation.** Summary must be generated for MetricsService to read.
+- **Assuming all v4 keys map 1:1 to v5.** Many v4 keys like `beerBottle` split into object + materials. `normalizeDeprecatedTag()` handles this.
+- **Processing brands inline.** Brands are deferred to `globalBrands` array — not attached to specific objects during migration.
diff --git a/.env.example b/.env.example
index eb7cb6a43..16952955d 100644
--- a/.env.example
+++ b/.env.example
@@ -22,12 +22,15 @@ LOCATE_API_KEY=
MIX_GOOGLE_RECAPTCHA_KEY=6LcvHsIZAAAAAOG0q9-1vY3uWqu0iFvUC3tCNhID
MIX_GOOGLE_RECAPTCHA_SECRET=
-BROADCAST_DRIVER=pusher
+BROADCAST_DRIVER=reverb
CACHE_DRIVER=file
-SESSION_DRIVER=file
QUEUE_DRIVER=redis
QUEUE_CONNECTION=redis
+SESSION_DRIVER=cookie
+SESSION_DOMAIN=olm.test
+SANCTUM_STATEFUL_DOMAINS=olm.test
+
MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
@@ -56,11 +59,6 @@ x500_AWS_REGION=us-east-1
x500_AWS_BUCKET=olm-public-bbox
x500_AWS_ENDPOINT=http://192.168.56.4:9600
-PUSHER_APP_ID=local
-PUSHER_APP_KEY=local
-PUSHER_APP_SECRET=local
-PUSHER_APP_CLUSTER=eu
-
WEBSOCKET_BROADCAST_HOST=192.168.10.10
LOCATION_API_KEY=
@@ -70,6 +68,13 @@ BACKUP_ARCHIVE_PASSWORD=
DROPBOX_TOKEN=
SLACK_WEBHOOK_URL=
+REVERB_APP_ID=1
+REVERB_APP_KEY=2
+REVERB_APP_SECRET=3
+REVERB_HOST=olm.test
+REVERB_PORT=8080
+REVERB_SCHEME=https
+
OPTIMIZE="true"
NETWORK=preprod
NETWORK_PARAMS_FILE="preprod.json"
diff --git a/.env.testing b/.env.testing
index d0e4eaaaa..7d8455a68 100644
--- a/.env.testing
+++ b/.env.testing
@@ -1,6 +1,6 @@
APP_NAME=OpenLitterMap
APP_ENV=testing
-APP_KEY=base64:wtfMWBVJMehE9KRxZqwTmY+G0vPoCoPOwtloNZmueLM=
+APP_KEY=base64:WCUtPA8Ky7rrK2cckMwmSo5E58UuQk8wKUud7SqjAgk=
APP_DEBUG=true
APP_URL=http://olm.test
APP_ROOT_DIR=/home/vagrant/Code/olm
@@ -20,14 +20,16 @@ DB_FOREIGN_KEYS=false
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
+REDIS_DB=1
+REDIS_CLIENT=phpredis
LOCATE_API_KEY=
MIX_GOOGLE_RECAPTCHA_KEY=
MIX_GOOGLE_RECAPTCHA_SECRET=
-BROADCAST_DRIVER=pusher
-CACHE_DRIVER=file
+BROADCAST_DRIVER=reverb
+CACHE_DRIVER=redis
SESSION_DRIVER=file
QUEUE_DRIVER=redis
QUEUE_CONNECTION=redis
@@ -54,19 +56,14 @@ AWS_KEY=homestead
AWS_SECRET=secretkey
AWS_BUCKET=olm-public
AWS_REGION=us-east-1
-AWS_ENDPOINT=http://192.168.56.4:9600
+AWS_ENDPOINT=http://127.0.0.1:9000
+MINIO_PATH_STYLE_ENDPOINT=true
x500_AWS_KEY=homestead
x500_AWS_SECRET=secretkey
x500_AWS_REGION=us-east-1
x500_AWS_BUCKET=olm-public-bbox
-x500_AWS_ENDPOINT=http://192.168.56.4:9600
-
-PUSHER_APP_ID=
-PUSHER_APP_KEY=
-PUSHER_APP_SECRET=
-PUSHER_APP_CLUSTER=eu
-LARAVEL_WEBSOCKETS_PORT=6002
+x500_AWS_ENDPOINT=http://127.0.0.1:9000
WEBSOCKET_BROADCAST_HOST=192.168.56.4
diff --git a/.github/workflows/laravel.yml b/.github/workflows/laravel.yml
index 400397a80..0eb9fbcff 100644
--- a/.github/workflows/laravel.yml
+++ b/.github/workflows/laravel.yml
@@ -1,32 +1,62 @@
-name: Laravel
+name: Laravel CI
on:
push:
- branches: [ master, staging ]
+ branches:
+ - master
+ - staging
+ - upgrade/tagging-2025
pull_request:
- branches: [ master, staging ]
+ branches:
+ - master
+ - staging
+ - upgrade/tagging-2025
jobs:
- laravel-tests:
-
+ tests:
runs-on: ubuntu-latest
+ services:
+ mysql:
+ image: mysql:5.7
+ env:
+ MYSQL_ROOT_PASSWORD: secret
+ MYSQL_DATABASE: olm_test
+ ports: [3306:3306]
+ options: >-
+ --health-cmd="mysqladmin ping -h 127.0.0.1 -psecret"
+ --health-interval=10s --health-timeout=5s --health-retries=3
+
+ redis:
+ image: redis:7
+ ports: [6379:6379]
+
env:
APP_ENV: testing
+
+ # database
+ DB_CONNECTION: mysql
+ DB_HOST: 127.0.0.1
+ DB_PORT: 3306
DB_DATABASE: olm_test
DB_USERNAME: root
DB_PASSWORD: secret
+
+ # misc drivers
BROADCAST_DRIVER: log
CACHE_DRIVER: array
QUEUE_CONNECTION: sync
SESSION_DRIVER: array
- AWS_KEY: minioadmin
- AWS_SECRET: minioadmin
- AWS_REGION: us-east-1
+
+ # fake S3/MinIO (used only by tests)
+ AWS_ACCESS_KEY_ID: minioadmin
+ AWS_SECRET_ACCESS_KEY: minioadmin
+ AWS_DEFAULT_REGION: us-east-1
+ AWS_EC2_METADATA_DISABLED: true
AWS_BUCKET: olm-public
AWS_ENDPOINT: http://127.0.0.1:9000
- x500_AWS_KEY: minioadmin
- x500_AWS_SECRET: minioadmin
+ x500_AWS_ACCESS_KEY_ID: minioadmin
+ x500_AWS_SECRET_ACCESS_KEY: minioadmin
x500_AWS_REGION: us-east-1
x500_AWS_BUCKET: olm-public-bbox
x500_AWS_ENDPOINT: http://127.0.0.1:9000
@@ -48,57 +78,61 @@ jobs:
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- - uses: shivammathur/setup-php@v2
- with:
- php-version: '8.2'
- extensions: mbstring, dom, fileinfo, mysql
- # coverage: xdebug #optional
- - uses: actions/checkout@v3
- with:
- node-version: 18.20.3
- - uses: actions/setup-node@v3
- with:
- node-version: 18.20.3
- - name: Start mysql service
- run: sudo service mysql start
- - name: Setup minio
- run: |
- docker run -d -p 9000:9000 --name minio \
- -e "MINIO_ACCESS_KEY=minioadmin" \
- -e "MINIO_SECRET_KEY=minioadmin" \
- -v /tmp/data:/data \
- -v /tmp/config:/root/.minio \
- minio/minio server /data
-
- export AWS_ACCESS_KEY_ID=minioadmin
- export AWS_SECRET_ACCESS_KEY=minioadmin
- export AWS_EC2_METADATA_DISABLED=true
-
- aws --endpoint-url http://127.0.0.1:9000/ s3 mb s3://olm-public
- aws --endpoint-url http://127.0.0.1:9000/ s3 mb s3://olm-public-bbox
- - name: Copy .env
- run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- - name: Install Dependencies
- run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- - name: Generate key
- run: php artisan key:generate
- - name: Install Passport
- run: php artisan passport:keys
- - name: Clear Config
- run: php artisan config:clear
- - name: Run Migration
- run: php artisan migrate -v
- env:
- DB_PORT: ${{ job.services.mysql.ports['3306'] }}
- REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
- - name: Directory Permissions
- run: chmod -R 777 storage bootstrap/cache
- - name: Install NPM assets
- run: npm install --silent --force
- - name: Compile NPM assets
- run: npm run build --silent
- - name: Execute tests (Unit and Feature tests) via PHPUnit
- run: vendor/bin/phpunit
- env:
- DB_PORT: ${{ job.services.mysql.ports['3306'] }}
- REDIS_PORT: ${{ job.services.redis.ports['6379'] }}
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Copy test fixture image
+ run: |
+ mkdir -p storage/framework/testing
+ cp tests/Unit/img_with_exif.JPG storage/framework/testing/img_with_exif.JPG
+
+ - name: Remove old config cache
+ run: rm -f bootstrap/cache/config.php
+
+ - name: Set up PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: 8.2
+ extensions: mbstring, dom, fileinfo, mysql, pdo_mysql
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: 18
+
+ - name: Prepare .env
+ run: cp .env.testing .env
+
+ - name: Wait for MySQL
+ run: |
+ for i in {1..30}; do
+ nc -z 127.0.0.1 3306 && exit 0
+ echo "Waiting for MySQL…"
+ sleep 2
+ done
+ exit 1
+
+ - name: Install Composer dependencies
+ run: composer install --no-interaction --prefer-dist --optimize-autoloader --no-scripts
+
+ - name: Discover packages
+ run: php artisan package:discover --ansi
+
+ - name: Generate Passport encryption keys
+ run: php artisan passport:keys --force
+
+ - name: Install Passport (keys + clients)
+ run: php artisan passport:install --no-interaction
+
+ - name: Run migrations
+ run: php artisan migrate --force --no-interaction -vvv
+
+ - name: npm ci & build (optional)
+ run: |
+ npm ci --silent --force
+ npm run build --if-present
+
+ - name: PHPUnit
+ run: vendor/bin/phpunit --colors=always
+ env:
+ REDIS_PORT: ${{ job.services.redis.ports[6379] }}
diff --git a/.gitignore b/.gitignore
index 3503a7b2f..1ac33a560 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,5 @@ yarn-error.log
.vscode
.idea
.eslintignore
+/storage/seeders/brands.txt
+/readme/Strategy.md
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 000000000..dc4ffe3de
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,17 @@
+{
+ "semi": true,
+ "singleQuote": true,
+ "printWidth": 120,
+ "tabWidth": 4,
+ "trailingComma": "es5",
+ "bracketSpacing": true,
+ "vueIndentScriptAndStyle": false,
+ "overrides": [
+ {
+ "files": "*.vue",
+ "options": {
+ "vueIndentScriptAndStyle": false
+ }
+ }
+ ]
+}
diff --git a/.styleci.yml b/.styleci.yml
index 1db61d96e..d4a18c894 100644
--- a/.styleci.yml
+++ b/.styleci.yml
@@ -9,5 +9,5 @@ php:
js:
finder:
not-name:
- - webpack.mix.js
+ - webpack.mix.old_js
css: true
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 000000000..4955f0844
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,433 @@
+# OpenLitterMap Web
+
+Open-source platform for mapping and tagging litter worldwide. Laravel 11 + Vue 3 SPA.
+
+## Quick Reference
+
+```bash
+# Install
+composer install && npm install
+cp .env.example .env && php artisan key:generate
+
+# Dev servers
+php artisan serve # Backend (localhost:8000)
+npm run dev # Frontend Vite HMR
+
+# Build
+npm run build
+
+# Tests (PHPUnit 10)
+php artisan test # All tests
+php artisan test tests/Feature/Teams/CreateTeamTest.php # Single file
+php artisan test --filter=test_method_name # Single test
+
+# Database
+php artisan migrate
+php artisan migrate:rollback
+
+# Queues & WebSockets
+php artisan queue:work
+php artisan reverb:start
+php artisan horizon
+```
+
+## Tech Stack
+
+- **Backend:** PHP 8.2, Laravel 11
+- **Frontend:** Vue 3 (Composition API + `
- *
+ *
*
- *
+ *
*
diff --git a/resources/js/app.js b/resources/js/app.js
index 078cfbe25..75628ba2f 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -1,53 +1,47 @@
-import './bootstrap';
-import '../css/app.css';
+import './bootstrap.js';
-import Vue from 'vue';
-import store from './store';
-import VueRouter from 'vue-router';
-import router from './routes';
+// Main app files
+import { createApp } from 'vue';
+import App from './App.vue';
+import router from './router';
import i18n from './i18n';
-import VueLocalStorage from 'vue-localstorage';
-import VueSweetalert2 from 'vue-sweetalert2';
-import 'sweetalert2/dist/sweetalert2.min.css';
-import VueToastify from 'vue-toastify';
-import VueNumber from 'vue-number-animation';
-import VueEcho from 'vue-echo-laravel';
-import Buefy from 'buefy';
-import fullscreen from 'vue-fullscreen';
-import LaravelPermissionToVueJS from './extra/laravel-permission-to-vuejs';
-
-import VueImg from 'v-img';
-import VueTypedJs from 'vue-typed-js'
-
-import RootContainer from './views/RootContainer.vue';
-
-Vue.use(Buefy);
-Vue.use(VueRouter);
-Vue.use(VueLocalStorage);
-Vue.use(VueSweetalert2);
-Vue.use(VueToastify, {
- theme: 'dark',
- errorDuration: 5000,
-});
-// Vue.use(VueMask)
-Vue.use(VueNumber);
-Vue.use(VueEcho, window.Echo);
-Vue.use(fullscreen);
-Vue.use(VueImg);
-Vue.use(VueTypedJs);
-Vue.use(LaravelPermissionToVueJS);
-
-// Format a number with commas: "10,000"
-Vue.filter('commas', value => {
- return parseInt(value).toLocaleString();
-});
-
-const vm = new Vue({
- el: '#app',
- store,
- router,
- i18n,
- components: {
- RootContainer
- }
-});
+
+// Pinia global store
+import { createPinia } from 'pinia';
+const pinia = createPinia();
+import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
+pinia.use(piniaPluginPersistedstate);
+
+// Load libraries
+import Toast from 'vue-toastification';
+import { LoadingPlugin } from 'vue-loading-overlay';
+import { RecycleScroller } from 'vue-virtual-scroller';
+import FloatingVue from 'floating-vue';
+
+// Global global components
+import Nav from './components/Nav.vue';
+import Modal from './components/Modal/Modal.vue';
+
+// Import CSS
+import 'vue-toastification/dist/index.css';
+import 'vue-loading-overlay/dist/css/index.css';
+import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
+import 'floating-vue/dist/style.css';
+
+// Disable on mobile
+FloatingVue.options.themes.tooltip.disabled = window.innerWidth <= 768;
+
+// Register app, components and use plugins
+const app = createApp(App, window.initialProps);
+
+app.component('Nav', Nav);
+app.component('Modal', Modal);
+app.component('RecycleScroller', RecycleScroller);
+
+app.use(i18n);
+app.use(router);
+app.use(pinia);
+app.use(Toast);
+app.use(LoadingPlugin);
+app.use(FloatingVue);
+app.mount('#app');
diff --git a/resources/js/assets/.DS_Store b/resources/js/assets/.DS_Store
new file mode 100644
index 000000000..aa8c3ea38
Binary files /dev/null and b/resources/js/assets/.DS_Store differ
diff --git a/resources/js/assets/IMG_0286.JPG b/resources/js/assets/IMG_0286.JPG
deleted file mode 100644
index 8103c4973..000000000
Binary files a/resources/js/assets/IMG_0286.JPG and /dev/null differ
diff --git a/resources/js/assets/IMG_0554.jpg b/resources/js/assets/IMG_0554.jpg
deleted file mode 100644
index 3ccf3e525..000000000
Binary files a/resources/js/assets/IMG_0554.jpg and /dev/null differ
diff --git a/resources/js/assets/IMG_0556.jpg b/resources/js/assets/IMG_0556.jpg
deleted file mode 100644
index e17b8c5f8..000000000
Binary files a/resources/js/assets/IMG_0556.jpg and /dev/null differ
diff --git a/resources/js/assets/OLM_Logo.jpg b/resources/js/assets/OLM_Logo.jpg
deleted file mode 100644
index 9903397ef..000000000
Binary files a/resources/js/assets/OLM_Logo.jpg and /dev/null differ
diff --git a/resources/js/assets/bird-plastic.jpg b/resources/js/assets/bird-plastic.jpg
deleted file mode 100644
index a12de7c9b..000000000
Binary files a/resources/js/assets/bird-plastic.jpg and /dev/null differ
diff --git a/resources/js/assets/butts.jpg b/resources/js/assets/butts.jpg
deleted file mode 100644
index ca8ed6d6d..000000000
Binary files a/resources/js/assets/butts.jpg and /dev/null differ
diff --git a/resources/js/assets/cigbutt.png b/resources/js/assets/cigbutt.png
deleted file mode 100644
index fa0d2539c..000000000
Binary files a/resources/js/assets/cigbutt.png and /dev/null differ
diff --git a/resources/js/assets/cigbutts.jpg b/resources/js/assets/cigbutts.jpg
deleted file mode 100644
index 7cd5d8c55..000000000
Binary files a/resources/js/assets/cigbutts.jpg and /dev/null differ
diff --git a/resources/js/assets/cigbutts_jar.jpg b/resources/js/assets/cigbutts_jar.jpg
deleted file mode 100644
index f96565d9e..000000000
Binary files a/resources/js/assets/cigbutts_jar.jpg and /dev/null differ
diff --git a/resources/js/assets/climate_pollution.jpg b/resources/js/assets/climate_pollution.jpg
deleted file mode 100644
index 9523bd515..000000000
Binary files a/resources/js/assets/climate_pollution.jpg and /dev/null differ
diff --git a/resources/js/assets/confirm/Cork.png b/resources/js/assets/confirm/Cork.png
deleted file mode 100644
index cbc8c71a1..000000000
Binary files a/resources/js/assets/confirm/Cork.png and /dev/null differ
diff --git a/resources/js/assets/confirm/fb-hex-icon.png b/resources/js/assets/confirm/fb-hex-icon.png
deleted file mode 100644
index 3a9c1fb7c..000000000
Binary files a/resources/js/assets/confirm/fb-hex-icon.png and /dev/null differ
diff --git a/resources/js/assets/confirm/insta-hex-icon.png b/resources/js/assets/confirm/insta-hex-icon.png
deleted file mode 100644
index cf152a3ee..000000000
Binary files a/resources/js/assets/confirm/insta-hex-icon.png and /dev/null differ
diff --git a/resources/js/assets/confirm/logo-1.jpg b/resources/js/assets/confirm/logo-1.jpg
deleted file mode 100644
index e4d865c35..000000000
Binary files a/resources/js/assets/confirm/logo-1.jpg and /dev/null differ
diff --git a/resources/js/assets/confirm/olm-hex-map.png b/resources/js/assets/confirm/olm-hex-map.png
deleted file mode 100644
index 0dd0ebd3d..000000000
Binary files a/resources/js/assets/confirm/olm-hex-map.png and /dev/null differ
diff --git a/resources/js/assets/confirm/olm-logo-1.png b/resources/js/assets/confirm/olm-logo-1.png
deleted file mode 100644
index cc6014695..000000000
Binary files a/resources/js/assets/confirm/olm-logo-1.png and /dev/null differ
diff --git a/resources/js/assets/confirm/olm-logo-2.png b/resources/js/assets/confirm/olm-logo-2.png
deleted file mode 100644
index c535d0592..000000000
Binary files a/resources/js/assets/confirm/olm-logo-2.png and /dev/null differ
diff --git a/resources/js/assets/confirm/phone-litter.png b/resources/js/assets/confirm/phone-litter.png
deleted file mode 100644
index bb73fee9f..000000000
Binary files a/resources/js/assets/confirm/phone-litter.png and /dev/null differ
diff --git a/resources/js/assets/confirm/phone-map.png b/resources/js/assets/confirm/phone-map.png
deleted file mode 100644
index e532ec29d..000000000
Binary files a/resources/js/assets/confirm/phone-map.png and /dev/null differ
diff --git a/resources/js/assets/confirm/phone-upload.png b/resources/js/assets/confirm/phone-upload.png
deleted file mode 100644
index 1e611d93f..000000000
Binary files a/resources/js/assets/confirm/phone-upload.png and /dev/null differ
diff --git a/resources/js/assets/confirm/pin-1.png b/resources/js/assets/confirm/pin-1.png
deleted file mode 100644
index b4f7b7be7..000000000
Binary files a/resources/js/assets/confirm/pin-1.png and /dev/null differ
diff --git a/resources/js/assets/confirm/twitter-hex-icon.png b/resources/js/assets/confirm/twitter-hex-icon.png
deleted file mode 100644
index 150f7c7ef..000000000
Binary files a/resources/js/assets/confirm/twitter-hex-icon.png and /dev/null differ
diff --git a/resources/js/assets/confirm/world-map.png b/resources/js/assets/confirm/world-map.png
deleted file mode 100644
index ac3d8989e..000000000
Binary files a/resources/js/assets/confirm/world-map.png and /dev/null differ
diff --git a/resources/js/assets/dog.jpeg b/resources/js/assets/dog.jpeg
deleted file mode 100644
index ca071a931..000000000
Binary files a/resources/js/assets/dog.jpeg and /dev/null differ
diff --git a/resources/js/assets/forest_fire.jpg b/resources/js/assets/forest_fire.jpg
deleted file mode 100644
index 08f01d9cc..000000000
Binary files a/resources/js/assets/forest_fire.jpg and /dev/null differ
diff --git a/resources/js/assets/gofundme-brand-logo.png b/resources/js/assets/gofundme-brand-logo.png
deleted file mode 100644
index 08421651e..000000000
Binary files a/resources/js/assets/gofundme-brand-logo.png and /dev/null differ
diff --git a/resources/js/assets/graphic_map.png b/resources/js/assets/graphic_map.png
deleted file mode 100644
index 8dcd1342b..000000000
Binary files a/resources/js/assets/graphic_map.png and /dev/null differ
diff --git a/resources/js/assets/graphic_rocket.png b/resources/js/assets/graphic_rocket.png
deleted file mode 100644
index c8b4e34d4..000000000
Binary files a/resources/js/assets/graphic_rocket.png and /dev/null differ
diff --git a/resources/js/assets/grass.jpg b/resources/js/assets/grass.jpg
deleted file mode 100644
index d6eaa0853..000000000
Binary files a/resources/js/assets/grass.jpg and /dev/null differ
diff --git a/resources/js/assets/icons/bronze-medal.svg b/resources/js/assets/icons/bronze-medal.svg
deleted file mode 100644
index c2062f9c1..000000000
--- a/resources/js/assets/icons/bronze-medal.svg
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
diff --git a/resources/js/assets/icons/camera.png b/resources/js/assets/icons/camera.png
deleted file mode 100644
index 55447984d..000000000
Binary files a/resources/js/assets/icons/camera.png and /dev/null differ
diff --git a/resources/js/assets/icons/facebook.png b/resources/js/assets/icons/facebook.png
deleted file mode 100644
index e89b8f1f8..000000000
Binary files a/resources/js/assets/icons/facebook.png and /dev/null differ
diff --git a/resources/js/assets/icons/facebook2.png b/resources/js/assets/icons/facebook2.png
deleted file mode 100644
index e12ed92bd..000000000
Binary files a/resources/js/assets/icons/facebook2.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ad.png b/resources/js/assets/icons/flags/ad.png
deleted file mode 100644
index 70a79c72d..000000000
Binary files a/resources/js/assets/icons/flags/ad.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ae.png b/resources/js/assets/icons/flags/ae.png
deleted file mode 100644
index a8e8d08ad..000000000
Binary files a/resources/js/assets/icons/flags/ae.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/af.png b/resources/js/assets/icons/flags/af.png
deleted file mode 100644
index 1f1d24281..000000000
Binary files a/resources/js/assets/icons/flags/af.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ag.png b/resources/js/assets/icons/flags/ag.png
deleted file mode 100644
index d3c27f123..000000000
Binary files a/resources/js/assets/icons/flags/ag.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ai.png b/resources/js/assets/icons/flags/ai.png
deleted file mode 100644
index 230d5b720..000000000
Binary files a/resources/js/assets/icons/flags/ai.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/al.png b/resources/js/assets/icons/flags/al.png
deleted file mode 100644
index 06c0c6d67..000000000
Binary files a/resources/js/assets/icons/flags/al.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/am.png b/resources/js/assets/icons/flags/am.png
deleted file mode 100644
index 0801ef38d..000000000
Binary files a/resources/js/assets/icons/flags/am.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/an.png b/resources/js/assets/icons/flags/an.png
deleted file mode 100644
index 582e8c7bf..000000000
Binary files a/resources/js/assets/icons/flags/an.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ao.png b/resources/js/assets/icons/flags/ao.png
deleted file mode 100644
index 1689368ff..000000000
Binary files a/resources/js/assets/icons/flags/ao.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/aq.png b/resources/js/assets/icons/flags/aq.png
deleted file mode 100644
index b5ee0fd72..000000000
Binary files a/resources/js/assets/icons/flags/aq.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ar.png b/resources/js/assets/icons/flags/ar.png
deleted file mode 100644
index e33baeaec..000000000
Binary files a/resources/js/assets/icons/flags/ar.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/as.png b/resources/js/assets/icons/flags/as.png
deleted file mode 100644
index 6d38a1b53..000000000
Binary files a/resources/js/assets/icons/flags/as.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/at.png b/resources/js/assets/icons/flags/at.png
deleted file mode 100644
index e1d39b400..000000000
Binary files a/resources/js/assets/icons/flags/at.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/au.png b/resources/js/assets/icons/flags/au.png
deleted file mode 100644
index e14a8be05..000000000
Binary files a/resources/js/assets/icons/flags/au.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/aw.png b/resources/js/assets/icons/flags/aw.png
deleted file mode 100644
index 657e6d593..000000000
Binary files a/resources/js/assets/icons/flags/aw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ax.png b/resources/js/assets/icons/flags/ax.png
deleted file mode 100644
index 476f265bf..000000000
Binary files a/resources/js/assets/icons/flags/ax.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/az.png b/resources/js/assets/icons/flags/az.png
deleted file mode 100644
index 93cbefc5f..000000000
Binary files a/resources/js/assets/icons/flags/az.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ba.png b/resources/js/assets/icons/flags/ba.png
deleted file mode 100644
index 692a005a4..000000000
Binary files a/resources/js/assets/icons/flags/ba.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bb.png b/resources/js/assets/icons/flags/bb.png
deleted file mode 100644
index 89fb3a08b..000000000
Binary files a/resources/js/assets/icons/flags/bb.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bd.png b/resources/js/assets/icons/flags/bd.png
deleted file mode 100644
index f9948a6b5..000000000
Binary files a/resources/js/assets/icons/flags/bd.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/be.png b/resources/js/assets/icons/flags/be.png
deleted file mode 100644
index b095721fa..000000000
Binary files a/resources/js/assets/icons/flags/be.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bf.png b/resources/js/assets/icons/flags/bf.png
deleted file mode 100644
index 0c8c34096..000000000
Binary files a/resources/js/assets/icons/flags/bf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bg.png b/resources/js/assets/icons/flags/bg.png
deleted file mode 100644
index e911bf0d4..000000000
Binary files a/resources/js/assets/icons/flags/bg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bh.png b/resources/js/assets/icons/flags/bh.png
deleted file mode 100644
index 950f69c02..000000000
Binary files a/resources/js/assets/icons/flags/bh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bi.png b/resources/js/assets/icons/flags/bi.png
deleted file mode 100644
index ef0074d1b..000000000
Binary files a/resources/js/assets/icons/flags/bi.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bj.png b/resources/js/assets/icons/flags/bj.png
deleted file mode 100644
index 51fe84207..000000000
Binary files a/resources/js/assets/icons/flags/bj.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bl.png b/resources/js/assets/icons/flags/bl.png
deleted file mode 100644
index 2fbee2708..000000000
Binary files a/resources/js/assets/icons/flags/bl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bm.png b/resources/js/assets/icons/flags/bm.png
deleted file mode 100644
index c7b1b6fb9..000000000
Binary files a/resources/js/assets/icons/flags/bm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bn.png b/resources/js/assets/icons/flags/bn.png
deleted file mode 100644
index 25fa7c341..000000000
Binary files a/resources/js/assets/icons/flags/bn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bo.png b/resources/js/assets/icons/flags/bo.png
deleted file mode 100644
index 54d731bde..000000000
Binary files a/resources/js/assets/icons/flags/bo.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bq.png b/resources/js/assets/icons/flags/bq.png
deleted file mode 100644
index f545dc87c..000000000
Binary files a/resources/js/assets/icons/flags/bq.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/br.png b/resources/js/assets/icons/flags/br.png
deleted file mode 100644
index 9e21d6002..000000000
Binary files a/resources/js/assets/icons/flags/br.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bs.png b/resources/js/assets/icons/flags/bs.png
deleted file mode 100644
index 6d219ea8b..000000000
Binary files a/resources/js/assets/icons/flags/bs.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bt.png b/resources/js/assets/icons/flags/bt.png
deleted file mode 100644
index 9a4a2acfd..000000000
Binary files a/resources/js/assets/icons/flags/bt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bv.png b/resources/js/assets/icons/flags/bv.png
deleted file mode 100644
index 76b59e873..000000000
Binary files a/resources/js/assets/icons/flags/bv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bw.png b/resources/js/assets/icons/flags/bw.png
deleted file mode 100644
index 94b24d204..000000000
Binary files a/resources/js/assets/icons/flags/bw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/by.png b/resources/js/assets/icons/flags/by.png
deleted file mode 100644
index fbcf4ace0..000000000
Binary files a/resources/js/assets/icons/flags/by.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/bz.png b/resources/js/assets/icons/flags/bz.png
deleted file mode 100644
index 86a793749..000000000
Binary files a/resources/js/assets/icons/flags/bz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ca.png b/resources/js/assets/icons/flags/ca.png
deleted file mode 100644
index 0f80b84dc..000000000
Binary files a/resources/js/assets/icons/flags/ca.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cc.png b/resources/js/assets/icons/flags/cc.png
deleted file mode 100644
index bc90d51cc..000000000
Binary files a/resources/js/assets/icons/flags/cc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cd.png b/resources/js/assets/icons/flags/cd.png
deleted file mode 100644
index 49d390203..000000000
Binary files a/resources/js/assets/icons/flags/cd.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cf.png b/resources/js/assets/icons/flags/cf.png
deleted file mode 100644
index e4e7b22cb..000000000
Binary files a/resources/js/assets/icons/flags/cf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cg.png b/resources/js/assets/icons/flags/cg.png
deleted file mode 100644
index 2a824ce36..000000000
Binary files a/resources/js/assets/icons/flags/cg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ch.png b/resources/js/assets/icons/flags/ch.png
deleted file mode 100644
index 3f3889c22..000000000
Binary files a/resources/js/assets/icons/flags/ch.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ci.png b/resources/js/assets/icons/flags/ci.png
deleted file mode 100644
index e2ce346ed..000000000
Binary files a/resources/js/assets/icons/flags/ci.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ck.png b/resources/js/assets/icons/flags/ck.png
deleted file mode 100644
index 1fe7a92f5..000000000
Binary files a/resources/js/assets/icons/flags/ck.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cl.png b/resources/js/assets/icons/flags/cl.png
deleted file mode 100644
index 2bd971db1..000000000
Binary files a/resources/js/assets/icons/flags/cl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cm.png b/resources/js/assets/icons/flags/cm.png
deleted file mode 100644
index 9aa68bb6b..000000000
Binary files a/resources/js/assets/icons/flags/cm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cn.png b/resources/js/assets/icons/flags/cn.png
deleted file mode 100644
index 6bd87460b..000000000
Binary files a/resources/js/assets/icons/flags/cn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/co.png b/resources/js/assets/icons/flags/co.png
deleted file mode 100644
index 4755d8875..000000000
Binary files a/resources/js/assets/icons/flags/co.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cr.png b/resources/js/assets/icons/flags/cr.png
deleted file mode 100644
index a449ed831..000000000
Binary files a/resources/js/assets/icons/flags/cr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cu.png b/resources/js/assets/icons/flags/cu.png
deleted file mode 100644
index 111902710..000000000
Binary files a/resources/js/assets/icons/flags/cu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cv.png b/resources/js/assets/icons/flags/cv.png
deleted file mode 100644
index ec069e65b..000000000
Binary files a/resources/js/assets/icons/flags/cv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cw.png b/resources/js/assets/icons/flags/cw.png
deleted file mode 100644
index bb71b9346..000000000
Binary files a/resources/js/assets/icons/flags/cw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cx.png b/resources/js/assets/icons/flags/cx.png
deleted file mode 100644
index 317a01031..000000000
Binary files a/resources/js/assets/icons/flags/cx.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cy.png b/resources/js/assets/icons/flags/cy.png
deleted file mode 100644
index 142dd9e82..000000000
Binary files a/resources/js/assets/icons/flags/cy.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/cz.png b/resources/js/assets/icons/flags/cz.png
deleted file mode 100644
index c99d18be1..000000000
Binary files a/resources/js/assets/icons/flags/cz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/de.png b/resources/js/assets/icons/flags/de.png
deleted file mode 100644
index 97cb239c5..000000000
Binary files a/resources/js/assets/icons/flags/de.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/dj.png b/resources/js/assets/icons/flags/dj.png
deleted file mode 100644
index 4ab567c17..000000000
Binary files a/resources/js/assets/icons/flags/dj.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/dk.png b/resources/js/assets/icons/flags/dk.png
deleted file mode 100644
index 0fbc1dbbd..000000000
Binary files a/resources/js/assets/icons/flags/dk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/dm.png b/resources/js/assets/icons/flags/dm.png
deleted file mode 100644
index fdf420697..000000000
Binary files a/resources/js/assets/icons/flags/dm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/do.png b/resources/js/assets/icons/flags/do.png
deleted file mode 100644
index 1bd560ac2..000000000
Binary files a/resources/js/assets/icons/flags/do.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/dz.png b/resources/js/assets/icons/flags/dz.png
deleted file mode 100644
index 6bd603b55..000000000
Binary files a/resources/js/assets/icons/flags/dz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ec.png b/resources/js/assets/icons/flags/ec.png
deleted file mode 100644
index 4e1078db6..000000000
Binary files a/resources/js/assets/icons/flags/ec.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ee.png b/resources/js/assets/icons/flags/ee.png
deleted file mode 100644
index bcd4f2da1..000000000
Binary files a/resources/js/assets/icons/flags/ee.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/eg.png b/resources/js/assets/icons/flags/eg.png
deleted file mode 100644
index 4815d3a2a..000000000
Binary files a/resources/js/assets/icons/flags/eg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/eh.png b/resources/js/assets/icons/flags/eh.png
deleted file mode 100644
index 1d5069385..000000000
Binary files a/resources/js/assets/icons/flags/eh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/er.png b/resources/js/assets/icons/flags/er.png
deleted file mode 100644
index fd1eab7d2..000000000
Binary files a/resources/js/assets/icons/flags/er.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/es.png b/resources/js/assets/icons/flags/es.png
deleted file mode 100644
index d66a95044..000000000
Binary files a/resources/js/assets/icons/flags/es.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/et.png b/resources/js/assets/icons/flags/et.png
deleted file mode 100644
index 8a3896150..000000000
Binary files a/resources/js/assets/icons/flags/et.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/eu.png b/resources/js/assets/icons/flags/eu.png
deleted file mode 100644
index da6d428dc..000000000
Binary files a/resources/js/assets/icons/flags/eu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fi.png b/resources/js/assets/icons/flags/fi.png
deleted file mode 100644
index 7c1f9087f..000000000
Binary files a/resources/js/assets/icons/flags/fi.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fj.png b/resources/js/assets/icons/flags/fj.png
deleted file mode 100644
index 00e6cffc6..000000000
Binary files a/resources/js/assets/icons/flags/fj.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fk.png b/resources/js/assets/icons/flags/fk.png
deleted file mode 100644
index 2cae2dc5d..000000000
Binary files a/resources/js/assets/icons/flags/fk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fm.png b/resources/js/assets/icons/flags/fm.png
deleted file mode 100644
index 195113b54..000000000
Binary files a/resources/js/assets/icons/flags/fm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fo.png b/resources/js/assets/icons/flags/fo.png
deleted file mode 100644
index b4084cf7d..000000000
Binary files a/resources/js/assets/icons/flags/fo.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/fr.png b/resources/js/assets/icons/flags/fr.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/fr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ga.png b/resources/js/assets/icons/flags/ga.png
deleted file mode 100644
index 137865193..000000000
Binary files a/resources/js/assets/icons/flags/ga.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gb-eng.png b/resources/js/assets/icons/flags/gb-eng.png
deleted file mode 100644
index b534e6289..000000000
Binary files a/resources/js/assets/icons/flags/gb-eng.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gb-nir.png b/resources/js/assets/icons/flags/gb-nir.png
deleted file mode 100644
index fa38aaa51..000000000
Binary files a/resources/js/assets/icons/flags/gb-nir.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gb-sct.png b/resources/js/assets/icons/flags/gb-sct.png
deleted file mode 100644
index 2220619f8..000000000
Binary files a/resources/js/assets/icons/flags/gb-sct.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gb-wls.png b/resources/js/assets/icons/flags/gb-wls.png
deleted file mode 100644
index 6f2a0f4b6..000000000
Binary files a/resources/js/assets/icons/flags/gb-wls.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gb.png b/resources/js/assets/icons/flags/gb.png
deleted file mode 100644
index fa38aaa51..000000000
Binary files a/resources/js/assets/icons/flags/gb.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gd.png b/resources/js/assets/icons/flags/gd.png
deleted file mode 100644
index c262eb0c0..000000000
Binary files a/resources/js/assets/icons/flags/gd.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ge.png b/resources/js/assets/icons/flags/ge.png
deleted file mode 100644
index d2cfcfd57..000000000
Binary files a/resources/js/assets/icons/flags/ge.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gf.png b/resources/js/assets/icons/flags/gf.png
deleted file mode 100644
index 1f300cbbc..000000000
Binary files a/resources/js/assets/icons/flags/gf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gg.png b/resources/js/assets/icons/flags/gg.png
deleted file mode 100644
index 3110c1d48..000000000
Binary files a/resources/js/assets/icons/flags/gg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gh.png b/resources/js/assets/icons/flags/gh.png
deleted file mode 100644
index a8ef8c458..000000000
Binary files a/resources/js/assets/icons/flags/gh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gi.png b/resources/js/assets/icons/flags/gi.png
deleted file mode 100644
index f995c2a24..000000000
Binary files a/resources/js/assets/icons/flags/gi.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gl.png b/resources/js/assets/icons/flags/gl.png
deleted file mode 100644
index 1eff7e58a..000000000
Binary files a/resources/js/assets/icons/flags/gl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gm.png b/resources/js/assets/icons/flags/gm.png
deleted file mode 100644
index 52aa6afcd..000000000
Binary files a/resources/js/assets/icons/flags/gm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gn.png b/resources/js/assets/icons/flags/gn.png
deleted file mode 100644
index 8b03b44cd..000000000
Binary files a/resources/js/assets/icons/flags/gn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gp.png b/resources/js/assets/icons/flags/gp.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/gp.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gq.png b/resources/js/assets/icons/flags/gq.png
deleted file mode 100644
index 70c8d69de..000000000
Binary files a/resources/js/assets/icons/flags/gq.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gr.png b/resources/js/assets/icons/flags/gr.png
deleted file mode 100644
index e1088af7b..000000000
Binary files a/resources/js/assets/icons/flags/gr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gs.png b/resources/js/assets/icons/flags/gs.png
deleted file mode 100644
index b7bd1c0bd..000000000
Binary files a/resources/js/assets/icons/flags/gs.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gt.png b/resources/js/assets/icons/flags/gt.png
deleted file mode 100644
index 673ab2ed6..000000000
Binary files a/resources/js/assets/icons/flags/gt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gu.png b/resources/js/assets/icons/flags/gu.png
deleted file mode 100644
index b19fad4e2..000000000
Binary files a/resources/js/assets/icons/flags/gu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gw.png b/resources/js/assets/icons/flags/gw.png
deleted file mode 100644
index a0f336f9f..000000000
Binary files a/resources/js/assets/icons/flags/gw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/gy.png b/resources/js/assets/icons/flags/gy.png
deleted file mode 100644
index 1c9db8829..000000000
Binary files a/resources/js/assets/icons/flags/gy.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/hk.png b/resources/js/assets/icons/flags/hk.png
deleted file mode 100644
index 8dd3d3ee2..000000000
Binary files a/resources/js/assets/icons/flags/hk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/hm.png b/resources/js/assets/icons/flags/hm.png
deleted file mode 100644
index e14a8be05..000000000
Binary files a/resources/js/assets/icons/flags/hm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/hn.png b/resources/js/assets/icons/flags/hn.png
deleted file mode 100644
index 74799fb73..000000000
Binary files a/resources/js/assets/icons/flags/hn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/hr.png b/resources/js/assets/icons/flags/hr.png
deleted file mode 100644
index 54195dc3b..000000000
Binary files a/resources/js/assets/icons/flags/hr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ht.png b/resources/js/assets/icons/flags/ht.png
deleted file mode 100644
index 72ef0b0d4..000000000
Binary files a/resources/js/assets/icons/flags/ht.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/hu.png b/resources/js/assets/icons/flags/hu.png
deleted file mode 100644
index 5b0a85fb7..000000000
Binary files a/resources/js/assets/icons/flags/hu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/id.png b/resources/js/assets/icons/flags/id.png
deleted file mode 100644
index 072bd8c6d..000000000
Binary files a/resources/js/assets/icons/flags/id.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ie.png b/resources/js/assets/icons/flags/ie.png
deleted file mode 100644
index 10fbab9ca..000000000
Binary files a/resources/js/assets/icons/flags/ie.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/il.png b/resources/js/assets/icons/flags/il.png
deleted file mode 100644
index d657c5354..000000000
Binary files a/resources/js/assets/icons/flags/il.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/im.png b/resources/js/assets/icons/flags/im.png
deleted file mode 100644
index 76295deb0..000000000
Binary files a/resources/js/assets/icons/flags/im.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/in.png b/resources/js/assets/icons/flags/in.png
deleted file mode 100644
index d8b9bd11c..000000000
Binary files a/resources/js/assets/icons/flags/in.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/io.png b/resources/js/assets/icons/flags/io.png
deleted file mode 100644
index ae0cf1c7e..000000000
Binary files a/resources/js/assets/icons/flags/io.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/iq.png b/resources/js/assets/icons/flags/iq.png
deleted file mode 100644
index 1c0ffe064..000000000
Binary files a/resources/js/assets/icons/flags/iq.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ir.png b/resources/js/assets/icons/flags/ir.png
deleted file mode 100644
index 284313780..000000000
Binary files a/resources/js/assets/icons/flags/ir.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/is.png b/resources/js/assets/icons/flags/is.png
deleted file mode 100644
index 1ecdfaec1..000000000
Binary files a/resources/js/assets/icons/flags/is.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/it.png b/resources/js/assets/icons/flags/it.png
deleted file mode 100644
index 3db1442f1..000000000
Binary files a/resources/js/assets/icons/flags/it.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/je.png b/resources/js/assets/icons/flags/je.png
deleted file mode 100644
index e648a2131..000000000
Binary files a/resources/js/assets/icons/flags/je.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/jm.png b/resources/js/assets/icons/flags/jm.png
deleted file mode 100644
index 5677d5b83..000000000
Binary files a/resources/js/assets/icons/flags/jm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/jo.png b/resources/js/assets/icons/flags/jo.png
deleted file mode 100644
index 2133712c4..000000000
Binary files a/resources/js/assets/icons/flags/jo.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/jp.png b/resources/js/assets/icons/flags/jp.png
deleted file mode 100644
index 8b4229976..000000000
Binary files a/resources/js/assets/icons/flags/jp.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ke.png b/resources/js/assets/icons/flags/ke.png
deleted file mode 100644
index 4cb3d654b..000000000
Binary files a/resources/js/assets/icons/flags/ke.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kg.png b/resources/js/assets/icons/flags/kg.png
deleted file mode 100644
index 18251f14b..000000000
Binary files a/resources/js/assets/icons/flags/kg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kh.png b/resources/js/assets/icons/flags/kh.png
deleted file mode 100644
index 2c7236241..000000000
Binary files a/resources/js/assets/icons/flags/kh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ki.png b/resources/js/assets/icons/flags/ki.png
deleted file mode 100644
index 883c82c66..000000000
Binary files a/resources/js/assets/icons/flags/ki.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/km.png b/resources/js/assets/icons/flags/km.png
deleted file mode 100644
index 5e4394c00..000000000
Binary files a/resources/js/assets/icons/flags/km.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kn.png b/resources/js/assets/icons/flags/kn.png
deleted file mode 100644
index 54d365f73..000000000
Binary files a/resources/js/assets/icons/flags/kn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kp.png b/resources/js/assets/icons/flags/kp.png
deleted file mode 100644
index d427c9c88..000000000
Binary files a/resources/js/assets/icons/flags/kp.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kr.png b/resources/js/assets/icons/flags/kr.png
deleted file mode 100644
index d66461e5a..000000000
Binary files a/resources/js/assets/icons/flags/kr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kw.png b/resources/js/assets/icons/flags/kw.png
deleted file mode 100644
index b786d4c17..000000000
Binary files a/resources/js/assets/icons/flags/kw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ky.png b/resources/js/assets/icons/flags/ky.png
deleted file mode 100644
index dddcbe64d..000000000
Binary files a/resources/js/assets/icons/flags/ky.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/kz.png b/resources/js/assets/icons/flags/kz.png
deleted file mode 100644
index 1a5ae43c6..000000000
Binary files a/resources/js/assets/icons/flags/kz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/la.png b/resources/js/assets/icons/flags/la.png
deleted file mode 100644
index 5d0bae8dd..000000000
Binary files a/resources/js/assets/icons/flags/la.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lb.png b/resources/js/assets/icons/flags/lb.png
deleted file mode 100644
index 767a1ca41..000000000
Binary files a/resources/js/assets/icons/flags/lb.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lc.png b/resources/js/assets/icons/flags/lc.png
deleted file mode 100644
index 26b29b9f6..000000000
Binary files a/resources/js/assets/icons/flags/lc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/li.png b/resources/js/assets/icons/flags/li.png
deleted file mode 100644
index e3560b2d8..000000000
Binary files a/resources/js/assets/icons/flags/li.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lk.png b/resources/js/assets/icons/flags/lk.png
deleted file mode 100644
index d3399ca92..000000000
Binary files a/resources/js/assets/icons/flags/lk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lr.png b/resources/js/assets/icons/flags/lr.png
deleted file mode 100644
index b27d0cdfc..000000000
Binary files a/resources/js/assets/icons/flags/lr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ls.png b/resources/js/assets/icons/flags/ls.png
deleted file mode 100644
index 75d9ce353..000000000
Binary files a/resources/js/assets/icons/flags/ls.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lt.png b/resources/js/assets/icons/flags/lt.png
deleted file mode 100644
index 3a3145d53..000000000
Binary files a/resources/js/assets/icons/flags/lt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lu.png b/resources/js/assets/icons/flags/lu.png
deleted file mode 100644
index 0b3cd434c..000000000
Binary files a/resources/js/assets/icons/flags/lu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/lv.png b/resources/js/assets/icons/flags/lv.png
deleted file mode 100644
index 56ffc0fdd..000000000
Binary files a/resources/js/assets/icons/flags/lv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ly.png b/resources/js/assets/icons/flags/ly.png
deleted file mode 100644
index 13406af47..000000000
Binary files a/resources/js/assets/icons/flags/ly.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ma.png b/resources/js/assets/icons/flags/ma.png
deleted file mode 100644
index 066d81e5a..000000000
Binary files a/resources/js/assets/icons/flags/ma.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mc.png b/resources/js/assets/icons/flags/mc.png
deleted file mode 100644
index a0117ab03..000000000
Binary files a/resources/js/assets/icons/flags/mc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/md.png b/resources/js/assets/icons/flags/md.png
deleted file mode 100644
index fc462f1dc..000000000
Binary files a/resources/js/assets/icons/flags/md.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/me.png b/resources/js/assets/icons/flags/me.png
deleted file mode 100644
index 7053a9dd3..000000000
Binary files a/resources/js/assets/icons/flags/me.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mf.png b/resources/js/assets/icons/flags/mf.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/mf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mg.png b/resources/js/assets/icons/flags/mg.png
deleted file mode 100644
index 21ccba366..000000000
Binary files a/resources/js/assets/icons/flags/mg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mh.png b/resources/js/assets/icons/flags/mh.png
deleted file mode 100644
index 706cf380f..000000000
Binary files a/resources/js/assets/icons/flags/mh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mk.png b/resources/js/assets/icons/flags/mk.png
deleted file mode 100644
index 7f166a236..000000000
Binary files a/resources/js/assets/icons/flags/mk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ml.png b/resources/js/assets/icons/flags/ml.png
deleted file mode 100644
index e9c3de49b..000000000
Binary files a/resources/js/assets/icons/flags/ml.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mm.png b/resources/js/assets/icons/flags/mm.png
deleted file mode 100644
index aa7dbe565..000000000
Binary files a/resources/js/assets/icons/flags/mm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mn.png b/resources/js/assets/icons/flags/mn.png
deleted file mode 100644
index c5892e2c2..000000000
Binary files a/resources/js/assets/icons/flags/mn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mo.png b/resources/js/assets/icons/flags/mo.png
deleted file mode 100644
index ee4853ba2..000000000
Binary files a/resources/js/assets/icons/flags/mo.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mp.png b/resources/js/assets/icons/flags/mp.png
deleted file mode 100644
index dd30c02fe..000000000
Binary files a/resources/js/assets/icons/flags/mp.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mq.png b/resources/js/assets/icons/flags/mq.png
deleted file mode 100644
index d59bdbb30..000000000
Binary files a/resources/js/assets/icons/flags/mq.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mr.png b/resources/js/assets/icons/flags/mr.png
deleted file mode 100644
index 31b7a2a7f..000000000
Binary files a/resources/js/assets/icons/flags/mr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ms.png b/resources/js/assets/icons/flags/ms.png
deleted file mode 100644
index 36df436d5..000000000
Binary files a/resources/js/assets/icons/flags/ms.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mt.png b/resources/js/assets/icons/flags/mt.png
deleted file mode 100644
index 6f0de1f00..000000000
Binary files a/resources/js/assets/icons/flags/mt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mu.png b/resources/js/assets/icons/flags/mu.png
deleted file mode 100644
index 952c0062d..000000000
Binary files a/resources/js/assets/icons/flags/mu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mv.png b/resources/js/assets/icons/flags/mv.png
deleted file mode 100644
index b2c2643ef..000000000
Binary files a/resources/js/assets/icons/flags/mv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mw.png b/resources/js/assets/icons/flags/mw.png
deleted file mode 100644
index 6e7d2b48e..000000000
Binary files a/resources/js/assets/icons/flags/mw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mx.png b/resources/js/assets/icons/flags/mx.png
deleted file mode 100644
index 42b12d446..000000000
Binary files a/resources/js/assets/icons/flags/mx.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/my.png b/resources/js/assets/icons/flags/my.png
deleted file mode 100644
index 06c898b79..000000000
Binary files a/resources/js/assets/icons/flags/my.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/mz.png b/resources/js/assets/icons/flags/mz.png
deleted file mode 100644
index ee19a7c81..000000000
Binary files a/resources/js/assets/icons/flags/mz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/na.png b/resources/js/assets/icons/flags/na.png
deleted file mode 100644
index fb40fdbd6..000000000
Binary files a/resources/js/assets/icons/flags/na.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nc.png b/resources/js/assets/icons/flags/nc.png
deleted file mode 100644
index bb35305d5..000000000
Binary files a/resources/js/assets/icons/flags/nc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ne.png b/resources/js/assets/icons/flags/ne.png
deleted file mode 100644
index 53ba4855b..000000000
Binary files a/resources/js/assets/icons/flags/ne.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nf.png b/resources/js/assets/icons/flags/nf.png
deleted file mode 100644
index 24affad37..000000000
Binary files a/resources/js/assets/icons/flags/nf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ng.png b/resources/js/assets/icons/flags/ng.png
deleted file mode 100644
index 376b81422..000000000
Binary files a/resources/js/assets/icons/flags/ng.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ni.png b/resources/js/assets/icons/flags/ni.png
deleted file mode 100644
index 332d5c678..000000000
Binary files a/resources/js/assets/icons/flags/ni.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nl.png b/resources/js/assets/icons/flags/nl.png
deleted file mode 100644
index f545dc87c..000000000
Binary files a/resources/js/assets/icons/flags/nl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/no.png b/resources/js/assets/icons/flags/no.png
deleted file mode 100644
index 76b59e873..000000000
Binary files a/resources/js/assets/icons/flags/no.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/np.png b/resources/js/assets/icons/flags/np.png
deleted file mode 100644
index c61d4b32b..000000000
Binary files a/resources/js/assets/icons/flags/np.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nr.png b/resources/js/assets/icons/flags/nr.png
deleted file mode 100644
index 8d8c5dd4b..000000000
Binary files a/resources/js/assets/icons/flags/nr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nu.png b/resources/js/assets/icons/flags/nu.png
deleted file mode 100644
index 25af99127..000000000
Binary files a/resources/js/assets/icons/flags/nu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/nz.png b/resources/js/assets/icons/flags/nz.png
deleted file mode 100644
index 39caad153..000000000
Binary files a/resources/js/assets/icons/flags/nz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/om.png b/resources/js/assets/icons/flags/om.png
deleted file mode 100644
index 5a8aa408b..000000000
Binary files a/resources/js/assets/icons/flags/om.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pa.png b/resources/js/assets/icons/flags/pa.png
deleted file mode 100644
index 0b37454ad..000000000
Binary files a/resources/js/assets/icons/flags/pa.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pe.png b/resources/js/assets/icons/flags/pe.png
deleted file mode 100644
index d2589572b..000000000
Binary files a/resources/js/assets/icons/flags/pe.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pf.png b/resources/js/assets/icons/flags/pf.png
deleted file mode 100644
index c4f3c2f6d..000000000
Binary files a/resources/js/assets/icons/flags/pf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pg.png b/resources/js/assets/icons/flags/pg.png
deleted file mode 100644
index 35515d33a..000000000
Binary files a/resources/js/assets/icons/flags/pg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ph.png b/resources/js/assets/icons/flags/ph.png
deleted file mode 100644
index 4b985281a..000000000
Binary files a/resources/js/assets/icons/flags/ph.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pk.png b/resources/js/assets/icons/flags/pk.png
deleted file mode 100644
index a25945862..000000000
Binary files a/resources/js/assets/icons/flags/pk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pl.png b/resources/js/assets/icons/flags/pl.png
deleted file mode 100644
index d97a123dc..000000000
Binary files a/resources/js/assets/icons/flags/pl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pm.png b/resources/js/assets/icons/flags/pm.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/pm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pn.png b/resources/js/assets/icons/flags/pn.png
deleted file mode 100644
index 833a048a1..000000000
Binary files a/resources/js/assets/icons/flags/pn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pr.png b/resources/js/assets/icons/flags/pr.png
deleted file mode 100644
index d23aefb61..000000000
Binary files a/resources/js/assets/icons/flags/pr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ps.png b/resources/js/assets/icons/flags/ps.png
deleted file mode 100644
index 55b9c3462..000000000
Binary files a/resources/js/assets/icons/flags/ps.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pt.png b/resources/js/assets/icons/flags/pt.png
deleted file mode 100644
index 48a69deb9..000000000
Binary files a/resources/js/assets/icons/flags/pt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/pw.png b/resources/js/assets/icons/flags/pw.png
deleted file mode 100644
index 5b4ee21b5..000000000
Binary files a/resources/js/assets/icons/flags/pw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/py.png b/resources/js/assets/icons/flags/py.png
deleted file mode 100644
index a6ee0e5e8..000000000
Binary files a/resources/js/assets/icons/flags/py.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/qa.png b/resources/js/assets/icons/flags/qa.png
deleted file mode 100644
index 5aa3014aa..000000000
Binary files a/resources/js/assets/icons/flags/qa.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/re.png b/resources/js/assets/icons/flags/re.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/re.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ro.png b/resources/js/assets/icons/flags/ro.png
deleted file mode 100644
index e702d63f0..000000000
Binary files a/resources/js/assets/icons/flags/ro.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/rs.png b/resources/js/assets/icons/flags/rs.png
deleted file mode 100644
index bfcb4ffa6..000000000
Binary files a/resources/js/assets/icons/flags/rs.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ru.png b/resources/js/assets/icons/flags/ru.png
deleted file mode 100644
index 9739ab6e6..000000000
Binary files a/resources/js/assets/icons/flags/ru.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/rw.png b/resources/js/assets/icons/flags/rw.png
deleted file mode 100644
index a484019e5..000000000
Binary files a/resources/js/assets/icons/flags/rw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sa.png b/resources/js/assets/icons/flags/sa.png
deleted file mode 100644
index af0d94c2d..000000000
Binary files a/resources/js/assets/icons/flags/sa.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sb.png b/resources/js/assets/icons/flags/sb.png
deleted file mode 100644
index 3bbf54800..000000000
Binary files a/resources/js/assets/icons/flags/sb.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sc.png b/resources/js/assets/icons/flags/sc.png
deleted file mode 100644
index 8cc57968c..000000000
Binary files a/resources/js/assets/icons/flags/sc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sd.png b/resources/js/assets/icons/flags/sd.png
deleted file mode 100644
index 28d084506..000000000
Binary files a/resources/js/assets/icons/flags/sd.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/se.png b/resources/js/assets/icons/flags/se.png
deleted file mode 100644
index c5e5f00d8..000000000
Binary files a/resources/js/assets/icons/flags/se.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sg.png b/resources/js/assets/icons/flags/sg.png
deleted file mode 100644
index ee6bc26e3..000000000
Binary files a/resources/js/assets/icons/flags/sg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sh.png b/resources/js/assets/icons/flags/sh.png
deleted file mode 100644
index fa38aaa51..000000000
Binary files a/resources/js/assets/icons/flags/sh.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/si.png b/resources/js/assets/icons/flags/si.png
deleted file mode 100644
index c700251aa..000000000
Binary files a/resources/js/assets/icons/flags/si.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sj.png b/resources/js/assets/icons/flags/sj.png
deleted file mode 100644
index 76b59e873..000000000
Binary files a/resources/js/assets/icons/flags/sj.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sk.png b/resources/js/assets/icons/flags/sk.png
deleted file mode 100644
index 78621b9c6..000000000
Binary files a/resources/js/assets/icons/flags/sk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sl.png b/resources/js/assets/icons/flags/sl.png
deleted file mode 100644
index 4f8d54ee6..000000000
Binary files a/resources/js/assets/icons/flags/sl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sm.png b/resources/js/assets/icons/flags/sm.png
deleted file mode 100644
index b6e77449e..000000000
Binary files a/resources/js/assets/icons/flags/sm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sn.png b/resources/js/assets/icons/flags/sn.png
deleted file mode 100644
index 234d44e44..000000000
Binary files a/resources/js/assets/icons/flags/sn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/so.png b/resources/js/assets/icons/flags/so.png
deleted file mode 100644
index 1e8faf2d2..000000000
Binary files a/resources/js/assets/icons/flags/so.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sr.png b/resources/js/assets/icons/flags/sr.png
deleted file mode 100644
index f8a061269..000000000
Binary files a/resources/js/assets/icons/flags/sr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ss.png b/resources/js/assets/icons/flags/ss.png
deleted file mode 100644
index e48a04099..000000000
Binary files a/resources/js/assets/icons/flags/ss.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/st.png b/resources/js/assets/icons/flags/st.png
deleted file mode 100644
index 58c6fe450..000000000
Binary files a/resources/js/assets/icons/flags/st.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sv.png b/resources/js/assets/icons/flags/sv.png
deleted file mode 100644
index ebf3905cb..000000000
Binary files a/resources/js/assets/icons/flags/sv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sx.png b/resources/js/assets/icons/flags/sx.png
deleted file mode 100644
index ce3ec13d1..000000000
Binary files a/resources/js/assets/icons/flags/sx.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sy.png b/resources/js/assets/icons/flags/sy.png
deleted file mode 100644
index 30a5e4329..000000000
Binary files a/resources/js/assets/icons/flags/sy.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/sz.png b/resources/js/assets/icons/flags/sz.png
deleted file mode 100644
index 7503cfeb5..000000000
Binary files a/resources/js/assets/icons/flags/sz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tc.png b/resources/js/assets/icons/flags/tc.png
deleted file mode 100644
index 4bb57a3e9..000000000
Binary files a/resources/js/assets/icons/flags/tc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/td.png b/resources/js/assets/icons/flags/td.png
deleted file mode 100644
index 46a65143e..000000000
Binary files a/resources/js/assets/icons/flags/td.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tf.png b/resources/js/assets/icons/flags/tf.png
deleted file mode 100644
index 7404e2dd3..000000000
Binary files a/resources/js/assets/icons/flags/tf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tg.png b/resources/js/assets/icons/flags/tg.png
deleted file mode 100644
index fe7af07c6..000000000
Binary files a/resources/js/assets/icons/flags/tg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/th.png b/resources/js/assets/icons/flags/th.png
deleted file mode 100644
index 2848dbab7..000000000
Binary files a/resources/js/assets/icons/flags/th.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tj.png b/resources/js/assets/icons/flags/tj.png
deleted file mode 100644
index d01551249..000000000
Binary files a/resources/js/assets/icons/flags/tj.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tk.png b/resources/js/assets/icons/flags/tk.png
deleted file mode 100644
index 0646c4a32..000000000
Binary files a/resources/js/assets/icons/flags/tk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tl.png b/resources/js/assets/icons/flags/tl.png
deleted file mode 100644
index ca2b34ac5..000000000
Binary files a/resources/js/assets/icons/flags/tl.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tm.png b/resources/js/assets/icons/flags/tm.png
deleted file mode 100644
index 180f5c591..000000000
Binary files a/resources/js/assets/icons/flags/tm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tn.png b/resources/js/assets/icons/flags/tn.png
deleted file mode 100644
index 5c914bfe0..000000000
Binary files a/resources/js/assets/icons/flags/tn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/to.png b/resources/js/assets/icons/flags/to.png
deleted file mode 100644
index ab11e5142..000000000
Binary files a/resources/js/assets/icons/flags/to.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tr.png b/resources/js/assets/icons/flags/tr.png
deleted file mode 100644
index 0d22fce9f..000000000
Binary files a/resources/js/assets/icons/flags/tr.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tt.png b/resources/js/assets/icons/flags/tt.png
deleted file mode 100644
index 60de65906..000000000
Binary files a/resources/js/assets/icons/flags/tt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tv.png b/resources/js/assets/icons/flags/tv.png
deleted file mode 100644
index ead890536..000000000
Binary files a/resources/js/assets/icons/flags/tv.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tw.png b/resources/js/assets/icons/flags/tw.png
deleted file mode 100644
index e5e892939..000000000
Binary files a/resources/js/assets/icons/flags/tw.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/tz.png b/resources/js/assets/icons/flags/tz.png
deleted file mode 100644
index 9ee9e5c56..000000000
Binary files a/resources/js/assets/icons/flags/tz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ua.png b/resources/js/assets/icons/flags/ua.png
deleted file mode 100644
index 42b2cde9a..000000000
Binary files a/resources/js/assets/icons/flags/ua.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ug.png b/resources/js/assets/icons/flags/ug.png
deleted file mode 100644
index d2972e661..000000000
Binary files a/resources/js/assets/icons/flags/ug.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/um.png b/resources/js/assets/icons/flags/um.png
deleted file mode 100644
index 8418cb672..000000000
Binary files a/resources/js/assets/icons/flags/um.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/us.png b/resources/js/assets/icons/flags/us.png
deleted file mode 100644
index 8418cb672..000000000
Binary files a/resources/js/assets/icons/flags/us.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/uy.png b/resources/js/assets/icons/flags/uy.png
deleted file mode 100644
index 231c12da2..000000000
Binary files a/resources/js/assets/icons/flags/uy.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/uz.png b/resources/js/assets/icons/flags/uz.png
deleted file mode 100644
index 7278fbc81..000000000
Binary files a/resources/js/assets/icons/flags/uz.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/va.png b/resources/js/assets/icons/flags/va.png
deleted file mode 100644
index d65009e8e..000000000
Binary files a/resources/js/assets/icons/flags/va.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/vc.png b/resources/js/assets/icons/flags/vc.png
deleted file mode 100644
index f71779a46..000000000
Binary files a/resources/js/assets/icons/flags/vc.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ve.png b/resources/js/assets/icons/flags/ve.png
deleted file mode 100644
index ef5160f00..000000000
Binary files a/resources/js/assets/icons/flags/ve.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/vg.png b/resources/js/assets/icons/flags/vg.png
deleted file mode 100644
index a2bfa1a12..000000000
Binary files a/resources/js/assets/icons/flags/vg.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/vi.png b/resources/js/assets/icons/flags/vi.png
deleted file mode 100644
index 36090411c..000000000
Binary files a/resources/js/assets/icons/flags/vi.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/vn.png b/resources/js/assets/icons/flags/vn.png
deleted file mode 100644
index cbf65d416..000000000
Binary files a/resources/js/assets/icons/flags/vn.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/vu.png b/resources/js/assets/icons/flags/vu.png
deleted file mode 100644
index b7051a090..000000000
Binary files a/resources/js/assets/icons/flags/vu.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/wf.png b/resources/js/assets/icons/flags/wf.png
deleted file mode 100644
index 3fe891480..000000000
Binary files a/resources/js/assets/icons/flags/wf.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ws.png b/resources/js/assets/icons/flags/ws.png
deleted file mode 100644
index 969bee5c9..000000000
Binary files a/resources/js/assets/icons/flags/ws.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/xk.png b/resources/js/assets/icons/flags/xk.png
deleted file mode 100644
index 18937842c..000000000
Binary files a/resources/js/assets/icons/flags/xk.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/ye.png b/resources/js/assets/icons/flags/ye.png
deleted file mode 100644
index c094f80ec..000000000
Binary files a/resources/js/assets/icons/flags/ye.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/yt.png b/resources/js/assets/icons/flags/yt.png
deleted file mode 100644
index 7c28444b9..000000000
Binary files a/resources/js/assets/icons/flags/yt.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/za.png b/resources/js/assets/icons/flags/za.png
deleted file mode 100644
index 243490811..000000000
Binary files a/resources/js/assets/icons/flags/za.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/zm.png b/resources/js/assets/icons/flags/zm.png
deleted file mode 100644
index d50ff2c64..000000000
Binary files a/resources/js/assets/icons/flags/zm.png and /dev/null differ
diff --git a/resources/js/assets/icons/flags/zw.png b/resources/js/assets/icons/flags/zw.png
deleted file mode 100644
index ea968ea97..000000000
Binary files a/resources/js/assets/icons/flags/zw.png and /dev/null differ
diff --git a/resources/js/assets/icons/gold-medal.png b/resources/js/assets/icons/gold-medal.png
deleted file mode 100644
index 39f83bea6..000000000
Binary files a/resources/js/assets/icons/gold-medal.png and /dev/null differ
diff --git a/resources/js/assets/icons/home/camera.png b/resources/js/assets/icons/home/camera.png
deleted file mode 100644
index 3b52e1ee7..000000000
Binary files a/resources/js/assets/icons/home/camera.png and /dev/null differ
diff --git a/resources/js/assets/icons/home/microscope.png b/resources/js/assets/icons/home/microscope.png
deleted file mode 100644
index 80907e4bd..000000000
Binary files a/resources/js/assets/icons/home/microscope.png and /dev/null differ
diff --git a/resources/js/assets/icons/home/phone.png b/resources/js/assets/icons/home/phone.png
deleted file mode 100644
index 1d871d962..000000000
Binary files a/resources/js/assets/icons/home/phone.png and /dev/null differ
diff --git a/resources/js/assets/icons/home/tree.png b/resources/js/assets/icons/home/tree.png
deleted file mode 100644
index 6be486330..000000000
Binary files a/resources/js/assets/icons/home/tree.png and /dev/null differ
diff --git a/resources/js/assets/icons/home/world.png b/resources/js/assets/icons/home/world.png
deleted file mode 100644
index 8d791b004..000000000
Binary files a/resources/js/assets/icons/home/world.png and /dev/null differ
diff --git a/resources/js/assets/icons/ig2.png b/resources/js/assets/icons/ig2.png
deleted file mode 100644
index 720f07fb3..000000000
Binary files a/resources/js/assets/icons/ig2.png and /dev/null differ
diff --git a/resources/js/assets/icons/insta.png b/resources/js/assets/icons/insta.png
deleted file mode 100644
index d3b981733..000000000
Binary files a/resources/js/assets/icons/insta.png and /dev/null differ
diff --git a/resources/js/assets/icons/littercoin/eternl.png b/resources/js/assets/icons/littercoin/eternl.png
deleted file mode 100644
index 7875f780f..000000000
Binary files a/resources/js/assets/icons/littercoin/eternl.png and /dev/null differ
diff --git a/resources/js/assets/icons/littercoin/nami.png b/resources/js/assets/icons/littercoin/nami.png
deleted file mode 100644
index 13533939d..000000000
Binary files a/resources/js/assets/icons/littercoin/nami.png and /dev/null differ
diff --git a/resources/js/assets/icons/bronze-medal-2.png b/resources/js/assets/icons/medals/bronze-medal-2.png
similarity index 100%
rename from resources/js/assets/icons/bronze-medal-2.png
rename to resources/js/assets/icons/medals/bronze-medal-2.png
diff --git a/resources/js/assets/icons/gold-medal-2.png b/resources/js/assets/icons/medals/gold-medal-2.png
similarity index 100%
rename from resources/js/assets/icons/gold-medal-2.png
rename to resources/js/assets/icons/medals/gold-medal-2.png
diff --git a/resources/js/assets/icons/silver-medal-2.png b/resources/js/assets/icons/medals/silver-medal-2.png
similarity index 100%
rename from resources/js/assets/icons/silver-medal-2.png
rename to resources/js/assets/icons/medals/silver-medal-2.png
diff --git a/resources/js/assets/icons/mining.png b/resources/js/assets/icons/mining.png
deleted file mode 100644
index 10c0fd3b6..000000000
Binary files a/resources/js/assets/icons/mining.png and /dev/null differ
diff --git a/resources/js/assets/icons/reddit.png b/resources/js/assets/icons/reddit.png
deleted file mode 100644
index b91569ba0..000000000
Binary files a/resources/js/assets/icons/reddit.png and /dev/null differ
diff --git a/resources/js/assets/icons/silver-medal.png b/resources/js/assets/icons/silver-medal.png
deleted file mode 100644
index 8bb77951a..000000000
Binary files a/resources/js/assets/icons/silver-medal.png and /dev/null differ
diff --git a/resources/js/assets/icons/tumblr.png b/resources/js/assets/icons/tumblr.png
deleted file mode 100644
index 62d1ce9f4..000000000
Binary files a/resources/js/assets/icons/tumblr.png and /dev/null differ
diff --git a/resources/js/assets/icons/twitter.png b/resources/js/assets/icons/twitter.png
deleted file mode 100644
index 91e5b3112..000000000
Binary files a/resources/js/assets/icons/twitter.png and /dev/null differ
diff --git a/resources/js/assets/icons/twitter2.png b/resources/js/assets/icons/twitter2.png
deleted file mode 100644
index 18eefb0e6..000000000
Binary files a/resources/js/assets/icons/twitter2.png and /dev/null differ
diff --git a/public/build/assets/butts-DfH5MkNF.jpg b/resources/js/assets/images/butts.png
similarity index 100%
rename from public/build/assets/butts-DfH5MkNF.jpg
rename to resources/js/assets/images/butts.png
diff --git a/resources/js/assets/images/can.png b/resources/js/assets/images/can.png
new file mode 100644
index 000000000..efd988284
Binary files /dev/null and b/resources/js/assets/images/can.png differ
diff --git a/resources/js/assets/images/checkmark.png b/resources/js/assets/images/checkmark.png
deleted file mode 100644
index 8f7e5f02d..000000000
Binary files a/resources/js/assets/images/checkmark.png and /dev/null differ
diff --git a/resources/js/assets/about/facemask-map.png b/resources/js/assets/images/facemask-map.png
similarity index 100%
rename from resources/js/assets/about/facemask-map.png
rename to resources/js/assets/images/facemask-map.png
diff --git a/resources/js/assets/about/facemask-tag.png b/resources/js/assets/images/facemask-tag.png
similarity index 100%
rename from resources/js/assets/about/facemask-tag.png
rename to resources/js/assets/images/facemask-tag.png
diff --git a/resources/js/assets/about/iphone.png b/resources/js/assets/images/iphone.png
similarity index 100%
rename from resources/js/assets/about/iphone.png
rename to resources/js/assets/images/iphone.png
diff --git a/public/build/assets/microplastics_oranmore-CI7v0KxT.jpg b/resources/js/assets/images/microplastics_oranmore.png
similarity index 100%
rename from public/build/assets/microplastics_oranmore-CI7v0KxT.jpg
rename to resources/js/assets/images/microplastics_oranmore.png
diff --git a/resources/js/assets/images/waiting.png b/resources/js/assets/images/waiting.png
deleted file mode 100644
index 12fddca8a..000000000
Binary files a/resources/js/assets/images/waiting.png and /dev/null differ
diff --git a/resources/js/assets/littercoin/launched.png b/resources/js/assets/littercoin/launched.png
deleted file mode 100644
index 73bc3edb5..000000000
Binary files a/resources/js/assets/littercoin/launched.png and /dev/null differ
diff --git a/resources/js/assets/littercoin/launching-soon.png b/resources/js/assets/littercoin/launching-soon.png
deleted file mode 100644
index 456194176..000000000
Binary files a/resources/js/assets/littercoin/launching-soon.png and /dev/null differ
diff --git a/resources/js/assets/littercoin/pick-up-litter.jpeg b/resources/js/assets/littercoin/pick-up-litter.jpeg
deleted file mode 100644
index 78f608690..000000000
Binary files a/resources/js/assets/littercoin/pick-up-litter.jpeg and /dev/null differ
diff --git a/resources/js/assets/littermap.png b/resources/js/assets/littermap.png
deleted file mode 100644
index 71d1bbfb5..000000000
Binary files a/resources/js/assets/littermap.png and /dev/null differ
diff --git a/resources/js/assets/logo-white.png b/resources/js/assets/logo-white.png
deleted file mode 100644
index 3aa6f010b..000000000
Binary files a/resources/js/assets/logo-white.png and /dev/null differ
diff --git a/resources/js/assets/logo.png b/resources/js/assets/logo.png
deleted file mode 100644
index 80e3fbe27..000000000
Binary files a/resources/js/assets/logo.png and /dev/null differ
diff --git a/resources/js/assets/logo_small.png b/resources/js/assets/logo_small.png
deleted file mode 100644
index 04bcdd6da..000000000
Binary files a/resources/js/assets/logo_small.png and /dev/null differ
diff --git a/resources/js/assets/marinelitter.jpg b/resources/js/assets/marinelitter.jpg
deleted file mode 100644
index 8efee1818..000000000
Binary files a/resources/js/assets/marinelitter.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8188.jpg b/resources/js/assets/memes/IMG_8188.jpg
deleted file mode 100644
index 501f58183..000000000
Binary files a/resources/js/assets/memes/IMG_8188.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8189.jpg b/resources/js/assets/memes/IMG_8189.jpg
deleted file mode 100644
index dda248718..000000000
Binary files a/resources/js/assets/memes/IMG_8189.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8190.jpg b/resources/js/assets/memes/IMG_8190.jpg
deleted file mode 100644
index 01acfb045..000000000
Binary files a/resources/js/assets/memes/IMG_8190.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8191.jpg b/resources/js/assets/memes/IMG_8191.jpg
deleted file mode 100644
index e70eff289..000000000
Binary files a/resources/js/assets/memes/IMG_8191.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8192.jpg b/resources/js/assets/memes/IMG_8192.jpg
deleted file mode 100644
index 93a2627ef..000000000
Binary files a/resources/js/assets/memes/IMG_8192.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8193.jpg b/resources/js/assets/memes/IMG_8193.jpg
deleted file mode 100644
index 69041c508..000000000
Binary files a/resources/js/assets/memes/IMG_8193.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8194.jpg b/resources/js/assets/memes/IMG_8194.jpg
deleted file mode 100644
index 7e1aa48ff..000000000
Binary files a/resources/js/assets/memes/IMG_8194.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8195.jpg b/resources/js/assets/memes/IMG_8195.jpg
deleted file mode 100644
index 0bf646f69..000000000
Binary files a/resources/js/assets/memes/IMG_8195.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/IMG_8196.jpg b/resources/js/assets/memes/IMG_8196.jpg
deleted file mode 100644
index fd150c9be..000000000
Binary files a/resources/js/assets/memes/IMG_8196.jpg and /dev/null differ
diff --git a/resources/js/assets/memes/image.png b/resources/js/assets/memes/image.png
deleted file mode 100644
index d2767eefa..000000000
Binary files a/resources/js/assets/memes/image.png and /dev/null differ
diff --git a/resources/js/assets/microplastics_oranmore.jpg b/resources/js/assets/microplastics_oranmore.jpg
deleted file mode 100644
index f7b7dbda6..000000000
Binary files a/resources/js/assets/microplastics_oranmore.jpg and /dev/null differ
diff --git a/resources/js/assets/nlbrands.png b/resources/js/assets/nlbrands.png
deleted file mode 100644
index 7380832e2..000000000
Binary files a/resources/js/assets/nlbrands.png and /dev/null differ
diff --git a/resources/js/assets/olm_dissertation_result.PNG b/resources/js/assets/olm_dissertation_result.PNG
deleted file mode 100644
index 9736fb786..000000000
Binary files a/resources/js/assets/olm_dissertation_result.PNG and /dev/null differ
diff --git a/resources/js/assets/partners/gitcoin.png b/resources/js/assets/partners/gitcoin.png
new file mode 100644
index 000000000..e67ee3068
Binary files /dev/null and b/resources/js/assets/partners/gitcoin.png differ
diff --git a/resources/js/assets/pexels-photo-3735156.jpeg b/resources/js/assets/pexels-photo-3735156.jpeg
deleted file mode 100644
index 394489514..000000000
Binary files a/resources/js/assets/pexels-photo-3735156.jpeg and /dev/null differ
diff --git a/resources/js/assets/pixel_art/.DS_Store b/resources/js/assets/pixel_art/.DS_Store
new file mode 100644
index 000000000..41a6d35e5
Binary files /dev/null and b/resources/js/assets/pixel_art/.DS_Store differ
diff --git a/resources/js/assets/pixel_art/boy1.jpg b/resources/js/assets/pixel_art/boy1.jpg
new file mode 100644
index 000000000..63a4efc84
Binary files /dev/null and b/resources/js/assets/pixel_art/boy1.jpg differ
diff --git a/resources/js/assets/pixel_art/girl.jpg b/resources/js/assets/pixel_art/girl.jpg
new file mode 100644
index 000000000..1a1164ae0
Binary files /dev/null and b/resources/js/assets/pixel_art/girl.jpg differ
diff --git a/resources/js/assets/pixel_art/litterworld.jpeg b/resources/js/assets/pixel_art/litterworld.jpeg
new file mode 100644
index 000000000..a1a6452a6
Binary files /dev/null and b/resources/js/assets/pixel_art/litterworld.jpeg differ
diff --git a/resources/js/assets/pixel_art/mountains.JPG b/resources/js/assets/pixel_art/mountains.JPG
new file mode 100644
index 000000000..6dd6f6252
Binary files /dev/null and b/resources/js/assets/pixel_art/mountains.JPG differ
diff --git a/resources/js/assets/plastic_bottles.jpg b/resources/js/assets/plastic_bottles.jpg
deleted file mode 100644
index 9c616c58d..000000000
Binary files a/resources/js/assets/plastic_bottles.jpg and /dev/null differ
diff --git a/resources/js/assets/slack-brand-logo.png b/resources/js/assets/slack-brand-logo.png
deleted file mode 100644
index 0ad21bdcf..000000000
Binary files a/resources/js/assets/slack-brand-logo.png and /dev/null differ
diff --git a/resources/js/assets/slack-screenshot.png b/resources/js/assets/slack-screenshot.png
deleted file mode 100644
index c62287fcc..000000000
Binary files a/resources/js/assets/slack-screenshot.png and /dev/null differ
diff --git a/resources/js/assets/spatial_analysis.png b/resources/js/assets/spatial_analysis.png
deleted file mode 100644
index 754251849..000000000
Binary files a/resources/js/assets/spatial_analysis.png and /dev/null differ
diff --git a/resources/js/assets/splash.png b/resources/js/assets/splash.png
deleted file mode 100644
index 165776889..000000000
Binary files a/resources/js/assets/splash.png and /dev/null differ
diff --git a/resources/js/assets/urban.jpg b/resources/js/assets/urban.jpg
deleted file mode 100644
index 56074f9be..000000000
Binary files a/resources/js/assets/urban.jpg and /dev/null differ
diff --git a/resources/js/assets/verified.jpg b/resources/js/assets/verified.jpg
deleted file mode 100644
index 1255360f2..000000000
Binary files a/resources/js/assets/verified.jpg and /dev/null differ
diff --git a/resources/js/assets/zoom-brand-logo.png b/resources/js/assets/zoom-brand-logo.png
deleted file mode 100644
index 8520193b0..000000000
Binary files a/resources/js/assets/zoom-brand-logo.png and /dev/null differ
diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js
index 04072838a..59d4221d9 100644
--- a/resources/js/bootstrap.js
+++ b/resources/js/bootstrap.js
@@ -3,17 +3,20 @@ import axios from 'axios';
window._ = _;
window.axios = axios;
+axios.defaults.withCredentials = true;
+window.axios.defaults.headers.common['Accept'] = 'application/json';
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
-const token = document.head.querySelector('meta[name="csrf-token"]');
-
-if (token) {
- window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
-} else {
- console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
-}
+axios.get('/sanctum/csrf-cookie').catch((err) => {
+ console.error('Failed to get Sanctum CSRF cookie:', err);
+});
// Websockets
-import './echo';
-
+import './echo.js';
+// Leaflet
+import './views/Maps/helpers/SmoothWheelZoom.js';
+import '@css/leaflet/MarkerCluster.css';
+import '@css/leaflet/MarkerCluster.Default.css';
+import 'leaflet/dist/leaflet.css';
+import '@css/leaflet/popup.css';
diff --git a/resources/js/components/About/AboutBrands.vue b/resources/js/components/About/AboutBrands.vue
new file mode 100644
index 000000000..258d10d99
--- /dev/null
+++ b/resources/js/components/About/AboutBrands.vue
@@ -0,0 +1,728 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ t('Accountability')
+ }}
+
+
+
+ {{ t('What Brands are Polluting Your Community?') }}
+
+
+
+ {{
+ t(
+ 'Taxpayers and volunteers have to work long hours to cleanup the waste produced by super-profitable ocean-polluting megacorporations.'
+ )
+ }}
+
+
+
+ {{
+ t(
+ 'They privatize all the gains and socialize all the losses, leaving communities to deal with the mess they benefit from.'
+ )
+ }}
+
+ {{ t('Maps are powerful tools that help us see and understand the world.') }}
+
+
+
+
+
+
+
+
+
+
+ {{ t(place.titleKey) }}
+
+
+
+ {{ t('Check out this map of cigarette litter around the') }}
+
+ {{ t('Bundesrat') }}
+
+ {{
+ t(
+ ' (the Federal government buildings of Germany), where billions of euro of public money is spent on public health, education and the environment.'
+ )
+ }}
+
+
+ {{ t('Check out this map of litter outside the') }}
+
+ {{ t('EU Parliament') }}
+
+ {{
+ t(
+ " - where they debate how to spend billions in 'green' budgets on public health, education, and the environment, but they can't even see what's on their doorstep."
+ )
+ }}
+
+
+ {{ t(place.copyKey) }}
+
+
+ {{
+ t(
+ 'There is about 300 million tonnes of plastic starting to fragment exponentially in the worlds oceans.'
+ )
+ }}
+
+
+
+ {{
+ t(
+ 'Microplastics can be found on any beach in the world, found here in Oranmore Co. Galway, Ireland, around the corner from the Marine Institute. How many can you find on the next beach you visit?'
+ )
+ }}
+
+
+
+
+
+
+
+
+ 5.25T
+
+
+ {{ t('Plastics floating on the ocean surface (2014)') }}
+
+ {{
+ t(
+ 'Most systems are locked away, allowing few people to participate in decision-making, auditing, direction, and understanding. Closed systems restrict your choices and limit societies freedom.'
+ )
+ }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('Our Solution') }}
+
+
+ {{
+ t(
+ 'We made OpenLitterMap entirely open source so that anyone can participate in every aspect of it. Anyone can participate in the data collection, coding, feature development, forking all our work and taking it in any other direction, data analysis, etc. OpenLitterMap is the academic precursor to a global real-time interventional experience for society that intends to transform our relationship with technology, education, institutions & the environment.'
+ )
+ }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('The Impact') }}
+
+
+ {{
+ t(
+ 'Real-time impact data on litter & plastic pollution that enables anyone in society to participate in Science, Technology, Environment and Memes and shape our understanding of reality.'
+ )
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Capture') }}
+
+
+
+
{{ t('Open Data') }}
+
+
+
+
{{ t('Impact') }}
+
+
+
+
+
+
+
+
+ {{
+ t(
+ '"When systems are open, innovation is democratised, and unlimited change is possible."'
+ )
+ }}
+
+
+ {{ t('- Seán Lynch, founder of OpenLitterMap.') }}
+
+ Please read this Privacy Policy carefully before using OpenLitterMap.com ("OLM", "we", "our", "us"). By
+ using our services, you agree to the terms described here. We may update this policy from time to time
+ and will notify you via the website or our social media channels.
+
+
+
+
+
+
+ 1. Purpose of Our Services
+
+
+
+ OpenLitterMap provides a platform for volunteers ("Citizen Scientists") to share geotagged
+ images of litter and plastic pollution. Geotagged images include:
+
+ This data can reveal where and when you and certain geographic observations was found. It can
+ also highlight hotspots for hazardous waste such as drug-related litter which has potentially
+ contentious social implications. (We operate a separate non-open druglitter.info platform
+ specifically for this reason but it remains significantly underdeveloped).
+
+
+ When an image is uploaded its coordinates and timestamp are made available in real-time. Every
+ upload generates a unique link that can be shared with others, effectively creating a real-time
+ reporting service.
+
+
+ New users are anonymous by default and the image contents of their contributes are not
+ immediately available. We are developing a verification process that can determine the quality
+ and content of each upload and new user.
+
+
+ Once a user has their account upgraded to verified, the image contents + tags of their uploads
+ are made immediately available with every upload.
+
+
+ As well as the pre-defined 150+ tags of litter, you may also enter Custom Tags. Simply type in
+ any text and press enter to add any tag you want. This way you can extend OpenLitterMap to map
+ anything (eg donation tracking, landslides, coastal erosion, biodiversity, etc). Litter and
+ plastic mapping is just the first application of this technology.
+
+
+
+
+
+
+ 2. Age Restrictions
+
+
+
+
Under 13
+
+ We do not allow users under the age of 13. If we discover personal data from a child under
+ 13, we will delete it immediately.
+
+
+
+
+
Ages 13–17
+
+ Users aged 13–17 may only participate with parental or guardian supervision. Supervisors
+ should ensure safe practices, particularly when encountering hazardous litter such as
+ needles, broken glass, or other dangerous items.
+
+
+
+
+
URGENT MEDICAL ATTENTION
+
+ If you suffer an injury, call 112, 999, or your local emergency number immediately.
+
+
+
+
+
+
+
+ 3. Data We Collect
+
+
+
Account details (name, username, email, password)
+
Images you submit
+
EXIF metadata from images (e.g., GPS location, timestamp)
+
Tags and attributes associated with each image
+
Aggregated statistics and geospatial analysis derived from all contributions
+
+
+
+
+
+ 4. Data We Do Not Collect
+
+
+
Cookies (beyond essential session cookies)
+
IP addresses
+
Referring or destination websites
+
Browser type or clickstream data
+
Detailed usage tracking outside of essential server logs
+
+
+
+
+
+ 5. Public Availability of Data
+
+
+ By submitting data, you agree that images, their contents, location, and time of capture may be made
+ public. By default, contributions are anonymous, but you may choose to display your full name,
+ username, or organisation.
+
+
+
+
+
+ 6. Safety Guidance
+
+
+
Do not touch hazardous litter without proper protective equipment.
+
Do not collect data in unsafe locations.
+
Avoid including identifiable people in images.
+
Do not upload from locations you wish to remain private (e.g., your home address).
+
Please be careful when collecting data in a busy street or along a roadside.
+
Remain vigilant of theives and people who may snatch your device when its unlocked.
+
+
+
+
+
8. Feedback
+
+ We welcome feedback on this policy and our services. Email
+ {{
+ contactEmail
+ }}.
+
+ OpenLitterMap ("OLM", "we", "our", "us") is an
+ open‑source, real‑time geographic data collection platform
+ for the internet.
+
+
+ Inspired by
+ OpenStreetMap
+ — the most powerful collaborative map of the world, built by over 10 million contributors —
+ our mission is to make
+ real‑time geographic data collection quick, fun, impactful, and accessible..
+
+
+ We began mapping litter and plastic pollution in 2008. Since then, OpenLitterMap has grown into
+ one of the
+ largest, longest‑running, and most open platforms
+ dedicated to mapping litter and plastic pollution. Our vision is an
+ accurate, dynamic, and open dataset that empowers
+ communities, researchers, and decision‑makers to tackle pollution at every scale.
+
+ You are free to modify and distribute the code,
+ your only requirement is that you also release your
+ code changes under the terms of the same open source licence.
+
+
The license guarantees the code remains open and free for the public good.
+
+
+ We believe open source transcends pre‑digital economic philosophies — combining the
+ collective equity of Karl Marx with the invisible hand of Adam Smith.
+
+
+ Development status: OLM is an evolving project. Unlike
+ platforms that have received billions in funding, OLM operates on a community‑first, grassroots
+ model. There may be bugs, incomplete features, and limitations; however, development is
+ accelerating with AI and community contributions.
+
+ All geographic data you contribute — including
+ GPS locations, litter classifications, and counts —
+ is available for public download and reuse under ODbL.
+
+
+ You can use our data for any purpose (research,
+ education, commercial projects, advocacy, art) without asking permission, provided you
+ attribute OpenLitterMap and share any derivative databases under the same license.
+
+
+
Geotagging & location accuracy
+
+ If geolocation services are enabled on your device, your photo's GPS coordinates (often with
+ high accuracy) will be captured and published
+ in real time. This enables live global environmental
+ monitoring — but also requires care near sensitive locations.
+
+
+
+ Do not upload photos from your home, workplace, or
+ private locations unless you're comfortable with the location becoming public.
+
+
+ Focus your contributions on
+ non‑human natural environments to protect privacy and
+ resist normalization of personal surveillance online.
+
+
+
+
+
+
+
4. Your Privacy
+
+
By default, contributions are anonymous.
+
+ You may optionally display your name (real or pseudonym)
+ or username on the map, in leaderboards, and in "created by" credits for first uploads at a
+ location.
+
+
+ Please avoid including identifiable features of people in photos — faces, tattoos, licence
+ plates, personal shadows, or footwear.
+
+
+ Think before you map: if you don't want data shown from a place (e.g., outside your house),
+ don't upload from there.
+
+
+
+
+
+
+ 5. Data We Collect
+
+
+
We collect only what's needed to operate and improve the platform:
+ Content: images you upload, including EXIF metadata
+ if available
+
+
+ Tags: pre‑defined and custom litter classifications
+ you add
+
+
Teams: names and details of teams you create
+
+
+
+
+
+
+ 6. Data We Do Not Collect
+
+
+
We respect your privacy. We do not collect:
+
+
IP addresses
+
Browser cookies for tracking
+
Detailed site‑usage analytics beyond essential server logs
+
Third‑party tracking pixels including emails.
+
+
+
+
+
+
+ 7. Acceptable Use
+
+
+
Only upload content you are comfortable sharing with the world.
+
Do not submit false, misleading, or spam data.
+
Only upload data of litter and plastic pollution.
+
+ Please try to collect good quality data (eg. individual objects). Litter strewn over a street is
+ hard and boring to verify.
+
+
+ Please do not misuse our APIs, attempt to disrupt the service, or scrape in violation of our
+ licenses. Sometimes OLM has cost me €250 per/month just to host the images on AWS. Thankfully
+ AWS have been very generous with Earth credits to support open source.
+
+
+ Bulk image download is not yet available. When we release the OpenLitterMap AI we will make it
+ more available.
+
+ Thank you for being one of the first people to sign up to OpenLitterMap. You are obviously in the know about
+ our big problem and I would like to remind you about this working service that I am creating independently.
+ It might not be perfect, but you can expect - and you are invited to finance - improvements. Here are some
+ of the upgrades since the launch last month:
+
+
+
+
A new Coastal category for marine-litter;
+
+ On the maps, users now have the option to be credited for each image they upload by their full name
+ and/or the username/organisation they are legally entitled to represent (A great way to advertise your
+ public portfolio/organisation);
+
+
+ Several new countries have been automatically added to the database including India, Australia, Denmark,
+ UK, US, Spain and more;
+
+
You can now view data from areas that have only 1 verified litter point.
+
This email thread has begun.
+
+
+
+ All data from OpenLitterMap.com is free to view by anyone and download by any logged-in user. Want to
+ download all the data for a country? 1-click and it's yours- ready for import by anyone into R, GIS, Excel
+ or your favorite problem-solving development environment.
+
+
+
+ First milestone! We now have over 250 verified images in our database and over 1,000
+ verified litter items.
+
+
+
+ Do you want to contribute to the development of OpenLitterMap? By making a €9, €20 or €30 monthly
+ subscription I can afford to significanly increase your upload allowance and you can finance the development
+ of this working, fun, open and accessible Citizen Science platform to mitigate against the increasing and
+ multi-faceted threats of plastic-pollution.
+
+
+
+ If you cannot afford a ~30-cent, 66-cent or 1-euro a day subscription to finance the development of
+ OpenLitterMap and help cover the costs of running a website and processing large volumes of image data on
+ the cloud, you may upload at least 1 image every day for free. This allowance will increase to 2-images a
+ day when you reach Level-5 and 3-images a day when you reach Level-10. If you would like access to 3-images
+ a day soon, you could sign up for 1-month to significantly increase your upload allowance, generate the
+ necessary XP and cancel the subscription in 1-click @ openlittermap.com/settings/payments once you are
+ logged-in.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
Make sure each litter item is clearly identifiable. You are the one who has to process them later!
+
+ If you do not process them successfully, the image will be sent back to you, so in your own
+ best-interests please try and get it right the first time.
+
+
You can add as many images as into 1 photo as you want.
+
+ You could collect 1000 images in your own time and then when you are ready, pay €30 for a Professional
+ Account, upload all of them, and process them in your own time.
+
+
+ The maps are a free educational tool to use. You can find them at
+ openlittermap.com/maps/Country/Location/map
+
+
You can toggle between different categories of related waste eg Smoking, Coffee..
+
All data is free to download per Country or sub-country Location. You may begin problem-solving!
+
Remember to enable your geotagging or OpenLitterMap will not accept your images.
Great News! OpenLitterMap is now available en Español.
+
+
+
+ If you have used OpenLitterMap recently, you might need to delete cookies on your device if the
+ "add data" component is missing. is missing.
+
To delete cookies (if necessary):
+
On iPhone:
+
+
Open Settings
+
Open the settings for Safari or for whatever browser you use
+
Scroll down to the bottom and select "Clear History and Website Data"
+
+
On Android:
+
+
Open the browser and click the Menu button on your phone
+
Tap the More option
+
Scroll down to the Privacy settings section and tap the Clear cache option
+
Now tap the Clear all cookie data option
+
+
On Laptop:
+
+
Chrome - Settings
+
Clear Browsing Data
+
Delete cookies
+
+
+
+ This means that other languages will be really easy to add in. What language would you
+ like
Several performace upgrades and legacy code refactors.
rs.
+
+ 2 New Blogs coming incl "The Smartest Cities Will Embace Open Data on Plastic Pollution" in the North
+ American Public Sector Digest.
+
+
+ OpenLitterMap was rejected by yet another grant holder (making that 5 or 6 unsuccessful grant
+ applications in a row). There is not much support for open data on plastic pollution.
+
+ Added a Progress Bar to the global page (openlittermap.com/maps) to
+ determine how far away we are from meeting our next open data target
+
+
Removed the url to the annoying navigation section but its still there if you want @ /navigation
+
+ ¡Hablamos Español! OpenLitterMap is now available in Spanish, making internationalization
+ easy for future languages!
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We want anyone to be able to access our data to solve problems.
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any time, any-where! Maybe this Saturday, 2-4pm?
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ If you If you can't count what's in the photo, you can use Large/Random Dump in the Other category and rank it
+ from 1-100.
+ You are not just mapping litter, you are creating open data. Feel the Knowledge!! You can download your
+ data too. Anyone can!
+
+
+ Please Please don't include children in the photos, but feel welcome to take a picture of your dog and join our
+ community of Trash Dog owners! Feature your cute pup on theef="https://openlittermap.com/global">global map under the trash dog category!
+
You are invited to attend our inaugural online conference STOP! [1] The State of Plastic Pollution.
+
+
+
+ STOP! [1] The State of Plastic Pollution
+ is our inaugural online conference where we will introduce OpenLitterMap and call on your input to guide
+ our plans for the future. STOP! [1] will take place from the comfort of your home or wherever
+ you happen to be on Saturday, September 1st via YouTube at 3pm Irish time (GMT); 8am California; 11pm
+ Sydney. I hope you can find the time to join us for this 1 hour event. You will be sent
+ a link to the conference shortly before it begins.
+
+
OpenLitterMap is now available in Turkish! Several other languages are currently being translated.
+
+ Removed the "Drugs" category. Might integrate some items into sanitary/other. Drug litter mapping
+ remains continuous on my other site druglitter.info however I have left
+ the decision of openness on this type of litter up to Local Authorities. However, no one really cares
+ and both DrugLitter and OpenLitterMap remain completey underdeveloped leaving the hazards posed to
+ innocent children in playgrounds and society & the environment at large largely unabated.
+
+
+ Fixed some bugs in the Brands category that I introduced accidentally after pushing some random keys at
+ 3 or 4am some night.
+
+
Started learning unit & feature testing to avoid pushing broken code.
+
+ You might have noticed the delete button is not working on Profile. I haven't fixed this yet, but I did
+ change the error from "Sorry this page could not be found" to an alert box with a new message.
+
+
Added Littercoin Issued (2,950) and mined not-yet issued (18,575) to openlittermap.com/maps
+
+ I was rejected by more 2 grant holders incl LW and D-S., bringing the total grant rejections in a row to
+ 6 which has to be some kind of record.
+
+
+ I am now sharing updates on reddit.com/r/openlittermap.
+ Please subscribe and upvote so more people can see.
+
+
+
+
+ STOP! Conference Announcement! Join us September 1st at 3pm Irish time for our inaugural
+ online conference about the state of plastic pollution. Plus: Turkish language now available!
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We want anyone to be able to access our data to solve problems.
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any time, any-where! Maybe this Saturday, 2-4pm?
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ If you can't count what's in the photo, you can use Large/Random Dump in the Other category and rank it
+ from 1-100.
+
+
+ You are not just mapping litter, you are creating open data. Feel the Knowledge!! You can download your
+ data too. Anyone can!
+
+
+ Please don't include children in the photos, but feel welcome to take a picture of your dog and join our
+ community of Trash Dog owners! Feature your cute pup on the
+ global map under the trash dog category!
+
+ Unfortuantely our inaugural online conference STOP wasn't able to go ahead. As a 1 man team I have
+ limits.
+
+
+ A few guest speakers had to cancel and there is way too much going on for me personally doing all of
+ this by myself. I will try to arrange another one for mid-term (around Halloween) or xmas.
+
+
Redesigned the Homepage.
+
Launched the Litter World Cup.
+
+ You can now sort countries Alphabetically, or by what country has created the most Open Data, or what
+ country has created the most Open Data per person!
+
+
+ Ireland and Pakistan are in the lead however the French dominated August Litter 2018 climbing to 6th
+ place and continue to gain momentum. September Litter has begun in Australia, Canada, USA and Ireland.
+
+
Fixed time-series charts on mobile.
+
+ Added 1 new alcohol (Pint Glass), 2 new soft drinks (Pull-ring and Straw Packaging), 5 new other (Pet
+ Surprise in a bag, Balloons, Traffic Cone, Life Buoy, Clothing and Automobile), 1 new sanitary (Wet
+ Wipes) and 38 new Brands (Asahi, Aldi, Ballygowan, Bulmers, Burger King, Cadburys, Carlsberg, Coles,
+ CircleK, Dunnes, Doritos, Dr Pepper, Duracell, Durex, Evian, Fosters, Gatorade, Guinness, Haribo, KFC,
+ Lidl, Linden Village, Lucozade, Nero, Mars, Powerade, Ribena, Sainsburys, Spar, Stella, Supervalu,
+ Tesco, Thins, Volvic, Waitrose, Walkers, Woolwoths & Wrigleys).
+
+
+ I appreciate not all of these Brands are for everyone and I have plans to arrange them by location as
+ well as 1000+ other things.
+
+
Emailed all City & County Councillors in Ireland. Got a few interested replies! Progress!!
+
+ Got new business cards and a standup banner. Keep an eye on my story on Instagram to see what I'm up to!
+
+
+ Heading to Berlin for a 3-day Blockchain Discovery Tour to share information about Littercoin - the
+ first token rewarded for the production of geographic information.
+
+
+ LitterCat has joined forces with TrashDog to educate society about plastic pollution on the Global Map.
+
+
You can now toggle the global data on the global map!
+
+ Reminder that I am looking for Interns. Want to give a hand with marketing? Social Media? Graphic
+ Design? Code? Reseach? Co-authoring Papers? Advancing GIScience? Becoming a local expert? Anything else?
+ Get in touch! Or would you prefer to do your own thing? Open Data and Littercoin are permissionless so
+ if you think you can use them for something go for it!
+
+
+ I need more people to crowdfund OpenLitterMap with $5 once-off or once a month. So far 7 grant
+ applications have been rejected and OpenLitterMap could use another developer or 6. Are there 100 or
+ 1000 people out there who think Open Data is important? I really hope so and not just for my sake.
+
+
+
+
+ Litter World Cup Launched! Countries can now compete, and LitterCat has joined TrashDog!
+ Plus 38 new brands added to help track corporate responsibility.
+
+ Plastic entering the marine environment is expected to continue to increase exponentially, from 8-12
+ million tonnes in 2010 to ~70 million tonnes by 2025 (Jambeck, et al 2015).
+
+
+ Plastic pollution is already believed to be etched permanently into the biosphere, including water, air,
+ sea-salt, humans, soil and wildlife.
+
+
+ My 20th grant application was rejected last week. This lack of support has had a tremendously negative
+ impact on my mental health- more so than plastic pollution itself.
+
+
+ In 2019, I plan to release Mobile Apps, Smart Contracts, A.I. and re-vamp the website. I will probably
+ have to do this by myself, unless anyone out there would like to help me?
+
+
+ Due to the complete lack of support, I have had no choice but to scrap the original idea for the
+ non-profit OpenLitterMap Foundation. Instead, I have had to iterate over a business plan which will be
+ executed once the technology is more developed. This is necessary to keep this project alive and
+ growing. After all, not even the Pineapple Fund thought this project was worth supporting!
+
+
+ A new OLM token will be released, rewarded to anyone crowdfunding (€1 = 1 OLM). Anyone crowdfunding
+ prior to its release will recieve double the tokens. This new OLM token will give you voting rights on
+ the future of the platform, as well as an opportunity be financially re-imbused by the OpenLitterMap
+ Ecosystem. This will be explained in the Littercoin Whitepaper. I was really hoping to release that by
+ now, but unfortunately there is no support for the development of this technology despite about 1,000
+ tonnes of plastic believed to be going into the ocean every hour, children falling on needles, and the
+ waste of public expenditure.
+
+
+ We are going to build the most amazing data collection experience and source of open data on plastic
+ pollution the world has ever seen. This will happen much faster if more people sign up to support or a
+ grant holder figures out that open data on plastic pollution is actually really important.
+
+
+ I'm looking for developers and others who think open data on plastic pollution is important to join my
+ team!
+
+
For a list of updates, keep in touch on social media.
+
+
+
+ 20 grant rejections and counting. Despite the challenges, 2019 will bring Mobile Apps,
+ Smart Contracts, and A.I. to help fight plastic pollution - with or without institutional support.
+
+ It's been 9 months since our last update. I have been working hard during this time and finally - it's time
+ for an update.
+
+
+
+
OpenLitterMap is now available on iOS. Android will follow shortly.
+
+ This app will make data collection easier. There are some small bugs and many improvements to be made,
+ which are already being worked on.
+
+
+ With the web-app, our community crowdsourced over 85,000 pieces of litter. All of which have been
+ manually verified and are completely free to download and re-use, for any purpose, without permission.
+ If you can show me better quality open data, I will stop what I'm doing and promote that platform
+ instead.
+
+
+ For the first time, OpenLitterMap will be speaking at the annual OpenStreetMap conference, The State of
+ the Map #sotm2019 in Heidelberg, Germany later this month.
+
+
+ Last month OpenLitterMap met with the first local authority in Ireland to discuss how they can take best
+ use of this platform and I have more meetings planned with various local authorities in the UK soon.
+
+
+ We at the cusp of a global scientific rennaisance as never before was it possible to involve potentially
+ millions of people in data collection. However, OpenLitterMap still hasn't even reached 1% of our
+ funding target. We don't have a video to communicate open data, and I can't even justify working on this
+ 1-day per month despite being probably the only person in the world to study litter-mapping for over a
+ decade.
+
+
+ OpenLitterMap is available in German, French, Spanish, Turkish, Malay and English - thanks to some
+ amazing volunteers! We plan to translate OpenLitterMap into as many languages as possible. We have
+ released our language files as open source which anyone is welcome to fork, or download and email back
+ to us. (PS - please communicate with us so that efforts are not being duplicated.)
+
+
+ OpenLitterMap is looking for developers and others. Unfortunately, more than 40 grant holders have
+ rejected to support the development of OpenLitterMap and our kickstarter couldn't even reach one percent
+ so as much as we would love to get this moving - we can't offer anyone a living wage for their work yet.
+
+
For more regular updates, please keep in touch and help us grow on social media.
+
+
+
+ iOS App Launched! After a decade of work, OpenLitterMap is now available on mobile with
+ 85,000+ verified data points and speaking at State of the Map 2019 in Germany.
+
+ OpenLitterMap is now available for Android if you follow this link. It's so new you can't even search
+ for it yet!
+
+
+ There may be some small bugs. If you find anything wrong, please contact me and I will resolve them
+ ASAP.
+
+
+ We have been given a generous 12-months worth of research credits from AWS. This allows us to upgrade
+ our server from a baby to a monster, at no extra cost. This will allow more concurrent users to upload
+ and download content significantly faster. The server migration is complete.
+
+
+ Last month I gave a talk at the annual OpenStreetMap conference the State of the Map. You can watch the
+ talk here.
+
+
+ Next week I will be giving another talk at an OpenStreetMap conference (South-East Europe) which you can
+ learn more about here.
+
+
+ The week after that, I am traveling to my neighbours in Wales to meet with all Local Authorities in 1
+ country for the first time. Wales is the first country in the world to take democratizing science on
+ litter mapping seriously. Go Wales!!!!
+
+
+ OpenLitterMap has been translated into Italian, but there is a bug that I need to fix before it works.
+ Sorry Italy!!!
+
+
+ OpenLitterMap is still looking for developers and others. Currently I am doing all of this by myself.
+ Please help?
+
+
+ Our community chat is starting to get more active. Please join us on Slack and help grow the community
+ with this invite link.
+
+
I promise I will update this horrible footer on one of our next updates.
+
+
+
+ Android Launched & AWS Support! Wales becomes the first country to take litter mapping
+ seriously, and we've upgraded to a monster server thanks to AWS research credits.
+
I thought this might be an approriate time to share some good news!
+
+
+
+ Version 2 of our apps are now avaiable for iOS and Android. These include:
+
+
Significantly improved photo gallery
+
Significantly improved login & signup
+
75% reduction in file size
+
Improved battery life
+
Less crashes
+
+ And there is lot more yet to come. We are just getting started.
+
+
Earlier this week, I gave a talk about OpenLitterMap which you can see here. Starts at 4:00.
+
I also did some text interviews. 1. Here is one from the US And 2. Here is another one from Sweden.
+
+ We have passed 150,000 manually verified free and open citizen science data on litter and plastic
+ pollution. We are 35% of the way to our next target (250,000) and 15% of the way to 1-million!
+
+
+ The Open Knowledge Foundation awarded a grant to one of our members to run a litter and waste mapping
+ event in Malawi which brought them from below 30th to 7th at the LitterWorldCup. - You can read about
+ the event here. - Check out Map 1 - and Map 2 - here is all of the data for Malawi - We even made it
+ into a newspaper!
+
+
The UK made it into 1st place at the LitterWorldCup AND Global OpenLitterMap top-10 leaderboard.
+
+ We are about to launch a new crowdfunding campaign which includes our first official video. I hope you
+ will enjoy it and please share it!
+
+
Our Slack channel now has more than 100 users. Come and join us using this invite link.
+
Next, we will fix some remaining mobile bugs and introduce new and refactor existing items.
+
+
+
+ 150,000 Data Points & App v2 Released! Malawi jumps to 7th place, UK takes 1st, and we're
+ launching our first official video with a new crowdfunding campaign.
+
+
+
+ Thank you for taking an interest in open citizen science data on pollution. Let's carry the current momentum
+ forward and share data to help fix our most urgent global problems.
It's been a while since our last update and I wanted to keep you in the loop.
+
+
+
+ Every Thursday, from 6pm Irish / UK time (GMT+1), we will be running weekly zoom calls for less than an
+ hour. We hope to follow this up with a global Litter Mapping Marathon every Saturday from 1-2pm your
+ local time. If you are interested to know more about OpenLitterMap, how you can be a part of it, or
+ maybe you are concerned about litter & plastic pollution, we would love for you to join us! About an
+ hour before the call, we post the link into our Slack channel and Facebook group. If you are there,
+ download the Slack app and say hello using this invite link, or search for "Open Litter Map" on
+ facebook.
+
+
+ Several new items & categories have been added to the web & mobile apps including Gloves, Facemasks
+ (Sanitary), a new Dumping category (small, medium & large), a new Industrial category (oil, chemical
+ spills) and more!
+
+
+ After many delays, we are finally getting close to launching our first video. We will use this to launch
+ a GoFundMe soon to try and bring OpenLitterMap to the next stage.
+
+
+ For the last 12+ months I have been studying machine learning like crazy. I did several paid online
+ courses, watched 100s of youtube videos and read a massive book. This week I finally started developing
+ my first neural network - the OpenLitterAI.
+
+
+ Although OpenLitterMap is not yet open source, we will be releasing the code whenever the development of
+ the platform is supported or we can achieve MVP.
+
+
+ Currently interviewing 2 junior and 1 senior developer to join the team & a senior marketing manager.
+
+
+ Huge performace boost to The Litter World Cup which now loads all metdata for 80+ countries in <1 second
+ down from ~5seconds.
+
+
Several more grants were rejected. We are now 60+ rejected grants in a row!
+
+ #TeamLitterUK have made it to 1st & 2nd place on the Global OpenLitterMap Leaderboard as well as 1st
+ place at the #LitterWorldCup.
+
+
+ OpenLitterMap has been almost entirely researched and developed by 1 person over a 10+ year period with
+ very small amounts of crowdfunding. If you would like to learn more, come and join us this (or any)
+ Thursday @ 6pm GMT +1 and help us advance high-qualtiy open citizen science on pollution.
+
+
+
+
+ Community Calls Launched & OpenLitterAI Begins! Weekly Thursday Zoom calls start, plus
+ after 12+ months of studying machine learning, development on the first neural network has begun.
+
Next week, we are going to launch a GoFundMe to try and bring OpenLitterMap to the next stage.
+
+
+
+ As part of the campaign, we have made our first promotional video that I hope you will enjoy! A short
+ trailer of the video has been released on Facebook, Twitter and Reddit. If you would like to help, this
+ would be a really good time to interact with us on social media. We will only be able to increase our
+ visibility with your help. Please considering joining the crowdfunding and sharing the full campaign
+ video when it launches next week.
+
+
In other news...
+
+ We broke a record for WorldCleanupDay. One of our users uploaded more than 7,500 photos to
+ OpenLitterMap. The user grouped the photos by litter type and uploaded them in batches. This way, we
+ were able to programatically apply 1,000s of tags in seconds!
+
+
+ OpenLitterMap.com v2.0 is nearly ready. This is a huge improvement on code that I wrote 3-4 years ago
+ and it will make adding new features much easier. We have a lot more features to add.
+
+
+ Next week, 4th of October is exactly 10 years since I first contacted a professor expressing my interest
+ in mapping litter while studying Geography in University. I will reply to the email with the campaign
+ when its online :-)
+
+
+ Check out this fantastic podcast of Joe Rogan interviewing Frank von Hippel, an ecotoxicologist about
+ chemical pollution.
+
+
+
+
+ 10 Years of Dedication! GoFundMe campaign launching next week, record-breaking 7,500 photos
+ uploaded on WorldCleanupDay, and v2.0 nearly ready with major code improvements.
+
Update #19 - GoFundMe & OpenLitterMap.com v2.0 now online
+
+
Today, we are launching a GoFundMe to try and bring OpenLitterMap to the next stage.
+
+
+
Here is a link to the GoFundMe Campaign.
+
This includes our first promotional video! Please share it with as many people as you can.
+
Included in the campaign is a new video showing how to use our App.
+
+ We also just released OpenLitterMap.com v2.0 This is a huge improvement on the code I wrote 3-4 years
+ ago. There is a new landing page All data on the global map now loads instantly. Wow! A few things are
+ currently not working, like leaderboards, downloads and live updates, but hopefully I will get to fix
+ them over the weekend (If I am not too busy sending out 1000s of emails). Adding new features is going
+ to be a LOT easier. We are much closer to going open source! We have many more special annoucements and
+ GOOD NEWS coming soon!
+
+
+ Reminder that every Thursday, 6pm Irish time, we run a community zoom call for an hour. We need your
+ help, and we would love to hear your opinion about the future of this platform (Your platform).
+
+
If you would like to help, we would love to have you on our Slack channel!
+
+
+
+ v2.0 Launched & GoFundMe Live! Complete platform rewrite with instant global map loading,
+ new landing page, and first promotional video - much closer to going open source!
+
As promised, the updates for OpenLitterMap continue. This week we have introduced:
+
+
+
+ A New Cryptocurrency "Littercoin" - a digital tradeable asset on the Ethereum blockchain. See below.
+
+
+ A New Category "Pathways" - you can now map Gutters, Drains, Kerb-holes and other pathways where Litter
+ typically begins its journey to the ocean.
+
+
+ Data is now organised by State or County. Eg what was USA - San Francisco is now USA - California - SF.
+ You can download data at state/county level now too!
+
+
Other 25 new items have been introduced including plastic bags, straws, crack pipes and more!!
+
+ On openlittermap.com/profile where you tag litter to images, the categorisation tool now appears first
+ and your statistics are at the bottom. This makes working on mobile significantly easier.
+
+
+
+
+ All data from OpenLitterMap.com is free to view by anyone and download by any logged-in user. Want to
+ download all the data for a country, state or city? 1-click and it's yours- Ready for import by anyone into
+ R, GIS, Excel or your favorite problem-solving development environment.
+
+
+
+ Second milestone! We now have over 430 verified images in our database and over 1,500
+ verified litter items. All of this data is free to view or download by anyone.
+
+
+
What is Littercoin?
+
+
+ Littercoin (LTRX) is a new digital asset on the Ethereum blockchain (a "Cryptocurrency" like Bitcoin or
+ Ether) that you can now be paid in for mapping-litter. If you configure your Ethereum wallet on
+ openlittermap.com/settings/littercoin and you upload at least 1 image 7-days in a row, you will get paid
+ 1.0000 Littercoin for your effort which you can use to pay anyone anywhere that will accept Littercoin as a
+ payment or mode of discount. Would you like to accept Littercoin? If so please get in touch and learn how
+ you can support this ecosystem.
+
+
+
What can Littercoin do?
+
+
+ Right now, not a whole lot. However in the near future, Littercoin will give you voting rights to determine
+ the future of OpenLitterMap via the OpenLitterMapDAO, our own decentralized autonomous organisation which
+ you can look forward to, so go ahead and start generating LTRX!
+
+
+
Support OpenLitterMap
+
+
+ Do you want to contribute to the development of OpenLitterMap? By making a €9, €20 or €30 monthly
+ subscription I can afford to significanly increase your upload allowance and you can finance the development
+ of this working, fun, open and accessible Citizen Science platform to mitigate against the increasing and
+ multi-faceted threats of plastic-pollution.
+
+
+
+ If you cannot afford a ~30-cent, 66-cent or 1-euro a day subscription to finance the development of
+ OpenLitterMap and help cover the costs of running a website and processing large volumes of image data on
+ the cloud, you may upload at least 1 image every day for free. This allowance will increase to 2-images a
+ day when you reach Level-5 and 3-images a day when you reach Level-10. If you would like access to 3-images
+ a day soon, you could sign up for 1-month to significantly increase your upload allowance, generate the
+ necessary XP and cancel the subscription in 1-click @ openlittermap.com/settings/payments once you are
+ logged-in.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
Make sure each litter item is clearly identifiable. You are the one who has to process them later!
+
+ If you do not process your image(s) successfully, they will be sent back to you, so in your own
+ best-interests please try and get it right the first time.
+
+
You can add as many images as into 1 photo as you want.
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/Location/map
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and now
+ Coastal and Pathway too!)..
+
+
+ All data is free to download per Country, State or sub-state (eg. City). You may begin problem-solving
+ and raising awareness!
+
+
Remember to enable your geotagging or OpenLitterMap will not accept your images.
Yesterday, we released the OpenLitterMap source code under the GPL-v3.0 license.
+
+
+
+ Here is a link to our GitHub repository https://github.com/OpenLitterMap/openlittermap-web Anyone can
+ now inspect and contribute to the OpenLitterMap code, or use it for their own projects in line with the
+ terms of the GPL-v3.0 license.
+
+
+ We are actively looking for contributors. OpenLitterMap-web is built with Laravel (PHP), Vue.js and
+ Bulma.io. In 2018 I published a paper explaining the full software stack
+ https://opengeospatialdata.springeropen.com/articles/10.1186/s40965-018-0050-y
+
+
+ If you would like to help shape the future direction of OpenLitterMap, we would love to have you on our
+ Slack channel!
+
+
+ This is not just for developers! We are looking for people with ideas, experience and enthusiasm about
+ citizen science, graphic design, UI/UX, science, GIS, science communication, marketing, blogging, grant
+ writing, networking, local government, social media, capacity building, and a lot more.
+
+
+ Reminder that every Thursday, 6pm Irish time, we run a community zoom call for an hour. On the next
+ call, we will show participants how to set up your local development environment and how to start
+ contributing to OpenLitterMap. These free coding tutorials will likely continue for a while. We might to
+ find time for a second community call!
+
+
+ Moving forward, we will split into several working groups. (Software, Community, Research and Management
+ Committee). If you would like to be a part of any of them, we would love to see you on Slack! Right now
+ anyone can join but in the future, I hope that everything will be voted on by our community. That's you!
+
+
Stay tuned for lots more exiting updates as we democratise science on pollution.
+
+
+
+ We're Open Source! Code released under GPL-v3.0 on GitHub, actively seeking contributors
+ for software, community, research, and management. Join us in democratising science on pollution!
+
Update #21 - Say Hello to Teams & Open Source Mobile App
+
+
We are back with another exciting update!
+
+
+ Today, we released the source code for our Mobile App (iOS and Android) under the GPL-v3.0 license. A small
+ gift from us to the planet.
+
+
+
+
+ Here is a link to the mobile app GitHub repository where the code lives:
+ https://github.com/OpenLitterMap/react-native Anyone can now view, inspect and contribute to the
+ OpenLitterMap Web + Mobile app code, or use our code for their own open source projects.
+
+
+ We also released a new feature called OpenLitterMap Teams. You can now create or join a team and log
+ your impact as a group!
+
+
+ You can join any number of teams, but you can only have 1 active team. When you upload, you make a
+ contribution to your active team. Keep the Global Map open to see a live update of what teams are
+ contributing!
+
+
+ The Teams feature was used by our first corporate sponsor! Engine Lease Finance is an aircraft engine
+ leasing company Headquartered in Ireland who gave their global workforce a half-day to pick up litter
+ and record their positive environmental impact with their families. Huge win!
+
+
+ We made a presentation a high level Geneva Forum citizen science conference at the United Nations You
+ can watch it here.
+
+
+ Since we released the source code for our web-app last update, we have had several people fix bugs and
+ add new features. These include:
+
+
Smooth zooming on the global map
+
Click on global map cluster to zoom in
+
Progress on the tool that will help us develop the OpenLitterAI
+
Missing items in the download
+
Fixed missing email verification notification for new users
+
and more coding stuff!
+
+
+
+ We have started using a new feature on github called Discussions. We would love if you could sign up and
+ chat with us about the future of OpenLitterMap.
+
+
+ As a reminder, we have an active Slack channel where we discuss the future of OpenLitterMap. We would
+ love if you could join us? Click here to join the chat.
+
+
+ Stay tuned for lots more exiting updates as we empower more people with the tools to share data on
+ pollution.
+
+
P.S. Our GoFundMe is stuck at 1%. We would really appreciate it if you could share it?
+
+
+
+ Mobile App Goes Open Source & Teams Launch! React Native app released under GPL-v3.0, first
+ corporate sponsor (Engine Lease Finance), and presentation at UN Geneva Forum citizen science conference!
+
+
+
+ Looking forward to sharing more updates with you again soon.
Today, we released a new tool to add boxes to identify litter in images and we need your help.
+
+
+
+ At the moment, the tool not yet open to the public but if you would like to become a beta tester please
+ get in touch! You can see a video about how it works here.
+
+
+ This work is redeemable in Littercoin! If you can help us add 100 boxes, you will earn 1 Littercoin. Any
+ boxes will have to be verified by an Admin before your reward is generated.
+
+
+ We need to add boxes to images to teach the OpenLitterAi, a computer vision algorithm, where the litter
+ is in the image and what each type of litter looks like. This will hopefully automate tagging and it
+ might even remove the need to upload photos.
+
+
+ There is over 100,000 images to tag, and we have yet to pull images from the internet to increase our
+ database. So your help, input and advice here is very welcome and badly needed!
+
+
+ Once we pass beta testing this tool will become publicly available for everyone to help with and
+ contribute to. You can see the code for it here.
+
+
+ Our mobile app is now available in Arabic, Dutch, French, German, Spanish and Portuguese! Can you help
+ us translate into more languages? You can find the mobile app files here and the website files here.
+ OpenLitterMap.com the website is currently only available in English and Dutch. We would love help
+ getting this into more languages!
+
+
+ We have passed 120,000 uploads and we are now generating about 1,000 uploads per week! A new superuser
+ representing TeamLitterUSA is trying to get into 1st place but will the Dutch allow this to happen?
+
+
+ On community request, we released the APK for the mobile app to allow Android users to install the app
+ outside of the Google ecosystem.
+
+
+ I made a presentation to an online GIS discord group which was well received but unfortunately the
+ recording didn't work out!
+
+
+ Thanks for our first corporate sponsor last quarter, we hired our first developer, a girl from Serbia,
+ to work on the mobile app. The developer helped us introduce Swipe between images while tagging, persist
+ non-uploaded or captured images after closing the app, helped us introduce other alphabets like Arabic
+ and special characters to allow for Spanish and Portugese and more!
+
+
+ Back on web, we introduced a new user Dashboard that shows you how much litter you uploaded and gives
+ you cool stats about your contribution to OpenLitterMap. You can now download all your own data too, as
+ well as everyone elses <3
+
+
+ Thanks to open source community work, several bugs were fixed like missing tags added and allow guests
+ to download data for any country without having to sign up for an account.
+
+
+ And probably more?? There is definitely a lot more to come. We are barely scratching the surface here
+ but hopefully in the next update we might have 1.0 of the OpenLitterAi.
+
+
+ In the mean time, we need as much images uploaded as possible. We also need help tagging boxes to images
+ so if this is something you would like to help with please get in touch and I will give you access. All
+ you need is a laptop and some spare time.
+
+
+ As we transition into a post-covid world, hopefully we can start to organise more social-distance
+ friendly outdoor activities. Currently, not even a university campus has had their litter mapped yet. If
+ we organised people to work together in self-isolation, it would probably take about 15 minutes. Would
+ you like to organise an event? Chat with others interested in the future of OLM? If so, please join our
+ slack channel!
+
+
Click here to join the OpenLitterMap Slack - We want to hear from you!
+
+ Stay tuned for lots more exiting updates as we empower society with the critical environmental tools to
+ share data on pollution.
+
+
P.S. Our GoFundMe has reached 2%. We would really appreciate it if you could share it?
+
+
+
+ OpenLitterAI Training Tool Released! New bounding box tool for computer vision training,
+ 120,000+ uploads, first hired developer from Serbia, and mobile app now in 6 languages!
+
+
+
+ Looking forward to sharing more updates with you again soon.
Your personal open source litter
+ mapping developer, Seán @ OpenLitterMap
+
+ Did you notice our global map was really slow when you zoomed in and loaded too many points? This has
+ been fixed! We integrated webGL to change how the points are being rendered. Now even a mobile device
+ can load huge amounts of point data. See for yourself by zooming right in on the Global Map. What does
+ litter look like in your community? We need your help to find out!
+
+
+ OpenLitterMap is growing! We are now getting about 500 images uploaded per day. On Good Friday, over 30
+ people signed up and created an account to share data and in March nearly 300 people signed up!
+
+
This also means the costs are rising. We would really appreciate it if you could help our GoFundMe?
+
+ We also need more volunteers that can help us add boxes to images to train the OpenLitterAi. All you
+ need is some time and a keyboard!
+
+
+ Our Slack channel has never been more active! If you are ready to be a part of the OpenLitterMap
+ movement, Click here to join our chat and be a part of our open-source community. We especially want to
+ hear from new users. What was your first experience like? How could we do better? What would you like to
+ change or see improved?
+
+
+ We are currently in touch with 2 Universities who want to help with OLM research. This is so new and
+ unexplored that currently, not even 1 university campus in the world has had their litter mapped. Who
+ will be the first...?
+
+
Several bug fixes to the iOS app made recently and more on the way.
+
+ Seaspiracy was also released on Netflix. You should check it out, but citizen science is so new and
+ unexplored it doesn't even mention it yet even though it does a good job at highlighting some of our
+ environmental problems.
+
+
+
+
+ WebGL Performance Revolution! Global map now handles massive datasets smoothly on mobile,
+ 500 images uploaded daily, and 2 universities joining OLM research efforts.
+
+
+
+ Looking forward to sharing more updates with you again soon.
Your personal open source litter
+ mapping developer, Seán @ OpenLitterMap
+
Update #24 - OpenLitterMap awarded $50,000 by cryptocurrency Cardano
+
+
Wonderful news!
+
+
+
+ People holding the cryptocurrency Cardano voted, for the first time, to finance the development of
+ environmental monitoring. Over 285 million ada tokens representing $0.5 billion dollars voted for our
+ proposal to develop Littercoin on Cardano.
+
+
+ This money is being used to employ 2 software developers who have already started to help build our app
+ full-time over the next 3 months.
+
+
+ Littercoin is the first token rewarded for doing citizen science. We want to see you rewarded with
+ access to zero waste non-plastic goods for doing the work of contributing data to OpenLitterMap.
+
+
+ Huge improvements have been made to the global map. You can now filter all global point data by
+ category. LitterArt has been re-introduced. Go check it out and see for yourself! Do you know of any art
+ made from litter? Tag it with our app and it will appear in the Art category on the global map for
+ everyone to see!
+
+
+ Significant mobile app update (v2.4.0) which fixes many bugs. Mobile app version 3 is in development.
+
+
+ Big changes to our open source code including many bug fixes. Dozens of old files were removed and
+ existing ones were refactored to make onboarding new developers easier.
+
+
+ New languages added: Spanish & Polish added to openlittermap.com. Can you help us add more languages?
+ This can be done by anyone and requires no coding experience. If you would like to help, please send us
+ an email.
+
+
+ We have a new partnership with University College Dublin who are interested in doing research with our
+ data and community. The School of Education (psychology dept) are interested in doing a short survey
+ with our participants about the impacts of gamification on your use of the app. They are looking for 10
+ people to do a 45 minute interview. If you would like to help, €10 amazon gift cards are available as a
+ reward. More information including a link to participate can be found in the PDF attached.
+
+
+
+
+ $50,000 Cardano Grant Awarded! After 60+ rejections, 285 million ada tokens voted to fund
+ OpenLitterMap. Two full-time developers hired, global map filtering launched, and UCD research partnership
+ formed!
+
+
+
+ Looking forward to sharing more updates with you again soon.
Update #25 - Big Improvements since $50,000 funding from cryptocurrency Cardano
+
+
There are plenty of updates to share since our last email on the 4th of August 2021.
+
+
You can find most of them on our weekly blog but we will share the best bits here.
+
+
+
+ Global leaderboard for all users. Yes, finally! We now have a global leaderboard of all
+ 6,100+ and growing members. Check it out and find your position at openlittermap.com/leaderboard. By
+ default, new users are anonymous, so if you haven't already done so- visit settings and check your
+ privacy options to see if your name or username are set to appear on the leaderboards. In the web-app
+ settings, there are more options. You can choose to show a country flag and you can now include links to
+ your social media accounts to promote them.
+
+
+ Promote links to your social media accounts on OpenLitterMap. The more data you upload,
+ the more points you score, and the more visibility your accounts get. Social media accounts will now
+ appear in every popup on the global map and for every user in the global leaderboard. See this twitter
+ post for examples.
+
+
+ Weekly community calls. Every Thursday, 6pm GMT, we host a weekly live zoom call where
+ we code live, launch updates, and test new features with the community while planning for the future and
+ having fun. Want to help shape the future direction of OpenLitterMap? Join us.
+
+
+ Huge mobile app improvements. It took a long time but the app is finally starting to
+ work incredibly well! The photo gallery is now just totally smooth. You can now create a team and join a
+ team on the app. You can see the leaderboard for all teams listed so far. There are a lot more new
+ features and improvements left to add in, but the most recent update (v3.2.3) is really stable. Now that
+ the app has reached stability, we will begin to work on new gamification features soon! Read more about
+ recent app improvements here.
+
+
+ Huge global map improvements. Seriously, just look at how all of this global data just
+ loads instantly. Open the Global Map. All of the clusters are re-created every night at midnight. You
+ can also change the data by year, or all time. Keep the global map open to see live notifications. Click
+ a photo uploaded notification to zoom to that location and open the data! It's now possible to filter
+ the global map point data by user, minDate and maxDate in the URL. Clusters of just 1 photos now appear
+ on the global map. You can see how far North and South the openlittermap community has reached-
+ incredible! Also added new options to sort locations click here to open tweet.
+
+
+ Growing global community. It took a long time, but openlittermap is after getting
+ really stable lately, and now we are attracting a much more engaged community. Every day, new people are
+ joining our Slack channel and weekly community zoom calls. All data is going up. We are approaching
+ 500,000 tags and recently passed 250,000 images. I have given dozens of presentations across
+ universities + institutions, met with people from UNEP and even gave a presentation to my local Cork
+ City Council.
+
+
+ Sent a 12 page report about my work to various Irish government oireachtas committees.
+ You can read the report here. Worryingly, both the committees on Education, Research, Science, and
+ Innovation and "climate action and environment" had nothing to say. The committee on EU affairs did not
+ even reply about using citizen science as a means of building Peace Through Science in zones of conflict
+ (like Northern Ireland). In the last 15 years of this research there has been a total of €0 in funding
+ to support the development of OpenLitterMap in Ireland.
+
+
+ Expect more updates soon! OpenLitterMap is staring to work well and its growing, but
+ there is a lot more that needs to be done. We hope you will join us by mapping and sharing data on
+ litter and plastic pollution in your community.
+
+
+
+
+ Platform Maturity Achieved! Global leaderboard, social media integration, smooth mobile app
+ (v3.2.3), 250,000+ images, 500,000 tags approaching, and presentations to UNEP and Cork City Council.
+ Community growing daily!
+
+
+
+ Looking forward to sharing more updates with you again soon.
Update #25 - Big Improvements since $50,000 funding from cryptocurrency Cardano
+
+
There are plenty of updates to share since our last email on the 4th of August 2021.
+
+
You can find most of them on our weekly blog but we will share the best bits here.
+
+
+
+ Global leaderboard for all users. Yes, finally! We now have a global leaderboard of all
+ 6,100+ and growing members. Check it out and find your position at openlittermap.com/leaderboard. By
+ default, new users are anonymous, so if you haven't already done so- visit settings and check your
+ privacy options to see if your name or username are set to appear on the leaderboards. In the web-app
+ settings, there are more options. You can choose to show a country flag and you can now include links to
+ your social media accounts to promote them.
+
+
+ Promote links to your social media accounts on OpenLitterMap. The more data you upload,
+ the more points you score, and the more visibility your accounts get. Social media accounts will now
+ appear in every popup on the global map and for every user in the global leaderboard. See this twitter
+ post for examples.
+
+
+ Weekly community calls. Every Thursday, 6pm GMT, we host a weekly live zoom call where
+ we code live, launch updates, and test new features with the community while planning for the future and
+ having fun. Want to help shape the future direction of OpenLitterMap? Join us.
+
+
+ Huge mobile app improvements. It took a long time but the app is finally starting to
+ work incredibly well! The photo gallery is now just totally smooth. You can now create a team and join a
+ team on the app. You can see the leaderboard for all teams listed so far. There are a lot more new
+ features and improvements left to add in, but the most recent update (v3.2.3) is really stable. Now that
+ the app has reached stability, we will begin to work on new gamification features soon! Read more about
+ recent app improvements here.
+
+
+ Huge global map improvements. Seriously, just look at how all of this global data just
+ loads instantly. Open the Global Map. All of the clusters are re-created every night at midnight. You
+ can also change the data by year, or all time. Keep the global map open to see live notifications. Click
+ a photo uploaded notification to zoom to that location and open the data! It's now possible to filter
+ the global map point data by user, minDate and maxDate in the URL. Clusters of just 1 photos now appear
+ on the global map. You can see how far North and South the openlittermap community has reached-
+ incredible! Also added new options to sort locations click here to open tweet.
+
+
+ Growing global community. It took a long time, but openlittermap is after getting
+ really stable lately, and now we are attracting a much more engaged community. Every day, new people are
+ joining our Slack channel and weekly community zoom calls. All data is going up. We are approaching
+ 500,000 tags and recently passed 250,000 images. I have given dozens of presentations across
+ universities + institutions, met with people from UNEP and even gave a presentation to my local Cork
+ City Council.
+
+
+ Sent a 12 page report about my work to various Irish government oireachtas committees.
+ You can read the report here. Worryingly, both the committees on Education, Research, Science, and
+ Innovation and "climate action and environment" had nothing to say. The committee on EU affairs did not
+ even reply about using citizen science as a means of building Peace Through Science in zones of conflict
+ (like Northern Ireland). In the last 15 years of this research there has been a total of €0 in funding
+ to support the development of OpenLitterMap in Ireland.
+
+
+ Expect more updates soon! OpenLitterMap is staring to work well and its growing, but
+ there is a lot more that needs to be done. We hope you will join us by mapping and sharing data on
+ litter and plastic pollution in your community.
+
+
+
+
+ Platform Maturity Achieved! Global leaderboard, social media integration, smooth mobile app
+ (v3.2.3), 250,000+ images, 500,000 tags approaching, and presentations to UNEP and Cork City Council.
+ Community growing daily!
+
+
+
+ Looking forward to sharing more updates with you again soon.
+ I hope you are off to a good start with #PlasticFreeJuly. All around the world people are choosing to refuse
+ plastic products because of the impact plastic is having on our only habitable planet. We urgently need to
+ reduce our plastic footprint and you can help educate people by opening up data on litter, which
+ openlittermap facilitates by design. Here are some updates since the last email...
+
+
+
+
+ The Top-10 litter mappers (who have either their name or username as public) now appear right at the top
+ of openlittermap.com/maps! Can you compete for a spot? This is a great way to advertise a business or
+ your portfolio. You could even put it on your CV! By default when you upload to OpenLitterMap you are
+ made anonymous but you can change this by logging in and visiting openlittermap.com/settings/privacy.
+
+
+ Over 20 new items have been added in including 7 in soft-drinks including Paper cups, Juice Cartons,
+ Juice Bottles, Juice Packets, Ice Tea Bottles, Ice Tea Cans and Energy Cans.
+
+
+ You can now map 7 new items in Food-related waste including Styfoam plates, Napkins, Sauce packets,
+ Glass Jars, Glass jar lids and large and small crisp (or as they say in the US 'chip') packets...
+
+
+ and 3 new items in Smoking-related waste including filters, filter boxes and plastic cigarette box
+ packaging (Cellophane) and 3 new items in the 'Other' category including Ear-plugs for music, Hair ties
+ and washing up bottles!
+
+
That brings the total number of items you can map, view and download up to 120!
+
+
+
+ All data from OpenLitterMap.com is free to view by anyone and download by any logged-in user. Want to
+ download all the data for a country, state or city? 1-click and it's yours- Ready for import by anyone into
+ R, GIS, Excel or your favorite problem-solving development environment. Perhaps the greatest strength of
+ openlittermap is just how easily accessible it is to download lots of data but it is up to you to create the
+ data for researchers and authorities to use.
+
+
+
+ Another milestone! We have reached 1,000 verified images in our database and over 3,500
+ verified litter items! All of this data is free to view or download by anyone and is 100% verified and
+ legitimate. OpenLitterMap is the only litter-mapping provider that verifies each and every image!
+
+
+
I need your help.
+
+
+ OpenLitterMap is the world's most comprehensive litter-mapping platform. No other litter-mapping providers
+ map and analyse litter geospatially, quantitatively and categorically and make all the data Free, Open and
+ Very Easy to download by Country, State and City. This is a huge strength of OpenLitterMap. Researchers
+ don't need to go trawling through 3rd party API's to try and get their hands on the data, it just works. As
+ a geospatial analyst by training I understand that this is the data we need stop plastic going into the
+ ocean.
+
+
+
What can you do?
+
+
+ Quite a lot. You can collect and submit data. On a free account you can submit one image a day from levels
+ 0-4, two images a day from levels 5-9 and 3 images a day from level 10. But if you want to significantly
+ increase your upload allowance, I need help covering the costs of storing and processing your data and
+ everyone elses data on the web. If you like where this website is going, for as little as 30 cents a day or
+ for a maximum of a euro / a dollar (and 10 cents) a day, you can finance the development of OpenLitterMap.
+ Governments are not interested in exposing the pollution caused by the products of private businesses. It
+ wouldn't even occur to them. Therefore, litter mapping and crowdfunding is entirely up to us. I have already
+ put 2 Masters into this, which has cost me an arm and a leg. I hope you like where this project is going and
+ want to see it improve and continue. By subscribing for €9, €20 or €30 a month, you can help me build this
+ platform and we can find new ways to stop plastic going into the ocean.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
Make sure each litter item is clearly identifiable. You are the one who has to process them later!
+
+ If you do not process your image(s) successfully, they will be sent back to you, so in your own
+ best-interests please try and get it right the first time.
+
+
You can add as many images as into 1 photo as you want.
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/Location/map
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and now
+ Coastal and Pathway too!)..
+
+
+ All data is free to download per Country, State or sub-state (eg. City). You may begin problem-solving
+ and raising awareness!
+
+
Remember to enable your geotagging or OpenLitterMap will not accept your images.
+ A new €5 a month plan to upload 5-images a day. All litter data you create at
+ OpenLitterMap.com is available for anyone to download for free.
+
+
+ You can now link your Instagram account to your OpenLitterMap username if you can make the Top 10 Global
+ OpenLitterMap Leaderboard.
+
+
+ If you can make the Top 10 Global OpenLitterMap Leaderboard you can now upload 10 images a day for free.
+ These restrictions will continue to improve over time.
+
+
+ OpenLitterMap has been shortlisted for a European Youth Award. Results expected on Tuesday the 10th of
+ October.
+
+
+ Pie Charts @ openlittermap.com/maps (litter) are now optimized for mobile. Time-series & list of
+ locations will continue to populate themselves dynamically and will OpenLitterMap will accept historical
+ (geotagged) data.
+
+
Removed some cluttering text and improved the style and useability a bit.
+
+ I have a TED talk and a scientific publication due this week! Looking forward to sharing these with you
+ soon.
+
+
+
+
+ All data from OpenLitterMap.com is free to view by anyone and download by anyone. You can upload 1 image a
+ day for free, an allowance that increases as you play the game. To significantly increase your upload
+ capacity and make lots of data available on the web, please help finance OpenLitterMap with €5, €9, €20 or
+ €30 a month and watch the improvements unfold :-)
+
+
+
+ Another milestone! We are approaching almost 10,000 Verified litter-items from almost 2,000
+ Verified litter photos. I have manually verified all of the contents in each image to bring 100% of the data
+ to Stage 2 Level of Verification.
+
+
+
I need your help.
+
+
+ All Data @ openlittermap.com is Free and Open for anyone to
+ download.
+
+
+
What can you do?
+
+
+ Please support with €5, €9, €20 or €30 a month to significantly increase your upload capacity and finance
+ the development of OpenLitterMap.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
Make sure each litter item is clearly identifiable. You are the one who has to process them later!
+
+ If you do not process your image(s) successfully, they will be sent back to you, so in your own
+ best-interests please try and get it right the first time.
+
+
+ You can add as many images as into 1 photo as you want. Currently 100s which will increase to 1000s and
+ 10,000s on request.
+
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/City/map
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and
+ Coastal, Pathway and Art now too!)..
+
+
+ All data is free to download per Country, State or sub-state (eg. City). You may begin problem-solving
+ and raising awareness!
+
+
+ Remember to enable your geotagging or OpenLitterMap will not accept your images. Instructions are sent
+ out with an email post Aug-17.
+
+ Anyone can upload 1,000 images a day until further notice. Wow!
+
+
I did a Ted Talk! and I submitted a scientific software article for peer review to Open Geospatial Data, Software and
+ Standards.
+
+
Significant pr
+
Significant progress on native mobile apps which will launch in 2018.
+
We have achieved our first successful machine learning identification. This is huge.
+
fixed the Total Litter count number formatting and a few other improvements.
+
+
+ Several new countries have been dynamically added to the database by new members. Check them out at
+ openlittermap.com/maps
+
+
+ The OpenLitterMap kickstarter failed. We managed to raise just €80 from th The OpenLitterMap kickstarter failed. We managed to raise just €80 from the €20,000 sought. Because very
+ few people are interested in financing OpenLitterMap with €5-10/$ a month, several new sources of
+ funding are being investigated which is taking a lot of time and preperation.the team. Do you know a developer or graphic designer or someone
+ with marketing who wants to help?
+
+
The upload from iOS 11.1 wasn't working but in iOS 11.2 it was fixed. Thanks Apple!
+
+
+
+ Looking forward to 2018! Expect mobile apps and machine learning coming soon
+
+
+
+ All Data @ openlittermap.com is Free and Open for anyone to
+ download.
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Like and share on social media, retweet.
+
+
Please support with €5, €10, €20 or €30 a month to finance the development of OpenLitterMap.
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ Make sure each litter item is clearly identifiable. You are the one who has to process them later! This
+ will get easier with machine learning soon ;-)
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/City/map or change /map to /options to filter by time and change
+ the size of the hex. This is a free tool at your disposal to educate people about plastic pollution.
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and
+ Coastal, Pathway and Art now too!)..
+
+
All data is free to download per Country, State or sub-state (eg. City).
+
+ Remember to enable your geotagging or OpenLitterMap will not accept your images. Instructions are sent
+ out with an email post Aug-17.
+
+ Added a new Brands category. Now you can map and produce open data on over 20 of our
+ favourite brands.
+ Link to twitter announcement.
+
+
+ Anyone who was the first to upload from a Country, State or City can now claim compensation in
+ Littercoin for each location you created. There are no limits as to how many locations you can create.
+ If you have an outstanding balance you can see it when you log in at /profile.
+
+
+ New options to mine Littercoin! Before the only option was upload 7 days in a row. Now you can earn 1
+ Littercoin for every 100 images you submit correctly, in a row. Simply add your Ethereum wallet at
+ openlittermap.com/settings/littercoin and wait for payment!
+
+
+ I have launched the
+ Global OpenLitterMapping MARATHON. Starting this Saturday and repeating every Saturday, from 2-4pm, anywhere in the world. Would you
+ like to organize an event in your location? How much open data on litter can we collect in 2 hours?
+
+
A prominent Blockchain advisor has joined the team! More on this later!
+
+ The Presence button now works. You can determine if litter is still there, or has been taken away. By
+ default OpenLitterMap assumes that litter is still there but if you pick up as you go you can change
+ this default value in
+ openlittermap.com/settings/presence.
+
+
+ Styling improvements- Changed the size of the popup bar to be mobile friendly, fixed the navbar on maps,
+ improved text on signup page, moved the progress bar to the bottom of /profile and some other bits and
+ pieces.
+
+
+ Several new countries including Myanmar, Pakistan and New Zealand have been dynamically added to the
+ database by new and old members. Check them out at
+ openlittermap.com/maps. To "create" a new location, simply
+ be the first to upload from there and OpenLitterMap will configure itself dynamically. You can earn 100
+ Littercoin for each Country, 50 Littercoin for each "State" and 25 Littercoin for each "City".
+
+
+ All images are now hosted on AWS S3. All images pre Jan 2018 were deleted to reduce costs. If you like
+ this platform and want to see more and improved updates, please support it with €5 a month! There is a
+ lot of work to be done!
+
+
+ In case you missed the last update, after some credit from Amazons Activate Startup Program, all
+ accounts can currently upload 1,000 images a day for free. Amazing what we can achieve with some simple
+ credits! Imagine what we could achieve if a few people thought this was worth €5 a month?
+
+
+
+
+ Looking forward to 2018! Expect mobile apps and machine learning coming soon :-)
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We do not sell data, we want anyone to be able to access our data to solve these problems!
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any Saturday, 2-4pm!
+
+
Like, Share and Retweet!
+
+
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ Make sure each litter item is clearly identifiable. You are the one who has to process them later! This
+ will get easier with machine learning soon ;-)
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/City/map or change /map to /options to filter by time and change
+ the size of the hex. This is a free tool at your disposal to educate people about plastic pollution.
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and
+ Coastal, Pathway and Art now too!)..
+
+
All data is free to download per Country, State or sub-state (eg. City).
+
+ Remember to enable your geotagging or OpenLitterMap will not accept your images. Instructions are sent
+ out with an email post Aug-17.
+
+ After several years of research and self-taught software development, on the 15th of April 2017, I
+ finally launched OpenLitterMap.com as a web-app. Mobile apps are in development and coming along nicely.
+ Please note that I am just a self taught developer doing and paying for all of this independently. If
+ you like my work, please consider supporting me?
+
+
+ I recently went through Phase 1 of New Frontiers, an entrepreneur development programe in my native
+ Cork. This has given me many new ideas about the future of OpenLitterMap.
+
+
+ Today almost 1,200 people have signed up. This is currently growing at about 3-5 new users per day. To
+ speed things up even more, we are starting a major Recruitment Drive. Would you like to
+ chat with us on
+ Slack? - slack is a messaging app for teams to communicate.
+
+
+ Several people have joined the new
+ Ambassador Programme
+ to promote OpenLitterMap in their local community. Would you like to join us? Get in touch!
+
+
+ So far we have crowdsourced over 10,000 photos of litter, which represents over 30,000 pieces of litter.
+ All of this data has been manually verified, and is available for anyone to download for free, as
+ open data. This means that anyone can download all of the data and use it for any purpose. Instead
+ of making research expensive and prohibitive, we make it free. You don't need permission, or even an
+ account!
+ eg =
+ OpenLitterMap.com/maps/Ireland/download
+
+
+ In this time I did a TEDx Talk, wrote my first
+ peer-reviewed software publication which will be coming out soon, and launched
+ Littercoin, the first blockchain reward for the production of geospatial data.
+
+
+
+
+ 1 Year Anniversary! Over 10,000 photos, 30,000+ pieces of litter mapped, 1,200 users, and
+ growing every day. All data is free and open for anyone to use!
+
+
+
Year One Retrospective: Updates Since Launch
+
+
+ To celebrate the 1 year anniversary, here is a list of the improvements and bug fixes since the launch.
+ OpenLitterMap is still in development and needs your support.
+
+
+
Update #1 - 11th May 2017
+
+
A new Coastal category for marine-litter
+
On the maps, users now have the option to be credited for each image they upload
+
You can now view data from areas that have only 1 verified litter point
+
+
+
Update #2 - Say Hello to Littercoin - 27th May 2017
+
+
A New Cryptocurrency "Littercoin" - a digital tradeable asset on the Ethereum blockchain
+
+ A New Category "Pathways" - you can now map the location of Gutters, Drains, Kerb-holes and other
+ pathways where Litter may begin its journey to the ocean
+
+
+ Data is now organised by State. Previously it was just Country and City. You can download data by State
+ too!
+
+
Other 25 new items have been introduced including plastic bags, straws and more!
+
+ On openlittermap.com/profile where you tag litter to images, the categorisation tool now appears first
+ and your statistics are at the bottom. This makes working on mobile significantly easier
+
+
+
+
Update #3 - 5th July 2017 - Plastic Free July
+
+
+ The Top-10 litter mappers (who have either their name or username as public) now appear right at the top
+ of openlittermap.com/maps! Can you compete for a spot?
+
+
+ Over 20 new items have been added in including 7 in soft-drinks including Paper cups, Juice Cartons,
+ Juice Bottles, Juice Packets, Ice Tea Bottles, Ice Tea Cans and Energy Cans
+
+
+ You can now map 7 new items in Food-related waste including Styfoam plates, Napkins, Sauce packets,
+ Glass Jars, Glass jar lids and large and small crisp (or as they say in the US 'chip') packets
+
+
+ There are 3 new items in Smoking-related waste including filters, filter boxes and plastic cigarette box
+ packaging (Cellophane) and 3 new items in the 'Other' category including Ear-plugs for music, Hair ties
+ and washing up bottles!
+
+
+
+
Update #4 - 8th October 2017
+
+
A New Art Category to map #LitterArt anywhere
+
Forgot Password issue finally fixed
+
A new €5 a month plan. Support OpenLitterMap for just 10 cents a day!
+
+ You can now link your Instagram account to your OpenLitterMap username if you can make the Top 10 Global
+ OpenLitterMap Leaderboard
+
+
+ OpenLitterMap has been shortlisted for a European Youth Award. Note- Unfortunately we weren't
+ successful!
+
+
+ Pie Charts @ openlittermap.com/maps (litter) are now optimized for mobile. Time-series & list of
+ locations will continue to populate themselves dynamically and will OpenLitterMap will accept historical
+ (geotagged) data
+
+
+
+
Update #5 - 14th Jan 2018
+
+
+ I got a $1000 grant from Amazon Web Services! For the time being, anyone can upload 1,000 images a day
+ until further notice. Wow!
+
+
Ted talk online
+
+ Tidied the site up a bit- Removed trailing average numbers, fixed the Total Litter count number
+ formatting and a few other improvements
+
+
+ The OpenLitterMap kickstarter failed. We managed to raise just €80 from the €20,000 sought. Because very
+ few people are interested in financing OpenLitterMap with €5-10/$ a month, several new sources of
+ funding are being investigated which is taking up a lot of time and preperation
+
+
The upload from iOS 11.1 wasn't working but in iOS 11.2 it was fixed
+
+
+
Update #6 - 15th Feb 2018
+
+
+ Added a new Brands category. Now you can map and produce open data on over 20 of our favourite corporate
+ brands
+
+
+ Anyone who was the first to upload from a Country, State or City can now claim compensation in
+ Littercoin for each location you created. There are no limits as to how many locations you can create.
+ If you have an outstanding balance you can see it when you log in at /profile
+
+
+ New options to mine Littercoin! Before the only option was upload 7 days in a row. Now you can earn 1
+ Littercoin for every 100 images you submit correctly, in a row. Simply add your Ethereum wallet at
+ openlittermap.com/settings/littercoin and wait for payment!
+
+
+ Launch of the the Global OpenLitterMapping MARATHON. Starting this Saturday and repeating every
+ Saturday, from 2-4pm, anywhere in the world. Would you like to organize an event in your location? How
+ much open data on litter can we collect in 2 hours?
+
+
+ Styling improvements- Changed the size of the popup bar to be mobile friendly, fixed the navbar on maps,
+ improved text on signup page, moved the progress bar to the bottom of /profile and some other bits and
+ pieces
+
+
+ All images are now hosted on AWS S3. All images pre Jan 2018 were accidentally deleted during the switch
+
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We do not sell data, we want anyone to be able to access our data to solve these problems!
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any Saturday, 2-4pm!
+
+
Like, Share and Retweet!
+
+
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ Make sure each litter item is clearly identifiable. You are the one who has to process them later! This
+ will get easier with machine learning soon ;-)
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/City/map or change /map to /options to filter by time and change
+ the size of the hex. This is a free tool at your disposal to educate people about plastic pollution.
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and
+ Coastal, Pathway and Art now too!)..
+
+
All data is free to download per Country, State or sub-state (eg. City).
+
+ Remember to enable your geotagging or OpenLitterMap will not accept your images. Instructions are sent
+ out with an email post Aug-17.
+
+ First Peer-Reviewed Publication! The OpenLitterMap scientific paper is now published in
+ Open Geospatial Data, Software, and Standards - a major milestone for the project!
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We want anyone to be able to access our data to solve problems.
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any Saturday, 2-4pm!
+
+
Like, Share and Retweet!
+
+
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are som Make sure each litter item is clearly identifiable. You are the one who has to process them later! This
+ will get easier with machine learning soon ;-)This
+ will get easier with machine learning soon ;-)
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ The maps are a free educational tool to use. You can use them for free at
+ openlittermap.com/maps/Country/State/City/map or change /map to /options to filter by time and change
+ the size of the hex. This is a free tool at your disposal to educate people about plastic pollution.
+
+
+ You can toggle between different categories of related waste eg Smoking, Coffee, Softdrinks (and
+ Coastal, Pathway and Art now too!)..
+
+
All data is free to download per Country, State or sub-state (eg. City).
+
+ Remember to enable your geotagging or OpenLitterMap will not accept your images. Instructions are sent
+ out with an email post Aug-17.
+
+ Temporarily removed the Pathways category (gutters, storm drains, sewers in the street where litter
+ begins its journey to the ocean) due to too much confusion. Might add it in again later with improved
+ documentation if people need it. The local council should have this data but just in case they don't
+ want to give it away we can crowdsource it ourselves and put it on OpenStreetMap.
+
+
+ Improved the Admin verification tool. More admins needed soon when data increases! We also need more
+ data!!
+
+
Native mobile apps are on the way!!
+
+ I have been rejected by several grant holders. Unfortunately, not many people think open data on plastic
+ pollution is important. Do you think this is worth supporting with the price of 1-2 cups of coffee per
+ month?
+
+
+
+
+ Approaching 50,000 data points! Global map now loads in under 3 seconds (down from 20+),
+ and our Springer blog post became their most read article in just 2 weeks!
+
+
+
+ All Data @ openlittermap.com is Verified, Free and Open for anyone
+ to download. We want anyone to be able to access our data to solve problems.
+
+
+
What can you do?
+
+
Upload and process a few images a day.
+
+
Organize a Litter Mapping Marathon, any time, any-where! Maybe this Saturday, 2-4pm?
+ Please support the development of OpenLitterMap with €5+ a month, sit back and watch these developments
+ unfold.
+
+
+
Finally, here are some tips for using OpenLitterMap
+
+
+
+ You can map an entire beach or street clean in 1 photo if you want, but it depends what kind of story
+ you want to tell.
+
+
+ If you can't count what's in the photo, you can use Large/Random Dump in the Other category and rank it
+ from 1-100.
+
+
+ You are not just mapping litter, you are creating open data. Feel the Knowledge!! You can download your
+ data too. Anyone can!
+
+
+ Please don't include children in the photos, but feel welcome to take a picture of your dog and join our
+ community of Trash Dog owners! Feature your cute pup on the
+ global map under the trash dog category!
+
-
-
-
-
-
diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php
deleted file mode 100644
index e5506df29..000000000
--- a/resources/lang/en/auth.php
+++ /dev/null
@@ -1,19 +0,0 @@
- 'These credentials do not match our records.',
- 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
-
-];
diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php
deleted file mode 100644
index d48141187..000000000
--- a/resources/lang/en/pagination.php
+++ /dev/null
@@ -1,19 +0,0 @@
- '« Previous',
- 'next' => 'Next »',
-
-];
diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php
deleted file mode 100644
index 2345a56b5..000000000
--- a/resources/lang/en/passwords.php
+++ /dev/null
@@ -1,22 +0,0 @@
- 'Your password has been reset!',
- 'sent' => 'We have emailed your password reset link!',
- 'throttled' => 'Please wait before retrying.',
- 'token' => 'This password reset token is invalid.',
- 'user' => "We can't find a user with that email address.",
-
-];
diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php
deleted file mode 100644
index 391484b3d..000000000
--- a/resources/lang/en/validation.php
+++ /dev/null
@@ -1,159 +0,0 @@
- 'The :attribute must be accepted.',
- 'active_url' => 'The :attribute is not a valid URL.',
- 'after' => 'The :attribute must be a date after :date.',
- 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
- 'alpha' => 'The :attribute may only contain letters.',
- 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.',
- 'alpha_num' => 'The :attribute may only contain letters and numbers.',
- 'array' => 'The :attribute must be an array.',
- 'before' => 'The :attribute must be a date before :date.',
- 'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
- 'between' => [
- 'numeric' => 'The :attribute must be between :min and :max.',
- 'file' => 'The :attribute must be between :min and :max kilobytes.',
- 'string' => 'The :attribute must be between :min and :max characters.',
- 'array' => 'The :attribute must have between :min and :max items.',
- ],
- 'boolean' => 'The :attribute field must be true or false.',
- 'confirmed' => 'The :attribute confirmation does not match.',
- 'date' => 'The :attribute is not a valid date.',
- 'date_equals' => 'The :attribute must be a date equal to :date.',
- 'date_format' => 'The :attribute does not match the format :format.',
- 'different' => 'The :attribute and :other must be different.',
- 'digits' => 'The :attribute must be :digits digits.',
- 'digits_between' => 'The :attribute must be between :min and :max digits.',
- 'dimensions' => 'The :attribute has invalid image dimensions.',
- 'distinct' => 'The :attribute field has a duplicate value.',
- 'email' => 'The :attribute must be a valid email address.',
- 'ends_with' => 'The :attribute must end with one of the following: :values.',
- 'exists' => 'The selected :attribute is invalid.',
- 'file' => 'The :attribute must be a file.',
- 'filled' => 'The :attribute field must have a value.',
- 'gt' => [
- 'numeric' => 'The :attribute must be greater than :value.',
- 'file' => 'The :attribute must be greater than :value kilobytes.',
- 'string' => 'The :attribute must be greater than :value characters.',
- 'array' => 'The :attribute must have more than :value items.',
- ],
- 'gte' => [
- 'numeric' => 'The :attribute must be greater than or equal :value.',
- 'file' => 'The :attribute must be greater than or equal :value kilobytes.',
- 'string' => 'The :attribute must be greater than or equal :value characters.',
- 'array' => 'The :attribute must have :value items or more.',
- ],
- 'image' => 'The :attribute must be an image.',
- 'in' => 'The selected :attribute is invalid.',
- 'in_array' => 'The :attribute field does not exist in :other.',
- 'integer' => 'The :attribute must be an integer.',
- 'ip' => 'The :attribute must be a valid IP address.',
- 'ipv4' => 'The :attribute must be a valid IPv4 address.',
- 'ipv6' => 'The :attribute must be a valid IPv6 address.',
- 'json' => 'The :attribute must be a valid JSON string.',
- 'lt' => [
- 'numeric' => 'The :attribute must be less than :value.',
- 'file' => 'The :attribute must be less than :value kilobytes.',
- 'string' => 'The :attribute must be less than :value characters.',
- 'array' => 'The :attribute must have less than :value items.',
- ],
- 'lte' => [
- 'numeric' => 'The :attribute must be less than or equal :value.',
- 'file' => 'The :attribute must be less than or equal :value kilobytes.',
- 'string' => 'The :attribute must be less than or equal :value characters.',
- 'array' => 'The :attribute must not have more than :value items.',
- ],
- 'max' => [
- 'numeric' => 'The :attribute may not be greater than :max.',
- 'file' => 'The :attribute may not be greater than :max kilobytes.',
- 'string' => 'The :attribute may not be greater than :max characters.',
- 'array' => 'The :attribute may not have more than :max items.',
- ],
- 'mimes' => 'The :attribute must be a file of type: :values.',
- 'mimetypes' => 'The :attribute must be a file of type: :values.',
- 'min' => [
- 'numeric' => 'The :attribute must be at least :min.',
- 'file' => 'The :attribute must be at least :min kilobytes.',
- 'string' => 'The :attribute must be at least :min characters.',
- 'array' => 'The :attribute must have at least :min items.',
- ],
- 'not_in' => 'The selected :attribute is invalid.',
- 'not_regex' => 'The :attribute format is invalid.',
- 'numeric' => 'The :attribute must be a number.',
- 'password' => [
- 'default' => 'The password is incorrect.',
- 'min' => 'The :attribute must be at least :min characters.',
- 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.',
- 'numbers' => 'The :attribute must contain at least one number.',
- 'symbols' => 'The :attribute must contain at least one special character.',
- 'uncompromised' => 'The :attribute has appeared in a data breach. Please choose a different password.',
- ],
- 'present' => 'The :attribute field must be present.',
- 'regex' => 'The :attribute format is invalid.',
- 'required' => 'The :attribute field is required.',
- 'required_if' => 'The :attribute field is required when :other is :value.',
- 'required_unless' => 'The :attribute field is required unless :other is in :values.',
- 'required_with' => 'The :attribute field is required when :values is present.',
- 'required_with_all' => 'The :attribute field is required when :values are present.',
- 'required_without' => 'The :attribute field is required when :values is not present.',
- 'required_without_all' => 'The :attribute field is required when none of :values are present.',
- 'same' => 'The :attribute and :other must match.',
- 'size' => [
- 'numeric' => 'The :attribute must be :size.',
- 'file' => 'The :attribute must be :size kilobytes.',
- 'string' => 'The :attribute must be :size characters.',
- 'array' => 'The :attribute must contain :size items.',
- ],
- 'starts_with' => 'The :attribute must start with one of the following: :values.',
- 'string' => 'The :attribute must be a string.',
- 'timezone' => 'The :attribute must be a valid zone.',
- 'unique' => 'The :attribute has already been taken.',
- 'uploaded' => 'The :attribute failed to upload.',
- 'url' => 'The :attribute format is invalid.',
- 'uuid' => 'The :attribute must be a valid UUID.',
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Language Lines
- |--------------------------------------------------------------------------
- |
- | Here you may specify custom validation messages for attributes using the
- | convention "attribute.rule" to name the lines. This makes it quick to
- | specify a specific custom language line for a given attribute rule.
- |
- */
-
- 'custom' => [
- 'g-recaptcha-response' => [
- 'required' => 'Please verify that you are not a robot.',
- 'captcha' => 'Captcha error! Try again later or contact site admin.',
- ],
- ],
-
- /*
- |--------------------------------------------------------------------------
- | Custom Validation Attributes
- |--------------------------------------------------------------------------
- |
- | The following language lines are used to swap our attribute placeholder
- | with something more reader friendly such as "E-Mail Address" instead
- | of "email". This simply helps us make our message more expressive.
- |
- */
-
- 'attributes' => [],
-
-];
diff --git a/resources/lang/vendor/backup/ar/notifications.php b/resources/lang/vendor/backup/ar/notifications.php
deleted file mode 100644
index f84de9cce..000000000
--- a/resources/lang/vendor/backup/ar/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'رسالة استثناء: :message',
- 'exception_trace' => 'تتبع الإستثناء: :trace',
- 'exception_message_title' => 'رسالة استثناء',
- 'exception_trace_title' => 'تتبع الإستثناء',
-
- 'backup_failed_subject' => 'أخفق النسخ الاحتياطي لل :application_name',
- 'backup_failed_body' => 'مهم: حدث خطأ أثناء النسخ الاحتياطي :application_name',
-
- 'backup_successful_subject' => 'نسخ احتياطي جديد ناجح ل :application_name',
- 'backup_successful_subject_title' => 'نجاح النسخ الاحتياطي الجديد!',
- 'backup_successful_body' => 'أخبار عظيمة، نسخة احتياطية جديدة ل :application_name تم إنشاؤها بنجاح على القرص المسمى :disk_name.',
-
- 'cleanup_failed_subject' => 'فشل تنظيف النسخ الاحتياطي للتطبيق :application_name .',
- 'cleanup_failed_body' => 'حدث خطأ أثناء تنظيف النسخ الاحتياطية ل :application_name',
-
- 'cleanup_successful_subject' => 'تنظيف النسخ الاحتياطية ل :application_name تمت بنجاح',
- 'cleanup_successful_subject_title' => 'تنظيف النسخ الاحتياطية تم بنجاح!',
- 'cleanup_successful_body' => 'تنظيف النسخ الاحتياطية ل :application_name على القرص المسمى :disk_name تم بنجاح.',
-
- 'healthy_backup_found_subject' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name صحية',
- 'healthy_backup_found_subject_title' => 'النسخ الاحتياطية ل :application_name صحية',
- 'healthy_backup_found_body' => 'تعتبر النسخ الاحتياطية ل :application_name صحية. عمل جيد!',
-
- 'unhealthy_backup_found_subject' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية',
- 'unhealthy_backup_found_subject_title' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية. :problem',
- 'unhealthy_backup_found_body' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name غير صحية.',
- 'unhealthy_backup_found_not_reachable' => 'لا يمكن الوصول إلى وجهة النسخ الاحتياطي. :error',
- 'unhealthy_backup_found_empty' => 'لا توجد نسخ احتياطية لهذا التطبيق على الإطلاق.',
- 'unhealthy_backup_found_old' => 'تم إنشاء أحدث النسخ الاحتياطية في :date وتعتبر قديمة جدا.',
- 'unhealthy_backup_found_unknown' => 'عذرا، لا يمكن تحديد سبب دقيق.',
- 'unhealthy_backup_found_full' => 'النسخ الاحتياطية تستخدم الكثير من التخزين. الاستخدام الحالي هو :disk_usage وهو أعلى من الحد المسموح به من :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/cs/notifications.php b/resources/lang/vendor/backup/cs/notifications.php
deleted file mode 100644
index 947eb436e..000000000
--- a/resources/lang/vendor/backup/cs/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Zpráva výjimky: :message',
- 'exception_trace' => 'Stopa výjimky: :trace',
- 'exception_message_title' => 'Zpráva výjimky',
- 'exception_trace_title' => 'Stopa výjimky',
-
- 'backup_failed_subject' => 'Záloha :application_name neuspěla',
- 'backup_failed_body' => 'Důležité: Při záloze :application_name se vyskytla chyba',
-
- 'backup_successful_subject' => 'Úspěšná nová záloha :application_name',
- 'backup_successful_subject_title' => 'Úspěšná nová záloha!',
- 'backup_successful_body' => 'Dobrá zpráva, na disku jménem :disk_name byla úspěšně vytvořena nová záloha :application_name.',
-
- 'cleanup_failed_subject' => 'Vyčištění záloh :application_name neuspělo.',
- 'cleanup_failed_body' => 'Při vyčištění záloh :application_name se vyskytla chyba',
-
- 'cleanup_successful_subject' => 'Vyčištění záloh :application_name úspěšné',
- 'cleanup_successful_subject_title' => 'Vyčištění záloh bylo úspěšné!',
- 'cleanup_successful_body' => 'Vyčištění záloh :application_name na disku jménem :disk_name bylo úspěšné.',
-
- 'healthy_backup_found_subject' => 'Zálohy pro :application_name na disku :disk_name jsou zdravé',
- 'healthy_backup_found_subject_title' => 'Zálohy pro :application_name jsou zdravé',
- 'healthy_backup_found_body' => 'Zálohy pro :application_name jsou považovány za zdravé. Dobrá práce!',
-
- 'unhealthy_backup_found_subject' => 'Důležité: Zálohy pro :application_name jsou nezdravé',
- 'unhealthy_backup_found_subject_title' => 'Důležité: Zálohy pro :application_name jsou nezdravé. :problem',
- 'unhealthy_backup_found_body' => 'Zálohy pro :application_name na disku :disk_name Jsou nezdravé.',
- 'unhealthy_backup_found_not_reachable' => 'Nelze se dostat k cíli zálohy. :error',
- 'unhealthy_backup_found_empty' => 'Tato aplikace nemá vůbec žádné zálohy.',
- 'unhealthy_backup_found_old' => 'Poslední záloha vytvořená dne :date je považována za příliš starou.',
- 'unhealthy_backup_found_unknown' => 'Omlouváme se, nemůžeme určit přesný důvod.',
- 'unhealthy_backup_found_full' => 'Zálohy zabírají příliš mnoho místa na disku. Aktuální využití disku je :disk_usage, což je vyšší než povolený limit :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/da/notifications.php b/resources/lang/vendor/backup/da/notifications.php
deleted file mode 100644
index e7b95fc5a..000000000
--- a/resources/lang/vendor/backup/da/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Fejlbesked: :message',
- 'exception_trace' => 'Fejl trace: :trace',
- 'exception_message_title' => 'Fejlbesked',
- 'exception_trace_title' => 'Fejl trace',
-
- 'backup_failed_subject' => 'Backup af :application_name fejlede',
- 'backup_failed_body' => 'Vigtigt: Der skete en fejl under backup af :application_name',
-
- 'backup_successful_subject' => 'Ny backup af :application_name oprettet',
- 'backup_successful_subject_title' => 'Ny backup!',
- 'backup_successful_body' => 'Gode nyheder - der blev oprettet en ny backup af :application_name på disken :disk_name.',
-
- 'cleanup_failed_subject' => 'Oprydning af backups for :application_name fejlede.',
- 'cleanup_failed_body' => 'Der skete en fejl under oprydning af backups for :application_name',
-
- 'cleanup_successful_subject' => 'Oprydning af backups for :application_name gennemført',
- 'cleanup_successful_subject_title' => 'Backup oprydning gennemført!',
- 'cleanup_successful_body' => 'Oprydningen af backups for :application_name på disken :disk_name er gennemført.',
-
- 'healthy_backup_found_subject' => 'Alle backups for :application_name på disken :disk_name er OK',
- 'healthy_backup_found_subject_title' => 'Alle backups for :application_name er OK',
- 'healthy_backup_found_body' => 'Alle backups for :application_name er ok. Godt gået!',
-
- 'unhealthy_backup_found_subject' => 'Vigtigt: Backups for :application_name fejlbehæftede',
- 'unhealthy_backup_found_subject_title' => 'Vigtigt: Backups for :application_name er fejlbehæftede. :problem',
- 'unhealthy_backup_found_body' => 'Backups for :application_name på disken :disk_name er fejlbehæftede.',
- 'unhealthy_backup_found_not_reachable' => 'Backup destinationen kunne ikke findes. :error',
- 'unhealthy_backup_found_empty' => 'Denne applikation har ingen backups overhovedet.',
- 'unhealthy_backup_found_old' => 'Den seneste backup fra :date er for gammel.',
- 'unhealthy_backup_found_unknown' => 'Beklager, en præcis årsag kunne ikke findes.',
- 'unhealthy_backup_found_full' => 'Backups bruger for meget plads. Nuværende disk forbrug er :disk_usage, hvilket er mere end den tilladte grænse på :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/de/notifications.php b/resources/lang/vendor/backup/de/notifications.php
deleted file mode 100644
index 2d87d8f11..000000000
--- a/resources/lang/vendor/backup/de/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Fehlermeldung: :message',
- 'exception_trace' => 'Fehlerverfolgung: :trace',
- 'exception_message_title' => 'Fehlermeldung',
- 'exception_trace_title' => 'Fehlerverfolgung',
-
- 'backup_failed_subject' => 'Backup von :application_name konnte nicht erstellt werden',
- 'backup_failed_body' => 'Wichtig: Beim Backup von :application_name ist ein Fehler aufgetreten',
-
- 'backup_successful_subject' => 'Erfolgreiches neues Backup von :application_name',
- 'backup_successful_subject_title' => 'Erfolgreiches neues Backup!',
- 'backup_successful_body' => 'Gute Nachrichten, ein neues Backup von :application_name wurde erfolgreich erstellt und in :disk_name gepeichert.',
-
- 'cleanup_failed_subject' => 'Aufräumen der Backups von :application_name schlug fehl.',
- 'cleanup_failed_body' => 'Beim aufräumen der Backups von :application_name ist ein Fehler aufgetreten',
-
- 'cleanup_successful_subject' => 'Aufräumen der Backups von :application_name backups erfolgreich',
- 'cleanup_successful_subject_title' => 'Aufräumen der Backups erfolgreich!',
- 'cleanup_successful_body' => 'Aufräumen der Backups von :application_name in :disk_name war erfolgreich.',
-
- 'healthy_backup_found_subject' => 'Die Backups von :application_name in :disk_name sind gesund',
- 'healthy_backup_found_subject_title' => 'Die Backups von :application_name sind Gesund',
- 'healthy_backup_found_body' => 'Die Backups von :application_name wurden als gesund eingestuft. Gute Arbeit!',
-
- 'unhealthy_backup_found_subject' => 'Wichtig: Die Backups für :application_name sind nicht gesund',
- 'unhealthy_backup_found_subject_title' => 'Wichtig: Die Backups für :application_name sind ungesund. :problem',
- 'unhealthy_backup_found_body' => 'Die Backups für :application_name in :disk_name sind ungesund.',
- 'unhealthy_backup_found_not_reachable' => 'Das Backup Ziel konnte nicht erreicht werden. :error',
- 'unhealthy_backup_found_empty' => 'Es gibt für die Anwendung noch gar keine Backups.',
- 'unhealthy_backup_found_old' => 'Das letzte Backup am :date ist zu lange her.',
- 'unhealthy_backup_found_unknown' => 'Sorry, ein genauer Grund konnte nicht gefunden werden.',
- 'unhealthy_backup_found_full' => 'Die Backups verbrauchen zu viel Platz. Aktuell wird :disk_usage belegt, dass ist höher als das erlaubte Limit von :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/en/notifications.php b/resources/lang/vendor/backup/en/notifications.php
deleted file mode 100644
index d7a11281c..000000000
--- a/resources/lang/vendor/backup/en/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Exception message: :message',
- 'exception_trace' => 'Exception trace: :trace',
- 'exception_message_title' => 'Exception message',
- 'exception_trace_title' => 'Exception trace',
-
- 'backup_failed_subject' => 'Failed backup of :application_name',
- 'backup_failed_body' => 'Important: An error occurred while backing up :application_name',
-
- 'backup_successful_subject' => 'Successful new backup of :application_name',
- 'backup_successful_subject_title' => 'Successful new backup!',
- 'backup_successful_body' => 'Great news, a new backup of :application_name was successfully created on the disk named :disk_name.',
-
- 'cleanup_failed_subject' => 'Cleaning up the backups of :application_name failed.',
- 'cleanup_failed_body' => 'An error occurred while cleaning up the backups of :application_name',
-
- 'cleanup_successful_subject' => 'Clean up of :application_name backups successful',
- 'cleanup_successful_subject_title' => 'Clean up of backups successful!',
- 'cleanup_successful_body' => 'The clean up of the :application_name backups on the disk named :disk_name was successful.',
-
- 'healthy_backup_found_subject' => 'The backups for :application_name on disk :disk_name are healthy',
- 'healthy_backup_found_subject_title' => 'The backups for :application_name are healthy',
- 'healthy_backup_found_body' => 'The backups for :application_name are considered healthy. Good job!',
-
- 'unhealthy_backup_found_subject' => 'Important: The backups for :application_name are unhealthy',
- 'unhealthy_backup_found_subject_title' => 'Important: The backups for :application_name are unhealthy. :problem',
- 'unhealthy_backup_found_body' => 'The backups for :application_name on disk :disk_name are unhealthy.',
- 'unhealthy_backup_found_not_reachable' => 'The backup destination cannot be reached. :error',
- 'unhealthy_backup_found_empty' => 'There are no backups of this application at all.',
- 'unhealthy_backup_found_old' => 'The latest backup made on :date is considered too old.',
- 'unhealthy_backup_found_unknown' => 'Sorry, an exact reason cannot be determined.',
- 'unhealthy_backup_found_full' => 'The backups are using too much storage. Current usage is :disk_usage which is higher than the allowed limit of :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/es/notifications.php b/resources/lang/vendor/backup/es/notifications.php
deleted file mode 100644
index 4f4900fe5..000000000
--- a/resources/lang/vendor/backup/es/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Mensaje de la excepción: :message',
- 'exception_trace' => 'Traza de la excepción: :trace',
- 'exception_message_title' => 'Mensaje de la excepción',
- 'exception_trace_title' => 'Traza de la excepción',
-
- 'backup_failed_subject' => 'Copia de seguridad de :application_name fallida',
- 'backup_failed_body' => 'Importante: Ocurrió un error al realizar la copia de seguridad de :application_name',
-
- 'backup_successful_subject' => 'Se completó con éxito la copia de seguridad de :application_name',
- 'backup_successful_subject_title' => '¡Nueva copia de seguridad creada con éxito!',
- 'backup_successful_body' => 'Buenas noticias, una nueva copia de seguridad de :application_name fue creada con éxito en el disco llamado :disk_name.',
-
- 'cleanup_failed_subject' => 'La limpieza de copias de seguridad de :application_name falló.',
- 'cleanup_failed_body' => 'Ocurrió un error mientras se realizaba la limpieza de copias de seguridad de :application_name',
-
- 'cleanup_successful_subject' => 'La limpieza de copias de seguridad de :application_name se completó con éxito',
- 'cleanup_successful_subject_title' => '!Limpieza de copias de seguridad completada con éxito!',
- 'cleanup_successful_body' => 'La limpieza de copias de seguridad de :application_name en el disco llamado :disk_name se completo con éxito.',
-
- 'healthy_backup_found_subject' => 'Las copias de seguridad de :application_name en el disco :disk_name están en buen estado',
- 'healthy_backup_found_subject_title' => 'Las copias de seguridad de :application_name están en buen estado',
- 'healthy_backup_found_body' => 'Las copias de seguridad de :application_name se consideran en buen estado. ¡Buen trabajo!',
-
- 'unhealthy_backup_found_subject' => 'Importante: Las copias de seguridad de :application_name están en mal estado',
- 'unhealthy_backup_found_subject_title' => 'Importante: Las copias de seguridad de :application_name están en mal estado. :problem',
- 'unhealthy_backup_found_body' => 'Las copias de seguridad de :application_name en el disco :disk_name están en mal estado.',
- 'unhealthy_backup_found_not_reachable' => 'No se puede acceder al destino de la copia de seguridad. :error',
- 'unhealthy_backup_found_empty' => 'No existe ninguna copia de seguridad de esta aplicación.',
- 'unhealthy_backup_found_old' => 'La última copia de seguriad hecha en :date es demasiado antigua.',
- 'unhealthy_backup_found_unknown' => 'Lo siento, no es posible determinar la razón exacta.',
- 'unhealthy_backup_found_full' => 'Las copias de seguridad están ocupando demasiado espacio. El espacio utilizado actualmente es :disk_usage el cual es mayor que el límite permitido de :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/fa/notifications.php b/resources/lang/vendor/backup/fa/notifications.php
deleted file mode 100644
index 33cbe335e..000000000
--- a/resources/lang/vendor/backup/fa/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'پیغام خطا: :message',
- 'exception_trace' => 'جزییات خطا: :trace',
- 'exception_message_title' => 'پیغام خطا',
- 'exception_trace_title' => 'جزییات خطا',
-
- 'backup_failed_subject' => 'پشتیبانگیری :application_name با خطا مواجه شد.',
- 'backup_failed_body' => 'پیغام مهم: هنگام پشتیبانگیری از :application_name خطایی رخ داده است. ',
-
- 'backup_successful_subject' => 'نسخه پشتیبان جدید :application_name با موفقیت ساخته شد.',
- 'backup_successful_subject_title' => 'پشتیبانگیری موفق!',
- 'backup_successful_body' => 'خبر خوب, به تازگی نسخه پشتیبان :application_name بر روی دیسک :disk_name با موفقیت ساخته شد. ',
-
- 'cleanup_failed_subject' => 'پاکسازی نسخه پشتیبان :application_name انجام نشد.',
- 'cleanup_failed_body' => 'هنگام پاکسازی نسخه پشتیبان :application_name خطایی رخ داده است.',
-
- 'cleanup_successful_subject' => 'پاکسازی نسخه پشتیبان :application_name با موفقیت انجام شد.',
- 'cleanup_successful_subject_title' => 'پاکسازی نسخه پشتیبان!',
- 'cleanup_successful_body' => 'پاکسازی نسخه پشتیبان :application_name بر روی دیسک :disk_name با موفقیت انجام شد.',
-
- 'healthy_backup_found_subject' => 'نسخه پشتیبان :application_name بر روی دیسک :disk_name سالم بود.',
- 'healthy_backup_found_subject_title' => 'نسخه پشتیبان :application_name سالم بود.',
- 'healthy_backup_found_body' => 'نسخه پشتیبان :application_name به نظر سالم میاد. دمت گرم!',
-
- 'unhealthy_backup_found_subject' => 'خبر مهم: نسخه پشتیبان :application_name سالم نبود.',
- 'unhealthy_backup_found_subject_title' => 'خبر مهم: نسخه پشتیبان :application_name سالم نبود. :problem',
- 'unhealthy_backup_found_body' => 'نسخه پشتیبان :application_name بر روی دیسک :disk_name سالم نبود.',
- 'unhealthy_backup_found_not_reachable' => 'مقصد پشتیبانگیری در دسترس نبود. :error',
- 'unhealthy_backup_found_empty' => 'برای این برنامه هیچ نسخه پشتیبانی وجود ندارد.',
- 'unhealthy_backup_found_old' => 'آخرین نسخه پشتیبان برای تاریخ :date است. که به نظر خیلی قدیمی میاد. ',
- 'unhealthy_backup_found_unknown' => 'متاسفانه دلیل دقیق مشخص نشده است.',
- 'unhealthy_backup_found_full' => 'نسخههای پشتیبانی که تهیه کرده اید حجم زیادی اشغال کرده اند. میزان دیسک استفاده شده :disk_usage است که از میزان مجاز :disk_limit فراتر رفته است. ',
-];
diff --git a/resources/lang/vendor/backup/fi/notifications.php b/resources/lang/vendor/backup/fi/notifications.php
deleted file mode 100644
index 85e3607c0..000000000
--- a/resources/lang/vendor/backup/fi/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Virheilmoitus: :message',
- 'exception_trace' => 'Virhe, jäljitys: :trace',
- 'exception_message_title' => 'Virheilmoitus',
- 'exception_trace_title' => 'Virheen jäljitys',
-
- 'backup_failed_subject' => ':application_name varmuuskopiointi epäonnistui',
- 'backup_failed_body' => 'HUOM!: :application_name varmuuskoipionnissa tapahtui virhe',
-
- 'backup_successful_subject' => ':application_name varmuuskopioitu onnistuneesti',
- 'backup_successful_subject_title' => 'Uusi varmuuskopio!',
- 'backup_successful_body' => 'Hyviä uutisia! :application_name on varmuuskopioitu levylle :disk_name.',
-
- 'cleanup_failed_subject' => ':application_name varmuuskopioiden poistaminen epäonnistui.',
- 'cleanup_failed_body' => ':application_name varmuuskopioiden poistamisessa tapahtui virhe.',
-
- 'cleanup_successful_subject' => ':application_name varmuuskopiot poistettu onnistuneesti',
- 'cleanup_successful_subject_title' => 'Varmuuskopiot poistettu onnistuneesti!',
- 'cleanup_successful_body' => ':application_name varmuuskopiot poistettu onnistuneesti levyltä :disk_name.',
-
- 'healthy_backup_found_subject' => ':application_name varmuuskopiot levyllä :disk_name ovat kunnossa',
- 'healthy_backup_found_subject_title' => ':application_name varmuuskopiot ovat kunnossa',
- 'healthy_backup_found_body' => ':application_name varmuuskopiot ovat kunnossa. Hieno homma!',
-
- 'unhealthy_backup_found_subject' => 'HUOM!: :application_name varmuuskopiot ovat vialliset',
- 'unhealthy_backup_found_subject_title' => 'HUOM!: :application_name varmuuskopiot ovat vialliset. :problem',
- 'unhealthy_backup_found_body' => ':application_name varmuuskopiot levyllä :disk_name ovat vialliset.',
- 'unhealthy_backup_found_not_reachable' => 'Varmuuskopioiden kohdekansio ei ole saatavilla. :error',
- 'unhealthy_backup_found_empty' => 'Tästä sovelluksesta ei ole varmuuskopioita.',
- 'unhealthy_backup_found_old' => 'Viimeisin varmuuskopio, luotu :date, on liian vanha.',
- 'unhealthy_backup_found_unknown' => 'Virhe, tarkempaa tietoa syystä ei valitettavasti ole saatavilla.',
- 'unhealthy_backup_found_full' => 'Varmuuskopiot vievät liikaa levytilaa. Tällä hetkellä käytössä :disk_usage, mikä on suurempi kuin sallittu tilavuus (:disk_limit).',
-];
diff --git a/resources/lang/vendor/backup/fr/notifications.php b/resources/lang/vendor/backup/fr/notifications.php
deleted file mode 100644
index 57a98c23a..000000000
--- a/resources/lang/vendor/backup/fr/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Message de l\'exception : :message',
- 'exception_trace' => 'Trace de l\'exception : :trace',
- 'exception_message_title' => 'Message de l\'exception',
- 'exception_trace_title' => 'Trace de l\'exception',
-
- 'backup_failed_subject' => 'Échec de la sauvegarde de :application_name',
- 'backup_failed_body' => 'Important : Une erreur est survenue lors de la sauvegarde de :application_name',
-
- 'backup_successful_subject' => 'Succès de la sauvegarde de :application_name',
- 'backup_successful_subject_title' => 'Sauvegarde créée avec succès !',
- 'backup_successful_body' => 'Bonne nouvelle, une nouvelle sauvegarde de :application_name a été créée avec succès sur le disque nommé :disk_name.',
-
- 'cleanup_failed_subject' => 'Le nettoyage des sauvegardes de :application_name a echoué.',
- 'cleanup_failed_body' => 'Une erreur est survenue lors du nettoyage des sauvegardes de :application_name',
-
- 'cleanup_successful_subject' => 'Succès du nettoyage des sauvegardes de :application_name',
- 'cleanup_successful_subject_title' => 'Sauvegardes nettoyées avec succès !',
- 'cleanup_successful_body' => 'Le nettoyage des sauvegardes de :application_name sur le disque nommé :disk_name a été effectué avec succès.',
-
- 'healthy_backup_found_subject' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont saines',
- 'healthy_backup_found_subject_title' => 'Les sauvegardes pour :application_name sont saines',
- 'healthy_backup_found_body' => 'Les sauvegardes pour :application_name sont considérées saines. Bon travail !',
-
- 'unhealthy_backup_found_subject' => 'Important : Les sauvegardes pour :application_name sont corrompues',
- 'unhealthy_backup_found_subject_title' => 'Important : Les sauvegardes pour :application_name sont corrompues. :problem',
- 'unhealthy_backup_found_body' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont corrompues.',
- 'unhealthy_backup_found_not_reachable' => 'La destination de la sauvegarde n\'est pas accessible. :error',
- 'unhealthy_backup_found_empty' => 'Il n\'y a aucune sauvegarde pour cette application.',
- 'unhealthy_backup_found_old' => 'La dernière sauvegarde du :date est considérée trop vieille.',
- 'unhealthy_backup_found_unknown' => 'Désolé, une raison exacte ne peut être déterminée.',
- 'unhealthy_backup_found_full' => 'Les sauvegardes utilisent trop d\'espace disque. L\'utilisation actuelle est de :disk_usage alors que la limite autorisée est de :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/hi/notifications.php b/resources/lang/vendor/backup/hi/notifications.php
deleted file mode 100644
index 74a188d3d..000000000
--- a/resources/lang/vendor/backup/hi/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'गलती संदेश: :message',
- 'exception_trace' => 'गलती निशान: :trace',
- 'exception_message_title' => 'गलती संदेश',
- 'exception_trace_title' => 'गलती निशान',
-
- 'backup_failed_subject' => ':application_name का बैकअप असफल रहा',
- 'backup_failed_body' => 'जरूरी सुचना: :application_name का बैकअप लेते समय असफल रहे',
-
- 'backup_successful_subject' => ':application_name का बैकअप सफल रहा',
- 'backup_successful_subject_title' => 'बैकअप सफल रहा!',
- 'backup_successful_body' => 'खुशखबरी, :application_name का बैकअप :disk_name पर संग्रहित करने मे सफल रहे.',
-
- 'cleanup_failed_subject' => ':application_name के बैकअप की सफाई असफल रही.',
- 'cleanup_failed_body' => ':application_name के बैकअप की सफाई करते समय कुछ बाधा आयी है.',
-
- 'cleanup_successful_subject' => ':application_name के बैकअप की सफाई सफल रही',
- 'cleanup_successful_subject_title' => 'बैकअप की सफाई सफल रही!',
- 'cleanup_successful_body' => ':application_name का बैकअप जो :disk_name नाम की डिस्क पर संग्रहित है, उसकी सफाई सफल रही.',
-
- 'healthy_backup_found_subject' => ':disk_name नाम की डिस्क पर संग्रहित :application_name के बैकअप स्वस्थ है',
- 'healthy_backup_found_subject_title' => ':application_name के सभी बैकअप स्वस्थ है',
- 'healthy_backup_found_body' => 'बहुत बढ़िया! :application_name के सभी बैकअप स्वस्थ है.',
-
- 'unhealthy_backup_found_subject' => 'जरूरी सुचना : :application_name के बैकअप अस्वस्थ है',
- 'unhealthy_backup_found_subject_title' => 'जरूरी सुचना : :application_name के बैकअप :problem के बजेसे अस्वस्थ है',
- 'unhealthy_backup_found_body' => ':disk_name नाम की डिस्क पर संग्रहित :application_name के बैकअप अस्वस्थ है',
- 'unhealthy_backup_found_not_reachable' => ':error के बजेसे बैकअप की मंजिल तक पोहोच नहीं सकते.',
- 'unhealthy_backup_found_empty' => 'इस एप्लीकेशन का कोई भी बैकअप नहीं है.',
- 'unhealthy_backup_found_old' => 'हालहीमें :date को लिया हुआ बैकअप बहुत पुराना है.',
- 'unhealthy_backup_found_unknown' => 'माफ़ कीजिये, सही कारण निर्धारित नहीं कर सकते.',
- 'unhealthy_backup_found_full' => 'सभी बैकअप बहुत ज्यादा जगह का उपयोग कर रहे है. फ़िलहाल सभी बैकअप :disk_usage जगह का उपयोग कर रहे है, जो की :disk_limit अनुमति सीमा से अधिक का है.',
-];
diff --git a/resources/lang/vendor/backup/id/notifications.php b/resources/lang/vendor/backup/id/notifications.php
deleted file mode 100644
index 971322a02..000000000
--- a/resources/lang/vendor/backup/id/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Pesan pengecualian: :message',
- 'exception_trace' => 'Jejak pengecualian: :trace',
- 'exception_message_title' => 'Pesan pengecualian',
- 'exception_trace_title' => 'Jejak pengecualian',
-
- 'backup_failed_subject' => 'Gagal backup :application_name',
- 'backup_failed_body' => 'Penting: Sebuah error terjadi ketika membackup :application_name',
-
- 'backup_successful_subject' => 'Backup baru sukses dari :application_name',
- 'backup_successful_subject_title' => 'Backup baru sukses!',
- 'backup_successful_body' => 'Kabar baik, sebuah backup baru dari :application_name sukses dibuat pada disk bernama :disk_name.',
-
- 'cleanup_failed_subject' => 'Membersihkan backup dari :application_name yang gagal.',
- 'cleanup_failed_body' => 'Sebuah error teradi ketika membersihkan backup dari :application_name',
-
- 'cleanup_successful_subject' => 'Sukses membersihkan backup :application_name',
- 'cleanup_successful_subject_title' => 'Sukses membersihkan backup!',
- 'cleanup_successful_body' => 'Pembersihan backup :application_name pada disk bernama :disk_name telah sukses.',
-
- 'healthy_backup_found_subject' => 'Backup untuk :application_name pada disk :disk_name sehat',
- 'healthy_backup_found_subject_title' => 'Backup untuk :application_name sehat',
- 'healthy_backup_found_body' => 'Backup untuk :application_name dipertimbangkan sehat. Kerja bagus!',
-
- 'unhealthy_backup_found_subject' => 'Penting: Backup untuk :application_name tidak sehat',
- 'unhealthy_backup_found_subject_title' => 'Penting: Backup untuk :application_name tidak sehat. :problem',
- 'unhealthy_backup_found_body' => 'Backup untuk :application_name pada disk :disk_name tidak sehat.',
- 'unhealthy_backup_found_not_reachable' => 'Tujuan backup tidak dapat terjangkau. :error',
- 'unhealthy_backup_found_empty' => 'Tidak ada backup pada aplikasi ini sama sekali.',
- 'unhealthy_backup_found_old' => 'Backup terakhir dibuat pada :date dimana dipertimbahkan sudah sangat lama.',
- 'unhealthy_backup_found_unknown' => 'Maaf, sebuah alasan persisnya tidak dapat ditentukan.',
- 'unhealthy_backup_found_full' => 'Backup menggunakan terlalu banyak kapasitas penyimpanan. Penggunaan terkini adalah :disk_usage dimana lebih besar dari batas yang diperbolehkan yaitu :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/it/notifications.php b/resources/lang/vendor/backup/it/notifications.php
deleted file mode 100644
index 43ad38e48..000000000
--- a/resources/lang/vendor/backup/it/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Messaggio dell\'eccezione: :message',
- 'exception_trace' => 'Traccia dell\'eccezione: :trace',
- 'exception_message_title' => 'Messaggio dell\'eccezione',
- 'exception_trace_title' => 'Traccia dell\'eccezione',
-
- 'backup_failed_subject' => 'Fallito il backup di :application_name',
- 'backup_failed_body' => 'Importante: Si è verificato un errore durante il backup di :application_name',
-
- 'backup_successful_subject' => 'Creato nuovo backup di :application_name',
- 'backup_successful_subject_title' => 'Nuovo backup creato!',
- 'backup_successful_body' => 'Grande notizia, un nuovo backup di :application_name è stato creato con successo sul disco :disk_name.',
-
- 'cleanup_failed_subject' => 'Pulizia dei backup di :application_name fallita.',
- 'cleanup_failed_body' => 'Si è verificato un errore durante la pulizia dei backup di :application_name',
-
- 'cleanup_successful_subject' => 'Pulizia dei backup di :application_name avvenuta con successo',
- 'cleanup_successful_subject_title' => 'Pulizia dei backup avvenuta con successo!',
- 'cleanup_successful_body' => 'La pulizia dei backup di :application_name sul disco :disk_name è avvenuta con successo.',
-
- 'healthy_backup_found_subject' => 'I backup per :application_name sul disco :disk_name sono sani',
- 'healthy_backup_found_subject_title' => 'I backup per :application_name sono sani',
- 'healthy_backup_found_body' => 'I backup per :application_name sono considerati sani. Bel Lavoro!',
-
- 'unhealthy_backup_found_subject' => 'Importante: i backup per :application_name sono corrotti',
- 'unhealthy_backup_found_subject_title' => 'Importante: i backup per :application_name sono corrotti. :problem',
- 'unhealthy_backup_found_body' => 'I backup per :application_name sul disco :disk_name sono corrotti.',
- 'unhealthy_backup_found_not_reachable' => 'Impossibile raggiungere la destinazione di backup. :error',
- 'unhealthy_backup_found_empty' => 'Non esiste alcun backup di questa applicazione.',
- 'unhealthy_backup_found_old' => 'L\'ultimo backup fatto il :date è considerato troppo vecchio.',
- 'unhealthy_backup_found_unknown' => 'Spiacenti, non è possibile determinare una ragione esatta.',
- 'unhealthy_backup_found_full' => 'I backup utilizzano troppa memoria. L\'utilizzo corrente è :disk_usage che è superiore al limite consentito di :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/ja/notifications.php b/resources/lang/vendor/backup/ja/notifications.php
deleted file mode 100644
index f272e552a..000000000
--- a/resources/lang/vendor/backup/ja/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- '例外のメッセージ: :message',
- 'exception_trace' => '例外の追跡: :trace',
- 'exception_message_title' => '例外のメッセージ',
- 'exception_trace_title' => '例外の追跡',
-
- 'backup_failed_subject' => ':application_name のバックアップに失敗しました。',
- 'backup_failed_body' => '重要: :application_name のバックアップ中にエラーが発生しました。',
-
- 'backup_successful_subject' => ':application_name のバックアップに成功しました。',
- 'backup_successful_subject_title' => 'バックアップに成功しました!',
- 'backup_successful_body' => '朗報です。ディスク :disk_name へ :application_name のバックアップが成功しました。',
-
- 'cleanup_failed_subject' => ':application_name のバックアップ削除に失敗しました。',
- 'cleanup_failed_body' => ':application_name のバックアップ削除中にエラーが発生しました。',
-
- 'cleanup_successful_subject' => ':application_name のバックアップ削除に成功しました。',
- 'cleanup_successful_subject_title' => 'バックアップ削除に成功しました!',
- 'cleanup_successful_body' => 'ディスク :disk_name に保存された :application_name のバックアップ削除に成功しました。',
-
- 'healthy_backup_found_subject' => 'ディスク :disk_name への :application_name のバックアップは正常です。',
- 'healthy_backup_found_subject_title' => ':application_name のバックアップは正常です。',
- 'healthy_backup_found_body' => ':application_name へのバックアップは正常です。いい仕事してますね!',
-
- 'unhealthy_backup_found_subject' => '重要: :application_name のバックアップに異常があります。',
- 'unhealthy_backup_found_subject_title' => '重要: :application_name のバックアップに異常があります。 :problem',
- 'unhealthy_backup_found_body' => ':disk_name への :application_name のバックアップに異常があります。',
- 'unhealthy_backup_found_not_reachable' => 'バックアップ先にアクセスできませんでした。 :error',
- 'unhealthy_backup_found_empty' => 'このアプリケーションのバックアップは見つかりませんでした。',
- 'unhealthy_backup_found_old' => ':date に保存された直近のバックアップが古すぎます。',
- 'unhealthy_backup_found_unknown' => '申し訳ございません。予期せぬエラーです。',
- 'unhealthy_backup_found_full' => 'バックアップがディスク容量を圧迫しています。現在の使用量 :disk_usage は、許可された限界値 :disk_limit を超えています。',
-];
diff --git a/resources/lang/vendor/backup/nl/notifications.php b/resources/lang/vendor/backup/nl/notifications.php
deleted file mode 100644
index 5dbc65edf..000000000
--- a/resources/lang/vendor/backup/nl/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Fout bericht: :message',
- 'exception_trace' => 'Fout trace: :trace',
- 'exception_message_title' => 'Fout bericht',
- 'exception_trace_title' => 'Fout trace',
-
- 'backup_failed_subject' => 'Back-up van :application_name mislukt',
- 'backup_failed_body' => 'Belangrijk: Er ging iets fout tijdens het maken van een back-up van :application_name',
-
- 'backup_successful_subject' => 'Succesvolle nieuwe back-up van :application_name',
- 'backup_successful_subject_title' => 'Succesvolle nieuwe back-up!',
- 'backup_successful_body' => 'Goed nieuws, een nieuwe back-up van :application_name was succesvol aangemaakt op de schijf genaamd :disk_name.',
-
- 'cleanup_failed_subject' => 'Het opschonen van de back-ups van :application_name is mislukt.',
- 'cleanup_failed_body' => 'Er ging iets fout tijdens het opschonen van de back-ups van :application_name',
-
- 'cleanup_successful_subject' => 'Opschonen van :application_name back-ups was succesvol.',
- 'cleanup_successful_subject_title' => 'Opschonen van back-ups was succesvol!',
- 'cleanup_successful_body' => 'Het opschonen van de :application_name back-ups op de schijf genaamd :disk_name was succesvol.',
-
- 'healthy_backup_found_subject' => 'De back-ups voor :application_name op schijf :disk_name zijn gezond',
- 'healthy_backup_found_subject_title' => 'De back-ups voor :application_name zijn gezond',
- 'healthy_backup_found_body' => 'De back-ups voor :application_name worden als gezond beschouwd. Goed gedaan!',
-
- 'unhealthy_backup_found_subject' => 'Belangrijk: De back-ups voor :application_name zijn niet meer gezond',
- 'unhealthy_backup_found_subject_title' => 'Belangrijk: De back-ups voor :application_name zijn niet gezond. :problem',
- 'unhealthy_backup_found_body' => 'De back-ups voor :application_name op schijf :disk_name zijn niet gezond.',
- 'unhealthy_backup_found_not_reachable' => 'De back-upbestemming kon niet worden bereikt. :error',
- 'unhealthy_backup_found_empty' => 'Er zijn geen back-ups van deze applicatie beschikbaar.',
- 'unhealthy_backup_found_old' => 'De laatste back-up gemaakt op :date is te oud.',
- 'unhealthy_backup_found_unknown' => 'Sorry, een exacte reden kon niet worden bepaald.',
- 'unhealthy_backup_found_full' => 'De back-ups gebruiken te veel opslagruimte. Momenteel wordt er :disk_usage gebruikt wat hoger is dan de toegestane limiet van :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/no/notifications.php b/resources/lang/vendor/backup/no/notifications.php
deleted file mode 100644
index e60bc1c25..000000000
--- a/resources/lang/vendor/backup/no/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Exception: :message',
- 'exception_trace' => 'Exception trace: :trace',
- 'exception_message_title' => 'Exception',
- 'exception_trace_title' => 'Exception trace',
-
- 'backup_failed_subject' => 'Backup feilet for :application_name',
- 'backup_failed_body' => 'Viktg: En feil oppstod under backing av :application_name',
-
- 'backup_successful_subject' => 'Gjennomført backup av :application_name',
- 'backup_successful_subject_title' => 'Gjennomført backup!',
- 'backup_successful_body' => 'Gode nyheter, en ny backup av :application_name ble opprettet på disken :disk_name.',
-
- 'cleanup_failed_subject' => 'Opprydding av backup for :application_name feilet.',
- 'cleanup_failed_body' => 'En feil oppstod under opprydding av backups for :application_name',
-
- 'cleanup_successful_subject' => 'Opprydding av backup for :application_name gjennomført',
- 'cleanup_successful_subject_title' => 'Opprydding av backup gjennomført!',
- 'cleanup_successful_body' => 'Oppryddingen av backup for :application_name på disken :disk_name har blitt gjennomført.',
-
- 'healthy_backup_found_subject' => 'Alle backups for :application_name på disken :disk_name er OK',
- 'healthy_backup_found_subject_title' => 'Alle backups for :application_name er OK',
- 'healthy_backup_found_body' => 'Alle backups for :application_name er ok. Godt jobba!',
-
- 'unhealthy_backup_found_subject' => 'Viktig: Backups for :application_name ikke OK',
- 'unhealthy_backup_found_subject_title' => 'Viktig: Backups for :application_name er ikke OK. :problem',
- 'unhealthy_backup_found_body' => 'Backups for :application_name på disken :disk_name er ikke OK.',
- 'unhealthy_backup_found_not_reachable' => 'Kunne ikke finne backup-destinasjonen. :error',
- 'unhealthy_backup_found_empty' => 'Denne applikasjonen mangler backups.',
- 'unhealthy_backup_found_old' => 'Den siste backupem fra :date er for gammel.',
- 'unhealthy_backup_found_unknown' => 'Beklager, kunne ikke finne nøyaktig årsak.',
- 'unhealthy_backup_found_full' => 'Backups bruker for mye lagringsplass. Nåværende diskbruk er :disk_usage, som er mer enn den tillatte grensen på :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/pl/notifications.php b/resources/lang/vendor/backup/pl/notifications.php
deleted file mode 100644
index 7b267ac8f..000000000
--- a/resources/lang/vendor/backup/pl/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Błąd: :message',
- 'exception_trace' => 'Zrzut błędu: :trace',
- 'exception_message_title' => 'Błąd',
- 'exception_trace_title' => 'Zrzut błędu',
-
- 'backup_failed_subject' => 'Tworzenie kopii zapasowej aplikacji :application_name nie powiodło się',
- 'backup_failed_body' => 'Ważne: Wystąpił błąd podczas tworzenia kopii zapasowej aplikacji :application_name',
-
- 'backup_successful_subject' => 'Pomyślnie utworzono kopię zapasową aplikacji :application_name',
- 'backup_successful_subject_title' => 'Nowa kopia zapasowa!',
- 'backup_successful_body' => 'Wspaniała wiadomość, nowa kopia zapasowa aplikacji :application_name została pomyślnie utworzona na dysku o nazwie :disk_name.',
-
- 'cleanup_failed_subject' => 'Czyszczenie kopii zapasowych aplikacji :application_name nie powiodło się.',
- 'cleanup_failed_body' => 'Wystąpił błąd podczas czyszczenia kopii zapasowej aplikacji :application_name',
-
- 'cleanup_successful_subject' => 'Kopie zapasowe aplikacji :application_name zostały pomyślnie wyczyszczone',
- 'cleanup_successful_subject_title' => 'Kopie zapasowe zostały pomyślnie wyczyszczone!',
- 'cleanup_successful_body' => 'Czyszczenie kopii zapasowych aplikacji :application_name na dysku :disk_name zakończone sukcesem.',
-
- 'healthy_backup_found_subject' => 'Kopie zapasowe aplikacji :application_name na dysku :disk_name są poprawne',
- 'healthy_backup_found_subject_title' => 'Kopie zapasowe aplikacji :application_name są poprawne',
- 'healthy_backup_found_body' => 'Kopie zapasowe aplikacji :application_name są poprawne. Dobra robota!',
-
- 'unhealthy_backup_found_subject' => 'Ważne: Kopie zapasowe aplikacji :application_name są niepoprawne',
- 'unhealthy_backup_found_subject_title' => 'Ważne: Kopie zapasowe aplikacji :application_name są niepoprawne. :problem',
- 'unhealthy_backup_found_body' => 'Kopie zapasowe aplikacji :application_name na dysku :disk_name są niepoprawne.',
- 'unhealthy_backup_found_not_reachable' => 'Miejsce docelowe kopii zapasowej nie jest osiągalne. :error',
- 'unhealthy_backup_found_empty' => 'W aplikacji nie ma żadnej kopii zapasowych tej aplikacji.',
- 'unhealthy_backup_found_old' => 'Ostatnia kopia zapasowa wykonania dnia :date jest zbyt stara.',
- 'unhealthy_backup_found_unknown' => 'Niestety, nie można ustalić dokładnego błędu.',
- 'unhealthy_backup_found_full' => 'Kopie zapasowe zajmują zbyt dużo miejsca. Obecne użycie dysku :disk_usage jest większe od ustalonego limitu :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/pt-BR/notifications.php b/resources/lang/vendor/backup/pt-BR/notifications.php
deleted file mode 100644
index d22ebf4d4..000000000
--- a/resources/lang/vendor/backup/pt-BR/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Exception message: :message',
- 'exception_trace' => 'Exception trace: :trace',
- 'exception_message_title' => 'Exception message',
- 'exception_trace_title' => 'Exception trace',
-
- 'backup_failed_subject' => 'Falha no backup da aplicação :application_name',
- 'backup_failed_body' => 'Importante: Ocorreu um erro ao fazer o backup da aplicação :application_name',
-
- 'backup_successful_subject' => 'Backup realizado com sucesso: :application_name',
- 'backup_successful_subject_title' => 'Backup Realizado com sucesso!',
- 'backup_successful_body' => 'Boas notícias, um novo backup da aplicação :application_name foi criado no disco :disk_name.',
-
- 'cleanup_failed_subject' => 'Falha na limpeza dos backups da aplicação :application_name.',
- 'cleanup_failed_body' => 'Um erro ocorreu ao fazer a limpeza dos backups da aplicação :application_name',
-
- 'cleanup_successful_subject' => 'Limpeza dos backups da aplicação :application_name concluída!',
- 'cleanup_successful_subject_title' => 'Limpeza dos backups concluída!',
- 'cleanup_successful_body' => 'A limpeza dos backups da aplicação :application_name no disco :disk_name foi concluída.',
-
- 'healthy_backup_found_subject' => 'Os backups da aplicação :application_name no disco :disk_name estão em dia',
- 'healthy_backup_found_subject_title' => 'Os backups da aplicação :application_name estão em dia',
- 'healthy_backup_found_body' => 'Os backups da aplicação :application_name estão em dia. Bom trabalho!',
-
- 'unhealthy_backup_found_subject' => 'Importante: Os backups da aplicação :application_name não estão em dia',
- 'unhealthy_backup_found_subject_title' => 'Importante: Os backups da aplicação :application_name não estão em dia. :problem',
- 'unhealthy_backup_found_body' => 'Os backups da aplicação :application_name no disco :disk_name não estão em dia.',
- 'unhealthy_backup_found_not_reachable' => 'O destino dos backups não pode ser alcançado. :error',
- 'unhealthy_backup_found_empty' => 'Não existem backups para essa aplicação.',
- 'unhealthy_backup_found_old' => 'O último backup realizado em :date é considerado muito antigo.',
- 'unhealthy_backup_found_unknown' => 'Desculpe, a exata razão não pode ser encontrada.',
- 'unhealthy_backup_found_full' => 'Os backups estão usando muito espaço de armazenamento. A utilização atual é de :disk_usage, o que é maior que o limite permitido de :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/pt/notifications.php b/resources/lang/vendor/backup/pt/notifications.php
deleted file mode 100644
index 1656b930c..000000000
--- a/resources/lang/vendor/backup/pt/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Exception message: :message',
- 'exception_trace' => 'Exception trace: :trace',
- 'exception_message_title' => 'Exception message',
- 'exception_trace_title' => 'Exception trace',
-
- 'backup_failed_subject' => 'Falha no backup da aplicação :application_name',
- 'backup_failed_body' => 'Importante: Ocorreu um erro ao executar o backup da aplicação :application_name',
-
- 'backup_successful_subject' => 'Backup realizado com sucesso: :application_name',
- 'backup_successful_subject_title' => 'Backup Realizado com Sucesso!',
- 'backup_successful_body' => 'Boas notícias, foi criado um novo backup no disco :disk_name referente à aplicação :application_name.',
-
- 'cleanup_failed_subject' => 'Falha na limpeza dos backups da aplicação :application_name.',
- 'cleanup_failed_body' => 'Ocorreu um erro ao executar a limpeza dos backups da aplicação :application_name',
-
- 'cleanup_successful_subject' => 'Limpeza dos backups da aplicação :application_name concluída!',
- 'cleanup_successful_subject_title' => 'Limpeza dos backups concluída!',
- 'cleanup_successful_body' => 'Concluída a limpeza dos backups da aplicação :application_name no disco :disk_name.',
-
- 'healthy_backup_found_subject' => 'Os backups da aplicação :application_name no disco :disk_name estão em dia',
- 'healthy_backup_found_subject_title' => 'Os backups da aplicação :application_name estão em dia',
- 'healthy_backup_found_body' => 'Os backups da aplicação :application_name estão em dia. Bom trabalho!',
-
- 'unhealthy_backup_found_subject' => 'Importante: Os backups da aplicação :application_name não estão em dia',
- 'unhealthy_backup_found_subject_title' => 'Importante: Os backups da aplicação :application_name não estão em dia. :problem',
- 'unhealthy_backup_found_body' => 'Os backups da aplicação :application_name no disco :disk_name não estão em dia.',
- 'unhealthy_backup_found_not_reachable' => 'O destino dos backups não pode ser alcançado. :error',
- 'unhealthy_backup_found_empty' => 'Não existem backups para essa aplicação.',
- 'unhealthy_backup_found_old' => 'O último backup realizado em :date é demasiado antigo.',
- 'unhealthy_backup_found_unknown' => 'Desculpe, impossível determinar a razão exata.',
- 'unhealthy_backup_found_full' => 'Os backups estão a utilizar demasiado espaço de armazenamento. A utilização atual é de :disk_usage, o que é maior que o limite permitido de :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/ro/notifications.php b/resources/lang/vendor/backup/ro/notifications.php
deleted file mode 100644
index cc0322db9..000000000
--- a/resources/lang/vendor/backup/ro/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Cu excepția mesajului: :message',
- 'exception_trace' => 'Urmă excepţie: :trace',
- 'exception_message_title' => 'Mesaj de excepție',
- 'exception_trace_title' => 'Urmă excepţie',
-
- 'backup_failed_subject' => 'Nu s-a putut face copie de rezervă pentru :application_name',
- 'backup_failed_body' => 'Important: A apărut o eroare în timpul generării copiei de rezervă pentru :application_name',
-
- 'backup_successful_subject' => 'Copie de rezervă efectuată cu succes pentru :application_name',
- 'backup_successful_subject_title' => 'O nouă copie de rezervă a fost efectuată cu succes!',
- 'backup_successful_body' => 'Vești bune, o nouă copie de rezervă pentru :application_name a fost creată cu succes pe discul cu numele :disk_name.',
-
- 'cleanup_failed_subject' => 'Curățarea copiilor de rezervă pentru :application_name nu a reușit.',
- 'cleanup_failed_body' => 'A apărut o eroare în timpul curățirii copiilor de rezervă pentru :application_name',
-
- 'cleanup_successful_subject' => 'Curățarea copiilor de rezervă pentru :application_name a fost făcută cu succes',
- 'cleanup_successful_subject_title' => 'Curățarea copiilor de rezervă a fost făcută cu succes!',
- 'cleanup_successful_body' => 'Curățarea copiilor de rezervă pentru :application_name de pe discul cu numele :disk_name a fost făcută cu succes.',
-
- 'healthy_backup_found_subject' => 'Copiile de rezervă pentru :application_name de pe discul :disk_name sunt în regulă',
- 'healthy_backup_found_subject_title' => 'Copiile de rezervă pentru :application_name sunt în regulă',
- 'healthy_backup_found_body' => 'Copiile de rezervă pentru :application_name sunt considerate în regulă. Bună treabă!',
-
- 'unhealthy_backup_found_subject' => 'Important: Copiile de rezervă pentru :application_name nu sunt în regulă',
- 'unhealthy_backup_found_subject_title' => 'Important: Copiile de rezervă pentru :application_name nu sunt în regulă. :problem',
- 'unhealthy_backup_found_body' => 'Copiile de rezervă pentru :application_name de pe discul :disk_name nu sunt în regulă.',
- 'unhealthy_backup_found_not_reachable' => 'Nu se poate ajunge la destinația copiilor de rezervă. :error',
- 'unhealthy_backup_found_empty' => 'Nu există copii de rezervă ale acestei aplicații.',
- 'unhealthy_backup_found_old' => 'Cea mai recentă copie de rezervă făcută la :date este considerată prea veche.',
- 'unhealthy_backup_found_unknown' => 'Ne pare rău, un motiv exact nu poate fi determinat.',
- 'unhealthy_backup_found_full' => 'Copiile de rezervă folosesc prea mult spațiu de stocare. Utilizarea curentă este de :disk_usage care este mai mare decât limita permisă de :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/ru/notifications.php b/resources/lang/vendor/backup/ru/notifications.php
deleted file mode 100644
index 875633c38..000000000
--- a/resources/lang/vendor/backup/ru/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Сообщение об ошибке: :message',
- 'exception_trace' => 'Сведения об ошибке: :trace',
- 'exception_message_title' => 'Сообщение об ошибке',
- 'exception_trace_title' => 'Сведения об ошибке',
-
- 'backup_failed_subject' => 'Не удалось сделать резервную копию :application_name',
- 'backup_failed_body' => 'Внимание: Произошла ошибка во время резервного копирования :application_name',
-
- 'backup_successful_subject' => 'Успешно создана новая резервная копия :application_name',
- 'backup_successful_subject_title' => 'Успешно создана новая резервная копия!',
- 'backup_successful_body' => 'Отличная новость, новая резервная копия :application_name успешно создана и сохранена на диск :disk_name.',
-
- 'cleanup_failed_subject' => 'Не удалось очистить резервные копии :application_name',
- 'cleanup_failed_body' => 'Произошла ошибка при очистке резервных копий :application_name',
-
- 'cleanup_successful_subject' => 'Очистка от резервных копий :application_name прошла успешно',
- 'cleanup_successful_subject_title' => 'Очистка резервных копий прошла удачно!',
- 'cleanup_successful_body' => 'Очистка от старых резервных копий :application_name на диске :disk_name прошла удачно.',
-
- 'healthy_backup_found_subject' => 'Резервная копия :application_name с диска :disk_name установлена',
- 'healthy_backup_found_subject_title' => 'Резервная копия :application_name установлена',
- 'healthy_backup_found_body' => 'Резервная копия :application_name успешно установлена. Хорошая работа!',
-
- 'unhealthy_backup_found_subject' => 'Внимание: резервная копия :application_name не установилась',
- 'unhealthy_backup_found_subject_title' => 'Внимание: резервная копия для :application_name не установилась. :problem',
- 'unhealthy_backup_found_body' => 'Резервная копия для :application_name на диске :disk_name не установилась.',
- 'unhealthy_backup_found_not_reachable' => 'Резервная копия не смогла установиться. :error',
- 'unhealthy_backup_found_empty' => 'Резервные копии для этого приложения отсутствуют.',
- 'unhealthy_backup_found_old' => 'Последнее резервное копирование создано :date является устаревшим.',
- 'unhealthy_backup_found_unknown' => 'Извините, точная причина не может быть определена.',
- 'unhealthy_backup_found_full' => 'Резервные копии используют слишком много памяти. Используется :disk_usage что выше допустимого предела: :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/tr/notifications.php b/resources/lang/vendor/backup/tr/notifications.php
deleted file mode 100644
index 298b0ec4d..000000000
--- a/resources/lang/vendor/backup/tr/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Hata mesajı: :message',
- 'exception_trace' => 'Hata izleri: :trace',
- 'exception_message_title' => 'Hata mesajı',
- 'exception_trace_title' => 'Hata izleri',
-
- 'backup_failed_subject' => 'Yedeklenemedi :application_name',
- 'backup_failed_body' => 'Önemli: Yedeklenirken bir hata oluştu :application_name',
-
- 'backup_successful_subject' => 'Başarılı :application_name yeni yedeklemesi',
- 'backup_successful_subject_title' => 'Başarılı bir yeni yedekleme!',
- 'backup_successful_body' => 'Harika bir haber, :application_name âit yeni bir yedekleme :disk_name adlı diskte başarıyla oluşturuldu.',
-
- 'cleanup_failed_subject' => ':application_name yedeklemeleri temizlenmesi başarısız.',
- 'cleanup_failed_body' => ':application_name yedeklerini temizlerken bir hata oluştu ',
-
- 'cleanup_successful_subject' => ':application_name yedeklemeleri temizlenmesi başarılı.',
- 'cleanup_successful_subject_title' => 'Yedeklerin temizlenmesi başarılı!',
- 'cleanup_successful_body' => ':application_name yedeklemeleri temizlenmesi ,:disk_name diskinden silindi',
-
- 'healthy_backup_found_subject' => ':application_name yedeklenmesi ,:disk_name adlı diskte sağlıklı',
- 'healthy_backup_found_subject_title' => ':application_name yedeklenmesi sağlıklı',
- 'healthy_backup_found_body' => ':application_name için yapılan yedeklemeler sağlıklı sayılır. Aferin!',
-
- 'unhealthy_backup_found_subject' => 'Önemli: :application_name için yedeklemeler sağlıksız',
- 'unhealthy_backup_found_subject_title' => 'Önemli: :application_name için yedeklemeler sağlıksız. :problem',
- 'unhealthy_backup_found_body' => 'Yedeklemeler: :application_name disk: :disk_name sağlıksız.',
- 'unhealthy_backup_found_not_reachable' => 'Yedekleme hedefine ulaşılamıyor. :error',
- 'unhealthy_backup_found_empty' => 'Bu uygulamanın yedekleri yok.',
- 'unhealthy_backup_found_old' => ':date tarihinde yapılan en son yedekleme çok eski kabul ediliyor.',
- 'unhealthy_backup_found_unknown' => 'Üzgünüm, kesin bir sebep belirlenemiyor.',
- 'unhealthy_backup_found_full' => 'Yedeklemeler çok fazla depolama alanı kullanıyor. Şu anki kullanım: :disk_usage, izin verilen sınırdan yüksek: :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/uk/notifications.php b/resources/lang/vendor/backup/uk/notifications.php
deleted file mode 100644
index a39c90a25..000000000
--- a/resources/lang/vendor/backup/uk/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- 'Повідомлення про помилку: :message',
- 'exception_trace' => 'Деталі помилки: :trace',
- 'exception_message_title' => 'Повідомлення помилки',
- 'exception_trace_title' => 'Деталі помилки',
-
- 'backup_failed_subject' => 'Не вдалось зробити резервну копію :application_name',
- 'backup_failed_body' => 'Увага: Трапилась помилка під час резервного копіювання :application_name',
-
- 'backup_successful_subject' => 'Успішне резервне копіювання :application_name',
- 'backup_successful_subject_title' => 'Успішно створена резервна копія!',
- 'backup_successful_body' => 'Чудова новина, нова резервна копія :application_name успішно створена і збережена на диск :disk_name.',
-
- 'cleanup_failed_subject' => 'Не вдалось очистити резервні копії :application_name',
- 'cleanup_failed_body' => 'Сталася помилка під час очищення резервних копій :application_name',
-
- 'cleanup_successful_subject' => 'Успішне очищення від резервних копій :application_name',
- 'cleanup_successful_subject_title' => 'Очищення резервних копій пройшло вдало!',
- 'cleanup_successful_body' => 'Очищенно від старих резервних копій :application_name на диску :disk_name пойшло успішно.',
-
- 'healthy_backup_found_subject' => 'Резервна копія :application_name з диску :disk_name установлена',
- 'healthy_backup_found_subject_title' => 'Резервна копія :application_name установлена',
- 'healthy_backup_found_body' => 'Резервна копія :application_name успішно установлена. Хороша робота!',
-
- 'unhealthy_backup_found_subject' => 'Увага: резервна копія :application_name не установилась',
- 'unhealthy_backup_found_subject_title' => 'Увага: резервна копія для :application_name не установилась. :problem',
- 'unhealthy_backup_found_body' => 'Резервна копія для :application_name на диску :disk_name не установилась.',
- 'unhealthy_backup_found_not_reachable' => 'Резервна копія не змогла установитись. :error',
- 'unhealthy_backup_found_empty' => 'Резервні копії для цього додатку відсутні.',
- 'unhealthy_backup_found_old' => 'Останнє резервне копіювання створено :date є застарілим.',
- 'unhealthy_backup_found_unknown' => 'Вибачте, але ми не змогли визначити точну причину.',
- 'unhealthy_backup_found_full' => 'Резервні копії використовують занадто багато пам`яті. Використовується :disk_usage що вище за допустиму межу :disk_limit.',
-];
diff --git a/resources/lang/vendor/backup/zh-CN/notifications.php b/resources/lang/vendor/backup/zh-CN/notifications.php
deleted file mode 100644
index bbab325df..000000000
--- a/resources/lang/vendor/backup/zh-CN/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- '异常信息: :message',
- 'exception_trace' => '异常跟踪: :trace',
- 'exception_message_title' => '异常信息',
- 'exception_trace_title' => '异常跟踪',
-
- 'backup_failed_subject' => ':application_name 备份失败',
- 'backup_failed_body' => '重要说明:备份 :application_name 时发生错误',
-
- 'backup_successful_subject' => ':application_name 备份成功',
- 'backup_successful_subject_title' => '备份成功!',
- 'backup_successful_body' => '好消息, :application_name 备份成功,位于磁盘 :disk_name 中。',
-
- 'cleanup_failed_subject' => '清除 :application_name 的备份失败。',
- 'cleanup_failed_body' => '清除备份 :application_name 时发生错误',
-
- 'cleanup_successful_subject' => '成功清除 :application_name 的备份',
- 'cleanup_successful_subject_title' => '成功清除备份!',
- 'cleanup_successful_body' => '成功清除 :disk_name 磁盘上 :application_name 的备份。',
-
- 'healthy_backup_found_subject' => ':disk_name 磁盘上 :application_name 的备份是健康的',
- 'healthy_backup_found_subject_title' => ':application_name 的备份是健康的',
- 'healthy_backup_found_body' => ':application_name 的备份是健康的。干的好!',
-
- 'unhealthy_backup_found_subject' => '重要说明::application_name 的备份不健康',
- 'unhealthy_backup_found_subject_title' => '重要说明::application_name 备份不健康。 :problem',
- 'unhealthy_backup_found_body' => ':disk_name 磁盘上 :application_name 的备份不健康。',
- 'unhealthy_backup_found_not_reachable' => '无法访问备份目标。 :error',
- 'unhealthy_backup_found_empty' => '根本没有此应用程序的备份。',
- 'unhealthy_backup_found_old' => '最近的备份创建于 :date ,太旧了。',
- 'unhealthy_backup_found_unknown' => '对不起,确切原因无法确定。',
- 'unhealthy_backup_found_full' => '备份占用了太多存储空间。当前占用了 :disk_usage ,高于允许的限制 :disk_limit。',
-];
diff --git a/resources/lang/vendor/backup/zh-TW/notifications.php b/resources/lang/vendor/backup/zh-TW/notifications.php
deleted file mode 100644
index be561c480..000000000
--- a/resources/lang/vendor/backup/zh-TW/notifications.php
+++ /dev/null
@@ -1,35 +0,0 @@
- '異常訊息: :message',
- 'exception_trace' => '異常追蹤: :trace',
- 'exception_message_title' => '異常訊息',
- 'exception_trace_title' => '異常追蹤',
-
- 'backup_failed_subject' => ':application_name 備份失敗',
- 'backup_failed_body' => '重要說明:備份 :application_name 時發生錯誤',
-
- 'backup_successful_subject' => ':application_name 備份成功',
- 'backup_successful_subject_title' => '備份成功!',
- 'backup_successful_body' => '好消息, :application_name 備份成功,位於磁盤 :disk_name 中。',
-
- 'cleanup_failed_subject' => '清除 :application_name 的備份失敗。',
- 'cleanup_failed_body' => '清除備份 :application_name 時發生錯誤',
-
- 'cleanup_successful_subject' => '成功清除 :application_name 的備份',
- 'cleanup_successful_subject_title' => '成功清除備份!',
- 'cleanup_successful_body' => '成功清除 :disk_name 磁盤上 :application_name 的備份。',
-
- 'healthy_backup_found_subject' => ':disk_name 磁盤上 :application_name 的備份是健康的',
- 'healthy_backup_found_subject_title' => ':application_name 的備份是健康的',
- 'healthy_backup_found_body' => ':application_name 的備份是健康的。幹的好!',
-
- 'unhealthy_backup_found_subject' => '重要說明::application_name 的備份不健康',
- 'unhealthy_backup_found_subject_title' => '重要說明::application_name 備份不健康。 :problem',
- 'unhealthy_backup_found_body' => ':disk_name 磁盤上 :application_name 的備份不健康。',
- 'unhealthy_backup_found_not_reachable' => '無法訪問備份目標。 :error',
- 'unhealthy_backup_found_empty' => '根本沒有此應用程序的備份。',
- 'unhealthy_backup_found_old' => '最近的備份創建於 :date ,太舊了。',
- 'unhealthy_backup_found_unknown' => '對不起,確切原因無法確定。',
- 'unhealthy_backup_found_full' => '備份佔用了太多存儲空間。當前佔用了 :disk_usage ,高於允許的限制 :disk_limit。',
-];
diff --git a/resources/old_js/app.js b/resources/old_js/app.js
new file mode 100644
index 000000000..0568a0aa7
--- /dev/null
+++ b/resources/old_js/app.js
@@ -0,0 +1,53 @@
+import '../js/bootstrap.js';
+import '../css/app.css';
+
+import Vue from 'vue';
+import store from './store';
+import VueRouter from 'vue-router';
+import router from './routes';
+import i18n from './i18n';
+import VueLocalStorage from 'vue-localstorage';
+import VueSweetalert2 from 'vue-sweetalert2';
+import 'sweetalert2/dist/sweetalert2.min.css';
+import VueToastify from 'vue-toastify';
+import VueNumber from 'vue-number-animation';
+import VueEcho from 'vue-echo-laravel';
+import Buefy from 'buefy';
+import fullscreen from 'vue-fullscreen';
+import LaravelPermissionToVueJS from './extra/laravel-permission-to-vuejs';
+
+import VueImg from 'v-img';
+import VueTypedJs from 'vue-typed-js'
+
+import RootContainer from './views/RootContainer.vue';
+
+Vue.use(Buefy);
+Vue.use(VueRouter);
+Vue.use(VueLocalStorage);
+Vue.use(VueSweetalert2);
+Vue.use(VueToastify, {
+ theme: 'dark',
+ errorDuration: 5000,
+});
+// Vue.use(VueMask)
+Vue.use(VueNumber);
+Vue.use(VueEcho, window.Echo);
+Vue.use(fullscreen);
+Vue.use(VueImg);
+Vue.use(VueTypedJs);
+Vue.use(LaravelPermissionToVueJS);
+
+// Format a number with commas: "10,000"
+Vue.filter('commas', value => {
+ return parseInt(value).toLocaleString();
+});
+
+const vm = new Vue({
+ el: '#app',
+ store,
+ router,
+ i18n,
+ components: {
+ RootContainer
+ }
+});
diff --git a/resources/old_js/assets/IMG_0286.JPG b/resources/old_js/assets/IMG_0286.JPG
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/IMG_0554.jpg b/resources/old_js/assets/IMG_0554.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/IMG_0556.jpg b/resources/old_js/assets/IMG_0556.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/OLM_Logo.jpg b/resources/old_js/assets/OLM_Logo.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/about/facemask-map.png b/resources/old_js/assets/about/facemask-map.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/about/facemask-tag.png b/resources/old_js/assets/about/facemask-tag.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/about/iphone.png b/resources/old_js/assets/about/iphone.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/bird-plastic.jpg b/resources/old_js/assets/bird-plastic.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/butts.jpg b/resources/old_js/assets/butts.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/cigbutt.png b/resources/old_js/assets/cigbutt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/cigbutts.jpg b/resources/old_js/assets/cigbutts.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/cigbutts_jar.jpg b/resources/old_js/assets/cigbutts_jar.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/climate_pollution.jpg b/resources/old_js/assets/climate_pollution.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/Cork.png b/resources/old_js/assets/confirm/Cork.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/fb-hex-icon.png b/resources/old_js/assets/confirm/fb-hex-icon.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/insta-hex-icon.png b/resources/old_js/assets/confirm/insta-hex-icon.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/logo-1.jpg b/resources/old_js/assets/confirm/logo-1.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/olm-hex-map.png b/resources/old_js/assets/confirm/olm-hex-map.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/olm-logo-1.png b/resources/old_js/assets/confirm/olm-logo-1.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/olm-logo-2.png b/resources/old_js/assets/confirm/olm-logo-2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/phone-litter.png b/resources/old_js/assets/confirm/phone-litter.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/phone-map.png b/resources/old_js/assets/confirm/phone-map.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/phone-upload.png b/resources/old_js/assets/confirm/phone-upload.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/pin-1.png b/resources/old_js/assets/confirm/pin-1.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/twitter-hex-icon.png b/resources/old_js/assets/confirm/twitter-hex-icon.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/confirm/world-map.png b/resources/old_js/assets/confirm/world-map.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/dog.jpeg b/resources/old_js/assets/dog.jpeg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/forest_fire.jpg b/resources/old_js/assets/forest_fire.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/gofundme-brand-logo.png b/resources/old_js/assets/gofundme-brand-logo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/graphic_map.png b/resources/old_js/assets/graphic_map.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/graphic_rocket.png b/resources/old_js/assets/graphic_rocket.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/grass.jpg b/resources/old_js/assets/grass.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/android.png b/resources/old_js/assets/icons/android.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/bronze-medal-2.png b/resources/old_js/assets/icons/bronze-medal-2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/bronze-medal.svg b/resources/old_js/assets/icons/bronze-medal.svg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/camera.png b/resources/old_js/assets/icons/camera.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/facebook.png b/resources/old_js/assets/icons/facebook.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/facebook2.png b/resources/old_js/assets/icons/facebook2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ad.png b/resources/old_js/assets/icons/flags/ad.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ae.png b/resources/old_js/assets/icons/flags/ae.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/af.png b/resources/old_js/assets/icons/flags/af.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ag.png b/resources/old_js/assets/icons/flags/ag.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ai.png b/resources/old_js/assets/icons/flags/ai.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/al.png b/resources/old_js/assets/icons/flags/al.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/am.png b/resources/old_js/assets/icons/flags/am.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/an.png b/resources/old_js/assets/icons/flags/an.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ao.png b/resources/old_js/assets/icons/flags/ao.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/aq.png b/resources/old_js/assets/icons/flags/aq.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ar.png b/resources/old_js/assets/icons/flags/ar.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/as.png b/resources/old_js/assets/icons/flags/as.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/at.png b/resources/old_js/assets/icons/flags/at.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/au.png b/resources/old_js/assets/icons/flags/au.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/aw.png b/resources/old_js/assets/icons/flags/aw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ax.png b/resources/old_js/assets/icons/flags/ax.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/az.png b/resources/old_js/assets/icons/flags/az.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ba.png b/resources/old_js/assets/icons/flags/ba.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bb.png b/resources/old_js/assets/icons/flags/bb.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bd.png b/resources/old_js/assets/icons/flags/bd.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/be.png b/resources/old_js/assets/icons/flags/be.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bf.png b/resources/old_js/assets/icons/flags/bf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bg.png b/resources/old_js/assets/icons/flags/bg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bh.png b/resources/old_js/assets/icons/flags/bh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bi.png b/resources/old_js/assets/icons/flags/bi.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bj.png b/resources/old_js/assets/icons/flags/bj.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bl.png b/resources/old_js/assets/icons/flags/bl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bm.png b/resources/old_js/assets/icons/flags/bm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bn.png b/resources/old_js/assets/icons/flags/bn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bo.png b/resources/old_js/assets/icons/flags/bo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bq.png b/resources/old_js/assets/icons/flags/bq.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/br.png b/resources/old_js/assets/icons/flags/br.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bs.png b/resources/old_js/assets/icons/flags/bs.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bt.png b/resources/old_js/assets/icons/flags/bt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bv.png b/resources/old_js/assets/icons/flags/bv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bw.png b/resources/old_js/assets/icons/flags/bw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/by.png b/resources/old_js/assets/icons/flags/by.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/bz.png b/resources/old_js/assets/icons/flags/bz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ca.png b/resources/old_js/assets/icons/flags/ca.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cc.png b/resources/old_js/assets/icons/flags/cc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cd.png b/resources/old_js/assets/icons/flags/cd.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cf.png b/resources/old_js/assets/icons/flags/cf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cg.png b/resources/old_js/assets/icons/flags/cg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ch.png b/resources/old_js/assets/icons/flags/ch.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ci.png b/resources/old_js/assets/icons/flags/ci.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ck.png b/resources/old_js/assets/icons/flags/ck.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cl.png b/resources/old_js/assets/icons/flags/cl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cm.png b/resources/old_js/assets/icons/flags/cm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cn.png b/resources/old_js/assets/icons/flags/cn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/co.png b/resources/old_js/assets/icons/flags/co.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cr.png b/resources/old_js/assets/icons/flags/cr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cu.png b/resources/old_js/assets/icons/flags/cu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cv.png b/resources/old_js/assets/icons/flags/cv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cw.png b/resources/old_js/assets/icons/flags/cw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cx.png b/resources/old_js/assets/icons/flags/cx.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cy.png b/resources/old_js/assets/icons/flags/cy.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/cz.png b/resources/old_js/assets/icons/flags/cz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/de.png b/resources/old_js/assets/icons/flags/de.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/dj.png b/resources/old_js/assets/icons/flags/dj.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/dk.png b/resources/old_js/assets/icons/flags/dk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/dm.png b/resources/old_js/assets/icons/flags/dm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/do.png b/resources/old_js/assets/icons/flags/do.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/dz.png b/resources/old_js/assets/icons/flags/dz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ec.png b/resources/old_js/assets/icons/flags/ec.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ee.png b/resources/old_js/assets/icons/flags/ee.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/eg.png b/resources/old_js/assets/icons/flags/eg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/eh.png b/resources/old_js/assets/icons/flags/eh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/er.png b/resources/old_js/assets/icons/flags/er.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/es.png b/resources/old_js/assets/icons/flags/es.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/et.png b/resources/old_js/assets/icons/flags/et.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/eu.png b/resources/old_js/assets/icons/flags/eu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fi.png b/resources/old_js/assets/icons/flags/fi.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fj.png b/resources/old_js/assets/icons/flags/fj.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fk.png b/resources/old_js/assets/icons/flags/fk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fm.png b/resources/old_js/assets/icons/flags/fm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fo.png b/resources/old_js/assets/icons/flags/fo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/fr.png b/resources/old_js/assets/icons/flags/fr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ga.png b/resources/old_js/assets/icons/flags/ga.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gb-eng.png b/resources/old_js/assets/icons/flags/gb-eng.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gb-nir.png b/resources/old_js/assets/icons/flags/gb-nir.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gb-sct.png b/resources/old_js/assets/icons/flags/gb-sct.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gb-wls.png b/resources/old_js/assets/icons/flags/gb-wls.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gb.png b/resources/old_js/assets/icons/flags/gb.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gd.png b/resources/old_js/assets/icons/flags/gd.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ge.png b/resources/old_js/assets/icons/flags/ge.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gf.png b/resources/old_js/assets/icons/flags/gf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gg.png b/resources/old_js/assets/icons/flags/gg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gh.png b/resources/old_js/assets/icons/flags/gh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gi.png b/resources/old_js/assets/icons/flags/gi.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gl.png b/resources/old_js/assets/icons/flags/gl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gm.png b/resources/old_js/assets/icons/flags/gm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gn.png b/resources/old_js/assets/icons/flags/gn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gp.png b/resources/old_js/assets/icons/flags/gp.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gq.png b/resources/old_js/assets/icons/flags/gq.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gr.png b/resources/old_js/assets/icons/flags/gr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gs.png b/resources/old_js/assets/icons/flags/gs.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gt.png b/resources/old_js/assets/icons/flags/gt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gu.png b/resources/old_js/assets/icons/flags/gu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gw.png b/resources/old_js/assets/icons/flags/gw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/gy.png b/resources/old_js/assets/icons/flags/gy.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/hk.png b/resources/old_js/assets/icons/flags/hk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/hm.png b/resources/old_js/assets/icons/flags/hm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/hn.png b/resources/old_js/assets/icons/flags/hn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/hr.png b/resources/old_js/assets/icons/flags/hr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ht.png b/resources/old_js/assets/icons/flags/ht.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/hu.png b/resources/old_js/assets/icons/flags/hu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/id.png b/resources/old_js/assets/icons/flags/id.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ie.png b/resources/old_js/assets/icons/flags/ie.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/il.png b/resources/old_js/assets/icons/flags/il.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/im.png b/resources/old_js/assets/icons/flags/im.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/in.png b/resources/old_js/assets/icons/flags/in.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/io.png b/resources/old_js/assets/icons/flags/io.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/iq.png b/resources/old_js/assets/icons/flags/iq.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ir.png b/resources/old_js/assets/icons/flags/ir.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/is.png b/resources/old_js/assets/icons/flags/is.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/it.png b/resources/old_js/assets/icons/flags/it.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/je.png b/resources/old_js/assets/icons/flags/je.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/jm.png b/resources/old_js/assets/icons/flags/jm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/jo.png b/resources/old_js/assets/icons/flags/jo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/jp.png b/resources/old_js/assets/icons/flags/jp.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ke.png b/resources/old_js/assets/icons/flags/ke.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kg.png b/resources/old_js/assets/icons/flags/kg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kh.png b/resources/old_js/assets/icons/flags/kh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ki.png b/resources/old_js/assets/icons/flags/ki.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/km.png b/resources/old_js/assets/icons/flags/km.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kn.png b/resources/old_js/assets/icons/flags/kn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kp.png b/resources/old_js/assets/icons/flags/kp.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kr.png b/resources/old_js/assets/icons/flags/kr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kw.png b/resources/old_js/assets/icons/flags/kw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ky.png b/resources/old_js/assets/icons/flags/ky.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/kz.png b/resources/old_js/assets/icons/flags/kz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/la.png b/resources/old_js/assets/icons/flags/la.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lb.png b/resources/old_js/assets/icons/flags/lb.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lc.png b/resources/old_js/assets/icons/flags/lc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/li.png b/resources/old_js/assets/icons/flags/li.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lk.png b/resources/old_js/assets/icons/flags/lk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lr.png b/resources/old_js/assets/icons/flags/lr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ls.png b/resources/old_js/assets/icons/flags/ls.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lt.png b/resources/old_js/assets/icons/flags/lt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lu.png b/resources/old_js/assets/icons/flags/lu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/lv.png b/resources/old_js/assets/icons/flags/lv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ly.png b/resources/old_js/assets/icons/flags/ly.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ma.png b/resources/old_js/assets/icons/flags/ma.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mc.png b/resources/old_js/assets/icons/flags/mc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/md.png b/resources/old_js/assets/icons/flags/md.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/me.png b/resources/old_js/assets/icons/flags/me.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mf.png b/resources/old_js/assets/icons/flags/mf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mg.png b/resources/old_js/assets/icons/flags/mg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mh.png b/resources/old_js/assets/icons/flags/mh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mk.png b/resources/old_js/assets/icons/flags/mk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ml.png b/resources/old_js/assets/icons/flags/ml.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mm.png b/resources/old_js/assets/icons/flags/mm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mn.png b/resources/old_js/assets/icons/flags/mn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mo.png b/resources/old_js/assets/icons/flags/mo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mp.png b/resources/old_js/assets/icons/flags/mp.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mq.png b/resources/old_js/assets/icons/flags/mq.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mr.png b/resources/old_js/assets/icons/flags/mr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ms.png b/resources/old_js/assets/icons/flags/ms.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mt.png b/resources/old_js/assets/icons/flags/mt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mu.png b/resources/old_js/assets/icons/flags/mu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mv.png b/resources/old_js/assets/icons/flags/mv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mw.png b/resources/old_js/assets/icons/flags/mw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mx.png b/resources/old_js/assets/icons/flags/mx.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/my.png b/resources/old_js/assets/icons/flags/my.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/mz.png b/resources/old_js/assets/icons/flags/mz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/na.png b/resources/old_js/assets/icons/flags/na.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nc.png b/resources/old_js/assets/icons/flags/nc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ne.png b/resources/old_js/assets/icons/flags/ne.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nf.png b/resources/old_js/assets/icons/flags/nf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ng.png b/resources/old_js/assets/icons/flags/ng.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ni.png b/resources/old_js/assets/icons/flags/ni.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nl.png b/resources/old_js/assets/icons/flags/nl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/no.png b/resources/old_js/assets/icons/flags/no.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/np.png b/resources/old_js/assets/icons/flags/np.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nr.png b/resources/old_js/assets/icons/flags/nr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nu.png b/resources/old_js/assets/icons/flags/nu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/nz.png b/resources/old_js/assets/icons/flags/nz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/om.png b/resources/old_js/assets/icons/flags/om.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pa.png b/resources/old_js/assets/icons/flags/pa.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pe.png b/resources/old_js/assets/icons/flags/pe.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pf.png b/resources/old_js/assets/icons/flags/pf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pg.png b/resources/old_js/assets/icons/flags/pg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ph.png b/resources/old_js/assets/icons/flags/ph.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pk.png b/resources/old_js/assets/icons/flags/pk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pl.png b/resources/old_js/assets/icons/flags/pl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pm.png b/resources/old_js/assets/icons/flags/pm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pn.png b/resources/old_js/assets/icons/flags/pn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pr.png b/resources/old_js/assets/icons/flags/pr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ps.png b/resources/old_js/assets/icons/flags/ps.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pt.png b/resources/old_js/assets/icons/flags/pt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/pw.png b/resources/old_js/assets/icons/flags/pw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/py.png b/resources/old_js/assets/icons/flags/py.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/qa.png b/resources/old_js/assets/icons/flags/qa.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/re.png b/resources/old_js/assets/icons/flags/re.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ro.png b/resources/old_js/assets/icons/flags/ro.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/rs.png b/resources/old_js/assets/icons/flags/rs.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ru.png b/resources/old_js/assets/icons/flags/ru.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/rw.png b/resources/old_js/assets/icons/flags/rw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sa.png b/resources/old_js/assets/icons/flags/sa.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sb.png b/resources/old_js/assets/icons/flags/sb.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sc.png b/resources/old_js/assets/icons/flags/sc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sd.png b/resources/old_js/assets/icons/flags/sd.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/se.png b/resources/old_js/assets/icons/flags/se.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sg.png b/resources/old_js/assets/icons/flags/sg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sh.png b/resources/old_js/assets/icons/flags/sh.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/si.png b/resources/old_js/assets/icons/flags/si.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sj.png b/resources/old_js/assets/icons/flags/sj.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sk.png b/resources/old_js/assets/icons/flags/sk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sl.png b/resources/old_js/assets/icons/flags/sl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sm.png b/resources/old_js/assets/icons/flags/sm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sn.png b/resources/old_js/assets/icons/flags/sn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/so.png b/resources/old_js/assets/icons/flags/so.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sr.png b/resources/old_js/assets/icons/flags/sr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ss.png b/resources/old_js/assets/icons/flags/ss.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/st.png b/resources/old_js/assets/icons/flags/st.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sv.png b/resources/old_js/assets/icons/flags/sv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sx.png b/resources/old_js/assets/icons/flags/sx.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sy.png b/resources/old_js/assets/icons/flags/sy.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/sz.png b/resources/old_js/assets/icons/flags/sz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tc.png b/resources/old_js/assets/icons/flags/tc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/td.png b/resources/old_js/assets/icons/flags/td.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tf.png b/resources/old_js/assets/icons/flags/tf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tg.png b/resources/old_js/assets/icons/flags/tg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/th.png b/resources/old_js/assets/icons/flags/th.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tj.png b/resources/old_js/assets/icons/flags/tj.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tk.png b/resources/old_js/assets/icons/flags/tk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tl.png b/resources/old_js/assets/icons/flags/tl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tm.png b/resources/old_js/assets/icons/flags/tm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tn.png b/resources/old_js/assets/icons/flags/tn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/to.png b/resources/old_js/assets/icons/flags/to.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tr.png b/resources/old_js/assets/icons/flags/tr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tt.png b/resources/old_js/assets/icons/flags/tt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tv.png b/resources/old_js/assets/icons/flags/tv.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tw.png b/resources/old_js/assets/icons/flags/tw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/tz.png b/resources/old_js/assets/icons/flags/tz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ua.png b/resources/old_js/assets/icons/flags/ua.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ug.png b/resources/old_js/assets/icons/flags/ug.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/um.png b/resources/old_js/assets/icons/flags/um.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/us.png b/resources/old_js/assets/icons/flags/us.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/uy.png b/resources/old_js/assets/icons/flags/uy.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/uz.png b/resources/old_js/assets/icons/flags/uz.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/va.png b/resources/old_js/assets/icons/flags/va.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/vc.png b/resources/old_js/assets/icons/flags/vc.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ve.png b/resources/old_js/assets/icons/flags/ve.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/vg.png b/resources/old_js/assets/icons/flags/vg.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/vi.png b/resources/old_js/assets/icons/flags/vi.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/vn.png b/resources/old_js/assets/icons/flags/vn.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/vu.png b/resources/old_js/assets/icons/flags/vu.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/wf.png b/resources/old_js/assets/icons/flags/wf.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ws.png b/resources/old_js/assets/icons/flags/ws.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/xk.png b/resources/old_js/assets/icons/flags/xk.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/ye.png b/resources/old_js/assets/icons/flags/ye.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/yt.png b/resources/old_js/assets/icons/flags/yt.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/za.png b/resources/old_js/assets/icons/flags/za.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/zm.png b/resources/old_js/assets/icons/flags/zm.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/flags/zw.png b/resources/old_js/assets/icons/flags/zw.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/public/build/assets/gold-medal-2-DT1ucjbO.png b/resources/old_js/assets/icons/gold-medal-2.png
similarity index 100%
rename from public/build/assets/gold-medal-2-DT1ucjbO.png
rename to resources/old_js/assets/icons/gold-medal-2.png
diff --git a/resources/old_js/assets/icons/gold-medal.png b/resources/old_js/assets/icons/gold-medal.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/home/camera.png b/resources/old_js/assets/icons/home/camera.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/home/microscope.png b/resources/old_js/assets/icons/home/microscope.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/home/phone.png b/resources/old_js/assets/icons/home/phone.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/home/tree.png b/resources/old_js/assets/icons/home/tree.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/home/world.png b/resources/old_js/assets/icons/home/world.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/ig2.png b/resources/old_js/assets/icons/ig2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/insta.png b/resources/old_js/assets/icons/insta.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/ios.png b/resources/old_js/assets/icons/ios.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/littercoin/eternl.png b/resources/old_js/assets/icons/littercoin/eternl.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/littercoin/nami.png b/resources/old_js/assets/icons/littercoin/nami.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/mining.png b/resources/old_js/assets/icons/mining.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/reddit.png b/resources/old_js/assets/icons/reddit.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/silver-medal-2.png b/resources/old_js/assets/icons/silver-medal-2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/silver-medal.png b/resources/old_js/assets/icons/silver-medal.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/tumblr.png b/resources/old_js/assets/icons/tumblr.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/twitter.png b/resources/old_js/assets/icons/twitter.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/icons/twitter2.png b/resources/old_js/assets/icons/twitter2.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/images/checkmark.png b/resources/old_js/assets/images/checkmark.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/images/waiting.png b/resources/old_js/assets/images/waiting.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/littercoin/launched.png b/resources/old_js/assets/littercoin/launched.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/littercoin/launching-soon.png b/resources/old_js/assets/littercoin/launching-soon.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/js/assets/littercoin/lcValidator.hl b/resources/old_js/assets/littercoin/lcValidator.hl
similarity index 100%
rename from resources/js/assets/littercoin/lcValidator.hl
rename to resources/old_js/assets/littercoin/lcValidator.hl
diff --git a/resources/old_js/assets/littercoin/pick-up-litter.jpeg b/resources/old_js/assets/littercoin/pick-up-litter.jpeg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/littermap.png b/resources/old_js/assets/littermap.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/logo-white.png b/resources/old_js/assets/logo-white.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/logo.png b/resources/old_js/assets/logo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/logo_small.png b/resources/old_js/assets/logo_small.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/marinelitter.jpg b/resources/old_js/assets/marinelitter.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8188.jpg b/resources/old_js/assets/memes/IMG_8188.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8189.jpg b/resources/old_js/assets/memes/IMG_8189.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8190.jpg b/resources/old_js/assets/memes/IMG_8190.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8191.jpg b/resources/old_js/assets/memes/IMG_8191.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8192.jpg b/resources/old_js/assets/memes/IMG_8192.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8193.jpg b/resources/old_js/assets/memes/IMG_8193.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8194.jpg b/resources/old_js/assets/memes/IMG_8194.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8195.jpg b/resources/old_js/assets/memes/IMG_8195.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/IMG_8196.jpg b/resources/old_js/assets/memes/IMG_8196.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/memes/image.png b/resources/old_js/assets/memes/image.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/microplastics_oranmore.jpg b/resources/old_js/assets/microplastics_oranmore.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/nlbrands.png b/resources/old_js/assets/nlbrands.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/olm_dissertation_result.PNG b/resources/old_js/assets/olm_dissertation_result.PNG
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/pexels-photo-3735156.jpeg b/resources/old_js/assets/pexels-photo-3735156.jpeg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/plastic_bottles.jpg b/resources/old_js/assets/plastic_bottles.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/slack-brand-logo.png b/resources/old_js/assets/slack-brand-logo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/slack-screenshot.png b/resources/old_js/assets/slack-screenshot.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/spatial_analysis.png b/resources/old_js/assets/spatial_analysis.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/splash.png b/resources/old_js/assets/splash.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/urban.jpg b/resources/old_js/assets/urban.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/verified.jpg b/resources/old_js/assets/verified.jpg
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/old_js/assets/zoom-brand-logo.png b/resources/old_js/assets/zoom-brand-logo.png
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/js/components/Admin/Bbox/BrandsBox.vue b/resources/old_js/components/Admin/Bbox/BrandsBox.vue
similarity index 100%
rename from resources/js/components/Admin/Bbox/BrandsBox.vue
rename to resources/old_js/components/Admin/Bbox/BrandsBox.vue
diff --git a/resources/js/components/Admin/Boxes.vue b/resources/old_js/components/Admin/Boxes.vue
similarity index 100%
rename from resources/js/components/Admin/Boxes.vue
rename to resources/old_js/components/Admin/Boxes.vue
diff --git a/resources/js/components/AdminAdd.vue b/resources/old_js/components/AdminAdd.vue
similarity index 81%
rename from resources/js/components/AdminAdd.vue
rename to resources/old_js/components/AdminAdd.vue
index 34b0fc1f1..ab206a9da 100644
--- a/resources/js/components/AdminAdd.vue
+++ b/resources/old_js/components/AdminAdd.vue
@@ -21,7 +21,7 @@
@@ -29,7 +29,7 @@
@@ -41,7 +41,7 @@
** - Todo: Make this dynamic for all languages ===
* - right now we only need verification in English
*/
-// eg - import { this.locale } from './langs/' . { this.locale } . 'js';
+// eg - import { this.locale } from './langs/' . { this.locale } . 'old_js';
import { en } from './langs/en.js';
export default {
@@ -60,15 +60,15 @@ export default {
quantity: 1,
submitting: false,
integers: [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
- 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100
],
};
@@ -95,13 +95,13 @@ export default {
// Need the Key "Smoking" when Value = "Fumar"
// let reverse;
// if (this.lang == "en") reverse = this.category;
- this.$store.commit('addItem', {
+ this.$store.commit('addItem', {
category: this.category,
item: this.item,
quantity: this.quantity,
reverse: this.category // change this to reverse for multi-lang
});
-
+
this.quantity = 1;
},
},
@@ -123,28 +123,28 @@ export default {
},
/**
- *
+ *
*/
catnames () {
return this.$store.state.litter.categoryNames;
},
/**
- *
+ *
*/
checkDecr () {
return this.quantity == 0 ? true : false;
},
-
+
/**
- *
+ *
*/
checkIncr () {
return this.quantity == 100 ? true : false;
},
- /**
- * Get / Set the current item
+ /**
+ * Get / Set the current item
*/
item: {
get () {
@@ -156,7 +156,7 @@ export default {
},
/**
- *
+ *
*/
items () {
return this.$store.state.litter.items;
@@ -164,7 +164,7 @@ export default {
/**
- *
+ *
*/
lang: {
set () {
@@ -175,26 +175,26 @@ export default {
}
},
- /**
- * Get / Set the items for the current language
+ /**
+ * Get / Set the items for the current language
*/
litterlang () {
return this.$store.state.litter.litterlang;
},
/**
- *
+ *
*/
presence () {
return this.$store.state.litter.presence;
},
/**
- *
+ *
*/
stuff () {
return this.$store.state.litter.stuff;
}
}
}
-
\ No newline at end of file
+
diff --git a/resources/js/components/AdminItems.vue b/resources/old_js/components/AdminItems.vue
similarity index 100%
rename from resources/js/components/AdminItems.vue
rename to resources/old_js/components/AdminItems.vue
diff --git a/resources/js/components/AdminUserGraph.vue b/resources/old_js/components/AdminUserGraph.vue
similarity index 100%
rename from resources/js/components/AdminUserGraph.vue
rename to resources/old_js/components/AdminUserGraph.vue
diff --git a/resources/js/components/AmazonS3.vue b/resources/old_js/components/AmazonS3.vue
similarity index 100%
rename from resources/js/components/AmazonS3.vue
rename to resources/old_js/components/AmazonS3.vue
diff --git a/resources/js/components/AnonymousPresence.vue b/resources/old_js/components/AnonymousPresence.vue
similarity index 100%
rename from resources/js/components/AnonymousPresence.vue
rename to resources/old_js/components/AnonymousPresence.vue
diff --git a/resources/js/components/BecomeAPartner.vue b/resources/old_js/components/BecomeAPartner.vue
similarity index 100%
rename from resources/js/components/BecomeAPartner.vue
rename to resources/old_js/components/BecomeAPartner.vue
diff --git a/resources/js/components/Charts/Radar.vue b/resources/old_js/components/Charts/Radar.vue
similarity index 100%
rename from resources/js/components/Charts/Radar.vue
rename to resources/old_js/components/Charts/Radar.vue
diff --git a/resources/js/components/Charts/TimeSeriesLine.vue b/resources/old_js/components/Charts/TimeSeriesLine.vue
similarity index 100%
rename from resources/js/components/Charts/TimeSeriesLine.vue
rename to resources/old_js/components/Charts/TimeSeriesLine.vue
diff --git a/resources/js/components/Cleanups/CleanupSidebar.vue b/resources/old_js/components/Cleanups/CleanupSidebar.vue
similarity index 100%
rename from resources/js/components/Cleanups/CleanupSidebar.vue
rename to resources/old_js/components/Cleanups/CleanupSidebar.vue
diff --git a/resources/js/components/Cleanups/CreateCleanup.vue b/resources/old_js/components/Cleanups/CreateCleanup.vue
similarity index 100%
rename from resources/js/components/Cleanups/CreateCleanup.vue
rename to resources/old_js/components/Cleanups/CreateCleanup.vue
diff --git a/resources/js/components/Cleanups/JoinCleanup.vue b/resources/old_js/components/Cleanups/JoinCleanup.vue
similarity index 100%
rename from resources/js/components/Cleanups/JoinCleanup.vue
rename to resources/old_js/components/Cleanups/JoinCleanup.vue
diff --git a/resources/js/components/CreateAccount.vue b/resources/old_js/components/CreateAccount.vue
similarity index 100%
rename from resources/js/components/CreateAccount.vue
rename to resources/old_js/components/CreateAccount.vue
diff --git a/resources/js/components/DateSlider.vue b/resources/old_js/components/DateSlider.vue
similarity index 100%
rename from resources/js/components/DateSlider.vue
rename to resources/old_js/components/DateSlider.vue
diff --git a/resources/js/components/DonateButtons.vue b/resources/old_js/components/DonateButtons.vue
similarity index 100%
rename from resources/js/components/DonateButtons.vue
rename to resources/old_js/components/DonateButtons.vue
diff --git a/resources/js/components/General/Nav.vue b/resources/old_js/components/General/Nav.vue
similarity index 100%
rename from resources/js/components/General/Nav.vue
rename to resources/old_js/components/General/Nav.vue
diff --git a/resources/js/components/General/Progress.vue b/resources/old_js/components/General/Progress.vue
similarity index 100%
rename from resources/js/components/General/Progress.vue
rename to resources/old_js/components/General/Progress.vue
diff --git a/resources/js/components/GenerateLitterCoin.vue b/resources/old_js/components/GenerateLitterCoin.vue
similarity index 100%
rename from resources/js/components/GenerateLitterCoin.vue
rename to resources/old_js/components/GenerateLitterCoin.vue
diff --git a/resources/js/components/HexMap.vue b/resources/old_js/components/HexMap.vue
similarity index 100%
rename from resources/js/components/HexMap.vue
rename to resources/old_js/components/HexMap.vue
diff --git a/resources/js/components/InfoCards.vue b/resources/old_js/components/InfoCards.vue
similarity index 100%
rename from resources/js/components/InfoCards.vue
rename to resources/old_js/components/InfoCards.vue
diff --git a/resources/old_js/components/Litter/AddTags.vue b/resources/old_js/components/Litter/AddTags.vue
new file mode 100644
index 000000000..960880c1c
--- /dev/null
+++ b/resources/old_js/components/Litter/AddTags.vue
@@ -0,0 +1,776 @@
+
+
+ {{ photo.result_string ? photo.result_string : "No tags" }}
+
+
+
+ {{ photo.custom_tags.length ? getCustomTags(photo.custom_tags) : "No tags" }}
+
+
+
+ {{ photo.datetime }}
+
+
+
+ {{ photo.display_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ this.paginatedPhotos.current_page }}
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/Litter/Presence.vue b/resources/old_js/components/Litter/Presence.vue
similarity index 100%
rename from resources/js/components/Litter/Presence.vue
rename to resources/old_js/components/Litter/Presence.vue
diff --git a/resources/js/components/Litter/ProfileDelete.vue b/resources/old_js/components/Litter/ProfileDelete.vue
similarity index 100%
rename from resources/js/components/Litter/ProfileDelete.vue
rename to resources/old_js/components/Litter/ProfileDelete.vue
diff --git a/resources/js/components/Litter/RecentTags.vue b/resources/old_js/components/Litter/RecentTags.vue
similarity index 100%
rename from resources/js/components/Litter/RecentTags.vue
rename to resources/old_js/components/Litter/RecentTags.vue
diff --git a/resources/js/components/Litter/Tags.vue b/resources/old_js/components/Litter/Tags.vue
similarity index 100%
rename from resources/js/components/Litter/Tags.vue
rename to resources/old_js/components/Litter/Tags.vue
diff --git a/resources/js/components/Littercoin/Merchants/ApproveMerchant.vue b/resources/old_js/components/Littercoin/Merchants/ApproveMerchant.vue
similarity index 100%
rename from resources/js/components/Littercoin/Merchants/ApproveMerchant.vue
rename to resources/old_js/components/Littercoin/Merchants/ApproveMerchant.vue
diff --git a/resources/js/components/Littercoin/Merchants/CreateMerchant.vue b/resources/old_js/components/Littercoin/Merchants/CreateMerchant.vue
similarity index 100%
rename from resources/js/components/Littercoin/Merchants/CreateMerchant.vue
rename to resources/old_js/components/Littercoin/Merchants/CreateMerchant.vue
diff --git a/resources/js/components/Littercoin/Merchants/MerchantMap.vue b/resources/old_js/components/Littercoin/Merchants/MerchantMap.vue
similarity index 100%
rename from resources/js/components/Littercoin/Merchants/MerchantMap.vue
rename to resources/old_js/components/Littercoin/Merchants/MerchantMap.vue
diff --git a/resources/js/components/LittercoinOwed.vue b/resources/old_js/components/LittercoinOwed.vue
similarity index 100%
rename from resources/js/components/LittercoinOwed.vue
rename to resources/old_js/components/LittercoinOwed.vue
diff --git a/resources/old_js/components/LiveEvents.vue b/resources/old_js/components/LiveEvents.vue
new file mode 100644
index 000000000..14f686ae1
--- /dev/null
+++ b/resources/old_js/components/LiveEvents.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/Locations/Charts/Download/Download.vue b/resources/old_js/components/Locations/Charts/Download/Download.vue
similarity index 100%
rename from resources/js/components/Locations/Charts/Download/Download.vue
rename to resources/old_js/components/Locations/Charts/Download/Download.vue
diff --git a/resources/js/components/Locations/Charts/Options/Options.vue b/resources/old_js/components/Locations/Charts/Options/Options.vue
similarity index 100%
rename from resources/js/components/Locations/Charts/Options/Options.vue
rename to resources/old_js/components/Locations/Charts/Options/Options.vue
diff --git a/resources/js/components/Locations/Charts/PieCharts/BrandsChart.vue b/resources/old_js/components/Locations/Charts/PieCharts/BrandsChart.vue
similarity index 97%
rename from resources/js/components/Locations/Charts/PieCharts/BrandsChart.vue
rename to resources/old_js/components/Locations/Charts/PieCharts/BrandsChart.vue
index a7ce3301c..23fca2a38 100644
--- a/resources/js/components/Locations/Charts/PieCharts/BrandsChart.vue
+++ b/resources/old_js/components/Locations/Charts/PieCharts/BrandsChart.vue
@@ -62,7 +62,7 @@ export default {
}
},
// tooltips: {
- // mode: 'single', // this is the Chart.js default, no need to set
+ // mode: 'single', // this is the Chart.old_js default, no need to set
// callbacks: {
// label: function (tooltipItems, percentArray) {
// console.log(tooltipItems),
diff --git a/resources/js/components/Locations/Charts/PieCharts/ChartsContainer.vue b/resources/old_js/components/Locations/Charts/PieCharts/ChartsContainer.vue
similarity index 100%
rename from resources/js/components/Locations/Charts/PieCharts/ChartsContainer.vue
rename to resources/old_js/components/Locations/Charts/PieCharts/ChartsContainer.vue
diff --git a/resources/old_js/components/Locations/Charts/PieCharts/LitterChart.vue b/resources/old_js/components/Locations/Charts/PieCharts/LitterChart.vue
new file mode 100644
index 000000000..8f07cf4cb
--- /dev/null
+++ b/resources/old_js/components/Locations/Charts/PieCharts/LitterChart.vue
@@ -0,0 +1,70 @@
+
diff --git a/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeries.vue b/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeries.vue
new file mode 100644
index 000000000..a950f60e0
--- /dev/null
+++ b/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeries.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
diff --git a/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeriesContainer.vue b/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeriesContainer.vue
new file mode 100644
index 000000000..c822023d9
--- /dev/null
+++ b/resources/old_js/components/Locations/Charts/TimeSeries/TimeSeriesContainer.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/Locations/GlobalMetaData.vue b/resources/old_js/components/Locations/GlobalMetaData.vue
similarity index 97%
rename from resources/js/components/Locations/GlobalMetaData.vue
rename to resources/old_js/components/Locations/GlobalMetaData.vue
index be6f1d7ac..cfa362a9b 100644
--- a/resources/js/components/Locations/GlobalMetaData.vue
+++ b/resources/old_js/components/Locations/GlobalMetaData.vue
@@ -46,7 +46,7 @@
diff --git a/resources/js/components/ProfileTime.vue b/resources/old_js/components/ProfileTime.vue
similarity index 100%
rename from resources/js/components/ProfileTime.vue
rename to resources/old_js/components/ProfileTime.vue
diff --git a/resources/js/components/ProgressBar.vue b/resources/old_js/components/ProgressBar.vue
similarity index 100%
rename from resources/js/components/ProgressBar.vue
rename to resources/old_js/components/ProgressBar.vue
diff --git a/resources/js/components/RegisterModal.vue b/resources/old_js/components/RegisterModal.vue
similarity index 100%
rename from resources/js/components/RegisterModal.vue
rename to resources/old_js/components/RegisterModal.vue
diff --git a/resources/js/components/Teams/TeamMap.vue b/resources/old_js/components/Teams/TeamMap.vue
similarity index 100%
rename from resources/js/components/Teams/TeamMap.vue
rename to resources/old_js/components/Teams/TeamMap.vue
diff --git a/resources/js/components/User/Photos/FilterPhotos.vue b/resources/old_js/components/User/Photos/FilterPhotos.vue
similarity index 100%
rename from resources/js/components/User/Photos/FilterPhotos.vue
rename to resources/old_js/components/User/Photos/FilterPhotos.vue
diff --git a/resources/js/components/User/Settings/Privacy/CreatedByPrivacy.vue b/resources/old_js/components/User/Settings/Privacy/CreatedByPrivacy.vue
similarity index 100%
rename from resources/js/components/User/Settings/Privacy/CreatedByPrivacy.vue
rename to resources/old_js/components/User/Settings/Privacy/CreatedByPrivacy.vue
diff --git a/resources/js/components/User/Settings/Privacy/LeaderboardsPrivacy.vue b/resources/old_js/components/User/Settings/Privacy/LeaderboardsPrivacy.vue
similarity index 100%
rename from resources/js/components/User/Settings/Privacy/LeaderboardsPrivacy.vue
rename to resources/old_js/components/User/Settings/Privacy/LeaderboardsPrivacy.vue
diff --git a/resources/js/components/User/Settings/Privacy/MapsPrivacy.vue b/resources/old_js/components/User/Settings/Privacy/MapsPrivacy.vue
similarity index 100%
rename from resources/js/components/User/Settings/Privacy/MapsPrivacy.vue
rename to resources/old_js/components/User/Settings/Privacy/MapsPrivacy.vue
diff --git a/resources/js/components/User/Settings/Privacy/PreventOthersTaggingMyPhotos.vue b/resources/old_js/components/User/Settings/Privacy/PreventOthersTaggingMyPhotos.vue
similarity index 100%
rename from resources/js/components/User/Settings/Privacy/PreventOthersTaggingMyPhotos.vue
rename to resources/old_js/components/User/Settings/Privacy/PreventOthersTaggingMyPhotos.vue
diff --git a/resources/js/components/VerificationBar.vue b/resources/old_js/components/VerificationBar.vue
similarity index 100%
rename from resources/js/components/VerificationBar.vue
rename to resources/old_js/components/VerificationBar.vue
diff --git a/resources/js/components/WelcomeBanner.vue b/resources/old_js/components/WelcomeBanner.vue
similarity index 100%
rename from resources/js/components/WelcomeBanner.vue
rename to resources/old_js/components/WelcomeBanner.vue
diff --git a/resources/js/components/global/GlobalDates.vue b/resources/old_js/components/global/GlobalDates.vue
similarity index 100%
rename from resources/js/components/global/GlobalDates.vue
rename to resources/old_js/components/global/GlobalDates.vue
diff --git a/resources/js/components/global/GlobalInfo.vue b/resources/old_js/components/global/GlobalInfo.vue
similarity index 100%
rename from resources/js/components/global/GlobalInfo.vue
rename to resources/old_js/components/global/GlobalInfo.vue
diff --git a/resources/js/components/global/Languages.vue b/resources/old_js/components/global/Languages.vue
similarity index 100%
rename from resources/js/components/global/Languages.vue
rename to resources/old_js/components/global/Languages.vue
diff --git a/resources/js/components/global/SearchCustomTags.vue b/resources/old_js/components/global/SearchCustomTags.vue
similarity index 100%
rename from resources/js/components/global/SearchCustomTags.vue
rename to resources/old_js/components/global/SearchCustomTags.vue
diff --git a/resources/js/components/global/TotalCounts.vue b/resources/old_js/components/global/TotalCounts.vue
similarity index 100%
rename from resources/js/components/global/TotalCounts.vue
rename to resources/old_js/components/global/TotalCounts.vue
diff --git a/resources/js/components/global/TotalGlobalCounts.vue b/resources/old_js/components/global/TotalGlobalCounts.vue
similarity index 100%
rename from resources/js/components/global/TotalGlobalCounts.vue
rename to resources/old_js/components/global/TotalGlobalCounts.vue
diff --git a/resources/js/components/langs/de.js b/resources/old_js/components/langs/de.js
similarity index 100%
rename from resources/js/components/langs/de.js
rename to resources/old_js/components/langs/de.js
diff --git a/resources/js/components/langs/en.js b/resources/old_js/components/langs/en.js
similarity index 100%
rename from resources/js/components/langs/en.js
rename to resources/old_js/components/langs/en.js
diff --git a/resources/js/components/langs/es.js b/resources/old_js/components/langs/es.js
similarity index 100%
rename from resources/js/components/langs/es.js
rename to resources/old_js/components/langs/es.js
diff --git a/resources/js/components/langs/fr.js b/resources/old_js/components/langs/fr.js
similarity index 100%
rename from resources/js/components/langs/fr.js
rename to resources/old_js/components/langs/fr.js
diff --git a/resources/js/components/langs/ie.js b/resources/old_js/components/langs/ie.js
similarity index 100%
rename from resources/js/components/langs/ie.js
rename to resources/old_js/components/langs/ie.js
diff --git a/resources/js/components/langs/it.js b/resources/old_js/components/langs/it.js
similarity index 100%
rename from resources/js/components/langs/it.js
rename to resources/old_js/components/langs/it.js
diff --git a/resources/js/components/langs/ms.js b/resources/old_js/components/langs/ms.js
similarity index 100%
rename from resources/js/components/langs/ms.js
rename to resources/old_js/components/langs/ms.js
diff --git a/resources/js/components/langs/pl.js b/resources/old_js/components/langs/pl.js
similarity index 100%
rename from resources/js/components/langs/pl.js
rename to resources/old_js/components/langs/pl.js
diff --git a/resources/js/components/langs/tk.js b/resources/old_js/components/langs/tk.js
similarity index 100%
rename from resources/js/components/langs/tk.js
rename to resources/old_js/components/langs/tk.js
diff --git a/resources/js/components/passport/AuthorizedClients.vue b/resources/old_js/components/passport/AuthorizedClients.vue
similarity index 100%
rename from resources/js/components/passport/AuthorizedClients.vue
rename to resources/old_js/components/passport/AuthorizedClients.vue
diff --git a/resources/js/components/passport/Clients.vue b/resources/old_js/components/passport/Clients.vue
similarity index 100%
rename from resources/js/components/passport/Clients.vue
rename to resources/old_js/components/passport/Clients.vue
diff --git a/resources/js/components/passport/PersonalAccessTokens.vue b/resources/old_js/components/passport/PersonalAccessTokens.vue
similarity index 100%
rename from resources/js/components/passport/PersonalAccessTokens.vue
rename to resources/old_js/components/passport/PersonalAccessTokens.vue
diff --git a/resources/js/components/vue2slider.vue b/resources/old_js/components/vue2slider.vue
similarity index 100%
rename from resources/js/components/vue2slider.vue
rename to resources/old_js/components/vue2slider.vue
diff --git a/resources/js/core/PolarChart.js b/resources/old_js/core/PolarChart.js
similarity index 100%
rename from resources/js/core/PolarChart.js
rename to resources/old_js/core/PolarChart.js
diff --git a/resources/js/extra/categories.js b/resources/old_js/extra/categories.js
similarity index 100%
rename from resources/js/extra/categories.js
rename to resources/old_js/extra/categories.js
diff --git a/resources/js/extra/laravel-permission-to-vuejs/index.js b/resources/old_js/extra/laravel-permission-to-vuejs/index.js
similarity index 100%
rename from resources/js/extra/laravel-permission-to-vuejs/index.js
rename to resources/old_js/extra/laravel-permission-to-vuejs/index.js
diff --git a/resources/js/extra/litterkeys.js b/resources/old_js/extra/litterkeys.js
similarity index 100%
rename from resources/js/extra/litterkeys.js
rename to resources/old_js/extra/litterkeys.js
diff --git a/resources/old_js/i18n.js b/resources/old_js/i18n.js
new file mode 100644
index 000000000..1c104f1c0
--- /dev/null
+++ b/resources/old_js/i18n.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+Vue.use(VueI18n)
+
+import { langs } from '../js/langs'
+
+export default new VueI18n({
+ locale: 'en',
+ fallbackLocale: 'en',
+ messages: langs
+});
diff --git a/resources/js/maps/globalmap.js b/resources/old_js/maps/globalmap.js
similarity index 100%
rename from resources/js/maps/globalmap.js
rename to resources/old_js/maps/globalmap.js
diff --git a/resources/js/middleware/admin.js b/resources/old_js/middleware/admin.js
similarity index 100%
rename from resources/js/middleware/admin.js
rename to resources/old_js/middleware/admin.js
diff --git a/resources/js/middleware/auth.js b/resources/old_js/middleware/auth.js
similarity index 100%
rename from resources/js/middleware/auth.js
rename to resources/old_js/middleware/auth.js
diff --git a/resources/js/middleware/can_bbox.js b/resources/old_js/middleware/can_bbox.js
similarity index 100%
rename from resources/js/middleware/can_bbox.js
rename to resources/old_js/middleware/can_bbox.js
diff --git a/resources/js/middleware/can_verify_boxes.js b/resources/old_js/middleware/can_verify_boxes.js
similarity index 100%
rename from resources/js/middleware/can_verify_boxes.js
rename to resources/old_js/middleware/can_verify_boxes.js
diff --git a/resources/js/middleware/middlewarePipeline.js b/resources/old_js/middleware/middlewarePipeline.js
similarity index 100%
rename from resources/js/middleware/middlewarePipeline.js
rename to resources/old_js/middleware/middlewarePipeline.js
diff --git a/resources/js/mixins/errors/handleErrors.js b/resources/old_js/mixins/errors/handleErrors.js
similarity index 100%
rename from resources/js/mixins/errors/handleErrors.js
rename to resources/old_js/mixins/errors/handleErrors.js
diff --git a/resources/old_js/package.json b/resources/old_js/package.json
new file mode 100644
index 000000000..950e58f25
--- /dev/null
+++ b/resources/old_js/package.json
@@ -0,0 +1,78 @@
+{
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "../../node_modules/.bin/vite",
+ "build": "../../node_modules/.bin/vite build"
+ },
+ "devDependencies": {
+ "@tailwindcss/forms": "^0.5.9",
+ "@tailwindcss/typography": "^0.5.15",
+ "autoprefixer": "^10.4.20",
+ "axios": "^1.7.7",
+ "cross-env": "^7.0.3",
+ "laravel-vite-plugin": "^1.0.4",
+ "lodash": "^4.17.21",
+ "postcss": "^8.4.49",
+ "postcss-nesting": "^13.0.1",
+ "resolve-url-loader": "^5.0.0",
+ "sass": "^1.77.6",
+ "sass-loader": "^14.2.1",
+ "tailwindcss": "^3.4.17",
+ "vite": "^5.4.8",
+ "vue-eslint-parser": "^9.4.3"
+ },
+ "dependencies": {
+ "@stricahq/bip32ed25519": "^1.0.4",
+ "@turf/hex-grid": "^7.0.0",
+ "@turf/turf": "^7.0.0",
+ "@vitejs/plugin-vue2": "^2.3.1",
+ "animate.css": "^4.1.1",
+ "animated-number-vue": "^1.0.0",
+ "bip39": "^3.1.0",
+ "blakejs": "^1.2.1",
+ "buefy": "^0.9.29",
+ "bulma": "^1.0.1",
+ "chart.js": "^2.9.4",
+ "fs": "0.0.1-security",
+ "laravel-echo": "^1.16.1",
+ "laravel-permission-to-vuejs": "2.0.5",
+ "leaflet": "^1.9.4",
+ "leaflet-timedimension": "^1.1.1",
+ "leaflet-webgl-heatmap": "github:xlcrr/leaflet-webgl-heatmap",
+ "leaflet.glify": "^3.3.0",
+ "lodash.sortby": "^4.7.0",
+ "mapbox-gl": "^3.4.0",
+ "moment": "^2.30.1",
+ "pusher-js": "^8.4.0-rc2",
+ "supercluster": "^8.0.1",
+ "v-img": "^0.2.0",
+ "v-mask": "^2.2.3",
+ "vue-chartjs": "^3.5.1",
+ "vue-click-outside": "^1.1.0",
+ "vue-drag-resize": "^1.4.2",
+ "vue-draggable-resizable": "^2.3.0",
+ "vue-echo-laravel": "^1.0.0",
+ "vue-fullscreen": "^2.6.1",
+ "vue-functional-calendar": "^2.9.99",
+ "vue-i18n": "^8.21.0",
+ "vue-loading-overlay": "^3.3.3",
+ "vue-localstorage": "^0.6.2",
+ "vue-number-animation": "^1.0.5",
+ "vue-paginate": "^3.6.0",
+ "vue-recaptcha": "^1.3.0",
+ "vue-router": "^3.4.3",
+ "vue-select": "^3.10.8",
+ "vue-simple-suggest": "^1.10.3",
+ "vue-slider-component": "^3.2.5",
+ "vue-stripe-checkout": "^3.5.7",
+ "vue-stripe-elements-plus": "^0.3.2",
+ "vue-sweetalert2": "^3.0.6",
+ "vue-toastify": "^1.8.0",
+ "vue-typed-js": "^0.1.2",
+ "vue2-dropzone": "^3.6.0",
+ "vuedraggable": "^2.24.3",
+ "vuex": "^3.5.1",
+ "vuex-persistedstate": "^3.1.0"
+ }
+}
diff --git a/resources/js/routes.js b/resources/old_js/routes.js
similarity index 75%
rename from resources/js/routes.js
rename to resources/old_js/routes.js
index 52a35a55e..859e45337 100644
--- a/resources/js/routes.js
+++ b/resources/old_js/routes.js
@@ -1,13 +1,13 @@
-import VueRouter from 'vue-router'
-import store from './store'
+import VueRouter from 'vue-router';
+import store from './store';
// Middleware
-import auth from './middleware/auth'
-import admin from './middleware/admin'
+import auth from './middleware/auth';
+import admin from './middleware/admin';
import can_bbox from './middleware/can_bbox';
-import can_verify_boxes from './middleware/can_verify_boxes'
+import can_verify_boxes from './middleware/can_verify_boxes';
-import middlewarePipeline from './middleware/middlewarePipeline'
+import middlewarePipeline from './middleware/middlewarePipeline';
// The earlier a route is defined, the higher its priority.
const router = new VueRouter({
@@ -18,28 +18,28 @@ const router = new VueRouter({
// GUEST ROUTES
{
path: '/',
- component: () => import('./views/home/Welcome.vue')
+ component: () => import('./views/home/Welcome.vue'),
},
{
path: '/confirm/email/:token',
- component: () => import('./views/home/Welcome.vue')
+ component: () => import('./views/home/Welcome.vue'),
},
{
path: '/password/reset',
- component: () => import('./views/Auth/passwords/Email.vue')
+ component: () => import('./views/Auth/passwords/Email.vue'),
},
{
path: '/password/reset/:token',
component: () => import('./views/Auth/passwords/Reset.vue'),
- props: true
+ props: true,
},
{
path: '/emails/unsubscribe/:token',
- component: () => import('./views/home/Welcome.vue')
+ component: () => import('./views/home/Welcome.vue'),
},
{
path: '/about',
- component: () => import('./views/home/About.vue')
+ component: () => import('./views/home/About.vue'),
},
{
path: '/cleanups',
@@ -47,13 +47,13 @@ const router = new VueRouter({
children: [
{
path: ':invite_link/join',
- component: () => import('./views/home/Cleanups.vue')
- }
- ]
+ component: () => import('./views/home/Cleanups.vue'),
+ },
+ ],
},
{
path: '/history',
- component: () => import('./views/general/History.vue')
+ component: () => import('../js/views/General/History.vue'),
},
// {
// path: '/littercoin',
@@ -61,264 +61,265 @@ const router = new VueRouter({
// },
{
path: '/littercoin/merchants',
- component: () => import('./views/home/Merchants.vue')
+ component: () => import('./views/home/Merchants.vue'),
},
{
path: '/donate',
- component: () => import('./views/home/Donate.vue')
+ component: () => import('./views/home/Donate.vue'),
},
{
path: '/contact-us',
- component: () => import('./views/home/ContactUs.vue')
+ component: () => import('./views/home/ContactUs.vue'),
},
{
path: '/community',
- component: () => import('./views/home/Community/Index.vue')
+ component: () => import('./views/home/Community/Index.vue'),
},
{
path: '/faq',
- component: () => import('./views/home/FAQ.vue')
+ component: () => import('./views/home/FAQ.vue'),
},
{
path: '/global',
- component: () => import('./views/global/GlobalMapContainer.vue')
- },
- {
- path: '/tags',
- component: () => import('./views/home/TagsViewer.vue')
+ component: () => import('./views/global/GlobalMapContainer.vue'),
},
{
path: '/signup',
- component: () => import('./views/Auth/SignUp.vue')
+ component: () => import('./views/Auth/SignUp.vue'),
},
{
path: '/join/:plan?',
- component: () => import('./views/Auth/Subscribe.vue')
+ component: () => import('./views/Auth/Subscribe.vue'),
},
{
path: '/terms',
- component: () => import('./views/general/Terms.vue')
+ component: () => import('./views/general/Terms.vue'),
},
{
path: '/privacy',
- component: () => import('./views/general/Privacy.vue')
+ component: () => import('./views/general/Privacy.vue'),
},
{
path: '/references',
- component: () => import('./views/general/References.vue')
+ component: () => import('./views/general/References.vue'),
},
{
path: '/leaderboard',
- component: () => import('./views/Leaderboard/Leaderboard.vue')
+ component: () => import('./views/Leaderboard/Leaderboard.vue'),
},
{
path: '/credits',
- component: () => import('./views/general/Credits.vue')
+ component: () => import('./views/general/Credits.vue'),
},
// Countries
{
path: '/world',
- component: () => import('./views/Locations/Countries.vue')
+ component: () => import('./views/Locations/World.vue'),
},
// States
{
path: '/world/:country',
- component: () => import('./views/Locations/States.vue')
+ component: () => import('./views/Locations/States.vue'),
},
// Cities
{
path: '/world/:country/:state',
- component: () => import('./views/Locations/Cities.vue')
+ component: () => import('./views/Locations/Cities.vue'),
},
// City - Map
{
path: '/world/:country/:state/:city/map/:minDate?/:maxDate?/:hex?',
- component: () => import('./views/Locations/CityMapContainer.vue')
+ component: () => import('./views/Locations/CityMapContainer.vue'),
},
// Admin
{
path: '/admin/photos',
component: () => import('./views/admin/VerifyPhotos.vue'),
meta: {
- middleware: [ auth, admin ]
- }
+ middleware: [auth, admin],
+ },
},
{
path: '/admin/merchants',
component: () => import('./views/admin/Merchants.vue'),
meta: {
- middleware: [ auth, admin ]
- }
+ middleware: [auth, admin],
+ },
+ },
+ {
+ path: '/admin/redis/:userId?',
+ component: () => import('./views/admin/Redis.vue'),
+ meta: {
+ middleware: [auth], // admin
+ },
},
// AUTH ROUTES
{
path: '/upload',
component: () => import('./views/general/Upload.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/submit', // old route
component: () => import('./views/general/Upload.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/tag',
component: () => import('./views/general/Tag.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/bulk-tag',
component: () => import('./views/general/BulkTag.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/profile',
component: () => import('./views/general/Profile.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/my-uploads',
component: () => import('./views/general/MyUploads.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/teams',
component: () => import('./views/Teams/Teams.vue'),
meta: {
- middleware: [ auth ]
- }
+ middleware: [auth],
+ },
},
{
path: '/settings',
component: () => import('./views/Settings.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
children: [
{
path: 'password',
component: () => import('./views/Settings.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'details',
component: () => import('./views/settings/Details.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'social',
component: () => import('./views/settings/Social.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'account',
component: () => import('./views/settings/Account.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'payments',
component: () => import('./views/settings/Payments.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'privacy',
component: () => import('./views/settings/Privacy.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'littercoin',
component: () => import('./views/settings/Littercoin.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'picked-up',
component: () => import('./views/settings/PickedUp.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'emails',
component: () => import('./views/settings/Emails.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
{
path: 'show-flag',
component: () => import('./views/settings/GlobalFlag.vue'),
meta: {
- middleware: [ auth ]
+ middleware: [auth],
},
},
// {
// path: 'phone',
// component: () => import('./views/Phone.vue')
// }
- ]
+ ],
},
{
path: '/bbox',
component: () => import('./views/bbox/BoundingBox.vue'),
meta: {
- middleware: [ auth, can_bbox ]
- }
+ middleware: [auth, can_bbox],
+ },
},
{
path: '/bbox/verify',
component: () => import('./views/bbox/BoundingBox.vue'),
meta: {
- middleware: [ auth, can_verify_boxes ]
- }
- }
- ]
+ middleware: [auth, can_verify_boxes],
+ },
+ },
+ ],
});
/**
* Pipeline for multiple middleware
*/
router.beforeEach((to, from, next) => {
-
- if (! to.meta.middleware) return next();
+ if (!to.meta.middleware) return next();
// testing --- this allows store to init before router finishes and returns with auth false
// await store.dispatch('CHECK_AUTH');
- const middleware = to.meta.middleware
+ const middleware = to.meta.middleware;
const context = { to, from, next, store };
return middleware[0]({
...context,
- next: middlewarePipeline(context, middleware, 1)
+ next: middlewarePipeline(context, middleware, 1),
});
-
});
export default router;
diff --git a/resources/old_js/store/index.js b/resources/old_js/store/index.js
new file mode 100644
index 000000000..2ea444e83
--- /dev/null
+++ b/resources/old_js/store/index.js
@@ -0,0 +1,58 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import createPersistedState from 'vuex-persistedstate'
+
+import { admin } from './modules/admin'
+import { alldata } from "./modules/alldata";
+import { bbox } from './modules/bbox'
+import { citymap } from './modules/citymap'
+import { cleanups } from './modules/cleanups'
+import { community } from './modules/community'
+import { donate } from './modules/donate'
+import { errors } from './modules/errors'
+import { globalmap } from './modules/globalmap'
+import { leaderboard } from "./modules/leaderboard"
+import { locations } from './modules/locations'
+import { litter } from './modules/litter'
+import { merchants } from './modules/littercoin/merchants'
+import { modal } from './modules/modal'
+import { payments } from './modules/payments'
+import { photos } from './modules/photos'
+import { plans } from './modules/plans'
+import { subscriber } from './modules/subscriber'
+import { tags } from "./modules/tags/index.js";
+import { teams } from './modules/teams'
+import { user } from './modules/user'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+ plugins: [
+ createPersistedState({
+ paths: ['user', 'litter.recentTags']
+ })
+ ],
+ modules: {
+ admin,
+ alldata,
+ bbox,
+ donate,
+ citymap,
+ cleanups,
+ community,
+ errors,
+ globalmap,
+ leaderboard,
+ locations,
+ litter,
+ merchants,
+ modal,
+ payments,
+ photos,
+ plans,
+ subscriber,
+ tags,
+ teams,
+ user
+ }
+});
diff --git a/resources/old_js/store/modules/admin/actions.js b/resources/old_js/store/modules/admin/actions.js
new file mode 100644
index 000000000..cefaeb69b
--- /dev/null
+++ b/resources/old_js/store/modules/admin/actions.js
@@ -0,0 +1,288 @@
+import Vue from 'vue';
+import i18n from '../../../i18n';
+
+export const actions = {
+ /**
+ * Delete an image and its records
+ */
+ async ADMIN_DELETE_IMAGE (context)
+ {
+ await axios.post('/admin/destroy', {
+ photoId: context.state.photo.id
+ })
+ .then(response => {
+ console.log('admin_delete_image', response);
+
+ context.dispatch('GET_NEXT_ADMIN_PHOTO');
+ })
+ .catch(error => {
+ console.log(error);
+ });
+ },
+
+ /**
+ *
+ */
+ async ADMIN_FIND_PHOTO_BY_ID (context, payload)
+ {
+ context.commit('resetLitter');
+ context.commit('clearTags');
+
+ await axios.get('/admin/find-photo-by-id', {
+ params: {
+ photoId: payload
+ }
+ })
+ .then(response => {
+ console.log('ADMIN_FIND_PHOTO_BY_ID', response);
+
+ if (response.data.success)
+ {
+ // admin.old_js
+ context.commit('initAdminPhoto', response.data.photo);
+
+ // litter.old_js
+ context.commit('initAdminItems', response.data.photo);
+ context.commit('initAdminCustomTags', response.data.photo);
+ }
+ else {
+ Vue.$vToastify.error({
+ title: "Error",
+ body: "Photo not found",
+ position: 'top-right'
+ });
+ }
+ })
+ .catch(error => {
+ console.error('ADMIN_FIND_PHOTO_BY_ID', error);
+ });
+ },
+
+ /**
+ * Admin can go back and edit previously verified data
+ *
+ * @param filterMyOwnPhotos adds whereUserId to the query
+ */
+ async ADMIN_GO_BACK_ONE_PHOTO (context, payload)
+ {
+ context.commit('resetLitter');
+ context.commit('clearTags');
+
+ // We need to convert string "true"/"false" to 0/1 characters for PHP
+ await axios.get('/admin/go-back-one', {
+ params: {
+ photoId: payload.photoId,
+ filterMyOwnPhotos: payload.filterMyOwnPhotos ? "1" : "0"
+ }
+ })
+ .then(response => {
+ console.log('ADMIN_GO_BACK_ONE_PHOTO', response);
+
+ if (response.data.success)
+ {
+ // admin.old_js
+ context.commit('initAdminPhoto', response.data.photo);
+
+ // litter.old_js
+ context.commit('initAdminItems', response.data.photo);
+ context.commit('initAdminCustomTags', response.data.photo);
+ }
+ })
+ .catch(error => {
+ console.error('ADMIN_GO_BACK_ONE_PHOTO', error);
+ });
+ },
+
+ /**
+ * Reset the tags + verification on an image
+ */
+ async ADMIN_RESET_TAGS (context)
+ {
+ const title = i18n.t('notifications.success');
+ const body = 'Image has been reset';
+
+ await axios.post('/admin/reset-tags', {
+ photoId: context.state.photo.id
+ })
+ .then(response => {
+ console.log('admin_reset_tags', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+
+ context.dispatch('GET_NEXT_ADMIN_PHOTO');
+ }
+
+ }).catch(error => {
+ console.log(error);
+ });
+ },
+
+ /**
+ * Verify the image as correct (stage 2)
+ *
+ * Increments user_verification_count on Redis
+ *
+ * If user_verification_count reaches >= 100:
+ * - A Littercoin is mined. Boss level 1 is completed.
+ * - The user becomes Trusted.
+ * - All remaining images are verified.
+ * - Email sent to the user encouraging them to continue.
+ *
+ * Updates photo as verified
+ * Updates locations, charts, time-series, teams, etc.
+ *
+ * Returns user_verification_count and number of images verified.
+ */
+ async ADMIN_VERIFY_CORRECT (context)
+ {
+ const title = i18n.t('notifications.success');
+ const body = "Verified";
+
+ await axios.post('/admin/verify-tags-as-correct', {
+ photoId: context.state.photo.id
+ })
+ .then(response => {
+ console.log('admin_verify_correct', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title,
+ body,
+ });
+
+ if (response.data.userVerificationCount >= 100)
+ {
+ setTimeout(() => {
+ Vue.$vToastify.success({
+ title: "User has been verified",
+ body: "Email sent and remaining photos verified",
+ });
+ }, 1000);
+ }
+ }
+
+ context.dispatch('GET_NEXT_ADMIN_PHOTO');
+ })
+ .catch(error => {
+ console.error('admin_verify_correct', error);
+ });
+ },
+
+ /**
+ * Verify tags and delete the image
+ */
+ async ADMIN_VERIFY_DELETE (context)
+ {
+ await axios.post('/admin/contentsupdatedelete', {
+ photoId: context.state.photo.id,
+ // categories: categories todo
+ })
+ .then(response => {
+ console.log('admin_verify_delete', response);
+
+ context.dispatch('GET_NEXT_ADMIN_PHOTO');
+ })
+ .catch(error => {
+ console.log('admin_verify_delete', error);
+ });
+ },
+
+ /**
+ * Verify the image, and update with new tags
+ */
+ async ADMIN_UPDATE_WITH_NEW_TAGS (context)
+ {
+ const photoId = context.state.photo.id;
+
+ await axios.post('/admin/update-tags', {
+ photoId: photoId,
+ tags: context.rootState.litter.tags[photoId],
+ custom_tags: context.rootState.litter.customTags[photoId]
+ })
+ .then(response => {
+ console.log('admin_update_with_new_tags', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title: "Tags updated",
+ body: "Thank you for helping to verify OpenLitterMap data!",
+ });
+ }
+
+ context.dispatch('GET_NEXT_ADMIN_PHOTO');
+ })
+ .catch(error => {
+ console.log('admin_update_with_new_tags', error);
+ });
+ },
+
+ /**
+ * Get the next photo to verify on admin account
+ */
+ async GET_NEXT_ADMIN_PHOTO (context)
+ {
+ // clear previous input on litter.old_js
+ context.commit('resetLitter');
+ context.commit('clearTags');
+
+ await axios.get('/admin/get-next-image-to-verify', {
+ params: {
+ country_id: context.state.filterByCountry,
+ skip: context.state.skippedPhotos
+ }
+ })
+ .then(response => {
+ console.log('get_next_admin_photo', response);
+
+ window.scroll({
+ top: 0,
+ left: 0,
+ behavior: 'smooth'
+ });
+
+ // init photo data (admin.old_js)
+ context.commit('initAdminPhoto', response.data.photo);
+
+ // init litter data for verification (litter.old_js)
+ if (response.data.photo?.verification > 0)
+ {
+ context.commit('initAdminItems', response.data.photo);
+ context.commit('initAdminCustomTags', response.data.photo);
+ }
+
+ context.commit('initAdminMetadata', {
+ not_processed: response.data.photosNotProcessed,
+ awaiting_verification: response.data.photosAwaitingVerification
+ });
+
+ context.dispatch('ADMIN_GET_COUNTRIES_WITH_PHOTOS');
+ })
+ .catch(err => {
+ console.error(err);
+ });
+ },
+
+ /**
+ * Get list of countries that contain photos for verification
+ */
+ async ADMIN_GET_COUNTRIES_WITH_PHOTOS (context)
+ {
+ await axios.get('/admin/get-countries-with-photos')
+ .then(response => {
+ console.log('admin_get_countries_with_photos', response);
+
+ context.commit('setCountriesWithPhotos', response.data);
+ })
+ .catch(err => {
+ console.error(err);
+ });
+ }
+};
diff --git a/resources/js/store/modules/admin/index.js b/resources/old_js/store/modules/admin/index.js
similarity index 100%
rename from resources/js/store/modules/admin/index.js
rename to resources/old_js/store/modules/admin/index.js
diff --git a/resources/js/store/modules/admin/init.js b/resources/old_js/store/modules/admin/init.js
similarity index 100%
rename from resources/js/store/modules/admin/init.js
rename to resources/old_js/store/modules/admin/init.js
diff --git a/resources/js/store/modules/admin/mutations.js b/resources/old_js/store/modules/admin/mutations.js
similarity index 100%
rename from resources/js/store/modules/admin/mutations.js
rename to resources/old_js/store/modules/admin/mutations.js
diff --git a/resources/js/store/modules/alldata/actions.js b/resources/old_js/store/modules/alldata/actions.js
similarity index 100%
rename from resources/js/store/modules/alldata/actions.js
rename to resources/old_js/store/modules/alldata/actions.js
diff --git a/resources/js/store/modules/alldata/index.js b/resources/old_js/store/modules/alldata/index.js
similarity index 100%
rename from resources/js/store/modules/alldata/index.js
rename to resources/old_js/store/modules/alldata/index.js
diff --git a/resources/js/store/modules/alldata/mutations.js b/resources/old_js/store/modules/alldata/mutations.js
similarity index 100%
rename from resources/js/store/modules/alldata/mutations.js
rename to resources/old_js/store/modules/alldata/mutations.js
diff --git a/resources/old_js/store/modules/bbox/actions.js b/resources/old_js/store/modules/bbox/actions.js
new file mode 100644
index 000000000..70b5da0aa
--- /dev/null
+++ b/resources/old_js/store/modules/bbox/actions.js
@@ -0,0 +1,224 @@
+import Vue from 'vue';
+import routes from '../../../routes';
+
+export const actions = {
+
+ /**
+ * Add annotations to an image
+ */
+ async ADD_BOXES_TO_IMAGE (context)
+ {
+ await axios.post('/bbox/create', {
+ photo_id: context.rootState.admin.id,
+ boxes: context.state.boxes
+ })
+ .then(response => {
+ console.log('add_boxes_to_image', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title: 'Success!',
+ body: 'Thank you for helping us clean the planet!',
+ position: 'top-right'
+ });
+
+ context.dispatch('GET_NEXT_BBOX');
+ }
+ })
+ .catch(error => {
+ console.error('add_boxes_to_image', error);
+ });
+ },
+
+ /**
+ * Mark this image as unable to use for bbox
+ *
+ * Load the next image
+ *
+ * @payload bool (isVerifying)
+ */
+ async BBOX_SKIP_IMAGE (context, payload)
+ {
+ await axios.post('/bbox/skip', {
+ photo_id: context.rootState.admin.id
+ })
+ .then(response => {
+ console.log('bbox_skip_image', response);
+
+ Vue.$vToastify.success({
+ title: 'Skipping',
+ body: 'This image will not be used for AI',
+ position: 'top-right'
+ });
+
+ // load next image
+ (payload)
+ ? context.dispatch('GET_NEXT_BOXES_TO_VERIFY')
+ : context.dispatch('GET_NEXT_BBOX');
+ })
+ .catch(error => {
+ console.error('bbox_skip_image', error);
+ });
+ },
+
+ /**
+ * Update the tags for a bounding box image
+ */
+ async BBOX_UPDATE_TAGS (context)
+ {
+ await axios.post('/bbox/tags/update', {
+ photoId: context.rootState.admin.id,
+ tags: context.rootState.litter.tags
+ })
+ .then(response => {
+ console.log('bbox_update_tags', response);
+
+ Vue.$vToastify.success({
+ title: 'Updated',
+ body: 'The tags for this image have been updated',
+ position: 'top-right'
+ });
+
+ const boxes = [...context.state.boxes];
+
+ // Update boxes based on tags in the image
+ context.commit('initBboxTags', context.rootState.litter.tags);
+
+ context.commit('updateBoxPositions', boxes);
+ })
+ .catch(error => {
+ console.error('bbox_update_tags', error);
+ });
+ },
+
+ /**
+ * Non-admins cannot update tags.
+ *
+ * Normal users can mark a box with incorrect tags that an Admin must inspect.
+ */
+ async BBOX_WRONG_TAGS (context)
+ {
+ await axios.post('/bbox/tags/wrong', {
+ photoId: context.rootState.admin.id,
+ })
+ .then(response => {
+ console.log('bbox_wrong_tags', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title: 'Thanks for helping!',
+ body: 'An admin will update these tags',
+ position: 'top-right'
+ });
+ }
+ })
+ .catch(error => {
+ console.error('bbox_wrong_tags', error);
+ });
+ },
+
+ /**
+ * Get the next image to add bounding box
+ */
+ async GET_NEXT_BBOX (context)
+ {
+ await axios.get('/bbox/index')
+ .then(response => {
+ console.log('next_bb_img', response);
+
+ context.commit('adminImage', {
+ id: response.data.photo.id,
+ filename: response.data.photo.five_hundred_square_filepath // filename
+ });
+
+ // litter.old_js
+ context.commit('initAdminItems', response.data.photo);
+
+ // bbox.old_js
+ context.commit('initBboxTags', response.data.photo);
+
+ // box counts
+ context.commit('bboxCount', {
+ usersBoxCount: response.data.usersBoxCount,
+ totalBoxCount: response.data.totalBoxCount
+ })
+
+ context.commit('adminLoading', false);
+ })
+ .catch(error => {
+ console.log('error.next_bb_img', error);
+ });
+ },
+
+ /**
+ * Get the next image that has boxes to be verified
+ */
+ async GET_NEXT_BOXES_TO_VERIFY (context)
+ {
+ await axios.get('/bbox/verify/index')
+ .then(response => {
+ console.log('verify_next_box', response);
+
+ if (response.data.photo)
+ {
+ context.commit('adminImage', {
+ id: response.data.photo.id,
+ filename: response.data.photo.five_hundred_square_filepath // filename
+ });
+
+ // litter.old_js
+ context.commit('initAdminItems', response.data.photo);
+
+ // bbox.old_js
+ context.commit('initBoxesToVerify', response.data.photo.boxes);
+
+ // bbox.old_js
+ // context.commit('bboxCount', {
+ // usersBoxCount: response.data.usersBoxCount,
+ // totalBoxCount: response.data.totalBoxCount
+ // })
+
+ context.commit('adminLoading', false);
+ }
+ else
+ {
+ // todo
+ // routes.push({ path: '/bbox' });
+ }
+ })
+ .catch(error => {
+ console.log('error.verify_next_box', error);
+ });
+ },
+
+ /**
+ * Verify the boxes are placed correctly and match the tags
+ */
+ async VERIFY_BOXES (context)
+ {
+ await axios.post('/bbox/verify/update', {
+ photo_id: context.rootState.admin.id,
+ hasChanged: context.state.hasChanged,
+ boxes: context.state.boxes
+ })
+ .then(response => {
+ console.log('verify_boxes', response);
+
+ if (response.data.success)
+ {
+ Vue.$vToastify.success({
+ title: 'Verified',
+ body: 'Stage 4 level achieved!',
+ position: 'top-right'
+ });
+
+ context.dispatch('GET_NEXT_BOXES_TO_VERIFY');
+ }
+ })
+ .catch(error => {
+ console.error('verify_boxes', error);
+ });
+ }
+}
diff --git a/resources/js/store/modules/bbox/index.js b/resources/old_js/store/modules/bbox/index.js
similarity index 100%
rename from resources/js/store/modules/bbox/index.js
rename to resources/old_js/store/modules/bbox/index.js
diff --git a/resources/js/store/modules/bbox/mutations.js b/resources/old_js/store/modules/bbox/mutations.js
similarity index 100%
rename from resources/js/store/modules/bbox/mutations.js
rename to resources/old_js/store/modules/bbox/mutations.js
diff --git a/resources/js/store/modules/citymap/actions.js b/resources/old_js/store/modules/citymap/actions.js
similarity index 100%
rename from resources/js/store/modules/citymap/actions.js
rename to resources/old_js/store/modules/citymap/actions.js
diff --git a/resources/js/store/modules/citymap/index.js b/resources/old_js/store/modules/citymap/index.js
similarity index 100%
rename from resources/js/store/modules/citymap/index.js
rename to resources/old_js/store/modules/citymap/index.js
diff --git a/resources/js/store/modules/citymap/init.js b/resources/old_js/store/modules/citymap/init.js
similarity index 100%
rename from resources/js/store/modules/citymap/init.js
rename to resources/old_js/store/modules/citymap/init.js
diff --git a/resources/js/store/modules/citymap/mutations.js b/resources/old_js/store/modules/citymap/mutations.js
similarity index 100%
rename from resources/js/store/modules/citymap/mutations.js
rename to resources/old_js/store/modules/citymap/mutations.js
diff --git a/resources/js/store/modules/cleanups/actions.js b/resources/old_js/store/modules/cleanups/actions.js
similarity index 100%
rename from resources/js/store/modules/cleanups/actions.js
rename to resources/old_js/store/modules/cleanups/actions.js
diff --git a/resources/js/store/modules/cleanups/index.js b/resources/old_js/store/modules/cleanups/index.js
similarity index 100%
rename from resources/js/store/modules/cleanups/index.js
rename to resources/old_js/store/modules/cleanups/index.js
diff --git a/resources/js/store/modules/cleanups/mutations.js b/resources/old_js/store/modules/cleanups/mutations.js
similarity index 100%
rename from resources/js/store/modules/cleanups/mutations.js
rename to resources/old_js/store/modules/cleanups/mutations.js
diff --git a/resources/js/store/modules/community/actions.js b/resources/old_js/store/modules/community/actions.js
similarity index 100%
rename from resources/js/store/modules/community/actions.js
rename to resources/old_js/store/modules/community/actions.js
diff --git a/resources/js/store/modules/community/index.js b/resources/old_js/store/modules/community/index.js
similarity index 100%
rename from resources/js/store/modules/community/index.js
rename to resources/old_js/store/modules/community/index.js
diff --git a/resources/js/store/modules/community/init.js b/resources/old_js/store/modules/community/init.js
similarity index 100%
rename from resources/js/store/modules/community/init.js
rename to resources/old_js/store/modules/community/init.js
diff --git a/resources/js/store/modules/community/mutations.js b/resources/old_js/store/modules/community/mutations.js
similarity index 100%
rename from resources/js/store/modules/community/mutations.js
rename to resources/old_js/store/modules/community/mutations.js
diff --git a/resources/js/store/modules/donate/actions.js b/resources/old_js/store/modules/donate/actions.js
similarity index 100%
rename from resources/js/store/modules/donate/actions.js
rename to resources/old_js/store/modules/donate/actions.js
diff --git a/resources/js/store/modules/donate/index.js b/resources/old_js/store/modules/donate/index.js
similarity index 100%
rename from resources/js/store/modules/donate/index.js
rename to resources/old_js/store/modules/donate/index.js
diff --git a/resources/js/store/modules/donate/init.js b/resources/old_js/store/modules/donate/init.js
similarity index 100%
rename from resources/js/store/modules/donate/init.js
rename to resources/old_js/store/modules/donate/init.js
diff --git a/resources/js/store/modules/donate/mutations.js b/resources/old_js/store/modules/donate/mutations.js
similarity index 100%
rename from resources/js/store/modules/donate/mutations.js
rename to resources/old_js/store/modules/donate/mutations.js
diff --git a/resources/js/store/modules/errors/index.js b/resources/old_js/store/modules/errors/index.js
similarity index 100%
rename from resources/js/store/modules/errors/index.js
rename to resources/old_js/store/modules/errors/index.js
diff --git a/resources/js/store/modules/errors/mutations.js b/resources/old_js/store/modules/errors/mutations.js
similarity index 100%
rename from resources/js/store/modules/errors/mutations.js
rename to resources/old_js/store/modules/errors/mutations.js
diff --git a/resources/old_js/store/modules/globalmap/actions.js b/resources/old_js/store/modules/globalmap/actions.js
new file mode 100644
index 000000000..1f710c99e
--- /dev/null
+++ b/resources/old_js/store/modules/globalmap/actions.js
@@ -0,0 +1,3 @@
+export const actions = {
+
+}
diff --git a/resources/js/store/modules/globalmap/index.js b/resources/old_js/store/modules/globalmap/index.js
similarity index 100%
rename from resources/js/store/modules/globalmap/index.js
rename to resources/old_js/store/modules/globalmap/index.js
diff --git a/resources/js/store/modules/globalmap/init.js b/resources/old_js/store/modules/globalmap/init.js
similarity index 100%
rename from resources/js/store/modules/globalmap/init.js
rename to resources/old_js/store/modules/globalmap/init.js
diff --git a/resources/js/store/modules/globalmap/mutations.js b/resources/old_js/store/modules/globalmap/mutations.js
similarity index 100%
rename from resources/js/store/modules/globalmap/mutations.js
rename to resources/old_js/store/modules/globalmap/mutations.js
diff --git a/resources/js/store/modules/leaderboard/actions.js b/resources/old_js/store/modules/leaderboard/actions.js
similarity index 100%
rename from resources/js/store/modules/leaderboard/actions.js
rename to resources/old_js/store/modules/leaderboard/actions.js
diff --git a/resources/js/store/modules/leaderboard/index.js b/resources/old_js/store/modules/leaderboard/index.js
similarity index 100%
rename from resources/js/store/modules/leaderboard/index.js
rename to resources/old_js/store/modules/leaderboard/index.js
diff --git a/resources/js/store/modules/leaderboard/mutations.js b/resources/old_js/store/modules/leaderboard/mutations.js
similarity index 100%
rename from resources/js/store/modules/leaderboard/mutations.js
rename to resources/old_js/store/modules/leaderboard/mutations.js
diff --git a/resources/js/store/modules/litter/actions.js b/resources/old_js/store/modules/litter/actions.js
similarity index 100%
rename from resources/js/store/modules/litter/actions.js
rename to resources/old_js/store/modules/litter/actions.js
diff --git a/resources/old_js/store/modules/litter/getters.js b/resources/old_js/store/modules/litter/getters.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/js/store/modules/litter/index.js b/resources/old_js/store/modules/litter/index.js
similarity index 100%
rename from resources/js/store/modules/litter/index.js
rename to resources/old_js/store/modules/litter/index.js
diff --git a/resources/old_js/store/modules/litter/init.js b/resources/old_js/store/modules/litter/init.js
new file mode 100644
index 000000000..9fbed832d
--- /dev/null
+++ b/resources/old_js/store/modules/litter/init.js
@@ -0,0 +1,15 @@
+export const init = {
+ category: 'smoking', // currently selected category.
+ hasAddedNewTag: false, // Has the admin added a new tag yet? If FALSE, disable "Update With New Tags button"
+ pickedUp: null, // true = picked up
+ tag: 'butts', // currently selected item
+ customTag: '', // currently selected custom tag
+ loading: false,
+ photos: {}, // paginated photos object
+ tags: {}, // added tags go here -> { photoId: { smoking: { butts: 1, lighters: 2 }, alcohol: { beer_cans: 3 } }, ... };
+ customTags: {},
+ customTagsError: '',
+ submitting: false,
+ recentTags: {},
+ recentCustomTags: [],
+};
diff --git a/resources/old_js/store/modules/litter/mutations.js b/resources/old_js/store/modules/litter/mutations.js
new file mode 100644
index 000000000..5fe67105f
--- /dev/null
+++ b/resources/old_js/store/modules/litter/mutations.js
@@ -0,0 +1,391 @@
+import { categories } from '../../../extra/categories'
+import { litterkeys } from '../../../extra/litterkeys'
+import { init } from './init'
+import i18n from "../../../i18n";
+// import { MAX_RECENTLY_TAGS } from '../../../constants'
+
+export const mutations = {
+ /**
+ * Add a tag that was just used, so the user can easily use it again on the next image
+ */
+ addRecentTag (state, payload)
+ {
+ let tags = Object.assign({}, state.recentTags);
+
+ tags = {
+ ...tags,
+ [payload.category]: {
+ ...tags[payload.category],
+ [payload.tag]: 1 // quantity not important
+ }
+ }
+
+ // Sort them alphabetically by translated values
+ const sortedTags = tags;
+ Object.entries(tags).forEach(([category, categoryTags]) => {
+ const sorted = Object.entries(categoryTags).sort(function (a, b) {
+ const first = i18n.t(`litter.${category}.${a[0]}`);
+ const second = i18n.t(`litter.${category}.${b[0]}`);
+ return first === second ? 0 : first < second ? -1 : 1;
+ });
+ sortedTags[category] = Object.fromEntries(sorted);
+ });
+
+ state.recentTags = sortedTags;
+ },
+
+ /**
+ * Add a Tag to a photo.
+ *
+ * This will set Photo.id => Category => Tag.key: Tag.quantity
+ *
+ * state.tags = {
+ * photo.id = {
+ * category.key = {
+ * tag.key: tag.quantity
+ * }
+ * }
+ * }
+ */
+ addTag (state, payload)
+ {
+ state.hasAddedNewTag = true; // Enable the Update Button
+
+ let tags = Object.assign({}, state.tags);
+
+ tags = {
+ ...tags,
+ [payload.photoId]: {
+ ...tags[payload.photoId],
+ [payload.category]: {
+ ...(tags[payload.photoId] ? tags[payload.photoId][payload.category] : {}),
+ [payload.tag]: payload.quantity
+ }
+ }
+ };
+
+ state.tags = tags;
+ },
+
+ /**
+ * Add a Custom Tag to a photo.
+ */
+ addCustomTag (state, payload)
+ {
+ let tags = Object.assign({}, state.customTags);
+
+ if (!tags[payload.photoId]) {
+ tags[payload.photoId] = [];
+ }
+
+ // Case-insensitive check for existing tags
+ if (tags[payload.photoId].find(tag => tag.toLowerCase() === payload.customTag.toLowerCase()) !== undefined)
+ {
+ state.customTagsError = i18n.t('tags.tag-already-added');
+ return;
+ }
+
+ if (tags[payload.photoId].length >= 3)
+ {
+ state.customTagsError = i18n.t('tags.tag-limit-reached');
+ return;
+ }
+
+ tags[payload.photoId].unshift(payload.customTag);
+
+ // Also add this tag to the recent custom tags
+ if (state.recentCustomTags.indexOf(payload.customTag) === -1)
+ {
+ state.recentCustomTags.push(payload.customTag);
+ // Sort them alphabetically
+ state.recentCustomTags.sort(function(a, b) {
+ return a === b ? 0 : a < b ? -1 : 1;
+ });
+ }
+
+ // And indicate that a new tag has been added
+ state.hasAddedNewTag = true; // Enable the Update Button
+ state.customTagsError = ''; // Clear the error
+ state.customTags = tags;
+ },
+
+ /**
+ * Clear the tags object (When we click next/previous image on pagination)
+ */
+ clearTags (state, photoId)
+ {
+ if (photoId !== null) {
+ delete state.tags[photoId];
+ delete state.customTags[photoId];
+ } else {
+ state.tags = Object.assign({});
+ state.customTags = Object.assign({});
+ }
+
+ state.hasAddedNewTag = false; // Disable the Admin Update Button
+ },
+
+ /**
+ * Update the currently selected category
+ * Update the items for that category
+ * Select the first item
+ *
+ * payload = key "smoking"
+ */
+ changeCategory (state, payload)
+ {
+ state.category = payload;
+ },
+
+ /**
+ * Change the currently selected tag
+ *
+ * One category has many tags
+ */
+ changeTag (state, payload)
+ {
+ state.tag = payload;
+ },
+
+ /**
+ * Change the currently selected custom tag
+ */
+ changeCustomTag (state, payload)
+ {
+ state.customTag = payload;
+ },
+
+ setCustomTagsError (state, payload)
+ {
+ state.customTagsError = payload;
+ },
+
+ /**
+ * Data from the user to verify
+ * map database column name to frontend string
+ */
+ initAdminItems (state, payload)
+ {
+ let tags = {};
+
+ categories.map(category => {
+ if (payload.hasOwnProperty(category) && payload[category])
+ {
+ litterkeys[category].map(item => {
+
+ if (payload[category][item])
+ {
+ tags = {
+ ...tags,
+ [payload.id]: {
+ ...tags[payload.id],
+ [category]: {
+ ...(tags[payload.id] ? tags[payload.id][category] : {}),
+ [item]: payload[category][item]
+ }
+ }
+ };
+ }
+ });
+ }
+ });
+
+ state.tags = tags;
+ },
+
+ /**
+ * Data from the user to verify
+ * map database column name to frontend string
+ */
+ initAdminCustomTags (state, payload)
+ {
+ state.customTags = {
+ [payload.id]: payload.custom_tags.map(t => t.tag)
+ };
+ },
+
+ /**
+ * When AddTags is created, we check localStorage for the users recentTags
+ */
+ initRecentTags (state, payload)
+ {
+ state.recentTags = payload;
+ },
+
+ /**
+ * When AddTags is created, we check localStorage for the users recentCustomTags
+ */
+ initRecentCustomTags (state, payload)
+ {
+ state.recentCustomTags = payload;
+ },
+
+ /**
+ * Remove a tag from a category
+ * If category is empty, delete category
+ */
+ removeTag (state, payload)
+ {
+ let tags = Object.assign({}, state.tags);
+
+ delete tags[payload.photoId][payload.category][payload.tag_key];
+
+ if (Object.keys(tags[payload.photoId][payload.category]).length === 0)
+ {
+ delete tags[payload.photoId][payload.category];
+ }
+
+ state.tags = tags;
+ },
+
+ /**
+ * Remove a recent tag
+ * If category is empty, delete category
+ */
+ removeRecentTag (state, payload)
+ {
+ let tags = Object.assign({}, state.recentTags);
+
+ delete tags[payload.category][payload.tag];
+
+ if (Object.keys(tags[payload.category]).length === 0)
+ {
+ delete tags[payload.category];
+ }
+
+ state.recentTags = tags;
+ },
+
+ /**
+ * Admin
+ * Change photo[category][tag] = 0;
+ */
+ resetTag (state, payload)
+ {
+ let tags = Object.assign({}, state.tags);
+
+ tags[payload.photoId][payload.category][payload.tag_key] = 0;
+
+ state.tags = tags;
+ state.hasAddedNewTag = true; // activate update_with_new_tags button
+ },
+
+ /**
+ * Remove a custom tag
+ */
+ removeCustomTag (state, payload)
+ {
+ let tags = Object.assign({}, state.customTags);
+
+ tags[payload.photoId] = tags[payload.photoId].filter(tag => tag !== payload.customTag);
+
+ state.customTags = tags;
+ state.hasAddedNewTag = true; // activate update_with_new_tags button
+ },
+
+ /**
+ * Remove a recent custom tag
+ */
+ removeRecentCustomTag (state, payload)
+ {
+ let tags = Object.assign([], state.recentCustomTags);
+
+ tags = tags.filter(tag => tag !== payload);
+
+ state.recentCustomTags = tags;
+ },
+
+ /**
+ * Reset the user object (when we logout)
+ */
+ resetState (state)
+ {
+ Object.assign(state, init);
+ },
+
+ /**
+ * Reset empty state
+ */
+ resetLitter (state)
+ {
+ state.categories = {
+ 'Alcohol': {},
+ 'Art': {},
+ 'Brands': {},
+ 'Coastal': {},
+ 'Coffee': {},
+ 'Dumping': {},
+ 'Drugs': {},
+ 'Food': {},
+ 'Industrial': {},
+ 'Other': {},
+ 'Sanitary': {},
+ 'Smoking': {},
+ 'SoftDrinks': {},
+ 'TrashDog': {}
+ }
+ },
+
+ /**
+ * Set all existing items to 0
+ *
+ * Admin @ reset
+ */
+ setAllTagsToZero (state, photoId)
+ {
+ let original_tags = Object.assign({}, state.tags[photoId]);
+
+ Object.entries(original_tags).map(keys => {
+
+ let category = keys[0]; // alcohol
+ let category_tags = keys[1]; // { cans: 1, beerBottle: 2 }
+
+ if (Object.keys(original_tags[category]).length > 0)
+ {
+ Object.keys(category_tags).map(tag => {
+ original_tags[category][tag] = 0;
+ });
+ }
+ });
+
+ state.tags = {
+ ...state.tags,
+ [photoId]: original_tags
+ };
+ },
+
+ /**
+ * When the user object is created (page refresh or login), we set the users default presence value here
+ * If the litter is picked up, this value will be 'true'
+ */
+ set_default_litter_picked_up (state, payload)
+ {
+ state.pickedUp = payload;
+ },
+
+ /**
+ *
+ */
+ setLang (state, payload)
+ {
+ state.categoryNames = payload.categoryNames;
+ state.currentCategory = payload.currentCategory;
+ state.currentItem = payload.currentItem;
+ state.litterlang = payload.litterlang;
+ },
+
+ /**
+ *
+ */
+ togglePickedUp (state)
+ {
+ state.pickedUp = !state.pickedUp;
+ },
+ /**
+ *
+ */
+ toggleSubmit (state)
+ {
+ state.submitting = !state.submitting;
+ }
+};
diff --git a/resources/js/store/modules/littercoin/merchants/actions.js b/resources/old_js/store/modules/littercoin/merchants/actions.js
similarity index 100%
rename from resources/js/store/modules/littercoin/merchants/actions.js
rename to resources/old_js/store/modules/littercoin/merchants/actions.js
diff --git a/resources/js/store/modules/littercoin/merchants/index.js b/resources/old_js/store/modules/littercoin/merchants/index.js
similarity index 100%
rename from resources/js/store/modules/littercoin/merchants/index.js
rename to resources/old_js/store/modules/littercoin/merchants/index.js
diff --git a/resources/js/store/modules/littercoin/merchants/mutations.js b/resources/old_js/store/modules/littercoin/merchants/mutations.js
similarity index 100%
rename from resources/js/store/modules/littercoin/merchants/mutations.js
rename to resources/old_js/store/modules/littercoin/merchants/mutations.js
diff --git a/resources/old_js/store/modules/locations/actions.js b/resources/old_js/store/modules/locations/actions.js
new file mode 100644
index 000000000..d80cb5dbd
--- /dev/null
+++ b/resources/old_js/store/modules/locations/actions.js
@@ -0,0 +1,201 @@
+import Vue from 'vue'
+import i18n from '../../../i18n'
+import routes from '../../../routes';
+
+export const actions = {
+
+ /**
+ * Download data for a location
+ *
+ * @payload (type|string) is location_type. eg 'country', 'state' or 'city'
+ */
+ async DOWNLOAD_DATA (context, payload)
+ {
+ let title = i18n.t('notifications.success');
+ let body = 'Your download is being processed and will be emailed to you soon';
+
+ await axios.post('/download', {
+ locationType: payload.locationType,
+ locationId: payload.locationId,
+ email: payload.email
+ })
+ .then(response => {
+ console.log('download_data', response);
+
+ if (response.data.success)
+ {
+ /* improve this */
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ }
+ else
+ {
+ /* improve this */
+ Vue.$vToastify.success({
+ title: 'Error',
+ body: 'Sorry, there was an error with the download. Please contact support',
+ position: 'top-right'
+ });
+ }
+
+
+ })
+ .catch(error => {
+ console.error('download_data', error);
+ });
+ },
+
+ // We don't need this yet but we might later
+ // /**
+ // * Load the data for any location
+ // */
+ // async GET_LOCATION_DATA (context, payload)
+ // {
+ // await axios.get('location', {
+ // params: {
+ // locationType: payload.locationType,
+ // id: payload.id
+ // }
+ // })
+ // .then(response => {
+ // console.log('get_location_data', response);
+ //
+ // if (payload.locationType === 'country')
+ // {
+ // context.commit('setStates', response.data)
+ //
+ // routes.push('/world/' + response.data.countryName);
+ // }
+ // else if (payload.locationType === 'state')
+ // {
+ // context.commit('setCities', response.data)
+ // }
+ // else if (payload.locationType === 'city')
+ // {
+ // console.log('set cities?');
+ // }
+ // else
+ // {
+ // console.log('wrong location type');
+ // }
+ //
+ // // router.push({ path: '/world/' + response.data.countryName });
+ //
+ // })
+ // .catch(error => {
+ // console.log('get_location_data', error);
+ // });
+ // },
+
+ /**
+ * Replacement for GET_COUNTRIES
+ *
+ * We should move this to worldcup.old_js
+ */
+ async GET_WORLD_CUP_DATA (context)
+ {
+ await axios.get('/get-world-cup-data')
+ .then(response => {
+ console.log('get_world_cup_data', response);
+
+ context.commit('setCountries', response.data);
+ })
+ .catch(error => {
+ console.log('error.get_world_cup_data', error);
+ });
+ },
+
+ async GET_LIST_OF_COUNTRY_NAMES (context)
+ {
+ await axios.get('/countries/names')
+ .then(response => {
+ console.log('get_list_of_country_names', response);
+
+ if (response.data.success) {
+ context.commit('setCountryNames', response.data.countries);
+ }
+ })
+ .catch(error => {
+ console.log('error.get_list_of_country_names', error);
+ });
+ },
+
+ /**
+ * Get all countries data + global metadata for the world cup page
+ */
+ async GET_COUNTRIES (context)
+ {
+ await axios.get('countries')
+ .then(response => {
+ console.log('get_countries', response);
+
+ context.commit('setCountries', response.data);
+ })
+ .catch(error => {
+ console.log('error.get_countries', error);
+ });
+ },
+
+ /**
+ * Get all states for a country
+ */
+ async GET_STATES (context, payload)
+ {
+ await axios.get('/states', {
+ params: {
+ country: payload
+ }
+ })
+ .then(response => {
+ console.log('get_states', response);
+
+ if (response.data.success)
+ {
+ context.commit('countryName', response.data.countryName);
+
+ context.commit('setLocations', response.data.states)
+ }
+ else
+ {
+ routes.push({ 'path': '/world' });
+ }
+ })
+ .catch(error => {
+ console.log('error.get_states', error);
+ });
+ },
+
+ /**
+ * Get all cities for a state, country
+ */
+ async GET_CITIES (context, payload)
+ {
+ await axios.get('/cities', {
+ params: {
+ country: payload.country,
+ state: payload.state
+ }
+ })
+ .then(response => {
+ console.log('get_cities', response);
+
+ if (response.data.success)
+ {
+ context.commit('countryName', response.data.country);
+ context.commit('stateName', response.data.state);
+
+ context.commit('setLocations', response.data.cities)
+ }
+ else
+ {
+ routes.push({ 'path': '/world' })
+ }
+ })
+ .catch(error => {
+ console.log('error.get_cities', error);
+ });
+ }
+};
diff --git a/resources/js/store/modules/locations/index.js b/resources/old_js/store/modules/locations/index.js
similarity index 100%
rename from resources/js/store/modules/locations/index.js
rename to resources/old_js/store/modules/locations/index.js
diff --git a/resources/js/store/modules/locations/init.js b/resources/old_js/store/modules/locations/init.js
similarity index 100%
rename from resources/js/store/modules/locations/init.js
rename to resources/old_js/store/modules/locations/init.js
diff --git a/resources/js/store/modules/locations/mutations.js b/resources/old_js/store/modules/locations/mutations.js
similarity index 100%
rename from resources/js/store/modules/locations/mutations.js
rename to resources/old_js/store/modules/locations/mutations.js
diff --git a/resources/js/store/modules/modal/actions.js b/resources/old_js/store/modules/modal/actions.js
similarity index 100%
rename from resources/js/store/modules/modal/actions.js
rename to resources/old_js/store/modules/modal/actions.js
diff --git a/resources/js/store/modules/modal/index.js b/resources/old_js/store/modules/modal/index.js
similarity index 100%
rename from resources/js/store/modules/modal/index.js
rename to resources/old_js/store/modules/modal/index.js
diff --git a/resources/js/store/modules/modal/init.js b/resources/old_js/store/modules/modal/init.js
similarity index 100%
rename from resources/js/store/modules/modal/init.js
rename to resources/old_js/store/modules/modal/init.js
diff --git a/resources/old_js/store/modules/modal/mutations.js b/resources/old_js/store/modules/modal/mutations.js
new file mode 100644
index 000000000..4c7d42c7f
--- /dev/null
+++ b/resources/old_js/store/modules/modal/mutations.js
@@ -0,0 +1,7 @@
+import { init } from './init'
+
+export const mutations = {
+
+
+
+};
diff --git a/resources/js/store/modules/payments/index.js b/resources/old_js/store/modules/payments/index.js
similarity index 100%
rename from resources/js/store/modules/payments/index.js
rename to resources/old_js/store/modules/payments/index.js
diff --git a/resources/js/store/modules/payments/init.js b/resources/old_js/store/modules/payments/init.js
similarity index 100%
rename from resources/js/store/modules/payments/init.js
rename to resources/old_js/store/modules/payments/init.js
diff --git a/resources/js/store/modules/photos/actions.js b/resources/old_js/store/modules/photos/actions.js
similarity index 100%
rename from resources/js/store/modules/photos/actions.js
rename to resources/old_js/store/modules/photos/actions.js
diff --git a/resources/js/store/modules/photos/index.js b/resources/old_js/store/modules/photos/index.js
similarity index 100%
rename from resources/js/store/modules/photos/index.js
rename to resources/old_js/store/modules/photos/index.js
diff --git a/resources/js/store/modules/photos/init.js b/resources/old_js/store/modules/photos/init.js
similarity index 100%
rename from resources/js/store/modules/photos/init.js
rename to resources/old_js/store/modules/photos/init.js
diff --git a/resources/js/store/modules/photos/mutations.js b/resources/old_js/store/modules/photos/mutations.js
similarity index 100%
rename from resources/js/store/modules/photos/mutations.js
rename to resources/old_js/store/modules/photos/mutations.js
diff --git a/resources/js/store/modules/plans/actions.js b/resources/old_js/store/modules/plans/actions.js
similarity index 100%
rename from resources/js/store/modules/plans/actions.js
rename to resources/old_js/store/modules/plans/actions.js
diff --git a/resources/js/store/modules/plans/index.js b/resources/old_js/store/modules/plans/index.js
similarity index 100%
rename from resources/js/store/modules/plans/index.js
rename to resources/old_js/store/modules/plans/index.js
diff --git a/resources/js/store/modules/plans/init.js b/resources/old_js/store/modules/plans/init.js
similarity index 100%
rename from resources/js/store/modules/plans/init.js
rename to resources/old_js/store/modules/plans/init.js
diff --git a/resources/js/store/modules/plans/mutations.js b/resources/old_js/store/modules/plans/mutations.js
similarity index 100%
rename from resources/js/store/modules/plans/mutations.js
rename to resources/old_js/store/modules/plans/mutations.js
diff --git a/resources/js/store/modules/subscriber/actions.js b/resources/old_js/store/modules/subscriber/actions.js
similarity index 100%
rename from resources/js/store/modules/subscriber/actions.js
rename to resources/old_js/store/modules/subscriber/actions.js
diff --git a/resources/js/store/modules/subscriber/index.js b/resources/old_js/store/modules/subscriber/index.js
similarity index 100%
rename from resources/js/store/modules/subscriber/index.js
rename to resources/old_js/store/modules/subscriber/index.js
diff --git a/resources/old_js/store/modules/subscriber/init.js b/resources/old_js/store/modules/subscriber/init.js
new file mode 100644
index 000000000..d883359c6
--- /dev/null
+++ b/resources/old_js/store/modules/subscriber/init.js
@@ -0,0 +1,5 @@
+export const init = {
+ errors: {},
+ just_subscribed: false, // show Success notification when just subscribed
+ subscription: {}
+};
diff --git a/resources/js/store/modules/subscriber/mutations.js b/resources/old_js/store/modules/subscriber/mutations.js
similarity index 100%
rename from resources/js/store/modules/subscriber/mutations.js
rename to resources/old_js/store/modules/subscriber/mutations.js
diff --git a/resources/old_js/store/modules/tags/index.js b/resources/old_js/store/modules/tags/index.js
new file mode 100644
index 000000000..2e5b25c60
--- /dev/null
+++ b/resources/old_js/store/modules/tags/index.js
@@ -0,0 +1,11 @@
+import { mutations } from "./mutations.js";
+
+const state = {
+ objects: [],
+ selectedObjectId: 0,
+};
+
+export const tags = {
+ state,
+ mutations
+};
diff --git a/resources/old_js/store/modules/tags/mutations.js b/resources/old_js/store/modules/tags/mutations.js
new file mode 100644
index 000000000..83e1edc75
--- /dev/null
+++ b/resources/old_js/store/modules/tags/mutations.js
@@ -0,0 +1,55 @@
+export const mutations = {
+
+ createLitterObject (state, payload) {
+ const id = state.objects.length;
+
+ state.objects.push({
+ id,
+ category: null,
+ object: null,
+ brand: null,
+ tag_type: null,
+ quantity: null,
+ picked_up: payload.pickedUp,
+ materials: [],
+ custom_tags: []
+ });
+
+ state.selectedObjectId = id;
+ },
+
+ addTagToObject (state, payload) {
+
+ let objs = [...state.objects];
+
+ let obj = Object.assign(objs[state.selectedObjectId]);
+
+ if (!obj.category) {
+ obj.category = payload.category;
+ }
+
+ if (!obj.object) {
+ obj.object = payload.object;
+ }
+
+ if (!obj.brand) {
+ obj.brand = payload.brand
+ }
+
+ if (payload.category !== 'brands') {
+ obj.quantity = payload.quantity;
+ }
+
+ obj.picked_up = payload.pickedUp;
+
+ state.objects = objs;
+ },
+
+ changeObjectSelected (state, payload) {
+ state.selectedObjectId = payload;
+ },
+
+ deleteLitterObject (state, payload) {
+ state.objects = state.objects.filter(obj => obj.id !== payload);
+ }
+}
diff --git a/resources/js/store/modules/teams/actions.js b/resources/old_js/store/modules/teams/actions.js
similarity index 100%
rename from resources/js/store/modules/teams/actions.js
rename to resources/old_js/store/modules/teams/actions.js
diff --git a/resources/js/store/modules/teams/index.js b/resources/old_js/store/modules/teams/index.js
similarity index 100%
rename from resources/js/store/modules/teams/index.js
rename to resources/old_js/store/modules/teams/index.js
diff --git a/resources/js/store/modules/teams/mutations.js b/resources/old_js/store/modules/teams/mutations.js
similarity index 100%
rename from resources/js/store/modules/teams/mutations.js
rename to resources/old_js/store/modules/teams/mutations.js
diff --git a/resources/old_js/store/modules/user/actions.js b/resources/old_js/store/modules/user/actions.js
new file mode 100644
index 000000000..bb996a23f
--- /dev/null
+++ b/resources/old_js/store/modules/user/actions.js
@@ -0,0 +1,426 @@
+import routes from '../../../routes'
+import Vue from "vue";
+import i18n from "../../../i18n";
+import router from '../../../routes';
+
+export const actions = {
+
+ /**
+ * The user wants to change their password
+ * 1. Validate old password
+ * 2. Validate new password
+ * 3. Change password & return success
+ */
+ async CHANGE_PASSWORD (context, payload)
+ {
+ await axios.patch('/settings/details/password', {
+ oldpassword: payload.oldpassword,
+ password: payload.password,
+ password_confirmation: payload.password_confirmation
+ })
+ .then(response => {
+ console.log('change_password', response);
+
+ // success
+ })
+ .catch(error => {
+ console.log('error.change_password', error.response.data);
+
+ // update errors. user.old_js
+ context.commit('errors', error.response.data.errors);
+ });
+ },
+
+ /**
+ * The user is requesting a password reset link
+ */
+ async SEND_PASSWORD_RESET_LINK (context, payload)
+ {
+ const title = i18n.t('notifications.success');
+ const body = "An email will be sent with a link to reset your password if the email exists.";
+
+ Vue.$vToastify.success({
+ title,
+ body
+ });
+
+ await axios.post('/password/email', {
+ email: payload,
+ })
+ .then(response => {
+ // console.log('send_password_reset_link', response);
+ })
+ .catch(error => {
+ // console.log('error.send_password_reset_link', error.response.data);
+ });
+ },
+
+ /**
+ * The user is resetting their password
+ */
+ async RESET_PASSWORD (context, payload)
+ {
+ const title = i18n.t('notifications.success');
+
+ await axios.post('/password/reset', payload)
+ .then(response => {
+ console.log('reset_password', response);
+
+ if (!response.data.success) return;
+
+ Vue.$vToastify.success({
+ title,
+ body: response.data.message
+ });
+
+ // Go home and log in
+ setTimeout(function() {
+ router.replace('/');
+ router.go(0);
+ }, 4000);
+ })
+ .catch(error => {
+ console.log('error.reset_password', error.response.data);
+
+ context.commit('errors', error.response.data.errors);
+ });
+ },
+
+ /**
+ * A user is contacting OLM
+ */
+ async SEND_EMAIL_TO_US (context, payload)
+ {
+ const title = i18n.t('notifications.success');
+ const body = 'We got your email. You\'ll hear from us soon!'
+
+ await axios.post('/contact-us', payload)
+ .then(response => {
+ console.log('send_email_to_us', response);
+
+ Vue.$vToastify.success({title, body});
+ })
+ .catch(error => {
+ console.log('error.send_email_to_us', error.response.data);
+
+ context.commit('errors', error.response.data.errors);
+ });
+ },
+
+ /**
+ * Throwing an await method here from router.beforeEach allows Vuex to init before vue-router returns auth false.
+ */
+ CHECK_AUTH (context)
+ {
+ // console.log('CHECK AUTH');
+ },
+
+ /**
+ *
+ */
+ async DELETE_ACCOUNT (context, payload)
+ {
+ await axios.post('/settings/delete', {
+ password: payload
+ })
+ .then(response => {
+ console.log('delete_account', response);
+
+ // success
+ })
+ .catch(error => {
+ console.log('error.delete_account', error.response.data);
+
+ // update errors
+
+ });
+ },
+
+ /**
+ * Send the user an email containing a CSV with all of their data
+ */
+ async DOWNLOAD_MY_DATA (context, payload)
+ {
+ const title = i18n.t('notifications.success');
+ const body = 'Your download is being processed and will be emailed to you.'
+
+ await axios.get('/user/profile/download', {params: payload})
+ .then(response => {
+ console.log('download_my_data', response);
+
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ })
+ .catch(error => {
+ console.error('download_my_data', error);
+ });
+ },
+
+ /**
+ * When we log in, we need to dispatch a request to get the current user
+ */
+ async GET_CURRENT_USER (context)
+ {
+ await axios.get('/current-user')
+ .then(response => {
+ console.log('get_current_user', response);
+
+ context.commit('initUser', response.data);
+ context.commit('set_default_litter_picked_up', response.data.picked_up);
+ })
+ .catch(error => {
+ console.log('error.get_current_user', error);
+ });
+ },
+
+ /**
+ *
+ */
+ async GET_COUNTRIES_FOR_FLAGS (context)
+ {
+ await axios.get('/settings/flags/countries')
+ .then(response => {
+ console.log('flags_countries', response);
+
+ context.commit('flags_countries', response.data);
+ })
+ .catch(error => {
+ console.log('error.flags_countries', error);
+ });
+ },
+
+ /**
+ * Get the total number of users, and the current users rank (1st, 2nd...)
+ *
+ * and more
+ */
+ async GET_USERS_PROFILE_DATA (context)
+ {
+ await axios.get('/user/profile/index')
+ .then(response => {
+ console.log('get_users_position', response);
+
+ context.commit('usersPosition', response.data);
+ })
+ .catch(error => {
+ console.error('get_users_position', error);
+ });
+ },
+
+ /**
+ * Get the geojson data for the users Profile/ProfileMap
+ */
+ async GET_USERS_PROFILE_MAP_DATA (context, payload)
+ {
+ await axios.get('/user/profile/map', {
+ params: {
+ period: payload.period,
+ start: payload.start + ' 00:00:00',
+ end: payload.end + ' 23:59:59'
+ }
+ })
+ .then(response => {
+ console.log('get_users_profile_map_data', response);
+
+ context.commit('usersGeojson', response.data.geojson);
+ })
+ .catch(error => {
+ console.error('get_users_profile_map_data', error);
+ });
+ },
+
+
+
+ /**
+ * Save all privacy settings on Privacy.vue
+ */
+ async SAVE_PRIVACY_SETTINGS (context)
+ {
+ const title = i18n.t('notifications.success');
+ const body = i18n.t('notifications.privacy-updated');
+
+ await axios.post('/settings/privacy/update', {
+ show_name_maps: context.state.user.show_name_maps,
+ show_username_maps: context.state.user.show_username_maps,
+ show_name: context.state.user.show_name,
+ show_username: context.state.user.show_username,
+ show_name_createdby: context.state.user.show_name_createdby,
+ show_username_createdby: context.state.user.show_username_createdby,
+ prevent_others_tagging_my_photos: context.state.user.prevent_others_tagging_my_photos,
+ })
+ .then(response => {
+ console.log('save_privacy_settings', response);
+
+ /* improve css */
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ })
+ .catch(error => {
+ console.log('error.save_privacy_settings', error);
+ });
+ },
+
+ /**
+ * Change value of user wants to receive emails eg updates
+ */
+ async TOGGLE_EMAIL_SUBSCRIPTION (context)
+ {
+ let title = i18n.t('notifications.success');
+ let sub = i18n.t('notifications.settings.subscribed');
+ let unsub = i18n.t('notifications.settings.unsubscribed');
+
+ await axios.post('/settings/email/toggle')
+ .then(response => {
+ console.log('toggle_email_subscription', response);
+
+ if (response.data.sub)
+ {
+ /* improve css */
+ Vue.$vToastify.success({
+ title,
+ body: sub,
+ position: 'top-right'
+ });
+ }
+
+ else
+ {
+ /* improve css */
+ Vue.$vToastify.success({
+ title,
+ body: unsub,
+ position: 'top-right'
+ });
+ }
+
+ context.commit('toggle_email_sub', response.data.sub);
+ })
+ .catch(error => {
+ console.log(error);
+ })
+ },
+
+ /**
+ * Toggle the setting of litter picked up or still there
+ */
+ async TOGGLE_LITTER_PICKED_UP_SETTING (context)
+ {
+ const title = i18n.t('notifications.success');
+ const body = i18n.t('notifications.litter-toggled');
+
+ await axios.post('/settings/toggle')
+ .then(response => {
+ console.log('toggle_litter', response);
+
+ if (response.data.message === 'success')
+ {
+ context.commit('toggle_litter_picked_up', response.data.value);
+
+ /* improve css */
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ }
+ })
+ .catch(error => {
+ console.log(error);
+ });
+ },
+
+ /**
+ * The user wants to update name, email, username
+ */
+ async UPDATE_DETAILS (context)
+ {
+ const title = i18n.t('notifications.success');
+ // todo - translate this
+ const body = 'Your information has been updated'
+
+ await axios.post('/settings/details', {
+ name: context.state.user.name,
+ email: context.state.user.email,
+ username: context.state.user.username
+ })
+ .then(response => {
+ console.log('update_details', response);
+
+ /* improve this */
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ })
+ .catch(error => {
+ console.log('error.update_details', error);
+
+ // update errors. user.old_js
+ context.commit('errors', error.response.data.errors);
+ });
+ },
+
+ /**
+ * Update the flag the user can show on the Global leaderboard
+ */
+ async UPDATE_GLOBAL_FLAG (context, payload)
+ {
+ let title = i18n.t('notifications.success');
+ let body = i18n.t('notifications.settings.flag-updated');
+
+ await axios.post('/settings/save-flag', {
+ country: payload
+ })
+ .then(response => {
+ console.log(response);
+
+ /* improve this */
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ })
+ .catch(error => {
+ console.log(error);
+ });
+ },
+
+ /**
+ * Single endpoint to update all settings using the same format
+ */
+ async UPDATE_SETTINGS (context, payload)
+ {
+ let title = i18n.t('notifications.success');
+ let body = i18n.t('notifications.settings-updated');
+
+ await axios.patch('/settings', payload)
+ .then(response =>
+ {
+ console.log(response);
+
+ Object.keys(payload).forEach((key) =>
+ {
+ context.commit('deleteUserError', key);
+ });
+
+ Vue.$vToastify.success({
+ title,
+ body,
+ position: 'top-right'
+ });
+ })
+ .catch(error =>
+ {
+ context.commit('errors', error.response.data.errors);
+ console.log(error);
+ });
+ }
+};
diff --git a/resources/js/store/modules/user/filterPhotos/actions.js b/resources/old_js/store/modules/user/filterPhotos/actions.js
similarity index 100%
rename from resources/js/store/modules/user/filterPhotos/actions.js
rename to resources/old_js/store/modules/user/filterPhotos/actions.js
diff --git a/resources/js/store/modules/user/filterPhotos/index.js b/resources/old_js/store/modules/user/filterPhotos/index.js
similarity index 100%
rename from resources/js/store/modules/user/filterPhotos/index.js
rename to resources/old_js/store/modules/user/filterPhotos/index.js
diff --git a/resources/js/store/modules/user/filterPhotos/mutations.js b/resources/old_js/store/modules/user/filterPhotos/mutations.js
similarity index 100%
rename from resources/js/store/modules/user/filterPhotos/mutations.js
rename to resources/old_js/store/modules/user/filterPhotos/mutations.js
diff --git a/resources/js/store/modules/user/getters.js b/resources/old_js/store/modules/user/getters.js
similarity index 100%
rename from resources/js/store/modules/user/getters.js
rename to resources/old_js/store/modules/user/getters.js
diff --git a/resources/js/store/modules/user/index.js b/resources/old_js/store/modules/user/index.js
similarity index 100%
rename from resources/js/store/modules/user/index.js
rename to resources/old_js/store/modules/user/index.js
diff --git a/resources/old_js/store/modules/user/init.js b/resources/old_js/store/modules/user/init.js
new file mode 100644
index 000000000..3dc04ca5c
--- /dev/null
+++ b/resources/old_js/store/modules/user/init.js
@@ -0,0 +1,19 @@
+export const init = {
+ admin: false,
+ auth: false,
+ countries: {}, // options for flags => { ie: "Ireland" }
+ errorLogin: '',
+ errors: {},
+ geojson: {
+ features: []
+ },
+ helper: false,
+ position: 0,
+ photoPercent: 0,
+ requiredXp: 0,
+ tagPercent: 0,
+ totalPhotos: 0,
+ totalTags: 0,
+ totalUsers: 0, // Should be on users.old_js
+ user: {}
+};
diff --git a/resources/js/store/modules/user/mutations.js b/resources/old_js/store/modules/user/mutations.js
similarity index 100%
rename from resources/js/store/modules/user/mutations.js
rename to resources/old_js/store/modules/user/mutations.js
diff --git a/resources/js/styles/_breakpoint.scss b/resources/old_js/styles/_breakpoint.scss
similarity index 100%
rename from resources/js/styles/_breakpoint.scss
rename to resources/old_js/styles/_breakpoint.scss
diff --git a/resources/old_js/styles/custom.scss b/resources/old_js/styles/custom.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/resources/js/styles/variables.scss b/resources/old_js/styles/variables.scss
similarity index 100%
rename from resources/js/styles/variables.scss
rename to resources/old_js/styles/variables.scss
diff --git a/resources/js/views/Auth/SignUp.vue b/resources/old_js/views/Auth/SignUp.vue
similarity index 100%
rename from resources/js/views/Auth/SignUp.vue
rename to resources/old_js/views/Auth/SignUp.vue
diff --git a/resources/js/views/Auth/Subscribe.vue b/resources/old_js/views/Auth/Subscribe.vue
similarity index 100%
rename from resources/js/views/Auth/Subscribe.vue
rename to resources/old_js/views/Auth/Subscribe.vue
diff --git a/resources/js/views/Auth/passwords/Email.vue b/resources/old_js/views/Auth/passwords/Email.vue
similarity index 100%
rename from resources/js/views/Auth/passwords/Email.vue
rename to resources/old_js/views/Auth/passwords/Email.vue
diff --git a/resources/js/views/Auth/passwords/Reset.vue b/resources/old_js/views/Auth/passwords/Reset.vue
similarity index 100%
rename from resources/js/views/Auth/passwords/Reset.vue
rename to resources/old_js/views/Auth/passwords/Reset.vue
diff --git a/resources/old_js/views/Leaderboard/Leaderboard.vue b/resources/old_js/views/Leaderboard/Leaderboard.vue
new file mode 100644
index 000000000..ac03ca83d
--- /dev/null
+++ b/resources/old_js/views/Leaderboard/Leaderboard.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+ {{ $t('location.global-leaderboard') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/views/Locations/Cities.vue b/resources/old_js/views/Locations/Cities.vue
similarity index 100%
rename from resources/js/views/Locations/Cities.vue
rename to resources/old_js/views/Locations/Cities.vue
diff --git a/resources/js/views/Locations/CityMap.vue b/resources/old_js/views/Locations/CityMap.vue
similarity index 99%
rename from resources/js/views/Locations/CityMap.vue
rename to resources/old_js/views/Locations/CityMap.vue
index 8a1560038..5575f52d4 100644
--- a/resources/js/views/Locations/CityMap.vue
+++ b/resources/old_js/views/Locations/CityMap.vue
@@ -11,7 +11,7 @@ import * as turf from '../../../../public/js/turf.js'
import { categories } from '../../extra/categories'
import { litterkeys } from '../../extra/litterkeys'
-import {mapHelper} from '../../maps/mapHelpers';
+import {mapHelper} from '../../../js/views/Maps/helpers/mapHelpers.js';
var map;
var info;
diff --git a/resources/js/views/Locations/CityMapContainer.vue b/resources/old_js/views/Locations/CityMapContainer.vue
similarity index 100%
rename from resources/js/views/Locations/CityMapContainer.vue
rename to resources/old_js/views/Locations/CityMapContainer.vue
diff --git a/resources/js/views/Locations/Countries.vue b/resources/old_js/views/Locations/Countries.vue
similarity index 100%
rename from resources/js/views/Locations/Countries.vue
rename to resources/old_js/views/Locations/Countries.vue
diff --git a/resources/old_js/views/Locations/SortLocations.vue b/resources/old_js/views/Locations/SortLocations.vue
new file mode 100644
index 000000000..3efefb189
--- /dev/null
+++ b/resources/old_js/views/Locations/SortLocations.vue
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
#LitterWorldCup
+
+
+
+
+
+
+
+
+
Drag these across for more options
+
+
+
+
+ {{ tab.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/views/Locations/States.vue b/resources/old_js/views/Locations/States.vue
similarity index 100%
rename from resources/js/views/Locations/States.vue
rename to resources/old_js/views/Locations/States.vue
diff --git a/resources/js/views/RootContainer.vue b/resources/old_js/views/RootContainer.vue
similarity index 92%
rename from resources/js/views/RootContainer.vue
rename to resources/old_js/views/RootContainer.vue
index 2e0687106..d92149002 100644
--- a/resources/js/views/RootContainer.vue
+++ b/resources/old_js/views/RootContainer.vue
@@ -13,9 +13,9 @@
+
+
diff --git a/resources/old_js/views/Teams/JoinTeam.vue b/resources/old_js/views/Teams/JoinTeam.vue
new file mode 100644
index 000000000..779349ce4
--- /dev/null
+++ b/resources/old_js/views/Teams/JoinTeam.vue
@@ -0,0 +1,143 @@
+
+