diff --git a/.env.example b/.env.example index b0b62b13..617ff32f 100644 --- a/.env.example +++ b/.env.example @@ -47,15 +47,57 @@ PASSWORD_RESET_MAX_REQUESTS_PER_HOUR=5 # ---- Frontend ---- FRONTEND_PORT=8000 +# ---- Seed dataset friendliness ---- +# These three are flipped to `false` so the docker-compose `seed` profile +# (and any high-volume local testing) can run unimpeded. `true` is the +# right value for production. +# +# APP_RATELIMIT_ENABLED — blocks per-IP/per-user login bursts. The +# demo dataset has 78 accounts; you'll want them all available +# immediately. +# APP_EMAIL_ENABLED — when on, the backend tries to deliver +# verification + password-reset mail through Resend. With the +# placeholder API key it returns 401 and registration fails. +# APP_SPAM_ENABLED — form-token + honeypot defences on register. +# Off in dev makes E2E tooling and Playwright less fragile. +APP_RATELIMIT_ENABLED=false +APP_EMAIL_ENABLED=false +APP_SPAM_ENABLED=false + # ---- OpenAI / Spring AI (advanced mentor recommendation, #436) ---- # API key used by Spring AI for both embeddings (text-embedding-3-small) and # chat completions (gpt-4o-mini) in the advanced mentor ranker + LLM prose # explanation layer. Leave blank to run the backend with only the legacy # rule-based ranker — the advanced path gracefully degrades when this key is # absent. +# +# To get the full demo experience (LLM "why recommended" explanations, +# semantic-affinity signals on the follow ranker), set this to a real +# OpenAI API key. Without it the advanced ranker still produces deterministic +# factor scores; only the prose explanation falls back to null. OPENAI_API_KEY= -# Enable the advanced ranker (otherwise the legacy bag-of-words ranker is used). -MENTOR_ADVANCED_RANKER=false +# Chat / embedding model overrides — leave at the defaults unless you +# specifically need a different model. +OPENAI_CHAT_MODEL=gpt-4o-mini +OPENAI_EMBEDDING_MODEL=text-embedding-3-small + +# ---- Advanced ranker toggles ---- +# The three "advanced" rankers ship default-off in docker-compose so a +# bare boot is prod-shaped. For the hand-crafted demo dataset you'll +# want them all on so the UI surfaces the richer match scores, the +# LLM-authored explanations, MMR diversity, etc. +MENTOR_ADVANCED_RANKER=true +MENTOR_EXPLANATION_ENABLED=true +# gpt-4o-mini occasionally exceeds the default 3000ms timeout under load; +# bumping to 15s eliminates flaky explanation drops without measurably +# delaying the response (the call still cancels at 15s). +MENTOR_EXPLANATION_TIMEOUT_MS=15000 +# Swaps the legacy InterestOverlapFeedRanker for AdvancedForYouFeedRanker +# (candidate generation + scoring + MMR + diversity floor). +FEED_ADVANCED_RANKER=true +# Contextual bandit on top of the For-You ranker. Stays off until the +# impression-tracking follow-up PR lands; flipping to true now is a no-op. +FEED_BANDIT_ENABLED=false # ---- Neo4j (Follow-graph mirror, #437) ---- # The follow-graph mirror writes every Postgres follow/unfollow into Neo4j @@ -84,7 +126,9 @@ NEO4J_BOLT_PORT=7687 # legacy follow ranker still serves recommendations. FOLLOW_GRAPH_SYNC_ENABLED=true # Selects between the legacy rule-based follow ranker and the multi-signal -# AdvancedFollowRanker (which includes PersonalizedPageRank — needs Neo4j). -# Leave `legacy` until Neo4j is reachable AND OPENAI_API_KEY is set if you -# want the SemanticAffinity signal active. -FOLLOW_RANKER=legacy +# AdvancedFollowRanker (PPR + second-hop + recent-engagement + direct- +# interaction + cold-start popularity + interest-overlap + optional +# semantic-affinity). The advanced path needs Neo4j reachable (the +# default in the compose stack); the semantic-affinity signal needs +# OPENAI_API_KEY set (it gracefully degrades when the key is empty). +FOLLOW_RANKER=advanced diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ceb3fe98..7d0712c3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,13 +16,27 @@ jobs: host: ${{ secrets.DEPLOY_HOST }} username: root key: ${{ secrets.DEPLOY_SSH_KEY }} + # 30m: cold Maven rebuild (~7m) + Neo4j boot (~3m) + backend + # health wait. The new seed service adds ~10s on top, well + # within budget. # Default is 10m; cold Maven rebuild (~7m) + Neo4j + backend # health wait (~3m) exceeds it. Cf. run 25790084160 which hit # the cap and left the frontend container in `Created` state. command_timeout: 30m script: | + set -e cd /root/bounswe2026group7 git fetch origin git checkout main git pull origin main - docker compose up --build -d + # --profile demo enables the one-shot `seed` service that + # loads scripts/seed_snapshot_data/ into Postgres and into + # the shared uploads volume after the backend reports + # healthy. The seed is idempotent (DELETE-then-COPY of + # %@seed.test rows only — real users registered through + # the UI and the bootstrap admin are never touched), so + # every deploy re-syncs the demo dataset without affecting + # production accounts. Pair this with --profile demo on + # any future `docker compose down` invocation so the + # one-shot seed container is cleaned up too. + docker compose --profile demo up --build -d diff --git a/.gitignore b/.gitignore index 5929c06d..88c68c4a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,15 @@ scripts/seed_local_credentials.txt __pycache__/ *.pyc +# Local Python venv for seed/snapshot scripts (bootstrapped by scripts/seed.sh) +.venv/ + +# Seed-pipeline runtime artifacts (token cache, intermediate image +# downloads, exported personas.json — all regenerated on each run). +scripts/.seed_*.json +scripts/.seed_*_tmp/ +scripts/personas.json + # Backend - Spring Boot backend/target/ backend/*.class @@ -41,5 +50,8 @@ npm-debug.* yarn-debug.* yarn-error.* .env +.env.* +!.env.example +!.env.production.example # Local issue/PR scaffolding (claude-generated drafts) claude_files/ diff --git a/README.md b/README.md index a7e69843..7d3b6969 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,22 @@ Compose installed. ```bash cp .env.example .env -docker compose up --build +docker compose --profile demo up --build -d ``` -This starts four services: +That single command does three things: + +1. Builds the backend, frontend, and custom Neo4j-GDS images on first run. +2. Starts PostgreSQL, Neo4j, the backend, and the frontend. +3. Once the backend reports healthy, runs the one-shot **`seed`** service — + it loads the hand-crafted demo dataset (78 users, 288 posts, ~50 mentor + ratings, 6 active + 48 past mentorships, profile photos, post images, + task-attached PDFs) into Postgres and into the shared uploads volume. + +The seed step is opt-in: omit `--profile demo` if you want a clean DB. + +Once everything settles you have four long-running services plus a one-shot +seed container that exits cleanly: | Service | URL | Description | |----------|---------------------------------------|--------------------------------------------| @@ -29,43 +41,143 @@ This starts four services: | Database | `localhost:5433` | PostgreSQL (managed via Flyway migrations) | Defaults in `.env.example` are good enough for local development — no editing -required. +required. The seed-friendly safety flags (`APP_RATELIMIT_ENABLED=false`, +`APP_EMAIL_ENABLED=false`, `APP_SPAM_ENABLED=false`) and the four advanced +ranker toggles (`MENTOR_ADVANCED_RANKER`, `MENTOR_EXPLANATION_ENABLED`, +`FEED_ADVANCED_RANKER`, `FOLLOW_RANKER=advanced`) are all pre-set so the +demo dataset surfaces the full UI. The only value worth editing for a +real local-with-LLM run is `OPENAI_API_KEY` — see the [env reference](#environment-variable-reference) +below. + +Stop the stack: + +```bash +docker compose --profile demo down +``` + +Include `--profile demo` here too — without it the seed container is left +orphaned with a stale network reference and the next `up` will fail. Add +`-v` to also drop the Postgres and Neo4j volumes for a fully clean reset. + +Re-seed after manual mutation (stack already running): + +```bash +docker compose --profile demo run --rm seed +``` + +`run --rm` runs the loader as a one-shot and removes the container on exit, +so it never goes stale. + +### Seeding options -Stop the stack with `docker compose down`. Add `-v` to also drop the Postgres -and Neo4j volumes if you want a fully clean reset on the next boot. +Two seeders are available depending on what you need. -### Seed local data +#### Demo dataset (recommended — automatic, hand-crafted content) -Right after a fresh `docker compose up`, the app is empty. The seed script -populates Postgres directly (bypassing email verification, Resend, and the -spam-bot defences) with **1 admin + 40 mentors + 60 mentees**, each with -realistic interests, bios, and goals. +The hand-crafted demo dataset (78 users, 288 posts with images, +6 active + 48 past mentorships with tasks/meetings/messages, 45 ratings, +100 mentor-mentee + mentor-pair messages, AI-generated profile photos, +Unsplash-fetched post images, task-attached PDFs) ships pre-built as a +snapshot under `scripts/seed_snapshot_data/` and loads automatically +through the `demo` compose profile shown in the [Quick start](#quick-start-development-docker) +above: + +```bash +docker compose --profile demo up --build -d # first run on a fresh checkout +docker compose --profile demo down # tear down (don't drop the profile flag) +docker compose --profile demo run --rm seed # re-seed against a running stack +``` + +Each load is idempotent (DELETE-then-COPY against seed-owned rows; the +`admin@group7.com` bootstrap is never touched). + +The same snapshot is reachable from the host without involving the +compose service, which is useful when iterating on the snapshot itself: + +```bash +./scripts/seed.sh load # uses scripts/seed_snapshot_data/ by default +./scripts/seed.sh dump # re-captures current DB state into the same dir +./scripts/seed.sh status # prints seed-owned counts +./scripts/seed.sh help +``` + +The first call bootstraps `.venv/` and installs `scripts/requirements-seed.txt`; +subsequent calls reuse it. + +#### Lightweight roster (`scripts/seed_local.py`) + +If you only need a clean list of accounts (1 admin + 40 mentors + 60 +mentees, no posts/mentorships/photos), use the older direct-Postgres +seeder. It's destructive-but-scoped — it wipes every prior +`@seed.local` user first and re-inserts the roster. ```bash pip install -r scripts/requirements-seed.txt python3 scripts/seed_local.py ``` -Every run is destructive-but-scoped: it deletes all prior `@seed.local` users -first, then re-inserts the roster. Real users you registered through the web -UI are never touched. Run it again whenever you want a clean demo dataset. - -The script prints a credentials block to stdout (sample users per role) and -writes the full list — including each mentor's field and each mentee's major — -to `scripts/seed_local_credentials.txt`. +The script prints a credentials block to stdout and writes the full +roster to `scripts/seed_local_credentials.txt`. ### Default credentials (after seeding) -All seeded passwords are deterministic. Sample accounts: +Sample accounts from the demo dataset (`--profile demo`, `@seed.test`, +all passwords `Seed1234!`): + +| Role | Email | Notes | +|------------------|--------------------------------|---------------------------------------------------------| +| Demo mentee | `defne.korkmaz.74@seed.test` | CS senior, 3 past mentorships, no active mentor — ready for AI-match flow | +| Demo mentor | `yildiz.demir.78@seed.test` | Active mentorship with Rıza Yavuz; full task + meeting timeline | +| Senior mentor | `melis.sezen.2@seed.test` | Cloud Architecture, active mentee Tolga | +| Research mentor | `dilara.oz.5@seed.test` | Completed engagement with Defne, 5-star review attached | + +The full 78-user roster (20 mentors + 57 mentees + 1 admin) is in +`scripts/seed_snapshot_data/data/users.csv`. Every user has the same +password `Seed1234!`. + +If you ran `scripts/seed_local.py` instead, accounts use the +`@seed.local` domain with role-specific passwords (`Admin1234!`, +`Mentor1234!`, `Mentee1234!`); the full list is written to +`scripts/seed_local_credentials.txt`. + +### Environment variable reference + +All knobs below live in `.env.example` with full inline comments. The +table here is a quick map of what each one controls and what state the +demo expects. + +#### Seed-friendliness (`.env.example` defaults to demo-safe values) + +| Variable | Demo (`.env.example`) | Prod | What it does | +|---------------------------|-----------------------|---------------|-----------------------------------------------------------------------------| +| `APP_RATELIMIT_ENABLED` | `false` | `true` | Per-IP/per-user login throttling. 78-account demo needs it off for E2E. | +| `APP_EMAIL_ENABLED` | `false` | `true` | If on, registration sends through Resend; placeholder API key returns 401. | +| `APP_SPAM_ENABLED` | `false` | `true` | Form-token + honeypot defences on the register form. | -| Role | Email | Password | -|--------|--------------------------------------------------|---------------| -| Admin | `admin@seed.local` | `Admin1234!` | -| Mentor | `mentor...@seed.local` (40 total) | `Mentor1234!` | -| Mentee | `mentee...@seed.local` (60 total) | `Mentee1234!` | +#### Advanced ranker stack (`.env.example` defaults all on) -The first 5 mentors and 5 mentees are echoed when the script finishes; the -remaining accounts live in `scripts/seed_local_credentials.txt`. +| Variable | Demo | Default in compose | What it controls | +|--------------------------------|-------|--------------------|---------------------------------------------------------------------------| +| `MENTOR_ADVANCED_RANKER` | `true`| `false` | Swaps the rule-based mentor matcher for the weighted-signal pipeline. | +| `MENTOR_EXPLANATION_ENABLED` | `true`| `false` | LLM-authored "why recommended" sentence on each mentor card. | +| `MENTOR_EXPLANATION_TIMEOUT_MS`| `15000`| `3000` | Upper bound on the gpt-4o-mini call. 3000 is too tight under load. | +| `FEED_ADVANCED_RANKER` | `true`| `false` | Advanced For-You pipeline (candidate generation + scoring + MMR). | +| `FEED_BANDIT_ENABLED` | `false`| `false` | Contextual bandit — gated behind impression tracking; stays off. | +| `FOLLOW_RANKER` | `advanced`| `legacy` | Multi-signal follow ranker (PPR + second-hop + …). Needs Neo4j. | +| `FOLLOW_GRAPH_SYNC_ENABLED` | `true`| `false` | Mirrors every PG follow/unfollow into Neo4j after-commit. | + +#### Keys you (might) need to set manually + +| Variable | When to set | +|-------------------|------------------------------------------------------------------------------------------------------------| +| `OPENAI_API_KEY` | If you want LLM mentor explanations and the semantic-affinity follow signal. Empty = graceful fallback. | +| `RESEND_API_KEY` | Only when `APP_EMAIL_ENABLED=true`. The demo stack doesn't need it. | +| `JWT_SECRET` | Already set to a base64 dev secret; rotate in `.env.production` for any deploy. | +| `NEO4J_PASSWORD` | `group7pass` locally; **must** be rotated in `.env.production`. | + +The OpenAI key flows into both embeddings (`text-embedding-3-small`) and +chat (`gpt-4o-mini`) by default. Override with `OPENAI_CHAT_MODEL` / +`OPENAI_EMBEDDING_MODEL` if needed. ### Quick start (development, without Docker) @@ -102,8 +214,40 @@ used by Playwright, are documented in [frontend/README.md](frontend/README.md). ### Production deployment -Production uses a separate compose file (`docker-compose.prod.yml`) that -expects a managed Postgres and reads secrets from `.env.production`. +The live demo at [mymentornet.org](https://mymentornet.org) is deployed by +[`.github/workflows/deploy.yml`](.github/workflows/deploy.yml) on every +push to `main`. The workflow SSHes into the DigitalOcean droplet and runs: + +```bash +git pull origin main +docker compose --profile demo up --build -d +``` + +The droplet uses the same `docker-compose.yml` as local dev (bundled +Postgres + Neo4j) with its own `.env` carrying real secrets (`JWT_SECRET`, +`OPENAI_API_KEY`, `RESEND_API_KEY`, `NEO4J_PASSWORD`, …). The `--profile demo` +flag activates the one-shot seed service so every deploy re-syncs the +hand-crafted demo dataset; the seed is scoped to `%@seed.test` users only +and never touches real accounts registered through the UI. + +For the demo profile to surface the full UI, the droplet's `.env` should +include the same advanced flags shipped in [`.env.example`](.env.example): + +```sh +MENTOR_ADVANCED_RANKER=true +MENTOR_EXPLANATION_ENABLED=true +MENTOR_EXPLANATION_TIMEOUT_MS=15000 +FEED_ADVANCED_RANKER=true +FOLLOW_RANKER=advanced +FOLLOW_GRAPH_SYNC_ENABLED=true +``` + +`APP_RATELIMIT_ENABLED`, `APP_EMAIL_ENABLED`, and `APP_SPAM_ENABLED` can +stay at their prod defaults (`true`) — the seed itself uses direct +Postgres connections, so rate limits and spam defences don't affect it. + +For a hardened install that doesn't bundle Postgres in-stack (e.g. against +managed PG), use the separate `docker-compose.prod.yml`: ```bash cp .env.production.example .env.production @@ -113,10 +257,11 @@ cp .env.production.example .env.production docker compose --env-file .env.production -f docker-compose.prod.yml up --build -d ``` -The prod compose runs the backend, frontend, and Neo4j in-stack and binds the -frontend to host port 80 by default (override with `FRONTEND_PORT`). It does -not bring up a Postgres service — point `SPRING_DATASOURCE_URL` at your -managed database. +That compose targets a managed PostgreSQL via `SPRING_DATASOURCE_URL`, +runs Neo4j and the backend in-stack, and binds the frontend to host +port 80 by default (override with `FRONTEND_PORT`). The `seed` service +isn't wired into the prod compose by design — production datasets +shouldn't be reset on every boot. See [PRODUCTION_CHECKLIST.md](PRODUCTION_CHECKLIST.md) for the broader deployment checklist (TLS, backups, secret rotation). diff --git a/backend/src/main/java/com/group7/backend/repository/AttachmentRepository.java b/backend/src/main/java/com/group7/backend/repository/AttachmentRepository.java index 8fc0fac8..d5a40fba 100644 --- a/backend/src/main/java/com/group7/backend/repository/AttachmentRepository.java +++ b/backend/src/main/java/com/group7/backend/repository/AttachmentRepository.java @@ -56,21 +56,31 @@ long countByUploaderSince(@Param("uploaderId") Long uploaderId, /** * Returns attachments older than {@code cutoff} that are not referenced - * by any persisted message or feed post. Used by the orphan-cleanup - * scheduler to reclaim disk and DB space for uploads that were never - * referenced. + * by any persisted message or feed post or task + * assignment / submission. Used by the orphan-cleanup scheduler to + * reclaim disk and DB space for uploads that were never referenced. * *

The 24-hour cutoff (set at the call site) is the fairness window: a * client may legitimately upload, then take some time to compose the * outgoing message or feed post before referencing the id. Sweeping * immediately would race the user-visible flow. * - *

Native query because the {@code feed_post_attachments} junction is - * not exposed as a JPA entity (the link is materialised through the - * {@code @ManyToMany} on {@link com.group7.backend.entity.FeedPost}). The - * column names ({@code messages.attachment_id}, V15; - * {@code feed_post_attachments.attachment_id}, V41) are the source of - * truth — keep them in sync with the migrations if the schema evolves. + *

Native query because the junction tables ({@code feed_post_attachments}, + * {@code task_assignment_attachments}, {@code task_submission_attachments}) + * are not exposed as JPA entities; the links are materialised through + * {@code @ManyToMany} relationships on the owning entities. Four FK + * sources reference {@code attachments(id)} — keep all four + * {@code NOT EXISTS} clauses in sync with the migrations: + *

    + *
  • {@code messages.attachment_id} (V15, ON DELETE SET NULL)
  • + *
  • {@code feed_post_attachments.attachment_id} (V41, NO ACTION)
  • + *
  • {@code task_assignment_attachments.attachment_id} (V23, ON DELETE CASCADE)
  • + *
  • {@code task_submission_attachments.attachment_id} (V23, ON DELETE CASCADE)
  • + *
+ * Missing any of these from the sweep would silently delete task PDFs / + * task submissions when their owning attachment row goes through the + * orphan path (the CASCADE on the junction would drop the link too, + * making the file vanish from the UI on both web and mobile). */ @Query(value = "SELECT * FROM attachments a " @@ -80,22 +90,30 @@ long countByUploaderSince(@Param("uploaderId") Long uploaderId, + " ) " + " AND NOT EXISTS (" + " SELECT 1 FROM feed_post_attachments fpa WHERE fpa.attachment_id = a.id" + + " ) " + + " AND NOT EXISTS (" + + " SELECT 1 FROM task_assignment_attachments taa WHERE taa.attachment_id = a.id" + + " ) " + + " AND NOT EXISTS (" + + " SELECT 1 FROM task_submission_attachments tsa WHERE tsa.attachment_id = a.id" + " )", nativeQuery = true) List findOrphansOlderThan(@Param("cutoff") OffsetDateTime cutoff); /** - * Deletes the attachment row only if no message or feed post has come to - * reference it since the last orphan scan. Returns the number of rows - * deleted (0 or 1). + * Deletes the attachment row only if no message, feed post, or task + * attachment has come to reference it since the last orphan scan. + * Returns the number of rows deleted (0 or 1). * *

This closes the race between {@link #findOrphansOlderThan} and the - * scheduler's deletion: if a {@code POST /messages} or feed-post create - * lands in the gap and references this attachment, the {@code NOT EXISTS} - * clauses reject the delete and the new owner keeps its FK intact. + * scheduler's deletion: if a {@code POST /messages}, feed-post create, + * or task-assignment update lands in the gap and references this + * attachment, the {@code NOT EXISTS} clauses reject the delete and the + * new owner keeps its FK intact. * - *

Native for the same reason as {@link #findOrphansOlderThan} — the - * junction has no JPA entity. + *

The four {@code NOT EXISTS} clauses mirror + * {@link #findOrphansOlderThan} — see that method's javadoc for the + * canonical list of FK references. */ @Modifying @Query(value = @@ -106,6 +124,12 @@ long countByUploaderSince(@Param("uploaderId") Long uploaderId, + " ) " + " AND NOT EXISTS (" + " SELECT 1 FROM feed_post_attachments fpa WHERE fpa.attachment_id = a.id" + + " ) " + + " AND NOT EXISTS (" + + " SELECT 1 FROM task_assignment_attachments taa WHERE taa.attachment_id = a.id" + + " ) " + + " AND NOT EXISTS (" + + " SELECT 1 FROM task_submission_attachments tsa WHERE tsa.attachment_id = a.id" + " )", nativeQuery = true) int deleteIfStillOrphan(@Param("id") UUID id); diff --git a/docker-compose.yml b/docker-compose.yml index bf63ace5..427c7d71 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,10 +85,14 @@ services: # CI / local Playwright runs flip them on via .env. APP_TEST_ENDPOINTS_ENABLED: ${APP_TEST_ENDPOINTS_ENABLED:-false} APP_SPAM_ENABLED: ${APP_SPAM_ENABLED:-true} + APP_RATELIMIT_ENABLED: ${APP_RATELIMIT_ENABLED:-true} # Verification-email send swaps to NoOpEmailService when off — used by # Playwright so /api/test/users registrations don't fail with Resend # 401 when the API key is the placeholder. APP_EMAIL_ENABLED: ${APP_EMAIL_ENABLED:-true} + # Follow-graph Neo4j mirror (#437) + follow recommendation ranker. + FOLLOW_GRAPH_SYNC_ENABLED: ${FOLLOW_GRAPH_SYNC_ENABLED:-false} + FOLLOW_RANKER: ${FOLLOW_RANKER:-legacy} volumes: - uploads_data:/app/uploads depends_on: @@ -116,6 +120,38 @@ services: networks: - group7_net + # One-shot demo data loader. Only runs when explicitly invoked via + # the `demo` profile (otherwise compose ignores it): + # docker compose --profile demo up -d + # It waits for backend health, COPYs the snapshot CSVs into Postgres, + # and copies the binary uploads into the shared `uploads_data` volume. + # The seed is idempotent (DELETE-then-COPY); re-running with the + # profile gives the same final state. + seed: + profiles: ["demo"] + image: python:3.12-slim + environment: + POSTGRES_HOST: db + POSTGRES_PORT: "5432" + POSTGRES_USER: ${POSTGRES_USER:-group7} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-group7pass} + POSTGRES_DB: ${POSTGRES_DB:-group7db} + PIP_DISABLE_PIP_VERSION_CHECK: "1" + volumes: + - ./scripts:/seed/scripts:ro + - uploads_data:/uploads + working_dir: /seed + depends_on: + backend: + condition: service_healthy + command: + - "sh" + - "-c" + - "set -e && pip install --no-cache-dir --quiet 'psycopg[binary]>=3.1' && python /seed/scripts/seed_snapshot.py load /seed/scripts/seed_snapshot_data --uploads-mode local --uploads-dest /uploads" + restart: "no" + networks: + - group7_net + volumes: db_data: uploads_data: diff --git a/scripts/requirements-seed.txt b/scripts/requirements-seed.txt index 7d5ae32e..e6737efc 100644 --- a/scripts/requirements-seed.txt +++ b/scripts/requirements-seed.txt @@ -1,2 +1,5 @@ psycopg[binary]>=3.1 bcrypt>=4.0 +PyYAML>=6.0 +requests>=2.31 +python-dotenv>=1.0 diff --git a/scripts/seed.sh b/scripts/seed.sh new file mode 100755 index 00000000..70dcb547 --- /dev/null +++ b/scripts/seed.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash +# Demo data seed/snapshot front-end. +# +# Subcommands: +# setup Bootstrap (or repair) the local Python venv at .venv/. +# dump [DIR] Capture current DB + uploads into a portable snapshot. +# load [DIR] Replay a snapshot into the local DB + backend container. +# status Show what's in the local DB right now. +# +# Default snapshot directory: scripts/seed_snapshot_data/ +# +# This wrapper: +# - Creates .venv/ on first run and installs scripts/requirements-seed.txt. +# - Calls the right Python module with the venv's interpreter. +# - Talks directly to Postgres (port 5433) and the backend container — +# no HTTP API, no OpenAI, no Unsplash. +# +# Requirements on a fresh machine: +# - Python 3.10+ on PATH. +# - Docker + the `bounswe2026group7-{backend,db}-1` containers running +# (i.e. `docker compose up -d`). +# +# Typical first-time flow on a fresh checkout: +# +# docker compose up -d +# ./scripts/seed.sh load # uses scripts/seed_snapshot_data/ +# +# After local mutation, capture the new state for a teammate: +# +# ./scripts/seed.sh dump # overwrites the same dir +# +# Snapshot the alternate location: +# +# ./scripts/seed.sh dump /tmp/snap-2026-05-13 +# ./scripts/seed.sh load /tmp/snap-2026-05-13 + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +VENV_DIR="$REPO_ROOT/.venv" +DEFAULT_SNAPSHOT="$REPO_ROOT/scripts/seed_snapshot_data" + +ensure_venv() { + if [[ ! -x "$VENV_DIR/bin/python" ]]; then + echo "==> No venv at $VENV_DIR — creating one." + python3 -m venv "$VENV_DIR" + "$VENV_DIR/bin/pip" install --upgrade pip --quiet + echo "==> Installing scripts/requirements-seed.txt …" + "$VENV_DIR/bin/pip" install --quiet -r "$REPO_ROOT/scripts/requirements-seed.txt" + echo "==> Done." + fi +} + +check_docker() { + if ! docker info >/dev/null 2>&1; then + echo "Error: docker daemon not reachable. Is Docker Desktop running?" >&2 + exit 1 + fi + if ! docker inspect bounswe2026group7-db-1 >/dev/null 2>&1; then + echo "Error: Postgres container 'bounswe2026group7-db-1' isn't up." >&2 + echo " Run: docker compose up -d" >&2 + exit 1 + fi + if ! docker inspect bounswe2026group7-backend-1 >/dev/null 2>&1; then + echo "Error: backend container 'bounswe2026group7-backend-1' isn't up." >&2 + echo " Run: docker compose up -d" >&2 + exit 1 + fi +} + +case "${1:-help}" in + setup) + ensure_venv + echo "==> venv ready at $VENV_DIR" + ;; + + dump) + ensure_venv + check_docker + target="${2:-$DEFAULT_SNAPSHOT}" + echo "==> dumping current state → $target" + "$VENV_DIR/bin/python" "$REPO_ROOT/scripts/seed_snapshot.py" dump "$target" + ;; + + load) + ensure_venv + check_docker + target="${2:-$DEFAULT_SNAPSHOT}" + if [[ ! -d "$target" ]]; then + echo "Error: snapshot dir not found: $target" >&2 + exit 1 + fi + echo "==> loading snapshot from $target" + "$VENV_DIR/bin/python" "$REPO_ROOT/scripts/seed_snapshot.py" load "$target" + ;; + + status) + check_docker + docker exec bounswe2026group7-db-1 psql -U group7 -d group7db -c " +SELECT 'admins' AS table, count(*) AS n FROM admins + WHERE id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'mentors', count(*) FROM mentors + WHERE id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'mentees', count(*) FROM mentees + WHERE id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'posts', count(*) FROM feed_posts + WHERE author_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') + AND deleted_at IS NULL +UNION ALL SELECT 'comments', count(*) FROM feed_post_comments + WHERE post_id IN (SELECT id FROM feed_posts WHERE author_id IN + (SELECT id FROM users WHERE email LIKE '%@seed.test')) +UNION ALL SELECT 'likes', count(*) FROM feed_post_likes + WHERE post_id IN (SELECT id FROM feed_posts WHERE author_id IN + (SELECT id FROM users WHERE email LIKE '%@seed.test')) +UNION ALL SELECT 'follows', count(*) FROM follows + WHERE follower_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'mentorships (active)', count(*) FROM mentorships + WHERE status='ACTIVE' AND mentor_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'mentorships (past)', count(*) FROM mentorships + WHERE status<>'ACTIVE' AND mentor_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'ratings', count(*) FROM mentor_ratings + WHERE mentor_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'attachments', count(*) FROM attachments + WHERE uploader_id IN (SELECT id FROM users WHERE email LIKE '%@seed.test') +UNION ALL SELECT 'task files', count(*) FROM task_assignment_attachments + WHERE task_id IN (SELECT id FROM tasks WHERE mentorship_id IN + (SELECT id FROM mentorships WHERE mentor_id IN + (SELECT id FROM users WHERE email LIKE '%@seed.test'))); +" + ;; + + help|--help|-h|*) + sed -n '2,30p' "$0" + exit 0 + ;; +esac diff --git a/scripts/seed_demo_backfill.py b/scripts/seed_demo_backfill.py new file mode 100644 index 00000000..da180488 --- /dev/null +++ b/scripts/seed_demo_backfill.py @@ -0,0 +1,89 @@ +"""Backfill mentor/mentee narrative content from the markdown corpus. + +Phase A only reads roster.yaml — which carries demographic fields +(name, city, gender, post_count, capacity) but leaves the narrative +fields (bio, mentoring_goals for mentors; background_info, goals for +mentees) empty. The hand-authored text lives in the per-user markdown +files under `claude_files/seed/users/`, so after Phase A we walk that +corpus and UPDATE the DB. + +This step also guarantees every mentor has at least one availability +slot — Bernoulli(0.2) over seven days can produce 0 slots with +non-trivial probability, which the demo UI surfaces as "no times". +We backfill the empty ones with two recurring slots. +""" + +from __future__ import annotations + +import random +from typing import Optional + +import seed_demo_content as C +import seed_demo_random as R + + +DAYS = ("MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", + "FRIDAY", "SATURDAY", "SUNDAY") + + +def backfill_from_markdown(cur) -> dict[str, int]: + """Run UPDATEs against the open psycopg cursor. Caller commits.""" + counts = {"mentor_text": 0, "mentee_text": 0, "slots_added": 0} + + specs = {s.id: s for s in C.iter_user_specs()} + if not specs: + return counts + + emails = [s.email for s in specs.values()] + cur.execute("SELECT id, email FROM users WHERE email = ANY(%s)", (emails,)) + db_id_by_email = {email: db_id for db_id, email in cur.fetchall()} + + for roster_id, spec in specs.items(): + db_id = db_id_by_email.get(spec.email) + if not db_id: + continue + + if spec.role == "MENTOR": + bio = (spec.bio or spec.personality or "").strip()[:1000] or \ + "Senior practitioner taking one mentee at a time." + goals = (spec.goals or spec.mentoring_goals or "").strip()[:500] or \ + "Direct, focused mentorship rooted in real-world practice." + cur.execute( + "UPDATE mentors SET bio = %s, mentoring_goals = %s WHERE id = %s", + (bio, goals, db_id), + ) + counts["mentor_text"] += 1 + + cur.execute( + "SELECT count(*) FROM mentor_availability_slots WHERE mentor_id = %s", + (db_id,), + ) + if cur.fetchone()[0] == 0: + rng = random.Random(R.MASTER_SEED + db_id) + days = rng.sample(DAYS, 2) + slots = (("19:00", "20:00"), ("14:00", "15:00")) + for day, (start, end) in zip(days, slots): + cur.execute( + "INSERT INTO mentor_availability_slots " + "(mentor_id, day_of_week, start_time, end_time, recurring) " + "VALUES (%s, %s, %s, %s, TRUE)", + (db_id, day, start, end), + ) + counts["slots_added"] += 1 + + elif spec.role == "MENTEE": + background = (spec.bio or spec.personality or "").strip()[:500] + goals = (spec.goals or "").strip()[:500] + if not (background or goals): + continue + # COALESCE keeps any non-empty value already in the DB. + cur.execute( + "UPDATE mentees " + "SET background_info = COALESCE(NULLIF(%s, ''), background_info), " + " goals = COALESCE(NULLIF(%s, ''), goals) " + "WHERE id = %s", + (background, goals, db_id), + ) + counts["mentee_text"] += 1 + + return counts diff --git a/scripts/seed_demo_content.py b/scripts/seed_demo_content.py new file mode 100644 index 00000000..886dd699 --- /dev/null +++ b/scripts/seed_demo_content.py @@ -0,0 +1,410 @@ +"""Markdown content corpus reader for the demo seed pipeline. + +Each user, mentorship, and mentor-pair conversation has a markdown file +under `claude_files/seed/` with YAML front-matter plus structured body +sections (posts, comments, messages, tasks, milestones, meetings). This +module loads those files into Python dicts; the orchestrator iterates +over them and writes to Postgres / HTTP API. + +All paths are resolved relative to the repo root. +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass, field +from pathlib import Path +from typing import Iterator, Optional + +import yaml + + +REPO_ROOT = Path(__file__).resolve().parent.parent +SEED_DIR = REPO_ROOT / "claude_files" / "seed" +USERS_DIR = SEED_DIR / "users" +MENTORSHIPS_DIR = SEED_DIR / "mentorships" +PAIRS_DIR = SEED_DIR / "mentor_pair_conversations" +ROSTER_PATH = SEED_DIR / "roster.yaml" + + +@dataclass +class PostSpec: + topic: str # "mentorship" | "interest" | "personal" | "expertise" + body: str + hashtags: list[str] = field(default_factory=list) + has_image: bool = False + image_topic: Optional[str] = None + lang: Optional[str] = "tr" + comments: list["CommentSpec"] = field(default_factory=list) + + +@dataclass +class CommentSpec: + by: int # commenter user_id + body: str + + +@dataclass +class UserSpec: + id: int + gender: str # "male" | "female" + role: str # "ADMIN" | "MENTOR" | "MENTEE" + first_name: str + last_name: str + email: str + password: str + city: str + interests: list[dict] # [{label, uri}] + major: Optional[str] = None + career_interest: Optional[str] = None + affiliation: Optional[str] = None + post_count: int = 0 + has_photo: bool = False + # Mentor-only: + field_: Optional[str] = None + expertise: Optional[str] = None + max_capacity: Optional[int] = None + mentoring_goals: Optional[str] = None + mentorship_duration: Optional[int] = None + # Body sections: + personality: str = "" + bio: str = "" + goals: str = "" + posts: list[PostSpec] = field(default_factory=list) + + +@dataclass +class MessageSpec: + sender: str # "mentor" | "mentee" for mentorships, or stringified id for pairs + sent_offset_days: float + body: str + + +@dataclass +class TaskSpec: + title: str + description: str + due_offset_days: int + status: str # PENDING | SUBMITTED | REVISION_REQUESTED | COMPLETED + + +@dataclass +class MilestoneSpec: + title: str + description: str + target_offset_days: int + order_index: int + status: str # PENDING | IN_PROGRESS | COMPLETED + + +@dataclass +class MeetingSpec: + title: str + description: Optional[str] + start_offset_days: float + duration_minutes: int + status: str + notes: str = "" + + +@dataclass +class MentorshipSpec: + mentor_id: int + mentee_id: int + duration: int # months ∈ {1, 3, 6} + start_offset_days: int + status: str # ACTIVE | COMPLETED | TERMINATED + shared_goal: str + request_message: str + scenario: str + messages: list[MessageSpec] = field(default_factory=list) + tasks: list[TaskSpec] = field(default_factory=list) + milestones: list[MilestoneSpec] = field(default_factory=list) + meetings: list[MeetingSpec] = field(default_factory=list) + + +@dataclass +class PairConversationSpec: + lower_id: int + higher_id: int + topic: str + messages: list[MessageSpec] = field(default_factory=list) + + +# ── parsers ──────────────────────────────────────────────────────────────── + +FRONT_MATTER_RE = re.compile(r"^---\n(.*?)\n---\n(.*)$", re.DOTALL) + + +def split_front_matter(content: str) -> tuple[dict, str]: + m = FRONT_MATTER_RE.match(content) + if not m: + raise ValueError("No YAML front matter found") + front = yaml.safe_load(m.group(1)) or {} + body = m.group(2) + return front, body + + +def split_body_sections(body: str) -> dict[str, str]: + """Split a markdown body into {section_name: section_yaml_or_text}.""" + sections: dict[str, str] = {} + current_name: Optional[str] = None + current_lines: list[str] = [] + for line in body.splitlines(): + if line.startswith("## "): + if current_name is not None: + sections[current_name] = "\n".join(current_lines).strip() + current_name = line[3:].strip() + current_lines = [] + else: + current_lines.append(line) + if current_name is not None: + sections[current_name] = "\n".join(current_lines).strip() + return sections + + +def parse_yaml_list(text: str) -> list: + """Parse a yaml list out of a section body (handles leading whitespace).""" + if not text.strip(): + return [] + parsed = yaml.safe_load(text) + return parsed or [] + + +# ── roster ───────────────────────────────────────────────────────────────── + +def load_roster() -> list[dict]: + """The canonical roster (1 admin + 48 mentors + 240 mentees).""" + if not ROSTER_PATH.exists(): + raise FileNotFoundError(f"Roster missing: {ROSTER_PATH}") + return yaml.safe_load(ROSTER_PATH.read_text()) or [] + + +# ── user file ────────────────────────────────────────────────────────────── + +def _parse_post(entry: dict) -> PostSpec: + comments = [CommentSpec(by=c["by"], body=c["body"]) + for c in entry.get("comments", []) or []] + return PostSpec( + topic=entry.get("topic", "interest"), + body=entry["body"].strip(), + hashtags=list(entry.get("hashtags", []) or []), + has_image=bool(entry.get("has_image", False)), + image_topic=entry.get("image_topic"), + lang=entry.get("lang", "tr"), + comments=comments, + ) + + +def load_user_spec(path: Path) -> UserSpec: + front, body = split_front_matter(path.read_text(encoding="utf-8")) + sections = split_body_sections(body) + + posts_text = sections.get("Posts", "") + posts_data = parse_yaml_list(posts_text) if posts_text else [] + posts = [_parse_post(p) for p in posts_data] + + return UserSpec( + id=int(front["id"]), + gender=front["gender"], + role=front["role"], + first_name=front["first_name"], + last_name=front["last_name"], + email=front["email"], + password=front["password"], + city=front["city"], + interests=list(front.get("interests", []) or []), + major=front.get("major"), + career_interest=front.get("career_interest"), + affiliation=front.get("affiliation"), + post_count=int(front.get("post_count", 0)), + has_photo=bool(front.get("has_photo", False)), + field_=front.get("field"), + expertise=front.get("expertise"), + max_capacity=front.get("max_capacity"), + mentoring_goals=front.get("mentoring_goals"), + mentorship_duration=front.get("mentorship_duration"), + personality=sections.get("Personality", ""), + bio=sections.get("Bio / About") or sections.get("Bio", ""), + goals=sections.get("Goals", ""), + posts=posts, + ) + + +def iter_user_specs() -> Iterator[UserSpec]: + if not USERS_DIR.exists(): + return + for path in sorted(USERS_DIR.glob("*.md")): + yield load_user_spec(path) + + +# ── mentorship file ──────────────────────────────────────────────────────── + +def _parse_message(entry: dict) -> MessageSpec: + return MessageSpec( + sender=str(entry["sender"]), + sent_offset_days=float(entry.get("sent_offset_days", 0)), + body=entry["body"].strip(), + ) + + +def _parse_task(entry: dict) -> TaskSpec: + return TaskSpec( + title=entry["title"], + description=entry.get("description", "").strip(), + due_offset_days=int(entry.get("due_offset_days", 0)), + status=entry.get("status", "PENDING"), + ) + + +def _parse_milestone(entry: dict) -> MilestoneSpec: + return MilestoneSpec( + title=entry["title"], + description=entry.get("description", "").strip(), + target_offset_days=int(entry.get("target_offset_days", 0)), + order_index=int(entry.get("order_index", 0)), + status=entry.get("status", "PENDING"), + ) + + +def _parse_meeting(entry: dict) -> MeetingSpec: + return MeetingSpec( + title=entry["title"], + description=entry.get("description"), + start_offset_days=float(entry.get("start_offset_days", 0)), + duration_minutes=int(entry.get("duration_minutes", 60)), + status=entry.get("status", "CONFIRMED"), + notes=entry.get("notes", "").strip(), + ) + + +def load_mentorship_spec(path: Path) -> MentorshipSpec: + front, body = split_front_matter(path.read_text(encoding="utf-8")) + sections = split_body_sections(body) + + messages = [_parse_message(m) for m in parse_yaml_list(sections.get("Messages", ""))] + tasks = [_parse_task(t) for t in parse_yaml_list(sections.get("Tasks", ""))] + milestones = [_parse_milestone(m) for m in parse_yaml_list(sections.get("Milestones", ""))] + meetings = [_parse_meeting(m) for m in parse_yaml_list(sections.get("Meetings", ""))] + + return MentorshipSpec( + mentor_id=int(front["mentor_id"]), + mentee_id=int(front["mentee_id"]), + duration=int(front["duration"]), + start_offset_days=int(front["start_offset_days"]), + status=front.get("status", "ACTIVE"), + shared_goal=front.get("shared_goal", "").strip(), + request_message=front.get("request_message", "").strip(), + scenario=sections.get("Scenario", "").strip(), + messages=messages, + tasks=tasks, + milestones=milestones, + meetings=meetings, + ) + + +def iter_mentorship_specs() -> Iterator[MentorshipSpec]: + if not MENTORSHIPS_DIR.exists(): + return + for path in sorted(MENTORSHIPS_DIR.glob("m_*.md")): + yield load_mentorship_spec(path) + + +# ── mentor-pair conversation file ────────────────────────────────────────── + +def load_pair_spec(path: Path) -> PairConversationSpec: + front, body = split_front_matter(path.read_text(encoding="utf-8")) + sections = split_body_sections(body) + messages = [_parse_message(m) for m in parse_yaml_list(sections.get("Messages", ""))] + return PairConversationSpec( + lower_id=int(front["lower_id"]), + higher_id=int(front["higher_id"]), + topic=front.get("topic", ""), + messages=messages, + ) + + +def iter_pair_specs() -> Iterator[PairConversationSpec]: + if not PAIRS_DIR.exists(): + return + for path in sorted(PAIRS_DIR.glob("p_*.md")): + yield load_pair_spec(path) + + +# ── validation ───────────────────────────────────────────────────────────── + +def validate_corpus(roster: list[dict]) -> list[str]: + """Cross-reference markdown corpus against the roster. Return error list.""" + roster_ids = {int(r["id"]) for r in roster} + errors: list[str] = [] + + user_ids_with_md: set[int] = set() + for path in USERS_DIR.glob("*.md") if USERS_DIR.exists() else []: + try: + spec = load_user_spec(path) + except Exception as exc: + errors.append(f"{path.name}: parse error: {exc}") + continue + user_ids_with_md.add(spec.id) + if spec.id not in roster_ids: + errors.append(f"{path.name}: id={spec.id} not in roster") + if spec.post_count != len(spec.posts): + errors.append( + f"{path.name}: post_count={spec.post_count} but len(posts)={len(spec.posts)}" + ) + + if MENTORSHIPS_DIR.exists(): + for path in MENTORSHIPS_DIR.glob("m_*.md"): + try: + ms = load_mentorship_spec(path) + except Exception as exc: + errors.append(f"{path.name}: parse error: {exc}") + continue + if ms.mentor_id not in roster_ids: + errors.append(f"{path.name}: mentor_id={ms.mentor_id} not in roster") + if ms.mentee_id not in roster_ids: + errors.append(f"{path.name}: mentee_id={ms.mentee_id} not in roster") + if ms.duration not in (1, 3, 6): + errors.append(f"{path.name}: duration={ms.duration} not in {{1,3,6}}") + + if PAIRS_DIR.exists(): + for path in PAIRS_DIR.glob("p_*.md"): + try: + pc = load_pair_spec(path) + except Exception as exc: + errors.append(f"{path.name}: parse error: {exc}") + continue + if pc.lower_id >= pc.higher_id: + errors.append(f"{path.name}: lower_id >= higher_id") + if pc.lower_id not in roster_ids: + errors.append(f"{path.name}: lower_id={pc.lower_id} not in roster") + if pc.higher_id not in roster_ids: + errors.append(f"{path.name}: higher_id={pc.higher_id} not in roster") + + return errors + + +__all__ = [ + "SEED_DIR", + "USERS_DIR", + "MENTORSHIPS_DIR", + "PAIRS_DIR", + "ROSTER_PATH", + "PostSpec", + "CommentSpec", + "UserSpec", + "MessageSpec", + "TaskSpec", + "MilestoneSpec", + "MeetingSpec", + "MentorshipSpec", + "PairConversationSpec", + "load_roster", + "load_user_spec", + "iter_user_specs", + "load_mentorship_spec", + "iter_mentorship_specs", + "load_pair_spec", + "iter_pair_specs", + "validate_corpus", +] diff --git a/scripts/seed_demo_dataset.py b/scripts/seed_demo_dataset.py new file mode 100644 index 00000000..180ed897 --- /dev/null +++ b/scripts/seed_demo_dataset.py @@ -0,0 +1,913 @@ +#!/usr/bin/env python3 +"""MyMentorNet demo dataset seed orchestrator. + +Runs phases A-V to populate Postgres with 240 mentees + 48 mentors + 1 admin +and their hand-authored content (posts, comments, mentorship scenarios, +mentor-pair conversations, lifecycle artefacts). + +Usage: + python scripts/seed_demo_dataset.py --phase A # one phase + python scripts/seed_demo_dataset.py --wipe --phase all # full reseed + python scripts/seed_demo_dataset.py --phase V # verify only + +Each phase is idempotent within its scope (re-running Phase E without --wipe +re-deletes seed feed_posts before re-inserting). +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +import time +from datetime import datetime, timedelta, timezone +from pathlib import Path +from typing import Optional + +REPO_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(REPO_ROOT / "scripts")) + +# Local modules ---------------------------------------------------------------- +from dotenv import load_dotenv +import seed_demo_random as R +import seed_demo_db as D +import seed_demo_http as H +import seed_demo_content as C +import seed_demo_photos as P +import seed_demo_unsplash as U +import seed_demo_locations as L +import seed_demo_backfill as B + + +STATE_PATH = REPO_ROOT / "scripts" / ".seed_state.json" +TOKEN_CACHE = H.TokenCache() + + +# ── env loading ──────────────────────────────────────────────────────────── + +def load_env() -> None: + """Load .env then .env.seed (latter overrides).""" + env_path = REPO_ROOT / ".env" + env_seed_path = REPO_ROOT / ".env.seed" + if env_path.exists(): + load_dotenv(env_path, override=False) + if env_seed_path.exists(): + load_dotenv(env_seed_path, override=True) + + +# ── state file (persists user_id_map / mentorship_id_map across phases) ──── + +def load_state() -> dict: + if STATE_PATH.exists(): + try: + return json.loads(STATE_PATH.read_text()) + except json.JSONDecodeError: + return {} + return {} + + +def save_state(state: dict) -> None: + STATE_PATH.write_text(json.dumps(state, indent=2, default=str)) + + +# ── phase A: demographic scaffolding ─────────────────────────────────────── + +def phase_A_users(roster: list[dict]) -> dict: + """Create users, mentors, mentees, admins, interests, skills, + availability slots.""" + print(f"\n=== Phase A: demographic scaffolding ({len(roster)} users) ===") + user_id_map: dict[int, int] = {} + + with D.connect() as conn: + conn.autocommit = False + with conn.cursor() as cur: + for spec in roster: + roster_id = int(spec["id"]) + user = D.SeedUser( + first_name=spec["first_name"], + last_name=spec["last_name"], + email=spec["email"], + password=spec["password"], + city=spec["city"], + role=spec["role"], + ) + db_id = D.insert_user(cur, user) + user_id_map[roster_id] = db_id + + if spec["role"] == "ADMIN": + D.insert_admin(cur, db_id) + elif spec["role"] == "MENTOR": + D.insert_mentor( + cur, db_id, + bio=spec.get("bio", ""), + field=spec.get("field", ""), + expertise=spec.get("expertise", spec.get("field", "")), + affiliation=spec.get("affiliation", ""), + max_capacity=int(spec.get("max_capacity", 1)), + preferred_mentee_major=spec.get("preferred_mentee_major"), + mentoring_goals=spec.get("mentoring_goals", ""), + mentorship_duration=int(spec.get("mentorship_duration", 3)), + field_uri=spec.get("field_uri"), + expertise_uri=spec.get("expertise_uri"), + ) + for interest in spec.get("interests", []): + D.insert_mentor_interest( + cur, db_id, interest["label"], interest.get("uri"), + ) + for skill in spec.get("preferred_mentee_skills", []): + D.insert_mentor_preferred_skill( + cur, db_id, skill["label"], skill.get("uri"), + ) + for day in spec.get("availability_days", []): + D.insert_availability_slot( + cur, db_id, day, "19:00", "20:00", + ) + elif spec["role"] == "MENTEE": + D.insert_mentee( + cur, db_id, + goals=spec.get("goals", ""), + major=spec.get("major", ""), + career_interest=spec.get("career_interest", ""), + background_info=spec.get("background_info", ""), + affiliation=spec.get("affiliation"), + major_uri=spec.get("major_uri"), + career_interest_uri=spec.get("career_interest_uri"), + ) + for interest in spec.get("interests", []): + D.insert_mentee_interest( + cur, db_id, interest["label"], interest.get("uri"), + ) + for skill in spec.get("skills", []): + D.insert_mentee_skill( + cur, db_id, skill["label"], skill.get("uri"), + ) + + D.reset_user_sequence(cur) + # Apply lat/lon based on city — required so the LocationProximitySignal + # emits `nearby:Xkm` factors instead of `location-unset`. + n_coords = L.apply_coordinates(cur) + # Pull narrative content (bio, goals, background_info) from the + # markdown corpus into the DB. roster.yaml only carries + # demographics, so without this step every mentor's bio is + # empty and the UI shows blank profile pages. + backfill = B.backfill_from_markdown(cur) + conn.commit() + + print(f" inserted {len(user_id_map)} users") + print(f" set coordinates on {n_coords} users") + print(f" backfilled narrative: mentors={backfill['mentor_text']}, " + f"mentees={backfill['mentee_text']}, " + f"new availability slots={backfill['slots_added']}") + return user_id_map + + +# ── phase B: profile photos ──────────────────────────────────────────────── + +def phase_B_photos(roster: list[dict], user_id_map: dict[int, int]) -> int: + print(f"\n=== Phase B: profile photos ===") + photo_count = 0 + tmp_dir = REPO_ROOT / "scripts" / ".seed_photos_tmp" + tmp_dir.mkdir(exist_ok=True) + photo_rng = random.Random(R.MASTER_SEED + 100) + + for spec in roster: + if not spec.get("has_photo", False): + continue + roster_id = int(spec["id"]) + db_id = user_id_map.get(roster_id) + if not db_id: + continue + + # login + try: + token = H.login(spec["email"], spec["password"], cache=TOKEN_CACHE) + except Exception as exc: + print(f" user {roster_id} login failed: {exc}") + continue + + # fetch photo + photo_path = tmp_dir / f"photo_{roster_id:04d}.jpg" + source = P.fetch_profile_photo(photo_path, rng=photo_rng) + if not source: + print(f" user {roster_id} photo unavailable, skipping") + continue + + # upload + try: + H.upload_profile_photo(token, photo_path, content_type="image/jpeg") + photo_count += 1 + if photo_count % 10 == 0: + print(f" uploaded {photo_count} photos so far") + except Exception as exc: + print(f" user {roster_id} photo upload failed: {exc}") + + print(f" total photos uploaded: {photo_count}") + return photo_count + + +# ── phase C: content corpus validation ───────────────────────────────────── + +def phase_C_validate(roster: list[dict]) -> bool: + print(f"\n=== Phase C: corpus validation ===") + errors = C.validate_corpus(roster) + error_path = C.SEED_DIR / "_validation_errors.md" + if errors: + lines = ["# Validation errors", ""] + lines.extend(f"- {e}" for e in errors) + error_path.write_text("\n".join(lines) + "\n") + print(f" {len(errors)} errors written to {error_path}") + return False + if error_path.exists(): + error_path.unlink() + print(" corpus OK") + return True + + +# ── phase D: follow graph ────────────────────────────────────────────────── + +def phase_D_follows(roster: list[dict], user_id_map: dict[int, int]) -> int: + print(f"\n=== Phase D: follow graph ===") + edges: list[tuple[int, int]] = [] + role_lookup = {int(r["id"]): r["role"] for r in roster} + for follower_roster_id, follower_db_id in user_id_map.items(): + follower_role = role_lookup.get(follower_roster_id) + if follower_role == "ADMIN": + continue + p = R.PROB_FOLLOW_MENTOR if follower_role == "MENTOR" else R.PROB_FOLLOW_MENTEE + for followee_roster_id, followee_db_id in user_id_map.items(): + if followee_roster_id == follower_roster_id: + continue + if role_lookup.get(followee_roster_id) == "ADMIN": + continue + if R.bernoulli(R.rng_follows, p): + edges.append((follower_db_id, followee_db_id)) + + with D.connect() as conn: + with conn.cursor() as cur: + D.insert_follow_batch(cur, edges) + conn.commit() + print(f" inserted {len(edges)} follow edges") + return len(edges) + + +# ── phase E: feed posts ──────────────────────────────────────────────────── + +def phase_E_posts(user_id_map: dict[int, int]) -> dict[str, int]: + print(f"\n=== Phase E: feed posts ===") + inserted_posts = 0 + inserted_hashtags = 0 + post_id_map: dict[tuple[int, int], int] = {} # (roster_id, post_index) → post_id + + with D.connect() as conn: + with conn.cursor() as cur: + for user_spec in C.iter_user_specs(): + db_author_id = user_id_map.get(user_spec.id) + if not db_author_id: + continue + for idx, post in enumerate(user_spec.posts): + created_at = R.post_created_at() + post_id = D.insert_feed_post( + cur, + author_id=db_author_id, + body=post.body, + lang=post.lang or "tr", + created_at=created_at, + ) + post_id_map[(user_spec.id, idx)] = post_id + inserted_posts += 1 + for tag in post.hashtags: + D.insert_feed_post_hashtag(cur, post_id, tag.lower().lstrip("#")) + inserted_hashtags += 1 + conn.commit() + + print(f" inserted {inserted_posts} posts, {inserted_hashtags} hashtags") + return { + "post_count": inserted_posts, + "post_id_map": {f"{k[0]}:{k[1]}": v for k, v in post_id_map.items()}, + } + + +# ── phase E.2: engagement ────────────────────────────────────────────────── + +def phase_E2_engagement(roster: list[dict], + user_id_map: dict[int, int], + post_id_map: dict[str, int]) -> dict[str, int]: + print(f"\n=== Phase E.2: engagement (likes + comments + comment likes) ===") + likes_inserted = 0 + comments_inserted = 0 + comment_likes_inserted = 0 + + # Pre-compute follower lookup: followee_db_id → [follower_db_id, ...] + with D.connect() as conn: + with conn.cursor() as cur: + cur.execute( + "SELECT follower_id, followee_id FROM follows " + "WHERE follower_id = ANY(%s) AND followee_id = ANY(%s)", + (list(user_id_map.values()), list(user_id_map.values())), + ) + follower_rows = cur.fetchall() + follower_lookup: dict[int, list[int]] = {} + for follower_id, followee_id in follower_rows: + follower_lookup.setdefault(followee_id, []).append(follower_id) + + # Iterate posts via markdown corpus (so we have comment lists). + all_user_ids = list(user_id_map.values()) + + with D.connect() as conn: + with conn.cursor() as cur: + for user_spec in C.iter_user_specs(): + db_author_id = user_id_map.get(user_spec.id) + if not db_author_id: + continue + followers = follower_lookup.get(db_author_id, []) + follower_count = len(followers) + for idx, post in enumerate(user_spec.posts): + post_db_id = post_id_map.get(f"{user_spec.id}:{idx}") + if not post_db_id: + continue + + # likes + n_likes = R.post_like_count(follower_count) + likers = R.sample(R.rng_likes, followers, n_likes) + likes_inserted += D.insert_feed_post_likes(cur, post_db_id, likers) + + # comments + for comment in post.comments: + commenter_db_id = user_id_map.get(comment.by) + if not commenter_db_id: + continue + offset_seconds = R.rng_comments.randint(60, 3 * 86400) + cur.execute("SELECT created_at FROM feed_posts WHERE id = %s", + (post_db_id,)) + post_created = cur.fetchone()[0] + comment_created = post_created + timedelta(seconds=offset_seconds) + comment_id = D.insert_feed_post_comment( + cur, post_id=post_db_id, author_id=commenter_db_id, + body=comment.body, created_at=comment_created, + ) + comments_inserted += 1 + + # comment likes + n_clikes = R.comment_like_count( + len(post.comments), len(all_user_ids), + ) + clikers = R.sample(R.rng_likes, all_user_ids, n_clikes) + comment_likes_inserted += D.insert_feed_post_comment_likes( + cur, comment_id, clikers, + ) + conn.commit() + + print(f" likes={likes_inserted}, comments={comments_inserted}, " + f"comment_likes={comment_likes_inserted}") + return { + "likes": likes_inserted, + "comments": comments_inserted, + "comment_likes": comment_likes_inserted, + } + + +# ── phase E.1: post images via Unsplash ──────────────────────────────────── + +def phase_E1_post_images(roster: list[dict], user_id_map: dict[int, int], + post_id_map: dict[str, int], + respect_rate_limit: bool = True) -> int: + """For each post with has_image=true: fetch Unsplash, upload to backend, + bind to post via feed_post_attachments.""" + print(f"\n=== Phase E.1: post images (Unsplash) ===") + try: + client = U.UnsplashClient(respect_rate_limit=respect_rate_limit) + except RuntimeError as e: + print(f" skipped: {e}") + return 0 + + roster_by_id = {int(u["id"]): u for u in roster} + tmp_dir = REPO_ROOT / "scripts" / ".seed_post_images_tmp" + tmp_dir.mkdir(exist_ok=True) + uploaded = 0 + failed = 0 + skipped_existing = 0 + + # Idempotency: skip posts that already have an attachment. + with D.connect() as conn: + with conn.cursor() as cur: + cur.execute( + "SELECT post_id FROM feed_post_attachments " + "WHERE post_id IN (" + " SELECT id FROM feed_posts WHERE author_id IN (" + " SELECT id FROM users WHERE email LIKE %s OR email LIKE %s))", + ("%@seed.test", "%@seed.local"), + ) + already_imaged = {row[0] for row in cur.fetchall()} + + PICSUM_BASE = "https://picsum.photos/seed" + unsplash_dead = False + + for user_spec in C.iter_user_specs(): + roster_user = roster_by_id.get(user_spec.id) + if not roster_user: + continue + db_author_id = user_id_map.get(user_spec.id) + if not db_author_id: + continue + + for idx, post in enumerate(user_spec.posts): + if not post.has_image: + continue + post_db_id = post_id_map.get(f"{user_spec.id}:{idx}") + if not post_db_id: + continue + if post_db_id in already_imaged: + skipped_existing += 1 + continue + topic = post.image_topic or (post.hashtags[0] if post.hashtags else "abstract") + + img_path = tmp_dir / f"post_{post_db_id}.jpg" + ok = False + try: + if not unsplash_dead: + payload = client.random_photo(topic) + if payload and client.download_image(payload, img_path): + ok = True + elif payload is None: + # 403 / hard fail — give up on Unsplash for the rest + unsplash_dead = True + if not ok: + # Picsum fallback: deterministic by post id, 1200x800 landscape + import requests as _rq + r = _rq.get(f"{PICSUM_BASE}/post-{post_db_id}/1200/800", + timeout=15, allow_redirects=True) + if r.status_code == 200 and len(r.content) > 1000: + img_path.write_bytes(r.content) + ok = True + if not ok: + print(f" no image for post {post_db_id} (topic='{topic}')") + failed += 1 + continue + + # Authenticate as the author + try: + token = H.login(roster_user["email"], roster_user["password"], + cache=TOKEN_CACHE) + except Exception as exc: + print(f" login failed for user {user_spec.id}: {exc}") + failed += 1 + continue + + # Upload as attachment + try: + attachment_id = H.upload_attachment(token, img_path) + except Exception as exc: + print(f" upload failed for post {post_db_id}: {exc}") + failed += 1 + continue + + # Link to post + with D.connect() as conn: + with conn.cursor() as cur: + try: + D.insert_feed_post_attachment(cur, post_db_id, + attachment_id, 0) + uploaded += 1 + except Exception as exc: + print(f" post-attachment link failed: {exc}") + failed += 1 + conn.commit() + + if uploaded % 5 == 0: + print(f" {uploaded} images uploaded so far ({failed} failed)") + except Exception as exc: + print(f" unexpected error for post {post_db_id}: {exc}") + failed += 1 + + print(f" total uploaded: {uploaded} ({failed} failed, {skipped_existing} already had an image)") + return uploaded + + +# ── phase F: active mentorship request/accept via HTTP ───────────────────── + +def phase_F_mentorships(user_id_map: dict[int, int]) -> dict: + print(f"\n=== Phase F: active mentorship request+accept (HTTP) ===") + created_mentorships = [] + mentorship_specs = { + (ms.mentor_id, ms.mentee_id): ms + for ms in C.iter_mentorship_specs() + if ms.status == "ACTIVE" + } + + with D.connect() as conn: + for (mentor_roster_id, mentee_roster_id), ms in mentorship_specs.items(): + mentor_db = user_id_map.get(mentor_roster_id) + mentee_db = user_id_map.get(mentee_roster_id) + if not mentor_db or not mentee_db: + continue + + # find roster emails + with conn.cursor() as cur: + cur.execute("SELECT email FROM users WHERE id = %s", (mentor_db,)) + mentor_email = cur.fetchone()[0] + cur.execute("SELECT email FROM users WHERE id = %s", (mentee_db,)) + mentee_email = cur.fetchone()[0] + + try: + mentee_token = H.login(mentee_email, "Seed1234!", cache=TOKEN_CACHE) + mentor_token = H.login(mentor_email, "Seed1234!", cache=TOKEN_CACHE) + except Exception as exc: + print(f" login failed for ({mentor_roster_id}→{mentee_roster_id}): {exc}") + continue + + try: + req = H.create_mentorship_request( + mentee_token, mentor_id=mentor_db, message=ms.request_message, + ) + accept = H.accept_mentorship_request( + mentor_token, request_id=req["id"], duration=ms.duration, + ) + created_mentorships.append({ + "mentor_roster_id": mentor_roster_id, + "mentee_roster_id": mentee_roster_id, + "mentor_db_id": mentor_db, + "mentee_db_id": mentee_db, + "request_id": req["id"], + "mentorship_id": accept.get("id") or accept.get("mentorshipId"), + "duration": ms.duration, + "start_offset_days": ms.start_offset_days, + }) + except Exception as exc: + print(f" request/accept failed for ({mentor_roster_id}→{mentee_roster_id}): {exc}") + + print(f" active mentorships created: {len(created_mentorships)}") + return {"active_mentorships": created_mentorships} + + +# ── phase G: active mentorship lifecycle artefacts (direct SQL) ──────────── + +def phase_G_lifecycle(active_mentorships: list[dict]) -> dict[str, int]: + print(f"\n=== Phase G: active mentorship lifecycle ===") + tasks_inserted = 0 + milestones_inserted = 0 + meetings_inserted = 0 + messages_inserted = 0 + + spec_by_pair = {(ms.mentor_id, ms.mentee_id): ms + for ms in C.iter_mentorship_specs() + if ms.status == "ACTIVE"} + + today = R.TODAY + + with D.connect() as conn: + with conn.cursor() as cur: + for m in active_mentorships: + mentor_db = m["mentor_db_id"] + mentee_db = m["mentee_db_id"] + mentorship_id = m["mentorship_id"] + if not mentorship_id: + continue + ms = spec_by_pair.get((m["mentor_roster_id"], m["mentee_roster_id"])) + if not ms: + continue + + start_date = today + timedelta(days=ms.start_offset_days) + + # Conversation (idempotent — backend may have lazy-created) + conv_id = D.insert_mentorship_conversation( + cur, mentorship_id, start_date, + ) + D.insert_conversation_participants( + cur, conv_id, [mentor_db, mentee_db], start_date, + ) + + # Messages (backdated) + for msg in ms.messages: + sent_at = today + timedelta(days=msg.sent_offset_days) + sender_id = mentor_db if msg.sender == "mentor" else mentee_db + D.insert_message( + cur, conversation_id=conv_id, sender_id=sender_id, + content=msg.body, sent_at=sent_at, + ) + messages_inserted += 1 + + # Tasks + for t in ms.tasks: + due_date = today + timedelta(days=t.due_offset_days) + D.insert_task( + cur, mentorship_id=mentorship_id, title=t.title, + description=t.description, due_date=due_date, + status=t.status, created_at=start_date, + ) + tasks_inserted += 1 + + # Milestones + for ms_spec in ms.milestones: + target_date = today + timedelta(days=ms_spec.target_offset_days) + completed_at = target_date if ms_spec.status == "COMPLETED" else None + D.insert_milestone( + cur, mentorship_id=mentorship_id, title=ms_spec.title, + description=ms_spec.description, target_date=target_date, + status=ms_spec.status, order_index=ms_spec.order_index, + completed_at=completed_at, created_at=start_date, + ) + milestones_inserted += 1 + + # Meetings + for mt in ms.meetings: + start_time = today + timedelta(days=mt.start_offset_days) + end_time = start_time + timedelta(minutes=mt.duration_minutes) + confirmed_at = start_time if mt.status in ("CONFIRMED", "COMPLETED") else None + notes_updated_at = end_time if mt.notes else None + D.insert_meeting( + cur, mentorship_id=mentorship_id, title=mt.title, + description=mt.description, start_time=start_time, + end_time=end_time, status=mt.status, + meeting_link=None, meeting_type="VIRTUAL", + is_recurring=False, recurrence_rule=None, + created_by_id=mentor_db, + confirmed_at=confirmed_at, + notes=mt.notes if mt.notes else None, + notes_updated_at=notes_updated_at, + notes_updated_by_id=mentor_db if mt.notes else None, + created_at=start_date, + ) + meetings_inserted += 1 + + # Patch shared_goal if backend default-empty + if ms.shared_goal: + cur.execute( + "UPDATE mentorships SET shared_goal = %s WHERE id = %s", + (ms.shared_goal, mentorship_id), + ) + conn.commit() + + print(f" tasks={tasks_inserted}, milestones={milestones_inserted}, " + f"meetings={meetings_inserted}, messages={messages_inserted}") + return { + "tasks": tasks_inserted, "milestones": milestones_inserted, + "meetings": meetings_inserted, "messages": messages_inserted, + } + + +# ── phase H: past mentorships (direct SQL) ───────────────────────────────── + +def phase_H_past_mentorships(user_id_map: dict[int, int]) -> int: + print(f"\n=== Phase H: past mentorships ===") + past_specs = [ms for ms in C.iter_mentorship_specs() + if ms.status in ("COMPLETED", "TERMINATED")] + inserted = 0 + + with D.connect() as conn: + with conn.cursor() as cur: + for ms in past_specs: + mentor_db = user_id_map.get(ms.mentor_id) + mentee_db = user_id_map.get(ms.mentee_id) + if not mentor_db or not mentee_db: + continue + + start_date = R.past_mentorship_start_date() + end_date = start_date + timedelta(days=ms.duration * 30) + if end_date > R.TODAY: + end_date = R.TODAY - timedelta(days=1) + + request_id = D.insert_mentorship_request( + cur, mentee_id=mentee_db, mentor_id=mentor_db, + message=ms.request_message, status="ACCEPTED", + created_at=start_date - timedelta(days=2), + ) + terminated_at = end_date if ms.status == "TERMINATED" else None + mentorship_id = D.insert_mentorship( + cur, mentor_id=mentor_db, mentee_id=mentee_db, + request_id=request_id, start_date=start_date, + end_date=end_date, duration=ms.duration, status=ms.status, + shared_goal=ms.shared_goal, + terminated_at=terminated_at, + ) + + conv_id = D.insert_mentorship_conversation(cur, mentorship_id, start_date) + D.insert_conversation_participants( + cur, conv_id, [mentor_db, mentee_db], start_date, + ) + + for msg in ms.messages: + sent_at = start_date + timedelta(days=msg.sent_offset_days) + sender_id = mentor_db if msg.sender == "mentor" else mentee_db + D.insert_message( + cur, conversation_id=conv_id, sender_id=sender_id, + content=msg.body, sent_at=sent_at, + ) + for t in ms.tasks: + due_date = start_date + timedelta(days=t.due_offset_days) + D.insert_task( + cur, mentorship_id=mentorship_id, title=t.title, + description=t.description, due_date=due_date, + status=t.status, created_at=start_date, + ) + for m_spec in ms.milestones: + target_date = start_date + timedelta(days=m_spec.target_offset_days) + D.insert_milestone( + cur, mentorship_id=mentorship_id, title=m_spec.title, + description=m_spec.description, target_date=target_date, + status=m_spec.status, order_index=m_spec.order_index, + completed_at=target_date if m_spec.status == "COMPLETED" else None, + created_at=start_date, + ) + for mt in ms.meetings: + mtg_start = start_date + timedelta(days=mt.start_offset_days) + mtg_end = mtg_start + timedelta(minutes=mt.duration_minutes) + D.insert_meeting( + cur, mentorship_id=mentorship_id, title=mt.title, + description=mt.description, start_time=mtg_start, + end_time=mtg_end, status=mt.status, meeting_link=None, + meeting_type="VIRTUAL", is_recurring=False, + recurrence_rule=None, created_by_id=mentor_db, + confirmed_at=mtg_start, + notes=mt.notes if mt.notes else None, + notes_updated_at=mtg_end if mt.notes else None, + notes_updated_by_id=mentor_db if mt.notes else None, + created_at=start_date, + ) + inserted += 1 + conn.commit() + + print(f" inserted {inserted} past mentorships") + return inserted + + +# ── phase I: mentor-pair conversations ───────────────────────────────────── + +def phase_I_pairs(user_id_map: dict[int, int]) -> int: + print(f"\n=== Phase I: mentor-pair conversations ===") + inserted = 0 + today = R.TODAY + with D.connect() as conn: + with conn.cursor() as cur: + for pc in C.iter_pair_specs(): + lower_db = user_id_map.get(pc.lower_id) + higher_db = user_id_map.get(pc.higher_id) + if not lower_db or not higher_db: + continue + # Maintain DB ordering invariant pair_a_id < pair_b_id + a, b = sorted((lower_db, higher_db)) + conv_created = today - timedelta(days=15) + conv_id = D.insert_mentor_pair_conversation( + cur, a, b, conv_created, + ) + D.insert_conversation_participants( + cur, conv_id, [a, b], conv_created, + ) + for msg in pc.messages: + sent_at = today + timedelta(days=msg.sent_offset_days) + # sender field is a roster id; map to db + sender_roster_id = int(msg.sender) + sender_db = user_id_map.get(sender_roster_id) + if not sender_db or sender_db not in (a, b): + continue + D.insert_message( + cur, conversation_id=conv_id, sender_id=sender_db, + content=msg.body, sent_at=sent_at, + ) + inserted += 1 + conn.commit() + print(f" inserted {inserted} mentor-pair conversations") + return inserted + + +# ── phase V: verification ────────────────────────────────────────────────── + +def phase_V_verify(user_id_map: Optional[dict[int, int]] = None) -> bool: + print(f"\n=== Phase V: verification ===") + with D.connect() as conn: + with conn.cursor() as cur: + seed_user_filter = "email LIKE '%@seed.test' OR email LIKE '%@seed.local'" + counts = {} + for label, sql in [ + ("admins", f"SELECT count(*) FROM admins WHERE id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("mentors", f"SELECT count(*) FROM mentors WHERE id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("mentees", f"SELECT count(*) FROM mentees WHERE id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("posts", f"SELECT count(*) FROM feed_posts WHERE author_id IN (SELECT id FROM users WHERE {seed_user_filter}) AND deleted_at IS NULL"), + ("comments", f"SELECT count(*) FROM feed_post_comments WHERE post_id IN (SELECT id FROM feed_posts WHERE author_id IN (SELECT id FROM users WHERE {seed_user_filter}))"), + ("likes", f"SELECT count(*) FROM feed_post_likes WHERE post_id IN (SELECT id FROM feed_posts WHERE author_id IN (SELECT id FROM users WHERE {seed_user_filter}))"), + ("follows", f"SELECT count(*) FROM follows WHERE follower_id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("mentorships_active", f"SELECT count(*) FROM mentorships WHERE status='ACTIVE' AND mentor_id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("mentorships_past", f"SELECT count(*) FROM mentorships WHERE status<>'ACTIVE' AND mentor_id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("pair_conversations", "SELECT count(*) FROM conversations WHERE kind='MENTOR_PAIR'"), + ("mentorship_conversations", f"SELECT count(*) FROM conversations c JOIN mentorships m ON c.mentorship_id=m.id WHERE m.mentor_id IN (SELECT id FROM users WHERE {seed_user_filter})"), + ("messages", f"SELECT count(*) FROM messages WHERE conversation_id IN (SELECT id FROM conversations WHERE pair_a_id IN (SELECT id FROM users WHERE {seed_user_filter}) OR mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN (SELECT id FROM users WHERE {seed_user_filter})))"), + ]: + cur.execute(sql) + counts[label] = cur.fetchone()[0] + + for k, v in counts.items(): + print(f" {k}: {v}") + return True + + +# ── wipe ─────────────────────────────────────────────────────────────────── + +def phase_wipe() -> None: + print(f"\n=== --wipe: clearing %@seed.test / %@seed.local users ===") + with D.connect() as conn: + with conn.cursor() as cur: + deleted = D.wipe_demo_users(cur) + conn.commit() + for domain, n in deleted.items(): + print(f" cleared {n} users from @{domain}") + TOKEN_CACHE.clear() + + +# ── orchestrator ─────────────────────────────────────────────────────────── + +PHASE_NAMES = ["A", "B", "C", "D", "E", "E.1", "E.2", "F", "G", "H", "I", "V", "all"] + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--phase", choices=PHASE_NAMES, default="all") + parser.add_argument("--wipe", action="store_true", + help="Clear @seed.* users before running phases.") + parser.add_argument("--skip-unsplash-rate-limit", action="store_true", + help="Burn through Unsplash 50/hr cap fast (will 429 after 50).") + args = parser.parse_args() + + load_env() + + if not H.health_check(): + print("Backend health check failed at http://localhost:8080. Is the stack up?") + return 2 + + state = load_state() + + if args.wipe: + phase_wipe() + state = {} + save_state(state) + + if args.phase in ("A", "all"): + roster = C.load_roster() + if not roster: + print("Roster empty — author claude_files/seed/roster.yaml first.") + return 1 + user_id_map = phase_A_users(roster) + state["user_id_map"] = user_id_map + save_state(state) + + if args.phase in ("B", "all"): + roster = C.load_roster() + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + phase_B_photos(roster, user_id_map) + + if args.phase in ("C", "all"): + roster = C.load_roster() + ok = phase_C_validate(roster) + if not ok and args.phase == "all": + print("Validation failed — aborting run.") + return 1 + + if args.phase in ("D", "all"): + roster = C.load_roster() + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + phase_D_follows(roster, user_id_map) + + if args.phase in ("E", "all"): + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + e_result = phase_E_posts(user_id_map) + state["post_id_map"] = e_result["post_id_map"] + save_state(state) + + if args.phase in ("E.1", "all"): + roster = C.load_roster() + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + post_id_map = state.get("post_id_map", {}) + phase_E1_post_images(roster, user_id_map, post_id_map, + respect_rate_limit=not args.skip_unsplash_rate_limit) + + if args.phase in ("F", "all"): + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + f_result = phase_F_mentorships(user_id_map) + state["active_mentorships"] = f_result["active_mentorships"] + save_state(state) + + if args.phase in ("G", "all"): + active_mentorships = state.get("active_mentorships", []) + phase_G_lifecycle(active_mentorships) + + if args.phase in ("H", "all"): + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + phase_H_past_mentorships(user_id_map) + + if args.phase in ("I", "all"): + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + phase_I_pairs(user_id_map) + + if args.phase in ("E.2", "all"): + roster = C.load_roster() + user_id_map = {int(k): v for k, v in state.get("user_id_map", {}).items()} + post_id_map = state.get("post_id_map", {}) + phase_E2_engagement(roster, user_id_map, post_id_map) + + if args.phase in ("V", "all"): + phase_V_verify() + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/seed_demo_db.py b/scripts/seed_demo_db.py new file mode 100644 index 00000000..abdc1c6f --- /dev/null +++ b/scripts/seed_demo_db.py @@ -0,0 +1,581 @@ +"""psycopg helpers for the MyMentorNet demo dataset seed pipeline. + +Wraps a single psycopg connection and exposes INSERT helpers for every entity +populated by the orchestrator: users, mentor/mentee profiles, interests and +skills, availability slots, follows, feed posts (and attachments / hashtags), +feed comments / likes / comment-likes, conversations / participants / messages, +mentorship_requests / mentorships / tasks / milestones / meetings, and the +demo-only wipe routine. +""" + +from __future__ import annotations + +import os +import uuid +from contextlib import contextmanager +from dataclasses import dataclass +from datetime import datetime +from typing import Iterator, Optional, Sequence + +import bcrypt +import psycopg +from psycopg.rows import dict_row + + +SEED_EMAIL_DOMAINS = ("seed.test", "seed.local") +BCRYPT_ROUNDS = 10 + + +def build_dsn() -> str: + if "DATABASE_URL" in os.environ: + return os.environ["DATABASE_URL"] + user = os.environ.get("POSTGRES_USER", "group7") + password = os.environ.get("POSTGRES_PASSWORD", "group7pass") + db = os.environ.get("POSTGRES_DB", "group7db") + host = os.environ.get("POSTGRES_HOST", "localhost") + port = os.environ.get("DB_PORT", os.environ.get("POSTGRES_PORT", "5433")) + return f"postgresql://{user}:{password}@{host}:{port}/{db}" + + +def bcrypt_hash(plain: str) -> str: + return bcrypt.hashpw(plain.encode("utf-8"), + bcrypt.gensalt(rounds=BCRYPT_ROUNDS)).decode("ascii") + + +@contextmanager +def connect() -> Iterator[psycopg.Connection]: + conn = psycopg.connect(build_dsn()) + try: + yield conn + finally: + conn.close() + + +# ── wipe ─────────────────────────────────────────────────────────────────── + +def wipe_demo_users(cur) -> dict[str, int]: + """Delete every row whose user.email ends in one of SEED_EMAIL_DOMAINS. + + Returns count of deleted users per domain. + + Relies on ON DELETE CASCADE on most newer migrations (feed_posts, + mentorships, follows, conversations, messages, attachments, etc.). + The pre-V20 child tables (mentor_interests / mentee_interests / + mentor_preferred_mentee_skills / mentee_skills) lack cascade, so we + delete them up front. mentee.active_mentor_id is nullified first. + """ + deleted = {} + for domain in SEED_EMAIL_DOMAINS: + like = f"%@{domain}" + cur.execute("SELECT COUNT(*) FROM users WHERE email LIKE %s", (like,)) + existing = cur.fetchone()[0] + if existing == 0: + deleted[domain] = 0 + continue + + # feed_post_attachments references attachments with NO ACTION; clear + # junction rows whose attachment belongs to a seed uploader before + # the user CASCADE chain tries to delete the attachments rows. + cur.execute( + "DELETE FROM feed_post_attachments WHERE attachment_id IN " + "(SELECT id FROM attachments WHERE uploader_id IN " + " (SELECT id FROM users WHERE email LIKE %s))", + (like,), + ) + + for table, column in [ + ("mentor_interests", "mentor_id"), + ("mentor_preferred_mentee_skills", "mentor_id"), + ("mentee_interests", "mentee_id"), + ("mentee_skills", "mentee_id"), + ]: + cur.execute( + f"DELETE FROM {table} WHERE {column} IN " + f"(SELECT id FROM users WHERE email LIKE %s)", + (like,), + ) + + cur.execute( + "UPDATE mentees SET active_mentor_id = NULL " + "WHERE active_mentor_id IN (SELECT id FROM users WHERE email LIKE %s)", + (like,), + ) + + for table in ("admins", "mentors", "mentees"): + cur.execute( + f"DELETE FROM {table} WHERE id IN " + f"(SELECT id FROM users WHERE email LIKE %s)", + (like,), + ) + + cur.execute("DELETE FROM users WHERE email LIKE %s", (like,)) + deleted[domain] = existing + return deleted + + +def reset_user_sequence(cur) -> None: + cur.execute( + "SELECT setval(pg_get_serial_sequence('users', 'id'), " + "COALESCE((SELECT MAX(id) FROM users), 1))" + ) + + +# ── user / profile inserts ───────────────────────────────────────────────── + +@dataclass +class SeedUser: + first_name: str + last_name: str + email: str + password: str + city: str + role: str # ADMIN | MENTOR | MENTEE + + +def insert_user(cur, u: SeedUser, profile_photo_path: Optional[str] = None) -> int: + cur.execute( + """ + INSERT INTO users ( + first_name, last_name, email, password_hash, + profile_photo, + is_email_verified, timezone, is_suspected_bot, version, city, + created_at + ) + VALUES (%s, %s, %s, %s, %s, TRUE, %s, FALSE, 0, %s, NOW()) + RETURNING id + """, + (u.first_name, u.last_name, u.email, bcrypt_hash(u.password), + profile_photo_path, "Europe/Istanbul", u.city), + ) + return cur.fetchone()[0] + + +def insert_admin(cur, user_id: int) -> None: + cur.execute("INSERT INTO admins (id) VALUES (%s)", (user_id,)) + + +def insert_mentor(cur, user_id: int, *, + bio: str, field: str, expertise: str, + affiliation: str, max_capacity: int, + preferred_mentee_major: Optional[str], + mentoring_goals: str, + mentorship_duration: int, + field_uri: Optional[str] = None, + expertise_uri: Optional[str] = None, + preferred_mentee_major_uri: Optional[str] = None, + profile_visibility: bool = True) -> None: + cur.execute( + """ + INSERT INTO mentors ( + id, profile_visibility, bio, field, field_uri, + expertise, expertise_uri, affiliation, + max_mentee_capacity, current_mentee_count, + preferred_mentee_major, preferred_mentee_major_uri, + mentoring_goals, mentorship_duration + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, 0, %s, %s, %s, %s) + """, + (user_id, profile_visibility, bio, field, field_uri, + expertise, expertise_uri, affiliation, + max_capacity, preferred_mentee_major, preferred_mentee_major_uri, + mentoring_goals, mentorship_duration), + ) + + +def insert_mentee(cur, user_id: int, *, + goals: str, major: str, career_interest: str, + background_info: str, affiliation: Optional[str], + meeting_freq_pref: str = "Weekly", + major_uri: Optional[str] = None, + career_interest_uri: Optional[str] = None, + profile_visibility: bool = True) -> None: + cur.execute( + """ + INSERT INTO mentees ( + id, profile_visibility, goals, major, major_uri, + career_interest, career_interest_uri, + meeting_freq_pref, background_info, affiliation, + cancel_count, active_mentor_id + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 0, NULL) + """, + (user_id, profile_visibility, goals, major, major_uri, + career_interest, career_interest_uri, + meeting_freq_pref, background_info, affiliation), + ) + + +def insert_mentor_interest(cur, mentor_id: int, label: str, uri: Optional[str] = None) -> None: + cur.execute( + "INSERT INTO mentor_interests (mentor_id, interest, identifier_uri) " + "VALUES (%s, %s, %s)", + (mentor_id, label, uri), + ) + + +def insert_mentee_interest(cur, mentee_id: int, label: str, uri: Optional[str] = None) -> None: + cur.execute( + "INSERT INTO mentee_interests (mentee_id, interest, identifier_uri) " + "VALUES (%s, %s, %s)", + (mentee_id, label, uri), + ) + + +def insert_mentor_preferred_skill(cur, mentor_id: int, skill: str, + uri: Optional[str] = None) -> None: + cur.execute( + "INSERT INTO mentor_preferred_mentee_skills " + "(mentor_id, skill, identifier_uri) VALUES (%s, %s, %s)", + (mentor_id, skill, uri), + ) + + +def insert_mentee_skill(cur, mentee_id: int, skill: str, + uri: Optional[str] = None) -> None: + cur.execute( + "INSERT INTO mentee_skills (mentee_id, skill, identifier_uri) " + "VALUES (%s, %s, %s)", + (mentee_id, skill, uri), + ) + + +def insert_availability_slot(cur, mentor_id: int, day_of_week: str, + start_time: str, end_time: str, + recurring: bool = True) -> None: + cur.execute( + "INSERT INTO mentor_availability_slots " + "(mentor_id, day_of_week, start_time, end_time, recurring) " + "VALUES (%s, %s, %s, %s, %s)", + (mentor_id, day_of_week, start_time, end_time, recurring), + ) + + +# ── follows ──────────────────────────────────────────────────────────────── + +def insert_follow_batch(cur, edges: Sequence[tuple[int, int]]) -> int: + """Bulk-insert (follower_id, followee_id) edges with ON CONFLICT DO NOTHING.""" + if not edges: + return 0 + cur.executemany( + "INSERT INTO follows (follower_id, followee_id) VALUES (%s, %s) " + "ON CONFLICT DO NOTHING", + edges, + ) + return cur.rowcount or 0 + + +# ── feed posts ──────────────────────────────────────────────────────────── + +def insert_feed_post(cur, *, author_id: int, body: str, lang: Optional[str], + created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO feed_posts (author_id, body, lang, created_at, updated_at, + version, deleted_at) + VALUES (%s, %s, %s, %s, %s, 0, NULL) + RETURNING id + """, + (author_id, body, lang, created_at, created_at), + ) + return cur.fetchone()[0] + + +def insert_feed_post_hashtag(cur, post_id: int, tag: str) -> None: + cur.execute( + "INSERT INTO feed_post_hashtags (post_id, tag) VALUES (%s, %s) " + "ON CONFLICT DO NOTHING", + (post_id, tag), + ) + + +def insert_attachment(cur, *, attachment_id: uuid.UUID, filename: str, + content_type: str, size_bytes: int, + uploader_id: int) -> None: + cur.execute( + """ + INSERT INTO attachments (id, filename, content_type, size_bytes, + uploader_id, created_at) + VALUES (%s, %s, %s, %s, %s, NOW()) + """, + (str(attachment_id), filename, content_type, size_bytes, uploader_id), + ) + + +def insert_feed_post_attachment(cur, post_id: int, + attachment_id: uuid.UUID, position: int) -> None: + cur.execute( + "INSERT INTO feed_post_attachments (post_id, attachment_id, position) " + "VALUES (%s, %s, %s)", + (post_id, str(attachment_id), position), + ) + + +# ── feed engagement (comments, likes, comment-likes) ─────────────────────── + +def insert_feed_post_comment(cur, *, post_id: int, author_id: int, + body: str, created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO feed_post_comments (post_id, author_id, body, created_at, + updated_at, version, deleted_at, + parent_comment_id) + VALUES (%s, %s, %s, %s, %s, 0, NULL, NULL) + RETURNING id + """, + (post_id, author_id, body, created_at, created_at), + ) + return cur.fetchone()[0] + + +def insert_feed_post_likes(cur, post_id: int, + user_ids: Sequence[int]) -> int: + if not user_ids: + return 0 + cur.executemany( + "INSERT INTO feed_post_likes (post_id, user_id) VALUES (%s, %s) " + "ON CONFLICT DO NOTHING", + [(post_id, uid) for uid in user_ids], + ) + return cur.rowcount or 0 + + +def insert_feed_post_comment_likes(cur, comment_id: int, + user_ids: Sequence[int]) -> int: + if not user_ids: + return 0 + cur.executemany( + "INSERT INTO feed_post_comment_likes (comment_id, user_id) " + "VALUES (%s, %s) ON CONFLICT DO NOTHING", + [(comment_id, uid) for uid in user_ids], + ) + return cur.rowcount or 0 + + +# ── mentorship lifecycle ─────────────────────────────────────────────────── + +def insert_mentorship_request(cur, *, mentee_id: int, mentor_id: int, + message: Optional[str], status: str, + created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO mentorship_requests (mentee_id, mentor_id, message, status, + created_at, updated_at) + VALUES (%s, %s, %s, %s, %s, %s) + RETURNING id + """, + (mentee_id, mentor_id, message, status, created_at, created_at), + ) + return cur.fetchone()[0] + + +def insert_mentorship(cur, *, mentor_id: int, mentee_id: int, + request_id: int, start_date: datetime, + end_date: datetime, duration: int, status: str, + shared_goal: Optional[str], + terminated_at: Optional[datetime] = None, + terminated_by_user_id: Optional[int] = None) -> int: + cur.execute( + """ + INSERT INTO mentorships (mentor_id, mentee_id, request_id, + start_date, end_date, duration, status, + shared_goal, terminated_at, + terminated_by_user_id, created_at, updated_at) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + RETURNING id + """, + (mentor_id, mentee_id, request_id, start_date, end_date, duration, + status, shared_goal, terminated_at, terminated_by_user_id, + start_date, start_date), + ) + return cur.fetchone()[0] + + +def insert_task(cur, *, mentorship_id: int, title: str, + description: Optional[str], due_date: Optional[datetime], + status: str, created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO tasks (mentorship_id, title, description, due_date, + status, created_at, updated_at) + VALUES (%s, %s, %s, %s, %s, %s, %s) + RETURNING id + """, + (mentorship_id, title, description, due_date, status, + created_at, created_at), + ) + return cur.fetchone()[0] + + +def insert_milestone(cur, *, mentorship_id: int, title: str, + description: Optional[str], + target_date: Optional[datetime], status: str, + order_index: int, completed_at: Optional[datetime], + created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO milestones (mentorship_id, title, description, target_date, + status, order_index, completed_at, created_at) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s) + RETURNING id + """, + (mentorship_id, title, description, target_date, status, order_index, + completed_at, created_at), + ) + return cur.fetchone()[0] + + +def insert_meeting(cur, *, mentorship_id: int, title: str, + description: Optional[str], start_time: datetime, + end_time: datetime, status: str, meeting_link: Optional[str], + meeting_type: str, is_recurring: bool, + recurrence_rule: Optional[str], created_by_id: int, + confirmed_at: Optional[datetime] = None, + confirmation_deadline: Optional[datetime] = None, + notes: Optional[str] = None, + notes_updated_at: Optional[datetime] = None, + notes_updated_by_id: Optional[int] = None, + created_at: Optional[datetime] = None) -> int: + cur.execute( + """ + INSERT INTO meetings (mentorship_id, title, description, start_time, + end_time, status, meeting_link, meeting_type, + is_recurring, recurrence_rule, created_by_id, + confirmed_at, confirmation_deadline, + notes, notes_updated_at, notes_updated_by_id, + created_at) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + RETURNING id + """, + (mentorship_id, title, description, start_time, end_time, status, + meeting_link, meeting_type, is_recurring, recurrence_rule, + created_by_id, confirmed_at, confirmation_deadline, + notes, notes_updated_at, notes_updated_by_id, + created_at or start_time), + ) + return cur.fetchone()[0] + + +# ── conversations + messages ─────────────────────────────────────────────── + +def insert_mentorship_conversation(cur, mentorship_id: int, + created_at: datetime) -> int: + cur.execute( + """ + INSERT INTO conversations (kind, mentorship_id, created_at) + VALUES ('MENTORSHIP', %s, %s) + ON CONFLICT (mentorship_id) WHERE mentorship_id IS NOT NULL + DO NOTHING + RETURNING id + """, + (mentorship_id, created_at), + ) + row = cur.fetchone() + if row: + return row[0] + # Already existed (lazy-created by backend or a previous run); fetch it. + cur.execute( + "SELECT id FROM conversations WHERE mentorship_id = %s " + "AND kind = 'MENTORSHIP'", + (mentorship_id,), + ) + return cur.fetchone()[0] + + +def insert_mentor_pair_conversation(cur, pair_a_id: int, pair_b_id: int, + created_at: datetime) -> int: + if pair_a_id >= pair_b_id: + raise ValueError("pair_a_id must be < pair_b_id") + cur.execute( + """ + INSERT INTO conversations (kind, pair_a_id, pair_b_id, created_at) + VALUES ('MENTOR_PAIR', %s, %s, %s) + RETURNING id + """, + (pair_a_id, pair_b_id, created_at), + ) + return cur.fetchone()[0] + + +def insert_conversation_participants(cur, conversation_id: int, + user_ids: Sequence[int], + joined_at: datetime) -> None: + if not user_ids: + return + cur.executemany( + "INSERT INTO conversation_participants (conversation_id, user_id, joined_at) " + "VALUES (%s, %s, %s) ON CONFLICT DO NOTHING", + [(conversation_id, uid, joined_at) for uid in user_ids], + ) + + +def insert_message(cur, *, conversation_id: int, sender_id: int, + content: str, sent_at: datetime, + read_at: Optional[datetime] = None, + attachment_id: Optional[uuid.UUID] = None) -> int: + cur.execute( + """ + INSERT INTO messages (conversation_id, sender_id, content, sent_at, + read_at, attachment_id) + VALUES (%s, %s, %s, %s, %s, %s) + RETURNING id + """, + (conversation_id, sender_id, content, sent_at, read_at, + str(attachment_id) if attachment_id else None), + ) + return cur.fetchone()[0] + + +# ── counter maintenance ──────────────────────────────────────────────────── + +def increment_mentor_capacity_count(cur, mentor_id: int) -> None: + cur.execute( + "UPDATE mentors SET current_mentee_count = current_mentee_count + 1 " + "WHERE id = %s", + (mentor_id,), + ) + + +def set_mentee_active_mentor(cur, mentee_id: int, mentor_id: int) -> None: + cur.execute( + "UPDATE mentees SET active_mentor_id = %s WHERE id = %s", + (mentor_id, mentee_id), + ) + + +__all__ = [ + "SEED_EMAIL_DOMAINS", + "build_dsn", + "bcrypt_hash", + "connect", + "wipe_demo_users", + "reset_user_sequence", + "SeedUser", + "insert_user", + "insert_admin", + "insert_mentor", + "insert_mentee", + "insert_mentor_interest", + "insert_mentee_interest", + "insert_mentor_preferred_skill", + "insert_mentee_skill", + "insert_availability_slot", + "insert_follow_batch", + "insert_feed_post", + "insert_feed_post_hashtag", + "insert_attachment", + "insert_feed_post_attachment", + "insert_feed_post_comment", + "insert_feed_post_likes", + "insert_feed_post_comment_likes", + "insert_mentorship_request", + "insert_mentorship", + "insert_task", + "insert_milestone", + "insert_meeting", + "insert_mentorship_conversation", + "insert_mentor_pair_conversation", + "insert_conversation_participants", + "insert_message", + "increment_mentor_capacity_count", + "set_mentee_active_mentor", +] diff --git a/scripts/seed_demo_http.py b/scripts/seed_demo_http.py new file mode 100644 index 00000000..d2f2769d --- /dev/null +++ b/scripts/seed_demo_http.py @@ -0,0 +1,170 @@ +"""HTTP helpers for the MyMentorNet demo dataset seed pipeline. + +Authenticates seed users, caches JWTs to disk, and provides multipart upload +plus mentorship request/accept POSTs. Used for code paths where the real +backend behaviour (magic-byte validation, follow-graph sync, notification +fanout, lazy conversation creation) needs to fire authentically. +""" + +from __future__ import annotations + +import json +import mimetypes +import time +import urllib.error +import urllib.request +import uuid +from pathlib import Path +from typing import Optional + +import requests + + +API_BASE = "http://localhost:8080/api" +TOKEN_CACHE_PATH = Path(__file__).resolve().parent / ".seed_tokens.json" +LOGIN_BACKOFF_SECONDS = 0.0 # bumped on 429 + + +# ── token cache ──────────────────────────────────────────────────────────── + +class TokenCache: + """Simple email→sessionToken cache backed by .seed_tokens.json.""" + + def __init__(self, path: Path = TOKEN_CACHE_PATH) -> None: + self.path = path + self._tokens: dict[str, str] = {} + if path.exists(): + try: + self._tokens = json.loads(path.read_text()) + except json.JSONDecodeError: + self._tokens = {} + + def get(self, email: str) -> Optional[str]: + return self._tokens.get(email) + + def put(self, email: str, token: str) -> None: + self._tokens[email] = token + self.path.write_text(json.dumps(self._tokens, indent=2)) + + def clear(self) -> None: + self._tokens = {} + if self.path.exists(): + self.path.unlink() + + +# ── auth ─────────────────────────────────────────────────────────────────── + +def login(email: str, password: str, + cache: Optional[TokenCache] = None) -> str: + """Returns sessionToken, using cache when present.""" + if cache is not None: + cached = cache.get(email) + if cached: + return cached + + response = requests.post( + f"{API_BASE}/auth/login", + json={"email": email, "password": password}, + timeout=10, + ) + if response.status_code == 429: + # rate-limited despite APP_RATELIMIT_ENABLED=false — back off + time.sleep(5) + return login(email, password, cache) + response.raise_for_status() + token = response.json()["sessionToken"] + if cache is not None: + cache.put(email, token) + return token + + +def auth_headers(token: str) -> dict[str, str]: + return {"Authorization": f"Bearer {token}"} + + +# ── profile photo upload ─────────────────────────────────────────────────── + +def upload_profile_photo(token: str, file_path: Path, + content_type: str = "image/jpeg") -> dict: + """POST /api/users/me/photo (multipart).""" + with open(file_path, "rb") as fh: + response = requests.post( + f"{API_BASE}/users/me/photo", + headers=auth_headers(token), + files={"file": (file_path.name, fh, content_type)}, + timeout=30, + ) + response.raise_for_status() + return response.json() + + +# ── attachment upload (for post images) ──────────────────────────────────── + +def upload_attachment(token: str, file_path: Path, + content_type: Optional[str] = None) -> uuid.UUID: + """POST /api/messages/attachments — returns the new attachment UUID.""" + if content_type is None: + content_type = (mimetypes.guess_type(str(file_path))[0] + or "application/octet-stream") + with open(file_path, "rb") as fh: + response = requests.post( + f"{API_BASE}/messages/attachments", + headers=auth_headers(token), + files={"file": (file_path.name, fh, content_type)}, + timeout=30, + ) + response.raise_for_status() + payload = response.json() + return uuid.UUID(payload["id"]) + + +# ── mentorship request / accept ──────────────────────────────────────────── + +def create_mentorship_request(mentee_token: str, *, mentor_id: int, + message: str) -> dict: + response = requests.post( + f"{API_BASE}/mentorship-requests", + headers={**auth_headers(mentee_token), + "Content-Type": "application/json"}, + json={"mentorId": mentor_id, "message": message}, + timeout=15, + ) + response.raise_for_status() + return response.json() + + +def accept_mentorship_request(mentor_token: str, *, request_id: int, + duration: int) -> dict: + """duration must be one of {1, 3, 6} — enforced by backend.""" + response = requests.put( + f"{API_BASE}/mentorship-requests/{request_id}/accept", + headers={**auth_headers(mentor_token), + "Content-Type": "application/json"}, + json={"duration": duration}, + timeout=15, + ) + response.raise_for_status() + return response.json() + + +def health_check() -> bool: + try: + response = requests.get(f"{API_BASE.replace('/api', '')}/actuator/health", + timeout=5) + return response.status_code == 200 and response.json().get("status") == "UP" + except (requests.RequestException, ValueError): + return False + + +__all__ = [ + "API_BASE", + "TOKEN_CACHE_PATH", + "TokenCache", + "login", + "auth_headers", + "upload_profile_photo", + "upload_attachment", + "create_mentorship_request", + "accept_mentorship_request", + "health_check", +] diff --git a/scripts/seed_demo_locations.py b/scripts/seed_demo_locations.py new file mode 100644 index 00000000..fe47d7c8 --- /dev/null +++ b/scripts/seed_demo_locations.py @@ -0,0 +1,96 @@ +"""City -> (lat, lon) map for seed users. Applied after Phase A so the +mentor location signal can emit `nearby:Xkm` factors instead of `location-unset`. +""" +from __future__ import annotations + +CITY_COORDS: dict[str, tuple[float, float]] = { + # Istanbul districts + "Kadikoy, Istanbul": (40.9905, 29.0303), + "Sisli, Istanbul": (41.0602, 28.9871), + "Besiktas, Istanbul": (41.0428, 29.0061), + "Uskudar, Istanbul": (41.0226, 29.0156), + "Bakirkoy, Istanbul": (40.9776, 28.8770), + "Maltepe, Istanbul": (40.9354, 29.1297), + "Beyoglu, Istanbul": (41.0369, 28.9774), + "Atasehir, Istanbul": (40.9846, 29.1276), + "Sariyer, Istanbul": (41.1714, 29.0568), + "Pendik, Istanbul": (40.8782, 29.2536), + "Umraniye, Istanbul": (41.0264, 29.1226), + "Kartal, Istanbul": (40.9056, 29.1908), + "Esenyurt, Istanbul": (41.0345, 28.6800), + "Avcilar, Istanbul": (40.9789, 28.7209), + "Beylikduzu, Istanbul":(40.9938, 28.6411), + "Cihangir, Istanbul": (41.0322, 28.9817), + # Ankara + "Cankaya, Ankara": (39.9111, 32.8526), + "Kecioren, Ankara": (39.9803, 32.8540), + "Yenimahalle, Ankara": (39.9686, 32.7882), + "Etimesgut, Ankara": (39.9650, 32.6900), + "Mamak, Ankara": (39.9325, 32.9180), + # Izmir + "Konak, Izmir": (38.4189, 27.1287), + "Karsiyaka, Izmir": (38.4598, 27.1099), + "Bornova, Izmir": (38.4690, 27.2200), + "Buca, Izmir": (38.3911, 27.1797), + # Bursa + "Nilufer, Bursa": (40.2143, 28.9593), + "Osmangazi, Bursa": (40.1828, 29.0660), + # Antalya + "Muratpasa, Antalya": (36.8849, 30.7136), + "Kepez, Antalya": (36.9221, 30.6899), + # Aegean + "Manisa": (38.6191, 27.4289), + "Aydin": (37.8466, 27.8456), + "Denizli": (37.7765, 29.0864), + # Mediterranean + "Adana": (37.0000, 35.3213), + "Mersin": (36.8121, 34.6415), + "Hatay": (36.2023, 36.1613), + # Marmara + "Kocaeli": (40.8533, 29.8815), + "Sakarya": (40.7831, 30.4036), + "Tekirdag": (40.9833, 27.5167), + # Black Sea + "Trabzon": (41.0027, 39.7168), + "Samsun": (41.2867, 36.3300), + "Ordu": (40.9839, 37.8764), + # Central Anatolia + "Konya": (37.8746, 32.4932), + "Kayseri": (38.7330, 35.4853), + "Eskisehir": (39.7767, 30.5206), + # Southeast + "Gaziantep": (37.0660, 37.3833), + "Diyarbakir": (37.9144, 40.2306), + # East + "Erzurum": (39.9043, 41.2670), + "Van": (38.4942, 43.4090), + # College towns + "Edirne": (41.6764, 26.5557), + "Canakkale": (40.1467, 26.4086), +} + + +def apply_coordinates(cur) -> int: + """Update lat/lon for every seed user based on their city string. + + Idempotent — re-runs are no-ops for already-matching rows. + Returns the number of rows updated. + """ + cur.execute( + "SELECT id, city FROM users " + "WHERE email LIKE %s OR email LIKE %s", + ("%@seed.test", "%@seed.local"), + ) + rows = cur.fetchall() + n = 0 + for uid, city in rows: + coords = CITY_COORDS.get(city) + if not coords: + continue + lat, lon = coords + cur.execute( + "UPDATE users SET latitude=%s, longitude=%s WHERE id=%s", + (lat, lon, uid), + ) + n += 1 + return n diff --git a/scripts/seed_demo_photos.py b/scripts/seed_demo_photos.py new file mode 100644 index 00000000..9693e3a0 --- /dev/null +++ b/scripts/seed_demo_photos.py @@ -0,0 +1,97 @@ +"""Profile photo fetcher for the MyMentorNet demo dataset seed pipeline. + +Primary source: https://thispersondoesnotexist.com — returns a fresh +1024×1024 AI-generated JPEG face per request (uniform gender; we accept +this as a known limitation). + +Throttles 1.5s/request to stay polite, retries on 503 with exponential +backoff, and falls back to the pre-vendored pool in +`claude_files/seed/photo_pool/*.jpg` if the network source becomes +unavailable. +""" + +from __future__ import annotations + +import random +import time +from pathlib import Path +from typing import Optional + +import requests + + +REPO_ROOT = Path(__file__).resolve().parent.parent +PHOTO_POOL_DIR = REPO_ROOT / "claude_files" / "seed" / "photo_pool" +TPDNE_URL = "https://thispersondoesnotexist.com" +TPDNE_HEADERS = { + "User-Agent": "Mozilla/5.0 (seed-demo-dataset; +https://mymentornet.org)", + "Accept": "image/jpeg,image/*;q=0.9,*/*;q=0.5", +} +THROTTLE_SECONDS = 1.5 +MAX_RETRIES = 3 + + +def fetch_from_thispersondoesnotexist(output_path: Path, + timeout: int = 15) -> bool: + """Download one face JPEG to output_path. Returns True on success.""" + backoff = 2.0 + for attempt in range(1, MAX_RETRIES + 1): + try: + response = requests.get(TPDNE_URL, headers=TPDNE_HEADERS, + timeout=timeout) + if response.status_code == 200 and len(response.content) > 1000: + output_path.write_bytes(response.content) + return True + print(f" tpdne status={response.status_code} " + f"len={len(response.content)} attempt={attempt}") + except requests.RequestException as exc: + print(f" tpdne error attempt={attempt}: {exc}") + if attempt < MAX_RETRIES: + time.sleep(backoff) + backoff *= 2 + return False + + +def fetch_from_pool(output_path: Path, rng: random.Random) -> bool: + """Copy a random JPEG from the vendored pool. Returns True if pool non-empty.""" + if not PHOTO_POOL_DIR.exists(): + return False + candidates = list(PHOTO_POOL_DIR.glob("*.jpg")) + \ + list(PHOTO_POOL_DIR.glob("*.jpeg")) + \ + list(PHOTO_POOL_DIR.glob("*.png")) + if not candidates: + return False + chosen = rng.choice(candidates) + output_path.write_bytes(chosen.read_bytes()) + return True + + +def fetch_profile_photo(output_path: Path, + rng: Optional[random.Random] = None, + prefer_pool: bool = False) -> Optional[str]: + """Try TPDNE first (or pool first if prefer_pool), fall back the other way. + + Returns the source name ('thispersondoesnotexist' | 'pool') on success, + None on total failure. + """ + rng = rng or random.Random() + if prefer_pool and fetch_from_pool(output_path, rng): + return "pool" + + if fetch_from_thispersondoesnotexist(output_path): + time.sleep(THROTTLE_SECONDS) + return "thispersondoesnotexist" + + if not prefer_pool and fetch_from_pool(output_path, rng): + return "pool" + + return None + + +__all__ = [ + "PHOTO_POOL_DIR", + "THROTTLE_SECONDS", + "fetch_from_thispersondoesnotexist", + "fetch_from_pool", + "fetch_profile_photo", +] diff --git a/scripts/seed_demo_random.py b/scripts/seed_demo_random.py new file mode 100644 index 00000000..7e146ede --- /dev/null +++ b/scripts/seed_demo_random.py @@ -0,0 +1,181 @@ +"""Seeded RNG helpers for the MyMentorNet demo dataset seed pipeline. + +All probability decisions in the seed flow run through the named random.Random +instances exposed here. Each phase pulls from its own sub-RNG so a re-run with +the same MASTER_SEED reproduces the same demographics, follow graph, post +counts, and like sample without coupling across phases. +""" + +from __future__ import annotations + +import math +import random +from datetime import datetime, timedelta, timezone +from typing import Iterable, Sequence, TypeVar + +MASTER_SEED = 20260513 + +rng_demographics = random.Random(MASTER_SEED + 1) +rng_follows = random.Random(MASTER_SEED + 2) +rng_posts = random.Random(MASTER_SEED + 3) +rng_mentorship = random.Random(MASTER_SEED + 4) +rng_likes = random.Random(MASTER_SEED + 5) +rng_comments = random.Random(MASTER_SEED + 6) +rng_meta = random.Random(MASTER_SEED + 7) + + +POST_COUNT_WEIGHTS: dict[int, float] = { + 1: 0.10, + 2: 0.20, + 3: 0.20, + 4: 0.15, + 5: 0.10, + 6: 0.08, + 7: 0.06, + 8: 0.04, + 9: 0.04, + 10: 0.03, +} +_POST_COUNT_KEYS = list(POST_COUNT_WEIGHTS.keys()) +_POST_COUNT_VALUES = list(POST_COUNT_WEIGHTS.values()) + +PROB_POST_HAS_IMAGE = 0.10 +PROB_PROFILE_PHOTO = 0.50 +PROB_FOLLOW_MENTEE = 0.05 +PROB_FOLLOW_MENTOR = 0.10 +PROB_AVAILABILITY_DAY = 0.20 +PROB_PAST_MENTORSHIP = 0.05 +PROB_MENTOR_PAIR_CONVO = 0.125 +PROB_CAPACITY_SLOT = 0.50 +PROB_COMMENT_PER_FOLLOWER = 0.10 + +ALLOWED_DURATIONS = (1, 3, 6) +MAX_ATTACHMENTS_PER_POST = 4 + +TODAY = datetime(2026, 5, 13, tzinfo=timezone.utc) + +T = TypeVar("T") + + +def bernoulli(rng: random.Random, p: float) -> bool: + return rng.random() < p + + +def post_count(rng: random.Random = rng_demographics) -> int: + """Bell-curve sample from POST_COUNT_WEIGHTS (1..10).""" + return rng.choices(_POST_COUNT_KEYS, weights=_POST_COUNT_VALUES, k=1)[0] + + +def mentor_capacity(rng: random.Random = rng_demographics) -> int: + return rng.randint(1, 4) + + +def mentorship_duration(rng: random.Random = rng_mentorship) -> int: + return rng.choice(ALLOWED_DURATIONS) + + +def active_start_offset_days(duration_months: int, rng: random.Random = rng_mentorship) -> int: + """Pick a negative offset so today sits inside (start_date, end_date).""" + max_offset = duration_months * 30 - 1 + return -rng.randint(1, max_offset) + + +def past_mentorship_start_date(rng: random.Random = rng_mentorship) -> datetime: + """Uniform between 2025-01-01 and 2026-03-01.""" + start = datetime(2025, 1, 1, tzinfo=timezone.utc) + end = datetime(2026, 3, 1, tzinfo=timezone.utc) + delta = (end - start).days + return start + timedelta(days=rng.randint(0, delta)) + + +def post_created_at(rng: random.Random = rng_posts) -> datetime: + """Lognormal sample over the last 90 days, recent-biased. + + mu=ln(15), sigma=0.6 puts the mode around day 5-7 ago; clamp to [0, 90]. + """ + days_ago = rng.lognormvariate(math.log(15), 0.6) + days_ago = max(0.0, min(90.0, days_ago)) + return TODAY - timedelta(days=days_ago) + + +def normal_clamped(rng: random.Random, mu: float, sigma: float, + lower: float = 0.0, upper: float | None = None) -> int: + """Normal draw, clamp to [lower, upper], return int.""" + value = rng.gauss(mu, sigma) + if value < lower: + value = lower + if upper is not None and value > upper: + value = upper + return int(round(value)) + + +def post_like_count(follower_count: int, rng: random.Random = rng_likes) -> int: + if follower_count == 0: + return 0 + return normal_clamped(rng, mu=follower_count * 0.6, sigma=follower_count * 0.2, + lower=0, upper=follower_count) + + +def comment_like_count(commenter_count: int, max_users: int, + rng: random.Random = rng_likes) -> int: + if commenter_count == 0: + return normal_clamped(rng, mu=0.0, sigma=1.5, lower=0, upper=max_users) + return normal_clamped(rng, mu=float(commenter_count), sigma=2.0, + lower=0, upper=max_users) + + +def availability_days(rng: random.Random = rng_demographics) -> list[str]: + """Return list of weekday names where Bernoulli(0.20) fired.""" + week = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", + "SATURDAY", "SUNDAY"] + return [d for d in week if bernoulli(rng, PROB_AVAILABILITY_DAY)] + + +def sample(rng: random.Random, population: Sequence[T], k: int) -> list[T]: + """Sample without replacement, k items from population.""" + if k <= 0: + return [] + return rng.sample(population, min(k, len(population))) + + +def shuffled(rng: random.Random, items: Iterable[T]) -> list[T]: + arr = list(items) + rng.shuffle(arr) + return arr + + +__all__ = [ + "MASTER_SEED", + "TODAY", + "ALLOWED_DURATIONS", + "MAX_ATTACHMENTS_PER_POST", + "PROB_POST_HAS_IMAGE", + "PROB_PROFILE_PHOTO", + "PROB_FOLLOW_MENTEE", + "PROB_FOLLOW_MENTOR", + "PROB_AVAILABILITY_DAY", + "PROB_PAST_MENTORSHIP", + "PROB_MENTOR_PAIR_CONVO", + "PROB_CAPACITY_SLOT", + "PROB_COMMENT_PER_FOLLOWER", + "rng_demographics", + "rng_follows", + "rng_posts", + "rng_mentorship", + "rng_likes", + "rng_comments", + "rng_meta", + "bernoulli", + "post_count", + "mentor_capacity", + "mentorship_duration", + "active_start_offset_days", + "past_mentorship_start_date", + "post_created_at", + "normal_clamped", + "post_like_count", + "comment_like_count", + "availability_days", + "sample", + "shuffled", +] diff --git a/scripts/seed_demo_roster_gen.py b/scripts/seed_demo_roster_gen.py new file mode 100644 index 00000000..658e34b3 --- /dev/null +++ b/scripts/seed_demo_roster_gen.py @@ -0,0 +1,362 @@ +#!/usr/bin/env python3 +"""Generate `claude_files/seed/roster.yaml` for the demo seed pipeline. + +One-shot deterministic generator: gender-tagged Turkish names, +random 1st interest from `seed_data` interest sets, manually-curated +2nd / 3rd interests (drawn from a related-interest map below), city +from `seed_data.LOCATIONS`, mentor capacity uniform[1..4], availability +days, profile-photo flag, and post-count bell-curve roll. + +Run once before authoring the markdown corpus: + python scripts/seed_demo_roster_gen.py + +Re-running overwrites `claude_files/seed/roster.yaml` deterministically +(same MASTER_SEED ⇒ same roster). +""" + +from __future__ import annotations + +import random +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(REPO_ROOT / "scripts")) + +import seed_demo_random as R +from seed_data import ( + MENTEE_INTEREST_SETS, + MENTOR_INTEREST_SETS, +) + + +# Curated locations across Turkey (deliberately spread, not Istanbul-heavy). +# Weight roughly mirrors population but trimmed so demos don't feel +# concentrated. ~50% Istanbul districts, ~50% spread across Anatolia / Aegean +# / Mediterranean / Black Sea / Marmara. +LOCATIONS = [ + # Istanbul districts (15) + "Kadikoy, Istanbul", "Sisli, Istanbul", "Besiktas, Istanbul", + "Uskudar, Istanbul", "Bakirkoy, Istanbul", "Maltepe, Istanbul", + "Beyoglu, Istanbul", "Atasehir, Istanbul", "Sariyer, Istanbul", + "Pendik, Istanbul", "Umraniye, Istanbul", "Kartal, Istanbul", + "Esenyurt, Istanbul", "Avcilar, Istanbul", "Beylikduzu, Istanbul", + # Ankara (5) + "Cankaya, Ankara", "Kecioren, Ankara", "Yenimahalle, Ankara", + "Etimesgut, Ankara", "Mamak, Ankara", + # Izmir (4) + "Konak, Izmir", "Karsiyaka, Izmir", "Bornova, Izmir", "Buca, Izmir", + # Bursa (2) + "Nilufer, Bursa", "Osmangazi, Bursa", + # Antalya (2) + "Muratpasa, Antalya", "Kepez, Antalya", + # Aegean (3) + "Manisa", "Aydin", "Denizli", + # Mediterranean (3) + "Adana", "Mersin", "Hatay", + # Marmara (3) + "Kocaeli", "Sakarya", "Tekirdag", + # Black Sea (3) + "Trabzon", "Samsun", "Ordu", + # Central Anatolia (3) + "Konya", "Kayseri", "Eskisehir", + # Southeast (2) + "Gaziantep", "Diyarbakir", + # East (2) + "Erzurum", "Van", + # College towns (2) + "Edirne", "Canakkale", +] + +OUTPUT_PATH = REPO_ROOT / "claude_files" / "seed" / "roster.yaml" +NUM_MENTORS = 12 +NUM_MENTEES = 48 + + +# ── gendered Turkish name pool (manually curated) ────────────────────────── + +FIRST_NAMES_MALE = [ + "Ahmet", "Ali", "Alper", "Arda", "Aras", "Atilla", "Aydin", "Aytac", + "Baran", "Baris", "Berat", "Berke", "Bora", "Burak", "Burhan", "Can", + "Caner", "Cem", "Cihan", "Cinar", "Dogan", "Egemen", "Emir", "Emre", + "Eren", "Erkan", "Ersin", "Ertan", "Fikret", "Furkan", "Gokhan", "Hakan", + "Hakki", "Halil", "Halis", "Haluk", "Hasan", "Huseyin", "Ibrahim", "Ilker", + "Ismail", "Kaan", "Kemal", "Kerem", "Korhan", "Kubilay", "Levent", "Lutfi", + "Mahmut", "Mehmet", "Mert", "Metin", "Mustafa", "Murat", "Nihat", "Oguz", + "Okan", "Onur", "Orhan", "Osman", "Polat", "Ramazan", "Recep", "Riza", + "Sadik", "Selim", "Selcuk", "Serdar", "Serkan", "Sinan", "Suleyman", "Tarik", + "Tayfun", "Taylan", "Tolga", "Tunc", "Ufuk", "Umut", "Volkan", "Yagiz", + "Yusuf", "Zafer", +] + +FIRST_NAMES_FEMALE = [ + "Asli", "Asuman", "Aybike", "Ayca", "Ayse", "Aysu", "Banu", "Basak", + "Begum", "Berna", "Berrin", "Beste", "Bilge", "Buse", "Burcu", "Canan", + "Cansu", "Ceren", "Cigdem", "Damla", "Defne", "Derya", "Didem", "Dilara", + "Duygu", "Ece", "Ela", "Elif", "Elvan", "Emine", "Eren", "Esra", + "Esma", "Ezgi", "Fatma", "Feride", "Filiz", "Funda", "Gamze", "Gizem", + "Gokce", "Gonca", "Gul", "Gulay", "Gulsah", "Hale", "Hande", "Hatice", + "Hilal", "Ipek", "Irem", "Jale", "Kader", "Kubra", "Lale", "Leyla", + "Mehtap", "Melda", "Melek", "Melike", "Melis", "Melisa", "Merve", "Meryem", + "Mina", "Naz", "Nazli", "Neslihan", "Nesrin", "Nil", "Nur", "Nuray", + "Oya", "Ozge", "Pelin", "Pinar", "Reyhan", "Sabiha", "Selin", "Seda", + "Sema", "Sevgi", "Sevim", "Sezen", "Simge", "Songul", "Sude", "Sule", + "Tugce", "Tulay", "Umran", "Yagmur", "Yasemin", "Zehra", "Zerrin", "Zeynep", +] + + +LAST_NAMES = [ + "Acar", "Akdeniz", "Aksoy", "Aksu", "Akyol", "Altinok", "Aral", "Arikan", + "Arslan", "Asik", "Aslan", "Aslanli", "Atalay", "Atay", "Aydin", "Aykac", + "Bakir", "Balci", "Basaran", "Bayar", "Bayer", "Bayraktar", "Bicakci", + "Bilgin", "Bozkurt", "Caglar", "Cakir", "Can", "Cetin", "Cevik", "Cinar", + "Colak", "Demir", "Demirci", "Demiroz", "Dilek", "Dinc", "Dogan", "Durak", + "Eken", "Ekinci", "Elmas", "Erdem", "Eren", "Ergin", "Ergun", "Erkmen", + "Ersoy", "Genc", "Gok", "Gulhan", "Gultekin", "Gunes", "Guney", "Gungor", + "Hekim", "Inan", "Ipekci", "Isik", "Kahraman", "Kaplan", "Kara", "Karaca", + "Karagoz", "Kavak", "Kaya", "Kayan", "Kilic", "Kilicoglu", "Kiraz", "Koc", + "Korkmaz", "Kurt", "Mert", "Mutlu", "Nalbant", "Onal", "Onder", "Oz", + "Ozcan", "Ozdemir", "Ozkan", "Ozturk", "Pak", "Polat", "Sahin", "Sari", + "Sezen", "Sezer", "Sonmez", "Soylu", "Subasi", "Surmeli", "Tan", "Tasdemir", + "Tekin", "Toprak", "Tuncer", "Turan", "Tufekci", "Ural", "Uysal", "Yalcin", + "Yaman", "Yavuz", "Yenidogan", "Yildiz", "Yilmaz", +] + + +# ── related-interest map (curated; "kendin seç" choices from seed_data clusters) ─ + +# For each cluster the 3 items are intra-related; we additionally hand-pick +# 2 "neighbour" clusters so the 3rd interest can come from an adjacent +# domain when the 20% roll fires. + +MENTOR_NEIGHBOURS = { + 0: [1, 21], # Frontend Architecture → Backend Eng, Technical Writing + 1: [0, 9], # Backend Engineering → Frontend, Cloud Arch + 2: [17, 27], # Machine Learning → MLOps, AI Governance + 3: [28, 29], # Digital Marketing → Customer Success, Sales Eng + 4: [10, 12], # Career Dev → Eng Mgmt, Career Transition + 5: [0, 21], # UI/UX Strategy → Frontend, Tech Writing + 6: [0, 1], # iOS Eng → Frontend, Backend + 7: [11, 19], # Entrepreneurship → Angel Investing, Startup Founding + 8: [4, 10], # Research Leadership → Career Dev, Eng Mgmt + 9: [1, 18], # Cloud Architecture → Backend, Platform Eng + 10: [4, 16], # Eng Mgmt → Career Dev, Agile Leadership + 11: [7, 19], # Angel Investing → Entrepreneurship, Startup Founding + 12: [4, 30], # Career Transition → Career Dev, Inclusive Hiring + 13: [11, 7], # Retirement → Angel Investing, Entrepreneurship + 14: [9, 1], # Security Arch → Cloud Arch, Backend + 15: [2, 17], # Data Platform → ML, MLOps + 16: [10, 21], # Agile Leadership → Eng Mgmt, Tech Writing + 17: [2, 15], # MLOps → ML, Data Platform + 18: [9, 14], # Platform Eng → Cloud Arch, Security + 19: [7, 11], # Startup Founding → Entrepreneurship, Angel Invest + 20: [21, 5], # Tech Writing → was mis-numbered; cap at 20 + 21: [0, 20], # Tech Writing → Frontend, Open Source + 22: [4, 30], # Open Source → Career Dev, Inclusive Hiring + 23: [22, 7], # FinTech → Open Source, Entrepreneurship + 24: [22, 7], # HealthTech → Open Source, Entrepreneurship + 25: [22, 7], # EdTech → Open Source, Entrepreneurship + 26: [22, 5], # Game Industry → Open Source, UI/UX + 27: [2, 17], # Embedded Sys → ML, MLOps + 28: [29, 3], # AI Gov → Sales Eng, Marketing + 29: [3, 4], # Customer Success → Marketing, Career Dev + 30: [28, 4], # Mentoring First-Gen → AI Gov, Career Dev +} + + +MENTEE_NEIGHBOURS = { + 0: [4, 17], # Frontend Dev → Bootcamp Grad, Cloud Eng + 1: [4, 16], # Backend Dev → Bootcamp Grad, Data Eng + 2: [15, 23], # ML → Data Eng, Computer Vision + 3: [21, 24], # Digital Marketing → Tech Blogging, FinTech + 4: [9, 19], # Career Switch → Product Mgmt, Public Speaking + 5: [0, 28], # UI/UX → Frontend, Digital Product Thinking + 6: [0, 17], # iOS → Frontend, Mobile App + 7: [10, 14], # Entrepreneurship → Cybersec, QA + 8: [4, 19], # Research → Career Switch, Public Speaking + 9: [4, 19], # Product Mgmt → Career Switch, Public Speaking + 10: [1, 13], # Cybersec → Backend, DevOps + 11: [5, 25], # Game Dev → UI/UX, Game Design + 12: [1, 16], # Blockchain → Backend, Data Eng + 13: [1, 16], # DevOps → Backend, Cloud Eng + 14: [10, 1], # QA → Cybersec, Backend + 15: [2, 16], # Data Eng → ML, Cloud Eng + 16: [13, 15], # Cloud Eng → DevOps, Data Eng + 17: [0, 6], # Mobile App → Frontend, iOS + 18: [22, 30], # Algorithms → ML Ops, Bootcamp Grad + 19: [20, 4], # Public Speaking → Time Mgmt, Career Switch + 20: [19, 4], # Time Mgmt → Public Speaking, Career Switch + 21: [3, 19], # English Writing → Marketing, Public Speaking + 22: [2, 16], # ML Ops → ML, Cloud Eng + 23: [2, 22], # Computer Vision → ML, MLOps + 24: [3, 25], # Full Stack → Marketing, Mobile App + 25: [11, 26], # FinTech → Game Dev, Game Design + 26: [11, 5], # Game Design → Game Dev, UI/UX + 27: [2, 22], # AI Ethics → ML, MLOps + 28: [9, 5], # Digital Product Thinking → Product Mgmt, UI/UX + 29: [8, 19], # Study Abroad → Research, Public Speaking + 30: [4, 0], # Bootcamp Grad → Career Switch, Frontend +} + + +def flat_skills(cluster_sets: list[list[str]]) -> list[tuple[int, str]]: + """Flatten (cluster_index, skill_label) for uniform 1st-interest pick.""" + return [(i, s) for i, cluster in enumerate(cluster_sets) for s in cluster] + + +def pick_related_interests(role: str, primary_cluster: int, + primary_skill: str, + rng_2nd: random.Random, + rng_3rd: random.Random) -> list[str]: + """80% chance of 2nd interest (from same cluster); 20% chance of 3rd + (from a neighbour cluster). 2nd is picked from same cluster's other 2 + skills; 3rd is picked from a neighbour cluster's skills.""" + cluster_sets = MENTOR_INTEREST_SETS if role == "MENTOR" else MENTEE_INTEREST_SETS + neighbours = MENTOR_NEIGHBOURS if role == "MENTOR" else MENTEE_NEIGHBOURS + out: list[str] = [primary_skill] + + if rng_2nd.random() < 0.80: + same_cluster = [s for s in cluster_sets[primary_cluster] if s != primary_skill] + if same_cluster: + out.append(rng_2nd.choice(same_cluster)) + + if rng_3rd.random() < 0.20: + nbrs = neighbours.get(primary_cluster, []) + if nbrs: + nbr_cluster_idx = rng_3rd.choice(nbrs) + if 0 <= nbr_cluster_idx < len(cluster_sets): + pool = [s for s in cluster_sets[nbr_cluster_idx] if s not in out] + if pool: + out.append(rng_3rd.choice(pool)) + + return out + + +def cluster_to_field(cluster_index: int, role: str) -> str: + """Map cluster index → a 'field' label suitable for Mentor.field.""" + cluster_sets = MENTOR_INTEREST_SETS if role == "MENTOR" else MENTEE_INTEREST_SETS + return cluster_sets[cluster_index][0] + + +# ── generator ───────────────────────────────────────────────────────────── + +def gen_email(first_name: str, last_name: str, roster_id: int) -> str: + return f"{first_name.lower()}.{last_name.lower()}.{roster_id}@seed.test" + + +def gen_user(roster_id: int, role: str, *, + rng_names: random.Random, + rng_loc: random.Random, + rng_interest_primary: random.Random, + rng_interest_2nd: random.Random, + rng_interest_3rd: random.Random, + rng_dem: random.Random) -> dict: + gender = "male" if rng_names.random() < 0.5 else "female" + pool = FIRST_NAMES_MALE if gender == "male" else FIRST_NAMES_FEMALE + first_name = rng_names.choice(pool) + last_name = rng_names.choice(LAST_NAMES) + city = rng_loc.choice(LOCATIONS) + + cluster_sets = MENTOR_INTEREST_SETS if role == "MENTOR" else MENTEE_INTEREST_SETS + flat = flat_skills(cluster_sets) + cluster_idx, primary_skill = rng_interest_primary.choice(flat) + interests = pick_related_interests( + role, cluster_idx, primary_skill, rng_interest_2nd, rng_interest_3rd, + ) + + has_photo = rng_dem.random() < R.PROB_PROFILE_PHOTO + + user = { + "id": roster_id, + "gender": gender, + "role": role, + "first_name": first_name, + "last_name": last_name, + "email": gen_email(first_name, last_name, roster_id), + "password": "Seed1234!", + "city": city, + "has_photo": has_photo, + "interests": [{"label": skill, "uri": None} for skill in interests], + } + + if role == "MENTOR": + user["field"] = cluster_to_field(cluster_idx, "MENTOR") + user["expertise"] = primary_skill + user["affiliation"] = "" + user["max_capacity"] = rng_dem.randint(1, 4) + user["mentoring_goals"] = "" + user["mentorship_duration"] = rng_dem.choice([1, 3, 6]) + # mentor preferred skills: pull 1-2 from the cluster (same as interests) + user["preferred_mentee_skills"] = [ + {"label": s, "uri": None} for s in interests[:2] + ] + user["availability_days"] = R.availability_days(rng_dem) + # Mentor post count is bell-curve rolled + user["post_count"] = R.post_count(rng_dem) + elif role == "MENTEE": + user["major"] = "" + user["career_interest"] = primary_skill + user["affiliation"] = "" + user["goals"] = "" + user["background_info"] = "" + user["skills"] = [{"label": s, "uri": None} for s in interests] + user["post_count"] = R.post_count(rng_dem) + else: + # ADMIN + user["post_count"] = 0 + + return user + + +def main() -> None: + rng_names = random.Random(R.MASTER_SEED + 200) + rng_loc = random.Random(R.MASTER_SEED + 201) + rng_p = random.Random(R.MASTER_SEED + 202) + rng_2 = random.Random(R.MASTER_SEED + 203) + rng_3 = random.Random(R.MASTER_SEED + 204) + rng_dem = random.Random(R.MASTER_SEED + 205) + + roster: list[dict] = [] + + # Admin (id 1) + roster.append(gen_user( + 1, "ADMIN", + rng_names=rng_names, rng_loc=rng_loc, rng_interest_primary=rng_p, + rng_interest_2nd=rng_2, rng_interest_3rd=rng_3, rng_dem=rng_dem, + )) + # Mentors: ids 2..(NUM_MENTORS+1) + for rid in range(2, 2 + NUM_MENTORS): + roster.append(gen_user( + rid, "MENTOR", + rng_names=rng_names, rng_loc=rng_loc, rng_interest_primary=rng_p, + rng_interest_2nd=rng_2, rng_interest_3rd=rng_3, rng_dem=rng_dem, + )) + # Mentees: ids (NUM_MENTORS+2)..(NUM_MENTORS+NUM_MENTEES+1) + mentee_start = 2 + NUM_MENTORS + for rid in range(mentee_start, mentee_start + NUM_MENTEES): + roster.append(gen_user( + rid, "MENTEE", + rng_names=rng_names, rng_loc=rng_loc, rng_interest_primary=rng_p, + rng_interest_2nd=rng_2, rng_interest_3rd=rng_3, rng_dem=rng_dem, + )) + + OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True) + import yaml + OUTPUT_PATH.write_text( + yaml.safe_dump(roster, sort_keys=False, allow_unicode=True, width=120), + encoding="utf-8", + ) + + n_mentor = sum(1 for u in roster if u["role"] == "MENTOR") + n_mentee = sum(1 for u in roster if u["role"] == "MENTEE") + n_admin = sum(1 for u in roster if u["role"] == "ADMIN") + print(f"Wrote {len(roster)} users to {OUTPUT_PATH}") + print(f" {n_admin} admin, {n_mentor} mentors, {n_mentee} mentees") + photos = sum(1 for u in roster if u.get("has_photo")) + print(f" {photos} users marked has_photo (≈ {photos/len(roster)*100:.0f}%)") + post_total = sum(u.get("post_count", 0) for u in roster) + print(f" total post_count rolled: {post_total}") + + +if __name__ == "__main__": + main() diff --git a/scripts/seed_demo_unsplash.py b/scripts/seed_demo_unsplash.py new file mode 100644 index 00000000..c06a792b --- /dev/null +++ b/scripts/seed_demo_unsplash.py @@ -0,0 +1,101 @@ +"""Unsplash API client for post-image lookup in the demo seed pipeline. + +Reads UNSPLASH_ACCESS_KEY from environment (loaded via python-dotenv from +.env.seed in the orchestrator). Searches /photos/random with a free-text +query derived from each post's markdown `image_topic`. Honours Unsplash's +50 requests/hour free-tier cap by default; pass `respect_rate_limit=False` +to burn through it quickly. +""" + +from __future__ import annotations + +import os +import time +from pathlib import Path +from typing import Optional + +import requests + + +UNSPLASH_BASE = "https://api.unsplash.com" +DEFAULT_QPS_SLEEP = 75.0 # 3600s / 50 req = 72s; round up to 75 for safety. +BURST_SLEEP = 0.5 + + +class UnsplashClient: + def __init__(self, access_key: Optional[str] = None, + respect_rate_limit: bool = True) -> None: + self.access_key = access_key or os.environ.get("UNSPLASH_ACCESS_KEY") + if not self.access_key: + raise RuntimeError("UNSPLASH_ACCESS_KEY not set") + self.respect_rate_limit = respect_rate_limit + self.requests_made = 0 + self.last_request_at = 0.0 + + @property + def is_configured(self) -> bool: + return bool(self.access_key) + + def _wait(self) -> None: + if self.respect_rate_limit: + elapsed = time.monotonic() - self.last_request_at + target = DEFAULT_QPS_SLEEP + if elapsed < target: + time.sleep(target - elapsed) + else: + time.sleep(BURST_SLEEP) + + def random_photo(self, query: str, + orientation: str = "landscape") -> Optional[dict]: + """Return the JSON payload of a random photo for the given query.""" + self._wait() + response = requests.get( + f"{UNSPLASH_BASE}/photos/random", + headers={ + "Authorization": f"Client-ID {self.access_key}", + "Accept-Version": "v1", + }, + params={"query": query, "orientation": orientation, "content_filter": "high"}, + timeout=20, + ) + self.last_request_at = time.monotonic() + self.requests_made += 1 + + if response.status_code == 403: + print(f" unsplash 403 (rate-limited or invalid key); aborting.") + return None + if response.status_code == 404: + return None + response.raise_for_status() + return response.json() + + def download_image(self, photo_payload: dict, output_path: Path, + size: str = "regular") -> bool: + """Download the chosen size; trigger the Unsplash download endpoint as required by ToS.""" + urls = photo_payload.get("urls", {}) + download_url = urls.get(size) or urls.get("regular") or urls.get("small") + if not download_url: + return False + + # Mark download per Unsplash API guidelines + download_endpoint = photo_payload.get("links", {}).get("download_location") + if download_endpoint: + try: + requests.get(download_endpoint, + headers={"Authorization": f"Client-ID {self.access_key}"}, + timeout=10) + except requests.RequestException: + pass + + response = requests.get(download_url, timeout=30) + if response.status_code != 200: + return False + output_path.write_bytes(response.content) + return True + + +__all__ = [ + "UnsplashClient", + "UNSPLASH_BASE", + "DEFAULT_QPS_SLEEP", +] diff --git a/scripts/seed_snapshot.py b/scripts/seed_snapshot.py new file mode 100644 index 00000000..e4cce91b --- /dev/null +++ b/scripts/seed_snapshot.py @@ -0,0 +1,480 @@ +#!/usr/bin/env python3 +"""Capture the current MyMentorNet seed DB state into a portable snapshot +and replay it on a fresh database — without using the backend HTTP API. + +Use cases: +- Branch off the current hand-crafted demo state and replay it on CI, + fresh dev machines, or after a `docker compose down -v`. +- Avoid burning Unsplash quota / OpenAI tokens / mentorship-accept + HTTP roundtrips every time we wipe the DB. + +Mechanics: +- `--dump

` reads every seed-related row out of Postgres (rows + whose users.email matches `%@seed.test` or `%@seed.local`, plus all + rows that descend from them via FK chains) and writes them as CSV + files in FK order. It also copies the backend's `/app/uploads/` + directory tree (profile photos + post / task attachments) and + captures the current value of every relevant id sequence so future + inserts don't collide. +- `--load ` truncates the same set of seed rows from the target + DB, then COPYs the CSVs back in, restores the upload files into the + backend container, and bumps the sequences. + +The script is self-contained: it talks only to the local Postgres +(via psycopg) and to the backend container (via `docker cp` / `docker +exec` for the upload tree). It never touches HTTP, OpenAI, Unsplash, +thispersondoesnotexist, or any other external service. + +Usage: + python scripts/seed_snapshot.py --dump scripts/seed_snapshot_data/ + # ... later, on a fresh DB: + python scripts/seed_snapshot.py --load scripts/seed_snapshot_data/ + +Both modes default to `bounswe2026group7-backend-1` for the backend +container name; override with `--container ` if your compose +prefix differs. + +Backend env requirements for the loaded state to work end-to-end: +- `APP_RATELIMIT_ENABLED=false` (so the loaded users can sign in + without tripping rate limits) +- `APP_EMAIL_ENABLED=false` (so the verification flow stays no-op) +- The localhost photo URLs in `users.profile_photo` rely on the + same Vite proxy / mobile-side host-swap behaviour the original + seed used; nothing extra is required. +""" + +from __future__ import annotations + +import argparse +import io +import json +import os +import shutil +import subprocess +import sys +import tarfile +import tempfile +from datetime import datetime, timezone +from pathlib import Path +from typing import Iterable, Optional + +try: + import psycopg +except ImportError as exc: # pragma: no cover + print("psycopg not installed — run: pip install -r scripts/requirements-seed.txt", + file=sys.stderr) + raise + + +# ── configuration ────────────────────────────────────────────────────────── + +SEED_DOMAINS = ("seed.test", "seed.local") + +# DSN default: prefer env-driven (so the same script works on the host AND +# inside the compose `seed` service which sets POSTGRES_HOST=db), fall back +# to docker-compose's host-side port mapping. +def _default_dsn() -> str: + if "DATABASE_URL" in os.environ: + return os.environ["DATABASE_URL"] + user = os.environ.get("POSTGRES_USER", "group7") + password = os.environ.get("POSTGRES_PASSWORD", "group7pass") + db = os.environ.get("POSTGRES_DB", "group7db") + host = os.environ.get("POSTGRES_HOST", "localhost") + port = os.environ.get("POSTGRES_PORT") or os.environ.get("DB_PORT") or ( + "5432" if host != "localhost" else "5433" + ) + return f"postgresql://{user}:{password}@{host}:{port}/{db}" + + +DEFAULT_BACKEND_CONTAINER = "bounswe2026group7-backend-1" +BACKEND_UPLOADS_PATH = "/app/uploads" + +# Tables to dump, in strict FK-satisfying order. Each entry pairs the +# table name with the WHERE clause that filters to seed-owned rows. +# The clauses are written so they can be evaluated independently of +# load order (we never JOIN forward to tables that don't exist yet +# during load — we reference users/mentors/mentees/posts/etc which +# are loaded earlier in the chain). +TABLES: list[tuple[str, str]] = [ + ("users", + "email LIKE '%@seed.test' OR email LIKE '%@seed.local'"), + ("admins", + "id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentors", + "id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentees", + "id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentor_interests", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentor_preferred_mentee_skills", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentee_interests", + "mentee_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentee_skills", + "mentee_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentor_availability_slots", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("follows", + "follower_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("attachments", + "uploader_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("feed_posts", + "author_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("feed_post_hashtags", + "post_id IN (SELECT id FROM feed_posts WHERE author_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("feed_post_attachments", + "post_id IN (SELECT id FROM feed_posts WHERE author_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("feed_post_comments", + "post_id IN (SELECT id FROM feed_posts WHERE author_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("feed_post_likes", + "post_id IN (SELECT id FROM feed_posts WHERE author_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("feed_post_comment_likes", + "comment_id IN (SELECT c.id FROM feed_post_comments c " + "JOIN feed_posts p ON p.id = c.post_id " + "WHERE p.author_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("mentorship_requests", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("mentorships", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), + ("conversations", + "(mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')))" + " OR (pair_a_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("conversation_participants", + "conversation_id IN (SELECT id FROM conversations WHERE " + "(mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')))" + " OR (pair_a_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')))"), + ("messages", + "conversation_id IN (SELECT id FROM conversations WHERE " + "(mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')))" + " OR (pair_a_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')))"), + ("tasks", + "mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("task_assignment_attachments", + "task_id IN (SELECT t.id FROM tasks t JOIN mentorships m ON m.id = t.mentorship_id " + "WHERE m.mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("milestones", + "mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("meetings", + "mentorship_id IN (SELECT id FROM mentorships WHERE mentor_id IN " + "(SELECT id FROM users WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local'))"), + ("mentor_ratings", + "mentor_id IN (SELECT id FROM users " + "WHERE email LIKE '%@seed.test' OR email LIKE '%@seed.local')"), +] + +# Tables whose id-sequence we want to bump after load. The bare-id +# sequence name follows the `_id_seq` convention; psycopg +# applies setval to the right object name via pg_get_serial_sequence. +ID_SEQ_TABLES = [ + "users", "feed_posts", "feed_post_comments", + "mentorship_requests", "mentorships", "tasks", "milestones", + "meetings", "mentor_ratings", "conversations", "messages", + "mentor_availability_slots", +] +# (attachments uses a UUID PK with no serial sequence — excluded.) + + +# ── helpers ──────────────────────────────────────────────────────────────── + +def _truncate_order() -> list[str]: + """Reverse of insert order, used to TRUNCATE during --load. Children + first so we never violate FKs while wiping.""" + return list(reversed([t for t, _ in TABLES])) + + +def _connect(dsn: str) -> psycopg.Connection: + return psycopg.connect(dsn) + + +def _count_rows(cur, table: str, where: str) -> int: + cur.execute(f"SELECT count(*) FROM {table} WHERE {where}") + return cur.fetchone()[0] + + +def _capture_table_csv(cur, table: str, where: str, out_path: Path) -> int: + """Run COPY ... TO STDOUT into a local CSV file. Returns row count.""" + with out_path.open("wb") as fh: + copy_sql = ( + f"COPY (SELECT * FROM {table} WHERE {where}) " + "TO STDOUT WITH (FORMAT csv, HEADER true)" + ) + with cur.copy(copy_sql) as copy: + for chunk in copy: + fh.write(chunk) + return _count_rows(cur, table, where) + + +def _capture_sequences(cur, tables: Iterable[str]) -> dict[str, int]: + out: dict[str, int] = {} + for t in tables: + cur.execute( + "SELECT COALESCE((SELECT last_value FROM " + f" pg_sequences WHERE schemaname = current_schema() " + f" AND sequencename = pg_get_serial_sequence(%s, 'id')::regclass::text " + "), 0)", + (t,), + ) + # The above is over-engineered for portability; fall back to a + # simpler MAX(id) which is what we actually need to bump to. + cur.execute(f"SELECT COALESCE(MAX(id), 0) FROM {t}") + out[t] = int(cur.fetchone()[0]) + return out + + +def _docker_cp(container: str, src_in_container: str, dest_on_host: Path) -> None: + dest_on_host.parent.mkdir(parents=True, exist_ok=True) + if dest_on_host.exists(): + if dest_on_host.is_dir(): + shutil.rmtree(dest_on_host) + else: + dest_on_host.unlink() + subprocess.run( + ["docker", "cp", f"{container}:{src_in_container}", str(dest_on_host)], + check=True, + ) + + +def _docker_cp_into(container: str, src_on_host: Path, dest_in_container: str) -> None: + subprocess.run( + ["docker", "cp", str(src_on_host), f"{container}:{dest_in_container}"], + check=True, + ) + + +def _docker_exec(container: str, *args: str) -> str: + result = subprocess.run( + ["docker", "exec", container, *args], + capture_output=True, text=True, + ) + if result.returncode != 0: + raise RuntimeError( + f"docker exec {container} {' '.join(args)} failed: {result.stderr}" + ) + return result.stdout + + +# ── dump ────────────────────────────────────────────────────────────────── + +def dump(snapshot_dir: Path, dsn: str, container: str) -> None: + snapshot_dir.mkdir(parents=True, exist_ok=True) + data_dir = snapshot_dir / "data" + data_dir.mkdir(exist_ok=True) + uploads_dir = snapshot_dir / "uploads" + if uploads_dir.exists(): + shutil.rmtree(uploads_dir) + + manifest: dict = { + "dumped_at": datetime.now(timezone.utc).isoformat(), + "source_dsn_host": dsn.split("@", 1)[-1] if "@" in dsn else dsn, + "container": container, + "tables": {}, + "sequences": {}, + } + + print(f"==> Dumping rows to {data_dir} …") + with _connect(dsn) as conn: + with conn.cursor() as cur: + for table, where in TABLES: + csv_path = data_dir / f"{table}.csv" + n = _capture_table_csv(cur, table, where, csv_path) + manifest["tables"][table] = n + print(f" {table:<32} {n:>6} rows → {csv_path.name}") + print("==> Capturing id-sequence high-water marks …") + manifest["sequences"] = _capture_sequences(cur, ID_SEQ_TABLES) + for k, v in manifest["sequences"].items(): + print(f" {k:<32} MAX(id)={v}") + + print(f"==> Copying backend uploads from {container}:{BACKEND_UPLOADS_PATH} …") + _docker_cp(container, BACKEND_UPLOADS_PATH, uploads_dir) + photo_count = sum(1 for _ in (uploads_dir / "photos").iterdir() + if (uploads_dir / "photos").exists()) if (uploads_dir / "photos").exists() else 0 + att_count = sum(1 for _ in (uploads_dir / "attachments").iterdir() + if (uploads_dir / "attachments").exists()) if (uploads_dir / "attachments").exists() else 0 + manifest["uploads"] = {"photos": photo_count, "attachments": att_count} + + (snapshot_dir / "manifest.json").write_text( + json.dumps(manifest, indent=2, sort_keys=True), + encoding="utf-8", + ) + print(f"==> Manifest written.") + print(f"==> Snapshot ready at {snapshot_dir}") + + +# ── load ────────────────────────────────────────────────────────────────── + +def load(snapshot_dir: Path, dsn: str, container: str, + uploads_mode: str = "docker", + uploads_dest: Optional[str] = None) -> None: + """Replay a snapshot into the target DB and restore the uploads tree. + + uploads_mode: + "docker" — call `docker cp ` into the backend + container at /app/uploads. The default when the + tool runs from a developer's host. + "local" — copy directly into uploads_dest on the local + filesystem. Used by the docker-compose `seed` service, + which has the backend's uploads volume bind-mounted. + """ + data_dir = snapshot_dir / "data" + uploads_dir = snapshot_dir / "uploads" + manifest_path = snapshot_dir / "manifest.json" + + if not data_dir.is_dir(): + raise SystemExit(f"data/ missing under {snapshot_dir}") + if not manifest_path.is_file(): + raise SystemExit(f"manifest.json missing under {snapshot_dir}") + + manifest = json.loads(manifest_path.read_text()) + print(f"==> Loading snapshot dumped at {manifest.get('dumped_at')}") + + with _connect(dsn) as conn: + conn.autocommit = False + with conn.cursor() as cur: + print("==> Truncating existing seed rows (child-first order) …") + for table in _truncate_order(): + csv_path = data_dir / f"{table}.csv" + if not csv_path.exists(): + continue + # Delete using the same WHERE we used when dumping — + # cleanly idempotent for re-loads. + where = dict(TABLES)[table] + cur.execute(f"DELETE FROM {table} WHERE {where}") + deleted = cur.rowcount or 0 + print(f" -{table:<32} {deleted:>6} deleted") + + print("==> Copying rows from CSV into Postgres (parent-first order) …") + for table, _where in TABLES: + csv_path = data_dir / f"{table}.csv" + if not csv_path.exists(): + continue + with csv_path.open("rb") as fh: + header_line = fh.readline().decode("utf-8").rstrip("\n").rstrip("\r") + columns = [c.strip() for c in header_line.split(",")] + copy_sql = ( + f"COPY {table} ({', '.join(columns)}) " + "FROM STDIN WITH (FORMAT csv, HEADER false)" + ) + with cur.copy(copy_sql) as copy: + for chunk in iter(lambda: fh.read(64 * 1024), b""): + copy.write(chunk) + # Count only the seed-owned rows so the display lines up + # with the manifest (non-seed bootstrap rows are ignored). + cur.execute(f"SELECT count(*) FROM {table} WHERE {_where}") + got = cur.fetchone()[0] + expected = manifest["tables"].get(table) + marker = "✓" if expected is None or got == expected else "!" + print(f" +{table:<32} {got:>6} rows {marker}") + + print("==> Bumping id sequences …") + for table in ID_SEQ_TABLES: + cur.execute( + f"SELECT setval(pg_get_serial_sequence('{table}', 'id'), " + f"COALESCE((SELECT MAX(id) FROM {table}), 1))" + ) + conn.commit() + + if uploads_mode == "local": + dest_root = Path(uploads_dest or BACKEND_UPLOADS_PATH) + print(f"==> Restoring backend uploads into {dest_root} (local copy) …") + if uploads_dir.is_dir(): + for sub in ("photos", "attachments"): + host_sub = uploads_dir / sub + if not host_sub.is_dir(): + continue + target = dest_root / sub + target.mkdir(parents=True, exist_ok=True) + n = 0 + for src in host_sub.iterdir(): + if src.is_file(): + shutil.copy2(src, target / src.name) + n += 1 + print(f" {sub:<32} {n:>6} files restored") + else: + print(" (no uploads/ dir in snapshot — skipping)") + else: + print(f"==> Restoring backend uploads into {container}:{BACKEND_UPLOADS_PATH} …") + if uploads_dir.is_dir(): + # docker cp doesn't merge — replace each subdir wholesale. + for sub in ("photos", "attachments"): + host_sub = uploads_dir / sub + if not host_sub.is_dir(): + continue + target = f"{BACKEND_UPLOADS_PATH}/{sub}" + # ensure target dir exists; orphan files from prior runs are + # left in place because the backend may run as a non-root user + # that can't delete files owned by another uid. Orphans are + # harmless — nothing in the DB references them. + _docker_exec(container, "mkdir", "-p", target) + _docker_cp_into(container, host_sub, BACKEND_UPLOADS_PATH) + n = len(list(host_sub.iterdir())) + print(f" {sub:<32} {n:>6} files restored") + else: + print(" (no uploads/ dir in snapshot — skipping)") + + print("==> Load complete.") + + +# ── cli ─────────────────────────────────────────────────────────────────── + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + sub = parser.add_subparsers(dest="mode", required=True) + + pdump = sub.add_parser("dump", help="Capture current state into a snapshot dir") + pdump.add_argument("snapshot_dir", help="Output directory") + pdump.add_argument("--dsn", default=_default_dsn()) + pdump.add_argument("--container", default=DEFAULT_BACKEND_CONTAINER) + + pload = sub.add_parser("load", help="Replay a snapshot dir into the local DB") + pload.add_argument("snapshot_dir", help="Input directory (created by --dump)") + pload.add_argument("--dsn", default=_default_dsn()) + pload.add_argument("--container", default=DEFAULT_BACKEND_CONTAINER) + pload.add_argument("--uploads-mode", choices=("docker", "local"), + default="docker", + help="docker: docker cp into the backend container; " + "local: shutil.copy into --uploads-dest (used " + "by the docker-compose `seed` profile which has " + "the uploads volume bind-mounted).") + pload.add_argument("--uploads-dest", default=BACKEND_UPLOADS_PATH, + help="Destination dir for --uploads-mode=local") + + args = parser.parse_args() + if args.mode == "dump": + dump(Path(args.snapshot_dir), args.dsn, args.container) + elif args.mode == "load": + load(Path(args.snapshot_dir), args.dsn, args.container, + uploads_mode=args.uploads_mode, + uploads_dest=args.uploads_dest) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/seed_snapshot_data/data/admins.csv b/scripts/seed_snapshot_data/data/admins.csv new file mode 100644 index 00000000..e00250bd --- /dev/null +++ b/scripts/seed_snapshot_data/data/admins.csv @@ -0,0 +1,2 @@ +id +1194 diff --git a/scripts/seed_snapshot_data/data/attachments.csv b/scripts/seed_snapshot_data/data/attachments.csv new file mode 100644 index 00000000..acb60b3d --- /dev/null +++ b/scripts/seed_snapshot_data/data/attachments.csv @@ -0,0 +1,79 @@ +id,filename,content_type,size_bytes,uploader_id,created_at +4c15f506-5436-4f61-a9a4-410ac38dee70,4c15f506-5436-4f61-a9a4-410ac38dee70.pdf,application/pdf,1521,1271,2026-05-13 08:09:04.913378+00 +13fd74d6-4068-4522-8b2c-487eaaabc02e,13fd74d6-4068-4522-8b2c-487eaaabc02e.pdf,application/pdf,1487,1271,2026-05-13 08:09:04.944782+00 +babc6c79-7252-4d59-82ea-d5b7e1d42132,babc6c79-7252-4d59-82ea-d5b7e1d42132.pdf,application/pdf,1495,1271,2026-05-13 08:09:04.974126+00 +bfab8230-ecab-4dd3-b553-6202a22c02e2,bfab8230-ecab-4dd3-b553-6202a22c02e2.pdf,application/pdf,1465,1271,2026-05-13 08:09:05.003781+00 +38399658-0c65-47a7-a0fc-2a15b64e3bf7,38399658-0c65-47a7-a0fc-2a15b64e3bf7.jpg,image/jpeg,65020,1195,2026-05-13 08:09:19.647443+00 +892ce69e-dc8c-457a-b99f-bd859c5b1372,892ce69e-dc8c-457a-b99f-bd859c5b1372.jpg,image/jpeg,171248,1195,2026-05-13 08:09:21.204083+00 +5903c709-235d-4c64-a122-5c6ab831bbe4,5903c709-235d-4c64-a122-5c6ab831bbe4.jpg,image/jpeg,248172,1197,2026-05-13 08:09:21.774276+00 +d0053fe5-11ff-445d-9d4e-294e908cfd81,d0053fe5-11ff-445d-9d4e-294e908cfd81.jpg,image/jpeg,182206,1197,2026-05-13 08:09:22.387093+00 +823d41a5-9374-4d8b-962d-2ab078532c79,823d41a5-9374-4d8b-962d-2ab078532c79.jpg,image/jpeg,203359,1198,2026-05-13 08:09:22.967675+00 +7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436,7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436.jpg,image/jpeg,103010,1201,2026-05-13 08:09:23.512516+00 +e648dd38-87b3-4f71-a6bd-3365d89f009e,e648dd38-87b3-4f71-a6bd-3365d89f009e.jpg,image/jpeg,80253,1205,2026-05-13 08:09:24.008593+00 +a32d37a2-6f7a-4ae6-9789-64b3fd2a9776,a32d37a2-6f7a-4ae6-9789-64b3fd2a9776.jpg,image/jpeg,184070,1206,2026-05-13 08:09:24.681555+00 +bcee9919-fc8c-4bfd-b866-34b84ec05d03,bcee9919-fc8c-4bfd-b866-34b84ec05d03.jpg,image/jpeg,114558,1210,2026-05-13 08:09:25.244469+00 +72ec30c3-d953-47db-ac53-7ec168726af1,72ec30c3-d953-47db-ac53-7ec168726af1.jpg,image/jpeg,78838,1212,2026-05-13 08:09:25.789039+00 +b4f60172-b736-486c-9dc1-d870c9178e08,b4f60172-b736-486c-9dc1-d870c9178e08.jpg,image/jpeg,87706,1214,2026-05-13 08:09:26.364197+00 +4b78d60d-60e3-4453-b98b-569d27045faf,4b78d60d-60e3-4453-b98b-569d27045faf.jpg,image/jpeg,29015,1215,2026-05-13 08:09:26.899877+00 +3076f1d0-50a9-47c6-945a-2d300f5a6668,3076f1d0-50a9-47c6-945a-2d300f5a6668.jpg,image/jpeg,88375,1216,2026-05-13 08:09:27.478766+00 +2da4e5c1-cf52-44a8-8915-ed841f31f8a6,2da4e5c1-cf52-44a8-8915-ed841f31f8a6.jpg,image/jpeg,252264,1218,2026-05-13 08:09:28.059654+00 +8759c547-1aaa-46af-ad2d-ee70a0f8e3c4,8759c547-1aaa-46af-ad2d-ee70a0f8e3c4.jpg,image/jpeg,87516,1219,2026-05-13 08:09:28.612475+00 +73602877-b71c-4cff-9af5-0e0681664072,73602877-b71c-4cff-9af5-0e0681664072.jpg,image/jpeg,173309,1223,2026-05-13 08:09:29.182509+00 +419a8023-f19e-4ccb-8abd-e55d52836662,419a8023-f19e-4ccb-8abd-e55d52836662.jpg,image/jpeg,120849,1226,2026-05-13 08:09:29.7621+00 +e3883d42-6f55-4931-9439-65e123629f72,e3883d42-6f55-4931-9439-65e123629f72.jpg,image/jpeg,106823,1229,2026-05-13 08:09:30.313514+00 +f9aa13bc-7002-416e-888d-6a453fcbb005,f9aa13bc-7002-416e-888d-6a453fcbb005.jpg,image/jpeg,311025,1231,2026-05-13 08:09:31.011002+00 +84fe6469-653e-459d-8235-03d64b8ae6d3,84fe6469-653e-459d-8235-03d64b8ae6d3.jpg,image/jpeg,113991,1240,2026-05-13 08:09:31.572479+00 +23545c9f-8b97-4f7e-99f0-18f926b4e44a,23545c9f-8b97-4f7e-99f0-18f926b4e44a.jpg,image/jpeg,134941,1243,2026-05-13 08:09:32.18329+00 +0bed4673-775c-497a-8070-d487bf8837ba,0bed4673-775c-497a-8070-d487bf8837ba.jpg,image/jpeg,145636,1248,2026-05-13 08:09:32.75297+00 +08f7be01-09fa-4122-9316-87eff5a761d6,08f7be01-09fa-4122-9316-87eff5a761d6.jpg,image/jpeg,129766,1252,2026-05-13 08:09:33.365657+00 +dd4525ca-ead3-4196-be44-0c74d5c8b815,dd4525ca-ead3-4196-be44-0c74d5c8b815.jpg,image/jpeg,57284,1253,2026-05-13 08:09:33.91503+00 +d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b,d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b.jpg,image/jpeg,136880,1255,2026-05-13 08:09:34.500305+00 +11574ede-4b7a-40d2-9296-46f5f8cd4169,11574ede-4b7a-40d2-9296-46f5f8cd4169.jpg,image/jpeg,125690,1256,2026-05-13 08:09:35.125305+00 +015cfd17-c111-40c2-9842-12dd71bd75e4,015cfd17-c111-40c2-9842-12dd71bd75e4.jpg,image/jpeg,162468,1256,2026-05-13 08:09:35.722476+00 +c35020cb-18c1-407e-9c54-50f53f132bd2,c35020cb-18c1-407e-9c54-50f53f132bd2.jpg,image/jpeg,84571,1257,2026-05-13 08:09:36.227198+00 +b4cd15e0-b7be-4518-8c5e-cf0a6dc17669,b4cd15e0-b7be-4518-8c5e-cf0a6dc17669.jpg,image/jpeg,240803,1257,2026-05-13 08:09:36.868497+00 +d31b1cb3-68a2-42d6-ac6d-333da7e16068,d31b1cb3-68a2-42d6-ac6d-333da7e16068.jpg,image/jpeg,88896,1259,2026-05-13 08:09:37.425359+00 +ad5fe778-3b5f-4246-9783-350b4b279e19,ad5fe778-3b5f-4246-9783-350b4b279e19.jpg,image/jpeg,169769,1260,2026-05-13 08:09:37.999918+00 +66753816-2418-4431-a279-0e4d9f723b0f,66753816-2418-4431-a279-0e4d9f723b0f.jpg,image/jpeg,77983,1261,2026-05-13 08:09:38.590066+00 +abe607cd-7b2b-411b-ac9f-d36dfb10ecb3,abe607cd-7b2b-411b-ac9f-d36dfb10ecb3.jpg,image/jpeg,68346,1261,2026-05-13 08:09:39.155379+00 +2c270ece-e645-47d2-acaf-32f0e2af45c0,2c270ece-e645-47d2-acaf-32f0e2af45c0.jpg,image/jpeg,160551,1263,2026-05-13 08:09:39.746131+00 +f1aba89c-37d4-4e65-ac86-8ef6f8e56190,f1aba89c-37d4-4e65-ac86-8ef6f8e56190.jpg,image/jpeg,210905,1263,2026-05-13 08:09:40.764986+00 +8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd,8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd.jpg,image/jpeg,51894,1264,2026-05-13 08:09:41.29819+00 +03b07893-e564-436e-aa31-9324b3080bc0,03b07893-e564-436e-aa31-9324b3080bc0.jpg,image/jpeg,124986,1265,2026-05-13 08:09:41.987521+00 +7b8658c1-431f-4fa8-91a6-87b9c5b4d060,7b8658c1-431f-4fa8-91a6-87b9c5b4d060.jpg,image/jpeg,47594,1267,2026-05-13 08:09:42.568333+00 +3463b7da-adaa-409c-a567-34b01e8edd60,3463b7da-adaa-409c-a567-34b01e8edd60.jpg,image/jpeg,119393,1267,2026-05-13 08:09:43.185048+00 +18638619-e1fd-4a5e-a71e-8f9881020d03,18638619-e1fd-4a5e-a71e-8f9881020d03.jpg,image/jpeg,132339,1267,2026-05-13 08:09:43.736432+00 +19bc5d84-ad32-4e05-8894-f996af15252b,19bc5d84-ad32-4e05-8894-f996af15252b.jpg,image/jpeg,130983,1268,2026-05-13 08:09:44.272039+00 +73ddff02-97ff-4067-8e59-4504a9a11bc0,73ddff02-97ff-4067-8e59-4504a9a11bc0.jpg,image/jpeg,180507,1268,2026-05-13 08:09:44.818513+00 +684f4bfc-da58-4825-ac7c-970eba701223,684f4bfc-da58-4825-ac7c-970eba701223.jpg,image/jpeg,125690,1269,2026-05-13 08:09:45.616616+00 +cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa,cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa.jpg,image/jpeg,107030,1269,2026-05-13 08:09:46.214457+00 +e2ebc233-3bf7-41d1-986e-94d7c802f74e,e2ebc233-3bf7-41d1-986e-94d7c802f74e.jpg,image/jpeg,48392,1270,2026-05-13 08:09:46.835053+00 +c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7,c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7.jpg,image/jpeg,124809,1270,2026-05-13 08:09:47.410256+00 +d3083363-a675-4746-ac4d-a6671b7ec316,d3083363-a675-4746-ac4d-a6671b7ec316.jpg,image/jpeg,165823,1270,2026-05-13 08:09:47.95968+00 +bd802c82-0dbc-4ffd-9387-37b314fa7a72,bd802c82-0dbc-4ffd-9387-37b314fa7a72.jpg,image/jpeg,174841,1271,2026-05-13 08:09:48.497433+00 +cb6a506a-8b79-493c-ad72-a91ebaabb284,cb6a506a-8b79-493c-ad72-a91ebaabb284.jpg,image/jpeg,75756,1271,2026-05-13 08:09:49.081264+00 +29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0,29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0.jpg,image/jpeg,94811,1271,2026-05-13 08:09:49.688485+00 +6e034127-7b87-4269-89f6-50a9e0916452,6e034127-7b87-4269-89f6-50a9e0916452.jpg,image/jpeg,198958,1230,2026-05-13 08:10:26.754894+00 +62dbeacd-5c57-4edb-b644-6913a3f56aa6,62dbeacd-5c57-4edb-b644-6913a3f56aa6.jpg,image/jpeg,108081,1246,2026-05-13 08:10:29.481418+00 +82505a2c-5eb1-4c68-a1f2-bf0755953744,82505a2c-5eb1-4c68-a1f2-bf0755953744.jpg,image/jpeg,161219,1208,2026-05-13 08:10:32.297256+00 +4aa72b48-c3fc-43f8-ba60-d12a1ee542bd,4aa72b48-c3fc-43f8-ba60-d12a1ee542bd.jpg,image/jpeg,86021,1200,2026-05-13 08:10:34.584755+00 +ef3bb57b-0ec6-4a37-b31f-99493b22184e,ef3bb57b-0ec6-4a37-b31f-99493b22184e.jpg,image/jpeg,43018,1269,2026-05-13 08:10:36.657856+00 +857b433b-7360-44fc-9f0c-4a27b91aa402,857b433b-7360-44fc-9f0c-4a27b91aa402.jpg,image/jpeg,74538,1268,2026-05-13 08:10:38.625714+00 +65bcf29c-b2b1-45ae-b15c-abdb988079c5,65bcf29c-b2b1-45ae-b15c-abdb988079c5.jpg,image/jpeg,163373,1227,2026-05-13 08:10:40.807901+00 +731d440b-df13-4af1-969d-a5f52000714f,731d440b-df13-4af1-969d-a5f52000714f.jpg,image/jpeg,50862,1245,2026-05-13 08:10:42.750875+00 +803359c4-5661-447f-88b0-a60369da7768,803359c4-5661-447f-88b0-a60369da7768.jpg,image/jpeg,119996,1249,2026-05-13 08:10:44.767249+00 +e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d,e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d.jpg,image/jpeg,123221,1217,2026-05-13 08:10:46.813352+00 +8a07a8f8-bfd0-49c9-95a2-11a239f0aa04,8a07a8f8-bfd0-49c9-95a2-11a239f0aa04.jpg,image/jpeg,22389,1217,2026-05-13 08:10:49.050167+00 +a3cee329-756d-4e45-b97c-95b341fec131,a3cee329-756d-4e45-b97c-95b341fec131.jpg,image/jpeg,83607,1222,2026-05-13 08:10:50.981135+00 +01e7b3ac-381b-448d-9007-136c392f6d7b,01e7b3ac-381b-448d-9007-136c392f6d7b.jpg,image/jpeg,33857,1238,2026-05-13 08:10:53.425936+00 +8ad0f01d-cd51-4b13-b0ef-acd864245bbc,8ad0f01d-cd51-4b13-b0ef-acd864245bbc.jpg,image/jpeg,103674,1246,2026-05-13 08:10:54.874712+00 +8d68dd4a-7299-4f3d-b05c-f03265126314,8d68dd4a-7299-4f3d-b05c-f03265126314.jpg,image/jpeg,105947,1207,2026-05-13 08:10:58.548682+00 +09184a48-6ac9-4e64-8e0e-0b37a5d3563d,09184a48-6ac9-4e64-8e0e-0b37a5d3563d.jpg,image/jpeg,129430,1206,2026-05-13 08:11:00.766037+00 +959a9435-8172-4a0c-9e89-d5e7506d42bd,959a9435-8172-4a0c-9e89-d5e7506d42bd.jpg,image/jpeg,139016,1212,2026-05-13 08:11:03.800714+00 +b48a824b-2cd3-4650-a251-687e3b1dc662,b48a824b-2cd3-4650-a251-687e3b1dc662.jpg,image/jpeg,41974,1265,2026-05-13 08:11:07.435068+00 +07bd5228-6063-416b-8b58-f329f88a6108,07bd5228-6063-416b-8b58-f329f88a6108.jpg,image/jpeg,60584,1219,2026-05-13 08:11:10.17373+00 +2eafa847-2d98-47ca-b2f7-397f1e69eb46,2eafa847-2d98-47ca-b2f7-397f1e69eb46.jpg,image/jpeg,60668,1256,2026-05-13 08:10:57.007538+00 +9a8b00ad-0ce3-4f23-b6c0-b8e81323d644,9a8b00ad-0ce3-4f23-b6c0-b8e81323d644.jpg,image/jpeg,59008,1225,2026-05-13 08:11:05.872049+00 +3159cc61-ab26-4fc5-9964-e4698ca602b3,3159cc61-ab26-4fc5-9964-e4698ca602b3.pdf,application/pdf,1999,1198,2026-05-13 08:28:06.101563+00 +d77e21f2-9694-47da-9fd2-922e2b0cb0da,d77e21f2-9694-47da-9fd2-922e2b0cb0da.pdf,application/pdf,2073,1198,2026-05-13 08:28:06.135421+00 +da9d79ab-7c92-43b8-899e-bd75a127122a,da9d79ab-7c92-43b8-899e-bd75a127122a.pdf,application/pdf,1968,1198,2026-05-13 08:28:06.163172+00 diff --git a/scripts/seed_snapshot_data/data/conversation_participants.csv b/scripts/seed_snapshot_data/data/conversation_participants.csv new file mode 100644 index 00000000..f294f6fa --- /dev/null +++ b/scripts/seed_snapshot_data/data/conversation_participants.csv @@ -0,0 +1,27 @@ +conversation_id,user_id,joined_at +20,1195,2026-03-29 00:00:00+00 +20,1246,2026-03-29 00:00:00+00 +21,1197,2026-04-13 00:00:00+00 +21,1248,2026-04-13 00:00:00+00 +22,1198,2026-04-15 00:00:00+00 +22,1211,2026-04-15 00:00:00+00 +23,1200,2026-04-18 00:00:00+00 +23,1207,2026-04-18 00:00:00+00 +24,1201,2026-03-24 00:00:00+00 +24,1217,2026-03-24 00:00:00+00 +25,1271,2026-03-14 00:00:00+00 +25,1231,2026-03-14 00:00:00+00 +26,1196,2025-04-10 00:00:00+00 +26,1216,2025-04-10 00:00:00+00 +27,1198,2025-04-01 00:00:00+00 +27,1267,2025-04-01 00:00:00+00 +28,1199,2025-08-19 00:00:00+00 +28,1222,2025-08-19 00:00:00+00 +29,1199,2025-04-02 00:00:00+00 +29,1267,2025-04-02 00:00:00+00 +30,1195,2026-04-28 00:00:00+00 +30,1197,2026-04-28 00:00:00+00 +31,1197,2026-04-28 00:00:00+00 +31,1202,2026-04-28 00:00:00+00 +32,1198,2026-04-28 00:00:00+00 +32,1205,2026-04-28 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/conversations.csv b/scripts/seed_snapshot_data/data/conversations.csv new file mode 100644 index 00000000..b0bcdb48 --- /dev/null +++ b/scripts/seed_snapshot_data/data/conversations.csv @@ -0,0 +1,14 @@ +id,kind,mentorship_id,created_at,pair_a_id,pair_b_id +20,MENTORSHIP,23,2026-03-29 00:00:00+00,, +21,MENTORSHIP,24,2026-04-13 00:00:00+00,, +22,MENTORSHIP,25,2026-04-15 00:00:00+00,, +23,MENTORSHIP,26,2026-04-18 00:00:00+00,, +24,MENTORSHIP,27,2026-03-24 00:00:00+00,, +25,MENTORSHIP,28,2026-03-14 00:00:00+00,, +26,MENTORSHIP,29,2025-04-10 00:00:00+00,, +27,MENTORSHIP,30,2025-04-01 00:00:00+00,, +28,MENTORSHIP,31,2025-08-19 00:00:00+00,, +29,MENTORSHIP,32,2025-04-02 00:00:00+00,, +30,MENTOR_PAIR,,2026-04-28 00:00:00+00,1195,1197 +31,MENTOR_PAIR,,2026-04-28 00:00:00+00,1197,1202 +32,MENTOR_PAIR,,2026-04-28 00:00:00+00,1198,1205 diff --git a/scripts/seed_snapshot_data/data/feed_post_attachments.csv b/scripts/seed_snapshot_data/data/feed_post_attachments.csv new file mode 100644 index 00000000..2cb36882 --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_post_attachments.csv @@ -0,0 +1,72 @@ +post_id,attachment_id,position +516,38399658-0c65-47a7-a0fc-2a15b64e3bf7,0 +518,892ce69e-dc8c-457a-b99f-bd859c5b1372,0 +526,5903c709-235d-4c64-a122-5c6ab831bbe4,0 +527,d0053fe5-11ff-445d-9d4e-294e908cfd81,0 +532,823d41a5-9374-4d8b-962d-2ab078532c79,0 +544,7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436,0 +557,e648dd38-87b3-4f71-a6bd-3365d89f009e,0 +561,a32d37a2-6f7a-4ae6-9789-64b3fd2a9776,0 +572,bcee9919-fc8c-4bfd-b866-34b84ec05d03,0 +577,72ec30c3-d953-47db-ac53-7ec168726af1,0 +583,b4f60172-b736-486c-9dc1-d870c9178e08,0 +586,4b78d60d-60e3-4453-b98b-569d27045faf,0 +592,3076f1d0-50a9-47c6-945a-2d300f5a6668,0 +600,2da4e5c1-cf52-44a8-8915-ed841f31f8a6,0 +602,8759c547-1aaa-46af-ad2d-ee70a0f8e3c4,0 +617,73602877-b71c-4cff-9af5-0e0681664072,0 +637,419a8023-f19e-4ccb-8abd-e55d52836662,0 +648,e3883d42-6f55-4931-9439-65e123629f72,0 +655,f9aa13bc-7002-416e-888d-6a453fcbb005,0 +683,84fe6469-653e-459d-8235-03d64b8ae6d3,0 +690,23545c9f-8b97-4f7e-99f0-18f926b4e44a,0 +703,0bed4673-775c-497a-8070-d487bf8837ba,0 +722,08f7be01-09fa-4122-9316-87eff5a761d6,0 +730,dd4525ca-ead3-4196-be44-0c74d5c8b815,0 +736,d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b,0 +739,11574ede-4b7a-40d2-9296-46f5f8cd4169,0 +741,015cfd17-c111-40c2-9842-12dd71bd75e4,0 +744,c35020cb-18c1-407e-9c54-50f53f132bd2,0 +746,b4cd15e0-b7be-4518-8c5e-cf0a6dc17669,0 +755,d31b1cb3-68a2-42d6-ac6d-333da7e16068,0 +758,ad5fe778-3b5f-4246-9783-350b4b279e19,0 +760,66753816-2418-4431-a279-0e4d9f723b0f,0 +762,abe607cd-7b2b-411b-ac9f-d36dfb10ecb3,0 +768,2c270ece-e645-47d2-acaf-32f0e2af45c0,0 +770,f1aba89c-37d4-4e65-ac86-8ef6f8e56190,0 +772,8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd,0 +776,03b07893-e564-436e-aa31-9324b3080bc0,0 +779,7b8658c1-431f-4fa8-91a6-87b9c5b4d060,0 +781,3463b7da-adaa-409c-a567-34b01e8edd60,0 +782,18638619-e1fd-4a5e-a71e-8f9881020d03,0 +784,19bc5d84-ad32-4e05-8894-f996af15252b,0 +787,73ddff02-97ff-4067-8e59-4504a9a11bc0,0 +789,684f4bfc-da58-4825-ac7c-970eba701223,0 +792,cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa,0 +793,e2ebc233-3bf7-41d1-986e-94d7c802f74e,0 +794,c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7,0 +796,d3083363-a675-4746-ac4d-a6671b7ec316,0 +798,bd802c82-0dbc-4ffd-9387-37b314fa7a72,0 +799,cb6a506a-8b79-493c-ad72-a91ebaabb284,0 +802,29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0,0 +651,6e034127-7b87-4269-89f6-50a9e0916452,0 +699,62dbeacd-5c57-4edb-b644-6913a3f56aa6,0 +567,82505a2c-5eb1-4c68-a1f2-bf0755953744,0 +536,4aa72b48-c3fc-43f8-ba60-d12a1ee542bd,0 +791,ef3bb57b-0ec6-4a37-b31f-99493b22184e,0 +788,857b433b-7360-44fc-9f0c-4a27b91aa402,0 +643,65bcf29c-b2b1-45ae-b15c-abdb988079c5,0 +695,731d440b-df13-4af1-969d-a5f52000714f,0 +707,803359c4-5661-447f-88b0-a60369da7768,0 +597,e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d,0 +595,8a07a8f8-bfd0-49c9-95a2-11a239f0aa04,0 +613,a3cee329-756d-4e45-b97c-95b341fec131,0 +679,01e7b3ac-381b-448d-9007-136c392f6d7b,0 +698,8ad0f01d-cd51-4b13-b0ef-acd864245bbc,0 +738,2eafa847-2d98-47ca-b2f7-397f1e69eb46,0 +565,8d68dd4a-7299-4f3d-b05c-f03265126314,0 +559,09184a48-6ac9-4e64-8e0e-0b37a5d3563d,0 +578,959a9435-8172-4a0c-9e89-d5e7506d42bd,0 +630,9a8b00ad-0ce3-4f23-b6c0-b8e81323d644,0 +775,b48a824b-2cd3-4650-a251-687e3b1dc662,0 +605,07bd5228-6063-416b-8b58-f329f88a6108,0 diff --git a/scripts/seed_snapshot_data/data/feed_post_comment_likes.csv b/scripts/seed_snapshot_data/data/feed_post_comment_likes.csv new file mode 100644 index 00000000..120afbe6 --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_post_comment_likes.csv @@ -0,0 +1,1640 @@ +comment_id,user_id,created_at +1148,1199,2026-05-13 08:02:44.742121+00 +1148,1206,2026-05-13 08:02:44.742121+00 +1148,1258,2026-05-13 08:02:44.742121+00 +1150,1225,2026-05-13 08:02:44.742121+00 +1150,1196,2026-05-13 08:02:44.742121+00 +1150,1229,2026-05-13 08:02:44.742121+00 +1150,1195,2026-05-13 08:02:44.742121+00 +1150,1220,2026-05-13 08:02:44.742121+00 +1150,1207,2026-05-13 08:02:44.742121+00 +1151,1216,2026-05-13 08:02:44.742121+00 +1151,1210,2026-05-13 08:02:44.742121+00 +1151,1260,2026-05-13 08:02:44.742121+00 +1152,1255,2026-05-13 08:02:44.742121+00 +1152,1269,2026-05-13 08:02:44.742121+00 +1152,1247,2026-05-13 08:02:44.742121+00 +1153,1251,2026-05-13 08:02:44.742121+00 +1153,1260,2026-05-13 08:02:44.742121+00 +1153,1229,2026-05-13 08:02:44.742121+00 +1153,1196,2026-05-13 08:02:44.742121+00 +1153,1249,2026-05-13 08:02:44.742121+00 +1153,1261,2026-05-13 08:02:44.742121+00 +1153,1262,2026-05-13 08:02:44.742121+00 +1155,1244,2026-05-13 08:02:44.742121+00 +1156,1208,2026-05-13 08:02:44.742121+00 +1156,1212,2026-05-13 08:02:44.742121+00 +1156,1261,2026-05-13 08:02:44.742121+00 +1156,1219,2026-05-13 08:02:44.742121+00 +1156,1235,2026-05-13 08:02:44.742121+00 +1156,1243,2026-05-13 08:02:44.742121+00 +1156,1247,2026-05-13 08:02:44.742121+00 +1157,1231,2026-05-13 08:02:44.742121+00 +1157,1194,2026-05-13 08:02:44.742121+00 +1158,1229,2026-05-13 08:02:44.742121+00 +1158,1214,2026-05-13 08:02:44.742121+00 +1158,1212,2026-05-13 08:02:44.742121+00 +1158,1269,2026-05-13 08:02:44.742121+00 +1159,1219,2026-05-13 08:02:44.742121+00 +1159,1264,2026-05-13 08:02:44.742121+00 +1159,1213,2026-05-13 08:02:44.742121+00 +1159,1194,2026-05-13 08:02:44.742121+00 +1159,1217,2026-05-13 08:02:44.742121+00 +1160,1201,2026-05-13 08:02:44.742121+00 +1161,1235,2026-05-13 08:02:44.742121+00 +1161,1246,2026-05-13 08:02:44.742121+00 +1161,1207,2026-05-13 08:02:44.742121+00 +1162,1217,2026-05-13 08:02:44.742121+00 +1162,1246,2026-05-13 08:02:44.742121+00 +1162,1258,2026-05-13 08:02:44.742121+00 +1162,1247,2026-05-13 08:02:44.742121+00 +1162,1242,2026-05-13 08:02:44.742121+00 +1163,1240,2026-05-13 08:02:44.742121+00 +1164,1230,2026-05-13 08:02:44.742121+00 +1164,1206,2026-05-13 08:02:44.742121+00 +1164,1212,2026-05-13 08:02:44.742121+00 +1165,1248,2026-05-13 08:02:44.742121+00 +1165,1262,2026-05-13 08:02:44.742121+00 +1167,1194,2026-05-13 08:02:44.742121+00 +1168,1218,2026-05-13 08:02:44.742121+00 +1168,1195,2026-05-13 08:02:44.742121+00 +1169,1270,2026-05-13 08:02:44.742121+00 +1169,1262,2026-05-13 08:02:44.742121+00 +1169,1241,2026-05-13 08:02:44.742121+00 +1169,1267,2026-05-13 08:02:44.742121+00 +1171,1215,2026-05-13 08:02:44.742121+00 +1171,1246,2026-05-13 08:02:44.742121+00 +1172,1261,2026-05-13 08:02:44.742121+00 +1172,1238,2026-05-13 08:02:44.742121+00 +1172,1264,2026-05-13 08:02:44.742121+00 +1172,1233,2026-05-13 08:02:44.742121+00 +1172,1198,2026-05-13 08:02:44.742121+00 +1172,1234,2026-05-13 08:02:44.742121+00 +1172,1214,2026-05-13 08:02:44.742121+00 +1173,1241,2026-05-13 08:02:44.742121+00 +1173,1227,2026-05-13 08:02:44.742121+00 +1173,1231,2026-05-13 08:02:44.742121+00 +1173,1215,2026-05-13 08:02:44.742121+00 +1174,1247,2026-05-13 08:02:44.742121+00 +1174,1210,2026-05-13 08:02:44.742121+00 +1174,1238,2026-05-13 08:02:44.742121+00 +1174,1255,2026-05-13 08:02:44.742121+00 +1175,1227,2026-05-13 08:02:44.742121+00 +1175,1211,2026-05-13 08:02:44.742121+00 +1176,1256,2026-05-13 08:02:44.742121+00 +1176,1230,2026-05-13 08:02:44.742121+00 +1177,1250,2026-05-13 08:02:44.742121+00 +1178,1242,2026-05-13 08:02:44.742121+00 +1178,1206,2026-05-13 08:02:44.742121+00 +1178,1271,2026-05-13 08:02:44.742121+00 +1180,1233,2026-05-13 08:02:44.742121+00 +1180,1256,2026-05-13 08:02:44.742121+00 +1180,1241,2026-05-13 08:02:44.742121+00 +1181,1211,2026-05-13 08:02:44.742121+00 +1181,1221,2026-05-13 08:02:44.742121+00 +1181,1239,2026-05-13 08:02:44.742121+00 +1181,1229,2026-05-13 08:02:44.742121+00 +1182,1251,2026-05-13 08:02:44.742121+00 +1182,1211,2026-05-13 08:02:44.742121+00 +1183,1267,2026-05-13 08:02:44.742121+00 +1183,1215,2026-05-13 08:02:44.742121+00 +1183,1237,2026-05-13 08:02:44.742121+00 +1184,1261,2026-05-13 08:02:44.742121+00 +1185,1195,2026-05-13 08:02:44.742121+00 +1185,1213,2026-05-13 08:02:44.742121+00 +1185,1258,2026-05-13 08:02:44.742121+00 +1185,1197,2026-05-13 08:02:44.742121+00 +1185,1224,2026-05-13 08:02:44.742121+00 +1185,1264,2026-05-13 08:02:44.742121+00 +1185,1270,2026-05-13 08:02:44.742121+00 +1186,1229,2026-05-13 08:02:44.742121+00 +1187,1217,2026-05-13 08:02:44.742121+00 +1187,1243,2026-05-13 08:02:44.742121+00 +1188,1201,2026-05-13 08:02:44.742121+00 +1188,1216,2026-05-13 08:02:44.742121+00 +1189,1259,2026-05-13 08:02:44.742121+00 +1189,1222,2026-05-13 08:02:44.742121+00 +1189,1221,2026-05-13 08:02:44.742121+00 +1190,1208,2026-05-13 08:02:44.742121+00 +1190,1245,2026-05-13 08:02:44.742121+00 +1190,1223,2026-05-13 08:02:44.742121+00 +1190,1239,2026-05-13 08:02:44.742121+00 +1191,1261,2026-05-13 08:02:44.742121+00 +1191,1215,2026-05-13 08:02:44.742121+00 +1191,1195,2026-05-13 08:02:44.742121+00 +1191,1263,2026-05-13 08:02:44.742121+00 +1192,1245,2026-05-13 08:02:44.742121+00 +1192,1233,2026-05-13 08:02:44.742121+00 +1192,1202,2026-05-13 08:02:44.742121+00 +1192,1268,2026-05-13 08:02:44.742121+00 +1192,1236,2026-05-13 08:02:44.742121+00 +1193,1270,2026-05-13 08:02:44.742121+00 +1194,1200,2026-05-13 08:02:44.742121+00 +1195,1218,2026-05-13 08:02:44.742121+00 +1195,1196,2026-05-13 08:02:44.742121+00 +1195,1246,2026-05-13 08:02:44.742121+00 +1196,1228,2026-05-13 08:02:44.742121+00 +1197,1257,2026-05-13 08:02:44.742121+00 +1197,1239,2026-05-13 08:02:44.742121+00 +1198,1232,2026-05-13 08:02:44.742121+00 +1198,1266,2026-05-13 08:02:44.742121+00 +1198,1235,2026-05-13 08:02:44.742121+00 +1199,1211,2026-05-13 08:02:44.742121+00 +1199,1202,2026-05-13 08:02:44.742121+00 +1202,1208,2026-05-13 08:02:44.742121+00 +1202,1253,2026-05-13 08:02:44.742121+00 +1203,1208,2026-05-13 08:02:44.742121+00 +1203,1210,2026-05-13 08:02:44.742121+00 +1203,1243,2026-05-13 08:02:44.742121+00 +1203,1237,2026-05-13 08:02:44.742121+00 +1204,1217,2026-05-13 08:02:44.742121+00 +1204,1215,2026-05-13 08:02:44.742121+00 +1204,1238,2026-05-13 08:02:44.742121+00 +1204,1267,2026-05-13 08:02:44.742121+00 +1205,1219,2026-05-13 08:02:44.742121+00 +1205,1234,2026-05-13 08:02:44.742121+00 +1206,1251,2026-05-13 08:02:44.742121+00 +1206,1216,2026-05-13 08:02:44.742121+00 +1206,1198,2026-05-13 08:02:44.742121+00 +1207,1218,2026-05-13 08:02:44.742121+00 +1207,1257,2026-05-13 08:02:44.742121+00 +1209,1226,2026-05-13 08:02:44.742121+00 +1209,1234,2026-05-13 08:02:44.742121+00 +1210,1211,2026-05-13 08:02:44.742121+00 +1210,1223,2026-05-13 08:02:44.742121+00 +1210,1218,2026-05-13 08:02:44.742121+00 +1211,1197,2026-05-13 08:02:44.742121+00 +1211,1205,2026-05-13 08:02:44.742121+00 +1212,1236,2026-05-13 08:02:44.742121+00 +1213,1253,2026-05-13 08:02:44.742121+00 +1213,1212,2026-05-13 08:02:44.742121+00 +1213,1203,2026-05-13 08:02:44.742121+00 +1213,1245,2026-05-13 08:02:44.742121+00 +1213,1220,2026-05-13 08:02:44.742121+00 +1213,1213,2026-05-13 08:02:44.742121+00 +1213,1257,2026-05-13 08:02:44.742121+00 +1214,1229,2026-05-13 08:02:44.742121+00 +1214,1267,2026-05-13 08:02:44.742121+00 +1217,1264,2026-05-13 08:02:44.742121+00 +1217,1237,2026-05-13 08:02:44.742121+00 +1217,1230,2026-05-13 08:02:44.742121+00 +1218,1214,2026-05-13 08:02:44.742121+00 +1219,1216,2026-05-13 08:02:44.742121+00 +1219,1219,2026-05-13 08:02:44.742121+00 +1219,1211,2026-05-13 08:02:44.742121+00 +1220,1230,2026-05-13 08:02:44.742121+00 +1220,1203,2026-05-13 08:02:44.742121+00 +1221,1222,2026-05-13 08:02:44.742121+00 +1221,1205,2026-05-13 08:02:44.742121+00 +1221,1252,2026-05-13 08:02:44.742121+00 +1221,1213,2026-05-13 08:02:44.742121+00 +1221,1237,2026-05-13 08:02:44.742121+00 +1222,1202,2026-05-13 08:02:44.742121+00 +1222,1268,2026-05-13 08:02:44.742121+00 +1222,1259,2026-05-13 08:02:44.742121+00 +1224,1266,2026-05-13 08:02:44.742121+00 +1224,1263,2026-05-13 08:02:44.742121+00 +1225,1196,2026-05-13 08:02:44.742121+00 +1225,1239,2026-05-13 08:02:44.742121+00 +1225,1228,2026-05-13 08:02:44.742121+00 +1226,1207,2026-05-13 08:02:44.742121+00 +1226,1222,2026-05-13 08:02:44.742121+00 +1226,1246,2026-05-13 08:02:44.742121+00 +1226,1253,2026-05-13 08:02:44.742121+00 +1227,1216,2026-05-13 08:02:44.742121+00 +1227,1257,2026-05-13 08:02:44.742121+00 +1227,1220,2026-05-13 08:02:44.742121+00 +1227,1201,2026-05-13 08:02:44.742121+00 +1227,1242,2026-05-13 08:02:44.742121+00 +1228,1232,2026-05-13 08:02:44.742121+00 +1228,1227,2026-05-13 08:02:44.742121+00 +1228,1213,2026-05-13 08:02:44.742121+00 +1229,1266,2026-05-13 08:02:44.742121+00 +1229,1218,2026-05-13 08:02:44.742121+00 +1229,1214,2026-05-13 08:02:44.742121+00 +1230,1238,2026-05-13 08:02:44.742121+00 +1230,1237,2026-05-13 08:02:44.742121+00 +1230,1216,2026-05-13 08:02:44.742121+00 +1232,1228,2026-05-13 08:02:44.742121+00 +1232,1239,2026-05-13 08:02:44.742121+00 +1232,1211,2026-05-13 08:02:44.742121+00 +1233,1232,2026-05-13 08:02:44.742121+00 +1233,1211,2026-05-13 08:02:44.742121+00 +1233,1227,2026-05-13 08:02:44.742121+00 +1234,1258,2026-05-13 08:02:44.742121+00 +1234,1262,2026-05-13 08:02:44.742121+00 +1234,1216,2026-05-13 08:02:44.742121+00 +1235,1203,2026-05-13 08:02:44.742121+00 +1236,1212,2026-05-13 08:02:44.742121+00 +1236,1258,2026-05-13 08:02:44.742121+00 +1236,1237,2026-05-13 08:02:44.742121+00 +1237,1243,2026-05-13 08:02:44.742121+00 +1237,1201,2026-05-13 08:02:44.742121+00 +1237,1268,2026-05-13 08:02:44.742121+00 +1237,1246,2026-05-13 08:02:44.742121+00 +1238,1268,2026-05-13 08:02:44.742121+00 +1238,1247,2026-05-13 08:02:44.742121+00 +1238,1245,2026-05-13 08:02:44.742121+00 +1238,1234,2026-05-13 08:02:44.742121+00 +1239,1211,2026-05-13 08:02:44.742121+00 +1239,1199,2026-05-13 08:02:44.742121+00 +1239,1224,2026-05-13 08:02:44.742121+00 +1239,1210,2026-05-13 08:02:44.742121+00 +1239,1246,2026-05-13 08:02:44.742121+00 +1239,1267,2026-05-13 08:02:44.742121+00 +1239,1266,2026-05-13 08:02:44.742121+00 +1239,1236,2026-05-13 08:02:44.742121+00 +1240,1236,2026-05-13 08:02:44.742121+00 +1240,1271,2026-05-13 08:02:44.742121+00 +1241,1209,2026-05-13 08:02:44.742121+00 +1242,1221,2026-05-13 08:02:44.742121+00 +1243,1235,2026-05-13 08:02:44.742121+00 +1243,1251,2026-05-13 08:02:44.742121+00 +1243,1199,2026-05-13 08:02:44.742121+00 +1243,1207,2026-05-13 08:02:44.742121+00 +1244,1222,2026-05-13 08:02:44.742121+00 +1244,1235,2026-05-13 08:02:44.742121+00 +1244,1244,2026-05-13 08:02:44.742121+00 +1245,1249,2026-05-13 08:02:44.742121+00 +1245,1231,2026-05-13 08:02:44.742121+00 +1245,1264,2026-05-13 08:02:44.742121+00 +1246,1248,2026-05-13 08:02:44.742121+00 +1246,1194,2026-05-13 08:02:44.742121+00 +1246,1216,2026-05-13 08:02:44.742121+00 +1246,1258,2026-05-13 08:02:44.742121+00 +1246,1259,2026-05-13 08:02:44.742121+00 +1246,1246,2026-05-13 08:02:44.742121+00 +1247,1214,2026-05-13 08:02:44.742121+00 +1247,1207,2026-05-13 08:02:44.742121+00 +1247,1269,2026-05-13 08:02:44.742121+00 +1247,1245,2026-05-13 08:02:44.742121+00 +1248,1249,2026-05-13 08:02:44.742121+00 +1248,1211,2026-05-13 08:02:44.742121+00 +1248,1195,2026-05-13 08:02:44.742121+00 +1249,1269,2026-05-13 08:02:44.742121+00 +1250,1217,2026-05-13 08:02:44.742121+00 +1250,1213,2026-05-13 08:02:44.742121+00 +1250,1194,2026-05-13 08:02:44.742121+00 +1250,1205,2026-05-13 08:02:44.742121+00 +1251,1239,2026-05-13 08:02:44.742121+00 +1251,1223,2026-05-13 08:02:44.742121+00 +1252,1254,2026-05-13 08:02:44.742121+00 +1252,1269,2026-05-13 08:02:44.742121+00 +1252,1203,2026-05-13 08:02:44.742121+00 +1252,1237,2026-05-13 08:02:44.742121+00 +1253,1226,2026-05-13 08:02:44.742121+00 +1253,1232,2026-05-13 08:02:44.742121+00 +1253,1224,2026-05-13 08:02:44.742121+00 +1253,1265,2026-05-13 08:02:44.742121+00 +1254,1221,2026-05-13 08:02:44.742121+00 +1254,1251,2026-05-13 08:02:44.742121+00 +1254,1211,2026-05-13 08:02:44.742121+00 +1255,1249,2026-05-13 08:02:44.742121+00 +1255,1203,2026-05-13 08:02:44.742121+00 +1255,1229,2026-05-13 08:02:44.742121+00 +1255,1240,2026-05-13 08:02:44.742121+00 +1255,1244,2026-05-13 08:02:44.742121+00 +1255,1243,2026-05-13 08:02:44.742121+00 +1256,1259,2026-05-13 08:02:44.742121+00 +1256,1261,2026-05-13 08:02:44.742121+00 +1256,1241,2026-05-13 08:02:44.742121+00 +1256,1196,2026-05-13 08:02:44.742121+00 +1256,1255,2026-05-13 08:02:44.742121+00 +1258,1209,2026-05-13 08:02:44.742121+00 +1258,1249,2026-05-13 08:02:44.742121+00 +1258,1233,2026-05-13 08:02:44.742121+00 +1259,1204,2026-05-13 08:02:44.742121+00 +1259,1252,2026-05-13 08:02:44.742121+00 +1260,1234,2026-05-13 08:02:44.742121+00 +1260,1233,2026-05-13 08:02:44.742121+00 +1260,1239,2026-05-13 08:02:44.742121+00 +1260,1248,2026-05-13 08:02:44.742121+00 +1262,1211,2026-05-13 08:02:44.742121+00 +1263,1248,2026-05-13 08:02:44.742121+00 +1263,1234,2026-05-13 08:02:44.742121+00 +1264,1267,2026-05-13 08:02:44.742121+00 +1264,1257,2026-05-13 08:02:44.742121+00 +1264,1241,2026-05-13 08:02:44.742121+00 +1266,1220,2026-05-13 08:02:44.742121+00 +1266,1244,2026-05-13 08:02:44.742121+00 +1267,1270,2026-05-13 08:02:44.742121+00 +1267,1236,2026-05-13 08:02:44.742121+00 +1267,1224,2026-05-13 08:02:44.742121+00 +1267,1257,2026-05-13 08:02:44.742121+00 +1267,1217,2026-05-13 08:02:44.742121+00 +1267,1269,2026-05-13 08:02:44.742121+00 +1267,1225,2026-05-13 08:02:44.742121+00 +1268,1194,2026-05-13 08:02:44.742121+00 +1268,1269,2026-05-13 08:02:44.742121+00 +1269,1259,2026-05-13 08:02:44.742121+00 +1269,1235,2026-05-13 08:02:44.742121+00 +1271,1209,2026-05-13 08:02:44.742121+00 +1271,1224,2026-05-13 08:02:44.742121+00 +1272,1225,2026-05-13 08:02:44.742121+00 +1272,1204,2026-05-13 08:02:44.742121+00 +1272,1268,2026-05-13 08:02:44.742121+00 +1272,1234,2026-05-13 08:02:44.742121+00 +1272,1270,2026-05-13 08:02:44.742121+00 +1273,1227,2026-05-13 08:02:44.742121+00 +1273,1211,2026-05-13 08:02:44.742121+00 +1273,1244,2026-05-13 08:02:44.742121+00 +1274,1225,2026-05-13 08:02:44.742121+00 +1274,1267,2026-05-13 08:02:44.742121+00 +1275,1219,2026-05-13 08:02:44.742121+00 +1276,1241,2026-05-13 08:02:44.742121+00 +1276,1247,2026-05-13 08:02:44.742121+00 +1277,1214,2026-05-13 08:02:44.742121+00 +1277,1231,2026-05-13 08:02:44.742121+00 +1277,1218,2026-05-13 08:02:44.742121+00 +1278,1237,2026-05-13 08:02:44.742121+00 +1279,1228,2026-05-13 08:02:44.742121+00 +1280,1217,2026-05-13 08:02:44.742121+00 +1280,1269,2026-05-13 08:02:44.742121+00 +1282,1214,2026-05-13 08:02:44.742121+00 +1282,1253,2026-05-13 08:02:44.742121+00 +1283,1213,2026-05-13 08:02:44.742121+00 +1283,1254,2026-05-13 08:02:44.742121+00 +1286,1235,2026-05-13 08:02:44.742121+00 +1286,1226,2026-05-13 08:02:44.742121+00 +1286,1266,2026-05-13 08:02:44.742121+00 +1286,1197,2026-05-13 08:02:44.742121+00 +1287,1237,2026-05-13 08:02:44.742121+00 +1288,1207,2026-05-13 08:02:44.742121+00 +1289,1210,2026-05-13 08:02:44.742121+00 +1289,1198,2026-05-13 08:02:44.742121+00 +1289,1241,2026-05-13 08:02:44.742121+00 +1289,1194,2026-05-13 08:02:44.742121+00 +1289,1270,2026-05-13 08:02:44.742121+00 +1290,1198,2026-05-13 08:02:44.742121+00 +1290,1266,2026-05-13 08:02:44.742121+00 +1290,1199,2026-05-13 08:02:44.742121+00 +1291,1257,2026-05-13 08:02:44.742121+00 +1291,1197,2026-05-13 08:02:44.742121+00 +1291,1194,2026-05-13 08:02:44.742121+00 +1292,1242,2026-05-13 08:02:44.742121+00 +1292,1243,2026-05-13 08:02:44.742121+00 +1292,1239,2026-05-13 08:02:44.742121+00 +1292,1204,2026-05-13 08:02:44.742121+00 +1292,1237,2026-05-13 08:02:44.742121+00 +1292,1271,2026-05-13 08:02:44.742121+00 +1292,1227,2026-05-13 08:02:44.742121+00 +1292,1194,2026-05-13 08:02:44.742121+00 +1293,1251,2026-05-13 08:02:44.742121+00 +1293,1259,2026-05-13 08:02:44.742121+00 +1294,1247,2026-05-13 08:02:44.742121+00 +1295,1224,2026-05-13 08:02:44.742121+00 +1295,1248,2026-05-13 08:02:44.742121+00 +1296,1221,2026-05-13 08:02:44.742121+00 +1296,1271,2026-05-13 08:02:44.742121+00 +1297,1208,2026-05-13 08:02:44.742121+00 +1297,1261,2026-05-13 08:02:44.742121+00 +1297,1244,2026-05-13 08:02:44.742121+00 +1297,1227,2026-05-13 08:02:44.742121+00 +1297,1212,2026-05-13 08:02:44.742121+00 +1298,1231,2026-05-13 08:02:44.742121+00 +1298,1250,2026-05-13 08:02:44.742121+00 +1298,1242,2026-05-13 08:02:44.742121+00 +1298,1271,2026-05-13 08:02:44.742121+00 +1298,1249,2026-05-13 08:02:44.742121+00 +1299,1259,2026-05-13 08:02:44.742121+00 +1299,1209,2026-05-13 08:02:44.742121+00 +1299,1207,2026-05-13 08:02:44.742121+00 +1299,1227,2026-05-13 08:02:44.742121+00 +1299,1244,2026-05-13 08:02:44.742121+00 +1300,1234,2026-05-13 08:02:44.742121+00 +1300,1208,2026-05-13 08:02:44.742121+00 +1301,1262,2026-05-13 08:02:44.742121+00 +1301,1196,2026-05-13 08:02:44.742121+00 +1301,1258,2026-05-13 08:02:44.742121+00 +1301,1253,2026-05-13 08:02:44.742121+00 +1303,1219,2026-05-13 08:02:44.742121+00 +1303,1253,2026-05-13 08:02:44.742121+00 +1304,1228,2026-05-13 08:02:44.742121+00 +1304,1215,2026-05-13 08:02:44.742121+00 +1304,1194,2026-05-13 08:02:44.742121+00 +1305,1233,2026-05-13 08:02:44.742121+00 +1305,1264,2026-05-13 08:02:44.742121+00 +1305,1240,2026-05-13 08:02:44.742121+00 +1306,1250,2026-05-13 08:02:44.742121+00 +1306,1233,2026-05-13 08:02:44.742121+00 +1306,1225,2026-05-13 08:02:44.742121+00 +1309,1225,2026-05-13 08:02:44.742121+00 +1309,1234,2026-05-13 08:02:44.742121+00 +1309,1267,2026-05-13 08:02:44.742121+00 +1310,1196,2026-05-13 08:02:44.742121+00 +1310,1212,2026-05-13 08:02:44.742121+00 +1310,1269,2026-05-13 08:02:44.742121+00 +1311,1206,2026-05-13 08:02:44.742121+00 +1311,1236,2026-05-13 08:02:44.742121+00 +1311,1234,2026-05-13 08:02:44.742121+00 +1311,1246,2026-05-13 08:02:44.742121+00 +1312,1198,2026-05-13 08:02:44.742121+00 +1312,1207,2026-05-13 08:02:44.742121+00 +1312,1210,2026-05-13 08:02:44.742121+00 +1312,1241,2026-05-13 08:02:44.742121+00 +1315,1228,2026-05-13 08:02:44.742121+00 +1315,1211,2026-05-13 08:02:44.742121+00 +1315,1197,2026-05-13 08:02:44.742121+00 +1315,1232,2026-05-13 08:02:44.742121+00 +1316,1249,2026-05-13 08:02:44.742121+00 +1316,1267,2026-05-13 08:02:44.742121+00 +1316,1203,2026-05-13 08:02:44.742121+00 +1317,1229,2026-05-13 08:02:44.742121+00 +1317,1218,2026-05-13 08:02:44.742121+00 +1317,1209,2026-05-13 08:02:44.742121+00 +1318,1235,2026-05-13 08:02:44.742121+00 +1318,1252,2026-05-13 08:02:44.742121+00 +1319,1230,2026-05-13 08:02:44.742121+00 +1319,1228,2026-05-13 08:02:44.742121+00 +1319,1198,2026-05-13 08:02:44.742121+00 +1319,1243,2026-05-13 08:02:44.742121+00 +1320,1244,2026-05-13 08:02:44.742121+00 +1322,1251,2026-05-13 08:02:44.742121+00 +1324,1201,2026-05-13 08:02:44.742121+00 +1324,1228,2026-05-13 08:02:44.742121+00 +1324,1257,2026-05-13 08:02:44.742121+00 +1324,1203,2026-05-13 08:02:44.742121+00 +1324,1268,2026-05-13 08:02:44.742121+00 +1324,1225,2026-05-13 08:02:44.742121+00 +1324,1266,2026-05-13 08:02:44.742121+00 +1324,1204,2026-05-13 08:02:44.742121+00 +1325,1234,2026-05-13 08:02:44.742121+00 +1326,1194,2026-05-13 08:02:44.742121+00 +1327,1237,2026-05-13 08:02:44.742121+00 +1327,1201,2026-05-13 08:02:44.742121+00 +1327,1220,2026-05-13 08:02:44.742121+00 +1327,1239,2026-05-13 08:02:44.742121+00 +1327,1263,2026-05-13 08:02:44.742121+00 +1328,1216,2026-05-13 08:02:44.742121+00 +1328,1243,2026-05-13 08:02:44.742121+00 +1328,1262,2026-05-13 08:02:44.742121+00 +1328,1220,2026-05-13 08:02:44.742121+00 +1328,1205,2026-05-13 08:02:44.742121+00 +1329,1257,2026-05-13 08:02:44.742121+00 +1329,1202,2026-05-13 08:02:44.742121+00 +1329,1266,2026-05-13 08:02:44.742121+00 +1329,1232,2026-05-13 08:02:44.742121+00 +1329,1219,2026-05-13 08:02:44.742121+00 +1330,1229,2026-05-13 08:02:44.742121+00 +1331,1206,2026-05-13 08:02:44.742121+00 +1331,1265,2026-05-13 08:02:44.742121+00 +1331,1254,2026-05-13 08:02:44.742121+00 +1334,1233,2026-05-13 08:02:44.742121+00 +1334,1216,2026-05-13 08:02:44.742121+00 +1335,1194,2026-05-13 08:02:44.742121+00 +1335,1262,2026-05-13 08:02:44.742121+00 +1335,1206,2026-05-13 08:02:44.742121+00 +1335,1251,2026-05-13 08:02:44.742121+00 +1335,1267,2026-05-13 08:02:44.742121+00 +1335,1195,2026-05-13 08:02:44.742121+00 +1336,1250,2026-05-13 08:02:44.742121+00 +1336,1219,2026-05-13 08:02:44.742121+00 +1338,1232,2026-05-13 08:02:44.742121+00 +1338,1207,2026-05-13 08:02:44.742121+00 +1338,1239,2026-05-13 08:02:44.742121+00 +1338,1203,2026-05-13 08:02:44.742121+00 +1338,1254,2026-05-13 08:02:44.742121+00 +1338,1270,2026-05-13 08:02:44.742121+00 +1338,1221,2026-05-13 08:02:44.742121+00 +1339,1194,2026-05-13 08:02:44.742121+00 +1339,1270,2026-05-13 08:02:44.742121+00 +1339,1205,2026-05-13 08:02:44.742121+00 +1339,1220,2026-05-13 08:02:44.742121+00 +1340,1247,2026-05-13 08:02:44.742121+00 +1340,1198,2026-05-13 08:02:44.742121+00 +1341,1268,2026-05-13 08:02:44.742121+00 +1341,1252,2026-05-13 08:02:44.742121+00 +1341,1198,2026-05-13 08:02:44.742121+00 +1341,1203,2026-05-13 08:02:44.742121+00 +1343,1234,2026-05-13 08:02:44.742121+00 +1343,1223,2026-05-13 08:02:44.742121+00 +1343,1219,2026-05-13 08:02:44.742121+00 +1344,1254,2026-05-13 08:02:44.742121+00 +1344,1233,2026-05-13 08:02:44.742121+00 +1344,1205,2026-05-13 08:02:44.742121+00 +1344,1219,2026-05-13 08:02:44.742121+00 +1344,1195,2026-05-13 08:02:44.742121+00 +1344,1222,2026-05-13 08:02:44.742121+00 +1345,1231,2026-05-13 08:02:44.742121+00 +1345,1237,2026-05-13 08:02:44.742121+00 +1345,1257,2026-05-13 08:02:44.742121+00 +1345,1195,2026-05-13 08:02:44.742121+00 +1345,1201,2026-05-13 08:02:44.742121+00 +1346,1214,2026-05-13 08:02:44.742121+00 +1346,1224,2026-05-13 08:02:44.742121+00 +1347,1201,2026-05-13 08:02:44.742121+00 +1347,1207,2026-05-13 08:02:44.742121+00 +1348,1213,2026-05-13 08:02:44.742121+00 +1348,1234,2026-05-13 08:02:44.742121+00 +1350,1245,2026-05-13 08:02:44.742121+00 +1351,1264,2026-05-13 08:02:44.742121+00 +1352,1210,2026-05-13 08:02:44.742121+00 +1352,1229,2026-05-13 08:02:44.742121+00 +1352,1240,2026-05-13 08:02:44.742121+00 +1352,1230,2026-05-13 08:02:44.742121+00 +1353,1262,2026-05-13 08:02:44.742121+00 +1353,1199,2026-05-13 08:02:44.742121+00 +1353,1246,2026-05-13 08:02:44.742121+00 +1353,1251,2026-05-13 08:02:44.742121+00 +1354,1250,2026-05-13 08:02:44.742121+00 +1354,1269,2026-05-13 08:02:44.742121+00 +1355,1231,2026-05-13 08:02:44.742121+00 +1355,1209,2026-05-13 08:02:44.742121+00 +1355,1243,2026-05-13 08:02:44.742121+00 +1358,1263,2026-05-13 08:02:44.742121+00 +1358,1194,2026-05-13 08:02:44.742121+00 +1358,1217,2026-05-13 08:02:44.742121+00 +1358,1208,2026-05-13 08:02:44.742121+00 +1361,1228,2026-05-13 08:02:44.742121+00 +1361,1234,2026-05-13 08:02:44.742121+00 +1361,1259,2026-05-13 08:02:44.742121+00 +1363,1194,2026-05-13 08:02:44.742121+00 +1364,1201,2026-05-13 08:02:44.742121+00 +1364,1242,2026-05-13 08:02:44.742121+00 +1366,1216,2026-05-13 08:02:44.742121+00 +1366,1215,2026-05-13 08:02:44.742121+00 +1366,1256,2026-05-13 08:02:44.742121+00 +1367,1197,2026-05-13 08:02:44.742121+00 +1367,1224,2026-05-13 08:02:44.742121+00 +1367,1207,2026-05-13 08:02:44.742121+00 +1368,1194,2026-05-13 08:02:44.742121+00 +1368,1232,2026-05-13 08:02:44.742121+00 +1368,1196,2026-05-13 08:02:44.742121+00 +1368,1198,2026-05-13 08:02:44.742121+00 +1368,1261,2026-05-13 08:02:44.742121+00 +1368,1211,2026-05-13 08:02:44.742121+00 +1368,1221,2026-05-13 08:02:44.742121+00 +1369,1271,2026-05-13 08:02:44.742121+00 +1369,1258,2026-05-13 08:02:44.742121+00 +1370,1219,2026-05-13 08:02:44.742121+00 +1370,1234,2026-05-13 08:02:44.742121+00 +1372,1237,2026-05-13 08:02:44.742121+00 +1372,1199,2026-05-13 08:02:44.742121+00 +1372,1214,2026-05-13 08:02:44.742121+00 +1372,1203,2026-05-13 08:02:44.742121+00 +1373,1227,2026-05-13 08:02:44.742121+00 +1373,1229,2026-05-13 08:02:44.742121+00 +1373,1268,2026-05-13 08:02:44.742121+00 +1373,1247,2026-05-13 08:02:44.742121+00 +1373,1231,2026-05-13 08:02:44.742121+00 +1374,1253,2026-05-13 08:02:44.742121+00 +1374,1255,2026-05-13 08:02:44.742121+00 +1374,1228,2026-05-13 08:02:44.742121+00 +1374,1266,2026-05-13 08:02:44.742121+00 +1375,1220,2026-05-13 08:02:44.742121+00 +1375,1194,2026-05-13 08:02:44.742121+00 +1375,1265,2026-05-13 08:02:44.742121+00 +1376,1271,2026-05-13 08:02:44.742121+00 +1376,1267,2026-05-13 08:02:44.742121+00 +1376,1254,2026-05-13 08:02:44.742121+00 +1376,1230,2026-05-13 08:02:44.742121+00 +1377,1255,2026-05-13 08:02:44.742121+00 +1377,1208,2026-05-13 08:02:44.742121+00 +1377,1257,2026-05-13 08:02:44.742121+00 +1377,1251,2026-05-13 08:02:44.742121+00 +1378,1251,2026-05-13 08:02:44.742121+00 +1378,1195,2026-05-13 08:02:44.742121+00 +1379,1263,2026-05-13 08:02:44.742121+00 +1379,1220,2026-05-13 08:02:44.742121+00 +1381,1258,2026-05-13 08:02:44.742121+00 +1381,1246,2026-05-13 08:02:44.742121+00 +1381,1231,2026-05-13 08:02:44.742121+00 +1382,1267,2026-05-13 08:02:44.742121+00 +1382,1255,2026-05-13 08:02:44.742121+00 +1382,1258,2026-05-13 08:02:44.742121+00 +1382,1259,2026-05-13 08:02:44.742121+00 +1383,1250,2026-05-13 08:02:44.742121+00 +1383,1235,2026-05-13 08:02:44.742121+00 +1383,1232,2026-05-13 08:02:44.742121+00 +1383,1211,2026-05-13 08:02:44.742121+00 +1384,1252,2026-05-13 08:02:44.742121+00 +1384,1200,2026-05-13 08:02:44.742121+00 +1386,1257,2026-05-13 08:02:44.742121+00 +1386,1241,2026-05-13 08:02:44.742121+00 +1386,1203,2026-05-13 08:02:44.742121+00 +1387,1258,2026-05-13 08:02:44.742121+00 +1388,1260,2026-05-13 08:02:44.742121+00 +1388,1266,2026-05-13 08:02:44.742121+00 +1388,1239,2026-05-13 08:02:44.742121+00 +1389,1238,2026-05-13 08:02:44.742121+00 +1389,1227,2026-05-13 08:02:44.742121+00 +1390,1266,2026-05-13 08:02:44.742121+00 +1391,1251,2026-05-13 08:02:44.742121+00 +1392,1232,2026-05-13 08:02:44.742121+00 +1392,1208,2026-05-13 08:02:44.742121+00 +1393,1269,2026-05-13 08:02:44.742121+00 +1394,1228,2026-05-13 08:02:44.742121+00 +1394,1267,2026-05-13 08:02:44.742121+00 +1394,1195,2026-05-13 08:02:44.742121+00 +1394,1251,2026-05-13 08:02:44.742121+00 +1395,1235,2026-05-13 08:02:44.742121+00 +1395,1260,2026-05-13 08:02:44.742121+00 +1395,1237,2026-05-13 08:02:44.742121+00 +1396,1237,2026-05-13 08:02:44.742121+00 +1396,1254,2026-05-13 08:02:44.742121+00 +1397,1213,2026-05-13 08:02:44.742121+00 +1398,1198,2026-05-13 08:02:44.742121+00 +1398,1246,2026-05-13 08:02:44.742121+00 +1398,1195,2026-05-13 08:02:44.742121+00 +1398,1268,2026-05-13 08:02:44.742121+00 +1399,1271,2026-05-13 08:02:44.742121+00 +1400,1199,2026-05-13 08:02:44.742121+00 +1400,1229,2026-05-13 08:02:44.742121+00 +1400,1194,2026-05-13 08:02:44.742121+00 +1400,1211,2026-05-13 08:02:44.742121+00 +1403,1244,2026-05-13 08:02:44.742121+00 +1403,1254,2026-05-13 08:02:44.742121+00 +1403,1253,2026-05-13 08:02:44.742121+00 +1404,1235,2026-05-13 08:02:44.742121+00 +1404,1249,2026-05-13 08:02:44.742121+00 +1404,1212,2026-05-13 08:02:44.742121+00 +1407,1224,2026-05-13 08:02:44.742121+00 +1407,1261,2026-05-13 08:02:44.742121+00 +1407,1236,2026-05-13 08:02:44.742121+00 +1410,1239,2026-05-13 08:02:44.742121+00 +1410,1208,2026-05-13 08:02:44.742121+00 +1410,1234,2026-05-13 08:02:44.742121+00 +1410,1198,2026-05-13 08:02:44.742121+00 +1413,1263,2026-05-13 08:02:44.742121+00 +1413,1250,2026-05-13 08:02:44.742121+00 +1413,1223,2026-05-13 08:02:44.742121+00 +1413,1232,2026-05-13 08:02:44.742121+00 +1414,1222,2026-05-13 08:02:44.742121+00 +1415,1228,2026-05-13 08:02:44.742121+00 +1415,1245,2026-05-13 08:02:44.742121+00 +1415,1224,2026-05-13 08:02:44.742121+00 +1415,1229,2026-05-13 08:02:44.742121+00 +1417,1254,2026-05-13 08:02:44.742121+00 +1417,1261,2026-05-13 08:02:44.742121+00 +1418,1215,2026-05-13 08:02:44.742121+00 +1418,1198,2026-05-13 08:02:44.742121+00 +1419,1221,2026-05-13 08:02:44.742121+00 +1420,1266,2026-05-13 08:02:44.742121+00 +1421,1200,2026-05-13 08:02:44.742121+00 +1421,1245,2026-05-13 08:02:44.742121+00 +1421,1256,2026-05-13 08:02:44.742121+00 +1423,1224,2026-05-13 08:02:44.742121+00 +1423,1269,2026-05-13 08:02:44.742121+00 +1423,1246,2026-05-13 08:02:44.742121+00 +1423,1230,2026-05-13 08:02:44.742121+00 +1424,1259,2026-05-13 08:02:44.742121+00 +1424,1224,2026-05-13 08:02:44.742121+00 +1426,1222,2026-05-13 08:02:44.742121+00 +1426,1258,2026-05-13 08:02:44.742121+00 +1426,1210,2026-05-13 08:02:44.742121+00 +1426,1265,2026-05-13 08:02:44.742121+00 +1426,1266,2026-05-13 08:02:44.742121+00 +1426,1220,2026-05-13 08:02:44.742121+00 +1429,1206,2026-05-13 08:02:44.742121+00 +1429,1250,2026-05-13 08:02:44.742121+00 +1429,1202,2026-05-13 08:02:44.742121+00 +1431,1219,2026-05-13 08:02:44.742121+00 +1431,1256,2026-05-13 08:02:44.742121+00 +1431,1239,2026-05-13 08:02:44.742121+00 +1431,1259,2026-05-13 08:02:44.742121+00 +1431,1264,2026-05-13 08:02:44.742121+00 +1431,1199,2026-05-13 08:02:44.742121+00 +1431,1194,2026-05-13 08:02:44.742121+00 +1432,1255,2026-05-13 08:02:44.742121+00 +1432,1227,2026-05-13 08:02:44.742121+00 +1433,1199,2026-05-13 08:02:44.742121+00 +1433,1209,2026-05-13 08:02:44.742121+00 +1433,1201,2026-05-13 08:02:44.742121+00 +1433,1211,2026-05-13 08:02:44.742121+00 +1433,1241,2026-05-13 08:02:44.742121+00 +1434,1241,2026-05-13 08:02:44.742121+00 +1434,1213,2026-05-13 08:02:44.742121+00 +1434,1261,2026-05-13 08:02:44.742121+00 +1435,1205,2026-05-13 08:02:44.742121+00 +1435,1239,2026-05-13 08:02:44.742121+00 +1437,1258,2026-05-13 08:02:44.742121+00 +1437,1266,2026-05-13 08:02:44.742121+00 +1437,1233,2026-05-13 08:02:44.742121+00 +1439,1215,2026-05-13 08:02:44.742121+00 +1439,1261,2026-05-13 08:02:44.742121+00 +1439,1228,2026-05-13 08:02:44.742121+00 +1439,1242,2026-05-13 08:02:44.742121+00 +1439,1218,2026-05-13 08:02:44.742121+00 +1440,1195,2026-05-13 08:02:44.742121+00 +1440,1224,2026-05-13 08:02:44.742121+00 +1442,1232,2026-05-13 08:02:44.742121+00 +1442,1199,2026-05-13 08:02:44.742121+00 +1443,1231,2026-05-13 08:02:44.742121+00 +1443,1225,2026-05-13 08:02:44.742121+00 +1444,1197,2026-05-13 08:02:44.742121+00 +1444,1218,2026-05-13 08:02:44.742121+00 +1444,1204,2026-05-13 08:02:44.742121+00 +1444,1257,2026-05-13 08:02:44.742121+00 +1444,1215,2026-05-13 08:02:44.742121+00 +1444,1245,2026-05-13 08:02:44.742121+00 +1445,1263,2026-05-13 08:02:44.742121+00 +1445,1227,2026-05-13 08:02:44.742121+00 +1445,1221,2026-05-13 08:02:44.742121+00 +1445,1200,2026-05-13 08:02:44.742121+00 +1446,1246,2026-05-13 08:02:44.742121+00 +1446,1222,2026-05-13 08:02:44.742121+00 +1446,1225,2026-05-13 08:02:44.742121+00 +1447,1227,2026-05-13 08:02:44.742121+00 +1447,1258,2026-05-13 08:02:44.742121+00 +1447,1201,2026-05-13 08:02:44.742121+00 +1448,1215,2026-05-13 08:02:44.742121+00 +1448,1261,2026-05-13 08:02:44.742121+00 +1448,1200,2026-05-13 08:02:44.742121+00 +1450,1198,2026-05-13 08:02:44.742121+00 +1450,1217,2026-05-13 08:02:44.742121+00 +1450,1269,2026-05-13 08:02:44.742121+00 +1451,1266,2026-05-13 08:02:44.742121+00 +1452,1244,2026-05-13 08:02:44.742121+00 +1452,1209,2026-05-13 08:02:44.742121+00 +1452,1255,2026-05-13 08:02:44.742121+00 +1453,1268,2026-05-13 08:02:44.742121+00 +1453,1199,2026-05-13 08:02:44.742121+00 +1453,1210,2026-05-13 08:02:44.742121+00 +1454,1259,2026-05-13 08:02:44.742121+00 +1454,1238,2026-05-13 08:02:44.742121+00 +1455,1219,2026-05-13 08:02:44.742121+00 +1455,1255,2026-05-13 08:02:44.742121+00 +1455,1224,2026-05-13 08:02:44.742121+00 +1456,1204,2026-05-13 08:02:44.742121+00 +1456,1207,2026-05-13 08:02:44.742121+00 +1457,1209,2026-05-13 08:02:44.742121+00 +1457,1251,2026-05-13 08:02:44.742121+00 +1458,1218,2026-05-13 08:02:44.742121+00 +1458,1222,2026-05-13 08:02:44.742121+00 +1458,1241,2026-05-13 08:02:44.742121+00 +1459,1262,2026-05-13 08:02:44.742121+00 +1459,1245,2026-05-13 08:02:44.742121+00 +1459,1196,2026-05-13 08:02:44.742121+00 +1459,1267,2026-05-13 08:02:44.742121+00 +1459,1265,2026-05-13 08:02:44.742121+00 +1459,1253,2026-05-13 08:02:44.742121+00 +1460,1246,2026-05-13 08:02:44.742121+00 +1460,1209,2026-05-13 08:02:44.742121+00 +1460,1270,2026-05-13 08:02:44.742121+00 +1460,1267,2026-05-13 08:02:44.742121+00 +1461,1234,2026-05-13 08:02:44.742121+00 +1461,1236,2026-05-13 08:02:44.742121+00 +1461,1200,2026-05-13 08:02:44.742121+00 +1462,1216,2026-05-13 08:02:44.742121+00 +1462,1197,2026-05-13 08:02:44.742121+00 +1462,1247,2026-05-13 08:02:44.742121+00 +1462,1223,2026-05-13 08:02:44.742121+00 +1462,1234,2026-05-13 08:02:44.742121+00 +1463,1245,2026-05-13 08:02:44.742121+00 +1463,1237,2026-05-13 08:02:44.742121+00 +1463,1220,2026-05-13 08:02:44.742121+00 +1464,1224,2026-05-13 08:02:44.742121+00 +1465,1259,2026-05-13 08:02:44.742121+00 +1465,1238,2026-05-13 08:02:44.742121+00 +1465,1213,2026-05-13 08:02:44.742121+00 +1465,1271,2026-05-13 08:02:44.742121+00 +1466,1196,2026-05-13 08:02:44.742121+00 +1466,1242,2026-05-13 08:02:44.742121+00 +1467,1265,2026-05-13 08:02:44.742121+00 +1467,1247,2026-05-13 08:02:44.742121+00 +1468,1211,2026-05-13 08:02:44.742121+00 +1469,1232,2026-05-13 08:02:44.742121+00 +1469,1247,2026-05-13 08:02:44.742121+00 +1469,1204,2026-05-13 08:02:44.742121+00 +1469,1263,2026-05-13 08:02:44.742121+00 +1470,1197,2026-05-13 08:02:44.742121+00 +1470,1265,2026-05-13 08:02:44.742121+00 +1471,1252,2026-05-13 08:02:44.742121+00 +1471,1267,2026-05-13 08:02:44.742121+00 +1471,1265,2026-05-13 08:02:44.742121+00 +1472,1209,2026-05-13 08:02:44.742121+00 +1473,1238,2026-05-13 08:02:44.742121+00 +1473,1216,2026-05-13 08:02:44.742121+00 +1473,1266,2026-05-13 08:02:44.742121+00 +1473,1222,2026-05-13 08:02:44.742121+00 +1474,1211,2026-05-13 08:02:44.742121+00 +1474,1214,2026-05-13 08:02:44.742121+00 +1474,1270,2026-05-13 08:02:44.742121+00 +1474,1247,2026-05-13 08:02:44.742121+00 +1475,1270,2026-05-13 08:02:44.742121+00 +1475,1201,2026-05-13 08:02:44.742121+00 +1475,1250,2026-05-13 08:02:44.742121+00 +1475,1271,2026-05-13 08:02:44.742121+00 +1475,1262,2026-05-13 08:02:44.742121+00 +1475,1245,2026-05-13 08:02:44.742121+00 +1477,1209,2026-05-13 08:02:44.742121+00 +1477,1259,2026-05-13 08:02:44.742121+00 +1477,1229,2026-05-13 08:02:44.742121+00 +1477,1208,2026-05-13 08:02:44.742121+00 +1477,1196,2026-05-13 08:02:44.742121+00 +1478,1216,2026-05-13 08:02:44.742121+00 +1478,1254,2026-05-13 08:02:44.742121+00 +1480,1205,2026-05-13 08:02:44.742121+00 +1480,1228,2026-05-13 08:02:44.742121+00 +1481,1206,2026-05-13 08:02:44.742121+00 +1482,1219,2026-05-13 08:02:44.742121+00 +1482,1245,2026-05-13 08:02:44.742121+00 +1482,1255,2026-05-13 08:02:44.742121+00 +1483,1214,2026-05-13 08:02:44.742121+00 +1483,1219,2026-05-13 08:02:44.742121+00 +1484,1259,2026-05-13 08:02:44.742121+00 +1484,1194,2026-05-13 08:02:44.742121+00 +1486,1242,2026-05-13 08:02:44.742121+00 +1486,1221,2026-05-13 08:02:44.742121+00 +1486,1210,2026-05-13 08:02:44.742121+00 +1486,1215,2026-05-13 08:02:44.742121+00 +1486,1241,2026-05-13 08:02:44.742121+00 +1486,1225,2026-05-13 08:02:44.742121+00 +1487,1244,2026-05-13 08:02:44.742121+00 +1487,1271,2026-05-13 08:02:44.742121+00 +1488,1239,2026-05-13 08:02:44.742121+00 +1489,1254,2026-05-13 08:02:44.742121+00 +1489,1244,2026-05-13 08:02:44.742121+00 +1489,1260,2026-05-13 08:02:44.742121+00 +1490,1220,2026-05-13 08:02:44.742121+00 +1491,1242,2026-05-13 08:02:44.742121+00 +1491,1217,2026-05-13 08:02:44.742121+00 +1491,1243,2026-05-13 08:02:44.742121+00 +1492,1238,2026-05-13 08:02:44.742121+00 +1493,1231,2026-05-13 08:02:44.742121+00 +1494,1212,2026-05-13 08:02:44.742121+00 +1494,1262,2026-05-13 08:02:44.742121+00 +1494,1254,2026-05-13 08:02:44.742121+00 +1494,1224,2026-05-13 08:02:44.742121+00 +1494,1197,2026-05-13 08:02:44.742121+00 +1496,1213,2026-05-13 08:02:44.742121+00 +1496,1246,2026-05-13 08:02:44.742121+00 +1498,1247,2026-05-13 08:02:44.742121+00 +1498,1249,2026-05-13 08:02:44.742121+00 +1498,1229,2026-05-13 08:02:44.742121+00 +1498,1209,2026-05-13 08:02:44.742121+00 +1498,1244,2026-05-13 08:02:44.742121+00 +1499,1240,2026-05-13 08:02:44.742121+00 +1499,1215,2026-05-13 08:02:44.742121+00 +1499,1228,2026-05-13 08:02:44.742121+00 +1499,1237,2026-05-13 08:02:44.742121+00 +1500,1255,2026-05-13 08:02:44.742121+00 +1500,1263,2026-05-13 08:02:44.742121+00 +1500,1246,2026-05-13 08:02:44.742121+00 +1500,1262,2026-05-13 08:02:44.742121+00 +1501,1268,2026-05-13 08:02:44.742121+00 +1501,1261,2026-05-13 08:02:44.742121+00 +1501,1219,2026-05-13 08:02:44.742121+00 +1503,1244,2026-05-13 08:02:44.742121+00 +1503,1230,2026-05-13 08:02:44.742121+00 +1503,1207,2026-05-13 08:02:44.742121+00 +1504,1258,2026-05-13 08:02:44.742121+00 +1504,1197,2026-05-13 08:02:44.742121+00 +1505,1202,2026-05-13 08:02:44.742121+00 +1505,1229,2026-05-13 08:02:44.742121+00 +1505,1235,2026-05-13 08:02:44.742121+00 +1507,1271,2026-05-13 08:02:44.742121+00 +1507,1261,2026-05-13 08:02:44.742121+00 +1508,1203,2026-05-13 08:02:44.742121+00 +1508,1216,2026-05-13 08:02:44.742121+00 +1509,1198,2026-05-13 08:02:44.742121+00 +1509,1244,2026-05-13 08:02:44.742121+00 +1511,1198,2026-05-13 08:02:44.742121+00 +1511,1230,2026-05-13 08:02:44.742121+00 +1511,1258,2026-05-13 08:02:44.742121+00 +1511,1236,2026-05-13 08:02:44.742121+00 +1512,1241,2026-05-13 08:02:44.742121+00 +1512,1248,2026-05-13 08:02:44.742121+00 +1512,1217,2026-05-13 08:02:44.742121+00 +1513,1232,2026-05-13 08:02:44.742121+00 +1514,1221,2026-05-13 08:02:44.742121+00 +1514,1220,2026-05-13 08:02:44.742121+00 +1514,1269,2026-05-13 08:02:44.742121+00 +1516,1266,2026-05-13 08:02:44.742121+00 +1517,1262,2026-05-13 08:02:44.742121+00 +1517,1271,2026-05-13 08:02:44.742121+00 +1517,1263,2026-05-13 08:02:44.742121+00 +1517,1231,2026-05-13 08:02:44.742121+00 +1517,1255,2026-05-13 08:02:44.742121+00 +1517,1249,2026-05-13 08:02:44.742121+00 +1517,1197,2026-05-13 08:02:44.742121+00 +1518,1244,2026-05-13 08:02:44.742121+00 +1518,1262,2026-05-13 08:02:44.742121+00 +1519,1231,2026-05-13 08:02:44.742121+00 +1519,1203,2026-05-13 08:02:44.742121+00 +1519,1262,2026-05-13 08:02:44.742121+00 +1519,1235,2026-05-13 08:02:44.742121+00 +1519,1227,2026-05-13 08:02:44.742121+00 +1520,1233,2026-05-13 08:02:44.742121+00 +1520,1236,2026-05-13 08:02:44.742121+00 +1520,1237,2026-05-13 08:02:44.742121+00 +1520,1241,2026-05-13 08:02:44.742121+00 +1521,1198,2026-05-13 08:02:44.742121+00 +1521,1238,2026-05-13 08:02:44.742121+00 +1521,1254,2026-05-13 08:02:44.742121+00 +1524,1200,2026-05-13 08:02:44.742121+00 +1524,1210,2026-05-13 08:02:44.742121+00 +1524,1223,2026-05-13 08:02:44.742121+00 +1524,1266,2026-05-13 08:02:44.742121+00 +1525,1227,2026-05-13 08:02:44.742121+00 +1526,1258,2026-05-13 08:02:44.742121+00 +1526,1253,2026-05-13 08:02:44.742121+00 +1526,1267,2026-05-13 08:02:44.742121+00 +1528,1198,2026-05-13 08:02:44.742121+00 +1528,1200,2026-05-13 08:02:44.742121+00 +1528,1264,2026-05-13 08:02:44.742121+00 +1528,1233,2026-05-13 08:02:44.742121+00 +1529,1201,2026-05-13 08:02:44.742121+00 +1529,1216,2026-05-13 08:02:44.742121+00 +1529,1240,2026-05-13 08:02:44.742121+00 +1529,1205,2026-05-13 08:02:44.742121+00 +1530,1218,2026-05-13 08:02:44.742121+00 +1530,1215,2026-05-13 08:02:44.742121+00 +1530,1268,2026-05-13 08:02:44.742121+00 +1531,1237,2026-05-13 08:02:44.742121+00 +1532,1264,2026-05-13 08:02:44.742121+00 +1532,1246,2026-05-13 08:02:44.742121+00 +1532,1258,2026-05-13 08:02:44.742121+00 +1532,1261,2026-05-13 08:02:44.742121+00 +1532,1209,2026-05-13 08:02:44.742121+00 +1533,1268,2026-05-13 08:02:44.742121+00 +1533,1199,2026-05-13 08:02:44.742121+00 +1533,1242,2026-05-13 08:02:44.742121+00 +1534,1215,2026-05-13 08:02:44.742121+00 +1535,1228,2026-05-13 08:02:44.742121+00 +1535,1227,2026-05-13 08:02:44.742121+00 +1536,1253,2026-05-13 08:02:44.742121+00 +1536,1250,2026-05-13 08:02:44.742121+00 +1537,1269,2026-05-13 08:02:44.742121+00 +1537,1212,2026-05-13 08:02:44.742121+00 +1537,1239,2026-05-13 08:02:44.742121+00 +1537,1221,2026-05-13 08:02:44.742121+00 +1538,1235,2026-05-13 08:02:44.742121+00 +1539,1254,2026-05-13 08:02:44.742121+00 +1539,1219,2026-05-13 08:02:44.742121+00 +1539,1225,2026-05-13 08:02:44.742121+00 +1540,1265,2026-05-13 08:02:44.742121+00 +1540,1266,2026-05-13 08:02:44.742121+00 +1540,1259,2026-05-13 08:02:44.742121+00 +1541,1259,2026-05-13 08:02:44.742121+00 +1541,1208,2026-05-13 08:02:44.742121+00 +1541,1221,2026-05-13 08:02:44.742121+00 +1541,1196,2026-05-13 08:02:44.742121+00 +1541,1203,2026-05-13 08:02:44.742121+00 +1541,1222,2026-05-13 08:02:44.742121+00 +1542,1199,2026-05-13 08:02:44.742121+00 +1543,1263,2026-05-13 08:02:44.742121+00 +1544,1225,2026-05-13 08:02:44.742121+00 +1544,1268,2026-05-13 08:02:44.742121+00 +1544,1255,2026-05-13 08:02:44.742121+00 +1545,1237,2026-05-13 08:02:44.742121+00 +1545,1203,2026-05-13 08:02:44.742121+00 +1545,1268,2026-05-13 08:02:44.742121+00 +1546,1264,2026-05-13 08:02:44.742121+00 +1546,1254,2026-05-13 08:02:44.742121+00 +1546,1251,2026-05-13 08:02:44.742121+00 +1546,1218,2026-05-13 08:02:44.742121+00 +1548,1211,2026-05-13 08:02:44.742121+00 +1548,1236,2026-05-13 08:02:44.742121+00 +1549,1200,2026-05-13 08:02:44.742121+00 +1551,1210,2026-05-13 08:02:44.742121+00 +1551,1222,2026-05-13 08:02:44.742121+00 +1551,1254,2026-05-13 08:02:44.742121+00 +1551,1194,2026-05-13 08:02:44.742121+00 +1551,1205,2026-05-13 08:02:44.742121+00 +1552,1211,2026-05-13 08:02:44.742121+00 +1552,1251,2026-05-13 08:02:44.742121+00 +1552,1270,2026-05-13 08:02:44.742121+00 +1552,1223,2026-05-13 08:02:44.742121+00 +1554,1198,2026-05-13 08:02:44.742121+00 +1554,1216,2026-05-13 08:02:44.742121+00 +1554,1220,2026-05-13 08:02:44.742121+00 +1554,1222,2026-05-13 08:02:44.742121+00 +1555,1213,2026-05-13 08:02:44.742121+00 +1555,1233,2026-05-13 08:02:44.742121+00 +1555,1200,2026-05-13 08:02:44.742121+00 +1555,1217,2026-05-13 08:02:44.742121+00 +1556,1237,2026-05-13 08:02:44.742121+00 +1556,1261,2026-05-13 08:02:44.742121+00 +1557,1231,2026-05-13 08:02:44.742121+00 +1557,1264,2026-05-13 08:02:44.742121+00 +1557,1202,2026-05-13 08:02:44.742121+00 +1557,1222,2026-05-13 08:02:44.742121+00 +1559,1219,2026-05-13 08:02:44.742121+00 +1559,1269,2026-05-13 08:02:44.742121+00 +1560,1252,2026-05-13 08:02:44.742121+00 +1560,1250,2026-05-13 08:02:44.742121+00 +1561,1225,2026-05-13 08:02:44.742121+00 +1562,1194,2026-05-13 08:02:44.742121+00 +1562,1216,2026-05-13 08:02:44.742121+00 +1562,1263,2026-05-13 08:02:44.742121+00 +1562,1251,2026-05-13 08:02:44.742121+00 +1563,1194,2026-05-13 08:02:44.742121+00 +1563,1229,2026-05-13 08:02:44.742121+00 +1563,1228,2026-05-13 08:02:44.742121+00 +1564,1216,2026-05-13 08:02:44.742121+00 +1565,1255,2026-05-13 08:02:44.742121+00 +1565,1232,2026-05-13 08:02:44.742121+00 +1565,1260,2026-05-13 08:02:44.742121+00 +1565,1251,2026-05-13 08:02:44.742121+00 +1566,1211,2026-05-13 08:02:44.742121+00 +1566,1271,2026-05-13 08:02:44.742121+00 +1566,1268,2026-05-13 08:02:44.742121+00 +1567,1205,2026-05-13 08:02:44.742121+00 +1567,1240,2026-05-13 08:02:44.742121+00 +1567,1228,2026-05-13 08:02:44.742121+00 +1568,1250,2026-05-13 08:02:44.742121+00 +1568,1202,2026-05-13 08:02:44.742121+00 +1568,1199,2026-05-13 08:02:44.742121+00 +1568,1211,2026-05-13 08:02:44.742121+00 +1568,1238,2026-05-13 08:02:44.742121+00 +1569,1196,2026-05-13 08:02:44.742121+00 +1569,1237,2026-05-13 08:02:44.742121+00 +1569,1247,2026-05-13 08:02:44.742121+00 +1570,1264,2026-05-13 08:02:44.742121+00 +1570,1200,2026-05-13 08:02:44.742121+00 +1570,1234,2026-05-13 08:02:44.742121+00 +1570,1238,2026-05-13 08:02:44.742121+00 +1570,1255,2026-05-13 08:02:44.742121+00 +1570,1218,2026-05-13 08:02:44.742121+00 +1572,1203,2026-05-13 08:02:44.742121+00 +1572,1256,2026-05-13 08:02:44.742121+00 +1572,1249,2026-05-13 08:02:44.742121+00 +1572,1209,2026-05-13 08:02:44.742121+00 +1572,1213,2026-05-13 08:02:44.742121+00 +1572,1214,2026-05-13 08:02:44.742121+00 +1572,1252,2026-05-13 08:02:44.742121+00 +1573,1206,2026-05-13 08:02:44.742121+00 +1574,1265,2026-05-13 08:02:44.742121+00 +1574,1257,2026-05-13 08:02:44.742121+00 +1576,1266,2026-05-13 08:02:44.742121+00 +1576,1202,2026-05-13 08:02:44.742121+00 +1576,1222,2026-05-13 08:02:44.742121+00 +1577,1240,2026-05-13 08:02:44.742121+00 +1577,1198,2026-05-13 08:02:44.742121+00 +1577,1233,2026-05-13 08:02:44.742121+00 +1577,1257,2026-05-13 08:02:44.742121+00 +1578,1243,2026-05-13 08:02:44.742121+00 +1578,1241,2026-05-13 08:02:44.742121+00 +1580,1201,2026-05-13 08:02:44.742121+00 +1580,1256,2026-05-13 08:02:44.742121+00 +1580,1251,2026-05-13 08:02:44.742121+00 +1581,1225,2026-05-13 08:02:44.742121+00 +1581,1237,2026-05-13 08:02:44.742121+00 +1581,1250,2026-05-13 08:02:44.742121+00 +1582,1194,2026-05-13 08:02:44.742121+00 +1583,1253,2026-05-13 08:02:44.742121+00 +1583,1236,2026-05-13 08:02:44.742121+00 +1584,1235,2026-05-13 08:02:44.742121+00 +1584,1263,2026-05-13 08:02:44.742121+00 +1584,1196,2026-05-13 08:02:44.742121+00 +1585,1197,2026-05-13 08:02:44.742121+00 +1585,1214,2026-05-13 08:02:44.742121+00 +1586,1228,2026-05-13 08:02:44.742121+00 +1586,1203,2026-05-13 08:02:44.742121+00 +1587,1258,2026-05-13 08:02:44.742121+00 +1589,1228,2026-05-13 08:02:44.742121+00 +1589,1247,2026-05-13 08:02:44.742121+00 +1589,1223,2026-05-13 08:02:44.742121+00 +1589,1200,2026-05-13 08:02:44.742121+00 +1589,1208,2026-05-13 08:02:44.742121+00 +1589,1215,2026-05-13 08:02:44.742121+00 +1590,1199,2026-05-13 08:02:44.742121+00 +1590,1244,2026-05-13 08:02:44.742121+00 +1590,1209,2026-05-13 08:02:44.742121+00 +1591,1207,2026-05-13 08:02:44.742121+00 +1591,1258,2026-05-13 08:02:44.742121+00 +1591,1271,2026-05-13 08:02:44.742121+00 +1592,1264,2026-05-13 08:02:44.742121+00 +1592,1237,2026-05-13 08:02:44.742121+00 +1594,1214,2026-05-13 08:02:44.742121+00 +1594,1220,2026-05-13 08:02:44.742121+00 +1594,1200,2026-05-13 08:02:44.742121+00 +1594,1246,2026-05-13 08:02:44.742121+00 +1594,1248,2026-05-13 08:02:44.742121+00 +1595,1240,2026-05-13 08:02:44.742121+00 +1595,1229,2026-05-13 08:02:44.742121+00 +1595,1212,2026-05-13 08:02:44.742121+00 +1595,1249,2026-05-13 08:02:44.742121+00 +1596,1195,2026-05-13 08:02:44.742121+00 +1596,1250,2026-05-13 08:02:44.742121+00 +1596,1261,2026-05-13 08:02:44.742121+00 +1596,1269,2026-05-13 08:02:44.742121+00 +1596,1257,2026-05-13 08:02:44.742121+00 +1597,1225,2026-05-13 08:02:44.742121+00 +1597,1251,2026-05-13 08:02:44.742121+00 +1599,1198,2026-05-13 08:02:44.742121+00 +1600,1218,2026-05-13 08:02:44.742121+00 +1600,1250,2026-05-13 08:02:44.742121+00 +1600,1259,2026-05-13 08:02:44.742121+00 +1600,1254,2026-05-13 08:02:44.742121+00 +1600,1263,2026-05-13 08:02:44.742121+00 +1601,1201,2026-05-13 08:02:44.742121+00 +1601,1251,2026-05-13 08:02:44.742121+00 +1601,1226,2026-05-13 08:02:44.742121+00 +1602,1233,2026-05-13 08:02:44.742121+00 +1602,1246,2026-05-13 08:02:44.742121+00 +1602,1259,2026-05-13 08:02:44.742121+00 +1602,1263,2026-05-13 08:02:44.742121+00 +1602,1266,2026-05-13 08:02:44.742121+00 +1602,1203,2026-05-13 08:02:44.742121+00 +1602,1218,2026-05-13 08:02:44.742121+00 +1603,1197,2026-05-13 08:02:44.742121+00 +1603,1245,2026-05-13 08:02:44.742121+00 +1603,1200,2026-05-13 08:02:44.742121+00 +1603,1254,2026-05-13 08:02:44.742121+00 +1603,1201,2026-05-13 08:02:44.742121+00 +1604,1203,2026-05-13 08:02:44.742121+00 +1604,1271,2026-05-13 08:02:44.742121+00 +1604,1244,2026-05-13 08:02:44.742121+00 +1605,1244,2026-05-13 08:02:44.742121+00 +1605,1229,2026-05-13 08:02:44.742121+00 +1605,1267,2026-05-13 08:02:44.742121+00 +1606,1226,2026-05-13 08:02:44.742121+00 +1606,1211,2026-05-13 08:02:44.742121+00 +1606,1198,2026-05-13 08:02:44.742121+00 +1606,1256,2026-05-13 08:02:44.742121+00 +1607,1206,2026-05-13 08:02:44.742121+00 +1608,1198,2026-05-13 08:02:44.742121+00 +1608,1205,2026-05-13 08:02:44.742121+00 +1608,1237,2026-05-13 08:02:44.742121+00 +1608,1255,2026-05-13 08:02:44.742121+00 +1608,1240,2026-05-13 08:02:44.742121+00 +1608,1213,2026-05-13 08:02:44.742121+00 +1609,1269,2026-05-13 08:02:44.742121+00 +1609,1260,2026-05-13 08:02:44.742121+00 +1609,1199,2026-05-13 08:02:44.742121+00 +1609,1222,2026-05-13 08:02:44.742121+00 +1610,1248,2026-05-13 08:02:44.742121+00 +1610,1267,2026-05-13 08:02:44.742121+00 +1611,1259,2026-05-13 08:02:44.742121+00 +1613,1198,2026-05-13 08:02:44.742121+00 +1614,1257,2026-05-13 08:02:44.742121+00 +1614,1232,2026-05-13 08:02:44.742121+00 +1614,1250,2026-05-13 08:02:44.742121+00 +1617,1210,2026-05-13 08:02:44.742121+00 +1617,1238,2026-05-13 08:02:44.742121+00 +1617,1258,2026-05-13 08:02:44.742121+00 +1618,1256,2026-05-13 08:02:44.742121+00 +1618,1197,2026-05-13 08:02:44.742121+00 +1618,1229,2026-05-13 08:02:44.742121+00 +1618,1269,2026-05-13 08:02:44.742121+00 +1619,1250,2026-05-13 08:02:44.742121+00 +1619,1264,2026-05-13 08:02:44.742121+00 +1619,1233,2026-05-13 08:02:44.742121+00 +1621,1212,2026-05-13 08:02:44.742121+00 +1621,1196,2026-05-13 08:02:44.742121+00 +1622,1204,2026-05-13 08:02:44.742121+00 +1622,1266,2026-05-13 08:02:44.742121+00 +1623,1197,2026-05-13 08:02:44.742121+00 +1623,1217,2026-05-13 08:02:44.742121+00 +1623,1238,2026-05-13 08:02:44.742121+00 +1623,1233,2026-05-13 08:02:44.742121+00 +1624,1240,2026-05-13 08:02:44.742121+00 +1624,1248,2026-05-13 08:02:44.742121+00 +1624,1250,2026-05-13 08:02:44.742121+00 +1626,1265,2026-05-13 08:02:44.742121+00 +1626,1237,2026-05-13 08:02:44.742121+00 +1626,1211,2026-05-13 08:02:44.742121+00 +1629,1242,2026-05-13 08:02:44.742121+00 +1629,1237,2026-05-13 08:02:44.742121+00 +1630,1230,2026-05-13 08:02:44.742121+00 +1630,1197,2026-05-13 08:02:44.742121+00 +1631,1211,2026-05-13 08:02:44.742121+00 +1631,1240,2026-05-13 08:02:44.742121+00 +1631,1197,2026-05-13 08:02:44.742121+00 +1631,1232,2026-05-13 08:02:44.742121+00 +1631,1214,2026-05-13 08:02:44.742121+00 +1631,1222,2026-05-13 08:02:44.742121+00 +1632,1255,2026-05-13 08:02:44.742121+00 +1632,1205,2026-05-13 08:02:44.742121+00 +1632,1236,2026-05-13 08:02:44.742121+00 +1632,1198,2026-05-13 08:02:44.742121+00 +1632,1232,2026-05-13 08:02:44.742121+00 +1632,1223,2026-05-13 08:02:44.742121+00 +1632,1264,2026-05-13 08:02:44.742121+00 +1633,1268,2026-05-13 08:02:44.742121+00 +1633,1266,2026-05-13 08:02:44.742121+00 +1633,1248,2026-05-13 08:02:44.742121+00 +1633,1194,2026-05-13 08:02:44.742121+00 +1633,1220,2026-05-13 08:02:44.742121+00 +1634,1221,2026-05-13 08:02:44.742121+00 +1634,1250,2026-05-13 08:02:44.742121+00 +1634,1227,2026-05-13 08:02:44.742121+00 +1634,1220,2026-05-13 08:02:44.742121+00 +1634,1259,2026-05-13 08:02:44.742121+00 +1634,1258,2026-05-13 08:02:44.742121+00 +1635,1257,2026-05-13 08:02:44.742121+00 +1635,1249,2026-05-13 08:02:44.742121+00 +1635,1199,2026-05-13 08:02:44.742121+00 +1636,1261,2026-05-13 08:02:44.742121+00 +1636,1195,2026-05-13 08:02:44.742121+00 +1636,1271,2026-05-13 08:02:44.742121+00 +1637,1228,2026-05-13 08:02:44.742121+00 +1637,1241,2026-05-13 08:02:44.742121+00 +1637,1230,2026-05-13 08:02:44.742121+00 +1638,1259,2026-05-13 08:02:44.742121+00 +1639,1231,2026-05-13 08:02:44.742121+00 +1639,1216,2026-05-13 08:02:44.742121+00 +1639,1248,2026-05-13 08:02:44.742121+00 +1639,1239,2026-05-13 08:02:44.742121+00 +1640,1255,2026-05-13 08:02:44.742121+00 +1640,1221,2026-05-13 08:02:44.742121+00 +1640,1225,2026-05-13 08:02:44.742121+00 +1640,1195,2026-05-13 08:02:44.742121+00 +1640,1251,2026-05-13 08:02:44.742121+00 +1640,1245,2026-05-13 08:02:44.742121+00 +1640,1243,2026-05-13 08:02:44.742121+00 +1641,1231,2026-05-13 08:02:44.742121+00 +1641,1233,2026-05-13 08:02:44.742121+00 +1641,1218,2026-05-13 08:02:44.742121+00 +1642,1234,2026-05-13 08:02:44.742121+00 +1642,1225,2026-05-13 08:02:44.742121+00 +1643,1209,2026-05-13 08:02:44.742121+00 +1643,1202,2026-05-13 08:02:44.742121+00 +1645,1244,2026-05-13 08:02:44.742121+00 +1645,1212,2026-05-13 08:02:44.742121+00 +1645,1241,2026-05-13 08:02:44.742121+00 +1645,1265,2026-05-13 08:02:44.742121+00 +1646,1203,2026-05-13 08:02:44.742121+00 +1646,1215,2026-05-13 08:02:44.742121+00 +1647,1215,2026-05-13 08:02:44.742121+00 +1647,1223,2026-05-13 08:02:44.742121+00 +1647,1251,2026-05-13 08:02:44.742121+00 +1648,1253,2026-05-13 08:02:44.742121+00 +1648,1194,2026-05-13 08:02:44.742121+00 +1649,1201,2026-05-13 08:02:44.742121+00 +1649,1242,2026-05-13 08:02:44.742121+00 +1649,1200,2026-05-13 08:02:44.742121+00 +1650,1262,2026-05-13 08:02:44.742121+00 +1650,1261,2026-05-13 08:02:44.742121+00 +1650,1250,2026-05-13 08:02:44.742121+00 +1651,1246,2026-05-13 08:02:44.742121+00 +1651,1239,2026-05-13 08:02:44.742121+00 +1651,1197,2026-05-13 08:02:44.742121+00 +1651,1241,2026-05-13 08:02:44.742121+00 +1652,1221,2026-05-13 08:02:44.742121+00 +1652,1240,2026-05-13 08:02:44.742121+00 +1652,1200,2026-05-13 08:02:44.742121+00 +1653,1198,2026-05-13 08:02:44.742121+00 +1653,1226,2026-05-13 08:02:44.742121+00 +1654,1208,2026-05-13 08:02:44.742121+00 +1654,1211,2026-05-13 08:02:44.742121+00 +1654,1236,2026-05-13 08:02:44.742121+00 +1655,1229,2026-05-13 08:02:44.742121+00 +1655,1251,2026-05-13 08:02:44.742121+00 +1655,1238,2026-05-13 08:02:44.742121+00 +1656,1220,2026-05-13 08:02:44.742121+00 +1657,1219,2026-05-13 08:02:44.742121+00 +1657,1260,2026-05-13 08:02:44.742121+00 +1657,1269,2026-05-13 08:02:44.742121+00 +1658,1249,2026-05-13 08:02:44.742121+00 +1658,1271,2026-05-13 08:02:44.742121+00 +1658,1263,2026-05-13 08:02:44.742121+00 +1658,1252,2026-05-13 08:02:44.742121+00 +1659,1258,2026-05-13 08:02:44.742121+00 +1659,1259,2026-05-13 08:02:44.742121+00 +1659,1230,2026-05-13 08:02:44.742121+00 +1659,1256,2026-05-13 08:02:44.742121+00 +1661,1201,2026-05-13 08:02:44.742121+00 +1661,1210,2026-05-13 08:02:44.742121+00 +1661,1229,2026-05-13 08:02:44.742121+00 +1661,1208,2026-05-13 08:02:44.742121+00 +1661,1228,2026-05-13 08:02:44.742121+00 +1662,1214,2026-05-13 08:02:44.742121+00 +1662,1262,2026-05-13 08:02:44.742121+00 +1662,1204,2026-05-13 08:02:44.742121+00 +1662,1198,2026-05-13 08:02:44.742121+00 +1662,1234,2026-05-13 08:02:44.742121+00 +1662,1215,2026-05-13 08:02:44.742121+00 +1663,1214,2026-05-13 08:02:44.742121+00 +1664,1209,2026-05-13 08:02:44.742121+00 +1664,1266,2026-05-13 08:02:44.742121+00 +1664,1264,2026-05-13 08:02:44.742121+00 +1665,1214,2026-05-13 08:02:44.742121+00 +1666,1227,2026-05-13 08:02:44.742121+00 +1666,1200,2026-05-13 08:02:44.742121+00 +1666,1214,2026-05-13 08:02:44.742121+00 +1666,1209,2026-05-13 08:02:44.742121+00 +1666,1205,2026-05-13 08:02:44.742121+00 +1667,1220,2026-05-13 08:02:44.742121+00 +1668,1238,2026-05-13 08:02:44.742121+00 +1668,1196,2026-05-13 08:02:44.742121+00 +1668,1230,2026-05-13 08:02:44.742121+00 +1668,1226,2026-05-13 08:02:44.742121+00 +1668,1260,2026-05-13 08:02:44.742121+00 +1668,1240,2026-05-13 08:02:44.742121+00 +1668,1247,2026-05-13 08:02:44.742121+00 +1669,1243,2026-05-13 08:02:44.742121+00 +1670,1231,2026-05-13 08:02:44.742121+00 +1670,1251,2026-05-13 08:02:44.742121+00 +1671,1222,2026-05-13 08:02:44.742121+00 +1671,1262,2026-05-13 08:02:44.742121+00 +1671,1257,2026-05-13 08:02:44.742121+00 +1671,1254,2026-05-13 08:02:44.742121+00 +1671,1233,2026-05-13 08:02:44.742121+00 +1671,1253,2026-05-13 08:02:44.742121+00 +1672,1258,2026-05-13 08:02:44.742121+00 +1672,1224,2026-05-13 08:02:44.742121+00 +1672,1229,2026-05-13 08:02:44.742121+00 +1673,1264,2026-05-13 08:02:44.742121+00 +1673,1258,2026-05-13 08:02:44.742121+00 +1673,1197,2026-05-13 08:02:44.742121+00 +1673,1198,2026-05-13 08:02:44.742121+00 +1674,1233,2026-05-13 08:02:44.742121+00 +1675,1224,2026-05-13 08:02:44.742121+00 +1675,1237,2026-05-13 08:02:44.742121+00 +1675,1225,2026-05-13 08:02:44.742121+00 +1676,1213,2026-05-13 08:02:44.742121+00 +1676,1194,2026-05-13 08:02:44.742121+00 +1677,1227,2026-05-13 08:02:44.742121+00 +1677,1236,2026-05-13 08:02:44.742121+00 +1677,1199,2026-05-13 08:02:44.742121+00 +1679,1216,2026-05-13 08:02:44.742121+00 +1679,1234,2026-05-13 08:02:44.742121+00 +1679,1209,2026-05-13 08:02:44.742121+00 +1679,1195,2026-05-13 08:02:44.742121+00 +1680,1239,2026-05-13 08:02:44.742121+00 +1680,1194,2026-05-13 08:02:44.742121+00 +1680,1256,2026-05-13 08:02:44.742121+00 +1680,1261,2026-05-13 08:02:44.742121+00 +1681,1210,2026-05-13 08:02:44.742121+00 +1683,1268,2026-05-13 08:02:44.742121+00 +1683,1217,2026-05-13 08:02:44.742121+00 +1683,1195,2026-05-13 08:02:44.742121+00 +1683,1247,2026-05-13 08:02:44.742121+00 +1685,1224,2026-05-13 08:02:44.742121+00 +1685,1234,2026-05-13 08:02:44.742121+00 +1685,1264,2026-05-13 08:02:44.742121+00 +1685,1233,2026-05-13 08:02:44.742121+00 +1686,1239,2026-05-13 08:02:44.742121+00 +1687,1253,2026-05-13 08:02:44.742121+00 +1687,1199,2026-05-13 08:02:44.742121+00 +1688,1255,2026-05-13 08:02:44.742121+00 +1689,1221,2026-05-13 08:02:44.742121+00 +1689,1265,2026-05-13 08:02:44.742121+00 +1689,1258,2026-05-13 08:02:44.742121+00 +1689,1247,2026-05-13 08:02:44.742121+00 +1689,1238,2026-05-13 08:02:44.742121+00 +1689,1260,2026-05-13 08:02:44.742121+00 +1689,1220,2026-05-13 08:02:44.742121+00 +1690,1215,2026-05-13 08:02:44.742121+00 +1690,1232,2026-05-13 08:02:44.742121+00 +1690,1205,2026-05-13 08:02:44.742121+00 +1690,1249,2026-05-13 08:02:44.742121+00 +1690,1197,2026-05-13 08:02:44.742121+00 +1690,1256,2026-05-13 08:02:44.742121+00 +1690,1231,2026-05-13 08:02:44.742121+00 +1693,1205,2026-05-13 08:02:44.742121+00 +1693,1258,2026-05-13 08:02:44.742121+00 +1693,1261,2026-05-13 08:02:44.742121+00 +1694,1218,2026-05-13 08:02:44.742121+00 +1694,1215,2026-05-13 08:02:44.742121+00 +1695,1213,2026-05-13 08:02:44.742121+00 +1697,1262,2026-05-13 08:02:44.742121+00 +1697,1232,2026-05-13 08:02:44.742121+00 +1698,1264,2026-05-13 08:02:44.742121+00 +1701,1255,2026-05-13 08:02:44.742121+00 +1701,1201,2026-05-13 08:02:44.742121+00 +1701,1258,2026-05-13 08:02:44.742121+00 +1702,1223,2026-05-13 08:02:44.742121+00 +1702,1208,2026-05-13 08:02:44.742121+00 +1704,1196,2026-05-13 08:02:44.742121+00 +1704,1223,2026-05-13 08:02:44.742121+00 +1704,1263,2026-05-13 08:02:44.742121+00 +1704,1244,2026-05-13 08:02:44.742121+00 +1704,1235,2026-05-13 08:02:44.742121+00 +1704,1246,2026-05-13 08:02:44.742121+00 +1704,1208,2026-05-13 08:02:44.742121+00 +1704,1234,2026-05-13 08:02:44.742121+00 +1706,1239,2026-05-13 08:02:44.742121+00 +1707,1253,2026-05-13 08:02:44.742121+00 +1707,1218,2026-05-13 08:02:44.742121+00 +1707,1238,2026-05-13 08:02:44.742121+00 +1709,1209,2026-05-13 08:02:44.742121+00 +1709,1202,2026-05-13 08:02:44.742121+00 +1709,1257,2026-05-13 08:02:44.742121+00 +1709,1197,2026-05-13 08:02:44.742121+00 +1710,1235,2026-05-13 08:02:44.742121+00 +1710,1223,2026-05-13 08:02:44.742121+00 +1710,1268,2026-05-13 08:02:44.742121+00 +1712,1271,2026-05-13 08:02:44.742121+00 +1715,1240,2026-05-13 08:02:44.742121+00 +1715,1226,2026-05-13 08:02:44.742121+00 +1715,1260,2026-05-13 08:02:44.742121+00 +1715,1265,2026-05-13 08:02:44.742121+00 +1716,1239,2026-05-13 08:02:44.742121+00 +1717,1236,2026-05-13 08:02:44.742121+00 +1717,1216,2026-05-13 08:02:44.742121+00 +1717,1223,2026-05-13 08:02:44.742121+00 +1720,1206,2026-05-13 08:02:44.742121+00 +1720,1266,2026-05-13 08:02:44.742121+00 +1722,1265,2026-05-13 08:02:44.742121+00 +1722,1196,2026-05-13 08:02:44.742121+00 +1722,1238,2026-05-13 08:02:44.742121+00 +1722,1254,2026-05-13 08:02:44.742121+00 +1722,1253,2026-05-13 08:02:44.742121+00 +1723,1260,2026-05-13 08:02:44.742121+00 +1723,1264,2026-05-13 08:02:44.742121+00 +1723,1236,2026-05-13 08:02:44.742121+00 +1725,1265,2026-05-13 08:02:44.742121+00 +1725,1210,2026-05-13 08:02:44.742121+00 +1727,1247,2026-05-13 08:02:44.742121+00 +1727,1239,2026-05-13 08:02:44.742121+00 +1727,1204,2026-05-13 08:02:44.742121+00 +1727,1221,2026-05-13 08:02:44.742121+00 +1728,1212,2026-05-13 08:02:44.742121+00 +1728,1205,2026-05-13 08:02:44.742121+00 +1729,1198,2026-05-13 08:02:44.742121+00 +1729,1237,2026-05-13 08:02:44.742121+00 +1729,1232,2026-05-13 08:02:44.742121+00 +1729,1214,2026-05-13 08:02:44.742121+00 +1730,1223,2026-05-13 08:02:44.742121+00 +1730,1245,2026-05-13 08:02:44.742121+00 +1730,1252,2026-05-13 08:02:44.742121+00 +1730,1249,2026-05-13 08:02:44.742121+00 +1731,1235,2026-05-13 08:02:44.742121+00 +1731,1266,2026-05-13 08:02:44.742121+00 +1731,1254,2026-05-13 08:02:44.742121+00 +1732,1235,2026-05-13 08:02:44.742121+00 +1732,1212,2026-05-13 08:02:44.742121+00 +1733,1226,2026-05-13 08:02:44.742121+00 +1733,1245,2026-05-13 08:02:44.742121+00 +1733,1201,2026-05-13 08:02:44.742121+00 +1734,1219,2026-05-13 08:02:44.742121+00 +1736,1212,2026-05-13 08:02:44.742121+00 +1736,1222,2026-05-13 08:02:44.742121+00 +1736,1223,2026-05-13 08:02:44.742121+00 +1736,1235,2026-05-13 08:02:44.742121+00 +1736,1206,2026-05-13 08:02:44.742121+00 +1736,1266,2026-05-13 08:02:44.742121+00 +1736,1242,2026-05-13 08:02:44.742121+00 +1737,1210,2026-05-13 08:02:44.742121+00 +1737,1194,2026-05-13 08:02:44.742121+00 +1737,1270,2026-05-13 08:02:44.742121+00 +1737,1253,2026-05-13 08:02:44.742121+00 +1737,1238,2026-05-13 08:02:44.742121+00 +1738,1244,2026-05-13 08:02:44.742121+00 +1738,1195,2026-05-13 08:02:44.742121+00 +1739,1231,2026-05-13 08:02:44.742121+00 +1739,1239,2026-05-13 08:02:44.742121+00 +1739,1270,2026-05-13 08:02:44.742121+00 +1740,1256,2026-05-13 08:02:44.742121+00 +1740,1257,2026-05-13 08:02:44.742121+00 +1740,1267,2026-05-13 08:02:44.742121+00 +1740,1268,2026-05-13 08:02:44.742121+00 +1741,1206,2026-05-13 08:02:44.742121+00 +1741,1203,2026-05-13 08:02:44.742121+00 +1741,1269,2026-05-13 08:02:44.742121+00 +1743,1233,2026-05-13 08:02:44.742121+00 +1743,1212,2026-05-13 08:02:44.742121+00 +1743,1221,2026-05-13 08:02:44.742121+00 +1743,1206,2026-05-13 08:02:44.742121+00 +1745,1217,2026-05-13 08:02:44.742121+00 +1746,1214,2026-05-13 08:02:44.742121+00 +1747,1224,2026-05-13 08:02:44.742121+00 +1747,1248,2026-05-13 08:02:44.742121+00 +1749,1237,2026-05-13 08:02:44.742121+00 +1749,1263,2026-05-13 08:02:44.742121+00 +1749,1236,2026-05-13 08:02:44.742121+00 +1749,1232,2026-05-13 08:02:44.742121+00 +1749,1225,2026-05-13 08:02:44.742121+00 +1749,1250,2026-05-13 08:02:44.742121+00 +1750,1206,2026-05-13 08:02:44.742121+00 +1751,1228,2026-05-13 08:02:44.742121+00 +1751,1221,2026-05-13 08:02:44.742121+00 +1751,1200,2026-05-13 08:02:44.742121+00 +1751,1217,2026-05-13 08:02:44.742121+00 +1752,1251,2026-05-13 08:02:44.742121+00 +1754,1244,2026-05-13 08:02:44.742121+00 +1754,1206,2026-05-13 08:02:44.742121+00 +1754,1234,2026-05-13 08:02:44.742121+00 +1754,1242,2026-05-13 08:02:44.742121+00 +1754,1230,2026-05-13 08:02:44.742121+00 +1754,1198,2026-05-13 08:02:44.742121+00 +1755,1212,2026-05-13 08:02:44.742121+00 +1755,1217,2026-05-13 08:02:44.742121+00 +1755,1206,2026-05-13 08:02:44.742121+00 +1756,1267,2026-05-13 08:02:44.742121+00 +1756,1221,2026-05-13 08:02:44.742121+00 +1757,1270,2026-05-13 08:02:44.742121+00 +1758,1207,2026-05-13 08:02:44.742121+00 +1758,1271,2026-05-13 08:02:44.742121+00 +1758,1243,2026-05-13 08:02:44.742121+00 +1759,1258,2026-05-13 08:02:44.742121+00 +1759,1229,2026-05-13 08:02:44.742121+00 +1759,1202,2026-05-13 08:02:44.742121+00 +1759,1263,2026-05-13 08:02:44.742121+00 +1759,1239,2026-05-13 08:02:44.742121+00 +1759,1261,2026-05-13 08:02:44.742121+00 +1759,1199,2026-05-13 08:02:44.742121+00 +1762,1228,2026-05-13 08:02:44.742121+00 +1762,1267,2026-05-13 08:02:44.742121+00 +1763,1234,2026-05-13 08:02:44.742121+00 +1763,1218,2026-05-13 08:02:44.742121+00 +1763,1259,2026-05-13 08:02:44.742121+00 +1763,1213,2026-05-13 08:02:44.742121+00 +1764,1222,2026-05-13 08:02:44.742121+00 +1765,1239,2026-05-13 08:02:44.742121+00 +1765,1257,2026-05-13 08:02:44.742121+00 +1766,1243,2026-05-13 08:02:44.742121+00 +1766,1214,2026-05-13 08:02:44.742121+00 +1766,1256,2026-05-13 08:02:44.742121+00 +1766,1271,2026-05-13 08:02:44.742121+00 +1766,1195,2026-05-13 08:02:44.742121+00 +1766,1222,2026-05-13 08:02:44.742121+00 +1767,1221,2026-05-13 08:02:44.742121+00 +1767,1225,2026-05-13 08:02:44.742121+00 +1767,1201,2026-05-13 08:02:44.742121+00 +1767,1257,2026-05-13 08:02:44.742121+00 +1767,1259,2026-05-13 08:02:44.742121+00 +1767,1200,2026-05-13 08:02:44.742121+00 +1767,1268,2026-05-13 08:02:44.742121+00 +1768,1250,2026-05-13 08:02:44.742121+00 +1768,1247,2026-05-13 08:02:44.742121+00 +1768,1260,2026-05-13 08:02:44.742121+00 +1768,1220,2026-05-13 08:02:44.742121+00 +1769,1205,2026-05-13 08:02:44.742121+00 +1769,1258,2026-05-13 08:02:44.742121+00 +1769,1245,2026-05-13 08:02:44.742121+00 +1770,1258,2026-05-13 08:02:44.742121+00 +1770,1201,2026-05-13 08:02:44.742121+00 +1770,1238,2026-05-13 08:02:44.742121+00 +1772,1214,2026-05-13 08:02:44.742121+00 +1772,1228,2026-05-13 08:02:44.742121+00 +1772,1202,2026-05-13 08:02:44.742121+00 +1772,1258,2026-05-13 08:02:44.742121+00 +1774,1255,2026-05-13 08:02:44.742121+00 +1774,1222,2026-05-13 08:02:44.742121+00 +1775,1248,2026-05-13 08:02:44.742121+00 +1775,1261,2026-05-13 08:02:44.742121+00 +1775,1197,2026-05-13 08:02:44.742121+00 +1775,1222,2026-05-13 08:02:44.742121+00 +1776,1239,2026-05-13 08:02:44.742121+00 +1776,1219,2026-05-13 08:02:44.742121+00 +1776,1250,2026-05-13 08:02:44.742121+00 +1776,1233,2026-05-13 08:02:44.742121+00 +1778,1222,2026-05-13 08:02:44.742121+00 +1778,1216,2026-05-13 08:02:44.742121+00 +1778,1270,2026-05-13 08:02:44.742121+00 +1778,1197,2026-05-13 08:02:44.742121+00 +1779,1256,2026-05-13 08:02:44.742121+00 +1779,1217,2026-05-13 08:02:44.742121+00 +1779,1271,2026-05-13 08:02:44.742121+00 +1779,1198,2026-05-13 08:02:44.742121+00 +1779,1254,2026-05-13 08:02:44.742121+00 +1779,1252,2026-05-13 08:02:44.742121+00 +1779,1263,2026-05-13 08:02:44.742121+00 +1779,1220,2026-05-13 08:02:44.742121+00 +1779,1231,2026-05-13 08:02:44.742121+00 +1781,1195,2026-05-13 08:02:44.742121+00 +1781,1228,2026-05-13 08:02:44.742121+00 +1781,1259,2026-05-13 08:02:44.742121+00 +1781,1227,2026-05-13 08:02:44.742121+00 +1783,1234,2026-05-13 08:02:44.742121+00 +1783,1222,2026-05-13 08:02:44.742121+00 +1783,1197,2026-05-13 08:02:44.742121+00 +1783,1269,2026-05-13 08:02:44.742121+00 +1783,1243,2026-05-13 08:02:44.742121+00 +1783,1244,2026-05-13 08:02:44.742121+00 +1784,1242,2026-05-13 08:02:44.742121+00 +1786,1245,2026-05-13 08:02:44.742121+00 +1786,1252,2026-05-13 08:02:44.742121+00 +1786,1265,2026-05-13 08:02:44.742121+00 +1786,1261,2026-05-13 08:02:44.742121+00 +1787,1249,2026-05-13 08:02:44.742121+00 +1787,1244,2026-05-13 08:02:44.742121+00 +1787,1263,2026-05-13 08:02:44.742121+00 +1787,1250,2026-05-13 08:02:44.742121+00 +1788,1214,2026-05-13 08:02:44.742121+00 +1789,1237,2026-05-13 08:02:44.742121+00 +1789,1259,2026-05-13 08:02:44.742121+00 +1790,1232,2026-05-13 08:02:44.742121+00 +1790,1260,2026-05-13 08:02:44.742121+00 +1790,1207,2026-05-13 08:02:44.742121+00 +1790,1263,2026-05-13 08:02:44.742121+00 +1790,1221,2026-05-13 08:02:44.742121+00 +1791,1222,2026-05-13 08:02:44.742121+00 +1791,1243,2026-05-13 08:02:44.742121+00 +1791,1251,2026-05-13 08:02:44.742121+00 +1791,1216,2026-05-13 08:02:44.742121+00 +1792,1234,2026-05-13 08:02:44.742121+00 +1792,1214,2026-05-13 08:02:44.742121+00 +1792,1251,2026-05-13 08:02:44.742121+00 +1792,1266,2026-05-13 08:02:44.742121+00 +1793,1263,2026-05-13 08:02:44.742121+00 +1793,1245,2026-05-13 08:02:44.742121+00 +1793,1204,2026-05-13 08:02:44.742121+00 +1793,1197,2026-05-13 08:02:44.742121+00 +1793,1260,2026-05-13 08:02:44.742121+00 +1793,1246,2026-05-13 08:02:44.742121+00 +1794,1245,2026-05-13 08:02:44.742121+00 +1794,1203,2026-05-13 08:02:44.742121+00 +1794,1218,2026-05-13 08:02:44.742121+00 +1795,1268,2026-05-13 08:02:44.742121+00 +1795,1238,2026-05-13 08:02:44.742121+00 +1795,1203,2026-05-13 08:02:44.742121+00 +1795,1220,2026-05-13 08:02:44.742121+00 +1795,1270,2026-05-13 08:02:44.742121+00 +1796,1231,2026-05-13 08:02:44.742121+00 +1796,1198,2026-05-13 08:02:44.742121+00 +1796,1227,2026-05-13 08:02:44.742121+00 +1797,1202,2026-05-13 08:02:44.742121+00 +1797,1208,2026-05-13 08:02:44.742121+00 +1797,1262,2026-05-13 08:02:44.742121+00 +1797,1252,2026-05-13 08:02:44.742121+00 +1798,1258,2026-05-13 08:02:44.742121+00 +1800,1230,2026-05-13 08:02:44.742121+00 +1800,1204,2026-05-13 08:02:44.742121+00 +1802,1204,2026-05-13 08:02:44.742121+00 +1802,1212,2026-05-13 08:02:44.742121+00 diff --git a/scripts/seed_snapshot_data/data/feed_post_comments.csv b/scripts/seed_snapshot_data/data/feed_post_comments.csv new file mode 100644 index 00000000..0e4d6406 --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_post_comments.csv @@ -0,0 +1,656 @@ +id,post_id,author_id,parent_comment_id,body,created_at,updated_at,deleted_at,version +1148,515,1246,,Do you toggle the pause via a feature flag in the connection pool or just an env var?,2026-05-05 11:28:34.078514+00,2026-05-05 11:28:34.078514+00,,0 +1149,515,1197,,Would you share the migration runbook? We have a 14→16 coming up.,2026-05-03 03:28:14.078514+00,2026-05-03 03:28:14.078514+00,,0 +1150,515,1248,,For replica lag monitoring would you go Datadog or something like pgwatch2?,2026-05-03 15:48:45.078514+00,2026-05-03 15:48:45.078514+00,,0 +1151,516,1246,,Did you find a workaround for the ThreadLocal bugs or did you replace the libraries outright?,2026-04-12 20:49:16.570067+00,2026-04-12 20:49:16.570067+00,,0 +1152,516,1202,,Our load test came out similar. The only catch was tuning the GC profile a bit differently.,2026-04-12 00:53:08.570067+00,2026-04-12 00:53:08.570067+00,,0 +1153,516,1204,,Virtual threads + reactive stack is dangerous territory — did you try mixing them?,2026-04-11 15:58:17.570067+00,2026-04-11 15:58:17.570067+00,,0 +1154,517,1246,,"Concrete and useful, thanks. I bombed an interview last month because I sized the caching layer to a uniform load.",2026-05-06 23:59:39.449522+00,2026-05-06 23:59:39.449522+00,,0 +1155,517,1243,,Any framework you'd recommend for estimating that traffic distribution upfront?,2026-05-06 15:02:10.449522+00,2026-05-06 15:02:10.449522+00,,0 +1156,517,1248,,Do you apply the same rule when configuring API rate limits?,2026-05-07 10:56:50.449522+00,2026-05-07 10:56:50.449522+00,,0 +1157,518,1197,,"Which model, Melis? I've been window-shopping.",2026-04-30 16:01:48.538957+00,2026-04-30 16:01:48.538957+00,,0 +1158,518,1202,,Vespa + Istanbul + morning traffic — respect.,2026-05-01 23:28:54.538957+00,2026-05-01 23:28:54.538957+00,,0 +1159,518,1246,,I tell my team to make this a calendar rule. Nobody listens.,2026-04-30 00:12:10.538957+00,2026-04-30 00:12:10.538957+00,,0 +1160,519,1204,,Selling this trade-off to non-technical stakeholders is the hardest part — what's your move there?,2026-04-15 10:47:13.58202+00,2026-04-15 10:47:13.58202+00,,0 +1161,519,1246,,I always frame it as 'what does the user expect to see' but engineers push back with 'that's a race condition.',2026-04-17 01:38:41.58202+00,2026-04-17 01:38:41.58202+00,,0 +1162,519,1201,,"For the cart specifically, what's your cache invalidation strategy?",2026-04-17 03:44:07.58202+00,2026-04-17 03:44:07.58202+00,,0 +1163,520,1246,,"Saving this. When I have my first incident, remind me of it.",2026-04-27 07:00:24.01207+00,2026-04-27 07:00:24.01207+00,,0 +1164,520,1202,,True — managing panic matters more than the technical skill in those moments.,2026-04-27 11:06:32.01207+00,2026-04-27 11:06:32.01207+00,,0 +1165,521,1197,,We tested both for game-side relevance tuning — Elastic felt a step ahead on the new vector search features.,2026-05-05 03:18:56.199138+00,2026-05-05 03:18:56.199138+00,,0 +1166,521,1246,,We're migrating a project tomorrow. Any pain you hit with index template incompatibilities?,2026-05-02 22:23:19.199138+00,2026-05-02 22:23:19.199138+00,,0 +1167,522,1202,,We piloted this at Trendyol and the hiring committee killed it for being 'too subjective.' Are you still running it?,2026-05-06 04:44:23.835665+00,2026-05-06 04:44:23.835665+00,,0 +1168,522,1204,,Could you share a structured rubric for this? I have four senior interviews queued up.,2026-05-06 03:51:00.835665+00,2026-05-06 03:51:00.835665+00,,0 +1169,522,1246,,"From a candidate's perspective, this is a relief. I'm tired of whiteboard puzzles.",2026-05-05 15:26:25.835665+00,2026-05-05 15:26:25.835665+00,,0 +1170,523,1245,,This is exactly the conversation we keep avoiding at work. Going to print this and put it above my desk.,2026-05-02 09:43:06.633738+00,2026-05-02 09:43:06.633738+00,,0 +1171,523,1249,,"Do you have a hypothesis template you use, or is it more freeform per campaign?",2026-05-02 04:41:24.633738+00,2026-05-02 04:41:24.633738+00,,0 +1172,523,1216,,What if the hypothesis is wrong though — do you call that a failed test or a learning?,2026-05-02 06:50:46.633738+00,2026-05-02 06:50:46.633738+00,,0 +1173,524,1245,,Just bought it on your recommendation last quarter and it changed how I write landing pages. Worth every page.,2026-05-01 08:20:43.367658+00,2026-05-01 08:20:43.367658+00,,0 +1174,524,1249,,Adding to the queue. Any companion read you'd pair it with?,2026-04-30 22:01:37.367658+00,2026-04-30 22:01:37.367658+00,,0 +1175,525,1195,,This applies one-to-one to engineering management too. Saving.,2026-04-15 11:34:56.691115+00,2026-04-15 11:34:56.691115+00,,0 +1176,525,1214,,Curious — how do you keep the respect though? I've watched producers lose teams over similar conversations.,2026-04-15 19:45:16.691115+00,2026-04-15 19:45:16.691115+00,,0 +1177,525,1204,,The 'and still keeping their respect' clause is what separates the good ones from the rest.,2026-04-16 02:33:50.691115+00,2026-04-16 02:33:50.691115+00,,0 +1178,526,1219,,How do you defend the 'quiet weeks' to a PM who's pushing for retention bumps every week?,2026-04-14 00:52:23.701946+00,2026-04-14 00:52:23.701946+00,,0 +1179,526,1204,,Quiet weeks are also when you catch your breath enough to plan the next strong event. People forget this.,2026-04-15 11:19:03.701946+00,2026-04-15 11:19:03.701946+00,,0 +1180,527,1195,,The Bosphorus has its perks but I get the appeal. Vespa wouldn't make it through your winter though.,2026-05-01 22:16:07.283837+00,2026-05-01 22:16:07.283837+00,,0 +1181,527,1202,,We considered the same move. Did you keep your studio role remote or change companies?,2026-04-30 15:58:53.283837+00,2026-04-30 15:58:53.283837+00,,0 +1182,528,1214,,Agreed. We call them 'craft skills' on our team for exactly this reason.,2026-05-08 18:50:43.376303+00,2026-05-08 18:50:43.376303+00,,0 +1183,528,1204,,The cost of a manager who can't do conflict resolution is enormous. Visible only when it's missing.,2026-05-09 11:11:36.376303+00,2026-05-09 11:11:36.376303+00,,0 +1184,529,1211,,This is exactly the part I keep rewriting. Can you share one that worked?,2026-05-01 00:46:22.798715+00,2026-05-01 00:46:22.798715+00,,0 +1185,529,1215,,How long should the opening paragraph be? Mine keeps ballooning to half a page.,2026-05-01 14:36:12.798715+00,2026-05-01 14:36:12.798715+00,,0 +1186,529,1201,,"I review applicants for our security program — this matches what we look for, just from a different field.",2026-04-30 04:02:32.798715+00,2026-04-30 04:02:32.798715+00,,0 +1187,530,1230,,Do you have a recommended onboarding paper for interpretability? I've been reading randomly and feeling lost.,2026-04-17 12:14:10.244192+00,2026-04-17 12:14:10.244192+00,,0 +1188,530,1215,,The 'intro + conclusion only' move is something I've never tried. Will steal.,2026-04-15 06:03:32.244192+00,2026-04-15 06:03:32.244192+00,,0 +1189,531,1251,,Recording myself last week was painful but I caught three filler words I had no idea I was saying. Endorse this.,2026-05-03 01:01:30.173862+00,2026-05-03 01:01:30.173862+00,,0 +1190,531,1215,,I'm preparing a 10-minute thesis pitch. Will try this tomorrow.,2026-05-02 17:43:39.173862+00,2026-05-02 17:43:39.173862+00,,0 +1191,532,1201,,These are the days that compound. Glad you had one.,2026-05-03 12:46:13.779296+00,2026-05-03 12:46:13.779296+00,,0 +1192,532,1215,,Saving this for the next time I have a 'why am I doing this' afternoon.,2026-05-02 20:47:06.779296+00,2026-05-02 20:47:06.779296+00,,0 +1193,533,1211,,How do you decide which questions to take seriously vs. let go?,2026-04-14 11:22:58.149036+00,2026-04-14 11:22:58.149036+00,,0 +1194,533,1215,,Do you revisit it on a schedule or only when stuck?,2026-04-13 08:04:29.149036+00,2026-04-13 08:04:29.149036+00,,0 +1195,534,1211,,Needed to hear this today. Got my first rejection yesterday.,2026-05-04 05:58:33.173253+00,2026-05-04 05:58:33.173253+00,,0 +1196,534,1215,,How many programs is 'broadly' in your experience — 6? 10?,2026-05-03 21:00:33.173253+00,2026-05-03 21:00:33.173253+00,,0 +1197,534,1201,,Same in faculty hiring. Goes the other way too.,2026-05-02 21:35:45.173253+00,2026-05-02 21:35:45.173253+00,,0 +1198,535,1222,,This stings but it's the right framing. I've been in 'daydream' mode for a year.,2026-05-04 20:44:03.114869+00,2026-05-04 20:44:03.114869+00,,0 +1199,535,1240,,What if you have the problem but not the cofounder yet? Is that 'not ready' or 'still searching'?,2026-05-04 23:22:07.114869+00,2026-05-04 23:22:07.114869+00,,0 +1200,535,1203,,Endorse every word. The cofounder question is the one nobody wants to sit with.,2026-05-05 11:41:50.114869+00,2026-05-05 11:41:50.114869+00,,0 +1201,536,1229,,We just instituted monthly tabletops last quarter. Already paid for itself once.,2026-04-07 11:39:13.94251+00,2026-04-07 11:39:13.94251+00,,0 +1202,536,1195,,The 'false comfort' framing is exactly right. So many teams hide behind unread runbooks.,2026-04-08 08:31:18.94251+00,2026-04-08 08:31:18.94251+00,,0 +1203,536,1202,,Do you keep them in the repo with the service or in a wiki?,2026-04-07 05:34:56.94251+00,2026-04-07 05:34:56.94251+00,,0 +1204,537,1229,,Was this the change that affected the dynamo backend specifically or all backends?,2026-04-24 19:33:48.757008+00,2026-04-24 19:33:48.757008+00,,0 +1205,537,1195,,Quiet wins are the best wins. Tools that just work better month over month.,2026-04-25 07:17:34.757008+00,2026-04-25 07:17:34.757008+00,,0 +1206,538,1229,,"This is the conversation I've been trying to have with leadership for a year. They want the metric, not the underlying thing.",2026-04-17 16:31:42.426797+00,2026-04-17 16:31:42.426797+00,,0 +1207,538,1206,,Speed-as-a-side-effect-of-trust is a banger framing.,2026-04-15 00:52:13.426797+00,2026-04-15 00:52:13.426797+00,,0 +1208,539,1195,,Hard agree. Burnout is more expensive than a Saturday alert.,2026-04-28 06:27:52.008893+00,2026-04-28 06:27:52.008893+00,,0 +1209,539,1229,,Stealing this for my own team.,2026-04-28 05:11:42.008893+00,2026-04-28 05:11:42.008893+00,,0 +1210,540,1229,,Any tool you'd start with for someone coming in cold?,2026-04-27 05:47:37.459249+00,2026-04-27 05:47:37.459249+00,,0 +1211,540,1201,,Agree completely. The security observability use case is also underrated.,2026-04-25 22:27:59.459249+00,2026-04-25 22:27:59.459249+00,,0 +1212,541,1217,,This is exactly how my interview at a security firm went sideways — I gave the vague answer. Won't make that mistake again.,2026-05-05 09:38:04.128243+00,2026-05-05 09:38:04.128243+00,,0 +1213,541,1200,,The 'next 90 days' time horizon is what most people miss. Security is always bounded.,2026-05-05 18:33:33.128243+00,2026-05-05 18:33:33.128243+00,,0 +1214,541,1195,,Same principle in reliability: 'is this reliable' is the wrong question without 'against what failure modes.',2026-05-06 11:22:04.128243+00,2026-05-06 11:22:04.128243+00,,0 +1215,542,1217,,Is there a particular detection engineering resource you'd recommend for OT specifically?,2026-04-12 09:46:52.198406+00,2026-04-12 09:46:52.198406+00,,0 +1216,542,1200,,Same trend in IT. We're updating our SIEM rules to weight recon-stage indicators much higher.,2026-04-13 06:17:50.198406+00,2026-04-13 06:17:50.198406+00,,0 +1217,543,1217,,The vendor pitches in this space are particularly bad. They make CEOs think it's a product they can buy.,2026-04-27 08:25:55.910922+00,2026-04-27 08:25:55.910922+00,,0 +1218,543,1207,,Saving — preparing for an architecture review next month and was going to use the loaded phrase.,2026-04-27 11:39:18.910922+00,2026-04-27 11:39:18.910922+00,,0 +1219,544,1198,,This is the kind of perspective you only get outside Istanbul. Glad you have it nearby.,2026-04-30 17:47:35.843749+00,2026-04-30 17:47:35.843749+00,,0 +1220,544,1217,,Saving this framing. The threat changes faster than the architecture — that's all of security.,2026-04-29 14:07:24.843749+00,2026-04-29 14:07:24.843749+00,,0 +1221,545,1246,,This is exactly the conversation I've been avoiding having with myself for six months.,2026-04-05 00:15:43.053228+00,2026-04-05 00:15:43.053228+00,,0 +1222,545,1195,,The dopamine framing is correct. The first year of my management was a low-grade craving.,2026-04-04 05:51:30.053228+00,2026-04-04 05:51:30.053228+00,,0 +1223,545,1200,,"Endorsed. Best advice I got was 'find new sources of satisfaction, not just substitute the old.'",2026-04-04 14:53:51.053228+00,2026-04-04 14:53:51.053228+00,,0 +1224,546,1195,,Zero cancellations in a week is the management equivalent of a green build.,2026-04-20 18:03:22.278936+00,2026-04-20 18:03:22.278936+00,,0 +1225,546,1200,,Hard agree. The 1:1s being kept is the lagging indicator of a healthy team.,2026-04-20 12:14:33.278936+00,2026-04-20 12:14:33.278936+00,,0 +1226,547,1222,,We tried to tell three stories in our first meetings and bombed. Pivoted to one and it worked. Painful lesson.,2026-04-19 17:21:08.880674+00,2026-04-19 17:21:08.880674+00,,0 +1227,547,1199,,The 'before the first meeting' part is what people miss. They iterate inside meetings and burn relationships.,2026-04-18 22:27:39.880674+00,2026-04-18 22:27:39.880674+00,,0 +1228,547,1240,,Any framework for picking which story? Or is it just gut?,2026-04-18 13:00:52.880674+00,2026-04-18 13:00:52.880674+00,,0 +1229,548,1222,,"Same — the technology dates instantly, the founder loneliness never does.",2026-04-11 08:09:20.977815+00,2026-04-11 08:09:20.977815+00,,0 +1230,548,1199,,I re-read Jessica's interviews from that book every year. They hit differently as you grow.,2026-04-12 08:17:22.977815+00,2026-04-12 08:17:22.977815+00,,0 +1231,549,1229,,Watching this fail in real-time at the company I just left. They keep hiring AEs to fix a self-serve problem.,2026-04-23 11:18:22.005181+00,2026-04-23 11:18:22.005181+00,,0 +1232,549,1199,,"Bottom-up first is right. Even if your buyer is the CTO, the dev has to like it first.",2026-04-23 23:59:51.005181+00,2026-04-23 23:59:51.005181+00,,0 +1233,550,1199,,This is the most honest thing on this feed. Thank you.,2026-04-08 02:57:15.422529+00,2026-04-08 02:57:15.422529+00,,0 +1234,550,1240,,Saving this. The bathroom-ten-minutes is undocumented founder canon.,2026-04-07 23:00:34.422529+00,2026-04-07 23:00:34.422529+00,,0 +1235,550,1222,,The 'two hours later' part is the founder skill. Not the not-crying.,2026-04-09 04:31:50.422529+00,2026-04-09 04:31:50.422529+00,,0 +1236,551,1246,,This reframes the conversation in a really useful way. Going to use this in code review tomorrow.,2026-05-04 09:05:52.356075+00,2026-05-04 09:05:52.356075+00,,0 +1237,551,1195,,Behaviour location is the underrated lens. Most architecture pain is misplaced behaviour.,2026-05-04 18:33:51.356075+00,2026-05-04 18:33:51.356075+00,,0 +1238,551,1202,,Endorse. The maintenance cost lens makes the abstract pattern arguments productive.,2026-05-04 00:16:35.356075+00,2026-05-04 00:16:35.356075+00,,0 +1239,552,1195,,Saving for next time we hit one. The auto-config debugging story has been a pain point for years.,2026-05-09 04:54:13.535587+00,2026-05-09 04:54:13.535587+00,,0 +1240,552,1246,,Is this configurable per-profile or always-on?,2026-05-08 09:39:40.535587+00,2026-05-08 09:39:40.535587+00,,0 +1241,553,1202,,"Üsküdar agrees. Quiet neighbourhoods make better engineers, I'm convinced.",2026-05-01 10:30:26.276597+00,2026-05-01 10:30:26.276597+00,,0 +1242,553,1195,,Maltepe nods to Pendik. Solidarity from the Asian side.,2026-05-01 19:46:32.276597+00,2026-05-01 19:46:32.276597+00,,0 +1243,554,1220,,This is a much more useful frame than the academic one I learned in school. Going to use this.,2026-05-03 15:06:06.974025+00,2026-05-03 15:06:06.974025+00,,0 +1244,554,1198,,Defensibility-as-the-real-goal is exactly right. The explainability literature often misses this.,2026-05-03 02:34:40.974025+00,2026-05-03 02:34:40.974025+00,,0 +1245,554,1195,,The override process is the part most papers ignore. Where the real risk lives.,2026-05-04 11:45:28.974025+00,2026-05-04 11:45:28.974025+00,,0 +1246,555,1220,,Our inventory exercise has been going on for three months. Painful but illuminating.,2026-05-06 05:09:23.636871+00,2026-05-06 05:09:23.636871+00,,0 +1247,555,1198,,The 'start with GenAI use cases' advice is non-obvious but correct — that's where most institutions are weakest.,2026-05-06 07:38:33.636871+00,2026-05-06 07:38:33.636871+00,,0 +1248,556,1220,,Watching this fail at my org in real-time. The pre-deployment forcing function is the lesson.,2026-04-17 05:27:06.276694+00,2026-04-17 05:27:06.276694+00,,0 +1249,556,1198,,"True in academia too — write the methods section before the experiments, not after.",2026-04-18 15:31:26.276694+00,2026-04-18 15:31:26.276694+00,,0 +1250,557,1198,,The fishermen are the meditation.,2026-05-04 00:35:31.704704+00,2026-05-04 00:35:31.704704+00,,0 +1251,557,1220,,"I needed this image today, thank you.",2026-05-03 14:49:07.704704+00,2026-05-03 14:49:07.704704+00,,0 +1252,558,1243,,This rubric is exactly what I've been missing in self-assessment. Going to rewrite my recent case study tonight.,2026-05-02 12:50:48.555653+00,2026-05-02 12:50:48.555653+00,,0 +1253,558,1197,,Translates one-to-one to engineering portfolios. The context-sensitive metric is the senior move.,2026-05-01 10:29:09.555653+00,2026-05-01 10:29:09.555653+00,,0 +1254,558,1199,,Founders read these too. The third type is the only one that lands with us.,2026-05-02 13:37:12.555653+00,2026-05-02 13:37:12.555653+00,,0 +1255,559,1243,,Started using it last month. The brand-flex use case is the killer. Wish I'd known sooner.,2026-04-25 13:15:30.281392+00,2026-04-25 13:15:30.281392+00,,0 +1256,559,1219,,Any teaching resources you recommend? I keep getting confused on the modes.,2026-04-25 09:58:55.281392+00,2026-04-25 09:58:55.281392+00,,0 +1257,560,1243,,"Endorse. I work somewhere where design systems are treated as the deliverable, not the means. Everyone is busy and nothing ships.",2026-04-30 16:33:42.156888+00,2026-04-30 16:33:42.156888+00,,0 +1258,560,1197,,"Production has the same trap with project management methodologies. Tool, not strategy.",2026-04-30 15:12:49.156888+00,2026-04-30 15:12:49.156888+00,,0 +1259,560,1199,,"Same with sales playbooks. Tool, not strategy. The pattern repeats.",2026-05-01 08:23:02.156888+00,2026-05-01 08:23:02.156888+00,,0 +1260,561,1197,,Slowness is the point. This is the move.,2026-04-11 02:47:31.047662+00,2026-04-11 02:47:31.047662+00,,0 +1261,561,1198,,I haven't made manti in years. Reminded now.,2026-04-11 14:31:23.047662+00,2026-04-11 14:31:23.047662+00,,0 +1262,562,1243,,This is the conversation our design team avoids. Our critiques are validation theater.,2026-05-09 08:13:38.738309+00,2026-05-09 08:13:38.738309+00,,0 +1263,562,1202,,Same trap in engineering review. The structured conversation is the skill.,2026-05-10 01:37:53.738309+00,2026-05-10 01:37:53.738309+00,,0 +1264,563,1243,,On my list. Did you read the revised edition?,2026-04-21 05:41:02.708569+00,2026-04-21 05:41:02.708569+00,,0 +1265,563,1198,,The 'fundamentals haven't changed' line lands. Every field has this.,2026-04-19 15:37:40.708569+00,2026-04-19 15:37:40.708569+00,,0 +1266,564,1197,,Erzurum's mountains are different than yours but the principle is identical.,2026-05-05 06:48:29.813579+00,2026-05-05 06:48:29.813579+00,,0 +1267,564,1198,,Tuesdays — the most Istanbul day of the week. Hard to articulate why.,2026-05-05 02:19:04.813579+00,2026-05-05 02:19:04.813579+00,,0 +1268,564,1199,,"Izmir doesn't miss it ever, but I respect the honesty.",2026-05-06 02:03:06.813579+00,2026-05-06 02:03:06.813579+00,,0 +1269,565,1200,,I say it once a session for the first month and then never again. We'll get there.,2026-05-06 22:34:55.748364+00,2026-05-06 22:34:55.748364+00,,0 +1270,565,1216,,"Same trap with me, different label. Took me half a year to drop it.",2026-05-05 20:01:57.748364+00,2026-05-05 20:01:57.748364+00,,0 +1271,566,1229,,180MB is a great result for a first try. The layer caching docs are honestly bad — most of us learn it by breaking it.,2026-05-01 21:02:23.892754+00,2026-05-01 21:02:23.892754+00,,0 +1272,566,1200,,You'll have an even better moment when you discover BuildKit cache mounts. Save that for next week.,2026-05-03 02:18:14.892754+00,2026-05-03 02:18:14.892754+00,,0 +1273,567,1205,,It's true. The hardest hires for responsible AI teams are people who can read philosophy carefully and explain it to engineers.,2026-04-23 01:34:44.07981+00,2026-04-23 01:34:44.07981+00,,0 +1274,567,1220,,Going to use this reframe for myself too. The 'not technical' worry is universal.,2026-04-21 03:17:31.07981+00,2026-04-21 03:17:31.07981+00,,0 +1275,567,1198,,"Philosophers do close reading the way engineers do debugging. Same skill, different artifact.",2026-04-21 06:56:00.07981+00,2026-04-21 06:56:00.07981+00,,0 +1276,568,1200,,Service works > model is good is the right order to learn this. Now make it observable.,2026-05-05 18:48:57.639813+00,2026-05-05 18:48:57.639813+00,,0 +1277,568,1230,,"Same path I took. The bad model gets better, the deployment skill compounds.",2026-05-06 22:14:00.639813+00,2026-05-06 22:14:00.639813+00,,0 +1278,569,1200,,"Right order: failure modes first, features second. Stick with that mentor.",2026-04-15 23:46:28.619079+00,2026-04-15 23:46:28.619079+00,,0 +1279,569,1230,,I learned this lesson by getting paged. Cheaper to learn it from a mentor.,2026-04-14 10:02:49.619079+00,2026-04-14 10:02:49.619079+00,,0 +1280,570,1197,,The tutorials lie because they were written by people who already knew. Your write-up will help more people than you think.,2026-04-30 08:06:18.728295+00,2026-04-30 08:06:18.728295+00,,0 +1281,570,1248,,Will read. Flutter side has the same problem. Tutorials skip the boring fixes.,2026-05-01 04:27:56.728295+00,2026-05-01 04:27:56.728295+00,,0 +1282,571,1197,,These tiny moments are the actual progress. The big ones are usually breakthroughs that depend on a hundred of these.,2026-05-09 01:12:02.870751+00,2026-05-09 01:12:02.870751+00,,0 +1283,571,1219,,Flutter equivalent for me was StatelessWidget vs StatefulWidget. Same feeling.,2026-05-08 08:22:25.870751+00,2026-05-08 08:22:25.870751+00,,0 +1284,572,1197,,Erzurum kid solidarity. The cold makes the focus better.,2026-05-07 06:19:02.371677+00,2026-05-07 06:19:02.371677+00,,0 +1285,572,1198,,Cozy work setups are an underrated career advantage.,2026-05-06 10:19:10.371677+00,2026-05-06 10:19:10.371677+00,,0 +1286,573,1197,,Yep. Mixed UIKit/SwiftUI codebases are the median you'll join. Better to know both.,2026-04-25 01:06:24.146076+00,2026-04-25 01:06:24.146076+00,,0 +1287,573,1219,,Saving — Flutter side has the same dual-knowledge problem.,2026-04-25 00:31:05.146076+00,2026-04-25 00:31:05.146076+00,,0 +1288,574,1198,,Iteration four will already be unrecognizable from draft one. That's the point of the process.,2026-05-10 12:12:11.53914+00,2026-05-10 12:12:11.53914+00,,0 +1289,574,1215,,Reading your journey with mine. The 'describing not arguing' note hits home.,2026-05-08 12:10:57.53914+00,2026-05-08 12:10:57.53914+00,,0 +1290,574,1222,,"How many drafts does it usually take, in your experience?",2026-05-09 00:05:21.53914+00,2026-05-09 00:05:21.53914+00,,0 +1291,575,1198,,Your mom's belief is worth more than any letter of recommendation. Never forget that.,2026-04-30 22:09:41.193925+00,2026-04-30 22:09:41.193925+00,,0 +1292,575,1215,,Going through this exact thing with my dad.,2026-04-30 05:03:34.193925+00,2026-04-30 05:03:34.193925+00,,0 +1293,575,1226,,First-gen solidarity. The translation never gets easier but the support is real.,2026-05-01 19:44:34.193925+00,2026-05-01 19:44:34.193925+00,,0 +1294,576,1198,,Methodology > implementation in writing time is the universal law of research. Welcome to the club.,2026-04-28 00:05:07.973016+00,2026-04-28 00:05:07.973016+00,,0 +1295,576,1215,,Saving for when I hit the same wall on my thesis.,2026-04-29 10:05:55.973016+00,2026-04-29 10:05:55.973016+00,,0 +1296,577,1235,,Small multiples are underused in fintech. The candlestick default is laziness most of the time.,2026-04-12 00:49:51.124013+00,2026-04-12 00:49:51.124013+00,,0 +1297,577,1224,,Curious which library — Plotly or pure matplotlib?,2026-04-11 19:49:12.124013+00,2026-04-11 19:49:12.124013+00,,0 +1298,577,1218,,The visualization is the analysis is the whole point. Saving.,2026-04-13 16:43:05.124013+00,2026-04-13 16:43:05.124013+00,,0 +1299,578,1235,,This is the discipline. Most analysts ship charts that have no claim.,2026-04-25 10:17:04.275838+00,2026-04-25 10:17:04.275838+00,,0 +1300,578,1196,,"Same in marketing dashboards. The narrative is the deliverable, the chart is the receipt.",2026-04-27 12:33:50.275838+00,2026-04-27 12:33:50.275838+00,,0 +1301,579,1235,,Şişli lunch is a personality test you can fail.,2026-05-08 19:52:38.968134+00,2026-05-08 19:52:38.968134+00,,0 +1302,579,1242,,Solidarity from another Şişli walker. Try the place behind Cevahir.,2026-05-10 23:05:12.968134+00,2026-05-10 23:05:12.968134+00,,0 +1303,580,1205,,This is the work. The guardrails-take-longer-than-the-product law applies to every responsible AI deployment.,2026-04-21 19:52:57.330336+00,2026-04-21 19:52:57.330336+00,,0 +1304,580,1220,,Are you going to write up the seven prompts? Would be useful for the chatbot people who haven't done this exercise.,2026-04-21 01:14:31.330336+00,2026-04-21 01:14:31.330336+00,,0 +1305,580,1208,,Same trajectory as my thesis. The naivety in 'just deploy it' is dangerous.,2026-04-19 05:56:25.330336+00,2026-04-19 05:56:25.330336+00,,0 +1306,581,1205,,That question is the whole career. Glad we started there.,2026-03-11 07:11:10.125276+00,2026-03-11 07:11:10.125276+00,,0 +1307,581,1220,,Saving the framing for my own first sessions.,2026-03-09 04:39:10.125276+00,2026-03-09 04:39:10.125276+00,,0 +1308,582,1219,,Kartal sunsets are underrated. Marina solidarity.,2026-04-23 00:07:04.99853+00,2026-04-23 00:07:04.99853+00,,0 +1309,582,1221,,I do the same walk after my QA classes. Distance helps.,2026-04-24 12:07:11.99853+00,2026-04-24 12:07:11.99853+00,,0 +1310,583,1197,,Both can be true. Personal narrative games are the best demonstration of design literacy.,2026-04-11 04:40:20.290276+00,2026-04-11 04:40:20.290276+00,,0 +1311,583,1219,,Sending the link to my partner. Twenty minutes of crying-game material is the rate niche.,2026-04-12 05:29:58.290276+00,2026-04-12 05:29:58.290276+00,,0 +1312,583,1206,,The personal Bitsy is harder than it looks. Most people don't get past the editor.,2026-04-11 15:46:53.290276+00,2026-04-11 15:46:53.290276+00,,0 +1313,584,1197,,Small games ship. Big games crunch. Bias toward smallness early.,2026-04-26 16:04:07.417605+00,2026-04-26 16:04:07.417605+00,,0 +1314,584,1206,,Saving. Same principle in design portfolios — small artifacts compound.,2026-04-24 19:19:46.417605+00,2026-04-24 19:19:46.417605+00,,0 +1315,585,1211,,162Q is a strong start. Verbal compounds slowly but it compounds — daily reading is correct.,2026-05-07 16:08:46.314347+00,2026-05-07 16:08:46.314347+00,,0 +1316,585,1198,,Verbal is the slow burn. Don't expect a jump for six weeks.,2026-05-09 09:31:43.314347+00,2026-05-09 09:31:43.314347+00,,0 +1317,585,1222,,On the same prep journey. Solidarity from a different field.,2026-05-07 23:15:49.314347+00,2026-05-07 23:15:49.314347+00,,0 +1318,586,1211,,Saving this perspective for application-stress days.,2026-04-29 17:49:13.11928+00,2026-04-29 17:49:13.11928+00,,0 +1319,586,1198,,The geography reminds you the clock is shorter than you think.,2026-04-29 23:26:33.11928+00,2026-04-29 23:26:33.11928+00,,0 +1320,587,1198,,"Right priority order. The GRE is a filter, the statement is the choice.",2026-04-15 02:52:54.811352+00,2026-04-15 02:52:54.811352+00,,0 +1321,587,1211,,Same conversation in my session. The mentor was very firm about it.,2026-04-16 18:28:38.811352+00,2026-04-16 18:28:38.811352+00,,0 +1322,588,1211,,Anki is the friend. SRS works.,2026-04-24 20:36:14.720019+00,2026-04-24 20:36:14.720019+00,,0 +1323,588,1198,,Targeted vocabulary > general reading is the right diagnostic.,2026-04-24 03:10:17.720019+00,2026-04-24 03:10:17.720019+00,,0 +1324,589,1196,,Yes — and the second framing is more accurate. Teaching is a communication craft.,2026-04-04 21:29:56.349674+00,2026-04-04 21:29:56.349674+00,,0 +1325,589,1207,,Going to use the same reframe for my own switch. Thank you.,2026-04-04 17:38:13.349674+00,2026-04-04 17:38:13.349674+00,,0 +1326,589,1226,,The framing matters more than the courses. Career switchers underestimate this.,2026-04-04 00:00:41.349674+00,2026-04-04 00:00:41.349674+00,,0 +1327,590,1207,,This shift is the whole career change. Going from 'doing the tutorial' to 'asking your own question' is everything.,2026-03-26 18:46:03.155619+00,2026-03-26 18:46:03.155619+00,,0 +1328,590,1247,,Same path. The first 'my own query' feels like cheating until you realize it isn't.,2026-03-25 20:18:51.155619+00,2026-03-25 20:18:51.155619+00,,0 +1329,591,1207,,The no-commute morning is the underrated benefit of the switch. Reclaiming the hour.,2026-04-25 20:18:03.892402+00,2026-04-25 20:18:03.892402+00,,0 +1330,591,1224,,Same situation. Coffee at home > coffee in transit.,2026-04-25 17:22:54.892402+00,2026-04-25 17:22:54.892402+00,,0 +1331,592,1196,,"Real projects > Kaggle, every time. Saving the food-cost example.",2026-05-03 08:15:16.109779+00,2026-05-03 08:15:16.109779+00,,0 +1332,592,1207,,Inspired to find a similar friend-project.,2026-05-04 09:16:37.109779+00,2026-05-04 09:16:37.109779+00,,0 +1333,593,1201,,Reinvesting the bounty into HTB is the move. Compound the practice. Good work.,2026-04-24 15:07:18.909925+00,2026-04-24 15:07:18.909925+00,,0 +1334,593,1237,,Stored XSS payouts are rare and underrated. Congrats.,2026-04-24 17:33:41.909925+00,2026-04-24 17:33:41.909925+00,,0 +1335,593,1231,,Did the company patch within their SLA? Curious about disclosure timeline.,2026-04-23 20:22:13.909925+00,2026-04-23 20:22:13.909925+00,,0 +1336,594,1201,,The favourite-vulnerability question is the diagnostic. Says everything about how you think.,2026-04-28 16:37:37.684947+00,2026-04-28 16:37:37.684947+00,,0 +1337,594,1237,,Saving for my own first sessions. The real question is rarely the one in the script.,2026-04-29 11:58:09.684947+00,2026-04-29 11:58:09.684947+00,,0 +1338,595,1201,,The build > the find is the actual signal. People who chase finds burn out. Builders stay.,2026-05-03 03:17:05.961862+00,2026-05-03 03:17:05.961862+00,,0 +1339,595,1237,,"Same energy. The tool you write is yours forever, the find is a moment.",2026-05-04 07:13:47.961862+00,2026-05-04 07:13:47.961862+00,,0 +1340,596,1237,,Metrobus writeup tradition. Respect.,2026-05-04 12:50:28.764013+00,2026-05-04 12:50:28.764013+00,,0 +1341,596,1249,,The commute can be the best study block if you let it be. Esenyurt solidarity.,2026-05-06 13:01:22.764013+00,2026-05-06 13:01:22.764013+00,,0 +1342,597,1201,,This insight separates the senior from the loud. Configuration > novelty. Keep that lens.,2026-04-26 14:14:55.043225+00,2026-04-26 14:14:55.043225+00,,0 +1343,597,1200,,"Same in SRE. Most outages are configuration, not novel failures.",2026-04-26 22:41:43.043225+00,2026-04-26 22:41:43.043225+00,,0 +1344,598,1201,,The prep teaches you more than the cert proves. The cert opens doors; the prep makes you useful.,2026-04-17 12:12:07.194815+00,2026-04-17 12:12:07.194815+00,,0 +1345,598,1237,,Reframing my OSCP year with this. Thanks.,2026-04-19 04:17:35.194815+00,2026-04-19 04:17:35.194815+00,,0 +1346,599,1201,,Best one-line definition of the profession I've ever heard.,2026-03-17 07:41:12.700883+00,2026-03-17 07:41:12.700883+00,,0 +1347,599,1237,,My grandfather calls me 'the boy who plays with computers.' Same energy.,2026-03-14 18:11:44.700883+00,2026-03-14 18:11:44.700883+00,,0 +1348,600,1197,,Local streets translate beautifully to low-poly. Keep posting the WIP.,2026-05-04 17:12:45.903837+00,2026-05-04 17:12:45.903837+00,,0 +1349,600,1214,,Saving for inspiration. The light is great.,2026-05-04 16:23:08.903837+00,2026-05-04 16:23:08.903837+00,,0 +1350,601,1197,,Range is for after depth. The painful one-pick is the right move at junior level.,2026-05-04 07:40:36.286176+00,2026-05-04 07:40:36.286176+00,,0 +1351,601,1214,,"Same lesson, opposite direction. I chose narrative; haven't regretted it.",2026-05-04 12:25:26.286176+00,2026-05-04 12:25:26.286176+00,,0 +1352,602,1210,,Ten users is more than zero users. Celebrating with you.,2026-04-27 18:06:27.632227+00,2026-04-27 18:06:27.632227+00,,0 +1353,602,1248,,What state management? Riverpod or Bloc?,2026-04-26 05:50:26.632227+00,2026-04-26 05:50:26.632227+00,,0 +1354,602,1206,,Pride in a small thing is the right energy for shipping.,2026-04-28 08:18:15.632227+00,2026-04-28 08:18:15.632227+00,,0 +1355,603,1206,,Three pages to one paragraph is the product skill. Compression is taste.,2026-05-07 07:41:35.085463+00,2026-05-07 07:41:35.085463+00,,0 +1356,603,1203,,Founders learn this the hard way. Glad you're learning it as a junior.,2026-05-06 20:34:03.085463+00,2026-05-06 20:34:03.085463+00,,0 +1357,604,1206,,Calm-as-a-feature is exactly right. Most apps are too loud and don't know why they fail to retain.,2026-05-01 12:27:05.425546+00,2026-05-01 12:27:05.425546+00,,0 +1358,604,1210,,Saving this. Will revisit my SwiftUI colors with this lens.,2026-04-30 17:55:07.425546+00,2026-04-30 17:55:07.425546+00,,0 +1359,605,1213,,Kartal sunset solidarity.,2026-04-27 06:29:21.737109+00,2026-04-27 06:29:21.737109+00,,0 +1360,605,1206,,Quiet brains ship more. Confirmed in my fifteenth year of this.,2026-04-28 14:47:15.737109+00,2026-04-28 14:47:15.737109+00,,0 +1361,606,1210,,Less code > more code. Always.,2026-05-08 08:04:21.062175+00,2026-05-08 08:04:21.062175+00,,0 +1362,606,1248,,Saving for my own refactor week.,2026-05-08 14:41:43.062175+00,2026-05-08 14:41:43.062175+00,,0 +1363,607,1206,,The Socratic code review is the right teaching method. You'll never forget that pattern now.,2026-05-06 14:44:46.579717+00,2026-05-06 14:44:46.579717+00,,0 +1364,607,1210,,Saving the technique. Mentors who don't give answers force you to grow.,2026-05-07 06:25:59.579717+00,2026-05-07 06:25:59.579717+00,,0 +1365,608,1210,,The cycle continues. Saving this for the next time someone asks me.,2026-05-10 02:50:07.353833+00,2026-05-10 02:50:07.353833+00,,0 +1366,608,1206,,You sounded like your mentor because that lesson stuck. That's the whole thing.,2026-05-09 17:50:17.353833+00,2026-05-09 17:50:17.353833+00,,0 +1367,609,1205,,Reading out loud is the test. Saving for my own mentees.,2026-04-07 18:52:48.67212+00,2026-04-07 18:52:48.67212+00,,0 +1368,609,1226,,"Same exercise on my side. Painful, useful.",2026-04-08 07:26:06.67212+00,2026-04-08 07:26:06.67212+00,,0 +1369,609,1224,,I'm going to do this tonight too. Thanks for the nudge.,2026-04-08 07:34:58.67212+00,2026-04-08 07:34:58.67212+00,,0 +1370,610,1200,,Welcome to the universal QA lesson. Explicit waits are the answer to 80% of flakes.,2026-04-05 18:32:05.342023+00,2026-04-05 18:32:05.342023+00,,0 +1371,610,1204,,Three weeks of pain is the only way to internalize it. You won't make this mistake again.,2026-04-06 00:20:59.342023+00,2026-04-06 00:20:59.342023+00,,0 +1372,611,1199,,Two honest out of six is actually a good ratio for cold-walking warehouses. Keep going.,2026-05-02 17:41:42.213535+00,2026-05-02 17:41:42.213535+00,,0 +1373,611,1203,,In-person customer discovery is the underrated startup skill. You're already ahead.,2026-05-02 16:43:33.213535+00,2026-05-02 16:43:33.213535+00,,0 +1374,611,1240,,Saving the warehouse-visit approach. Anatolian SMBs are not on LinkedIn.,2026-05-03 04:01:55.213535+00,2026-05-03 04:01:55.213535+00,,0 +1375,612,1199,,"The pre-mortem is the most useful pitch-prep exercise. Painful, illuminating.",2026-05-01 11:04:32.062644+00,2026-05-01 11:04:32.062644+00,,0 +1376,612,1203,,Going to make all my mentees do this.,2026-05-02 16:00:15.062644+00,2026-05-02 16:00:15.062644+00,,0 +1377,613,1199,,Notebook-less walks are when the real insights surface. Keep doing them.,2026-04-29 13:55:18.760229+00,2026-04-29 13:55:18.760229+00,,0 +1378,613,1240,,Solidarity from another small-town founder. The slower walks are an advantage.,2026-04-30 22:43:08.760229+00,2026-04-30 22:43:08.760229+00,,0 +1379,614,1232,,Reading comprehension is the right frame. Finding nothing on a battle-tested contract is normal.,2026-04-28 12:14:21.373256+00,2026-04-28 12:14:21.373256+00,,0 +1380,614,1201,,Same lesson in security audit broadly. The slow read is the skill.,2026-04-26 12:01:55.373256+00,2026-04-26 12:01:55.373256+00,,0 +1381,614,1217,,Audits are 90% reading. Saving the framing.,2026-04-27 11:04:14.373256+00,2026-04-27 11:04:14.373256+00,,0 +1382,615,1200,,Right priority order. Async writing > technical skill for remote effectiveness.,2026-04-20 21:55:59.151179+00,2026-04-20 21:55:59.151179+00,,0 +1383,615,1195,,Saving — same conversation I have with every remote-bound mentee.,2026-04-19 06:06:58.151179+00,2026-04-19 06:06:58.151179+00,,0 +1384,616,1232,,The 'without hindsight' clause is the senior skill. Studying old exploits with the answer hidden first is the right exercise.,2026-04-21 01:24:42.411217+00,2026-04-21 01:24:42.411217+00,,0 +1385,616,1201,,"Endorse the methodology. Hide the answer, then read.",2026-04-21 06:30:51.411217+00,2026-04-21 06:30:51.411217+00,,0 +1386,617,1201,,The kahvehane work session is an underrated work setup.,2026-03-24 19:57:49.705594+00,2026-03-24 19:57:49.705594+00,,0 +1387,617,1226,,Anatolian remote work has its own rhythm. Different is the value.,2026-03-27 03:00:28.705594+00,2026-03-27 03:00:28.705594+00,,0 +1388,618,1232,,First deployed contract is a feeling that doesn't repeat. Bottle it.,2026-04-26 18:16:16.599577+00,2026-04-26 18:16:16.599577+00,,0 +1389,618,1205,,Watching transactions you authored is its own reward. Welcome to the club.,2026-04-26 20:58:33.599577+00,2026-04-26 20:58:33.599577+00,,0 +1390,619,1201,,The 'read before you apply' move is what gets you taken seriously in this space.,2026-04-24 23:17:21.281325+00,2026-04-24 23:17:21.281325+00,,0 +1391,619,1232,,Same advice my mentor gave me. The list of 30 is a real research project.,2026-04-27 10:24:24.281325+00,2026-04-27 10:24:24.281325+00,,0 +1392,620,1232,,Struct packing is a gateway optimization. Welcome down the rabbit hole.,2026-05-08 03:26:19.938312+00,2026-05-08 03:26:19.938312+00,,0 +1393,620,1237,,The 'real engineers love small wins' line is a keeper.,2026-05-08 20:22:05.938312+00,2026-05-08 20:22:05.938312+00,,0 +1394,621,1226,,Family meals reset something in the brain. Underrated.,2026-04-27 09:34:57.26428+00,2026-04-27 09:34:57.26428+00,,0 +1395,621,1232,,Sunday no-laptop is a rule I should adopt.,2026-04-25 23:13:19.26428+00,2026-04-25 23:13:19.26428+00,,0 +1396,622,1201,,Writing > exploit-finding for impact. Reports persuade; bugs just exist.,2026-04-28 18:38:52.384518+00,2026-04-28 18:38:52.384518+00,,0 +1397,622,1232,,The career-shift moment for me was when I realized this.,2026-04-26 14:43:29.384518+00,2026-04-26 14:43:29.384518+00,,0 +1398,623,1220,,Same exercise. The 'want to work at' list is shorter and more honest.,2026-04-02 09:15:40.86688+00,2026-04-02 09:15:40.86688+00,,0 +1399,623,1216,,Career-switcher solidarity. The honest list takes courage to write.,2026-04-03 07:27:16.86688+00,2026-04-03 07:27:16.86688+00,,0 +1400,624,1226,,First deploy is the conversion moment from 'studying' to 'building.',2026-04-27 20:45:15.179164+00,2026-04-27 20:45:15.179164+00,,0 +1401,624,1220,,Same week — I just deployed mine. Solidarity.,2026-04-25 06:30:44.179164+00,2026-04-25 06:30:44.179164+00,,0 +1402,625,1216,,Çay-fueled productivity. Adana solidarity.,2026-04-11 06:06:27.732201+00,2026-04-11 06:06:27.732201+00,,0 +1403,625,1234,,The grandmother coffee-shop is unmatched.,2026-04-09 20:13:53.732201+00,2026-04-09 20:13:53.732201+00,,0 +1404,626,1207,,Same problem with me last month. The recording is the cure.,2026-03-25 06:47:22.656908+00,2026-03-25 06:47:22.656908+00,,0 +1405,626,1216,,We're going to be career-switcher hype-women for each other from now on.,2026-03-25 15:43:58.656908+00,2026-03-25 15:43:58.656908+00,,0 +1406,627,1226,,RSC docs are a moving target. Write the post — current ones are gold.,2026-04-18 20:22:42.468556+00,2026-04-18 20:22:42.468556+00,,0 +1407,627,1246,,Will read. The current state of RSC tutorials is genuinely confusing.,2026-04-21 12:51:58.468556+00,2026-04-21 12:51:58.468556+00,,0 +1408,628,1220,,Cutting model fields a day after writing them is the right rhythm. Saving.,2026-05-02 04:50:57.673336+00,2026-05-02 04:50:57.673336+00,,0 +1409,628,1224,,Same trap with React component props. Iterative cutting is the skill.,2026-05-03 07:27:25.673336+00,2026-05-03 07:27:25.673336+00,,0 +1410,629,1220,,"Saving too. Bootcamp got me the credential, the self-study habits get me through review.",2026-05-04 02:37:17.322418+00,2026-05-04 02:37:17.322418+00,,0 +1411,629,1216,,True. The depth lasts.,2026-05-05 07:11:48.322418+00,2026-05-05 07:11:48.322418+00,,0 +1412,630,1216,,Done > impressive. Repeating this to myself.,2026-04-30 10:35:28.081992+00,2026-04-30 10:35:28.081992+00,,0 +1413,630,1247,,Personal finance ETL is the universal first real project. Add it to the canon.,2026-04-29 20:16:16.081992+00,2026-04-29 20:16:16.081992+00,,0 +1414,631,1222,,Sakarya solidarity. The library walks are foundational.,2026-04-18 11:21:23.611185+00,2026-04-18 11:21:23.611185+00,,0 +1415,631,1226,,Walking is the most underrated dev skill.,2026-04-17 11:24:47.611185+00,2026-04-17 11:24:47.611185+00,,0 +1416,632,1204,,Re-reading the same code with a week's distance is the skill. You'll see new things every time.,2026-05-01 11:20:59.015244+00,2026-05-01 11:20:59.015244+00,,0 +1417,632,1220,,Saving the methodology.,2026-05-03 01:33:50.015244+00,2026-05-03 01:33:50.015244+00,,0 +1418,633,1220,,Going to do this tonight. Excellent.,2026-04-22 14:06:38.599101+00,2026-04-22 14:06:38.599101+00,,0 +1419,633,1216,,Career planning via 'what would I learn' is the right lens. Stealing.,2026-04-23 12:06:31.599101+00,2026-04-23 12:06:31.599101+00,,0 +1420,634,1200,,Coverage as 'proof you thought about failure modes' is exactly right. Don't let purists tell you otherwise.,2026-04-27 11:47:15.57464+00,2026-04-27 11:47:15.57464+00,,0 +1421,634,1221,,Saving the line about proof-of-thought.,2026-04-30 06:20:01.57464+00,2026-04-30 06:20:01.57464+00,,0 +1422,635,1211,,The hour-after questions are the real signal. Glad you ran this.,2026-04-24 15:39:40.10513+00,2026-04-24 15:39:40.10513+00,,0 +1423,635,1215,,Stealing the session format. Going to run a GRE prep one in Çanakkale.,2026-04-24 15:58:36.10513+00,2026-04-24 15:58:36.10513+00,,0 +1424,635,1222,,Community-work-compounds is exactly right. Most don't see it for two years.,2026-04-23 21:20:32.10513+00,2026-04-23 21:20:32.10513+00,,0 +1425,636,1198,,The written charter is what separates a club from a Whatsapp group.,2026-05-09 21:22:42.682563+00,2026-05-09 21:22:42.682563+00,,0 +1426,636,1211,,Saving the framing for the campus group I'm starting at Bogazici.,2026-05-11 12:12:23.682563+00,2026-05-11 12:12:23.682563+00,,0 +1427,637,1228,,Same coast. Different end of the city. We should meet up.,2026-04-20 19:42:20.561124+00,2026-04-20 19:42:20.561124+00,,0 +1428,637,1211,,Saving the 'content fisherman' image.,2026-04-22 03:17:58.561124+00,2026-04-22 03:17:58.561124+00,,0 +1429,638,1215,,Spreadsheet view is the move. The dates side-by-side calm the application anxiety.,2026-04-23 08:49:31.796066+00,2026-04-23 08:49:31.796066+00,,0 +1430,638,1211,,Doing this tomorrow. Side-by-side is the lens.,2026-04-24 03:11:27.796066+00,2026-04-24 03:11:27.796066+00,,0 +1431,639,1199,,The 'useless' answers are the gift. The politeness is the noise.,2026-04-26 13:20:27.470952+00,2026-04-26 13:20:27.470952+00,,0 +1432,639,1203,,Same lesson on every founder journey. Bias toward harsh interviews.,2026-04-26 17:03:20.470952+00,2026-04-26 17:03:20.470952+00,,0 +1433,639,1219,,Doing my first interviews this week. Need this reminder.,2026-04-24 09:28:31.470952+00,2026-04-24 09:28:31.470952+00,,0 +1434,640,1199,,Continuously-deciding-what-not-to-ship is the best one-sentence definition I've heard.,2026-04-22 23:18:55.31401+00,2026-04-22 23:18:55.31401+00,,0 +1435,640,1203,,Saving for the next time someone asks me.,2026-04-22 17:31:37.31401+00,2026-04-22 17:31:37.31401+00,,0 +1436,641,1206,,The 5-paragraph feature request is a gift. Reply with care.,2026-04-30 00:47:53.428189+00,2026-04-30 00:47:53.428189+00,,0 +1437,641,1219,,Same energy. Tiny apps with strong opinions > generic apps.,2026-05-01 14:42:37.428189+00,2026-05-01 14:42:37.428189+00,,0 +1438,642,1220,,Ankara solidarity. The boulevards are the underrated feature.,2026-05-02 09:00:12.672708+00,2026-05-02 09:00:12.672708+00,,0 +1439,642,1228,,Same walks. Glad someone else notices.,2026-04-30 11:35:36.672708+00,2026-04-30 11:35:36.672708+00,,0 +1440,643,1220,,The real-vs-wishlist filter is the time-saving move. Stealing.,2026-05-08 03:11:31.265128+00,2026-05-08 03:11:31.265128+00,,0 +1441,643,1216,,Doing this tonight.,2026-05-10 14:55:19.265128+00,2026-05-10 14:55:19.265128+00,,0 +1442,644,1227,,That question separates juniors from seniors. The answer is: pre-commit to the cut list.,2026-04-22 20:12:28.667262+00,2026-04-22 20:12:28.667262+00,,0 +1443,644,1203,,Pre-commit-to-cuts is the answer. Save the diagram you make for next time.,2026-04-25 02:32:49.667262+00,2026-04-25 02:32:49.667262+00,,0 +1444,645,1227,,"Yes — the bar is structure, not polish. Saving.",2026-04-18 08:17:06.009681+00,2026-04-18 08:17:06.009681+00,,0 +1445,645,1203,,True. Working specs > pretty specs.,2026-04-19 05:26:03.009681+00,2026-04-19 05:26:03.009681+00,,0 +1446,646,1200,,VPC networking is the universal bottleneck. Two focused weeks will get you there.,2026-05-10 00:31:00.558684+00,2026-05-10 00:31:00.558684+00,,0 +1447,646,1207,,Same stuck point. Going to follow your lead.,2026-05-08 19:09:35.558684+00,2026-05-08 19:09:35.558684+00,,0 +1448,647,1200,,The homelab > the cert. Lock down those instances before you regret further.,2026-04-29 04:17:25.685097+00,2026-04-29 04:17:25.685097+00,,0 +1449,647,1217,,Saving for my own cloud-prep era.,2026-04-30 12:37:05.685097+00,2026-04-30 12:37:05.685097+00,,0 +1450,648,1200,,Sea-view Terraform is the move. Endorsed.,2026-04-15 21:28:54.547662+00,2026-04-15 21:28:54.547662+00,,0 +1451,648,1207,,Karşıyaka is jealous.,2026-04-17 07:20:03.547662+00,2026-04-17 07:20:03.547662+00,,0 +1452,649,1198,,CV > public LB is rule one. Internalize it.,2026-04-28 14:32:17.749571+00,2026-04-28 14:32:17.749571+00,,0 +1453,649,1209,,Same lesson last week. Got too excited about a public score and overfitted my way to a worse private.,2026-04-29 20:01:34.749571+00,2026-04-29 20:01:34.749571+00,,0 +1454,650,1209,,Same conversation. Half-and-half time split is what I'm trying now.,2026-04-10 13:38:56.068832+00,2026-04-10 13:38:56.068832+00,,0 +1455,650,1198,,Saving the framing. The half-and-half mix is right.,2026-04-10 21:13:12.068832+00,2026-04-10 21:13:12.068832+00,,0 +1456,651,1209,,Saving brain capacity for the work that matters. Right call.,2026-05-07 10:51:28.321481+00,2026-05-07 10:51:28.321481+00,,0 +1457,651,1207,,Solidarity from Karşıyaka.,2026-05-07 10:04:10.321481+00,2026-05-07 10:04:10.321481+00,,0 +1458,652,1219,,Three users + one crash = a real product. Welcome.,2026-04-26 12:32:29.432155+00,2026-04-26 12:32:29.432155+00,,0 +1459,652,1248,,Android 14 has subtle changes that broke a lot of stuff. Let me know what bit you.,2026-04-26 03:25:37.432155+00,2026-04-26 03:25:37.432155+00,,0 +1460,653,1219,,Bloc → Riverpod is the silent migration of 2024-25. Joining you.,2026-05-02 10:13:43.988041+00,2026-05-02 10:13:43.988041+00,,0 +1461,653,1210,,"Curious — for a small app, was the migration cost real?",2026-04-30 15:02:10.988041+00,2026-04-30 15:02:10.988041+00,,0 +1462,654,1197,,Writing a company README backward is a senior career-planning move. Saving.,2026-04-29 13:40:00.307869+00,2026-04-29 13:40:00.307869+00,,0 +1463,654,1219,,Stealing the exercise.,2026-04-29 00:57:59.307869+00,2026-04-29 00:57:59.307869+00,,0 +1464,655,1214,,Tekirdağ solidarity. We're both writing from the right coast.,2026-05-03 19:36:49.958644+00,2026-05-03 19:36:49.958644+00,,0 +1465,655,1197,,Returning home is a senior move you don't get credit for until you've done it.,2026-05-02 00:57:47.958644+00,2026-05-02 00:57:47.958644+00,,0 +1466,656,1219,,100 commits / month is the right cadence at our stage.,2026-05-10 15:22:55.043368+00,2026-05-10 15:22:55.043368+00,,0 +1467,656,1248,,Quantity-as-quality-gateway is the lesson. Saving.,2026-05-09 13:01:10.043368+00,2026-05-09 13:01:10.043368+00,,0 +1468,657,1219,,Speed-as-compliment is rare and valuable. Don't lose it on the dark-mode iteration.,2026-04-20 19:33:48.512787+00,2026-04-20 19:33:48.512787+00,,0 +1469,657,1206,,Saving for the calm-is-a-feature conversation we keep having.,2026-04-20 20:13:25.512787+00,2026-04-20 20:13:25.512787+00,,0 +1470,658,1200,,Don't release on Friday is the universal SRE rule. Carry it your whole career.,2026-05-01 23:20:17.915032+00,2026-05-01 23:20:17.915032+00,,0 +1471,658,1204,,Saving for my own next mentee.,2026-05-01 10:49:35.915032+00,2026-05-01 10:49:35.915032+00,,0 +1472,659,1221,,Mom-as-QA is the gold standard. Saving.,2026-04-30 12:34:14.133421+00,2026-04-30 12:34:14.133421+00,,0 +1473,659,1219,,Family installs are the harshest test.,2026-04-30 20:32:03.133421+00,2026-04-30 20:32:03.133421+00,,0 +1474,660,1223,,Trust-model > math. Welcome to the right side of this discipline.,2026-05-03 21:06:34.444198+00,2026-05-03 21:06:34.444198+00,,0 +1475,660,1201,,Same in security overall. The model is the work.,2026-05-02 06:05:43.444198+00,2026-05-02 06:05:43.444198+00,,0 +1476,661,1223,,Three lines in an hour is the right pace for senior-tier review.,2026-05-03 05:15:21.170752+00,2026-05-03 05:15:21.170752+00,,0 +1477,661,1201,,Saving the lesson.,2026-05-01 21:44:45.170752+00,2026-05-01 21:44:45.170752+00,,0 +1478,662,1207,,Ferry-as-study-room. Karşıyaka solidarity.,2026-04-20 06:31:31.574116+00,2026-04-20 06:31:31.574116+00,,0 +1479,662,1230,,Bornova co-signs. The Izmir water commute is underrated focus time.,2026-04-19 13:30:20.574116+00,2026-04-19 13:30:20.574116+00,,0 +1480,663,1216,,Reframing is the work. The systems-thinking lens is bankable.,2026-04-28 21:43:58.778926+00,2026-04-28 21:43:58.778926+00,,0 +1481,663,1234,,Same trick worked for me. Mech-eng → BA is a real pipeline.,2026-04-29 02:45:22.778926+00,2026-04-29 02:45:22.778926+00,,0 +1482,664,1216,,Restaurant costs is a classic first-real-BA project. Endorse.,2026-04-25 04:03:53.137785+00,2026-04-25 04:03:53.137785+00,,0 +1483,664,1212,,Excel models for friends are how everyone in finance starts. Keep going.,2026-04-25 02:18:04.137785+00,2026-04-25 02:18:04.137785+00,,0 +1484,665,1246,,Data shape > UI is the hidden lesson. Cloning teaches it; tutorials hide it.,2026-05-12 00:59:21.418627+00,2026-05-12 00:59:21.418627+00,,0 +1485,665,1224,,Saving the framing. Going to clone something this weekend.,2026-05-12 03:39:21.418627+00,2026-05-12 03:39:21.418627+00,,0 +1486,666,1224,,Same advice. The decision-narrative is what gets you hired.,2026-04-26 07:48:31.1035+00,2026-04-26 07:48:31.1035+00,,0 +1487,666,1216,,Decision > artifact. Saving for my interviews.,2026-04-25 14:23:41.1035+00,2026-04-25 14:23:41.1035+00,,0 +1488,667,1212,,Welcome to quant finance. The textbook hides the disagreement. Real practitioners argue about it.,2026-04-20 13:36:48.593619+00,2026-04-20 13:36:48.593619+00,,0 +1489,667,1242,,Saving — same project I'm starting this weekend.,2026-04-20 13:32:05.593619+00,2026-04-20 13:32:05.593619+00,,0 +1490,668,1212,,Explain-ability is the senior bar. Save the line.,2026-05-05 05:28:59.428906+00,2026-05-05 05:28:59.428906+00,,0 +1491,668,1242,,Stealing for my own report.,2026-05-04 20:58:53.428906+00,2026-05-04 20:58:53.428906+00,,0 +1492,669,1227,,The sunny window apartment is a foundational study setup. Çankaya nods.,2026-04-28 02:52:03.239604+00,2026-04-28 02:52:03.239604+00,,0 +1493,669,1220,,Mamak agrees. Sun + a desk is all you need.,2026-04-27 09:28:26.239604+00,2026-04-27 09:28:26.239604+00,,0 +1494,670,1210,,Closures are the gateway. Four reads is correct. Don't skip.,2026-04-21 22:17:03.407644+00,2026-04-21 22:17:03.407644+00,,0 +1495,670,1197,,Same advice my mentor in games gave me about coroutines. The gateway concept is the one to slow down on.,2026-04-21 18:07:34.407644+00,2026-04-21 18:07:34.407644+00,,0 +1496,671,1210,,Reading-docs-efficiently is its own skill. Saving the technique.,2026-05-05 21:58:50.328206+00,2026-05-05 21:58:50.328206+00,,0 +1497,671,1219,,Going to apply this to Flutter docs tomorrow.,2026-05-05 04:07:48.328206+00,2026-05-05 04:07:48.328206+00,,0 +1498,672,1223,,Writing > solving for retention. Saving the lesson.,2026-05-05 20:27:51.584405+00,2026-05-05 20:27:51.584405+00,,0 +1499,672,1217,,Same problem. Writeups force the deep understanding.,2026-05-06 16:21:05.584405+00,2026-05-06 16:21:05.584405+00,,0 +1500,672,1215,,Going to start writing solutions instead of just AC-ing.,2026-05-06 06:14:08.584405+00,2026-05-06 06:14:08.584405+00,,0 +1501,673,1204,,Templates-as-landmines is exactly right. Understand the invariants or live with bugs forever.,2026-04-18 04:44:05.907566+00,2026-04-18 04:44:05.907566+00,,0 +1502,673,1223,,Saving for the next time I copy-paste a template.,2026-04-17 11:50:09.907566+00,2026-04-17 11:50:09.907566+00,,0 +1503,674,1204,,"Both/and, not either/or. The distributed cache is the right project.",2026-04-09 22:28:34.177518+00,2026-04-09 22:28:34.177518+00,,0 +1504,674,1195,,CP + systems is the rare combo. Worth the reluctance.,2026-04-08 15:46:37.177518+00,2026-04-08 15:46:37.177518+00,,0 +1505,675,1223,,Slow compounding is the only compounding. Endorse.,2026-04-22 04:31:38.789317+00,2026-04-22 04:31:38.789317+00,,0 +1506,675,1215,,Saving the metric. 25 minutes is the bar I'm aiming for.,2026-04-22 10:11:20.789317+00,2026-04-22 10:11:20.789317+00,,0 +1507,676,1227,,METU squirrels are a national treasure.,2026-04-30 14:44:53.262691+00,2026-04-30 14:44:53.262691+00,,0 +1508,676,1220,,Mamak co-signs. Spring evenings on campus are restorative.,2026-05-02 05:22:30.262691+00,2026-05-02 05:22:30.262691+00,,0 +1509,677,1223,,Endurance > cleverness. The senior bar.,2026-05-04 03:19:02.131742+00,2026-05-04 03:19:02.131742+00,,0 +1510,677,1217,,Same in security. Sit with the problem longer.,2026-05-05 02:18:47.131742+00,2026-05-05 02:18:47.131742+00,,0 +1511,678,1204,,Welcome to design questions. The gap is fixable; takes about three months of focused reps.,2026-04-30 10:18:02.481251+00,2026-04-30 10:18:02.481251+00,,0 +1512,678,1195,,Glad you found the gap before the real interview. Now we work on it.,2026-05-02 04:27:37.481251+00,2026-05-02 04:27:37.481251+00,,0 +1513,679,1219,,Welcome. The counter-app compile is the moment for many of us.,2026-05-07 19:33:45.709637+00,2026-05-07 19:33:45.709637+00,,0 +1514,679,1231,,First widget energy is the best energy. Bottle it.,2026-05-06 09:40:33.709637+00,2026-05-06 09:40:33.709637+00,,0 +1515,679,1210,,Day one feeling. Hold onto it through the bad days.,2026-05-05 07:34:03.709637+00,2026-05-05 07:34:03.709637+00,,0 +1516,680,1223,,V2 is the right one to start with. Three reads is the right pace.,2026-04-12 16:59:56.035329+00,2026-04-12 16:59:56.035329+00,,0 +1517,680,1232,,Saving the rhythm. Going to apply to my own reading.,2026-04-13 10:36:19.035329+00,2026-04-13 10:36:19.035329+00,,0 +1518,681,1222,,Walking into kebab places with a notebook is the move. Anatolian SMB founder solidarity.,2026-04-18 01:54:24.090411+00,2026-04-18 01:54:24.090411+00,,0 +1519,681,1199,,The 'three problems you hadn't considered' is exactly what discovery gives you. Keep walking in.,2026-04-20 00:10:53.090411+00,2026-04-20 00:10:53.090411+00,,0 +1520,682,1222,,Same reframe my mentor gave me. Saving.,2026-05-05 18:11:48.282097+00,2026-05-05 18:11:48.282097+00,,0 +1521,682,1199,,Geography-as-moat is real. Sakarya founders nod from across the country.,2026-05-03 16:47:52.282097+00,2026-05-03 16:47:52.282097+00,,0 +1522,683,1222,,Sakarya solidarity. The distance from Istanbul is the gift.,2026-05-04 13:27:22.517468+00,2026-05-04 13:27:22.517468+00,,0 +1523,683,1199,,Izmir co-signs. Choose your geography.,2026-05-05 13:36:01.517468+00,2026-05-05 13:36:01.517468+00,,0 +1524,684,1226,,Sleep first is the right priority order. Saving.,2026-04-27 15:29:05.47025+00,2026-04-27 15:29:05.47025+00,,0 +1525,684,1225,,Same realization three weeks ago. Sleep is the lever.,2026-04-29 10:59:24.47025+00,2026-04-29 10:59:24.47025+00,,0 +1526,684,1228,,Going to ask the same question to myself. Probably won't like the answer.,2026-04-27 00:52:40.47025+00,2026-04-27 00:52:40.47025+00,,0 +1527,685,1230,,Cleaning > modeling for hours spent. Welcome to the actual job.,2026-04-22 20:37:22.885479+00,2026-04-22 20:37:22.885479+00,,0 +1528,685,1212,,Same week. The 'missing value philosophy' is the underrated decision.,2026-04-22 05:41:33.885479+00,2026-04-22 05:41:33.885479+00,,0 +1529,686,1230,,Questions > models. Saving.,2026-05-07 17:35:16.708227+00,2026-05-07 17:35:16.708227+00,,0 +1530,686,1198,,The same lesson in research. The question is the work.,2026-05-06 07:51:35.708227+00,2026-05-06 07:51:35.708227+00,,0 +1531,687,1212,,Şişli solidarity. The 'which is harder' debate is the apartment ritual.,2026-04-27 14:28:30.739929+00,2026-04-27 14:28:30.739929+00,,0 +1532,687,1230,,Bornova nods. Cooking together is the negotiation tool.,2026-04-26 23:46:56.739929+00,2026-04-26 23:46:56.739929+00,,0 +1533,688,1206,,Role-play is undervalued in PM training. Three reps is the bar.,2026-05-06 19:47:51.051424+00,2026-05-06 19:47:51.051424+00,,0 +1534,688,1228,,Going to ask for this exercise. Stealing.,2026-05-05 21:01:31.051424+00,2026-05-05 21:01:31.051424+00,,0 +1535,688,1227,,Same lesson. Practice in low-stakes rooms before high-stakes ones.,2026-05-06 20:05:13.051424+00,2026-05-06 20:05:13.051424+00,,0 +1536,689,1206,,One-pagers are the senior PM skill. Saving the line about compression-as-taste.,2026-04-22 23:55:34.678453+00,2026-04-22 23:55:34.678453+00,,0 +1537,689,1227,,Going to compress my own. Three to one is the right ratio.,2026-04-23 19:31:09.678453+00,2026-04-23 19:31:09.678453+00,,0 +1538,690,1228,,Bursa solidarity. The university gardens are foundational.,2026-04-30 01:32:43.387482+00,2026-04-30 01:32:43.387482+00,,0 +1539,690,1227,,Saving the image. Tea + sun + notebook is the formula.,2026-04-30 19:16:39.387482+00,2026-04-30 19:16:39.387482+00,,0 +1540,691,1206,,The 'metrics we will not move' clause is what separates senior product spec writing. Save it.,2026-05-02 16:08:48.809345+00,2026-05-02 16:08:48.809345+00,,0 +1541,691,1203,,Founders love this clause. Saves the painful 'why did this regress' meeting later.,2026-05-01 07:40:22.809345+00,2026-05-01 07:40:22.809345+00,,0 +1542,692,1243,,The apology-as-insight is exactly right. People know what's broken; they don't think they're allowed to say.,2026-05-06 21:12:33.926584+00,2026-05-06 21:12:33.926584+00,,0 +1543,692,1227,,Saving for my own interviews.,2026-05-07 01:07:30.926584+00,2026-05-07 01:07:30.926584+00,,0 +1544,693,1196,,The ten-posts-zero-customers anti-pattern. Universal.,2026-04-19 12:07:00.210891+00,2026-04-19 12:07:00.210891+00,,0 +1545,693,1249,,Same pattern at my friend's site. Saving the framing.,2026-04-18 14:37:20.210891+00,2026-04-18 14:37:20.210891+00,,0 +1546,693,1224,,Going to do the same audit for my bootcamp's site.,2026-04-18 13:29:47.210891+00,2026-04-18 13:29:47.210891+00,,0 +1547,694,1196,,GA4 + great writing is the rare combo. Two hours a day is the right investment.,2026-04-29 17:16:42.315801+00,2026-04-29 17:16:42.315801+00,,0 +1548,694,1212,,Same advice from my mentor — visualization + writing. Compound.,2026-05-01 11:10:43.315801+00,2026-05-01 11:10:43.315801+00,,0 +1549,695,1196,,Cuts > details. The fundamental writing law. Saving.,2026-05-04 06:34:21.709375+00,2026-05-04 06:34:21.709375+00,,0 +1550,695,1243,,Saving for my one-pagers.,2026-05-03 01:10:19.709375+00,2026-05-03 01:10:19.709375+00,,0 +1551,696,1216,,Bakırköy solidarity. The marina walk is the writer's office.,2026-05-03 18:44:12.680549+00,2026-05-03 18:44:12.680549+00,,0 +1552,696,1244,,Same neighbourhood. We should meet.,2026-05-03 13:08:27.680549+00,2026-05-03 13:08:27.680549+00,,0 +1553,697,1196,,"Intent > volume since at least 2023, but it takes time to internalize. Old playbook is indeed dead.",2026-04-29 00:26:00.340194+00,2026-04-29 00:26:00.340194+00,,0 +1554,697,1249,,Same observation. The volume-chasers haven't caught up.,2026-04-30 09:08:22.340194+00,2026-04-30 09:08:22.340194+00,,0 +1555,698,1195,,10x is the universal stress test. The cache-strategy shift is the real lesson.,2026-04-20 13:45:09.088389+00,2026-04-20 13:45:09.088389+00,,0 +1556,698,1204,,Going to make all my mentees do the 10x question.,2026-04-21 01:46:10.088389+00,2026-04-21 01:46:10.088389+00,,0 +1557,698,1202,,Same exercise saved me in my first senior interview.,2026-04-21 01:11:21.088389+00,2026-04-21 01:11:21.088389+00,,0 +1613,724,1210,,Socratic code review is the way. Will use this on my future juniors.,2026-05-08 11:38:18.34826+00,2026-05-08 11:38:18.34826+00,,0 +1558,699,1195,,Delivery guarantees are the work. Glad you found that out before production found it for you.,2026-04-20 08:56:39.812474+00,2026-04-20 08:56:39.812474+00,,0 +1559,699,1204,,Saving the framing. Most queue tutorials skip the guarantees discussion.,2026-04-18 06:56:42.812474+00,2026-04-18 06:56:42.812474+00,,0 +1560,700,1225,,Graph mental model > scripts. Saving.,2026-05-07 00:16:19.783115+00,2026-05-07 00:16:19.783115+00,,0 +1561,700,1212,,Same realization. dbt makes the dependencies visible.,2026-05-05 09:42:16.783115+00,2026-05-05 09:42:16.783115+00,,0 +1562,701,1225,,Great-SQL > enough-SQL. Saving.,2026-04-18 06:53:30.811916+00,2026-04-18 06:53:30.811916+00,,0 +1563,701,1212,,Clarity-as-skill is the senior bar.,2026-04-16 11:51:43.811916+00,2026-04-16 11:51:43.811916+00,,0 +1564,702,1220,,Mamak grandmother solidarity.,2026-04-13 06:11:11.802593+00,2026-04-13 06:11:11.802593+00,,0 +1565,702,1224,,Adana grandma is jealous.,2026-04-13 12:02:52.802593+00,2026-04-13 12:02:52.802593+00,,0 +1566,703,1197,,GPS noise is the universal first lesson. Kalman filters or simpler? Start simpler.,2026-04-25 10:28:29.197092+00,2026-04-25 10:28:29.197092+00,,0 +1567,703,1219,,Same problem I hit. The noise is the data engineer's problem masquerading as a mobile problem.,2026-04-24 13:48:52.197092+00,2026-04-24 13:48:52.197092+00,,0 +1568,704,1197,,The one-paragraph 'why' is the production person's filter. Use it forever.,2026-04-20 10:42:36.015312+00,2026-04-20 10:42:36.015312+00,,0 +1569,704,1219,,Saving the rewrite-five-times rhythm.,2026-04-22 13:27:28.015312+00,2026-04-22 13:27:28.015312+00,,0 +1570,704,1206,,Same advice but in design clothing. Compression is taste.,2026-04-20 07:08:10.015312+00,2026-04-20 07:08:10.015312+00,,0 +1571,705,1231,,Architecture-as-optimization is exactly right. The naive 'smaller images' move loses every time.,2026-04-09 06:50:57.678935+00,2026-04-09 06:50:57.678935+00,,0 +1572,705,1219,,Saving the framing for my own profiling work.,2026-04-08 17:05:35.678935+00,2026-04-08 17:05:35.678935+00,,0 +1573,706,1197,,Forest-morning + code-afternoon is a senior career configuration.,2026-04-30 01:22:43.211704+00,2026-04-30 01:22:43.211704+00,,0 +1574,706,1231,,Cousin is wrong. Tekirdağ co-signs Sarıyer.,2026-04-30 21:18:48.211704+00,2026-04-30 21:18:48.211704+00,,0 +1575,707,1196,,First paid SEO gig from an audit is the entry point. Congrats.,2026-05-04 23:12:41.420356+00,2026-05-04 23:12:41.420356+00,,0 +1576,707,1245,,Same path. The one-page summary > the 30-page deck.,2026-05-05 04:06:55.420356+00,2026-05-05 04:06:55.420356+00,,0 +1577,707,1216,,Saving for my own portfolio strategy.,2026-05-03 14:32:39.420356+00,2026-05-03 14:32:39.420356+00,,0 +1578,708,1196,,Empathy-at-scale is the best SEO definition I've heard. Stealing.,2026-04-21 05:38:06.424316+00,2026-04-21 05:38:06.424316+00,,0 +1579,708,1245,,Saving.,2026-04-23 14:36:04.424316+00,2026-04-23 14:36:04.424316+00,,0 +1580,709,1217,,Esenyurt solidarity. The 'neighbourhood I resented' arc is universal.,2026-04-28 21:16:28.795842+00,2026-04-28 21:16:28.795842+00,,0 +1581,709,1245,,Hometown reframing is a senior skill.,2026-04-26 08:01:40.795842+00,2026-04-26 08:01:40.795842+00,,0 +1582,710,1214,,Paper > grayboxing for level design. Saving.,2026-04-21 03:05:17.160441+00,2026-04-21 03:05:17.160441+00,,0 +1583,710,1197,,Paper-first is what separates the designers who ship from the ones who don't. Glad you found it early.,2026-04-18 22:17:15.160441+00,2026-04-18 22:17:15.160441+00,,0 +1584,710,1206,,Same principle in product design. Paper > Figma for v1.,2026-04-20 17:50:37.160441+00,2026-04-20 17:50:37.160441+00,,0 +1585,711,1214,,Readability > pretty. Saving for my narrative levels too.,2026-03-19 08:29:53.551509+00,2026-03-19 08:29:53.551509+00,,0 +1586,711,1206,,Same in UX. Readable > pretty.,2026-03-17 09:03:28.551509+00,2026-03-17 09:03:28.551509+00,,0 +1587,712,1214,,The designer-brain that never turns off is the gift. Save the observation.,2026-04-12 07:59:32.18687+00,2026-04-12 07:59:32.18687+00,,0 +1588,712,1216,,Bakırköy market is the underrated design school.,2026-04-10 17:52:32.18687+00,2026-04-10 17:52:32.18687+00,,0 +1589,713,1198,,The forgetting-the-middle is universal. Recording is the cure. Doing it again is the discipline.,2026-04-29 10:04:25.967176+00,2026-04-29 10:04:25.967176+00,,0 +1590,713,1202,,Same first-time experience. Repetition is everything.,2026-04-29 23:22:15.967176+00,2026-04-29 23:22:15.967176+00,,0 +1591,713,1220,,Saving. Going to do this myself.,2026-04-30 18:41:04.967176+00,2026-04-30 18:41:04.967176+00,,0 +1592,714,1198,,Survival is the right first goal. The 60 seconds compound.,2026-05-02 11:34:07.517236+00,2026-05-02 11:34:07.517236+00,,0 +1593,714,1202,,Toastmasters works. Stick with it.,2026-05-03 00:10:44.517236+00,2026-05-03 00:10:44.517236+00,,0 +1594,715,1198,,Story > slides. The book is right; the cliche is earned.,2026-04-21 09:47:53.557934+00,2026-04-21 09:47:53.557934+00,,0 +1595,715,1206,,Same in design presentations. The story drives the artifact.,2026-04-21 12:00:28.557934+00,2026-04-21 12:00:28.557934+00,,0 +1596,716,1212,,Şişli study group solidarity. The 'we're all nervous' realization is the unlock.,2026-05-05 23:49:13.172308+00,2026-05-05 23:49:13.172308+00,,0 +1597,716,1242,,Joining your group if you'll have me.,2026-05-06 21:25:43.172308+00,2026-05-06 21:25:43.172308+00,,0 +1598,717,1198,,Metrics > feelings during skill-acquisition. Trust the process; the feeling catches up in month four.,2026-05-02 08:25:43.30666+00,2026-05-02 08:25:43.30666+00,,0 +1599,717,1202,,Pace is the universal next thing. Saving.,2026-05-01 00:37:12.30666+00,2026-05-01 00:37:12.30666+00,,0 +1600,718,1210,,Crash rate is the universal junior lesson. Sentry or Crashlytics — pick one tonight.,2026-05-10 05:34:30.019048+00,2026-05-10 05:34:30.019048+00,,0 +1601,718,1219,,Same path. 50 testers and a crash rate is real-world ML.,2026-05-08 03:44:19.019048+00,2026-05-08 03:44:19.019048+00,,0 +1602,718,1236,,TestFlight betas teach you more than tutorials. Save the crashes for retrospective.,2026-05-10 08:58:58.019048+00,2026-05-10 08:58:58.019048+00,,0 +1603,719,1210,,SwiftData is the right starting point now. CoreData is for when you outgrow it.,2026-05-09 18:48:59.062431+00,2026-05-09 18:48:59.062431+00,,0 +1604,719,1236,,Saving — same migration coming up for me.,2026-05-09 14:47:13.062431+00,2026-05-09 14:47:13.062431+00,,0 +1605,720,1210,,Ship-compounds is the only line that matters. Saving.,2026-05-05 20:21:15.392738+00,2026-05-05 20:21:15.392738+00,,0 +1606,720,1219,,True. Most stop shipping at year 5 and never recover.,2026-05-04 17:19:33.392738+00,2026-05-04 17:19:33.392738+00,,0 +1607,721,1210,,Widgets are an architectural commitment. The shipping rate explains itself.,2026-04-26 23:01:22.342603+00,2026-04-26 23:01:22.342603+00,,0 +1608,721,1236,,Saving — going to budget more time for my own widget work.,2026-04-26 12:05:54.342603+00,2026-04-26 12:05:54.342603+00,,0 +1609,722,1204,,Pendik ferry solidarity. The commute is the sacred work block.,2026-05-09 02:02:53.975397+00,2026-05-09 02:02:53.975397+00,,0 +1610,722,1219,,Kartal jealous of the ferry option.,2026-05-10 17:02:13.975397+00,2026-05-10 17:02:13.975397+00,,0 +1611,723,1210,,"Modifier order is the SwiftUI tax. Pay it, never forget it.",2026-04-16 12:30:12.323473+00,2026-04-16 12:30:12.323473+00,,0 +1612,723,1236,,Saving the framing. Foreign-language-with-grammar is exactly right.,2026-04-18 07:23:02.323473+00,2026-04-18 07:23:02.323473+00,,0 +1614,724,1204,,Stealing the technique. Don't name it; let them find it.,2026-05-08 19:36:30.34826+00,2026-05-08 19:36:30.34826+00,,0 +1615,725,1210,,Family-as-UX-research. The real users have always lived there.,2026-05-06 17:36:04.441444+00,2026-05-06 17:36:04.441444+00,,0 +1616,725,1244,,Saving for my own user-research practice.,2026-05-05 19:37:48.441444+00,2026-05-05 19:37:48.441444+00,,0 +1617,726,1210,,Toy implementation > documentation for understanding. Save this discipline.,2026-05-05 14:40:23.79644+00,2026-05-05 14:40:23.79644+00,,0 +1618,726,1236,,Going to do the same with SwiftData internals.,2026-05-06 04:09:00.79644+00,2026-05-06 04:09:00.79644+00,,0 +1619,727,1229,,Congratulations. The cert is the artifact; the persistence is the skill.,2026-04-28 20:05:02.16617+00,2026-04-28 20:05:02.16617+00,,0 +1620,727,1207,,Hatay solidarity from Karşıyaka. Earned every page of it.,2026-04-27 10:38:27.16617+00,2026-04-27 10:38:27.16617+00,,0 +1621,727,1226,,Saving the framing. The proof is in the continuing.,2026-04-25 21:02:59.16617+00,2026-04-25 21:02:59.16617+00,,0 +1622,728,1200,,Self-directed learners are in demand. Believe it.,2026-05-10 14:12:11.472118+00,2026-05-10 14:12:11.472118+00,,0 +1623,728,1223,,Diyarbakır co-signs Hatay. Remote-first found us both.,2026-05-09 21:43:38.472118+00,2026-05-09 21:43:38.472118+00,,0 +1624,729,1229,,IAM is the actual cloud job. Everyone learns this through pain.,2026-05-08 06:05:45.961046+00,2026-05-08 06:05:45.961046+00,,0 +1625,729,1200,,Saving — same conversation with every junior.,2026-05-09 13:45:18.961046+00,2026-05-09 13:45:18.961046+00,,0 +1626,730,1229,,Hatay rebuilding is a story the country needs to hear more often.,2026-05-03 05:10:52.739021+00,2026-05-03 05:10:52.739021+00,,0 +1627,730,1200,,Saving the image. Sending strength.,2026-05-03 00:38:14.739021+00,2026-05-03 00:38:14.739021+00,,0 +1628,731,1200,,Plan-first is the right cognitive model for all infra. Save this preference.,2026-04-28 13:40:59.487782+00,2026-04-28 13:40:59.487782+00,,0 +1629,731,1229,,Solidarity from Antalya. Terraform plan is calming.,2026-04-29 13:15:56.487782+00,2026-04-29 13:15:56.487782+00,,0 +1630,732,1200,,Letter-to-past-self is the right reflection exercise. Saving for my own mentees.,2026-05-05 00:11:48.560736+00,2026-05-05 00:11:48.560736+00,,0 +1631,732,1226,,Same exercise. Three pages was right. Going to edit mine too.,2026-05-05 02:42:13.560736+00,2026-05-05 02:42:13.560736+00,,0 +1632,733,1247,,Real-data ETL is the only way to learn. The city writing back is the proof.,2026-04-10 21:43:10.658965+00,2026-04-10 21:43:10.658965+00,,0 +1633,733,1253,,Saving the framing. Going to look at my own city's open data.,2026-04-10 19:49:35.658965+00,2026-04-10 19:49:35.658965+00,,0 +1634,733,1225,,Local impact > tutorial repeats.,2026-04-10 17:14:34.658965+00,2026-04-10 17:14:34.658965+00,,0 +1635,734,1259,,This is exactly what I've been doing — polishing a track instead of admitting the verse is weak. Going to rewrite tonight.,2026-05-03 02:34:09.555798+00,2026-05-03 02:34:09.555798+00,,0 +1636,734,1266,,Saving. Same pattern in podcasting — editing what should have been re-recorded.,2026-05-05 00:21:11.555798+00,2026-05-05 00:21:11.555798+00,,0 +1637,734,1258,,Translates one-to-one to cinematography. Lighting can't fix the blocking.,2026-05-04 07:11:09.555798+00,2026-05-04 07:11:09.555798+00,,0 +1638,735,1266,,Three-system test is the move. Borrowing for podcast masters too.,2026-05-07 04:21:57.784217+00,2026-05-07 04:21:57.784217+00,,0 +1639,735,1259,,Why is the car version always the harshest one?,2026-05-05 16:22:41.784217+00,2026-05-05 16:22:41.784217+00,,0 +1640,736,1258,,Cihangir dinner solidarity. The collaborations always start at the kitchen sink.,2026-05-05 12:30:17.429607+00,2026-05-05 12:30:17.429607+00,,0 +1641,736,1256,,Saving the visual. Drawing this for next time.,2026-05-05 03:59:12.429607+00,2026-05-05 03:59:12.429607+00,,0 +1642,737,1259,,This is the conversation my classmates avoid. Plugin GAS is real.,2026-05-04 15:25:07.69552+00,2026-05-04 15:25:07.69552+00,,0 +1643,737,1266,,Same advice for audio editing. The default tools are 90% of what you need.,2026-05-07 11:12:53.69552+00,2026-05-07 11:12:53.69552+00,,0 +1644,737,1260,,Translates to filmmaking gear. Saving.,2026-05-04 17:07:35.69552+00,2026-05-04 17:07:35.69552+00,,0 +1645,738,1261,,Caught myself asking the brushes question yesterday. Reframing tonight.,2026-05-04 19:57:27.186065+00,2026-05-04 19:57:27.186065+00,,0 +1646,738,1214,,Same trap in game design — engine vs. game. Saving.,2026-05-05 09:08:21.186065+00,2026-05-05 09:08:21.186065+00,,0 +1647,738,1258,,Lens questions vs. story questions. Universal hierarchy.,2026-05-05 00:07:03.186065+00,2026-05-05 00:07:03.186065+00,,0 +1648,739,1261,,Joining you tomorrow. One minute is the right constraint.,2026-04-24 10:15:15.934436+00,2026-04-24 10:15:15.934436+00,,0 +1649,739,1263,,Saving. Going to try with film stills — one a day.,2026-04-23 12:19:33.934436+00,2026-04-23 12:19:33.934436+00,,0 +1650,739,1197,,Production solidarity. The constraint releases the noise.,2026-04-22 01:02:44.934436+00,2026-04-22 01:02:44.934436+00,,0 +1651,740,1261,,Constraint-as-gift is the framing. Saving.,2026-04-25 08:59:44.224471+00,2026-04-25 08:59:44.224471+00,,0 +1652,740,1262,,Writers love briefs like this. The 'no people' frees the cover to be about the mood.,2026-04-25 14:42:48.224471+00,2026-04-25 14:42:48.224471+00,,0 +1653,741,1255,,Tatlı solidarity. Cihangir cats have the same union.,2026-04-21 16:34:08.906409+00,2026-04-21 16:34:08.906409+00,,0 +1654,741,1257,,"Konya stray cats are also in the union, just less famous.",2026-04-22 03:51:22.906409+00,2026-04-22 03:51:22.906409+00,,0 +1655,742,1261,,Going to delete an hour of eye-rendering from my current piece. Trust restored.,2026-05-03 03:07:10.836837+00,2026-05-03 03:07:10.836837+00,,0 +1656,742,1263,,Translates to portrait photography. The simplest portrait reads loudest.,2026-05-02 16:58:26.836837+00,2026-05-02 16:58:26.836837+00,,0 +1657,743,1263,,Writing captions before the trip is counterintuitive but brilliant. Going to try on my next field day.,2026-05-02 14:41:38.232043+00,2026-05-02 14:41:38.232043+00,,0 +1658,743,1262,,The 'caption as standalone' rule applies to writing too. Saving.,2026-05-03 01:52:24.232043+00,2026-05-03 01:52:24.232043+00,,0 +1659,743,1258,,Translates to documentary film. The voice-over should hold without the picture.,2026-05-02 18:14:07.232043+00,2026-05-02 18:14:07.232043+00,,0 +1660,744,1263,,Saving the ratio framing. I keep three times too much.,2026-05-05 05:13:13.365397+00,2026-05-05 05:13:13.365397+00,,0 +1661,744,1256,,Same in drawing. Editing is the actual craft.,2026-05-03 02:18:00.365397+00,2026-05-03 02:18:00.365397+00,,0 +1662,745,1263,,This is a clean line I needed to hear stated this directly. Saving.,2026-05-08 01:19:21.617439+00,2026-05-08 01:19:21.617439+00,,0 +1663,745,1262,,Same line in journalism — never paraphrase a quote and call it direct.,2026-05-08 19:22:47.617439+00,2026-05-08 19:22:47.617439+00,,0 +1664,746,1263,,Antalya light is different but the slowness lesson translates.,2026-05-09 07:34:53.950223+00,2026-05-09 07:34:53.950223+00,,0 +1665,746,1197,,"Erzurum solidarity. Different light, same retreat.",2026-05-08 18:31:51.950223+00,2026-05-08 18:31:51.950223+00,,0 +1666,747,1260,,Spent a year obsessing over cameras before learning to block a scene. Painful lesson.,2026-05-01 02:04:37.232281+00,2026-05-01 02:04:37.232281+00,,0 +1667,747,1257,,Same in photojournalism. The body is the last 10%.,2026-05-03 16:23:07.232281+00,2026-05-03 16:23:07.232281+00,,0 +1668,747,1197,,Production solidarity. The choices are the work.,2026-05-01 23:55:20.232281+00,2026-05-01 23:55:20.232281+00,,0 +1669,748,1260,,Mirror is the textbook. Five viewings and I still see new things.,2026-05-05 13:16:28.096088+00,2026-05-05 13:16:28.096088+00,,0 +1670,748,1198,,"Same lesson in research papers — slow reading first, fast skimming later.",2026-05-04 22:59:17.096088+00,2026-05-04 22:59:17.096088+00,,0 +1671,748,1214,,Saving for narrative game inspiration.,2026-05-05 22:24:37.096088+00,2026-05-05 22:24:37.096088+00,,0 +1672,749,1260,,Going to call my sound designer tonight and apologize.,2026-04-10 19:48:33.771332+00,2026-04-10 19:48:33.771332+00,,0 +1673,749,1266,,Audio person nodding aggressively at the back.,2026-04-11 11:31:48.771332+00,2026-04-11 11:31:48.771332+00,,0 +1674,749,1255,,Music people agree. Picture without song is a clip; song without picture is a song.,2026-04-11 04:26:41.771332+00,2026-04-11 04:26:41.771332+00,,0 +1675,750,1257,,AA days solidarity. The 'everything except work' conversation is the work.,2026-05-08 19:03:20.684456+00,2026-05-08 19:03:20.684456+00,,0 +1676,750,1255,,"Same nights in Cihangir. Drink, complain, collaborate the next day.",2026-05-07 22:59:08.684456+00,2026-05-07 22:59:08.684456+00,,0 +1677,751,1262,,Same problem in fiction writing. The structure becomes the trap.,2026-05-05 15:00:58.186548+00,2026-05-05 15:00:58.186548+00,,0 +1678,751,1260,,Reading it now. The first read was useless; the third is starting to click.,2026-05-06 16:03:03.186548+00,2026-05-06 16:03:03.186548+00,,0 +1679,752,1260,,Cutting my treatment from 18 to 8 pages tonight.,2026-03-22 20:02:41.453842+00,2026-03-22 20:02:41.453842+00,,0 +1680,752,1214,,Game-design version: cut the scope to one mechanic. Saving.,2026-03-22 14:09:07.453842+00,2026-03-22 14:09:07.453842+00,,0 +1681,752,1206,,Done > abandoned. Universal craft law.,2026-03-24 06:32:00.453842+00,2026-03-24 06:32:00.453842+00,,0 +1682,753,1255,,Unevenness-as-diagnostic is exactly right. Saving the framing.,2026-05-06 22:31:33.40739+00,2026-05-06 22:31:33.40739+00,,0 +1683,753,1266,,Audio side: same lesson with takes. The bad take shows you what to fix.,2026-05-05 10:26:31.40739+00,2026-05-05 10:26:31.40739+00,,0 +1684,753,1265,,Theater warm-up principle. Each rep reveals a different gap.,2026-05-06 13:09:02.40739+00,2026-05-06 13:09:02.40739+00,,0 +1685,754,1255,,The 'why play' question is the only honest one. Three pages is the right answer length.,2026-04-30 21:52:14.430373+00,2026-04-30 21:52:14.430373+00,,0 +1686,754,1260,,"Same energy: 'why film, not why study film' — saving this for my own work.",2026-05-01 15:17:39.430373+00,2026-05-01 15:17:39.430373+00,,0 +1687,755,1255,,Cihangir solidarity. The walk is the warm-up.,2026-04-14 01:54:15.440914+00,2026-04-14 01:54:15.440914+00,,0 +1688,755,1256,,"Kadıköy nods. Different bridge, same walk.",2026-04-13 13:21:37.440914+00,2026-04-13 13:21:37.440914+00,,0 +1689,756,1258,,Crying for the unmade is a senior craft move. Save the feeling for when you're cutting someone else's 18 down to 8.,2026-04-29 15:47:15.295623+00,2026-04-29 15:47:15.295623+00,,0 +1690,756,1262,,Same energy in writing — cutting darlings.,2026-04-28 16:06:27.295623+00,2026-04-28 16:06:27.295623+00,,0 +1691,756,1214,,Game design cut grief. Solidarity.,2026-04-28 01:05:26.295623+00,2026-04-28 01:05:26.295623+00,,0 +1692,757,1258,,'Scared silences' is the most accurate beginner diagnosis I've read. Keep the line.,2026-03-29 11:35:35.40063+00,2026-03-29 11:35:35.40063+00,,0 +1693,757,1198,,Translates to academic writing — fearful gaps vs. confident pauses. Saving.,2026-03-28 17:33:11.40063+00,2026-03-28 17:33:11.40063+00,,0 +1694,758,1258,,The 240x ratio is a real metric. Don't fight it.,2026-04-24 12:37:32.708161+00,2026-04-24 12:37:32.708161+00,,0 +1695,758,1262,,Same with prose. The hour-per-paragraph rate during real edits.,2026-04-24 00:44:36.708161+00,2026-04-24 00:44:36.708161+00,,0 +1696,759,1258,,Bursa film club is the reason cinema outside Istanbul still has a heartbeat.,2026-04-27 23:43:39.698471+00,2026-04-27 23:43:39.698471+00,,0 +1697,759,1262,,Solidarity from Adana. The small-city film club is its own institution.,2026-04-26 05:50:15.698471+00,2026-04-26 05:50:15.698471+00,,0 +1698,760,1256,,"Day seven worse than day one is a feature, not a bug. You're seeing your work differently now.",2026-04-21 04:09:30.35857+00,2026-04-21 04:09:30.35857+00,,0 +1699,760,1263,,Same lesson in photography. Bad days are the diagnostic.,2026-04-22 23:10:50.35857+00,2026-04-22 23:10:50.35857+00,,0 +1700,760,1214,,Saving — same pattern in pixel art.,2026-04-23 06:12:56.35857+00,2026-04-23 06:12:56.35857+00,,0 +1701,761,1256,,The 'I don't know — good' moment is the start of voice work. Saving.,2026-05-05 14:03:30.045508+00,2026-05-05 14:03:30.045508+00,,0 +1702,761,1262,,Same with writing. The 'I don't know' is where the story lives.,2026-05-05 23:00:05.045508+00,2026-05-05 23:00:05.045508+00,,0 +1703,762,1263,,Eskişehir is criminally good for studies. Saving the location for my next field day.,2026-04-09 11:21:00.395904+00,2026-04-09 11:21:00.395904+00,,0 +1704,762,1226,,Anadolu solidarity. The old town is the best classroom.,2026-04-07 23:09:40.395904+00,2026-04-07 23:09:40.395904+00,,0 +1705,763,1256,,Cool > world is the trap. Saving.,2026-05-09 11:40:56.407471+00,2026-05-09 11:40:56.407471+00,,0 +1706,763,1214,,Same in game design — flashy mechanic vs. world-building mechanic.,2026-05-09 11:47:26.407471+00,2026-05-09 11:47:26.407471+00,,0 +1707,764,1263,,Wish I had this with another photographer in Antalya. The breakfast critique is the institution.,2026-05-04 09:18:35.923737+00,2026-05-04 09:18:35.923737+00,,0 +1708,764,1262,,Same energy in writers' households. Brutal and kind.,2026-05-02 20:54:04.923737+00,2026-05-02 20:54:04.923737+00,,0 +1709,765,1258,,Same in cinematography. The shot that looks effortless took the longest.,2026-05-04 20:35:31.120893+00,2026-05-04 20:35:31.120893+00,,0 +1710,765,1256,,Illustration cousins of this principle. Saving.,2026-05-03 00:42:29.120893+00,2026-05-03 00:42:29.120893+00,,0 +1711,765,1261,,Adding to my reading list. The 'easy sentence' lesson is universal.,2026-05-04 00:01:05.120893+00,2026-05-04 00:01:05.120893+00,,0 +1712,766,1258,,Cut > rewrite is the universal craft law. Saving forever.,2026-04-30 14:02:11.828616+00,2026-04-30 14:02:11.828616+00,,0 +1713,766,1260,,Cinema version of the same lesson. Cut what the cut tells us.,2026-04-28 22:30:42.828616+00,2026-04-28 22:30:42.828616+00,,0 +1714,767,1234,,Adana morning solidarity. The deleted words are also the work.,2026-05-11 01:26:59.285861+00,2026-05-11 01:26:59.285861+00,,0 +1715,767,1261,,Stealing the morning sanctity. Going to try tomorrow.,2026-05-10 16:28:33.285861+00,2026-05-10 16:28:33.285861+00,,0 +1716,768,1257,,Trust > technique is the lesson. Eleven frames is fast for a portrait worth keeping.,2026-05-09 08:45:34.314542+00,2026-05-09 08:45:34.314542+00,,0 +1717,768,1258,,Same in documentary film. The camera disappears when the relationship is built.,2026-05-08 10:37:31.314542+00,2026-05-08 10:37:31.314542+00,,0 +1718,768,1262,,Translates to nonfiction writing. Saving.,2026-05-08 20:38:49.314542+00,2026-05-08 20:38:49.314542+00,,0 +1719,769,1257,,Not joking. Best exercise I know for documentary work. Saves you from the wrong photos.,2026-04-29 00:57:29.533346+00,2026-04-29 00:57:29.533346+00,,0 +1720,769,1262,,Same exercise translates to fiction — outline before writing. Saving.,2026-04-29 12:26:45.533346+00,2026-04-29 12:26:45.533346+00,,0 +1721,770,1257,,Konya is the same — three cities a day. The graduation from tourist is the craft moment.,2026-04-06 14:16:45.853118+00,2026-04-06 14:16:45.853118+00,,0 +1722,770,1229,,Antalya solidarity. 6am at the marina is unmatched.,2026-04-06 18:17:00.853118+00,2026-04-06 18:17:00.853118+00,,0 +1723,771,1257,,Two frames after twenty minutes is a senior ratio. Glad you saw it that way.,2026-05-07 12:56:57.238738+00,2026-05-07 12:56:57.238738+00,,0 +1724,771,1262,,Time-as-budget. Saving for nonfiction writing.,2026-05-07 13:40:37.238738+00,2026-05-07 13:40:37.238738+00,,0 +1725,772,1255,,Repetition-without-contempt is the music studio mantra too. Saving.,2026-04-20 09:07:55.004276+00,2026-04-20 09:07:55.004276+00,,0 +1726,772,1258,,"Same in lighting practice. Take, fail, take again.",2026-04-22 19:13:33.004276+00,2026-04-22 19:13:33.004276+00,,0 +1727,773,1258,,Beyoğlu midnight walks are restorative. Different tired is the right tired.,2026-04-28 09:11:15.890811+00,2026-04-28 09:11:15.890811+00,,0 +1728,773,1256,,Same energy in the studio. Tired-from-doing > tired-from-deciding.,2026-04-28 19:41:05.890811+00,2026-04-28 19:41:05.890811+00,,0 +1729,774,1258,,Twenty-three to disappear is exact and beautiful. Saving.,2026-04-29 23:08:09.584441+00,2026-04-29 23:08:09.584441+00,,0 +1730,774,1259,,Same with a phrase in piano. The number is real.,2026-04-30 03:37:14.584441+00,2026-04-30 03:37:14.584441+00,,0 +1731,774,1255,,Music studio version: same trail to selflessness. Saving.,2026-04-28 07:47:11.584441+00,2026-04-28 07:47:11.584441+00,,0 +1732,775,1258,,Yes-and is also a directing skill. Saving the diagnostic.,2026-05-04 01:08:35.678906+00,2026-05-04 01:08:35.678906+00,,0 +1733,775,1251,,Going to take an improv class for my public speaking. Saving.,2026-05-03 22:16:38.678906+00,2026-05-03 22:16:38.678906+00,,0 +1734,776,1259,,Vapur as rehearsal space. Cihangir is jealous.,2026-04-13 09:10:40.817061+00,2026-04-13 09:10:40.817061+00,,0 +1735,776,1257,,Konya solidarity from a fellow city-outside-Istanbul. The bay light is unmatched.,2026-04-11 13:18:52.817061+00,2026-04-11 13:18:52.817061+00,,0 +1736,777,1255,,Three takes is often enough; the next thirteen are the calibration. Save the cold-open take three energy.,2026-04-24 15:49:11.911114+00,2026-04-24 15:49:11.911114+00,,0 +1737,777,1258,,Same in shooting. The early take has something the polished ones lose.,2026-04-25 17:44:15.911114+00,2026-04-25 17:44:15.911114+00,,0 +1738,777,1260,,Saving for my voice-over recording next week.,2026-04-26 05:13:54.911114+00,2026-04-26 05:13:54.911114+00,,0 +1739,778,1255,,200ms is the right knob. Glad you tried it.,2026-05-05 07:38:53.554288+00,2026-05-05 07:38:53.554288+00,,0 +1740,778,1258,,"Cinema version: the cut is the meaning, not the shot.",2026-05-07 04:37:15.554288+00,2026-05-07 04:37:15.554288+00,,0 +1741,778,1259,,Same in music phrasing. The rest is the music.,2026-05-04 14:45:41.554288+00,2026-05-04 14:45:41.554288+00,,0 +1742,779,1268,,The 'small number who write defensively' filter is exactly how I survey the literature too. Save the names you keep coming back to.,2026-04-27 14:34:39.975027+00,2026-04-27 14:34:39.975027+00,,0 +1743,779,1198,,The defensive writers are the ones who'll review your work charitably later. Worth knowing them early.,2026-04-27 00:52:28.975027+00,2026-04-27 00:52:28.975027+00,,0 +1744,779,1211,,"Same energy. The non-falsifiable papers are great for vocabulary, terrible for direction.",2026-04-25 15:01:57.975027+00,2026-04-25 15:01:57.975027+00,,0 +1745,780,1198,,The six-month commitment requirement is the right filter. Honest of you to surface it openly.,2026-04-30 17:15:08.805559+00,2026-04-30 17:15:08.805559+00,,0 +1746,780,1215,,Same realization on my side. Short engagements are useful but they don't compound.,2026-04-28 18:09:15.805559+00,2026-04-28 18:09:15.805559+00,,0 +1747,781,1227,,Çankaya kitchen-table study setup is the underrated grad-prep environment.,2026-05-05 20:08:38.350278+00,2026-05-05 20:08:38.350278+00,,0 +1748,781,1215,,Same in my apartment but with fewer people. Saving the image energy.,2026-05-04 20:10:35.350278+00,2026-05-04 20:10:35.350278+00,,0 +1749,782,1268,,Toy-implementation is the senior research move. The intuition you build is permanent.,2026-04-28 21:43:11.932592+00,2026-04-28 21:43:11.932592+00,,0 +1750,782,1270,,Same approach for understanding evals. Build the harness yourself once.,2026-04-30 01:03:36.932592+00,2026-04-30 01:03:36.932592+00,,0 +1751,782,1223,,Saving — Solidity audits have the same lesson.,2026-04-28 03:49:20.932592+00,2026-04-28 03:49:20.932592+00,,0 +1752,783,1215,,Sunday cards solidarity. The non-work hours are where the work gets metabolized.,2026-05-05 07:03:15.858086+00,2026-05-05 07:03:15.858086+00,,0 +1753,783,1211,,İskambil > productivity podcasts.,2026-05-04 10:29:42.858086+00,2026-05-04 10:29:42.858086+00,,0 +1754,784,1267,,This is exactly the choice I keep avoiding. Going to commit to one for my next draft.,2026-04-20 22:21:08.666079+00,2026-04-20 22:21:08.666079+00,,0 +1755,784,1205,,Same lesson in responsible AI work. Auditors and engineers want different artifacts.,2026-04-20 03:35:50.666079+00,2026-04-20 03:35:50.666079+00,,0 +1756,784,1270,,AI safety has the same fork: technical alignment work vs policy communication. Authors who try both rarely do either well.,2026-04-21 17:46:23.666079+00,2026-04-21 17:46:23.666079+00,,0 +1757,785,1198,,Frankfurt should be required reading in any research methodology course. Saving the framing.,2026-05-04 14:02:17.976286+00,2026-05-04 14:02:17.976286+00,,0 +1758,785,1267,,Buying tonight. The careless/careful distinction maps perfectly to what I've been struggling to articulate.,2026-05-01 19:33:43.976286+00,2026-05-01 19:33:43.976286+00,,0 +1759,786,1267,,This reframe makes the decision feel actionable instead of existential. Thank you.,2026-05-02 01:26:29.264009+00,2026-05-02 01:26:29.264009+00,,0 +1760,786,1269,,The 'constraints that shape your taste' line is exact. Saving.,2026-05-02 09:09:24.264009+00,2026-05-02 09:09:24.264009+00,,0 +1761,786,1198,,Endorse completely. The choice is about who you want to become.,2026-04-30 06:42:00.264009+00,2026-04-30 06:42:00.264009+00,,0 +1762,787,1248,,Sarıyer forest solidarity. The trail-as-reset is real.,2026-04-08 02:21:44.581449+00,2026-04-08 02:21:44.581449+00,,0 +1763,787,1198,,Üsküdar runs aren't quite the same but the principle holds.,2026-04-09 18:21:04.581449+00,2026-04-09 18:21:04.581449+00,,0 +1764,788,1198,,When-to-stop is the entire senior research skill. Saving.,2026-05-10 22:14:09.225935+00,2026-05-10 22:14:09.225935+00,,0 +1765,788,1267,,I am the 'never stop' kind. Need this advice tattooed.,2026-05-12 03:34:27.225935+00,2026-05-12 03:34:27.225935+00,,0 +1766,788,1211,,Same — going to print the line.,2026-05-10 05:23:17.225935+00,2026-05-10 05:23:17.225935+00,,0 +1767,789,1267,,Saving — re-reading my draft tonight with this question in mind.,2026-05-03 03:49:00.077743+00,2026-05-03 03:49:00.077743+00,,0 +1768,789,1211,,"Same realization on my fourth draft. The CV is the floor, the question is the bar.",2026-05-01 07:03:31.077743+00,2026-05-01 07:03:31.077743+00,,0 +1769,789,1215,,Going to print this above my desk for the next 3 months.,2026-05-03 08:34:34.077743+00,2026-05-03 08:34:34.077743+00,,0 +1770,790,1205,,Same conviction on the responsible-AI side. The combination is the underserved gap.,2026-05-05 00:04:39.912141+00,2026-05-05 00:04:39.912141+00,,0 +1771,790,1267,,Adding to my reading list. This is the dimension I've been ignoring.,2026-05-06 12:06:25.912141+00,2026-05-06 12:06:25.912141+00,,0 +1772,791,1267,,Needed to hear this. Bilkent isn't top-30 globally and I'd internalized that as a hard ceiling.,2026-05-05 04:18:55.644942+00,2026-05-05 04:18:55.644942+00,,0 +1773,791,1211,,"Same school, same fear. Saving.",2026-05-05 22:14:32.644942+00,2026-05-05 22:14:32.644942+00,,0 +1774,791,1226,,Going to amplify this in my campus club's session this week.,2026-05-05 05:50:15.644942+00,2026-05-05 05:50:15.644942+00,,0 +1775,792,1198,,Slow days for slow decisions. Saving the principle.,2026-04-23 21:33:05.086026+00,2026-04-23 21:33:05.086026+00,,0 +1776,792,1268,,PhD admissions committees deserve more credit for the time they spend reading. Thank you for the slow read.,2026-04-24 04:20:06.086026+00,2026-04-24 04:20:06.086026+00,,0 +1777,793,1267,,This is the conversation my Twitter feed avoids. Saving and going to do the homework.,2026-04-27 03:34:44.673654+00,2026-04-27 03:34:44.673654+00,,0 +1778,793,1205,,Same line in responsible-AI policy work. Most pundits couldn't articulate the technical disagreements they're moralizing about.,2026-04-26 10:46:41.673654+00,2026-04-26 10:46:41.673654+00,,0 +1779,793,1268,,Endorse completely. The 'follower' tax is real and expensive.,2026-04-24 18:49:52.673654+00,2026-04-24 18:49:52.673654+00,,0 +1780,794,1268,,The summary-as-deliverable / methodology-as-proof split is the publishing pattern that actually works. Saving.,2026-04-30 22:30:48.395065+00,2026-04-30 22:30:48.395065+00,,0 +1781,794,1269,,Send a link when it's public — I'll add to the AI policy seminar reading list.,2026-05-01 10:39:50.395065+00,2026-05-01 10:39:50.395065+00,,0 +1782,794,1267,,Following the launch. Will be reading the methodology notes whether anyone else does or not.,2026-05-01 05:43:25.395065+00,2026-05-01 05:43:25.395065+00,,0 +1783,795,1203,,Same lesson on the general founder side. Fundraising is leverage acquired.,2026-04-29 03:56:32.403907+00,2026-04-29 03:56:32.403907+00,,0 +1784,795,1199,,Endorse. People who avoid the money conversations end up making the worst trade-offs because they didn't have the leverage to push back.,2026-04-29 18:53:13.403907+00,2026-04-29 18:53:13.403907+00,,0 +1785,796,1203,,Founder rhythm is the underrated milestone. Took me eight months. Glad you got there in five.,2026-04-30 23:36:18.238559+00,2026-04-30 23:36:18.238559+00,,0 +1786,796,1268,,Sarıyer sunrises agree. The Bosphorus is the founder's office.,2026-05-02 08:11:29.238559+00,2026-05-02 08:11:29.238559+00,,0 +1787,797,1267,,Saving this — it's the same conversation I'm having with myself this week.,2026-05-01 19:42:34.773124+00,2026-05-01 19:42:34.773124+00,,0 +1788,797,1269,,Reframed beautifully. The mentor-as-decision-variable is the right lens.,2026-05-01 23:56:32.773124+00,2026-05-01 23:56:32.773124+00,,0 +1789,797,1268,,Endorse — the prestige reverse-optimization is what produces unhappy juniors at top labs.,2026-05-02 09:37:05.773124+00,2026-05-02 09:37:05.773124+00,,0 +1790,798,1231,,"This is exactly where I am right now. Three features in, the fourth is making me hate the code I wrote two months ago.",2026-05-12 01:33:53.431813+00,2026-05-12 01:33:53.431813+00,,0 +1791,798,1219,,Saving. Will pace my own re-architecture with this lens.,2026-05-12 11:45:23.431813+00,2026-05-12 11:45:23.431813+00,,0 +1792,798,1248,,"Same wall, smaller scale. Going to take the slow walk through it.",2026-05-10 03:53:59.431813+00,2026-05-10 03:53:59.431813+00,,0 +1793,799,1231,,Read the changelog twice yesterday. Going to follow your write-up closely.,2026-04-21 11:24:48.54341+00,2026-04-21 11:24:48.54341+00,,0 +1794,799,1219,,Already migrating one screen. The expressive theming is genuine progress.,2026-04-19 16:35:02.54341+00,2026-04-19 16:35:02.54341+00,,0 +1795,799,1236,,Going to start a similar migration on my side.,2026-04-20 05:44:42.54341+00,2026-04-20 05:44:42.54341+00,,0 +1796,800,1200,,Calm-in-your-chest is the right metric. Saving for SRE training.,2026-04-23 20:51:14.405632+00,2026-04-23 20:51:14.405632+00,,0 +1797,800,1231,,Same lesson for me at a much smaller scale. Wrote a unit test last week that saved a Friday release.,2026-04-25 05:40:06.405632+00,2026-04-25 05:40:06.405632+00,,0 +1798,800,1202,,Endorse. The exact mix depends on the team's incident history.,2026-04-22 07:36:50.405632+00,2026-04-22 07:36:50.405632+00,,0 +1799,801,1231,,Mentee here. Thanks for putting the engagement in such kind language. Won't tweet about this much.,2026-04-29 23:57:22.22617+00,2026-04-29 23:57:22.22617+00,,0 +1800,801,1219,,The 'without crushing the shipping instinct' clause is the hardest part of growing engineers.,2026-04-29 12:46:26.22617+00,2026-04-29 12:46:26.22617+00,,0 +1801,802,1204,,Kadıköy solidarity. The cargo-bike-and-daughter routine is the right kind of weekend.,2026-05-03 19:54:48.741391+00,2026-05-03 19:54:48.741391+00,,0 +1802,802,1256,,"Same neighbourhood, different routine. Moda Çay Bahçesi forever.",2026-05-03 16:23:03.741391+00,2026-05-03 16:23:03.741391+00,,0 diff --git a/scripts/seed_snapshot_data/data/feed_post_hashtags.csv b/scripts/seed_snapshot_data/data/feed_post_hashtags.csv new file mode 100644 index 00000000..7473953e --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_post_hashtags.csv @@ -0,0 +1,562 @@ +post_id,tag +515,postgres +515,databasemigration +515,systemdesign +516,springboot +516,java +516,virtualthreads +517,systemdesign +517,interviewprep +518,devlife +519,distributedsystems +519,systemdesign +520,mentorship +520,careergrowth +521,opensearch +521,elasticsearch +522,hiring +522,engineeringculture +523,marketing +523,growth +524,books +524,positioning +525,gamedev +525,production +526,liveops +526,gamedev +527,life +527,gamedev +528,leadership +528,career +529,phd +529,academicwriting +530,research +530,machinelearning +531,publicspeaking +531,communication +532,academia +533,research +533,productivity +534,phd +534,gradschool +535,entrepreneurship +535,startup +536,sre +536,oncall +537,terraform +537,devops +538,devops +538,deployment +539,worklife +539,oncall +540,ebpf +540,sre +541,security +541,threatmodeling +542,security +542,ot +543,zerotrust +543,security +544,history +545,engineeringmanagement +545,leadership +546,life +546,management +547,fundraising +547,startup +548,books +548,founders +549,gtm +549,devtools +550,founderlife +551,java +551,architecture +552,springboot +552,java +553,istanbullife +554,ai +554,governance +555,euaiact +555,aigovernance +556,ai +556,documentation +557,istanbullife +558,design +558,portfolio +559,figma +559,design +560,designsystems +560,strategy +561,life +561,cooking +562,design +562,critique +563,books +563,design +564,life +565,mentorship +565,career +566,docker +566,devops +567,aiethics +567,mentorship +568,mlops +568,fastapi +569,mentorship +569,mlops +570,swift +570,ios +571,ios +571,learninginpublic +572,life +573,mentorship +573,ios +574,phd +574,academicwriting +575,family +575,academiclife +576,nlp +576,research +577,dataviz +577,finance +578,dataviz +578,mentorship +579,istanbullife +580,ai +580,safety +581,mentorship +581,responsibleai +582,istanbullife +583,gamedesign +583,storytelling +584,gamedev +584,mentorship +585,gre +585,gradschool +586,canakkale +586,life +587,phd +587,mentorship +588,gre +588,languagelearning +589,careerswitch +589,mentorship +590,sql +590,dataanalysis +591,careerswitch +591,life +592,tableau +592,portfolio +593,bugbounty +593,security +594,mentorship +594,security +595,pentesting +595,python +596,istanbullife +596,commute +597,security +597,cve +598,oscp +598,mentorship +599,family +599,security +600,gamedev +600,blender +601,mentorship +601,gamedev +602,flutter +602,buildinginpublic +603,product +603,mentorship +604,design +604,flutter +605,istanbullife +606,flutter +606,refactoring +607,mentorship +607,codereview +608,family +608,career +609,jobsearch +609,mentorship +610,qa +610,selenium +611,customerdiscovery +611,startup +612,startup +612,mentorship +613,founder +613,life +614,solidity +614,audit +615,remotework +615,mentorship +616,defi +616,security +617,remotelife +617,diyarbakir +618,solidity +618,ethereum +619,career +619,mentorship +620,solidity +620,optimization +621,family +621,diyarbakir +622,audit +622,writing +623,jobsearch +623,mentorship +624,react +624,deployment +625,adana +625,life +626,interview +626,mentorship +627,react +627,learninginpublic +628,django +628,python +629,mentorship +629,selftaught +630,python +630,dataanalysis +631,sakarya +631,life +632,django +632,reading +633,career +633,mentorship +634,testing +634,python +635,communitybuilding +635,research +636,mentorship +636,leadership +637,samsun +637,life +638,gradschool +638,productivity +639,userresearch +639,product +640,product +640,mentorship +641,buildinginpublic +641,product +642,ankara +642,life +643,career +643,mentorship +644,product +644,workshop +645,product +645,mentorship +646,aws +646,certification +647,aws +647,mentorship +648,antalya +648,life +649,machinelearning +649,kaggle +650,ml +650,mentorship +651,izmir +651,life +652,flutter +652,shippingthings +653,flutter +653,riverpod +654,career +654,mentorship +655,tekirdag +655,life +656,flutter +656,shipping +657,userfeedback +657,product +658,devops +658,mentorship +659,family +659,qa +660,defi +660,solidity +661,mentorship +661,audit +662,izmir +662,life +663,careerswitch +663,mentorship +664,businessanalysis +664,portfolio +665,react +665,frontend +666,frontend +666,mentorship +667,quant +667,riskanalysis +668,riskanalysis +668,mentorship +669,ankara +669,life +670,swift +670,learning +671,swift +671,mentorship +672,codeforces +672,competitiveprogramming +673,algorithms +673,debugging +674,mentorship +674,career +675,algorithms +675,practice +676,ankara +676,life +677,algorithms +677,endurance +678,interview +678,mentorship +679,flutter +679,learning +680,defi +680,mentorship +681,customerdiscovery +681,startup +682,mentorship +682,startup +683,denizli +683,life +684,studyhabits +684,mentorship +685,datascience +685,pandas +686,datascience +686,mentorship +687,istanbullife +688,product +688,mentorship +689,product +689,writing +690,bursa +690,life +691,product +691,specs +692,userresearch +692,product +693,contentstrategy +693,marketing +694,marketing +694,mentorship +695,writing +696,istanbullife +697,seo +697,contentstrategy +698,systemdesign +698,mentorship +699,node +699,distributedsystems +700,dbt +700,dataengineering +701,sql +701,mentorship +702,ankara +702,life +703,flutter +703,geodata +704,product +704,mentorship +705,flutter +705,performance +706,sariyer +706,life +707,seo +707,marketing +708,seo +708,mentorship +709,istanbul +709,life +710,gamedesign +710,leveldesign +711,gamedesign +711,mentorship +712,life +713,publicspeaking +713,mentorship +714,publicspeaking +714,toastmasters +715,publicspeaking +715,books +716,istanbullife +716,publicspeaking +717,publicspeaking +717,growth +718,ios +718,swift +719,swiftdata +719,ios +720,ios +720,mentorship +721,ios +721,widgets +722,istanbullife +722,commute +723,swiftui +723,debugging +724,codereview +724,mentorship +725,ux +725,family +726,combine +726,ios +727,aws +727,certification +728,remote +728,mentorship +729,aws +729,devops +730,hatay +730,life +731,terraform +731,devops +732,mentorship +732,reflection +733,dataengineering +733,opendata +734,musicproduction +734,songwriting +735,mixing +735,musicproduction +736,life +736,cihangir +737,musicproduction +737,advice +738,illustration +738,visualstorytelling +739,drawing +739,practice +740,bookcovers +740,illustration +741,life +741,kadikoy +742,illustration +742,craft +743,photojournalism +743,photography +744,photography +744,konya +745,ethics +745,photojournalism +746,konya +746,life +747,cinematography +747,filmmaking +748,film +748,cinematography +749,filmmaking +749,sound +750,life +750,beyoglu +751,storytelling +751,books +752,studentfilm +752,filmmaking +753,piano +753,classicalmusic +754,music +754,mentorship +755,cihangir +755,music +756,filmmaking +756,mentorship +757,film +757,cinema +758,filmediting +758,filmmaking +759,bursa +759,film +760,illustration +760,drawing +761,illustration +761,mentorship +762,eskisehir +762,drawing +763,conceptart +763,illustration +764,life +764,eskisehir +765,books +765,shortfiction +766,writing +766,mentorship +767,writing +767,adana +768,documentaryphotography +768,photography +769,photography +769,mentorship +770,photography +770,antalya +771,documentaryphotography +772,pastry +772,cooking +773,beyoglu +773,culinarylife +774,theater +774,acting +775,improv +775,theater +776,izmir +776,theater +777,podcasting +777,audioproduction +778,podcasting +778,mentorship +779,machinelearning +779,research +780,mentorship +780,career +781,ankara +781,life +782,machinelearning +782,interpretability +783,life +784,machinelearning +784,interpretability +785,philosophy +785,research +786,career +786,research +787,life +787,sariyer +788,research +788,mentorship +789,phd +789,academiccareer +790,aipolicy +790,research +791,phd +791,academiccareer +792,academia +792,life +793,aisafety +793,research +794,aievals +794,aisafety +795,startup +795,aisafety +796,founder +796,life +797,aisafety +797,career +798,flutter +798,mobileengineering +799,flutter +799,mobile +800,testing +800,mobileengineering +801,mentorship +801,mobile +802,life +802,kadikoy diff --git a/scripts/seed_snapshot_data/data/feed_post_likes.csv b/scripts/seed_snapshot_data/data/feed_post_likes.csv new file mode 100644 index 00000000..760e5c2d --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_post_likes.csv @@ -0,0 +1,853 @@ +post_id,user_id,created_at +515,1225,2026-05-13 08:02:44.742121+00 +515,1267,2026-05-13 08:02:44.742121+00 +515,1258,2026-05-13 08:02:44.742121+00 +515,1265,2026-05-13 08:02:44.742121+00 +516,1267,2026-05-13 08:02:44.742121+00 +516,1265,2026-05-13 08:02:44.742121+00 +516,1225,2026-05-13 08:02:44.742121+00 +517,1267,2026-05-13 08:02:44.742121+00 +517,1258,2026-05-13 08:02:44.742121+00 +518,1225,2026-05-13 08:02:44.742121+00 +518,1267,2026-05-13 08:02:44.742121+00 +518,1258,2026-05-13 08:02:44.742121+00 +519,1265,2026-05-13 08:02:44.742121+00 +519,1267,2026-05-13 08:02:44.742121+00 +519,1204,2026-05-13 08:02:44.742121+00 +519,1258,2026-05-13 08:02:44.742121+00 +520,1258,2026-05-13 08:02:44.742121+00 +520,1265,2026-05-13 08:02:44.742121+00 +520,1267,2026-05-13 08:02:44.742121+00 +521,1265,2026-05-13 08:02:44.742121+00 +521,1267,2026-05-13 08:02:44.742121+00 +521,1225,2026-05-13 08:02:44.742121+00 +522,1265,2026-05-13 08:02:44.742121+00 +522,1258,2026-05-13 08:02:44.742121+00 +522,1267,2026-05-13 08:02:44.742121+00 +523,1226,2026-05-13 08:02:44.742121+00 +524,1226,2026-05-13 08:02:44.742121+00 +525,1246,2026-05-13 08:02:44.742121+00 +525,1200,2026-05-13 08:02:44.742121+00 +526,1200,2026-05-13 08:02:44.742121+00 +526,1246,2026-05-13 08:02:44.742121+00 +527,1250,2026-05-13 08:02:44.742121+00 +527,1200,2026-05-13 08:02:44.742121+00 +528,1246,2026-05-13 08:02:44.742121+00 +528,1250,2026-05-13 08:02:44.742121+00 +529,1225,2026-05-13 08:02:44.742121+00 +529,1236,2026-05-13 08:02:44.742121+00 +530,1258,2026-05-13 08:02:44.742121+00 +530,1270,2026-05-13 08:02:44.742121+00 +531,1258,2026-05-13 08:02:44.742121+00 +531,1261,2026-05-13 08:02:44.742121+00 +531,1225,2026-05-13 08:02:44.742121+00 +532,1225,2026-05-13 08:02:44.742121+00 +532,1261,2026-05-13 08:02:44.742121+00 +532,1258,2026-05-13 08:02:44.742121+00 +532,1236,2026-05-13 08:02:44.742121+00 +533,1270,2026-05-13 08:02:44.742121+00 +533,1258,2026-05-13 08:02:44.742121+00 +534,1236,2026-05-13 08:02:44.742121+00 +534,1261,2026-05-13 08:02:44.742121+00 +534,1270,2026-05-13 08:02:44.742121+00 +534,1258,2026-05-13 08:02:44.742121+00 +535,1270,2026-05-13 08:02:44.742121+00 +535,1268,2026-05-13 08:02:44.742121+00 +536,1266,2026-05-13 08:02:44.742121+00 +536,1205,2026-05-13 08:02:44.742121+00 +536,1259,2026-05-13 08:02:44.742121+00 +537,1205,2026-05-13 08:02:44.742121+00 +537,1259,2026-05-13 08:02:44.742121+00 +537,1199,2026-05-13 08:02:44.742121+00 +538,1266,2026-05-13 08:02:44.742121+00 +539,1263,2026-05-13 08:02:44.742121+00 +540,1199,2026-05-13 08:02:44.742121+00 +540,1266,2026-05-13 08:02:44.742121+00 +540,1205,2026-05-13 08:02:44.742121+00 +540,1263,2026-05-13 08:02:44.742121+00 +540,1259,2026-05-13 08:02:44.742121+00 +541,1255,2026-05-13 08:02:44.742121+00 +541,1204,2026-05-13 08:02:44.742121+00 +542,1268,2026-05-13 08:02:44.742121+00 +542,1199,2026-05-13 08:02:44.742121+00 +542,1204,2026-05-13 08:02:44.742121+00 +542,1255,2026-05-13 08:02:44.742121+00 +543,1204,2026-05-13 08:02:44.742121+00 +543,1255,2026-05-13 08:02:44.742121+00 +543,1199,2026-05-13 08:02:44.742121+00 +544,1199,2026-05-13 08:02:44.742121+00 +544,1268,2026-05-13 08:02:44.742121+00 +545,1232,2026-05-13 08:02:44.742121+00 +545,1250,2026-05-13 08:02:44.742121+00 +545,1200,2026-05-13 08:02:44.742121+00 +546,1200,2026-05-13 08:02:44.742121+00 +546,1250,2026-05-13 08:02:44.742121+00 +546,1232,2026-05-13 08:02:44.742121+00 +547,1202,2026-05-13 08:02:44.742121+00 +547,1256,2026-05-13 08:02:44.742121+00 +547,1201,2026-05-13 08:02:44.742121+00 +547,1268,2026-05-13 08:02:44.742121+00 +547,1258,2026-05-13 08:02:44.742121+00 +547,1250,2026-05-13 08:02:44.742121+00 +547,1215,2026-05-13 08:02:44.742121+00 +548,1215,2026-05-13 08:02:44.742121+00 +548,1250,2026-05-13 08:02:44.742121+00 +548,1264,2026-05-13 08:02:44.742121+00 +549,1256,2026-05-13 08:02:44.742121+00 +549,1268,2026-05-13 08:02:44.742121+00 +549,1264,2026-05-13 08:02:44.742121+00 +549,1201,2026-05-13 08:02:44.742121+00 +549,1215,2026-05-13 08:02:44.742121+00 +550,1264,2026-05-13 08:02:44.742121+00 +550,1258,2026-05-13 08:02:44.742121+00 +550,1201,2026-05-13 08:02:44.742121+00 +550,1200,2026-05-13 08:02:44.742121+00 +550,1256,2026-05-13 08:02:44.742121+00 +550,1268,2026-05-13 08:02:44.742121+00 +550,1202,2026-05-13 08:02:44.742121+00 +551,1264,2026-05-13 08:02:44.742121+00 +552,1210,2026-05-13 08:02:44.742121+00 +553,1210,2026-05-13 08:02:44.742121+00 +553,1248,2026-05-13 08:02:44.742121+00 +554,1246,2026-05-13 08:02:44.742121+00 +554,1241,2026-05-13 08:02:44.742121+00 +554,1208,2026-05-13 08:02:44.742121+00 +554,1271,2026-05-13 08:02:44.742121+00 +555,1270,2026-05-13 08:02:44.742121+00 +555,1208,2026-05-13 08:02:44.742121+00 +555,1253,2026-05-13 08:02:44.742121+00 +555,1246,2026-05-13 08:02:44.742121+00 +555,1241,2026-05-13 08:02:44.742121+00 +555,1271,2026-05-13 08:02:44.742121+00 +556,1270,2026-05-13 08:02:44.742121+00 +556,1241,2026-05-13 08:02:44.742121+00 +556,1271,2026-05-13 08:02:44.742121+00 +556,1246,2026-05-13 08:02:44.742121+00 +556,1253,2026-05-13 08:02:44.742121+00 +557,1253,2026-05-13 08:02:44.742121+00 +557,1270,2026-05-13 08:02:44.742121+00 +557,1271,2026-05-13 08:02:44.742121+00 +557,1241,2026-05-13 08:02:44.742121+00 +557,1208,2026-05-13 08:02:44.742121+00 +558,1268,2026-05-13 08:02:44.742121+00 +558,1201,2026-05-13 08:02:44.742121+00 +559,1268,2026-05-13 08:02:44.742121+00 +559,1271,2026-05-13 08:02:44.742121+00 +560,1211,2026-05-13 08:02:44.742121+00 +561,1201,2026-05-13 08:02:44.742121+00 +561,1211,2026-05-13 08:02:44.742121+00 +561,1271,2026-05-13 08:02:44.742121+00 +562,1201,2026-05-13 08:02:44.742121+00 +562,1268,2026-05-13 08:02:44.742121+00 +563,1271,2026-05-13 08:02:44.742121+00 +564,1271,2026-05-13 08:02:44.742121+00 +564,1201,2026-05-13 08:02:44.742121+00 +565,1195,2026-05-13 08:02:44.742121+00 +566,1196,2026-05-13 08:02:44.742121+00 +566,1199,2026-05-13 08:02:44.742121+00 +567,1206,2026-05-13 08:02:44.742121+00 +567,1229,2026-05-13 08:02:44.742121+00 +567,1199,2026-05-13 08:02:44.742121+00 +567,1255,2026-05-13 08:02:44.742121+00 +567,1205,2026-05-13 08:02:44.742121+00 +567,1198,2026-05-13 08:02:44.742121+00 +568,1217,2026-05-13 08:02:44.742121+00 +568,1229,2026-05-13 08:02:44.742121+00 +568,1259,2026-05-13 08:02:44.742121+00 +569,1217,2026-05-13 08:02:44.742121+00 +569,1271,2026-05-13 08:02:44.742121+00 +570,1261,2026-05-13 08:02:44.742121+00 +570,1198,2026-05-13 08:02:44.742121+00 +570,1221,2026-05-13 08:02:44.742121+00 +571,1198,2026-05-13 08:02:44.742121+00 +572,1261,2026-05-13 08:02:44.742121+00 +572,1198,2026-05-13 08:02:44.742121+00 +573,1261,2026-05-13 08:02:44.742121+00 +573,1198,2026-05-13 08:02:44.742121+00 +574,1212,2026-05-13 08:02:44.742121+00 +574,1203,2026-05-13 08:02:44.742121+00 +575,1212,2026-05-13 08:02:44.742121+00 +575,1203,2026-05-13 08:02:44.742121+00 +576,1203,2026-05-13 08:02:44.742121+00 +576,1250,2026-05-13 08:02:44.742121+00 +577,1226,2026-05-13 08:02:44.742121+00 +577,1199,2026-05-13 08:02:44.742121+00 +577,1267,2026-05-13 08:02:44.742121+00 +578,1226,2026-05-13 08:02:44.742121+00 +578,1259,2026-05-13 08:02:44.742121+00 +579,1271,2026-05-13 08:02:44.742121+00 +579,1267,2026-05-13 08:02:44.742121+00 +579,1199,2026-05-13 08:02:44.742121+00 +579,1259,2026-05-13 08:02:44.742121+00 +580,1256,2026-05-13 08:02:44.742121+00 +581,1235,2026-05-13 08:02:44.742121+00 +581,1256,2026-05-13 08:02:44.742121+00 +582,1256,2026-05-13 08:02:44.742121+00 +582,1235,2026-05-13 08:02:44.742121+00 +582,1207,2026-05-13 08:02:44.742121+00 +583,1219,2026-05-13 08:02:44.742121+00 +583,1210,2026-05-13 08:02:44.742121+00 +584,1219,2026-05-13 08:02:44.742121+00 +584,1243,2026-05-13 08:02:44.742121+00 +585,1196,2026-05-13 08:02:44.742121+00 +585,1262,2026-05-13 08:02:44.742121+00 +586,1262,2026-05-13 08:02:44.742121+00 +587,1196,2026-05-13 08:02:44.742121+00 +588,1262,2026-05-13 08:02:44.742121+00 +588,1196,2026-05-13 08:02:44.742121+00 +588,1259,2026-05-13 08:02:44.742121+00 +589,1223,2026-05-13 08:02:44.742121+00 +589,1234,2026-05-13 08:02:44.742121+00 +589,1195,2026-05-13 08:02:44.742121+00 +589,1255,2026-05-13 08:02:44.742121+00 +589,1203,2026-05-13 08:02:44.742121+00 +589,1200,2026-05-13 08:02:44.742121+00 +590,1270,2026-05-13 08:02:44.742121+00 +590,1203,2026-05-13 08:02:44.742121+00 +590,1234,2026-05-13 08:02:44.742121+00 +590,1195,2026-05-13 08:02:44.742121+00 +590,1223,2026-05-13 08:02:44.742121+00 +590,1248,2026-05-13 08:02:44.742121+00 +591,1203,2026-05-13 08:02:44.742121+00 +591,1265,2026-05-13 08:02:44.742121+00 +591,1200,2026-05-13 08:02:44.742121+00 +592,1255,2026-05-13 08:02:44.742121+00 +592,1223,2026-05-13 08:02:44.742121+00 +592,1195,2026-05-13 08:02:44.742121+00 +592,1248,2026-05-13 08:02:44.742121+00 +593,1218,2026-05-13 08:02:44.742121+00 +593,1268,2026-05-13 08:02:44.742121+00 +594,1259,2026-05-13 08:02:44.742121+00 +595,1259,2026-05-13 08:02:44.742121+00 +596,1259,2026-05-13 08:02:44.742121+00 +597,1259,2026-05-13 08:02:44.742121+00 +598,1268,2026-05-13 08:02:44.742121+00 +598,1218,2026-05-13 08:02:44.742121+00 +599,1268,2026-05-13 08:02:44.742121+00 +599,1218,2026-05-13 08:02:44.742121+00 +600,1265,2026-05-13 08:02:44.742121+00 +600,1223,2026-05-13 08:02:44.742121+00 +600,1201,2026-05-13 08:02:44.742121+00 +600,1230,2026-05-13 08:02:44.742121+00 +600,1260,2026-05-13 08:02:44.742121+00 +601,1201,2026-05-13 08:02:44.742121+00 +602,1195,2026-05-13 08:02:44.742121+00 +602,1258,2026-05-13 08:02:44.742121+00 +602,1204,2026-05-13 08:02:44.742121+00 +603,1204,2026-05-13 08:02:44.742121+00 +603,1258,2026-05-13 08:02:44.742121+00 +604,1204,2026-05-13 08:02:44.742121+00 +605,1204,2026-05-13 08:02:44.742121+00 +605,1258,2026-05-13 08:02:44.742121+00 +606,1195,2026-05-13 08:02:44.742121+00 +606,1204,2026-05-13 08:02:44.742121+00 +607,1258,2026-05-13 08:02:44.742121+00 +607,1195,2026-05-13 08:02:44.742121+00 +607,1204,2026-05-13 08:02:44.742121+00 +608,1195,2026-05-13 08:02:44.742121+00 +608,1204,2026-05-13 08:02:44.742121+00 +609,1222,2026-05-13 08:02:44.742121+00 +609,1262,2026-05-13 08:02:44.742121+00 +609,1251,2026-05-13 08:02:44.742121+00 +610,1198,2026-05-13 08:02:44.742121+00 +610,1235,2026-05-13 08:02:44.742121+00 +610,1208,2026-05-13 08:02:44.742121+00 +610,1240,2026-05-13 08:02:44.742121+00 +610,1236,2026-05-13 08:02:44.742121+00 +610,1205,2026-05-13 08:02:44.742121+00 +611,1258,2026-05-13 08:02:44.742121+00 +611,1197,2026-05-13 08:02:44.742121+00 +611,1256,2026-05-13 08:02:44.742121+00 +611,1243,2026-05-13 08:02:44.742121+00 +611,1204,2026-05-13 08:02:44.742121+00 +611,1212,2026-05-13 08:02:44.742121+00 +612,1256,2026-05-13 08:02:44.742121+00 +612,1204,2026-05-13 08:02:44.742121+00 +612,1243,2026-05-13 08:02:44.742121+00 +612,1197,2026-05-13 08:02:44.742121+00 +612,1258,2026-05-13 08:02:44.742121+00 +612,1212,2026-05-13 08:02:44.742121+00 +613,1197,2026-05-13 08:02:44.742121+00 +613,1243,2026-05-13 08:02:44.742121+00 +613,1258,2026-05-13 08:02:44.742121+00 +613,1256,2026-05-13 08:02:44.742121+00 +614,1232,2026-05-13 08:02:44.742121+00 +614,1200,2026-05-13 08:02:44.742121+00 +614,1222,2026-05-13 08:02:44.742121+00 +614,1251,2026-05-13 08:02:44.742121+00 +614,1198,2026-05-13 08:02:44.742121+00 +615,1196,2026-05-13 08:02:44.742121+00 +615,1198,2026-05-13 08:02:44.742121+00 +615,1214,2026-05-13 08:02:44.742121+00 +615,1246,2026-05-13 08:02:44.742121+00 +615,1248,2026-05-13 08:02:44.742121+00 +615,1267,2026-05-13 08:02:44.742121+00 +616,1248,2026-05-13 08:02:44.742121+00 +616,1251,2026-05-13 08:02:44.742121+00 +616,1200,2026-05-13 08:02:44.742121+00 +616,1222,2026-05-13 08:02:44.742121+00 +616,1226,2026-05-13 08:02:44.742121+00 +616,1267,2026-05-13 08:02:44.742121+00 +616,1246,2026-05-13 08:02:44.742121+00 +617,1222,2026-05-13 08:02:44.742121+00 +617,1251,2026-05-13 08:02:44.742121+00 +617,1198,2026-05-13 08:02:44.742121+00 +617,1248,2026-05-13 08:02:44.742121+00 +617,1246,2026-05-13 08:02:44.742121+00 +617,1196,2026-05-13 08:02:44.742121+00 +617,1200,2026-05-13 08:02:44.742121+00 +617,1232,2026-05-13 08:02:44.742121+00 +617,1267,2026-05-13 08:02:44.742121+00 +618,1248,2026-05-13 08:02:44.742121+00 +618,1200,2026-05-13 08:02:44.742121+00 +618,1226,2026-05-13 08:02:44.742121+00 +618,1246,2026-05-13 08:02:44.742121+00 +618,1214,2026-05-13 08:02:44.742121+00 +618,1222,2026-05-13 08:02:44.742121+00 +618,1251,2026-05-13 08:02:44.742121+00 +618,1267,2026-05-13 08:02:44.742121+00 +618,1232,2026-05-13 08:02:44.742121+00 +619,1267,2026-05-13 08:02:44.742121+00 +619,1196,2026-05-13 08:02:44.742121+00 +619,1248,2026-05-13 08:02:44.742121+00 +619,1246,2026-05-13 08:02:44.742121+00 +619,1226,2026-05-13 08:02:44.742121+00 +619,1222,2026-05-13 08:02:44.742121+00 +620,1246,2026-05-13 08:02:44.742121+00 +620,1248,2026-05-13 08:02:44.742121+00 +620,1214,2026-05-13 08:02:44.742121+00 +620,1232,2026-05-13 08:02:44.742121+00 +620,1222,2026-05-13 08:02:44.742121+00 +620,1200,2026-05-13 08:02:44.742121+00 +621,1246,2026-05-13 08:02:44.742121+00 +621,1198,2026-05-13 08:02:44.742121+00 +621,1214,2026-05-13 08:02:44.742121+00 +621,1251,2026-05-13 08:02:44.742121+00 +621,1267,2026-05-13 08:02:44.742121+00 +621,1226,2026-05-13 08:02:44.742121+00 +621,1248,2026-05-13 08:02:44.742121+00 +621,1196,2026-05-13 08:02:44.742121+00 +621,1200,2026-05-13 08:02:44.742121+00 +622,1232,2026-05-13 08:02:44.742121+00 +622,1251,2026-05-13 08:02:44.742121+00 +622,1214,2026-05-13 08:02:44.742121+00 +622,1248,2026-05-13 08:02:44.742121+00 +622,1222,2026-05-13 08:02:44.742121+00 +622,1196,2026-05-13 08:02:44.742121+00 +622,1198,2026-05-13 08:02:44.742121+00 +622,1267,2026-05-13 08:02:44.742121+00 +622,1200,2026-05-13 08:02:44.742121+00 +622,1226,2026-05-13 08:02:44.742121+00 +623,1205,2026-05-13 08:02:44.742121+00 +623,1225,2026-05-13 08:02:44.742121+00 +623,1209,2026-05-13 08:02:44.742121+00 +623,1199,2026-05-13 08:02:44.742121+00 +624,1271,2026-05-13 08:02:44.742121+00 +624,1209,2026-05-13 08:02:44.742121+00 +625,1209,2026-05-13 08:02:44.742121+00 +625,1198,2026-05-13 08:02:44.742121+00 +625,1225,2026-05-13 08:02:44.742121+00 +625,1271,2026-05-13 08:02:44.742121+00 +625,1205,2026-05-13 08:02:44.742121+00 +626,1209,2026-05-13 08:02:44.742121+00 +626,1268,2026-05-13 08:02:44.742121+00 +626,1225,2026-05-13 08:02:44.742121+00 +626,1271,2026-05-13 08:02:44.742121+00 +626,1205,2026-05-13 08:02:44.742121+00 +626,1198,2026-05-13 08:02:44.742121+00 +626,1199,2026-05-13 08:02:44.742121+00 +627,1199,2026-05-13 08:02:44.742121+00 +627,1209,2026-05-13 08:02:44.742121+00 +627,1205,2026-05-13 08:02:44.742121+00 +628,1209,2026-05-13 08:02:44.742121+00 +628,1257,2026-05-13 08:02:44.742121+00 +628,1242,2026-05-13 08:02:44.742121+00 +628,1265,2026-05-13 08:02:44.742121+00 +629,1222,2026-05-13 08:02:44.742121+00 +629,1206,2026-05-13 08:02:44.742121+00 +630,1257,2026-05-13 08:02:44.742121+00 +630,1265,2026-05-13 08:02:44.742121+00 +630,1206,2026-05-13 08:02:44.742121+00 +630,1222,2026-05-13 08:02:44.742121+00 +630,1243,2026-05-13 08:02:44.742121+00 +630,1242,2026-05-13 08:02:44.742121+00 +631,1209,2026-05-13 08:02:44.742121+00 +631,1265,2026-05-13 08:02:44.742121+00 +632,1206,2026-05-13 08:02:44.742121+00 +632,1243,2026-05-13 08:02:44.742121+00 +632,1257,2026-05-13 08:02:44.742121+00 +633,1265,2026-05-13 08:02:44.742121+00 +633,1222,2026-05-13 08:02:44.742121+00 +634,1257,2026-05-13 08:02:44.742121+00 +634,1265,2026-05-13 08:02:44.742121+00 +634,1242,2026-05-13 08:02:44.742121+00 +634,1206,2026-05-13 08:02:44.742121+00 +634,1243,2026-05-13 08:02:44.742121+00 +635,1209,2026-05-13 08:02:44.742121+00 +635,1255,2026-05-13 08:02:44.742121+00 +636,1261,2026-05-13 08:02:44.742121+00 +636,1258,2026-05-13 08:02:44.742121+00 +636,1209,2026-05-13 08:02:44.742121+00 +636,1229,2026-05-13 08:02:44.742121+00 +637,1255,2026-05-13 08:02:44.742121+00 +637,1209,2026-05-13 08:02:44.742121+00 +637,1251,2026-05-13 08:02:44.742121+00 +637,1261,2026-05-13 08:02:44.742121+00 +637,1229,2026-05-13 08:02:44.742121+00 +638,1209,2026-05-13 08:02:44.742121+00 +638,1258,2026-05-13 08:02:44.742121+00 +639,1195,2026-05-13 08:02:44.742121+00 +639,1257,2026-05-13 08:02:44.742121+00 +640,1211,2026-05-13 08:02:44.742121+00 +640,1195,2026-05-13 08:02:44.742121+00 +640,1257,2026-05-13 08:02:44.742121+00 +641,1257,2026-05-13 08:02:44.742121+00 +641,1211,2026-05-13 08:02:44.742121+00 +642,1257,2026-05-13 08:02:44.742121+00 +642,1195,2026-05-13 08:02:44.742121+00 +642,1211,2026-05-13 08:02:44.742121+00 +643,1195,2026-05-13 08:02:44.742121+00 +643,1211,2026-05-13 08:02:44.742121+00 +644,1258,2026-05-13 08:02:44.742121+00 +644,1256,2026-05-13 08:02:44.742121+00 +644,1221,2026-05-13 08:02:44.742121+00 +645,1256,2026-05-13 08:02:44.742121+00 +645,1271,2026-05-13 08:02:44.742121+00 +646,1227,2026-05-13 08:02:44.742121+00 +647,1202,2026-05-13 08:02:44.742121+00 +647,1220,2026-05-13 08:02:44.742121+00 +648,1227,2026-05-13 08:02:44.742121+00 +648,1202,2026-05-13 08:02:44.742121+00 +648,1220,2026-05-13 08:02:44.742121+00 +649,1269,2026-05-13 08:02:44.742121+00 +649,1270,2026-05-13 08:02:44.742121+00 +649,1205,2026-05-13 08:02:44.742121+00 +650,1235,2026-05-13 08:02:44.742121+00 +650,1205,2026-05-13 08:02:44.742121+00 +650,1269,2026-05-13 08:02:44.742121+00 +651,1205,2026-05-13 08:02:44.742121+00 +651,1269,2026-05-13 08:02:44.742121+00 +654,1198,2026-05-13 08:02:44.742121+00 +655,1198,2026-05-13 08:02:44.742121+00 +656,1198,2026-05-13 08:02:44.742121+00 +657,1198,2026-05-13 08:02:44.742121+00 +658,1198,2026-05-13 08:02:44.742121+00 +660,1251,2026-05-13 08:02:44.742121+00 +660,1223,2026-05-13 08:02:44.742121+00 +661,1196,2026-05-13 08:02:44.742121+00 +661,1223,2026-05-13 08:02:44.742121+00 +661,1251,2026-05-13 08:02:44.742121+00 +662,1223,2026-05-13 08:02:44.742121+00 +662,1196,2026-05-13 08:02:44.742121+00 +663,1216,2026-05-13 08:02:44.742121+00 +663,1195,2026-05-13 08:02:44.742121+00 +663,1232,2026-05-13 08:02:44.742121+00 +664,1195,2026-05-13 08:02:44.742121+00 +664,1216,2026-05-13 08:02:44.742121+00 +664,1232,2026-05-13 08:02:44.742121+00 +664,1250,2026-05-13 08:02:44.742121+00 +665,1201,2026-05-13 08:02:44.742121+00 +665,1238,2026-05-13 08:02:44.742121+00 +665,1209,2026-05-13 08:02:44.742121+00 +665,1204,2026-05-13 08:02:44.742121+00 +666,1238,2026-05-13 08:02:44.742121+00 +666,1209,2026-05-13 08:02:44.742121+00 +667,1205,2026-05-13 08:02:44.742121+00 +667,1200,2026-05-13 08:02:44.742121+00 +667,1233,2026-05-13 08:02:44.742121+00 +667,1256,2026-05-13 08:02:44.742121+00 +668,1233,2026-05-13 08:02:44.742121+00 +668,1256,2026-05-13 08:02:44.742121+00 +669,1270,2026-05-13 08:02:44.742121+00 +669,1202,2026-05-13 08:02:44.742121+00 +669,1205,2026-05-13 08:02:44.742121+00 +669,1256,2026-05-13 08:02:44.742121+00 +670,1209,2026-05-13 08:02:44.742121+00 +670,1199,2026-05-13 08:02:44.742121+00 +671,1199,2026-05-13 08:02:44.742121+00 +671,1209,2026-05-13 08:02:44.742121+00 +671,1198,2026-05-13 08:02:44.742121+00 +672,1207,2026-05-13 08:02:44.742121+00 +672,1239,2026-05-13 08:02:44.742121+00 +672,1213,2026-05-13 08:02:44.742121+00 +672,1216,2026-05-13 08:02:44.742121+00 +672,1268,2026-05-13 08:02:44.742121+00 +672,1242,2026-05-13 08:02:44.742121+00 +672,1255,2026-05-13 08:02:44.742121+00 +673,1261,2026-05-13 08:02:44.742121+00 +673,1266,2026-05-13 08:02:44.742121+00 +673,1255,2026-05-13 08:02:44.742121+00 +673,1213,2026-05-13 08:02:44.742121+00 +673,1239,2026-05-13 08:02:44.742121+00 +674,1216,2026-05-13 08:02:44.742121+00 +674,1231,2026-05-13 08:02:44.742121+00 +674,1268,2026-05-13 08:02:44.742121+00 +674,1255,2026-05-13 08:02:44.742121+00 +674,1261,2026-05-13 08:02:44.742121+00 +674,1213,2026-05-13 08:02:44.742121+00 +675,1261,2026-05-13 08:02:44.742121+00 +675,1239,2026-05-13 08:02:44.742121+00 +675,1213,2026-05-13 08:02:44.742121+00 +675,1207,2026-05-13 08:02:44.742121+00 +675,1268,2026-05-13 08:02:44.742121+00 +675,1255,2026-05-13 08:02:44.742121+00 +675,1242,2026-05-13 08:02:44.742121+00 +676,1216,2026-05-13 08:02:44.742121+00 +676,1255,2026-05-13 08:02:44.742121+00 +676,1213,2026-05-13 08:02:44.742121+00 +676,1207,2026-05-13 08:02:44.742121+00 +676,1268,2026-05-13 08:02:44.742121+00 +676,1266,2026-05-13 08:02:44.742121+00 +676,1242,2026-05-13 08:02:44.742121+00 +677,1239,2026-05-13 08:02:44.742121+00 +677,1261,2026-05-13 08:02:44.742121+00 +677,1216,2026-05-13 08:02:44.742121+00 +678,1213,2026-05-13 08:02:44.742121+00 +678,1216,2026-05-13 08:02:44.742121+00 +678,1261,2026-05-13 08:02:44.742121+00 +678,1231,2026-05-13 08:02:44.742121+00 +678,1207,2026-05-13 08:02:44.742121+00 +679,1212,2026-05-13 08:02:44.742121+00 +679,1225,2026-05-13 08:02:44.742121+00 +679,1198,2026-05-13 08:02:44.742121+00 +680,1195,2026-05-13 08:02:44.742121+00 +681,1258,2026-05-13 08:02:44.742121+00 +681,1266,2026-05-13 08:02:44.742121+00 +681,1203,2026-05-13 08:02:44.742121+00 +682,1266,2026-05-13 08:02:44.742121+00 +682,1268,2026-05-13 08:02:44.742121+00 +682,1258,2026-05-13 08:02:44.742121+00 +682,1270,2026-05-13 08:02:44.742121+00 +683,1268,2026-05-13 08:02:44.742121+00 +683,1203,2026-05-13 08:02:44.742121+00 +684,1229,2026-05-13 08:02:44.742121+00 +684,1261,2026-05-13 08:02:44.742121+00 +684,1271,2026-05-13 08:02:44.742121+00 +684,1249,2026-05-13 08:02:44.742121+00 +685,1197,2026-05-13 08:02:44.742121+00 +685,1214,2026-05-13 08:02:44.742121+00 +686,1214,2026-05-13 08:02:44.742121+00 +686,1197,2026-05-13 08:02:44.742121+00 +687,1214,2026-05-13 08:02:44.742121+00 +687,1268,2026-05-13 08:02:44.742121+00 +688,1257,2026-05-13 08:02:44.742121+00 +688,1219,2026-05-13 08:02:44.742121+00 +689,1271,2026-05-13 08:02:44.742121+00 +689,1257,2026-05-13 08:02:44.742121+00 +689,1223,2026-05-13 08:02:44.742121+00 +690,1199,2026-05-13 08:02:44.742121+00 +690,1271,2026-05-13 08:02:44.742121+00 +690,1257,2026-05-13 08:02:44.742121+00 +691,1219,2026-05-13 08:02:44.742121+00 +691,1199,2026-05-13 08:02:44.742121+00 +691,1257,2026-05-13 08:02:44.742121+00 +692,1207,2026-05-13 08:02:44.742121+00 +692,1239,2026-05-13 08:02:44.742121+00 +692,1243,2026-05-13 08:02:44.742121+00 +693,1232,2026-05-13 08:02:44.742121+00 +693,1207,2026-05-13 08:02:44.742121+00 +693,1256,2026-05-13 08:02:44.742121+00 +693,1241,2026-05-13 08:02:44.742121+00 +694,1199,2026-05-13 08:02:44.742121+00 +694,1207,2026-05-13 08:02:44.742121+00 +695,1256,2026-05-13 08:02:44.742121+00 +695,1207,2026-05-13 08:02:44.742121+00 +695,1199,2026-05-13 08:02:44.742121+00 +696,1241,2026-05-13 08:02:44.742121+00 +696,1232,2026-05-13 08:02:44.742121+00 +696,1256,2026-05-13 08:02:44.742121+00 +696,1199,2026-05-13 08:02:44.742121+00 +696,1207,2026-05-13 08:02:44.742121+00 +697,1241,2026-05-13 08:02:44.742121+00 +697,1232,2026-05-13 08:02:44.742121+00 +698,1220,2026-05-13 08:02:44.742121+00 +698,1203,2026-05-13 08:02:44.742121+00 +698,1196,2026-05-13 08:02:44.742121+00 +699,1243,2026-05-13 08:02:44.742121+00 +699,1196,2026-05-13 08:02:44.742121+00 +700,1212,2026-05-13 08:02:44.742121+00 +700,1206,2026-05-13 08:02:44.742121+00 +701,1212,2026-05-13 08:02:44.742121+00 +701,1204,2026-05-13 08:02:44.742121+00 +701,1227,2026-05-13 08:02:44.742121+00 +702,1204,2026-05-13 08:02:44.742121+00 +702,1206,2026-05-13 08:02:44.742121+00 +703,1209,2026-05-13 08:02:44.742121+00 +703,1269,2026-05-13 08:02:44.742121+00 +703,1234,2026-05-13 08:02:44.742121+00 +704,1226,2026-05-13 08:02:44.742121+00 +704,1209,2026-05-13 08:02:44.742121+00 +705,1209,2026-05-13 08:02:44.742121+00 +705,1234,2026-05-13 08:02:44.742121+00 +706,1234,2026-05-13 08:02:44.742121+00 +706,1226,2026-05-13 08:02:44.742121+00 +707,1238,2026-05-13 08:02:44.742121+00 +707,1260,2026-05-13 08:02:44.742121+00 +707,1258,2026-05-13 08:02:44.742121+00 +707,1268,2026-05-13 08:02:44.742121+00 +708,1268,2026-05-13 08:02:44.742121+00 +708,1260,2026-05-13 08:02:44.742121+00 +708,1238,2026-05-13 08:02:44.742121+00 +708,1258,2026-05-13 08:02:44.742121+00 +709,1268,2026-05-13 08:02:44.742121+00 +709,1238,2026-05-13 08:02:44.742121+00 +709,1258,2026-05-13 08:02:44.742121+00 +709,1260,2026-05-13 08:02:44.742121+00 +710,1230,2026-05-13 08:02:44.742121+00 +710,1202,2026-05-13 08:02:44.742121+00 +710,1259,2026-05-13 08:02:44.742121+00 +710,1271,2026-05-13 08:02:44.742121+00 +710,1195,2026-05-13 08:02:44.742121+00 +711,1219,2026-05-13 08:02:44.742121+00 +711,1199,2026-05-13 08:02:44.742121+00 +711,1271,2026-05-13 08:02:44.742121+00 +711,1202,2026-05-13 08:02:44.742121+00 +711,1230,2026-05-13 08:02:44.742121+00 +712,1195,2026-05-13 08:02:44.742121+00 +712,1219,2026-05-13 08:02:44.742121+00 +713,1224,2026-05-13 08:02:44.742121+00 +713,1211,2026-05-13 08:02:44.742121+00 +714,1236,2026-05-13 08:02:44.742121+00 +714,1244,2026-05-13 08:02:44.742121+00 +714,1206,2026-05-13 08:02:44.742121+00 +714,1211,2026-05-13 08:02:44.742121+00 +714,1257,2026-05-13 08:02:44.742121+00 +715,1266,2026-05-13 08:02:44.742121+00 +715,1224,2026-05-13 08:02:44.742121+00 +715,1211,2026-05-13 08:02:44.742121+00 +715,1244,2026-05-13 08:02:44.742121+00 +716,1257,2026-05-13 08:02:44.742121+00 +716,1211,2026-05-13 08:02:44.742121+00 +716,1244,2026-05-13 08:02:44.742121+00 +717,1224,2026-05-13 08:02:44.742121+00 +717,1257,2026-05-13 08:02:44.742121+00 +717,1266,2026-05-13 08:02:44.742121+00 +717,1206,2026-05-13 08:02:44.742121+00 +718,1200,2026-05-13 08:02:44.742121+00 +719,1200,2026-05-13 08:02:44.742121+00 +719,1240,2026-05-13 08:02:44.742121+00 +719,1199,2026-05-13 08:02:44.742121+00 +720,1265,2026-05-13 08:02:44.742121+00 +720,1199,2026-05-13 08:02:44.742121+00 +721,1200,2026-05-13 08:02:44.742121+00 +721,1265,2026-05-13 08:02:44.742121+00 +721,1199,2026-05-13 08:02:44.742121+00 +722,1200,2026-05-13 08:02:44.742121+00 +722,1240,2026-05-13 08:02:44.742121+00 +722,1265,2026-05-13 08:02:44.742121+00 +723,1199,2026-05-13 08:02:44.742121+00 +723,1200,2026-05-13 08:02:44.742121+00 +723,1240,2026-05-13 08:02:44.742121+00 +724,1199,2026-05-13 08:02:44.742121+00 +724,1240,2026-05-13 08:02:44.742121+00 +724,1265,2026-05-13 08:02:44.742121+00 +725,1265,2026-05-13 08:02:44.742121+00 +726,1200,2026-05-13 08:02:44.742121+00 +727,1252,2026-05-13 08:02:44.742121+00 +727,1198,2026-05-13 08:02:44.742121+00 +727,1246,2026-05-13 08:02:44.742121+00 +728,1246,2026-05-13 08:02:44.742121+00 +728,1196,2026-05-13 08:02:44.742121+00 +728,1208,2026-05-13 08:02:44.742121+00 +728,1198,2026-05-13 08:02:44.742121+00 +728,1252,2026-05-13 08:02:44.742121+00 +729,1246,2026-05-13 08:02:44.742121+00 +729,1198,2026-05-13 08:02:44.742121+00 +729,1256,2026-05-13 08:02:44.742121+00 +730,1252,2026-05-13 08:02:44.742121+00 +730,1196,2026-05-13 08:02:44.742121+00 +730,1208,2026-05-13 08:02:44.742121+00 +731,1198,2026-05-13 08:02:44.742121+00 +731,1208,2026-05-13 08:02:44.742121+00 +731,1252,2026-05-13 08:02:44.742121+00 +731,1196,2026-05-13 08:02:44.742121+00 +732,1246,2026-05-13 08:02:44.742121+00 +732,1256,2026-05-13 08:02:44.742121+00 +732,1252,2026-05-13 08:02:44.742121+00 +732,1198,2026-05-13 08:02:44.742121+00 +732,1196,2026-05-13 08:02:44.742121+00 +732,1208,2026-05-13 08:02:44.742121+00 +733,1266,2026-05-13 08:02:44.742121+00 +733,1271,2026-05-13 08:02:44.742121+00 +733,1255,2026-05-13 08:02:44.742121+00 +734,1216,2026-05-13 08:02:44.742121+00 +734,1219,2026-05-13 08:02:44.742121+00 +734,1206,2026-05-13 08:02:44.742121+00 +734,1260,2026-05-13 08:02:44.742121+00 +735,1258,2026-05-13 08:02:44.742121+00 +736,1206,2026-05-13 08:02:44.742121+00 +737,1216,2026-05-13 08:02:44.742121+00 +737,1260,2026-05-13 08:02:44.742121+00 +737,1196,2026-05-13 08:02:44.742121+00 +739,1198,2026-05-13 08:02:44.742121+00 +739,1265,2026-05-13 08:02:44.742121+00 +739,1270,2026-05-13 08:02:44.742121+00 +739,1243,2026-05-13 08:02:44.742121+00 +740,1265,2026-05-13 08:02:44.742121+00 +740,1231,2026-05-13 08:02:44.742121+00 +740,1198,2026-05-13 08:02:44.742121+00 +740,1270,2026-05-13 08:02:44.742121+00 +740,1243,2026-05-13 08:02:44.742121+00 +741,1270,2026-05-13 08:02:44.742121+00 +741,1231,2026-05-13 08:02:44.742121+00 +741,1243,2026-05-13 08:02:44.742121+00 +742,1270,2026-05-13 08:02:44.742121+00 +742,1198,2026-05-13 08:02:44.742121+00 +742,1265,2026-05-13 08:02:44.742121+00 +742,1231,2026-05-13 08:02:44.742121+00 +743,1260,2026-05-13 08:02:44.742121+00 +743,1270,2026-05-13 08:02:44.742121+00 +743,1271,2026-05-13 08:02:44.742121+00 +744,1271,2026-05-13 08:02:44.742121+00 +744,1270,2026-05-13 08:02:44.742121+00 +745,1227,2026-05-13 08:02:44.742121+00 +746,1227,2026-05-13 08:02:44.742121+00 +746,1270,2026-05-13 08:02:44.742121+00 +746,1260,2026-05-13 08:02:44.742121+00 +747,1217,2026-05-13 08:02:44.742121+00 +747,1255,2026-05-13 08:02:44.742121+00 +747,1270,2026-05-13 08:02:44.742121+00 +748,1217,2026-05-13 08:02:44.742121+00 +748,1255,2026-05-13 08:02:44.742121+00 +749,1270,2026-05-13 08:02:44.742121+00 +749,1217,2026-05-13 08:02:44.742121+00 +750,1255,2026-05-13 08:02:44.742121+00 +751,1217,2026-05-13 08:02:44.742121+00 +751,1255,2026-05-13 08:02:44.742121+00 +752,1255,2026-05-13 08:02:44.742121+00 +752,1217,2026-05-13 08:02:44.742121+00 +753,1263,2026-05-13 08:02:44.742121+00 +753,1224,2026-05-13 08:02:44.742121+00 +753,1223,2026-05-13 08:02:44.742121+00 +753,1226,2026-05-13 08:02:44.742121+00 +754,1226,2026-05-13 08:02:44.742121+00 +754,1258,2026-05-13 08:02:44.742121+00 +754,1224,2026-05-13 08:02:44.742121+00 +755,1223,2026-05-13 08:02:44.742121+00 +755,1224,2026-05-13 08:02:44.742121+00 +755,1263,2026-05-13 08:02:44.742121+00 +755,1258,2026-05-13 08:02:44.742121+00 +756,1220,2026-05-13 08:02:44.742121+00 +757,1220,2026-05-13 08:02:44.742121+00 +757,1271,2026-05-13 08:02:44.742121+00 +758,1250,2026-05-13 08:02:44.742121+00 +758,1220,2026-05-13 08:02:44.742121+00 +758,1237,2026-05-13 08:02:44.742121+00 +759,1250,2026-05-13 08:02:44.742121+00 +759,1237,2026-05-13 08:02:44.742121+00 +759,1220,2026-05-13 08:02:44.742121+00 +760,1202,2026-05-13 08:02:44.742121+00 +760,1255,2026-05-13 08:02:44.742121+00 +760,1258,2026-05-13 08:02:44.742121+00 +760,1215,2026-05-13 08:02:44.742121+00 +760,1209,2026-05-13 08:02:44.742121+00 +761,1257,2026-05-13 08:02:44.742121+00 +761,1255,2026-05-13 08:02:44.742121+00 +761,1237,2026-05-13 08:02:44.742121+00 +761,1209,2026-05-13 08:02:44.742121+00 +761,1202,2026-05-13 08:02:44.742121+00 +761,1219,2026-05-13 08:02:44.742121+00 +761,1258,2026-05-13 08:02:44.742121+00 +761,1215,2026-05-13 08:02:44.742121+00 +762,1202,2026-05-13 08:02:44.742121+00 +762,1237,2026-05-13 08:02:44.742121+00 +762,1215,2026-05-13 08:02:44.742121+00 +762,1257,2026-05-13 08:02:44.742121+00 +762,1255,2026-05-13 08:02:44.742121+00 +763,1219,2026-05-13 08:02:44.742121+00 +763,1215,2026-05-13 08:02:44.742121+00 +763,1255,2026-05-13 08:02:44.742121+00 +763,1209,2026-05-13 08:02:44.742121+00 +763,1257,2026-05-13 08:02:44.742121+00 +763,1258,2026-05-13 08:02:44.742121+00 +764,1255,2026-05-13 08:02:44.742121+00 +764,1237,2026-05-13 08:02:44.742121+00 +764,1257,2026-05-13 08:02:44.742121+00 +765,1209,2026-05-13 08:02:44.742121+00 +765,1201,2026-05-13 08:02:44.742121+00 +765,1221,2026-05-13 08:02:44.742121+00 +765,1226,2026-05-13 08:02:44.742121+00 +766,1226,2026-05-13 08:02:44.742121+00 +766,1242,2026-05-13 08:02:44.742121+00 +766,1221,2026-05-13 08:02:44.742121+00 +766,1201,2026-05-13 08:02:44.742121+00 +767,1209,2026-05-13 08:02:44.742121+00 +767,1226,2026-05-13 08:02:44.742121+00 +768,1264,2026-05-13 08:02:44.742121+00 +768,1247,2026-05-13 08:02:44.742121+00 +769,1264,2026-05-13 08:02:44.742121+00 +770,1259,2026-05-13 08:02:44.742121+00 +770,1264,2026-05-13 08:02:44.742121+00 +771,1196,2026-05-13 08:02:44.742121+00 +771,1247,2026-05-13 08:02:44.742121+00 +772,1212,2026-05-13 08:02:44.742121+00 +773,1239,2026-05-13 08:02:44.742121+00 +773,1212,2026-05-13 08:02:44.742121+00 +774,1196,2026-05-13 08:02:44.742121+00 +775,1196,2026-05-13 08:02:44.742121+00 +776,1229,2026-05-13 08:02:44.742121+00 +777,1223,2026-05-13 08:02:44.742121+00 +777,1197,2026-05-13 08:02:44.742121+00 +777,1198,2026-05-13 08:02:44.742121+00 +777,1229,2026-05-13 08:02:44.742121+00 +777,1214,2026-05-13 08:02:44.742121+00 +778,1229,2026-05-13 08:02:44.742121+00 +779,1238,2026-05-13 08:02:44.742121+00 +779,1240,2026-05-13 08:02:44.742121+00 +779,1235,2026-05-13 08:02:44.742121+00 +779,1268,2026-05-13 08:02:44.742121+00 +780,1238,2026-05-13 08:02:44.742121+00 +780,1235,2026-05-13 08:02:44.742121+00 +780,1268,2026-05-13 08:02:44.742121+00 +780,1198,2026-05-13 08:02:44.742121+00 +780,1240,2026-05-13 08:02:44.742121+00 +781,1240,2026-05-13 08:02:44.742121+00 +781,1268,2026-05-13 08:02:44.742121+00 +781,1259,2026-05-13 08:02:44.742121+00 +782,1240,2026-05-13 08:02:44.742121+00 +782,1259,2026-05-13 08:02:44.742121+00 +782,1238,2026-05-13 08:02:44.742121+00 +782,1198,2026-05-13 08:02:44.742121+00 +783,1268,2026-05-13 08:02:44.742121+00 +783,1259,2026-05-13 08:02:44.742121+00 +784,1266,2026-05-13 08:02:44.742121+00 +784,1206,2026-05-13 08:02:44.742121+00 +784,1204,2026-05-13 08:02:44.742121+00 +785,1241,2026-05-13 08:02:44.742121+00 +785,1206,2026-05-13 08:02:44.742121+00 +786,1241,2026-05-13 08:02:44.742121+00 +786,1206,2026-05-13 08:02:44.742121+00 +786,1204,2026-05-13 08:02:44.742121+00 +787,1245,2026-05-13 08:02:44.742121+00 +787,1241,2026-05-13 08:02:44.742121+00 +788,1245,2026-05-13 08:02:44.742121+00 +788,1204,2026-05-13 08:02:44.742121+00 +788,1241,2026-05-13 08:02:44.742121+00 +789,1213,2026-05-13 08:02:44.742121+00 +789,1232,2026-05-13 08:02:44.742121+00 +790,1232,2026-05-13 08:02:44.742121+00 +790,1213,2026-05-13 08:02:44.742121+00 +791,1232,2026-05-13 08:02:44.742121+00 +791,1200,2026-05-13 08:02:44.742121+00 +792,1232,2026-05-13 08:02:44.742121+00 +793,1204,2026-05-13 08:02:44.742121+00 +793,1217,2026-05-13 08:02:44.742121+00 +794,1252,2026-05-13 08:02:44.742121+00 +794,1204,2026-05-13 08:02:44.742121+00 +794,1266,2026-05-13 08:02:44.742121+00 +794,1253,2026-05-13 08:02:44.742121+00 +795,1217,2026-05-13 08:02:44.742121+00 +795,1266,2026-05-13 08:02:44.742121+00 +795,1252,2026-05-13 08:02:44.742121+00 +796,1266,2026-05-13 08:02:44.742121+00 +796,1252,2026-05-13 08:02:44.742121+00 +796,1253,2026-05-13 08:02:44.742121+00 +797,1253,2026-05-13 08:02:44.742121+00 +798,1244,2026-05-13 08:02:44.742121+00 +798,1199,2026-05-13 08:02:44.742121+00 +799,1199,2026-05-13 08:02:44.742121+00 +800,1199,2026-05-13 08:02:44.742121+00 +801,1199,2026-05-13 08:02:44.742121+00 +801,1252,2026-05-13 08:02:44.742121+00 +802,1199,2026-05-13 08:02:44.742121+00 +802,1252,2026-05-13 08:02:44.742121+00 diff --git a/scripts/seed_snapshot_data/data/feed_posts.csv b/scripts/seed_snapshot_data/data/feed_posts.csv new file mode 100644 index 00000000..916dc527 --- /dev/null +++ b/scripts/seed_snapshot_data/data/feed_posts.csv @@ -0,0 +1,289 @@ +id,author_id,body,created_at,updated_at,deleted_at,version,lang +515,1195,"Spent yesterday drafting a PostgreSQL 12→16 migration plan for a startup. The thing most people miss: replica lag is a bigger problem than the downtime itself. You have to pause app-side writes for an hour before cutover and let the lag drain to zero, otherwise you're chasing rows.",2026-05-02 14:59:14.078514+00,2026-05-02 14:59:14.078514+00,,0,tr +516,1195,"Been load-testing Spring Boot 3.x virtual threads against a real workload for a month. Result: I/O-heavy endpoints saw p99 drop ~40%; CPU-bound code is unchanged. Caveat: any library still using ThreadLocal will surprise you, watch out.",2026-04-10 00:06:24.570067+00,2026-04-10 00:06:24.570067+00,,0,tr +517,1195,"Anyone prepping for a system design interview: before you say ""scale to one million users"" at the whiteboard, sketch a realistic traffic distribution. There is no uniform load. 80% of users hit 20% of your endpoints. Design to that, not the average.",2026-05-05 05:01:28.449522+00,2026-05-05 05:01:28.449522+00,,0,tr +518,1195,"Took the Vespa for a Bosphorus loop this morning, just to clear my head. Got home and shipped three bug fixes in an hour. Devs: stop underestimating how much getting away from the screen improves the work.",2026-04-29 07:39:01.538957+00,2026-04-29 07:39:01.538957+00,,0,tr +519,1195,"Favourite way I explain eventual consistency: an e-commerce cart shows quantity 1 in the UI but stock is already 0. Strong consistency means the user waits 200ms on every interaction. Eventual means the checkout fails at the end and they learn. Which is worse? Always ""it depends"" — and that's the whole answer.",2026-04-15 01:37:37.58202+00,2026-04-15 01:37:37.58202+00,,0,tr +520,1195,"""Senior"" isn't measured in years or title, it's measured by whether you're the calmest person in the room when the 2am incident channel lights up. I learned that from Pelin abla at Trendyol. Still hasn't left me.",2026-04-26 07:09:43.01207+00,2026-04-26 07:09:43.01207+00,,0,tr +521,1195,"On the OpenSearch vs Elasticsearch debate post-2024: licensing has shifted enough that for greenfield work I now default to OpenSearch. If you're self-hosting outside AWS, the latest Elastic license change is a real risk to weigh.",2026-05-02 03:32:37.199138+00,2026-05-02 03:32:37.199138+00,,0,tr +522,1195,"Hiring ""complex problem solving"": stop using CodeSignal, run a real on-call scenario instead. ""This alarm just fired and you own the service — walk me through what you'd do."" Teaches you more about a candidate than any CV bullet ever will.",2026-05-03 23:08:02.835665+00,2026-05-03 23:08:02.835665+00,,0,tr +523,1196,"Stop calling everything a ""growth hack."" If you can't explain it as a hypothesis about your customer, it's not growth — it's just a thing you tried. Write the hypothesis first, ship second.",2026-04-30 13:38:53.633738+00,2026-04-30 13:38:53.633738+00,,0,tr +524,1196,"Re-read ""Obviously Awesome"" by April Dunford this week for the fourth time. Still the most underrated positioning book on the market. Especially good if you're stuck on differentiation and reaching for feature lists instead.",2026-04-28 13:46:45.367658+00,2026-04-28 13:46:45.367658+00,,0,tr +525,1197,"Production isn't about Gantt charts. It's about being the person who tells the designer their feature has to ship in three weeks instead of six, and still keeping their respect afterward. The chart is just paperwork.",2026-04-15 07:46:09.691115+00,2026-04-15 07:46:09.691115+00,,0,tr +526,1197,"Live ops calendar planning for Q3 starts tomorrow. The mistake juniors make: stacking events back-to-back to look productive. Better: 3 strong events, 4 quiet weeks, measured KPIs at each end.",2026-04-13 21:37:06.701946+00,2026-04-13 21:37:06.701946+00,,0,tr +527,1197,Moved to Erzurum to slow down. Two years in: I think 40% slower in the right way. Decisions I make now are better. Recommend everyone in this industry try a winter somewhere cold and quiet.,2026-04-30 14:22:07.283837+00,2026-04-30 14:22:07.283837+00,,0,tr +528,1197,"Hot take: ""soft skills"" is a terrible label for what's actually a critical leadership skill set. Negotiation, conflict resolution, narrative — these are harder to learn than any engine API. Rename them already.",2026-05-06 23:37:12.376303+00,2026-05-06 23:37:12.376303+00,,0,tr +529,1198,"Most rejected PhD applications fail at the research statement, not the grades. The opening paragraph has to answer: what question are you committed to, why is it hard, and why are you the right person to take a swing at it. That's it.",2026-04-29 19:03:53.798715+00,2026-04-29 19:03:53.798715+00,,0,tr +530,1198,"Spent the afternoon with a paper on interpretability via influence functions. The math is denser than it needs to be but the core idea is elegant. If you're scared of papers, start with the introduction and conclusion only. Build up from there.",2026-04-15 00:38:57.244192+00,2026-04-15 00:38:57.244192+00,,0,tr +531,1198,"Public speaking advice that no one wants to hear: practice out loud, not in your head. Your brain skips the hard parts when you rehearse silently. Speaking it surfaces the gaps in 30 seconds.",2026-05-01 05:05:39.173862+00,2026-05-01 05:05:39.173862+00,,0,tr +532,1198,Caught the dawn from the campus library window this morning. I forget sometimes why I chose this field — and then a quiet hour with a hard problem reminds me. Days like this are why.,2026-05-02 15:22:27.779296+00,2026-05-02 15:22:27.779296+00,,0,tr +533,1198,"Started keeping a ""questions notebook"" again after a five-year break. Just questions, no answers. It's the single best research habit I've ever had and I keep forgetting that.",2026-04-11 17:15:04.149036+00,2026-04-11 17:15:04.149036+00,,0,tr +534,1198,"To anyone applying this cycle: rejection from one program isn't signal about your fit anywhere. Admissions committees are smaller, more political, and more luck-driven than you think. Apply broadly, fall in love with no single program.",2026-05-01 09:45:58.173253+00,2026-05-01 09:45:58.173253+00,,0,tr +535,1199,"""I'm going to start a company"" is not a decision, it's a daydream. The decision is ""I will spend the next three years on this specific problem with this specific co-founder."" If you can't write that sentence, you're not ready yet. That's fine.",2026-05-03 08:33:55.114869+00,2026-05-03 08:33:55.114869+00,,0,tr +536,1200,A runbook that nobody on the team has actually read is worse than no runbook. It gives false comfort. Read them as a team monthly. Walk through one as a tabletop. Update what's wrong.,2026-04-06 15:28:23.94251+00,2026-04-06 15:28:23.94251+00,,0,tr +537,1200,"Terraform 1.10's improved retry semantics for state locking is small and quiet but actually a meaningful quality-of-life win. We've stopped seeing the random ""couldn't acquire lock"" failures from racing CI jobs.",2026-04-23 23:04:32.757008+00,2026-04-23 23:04:32.757008+00,,0,tr +538,1200,"Stop celebrating ""we deploy 50 times a day"" as the goal. The goal is ""we can deploy when we need to, including at 3am, with confidence."" Speed is a side effect of trust, not the other way around.",2026-04-14 22:49:36.426797+00,2026-04-14 22:49:36.426797+00,,0,tr +539,1200,Saturday no-pings rule renewed for 2026. My team knows. They escalate to my deputy. The world has not ended in two years.,2026-04-28 02:00:38.008893+00,2026-04-28 02:00:38.008893+00,,0,tr +540,1200,"eBPF tooling has matured to the point where it's becoming part of the ""default"" SRE toolkit, not a niche curiosity. If you're doing platform work and haven't poked at it yet, this year is the year.",2026-04-25 07:25:38.459249+00,2026-04-25 07:25:38.459249+00,,0,tr +541,1201,"""Is this secure?"" is not a question. ""Is this secure against an attacker who has compromised a developer's laptop and wants to read our customer database in the next 90 days?"" is a question. Be specific or be ignored.",2026-05-04 18:09:34.128243+00,2026-05-04 18:09:34.128243+00,,0,tr +542,1201,Reading the latest CISA OT advisory. The pattern is becoming clearer: attackers are spending more time in reconnaissance and less in actual exploitation. We need to shift detection earlier in the chain.,2026-04-11 21:35:15.198406+00,2026-04-11 21:35:15.198406+00,,0,tr +543,1201,"Zero trust is misnamed. It's not zero trust — it's continuous verification. Marketers ruined a useful concept by branding it like a finality. Don't tell your CEO you've ""achieved zero trust."" You haven't, and they'll find out.",2026-04-27 03:10:59.910922+00,2026-04-27 03:10:59.910922+00,,0,tr +544,1201,Took my mother to the Aphrodisias ruins yesterday. Walked the marble street and thought about how every great civilization had a security model that eventually failed because the threat changed faster than the architecture. The job hasn't changed in 2000 years.,2026-04-27 19:49:50.843749+00,2026-04-27 19:49:50.843749+00,,0,tr +545,1202,"The hardest part of moving from senior IC to manager isn't the work, it's losing the dopamine hit from solving things yourself. You delegate the thing you're best at and then watch someone else do it slower. If that idea makes you flinch, manage your expectations.",2026-04-02 20:29:55.053228+00,2026-04-02 20:29:55.053228+00,,0,tr +546,1202,Walked Çamlıca hill at sunrise. Mid-week. The week's calendar didn't have a single 1:1 cancelled. I'm calling that a small win.,2026-04-18 16:57:32.278936+00,2026-04-18 16:57:32.278936+00,,0,tr +547,1203,"Pre-seed fundraising honest take: investors are pattern-matching. Your job is to be unmistakably one good pattern, not a vague combination of three. Pick which story you're telling before the first meeting, not in it.",2026-04-16 23:29:55.880674+00,2026-04-16 23:29:55.880674+00,,0,tr +548,1203,"Re-reading ""Founders at Work"" between meetings this week. The 2007 stories are dated but the emotional content is identical to what I lived through last year. Comforting and slightly terrifying.",2026-04-09 22:47:09.977815+00,2026-04-09 22:47:09.977815+00,,0,tr +549,1203,"Developer tools GTM is brutal because the buyer doesn't want to be sold to. Bottom-up adoption first, top-down expansion second. Anyone selling you ""AE-led top-down devtools"" is selling you a fantasy.",2026-04-22 23:31:00.005181+00,2026-04-22 23:31:00.005181+00,,0,tr +550,1203,"Founder lonely-day report: yesterday I cried in the bathroom for ten minutes after a board call, then went out and shipped a customer demo two hours later. Both can be true. Most days are.",2026-04-07 06:15:24.422529+00,2026-04-07 06:15:24.422529+00,,0,tr +551,1204,"""Functional vs OOP"" is the wrong axis. The actual question is: where should the behaviour live, and how much does that location cost you when requirements change in 6 months. Pick locations carefully.",2026-05-03 21:33:17.356075+00,2026-05-03 21:33:17.356075+00,,0,tr +552,1204,Spring Boot 3.4's auto-configuration tracing is genuinely useful for debugging weird startup behaviour. We hit a property binding bug last week that would have taken half a day; tracing pinpointed it in 5 minutes.,2026-05-06 22:24:36.535587+00,2026-05-06 22:24:36.535587+00,,0,tr +553,1204,My parents live in the next street over. Today I walked to lunch with them between meetings. People assume Pendik is sleepy. It's not — it's just not Instagram. That's a feature.,2026-04-29 03:49:49.276597+00,2026-04-29 03:49:49.276597+00,,0,tr +554,1205,"""Explainable AI"" is a misnomer in regulated finance. What auditors want is ""defensible AI"" — model + documentation + monitoring + override process. Explainability is a means to defensibility, not the goal.",2026-05-02 22:01:12.974025+00,2026-05-02 22:01:12.974025+00,,0,tr +555,1205,"EU AI Act timelines this week: still moving. Banks need to be ready by mid-2027 for the high-risk classifications. If your model risk function is just starting to map your inventory, you're already behind. Start with the GenAI use cases.",2026-05-04 15:36:44.636871+00,2026-05-04 15:36:44.636871+00,,0,tr +556,1205,"Hardest part of responsible AI in practice: getting model owners to write documentation before deployment, not after. Once it's deployed, no one wants to do the paperwork. Build it into the launch checklist or it doesn't happen.",2026-04-17 03:58:25.276694+00,2026-04-17 03:58:25.276694+00,,0,tr +557,1205,"Walked Galata Bridge at dusk. Fishermen, traffic, gulls, history. Cleared my head before a heavy committee tomorrow. Beyoğlu is loud but you can find quiet in it if you know where to look.",2026-05-02 20:43:46.704704+00,2026-05-02 20:43:46.704704+00,,0,tr +558,1206,"Junior portfolio: pretty case studies. Mid portfolio: outcomes claimed but not measured. Senior portfolio: outcomes measured and contextual (""we increased X by 12% but Y stayed flat because Z""). Move toward the third as fast as you can.",2026-04-29 20:24:26.555653+00,2026-04-29 20:24:26.555653+00,,0,tr +559,1206,Figma's variables update is still underused. Especially for design systems that need to flex between brand contexts. I use it now in every consulting engagement; halves token maintenance overhead.,2026-04-23 18:03:42.281392+00,2026-04-23 18:03:42.281392+00,,0,tr +560,1206,Design systems are not a product strategy. They are a tool. A team that treats them as a strategy is a team that has stopped asking what the customer is actually trying to do.,2026-04-28 21:55:08.156888+00,2026-04-28 21:55:08.156888+00,,0,tr +561,1206,Made manti from scratch tonight. Forty minutes of folding. My partner laughed at how slow I was. The pasta was worth it. The slowness was the point.,2026-04-10 03:25:41.047662+00,2026-04-10 03:25:41.047662+00,,0,tr +562,1206,"The ""design critique"" most teams run is just public review. A real critique is a structured conversation that pulls the why out of the maker. If everyone leaves agreeing with the highest-status voice, you didn't critique anything.",2026-05-07 08:38:14.738309+00,2026-05-07 08:38:14.738309+00,,0,tr +563,1206,"Re-reading ""Design of Everyday Things"" by Norman this winter. It hits differently after a decade of design work. The fundamentals haven't changed; we've just gotten better at distracting ourselves from them.",2026-04-18 08:17:01.708569+00,2026-04-18 08:17:01.708569+00,,0,tr +564,1206,"Ordu in May: sea visible from the kitchen window, mountain visible from the back. I don't miss Istanbul most days. I miss it on Tuesdays for some reason. Brains are strange.",2026-05-05 00:50:41.813579+00,2026-05-05 00:50:41.813579+00,,0,tr +565,1207,"First call with my new mentor today. She told me to stop apologizing for ""not having a CS degree"" in the first ten seconds. Apparently I'd said it twice. Note taken.",2026-05-04 06:49:33.748364+00,2026-05-04 06:49:33.748364+00,,0,tr +566,1207,Got my first multi-stage Docker build working tonight. Image size went from 1.2GB to 180MB. The relief is real. Why does no tutorial actually explain the layer caching properly?,2026-05-01 19:38:20.892754+00,2026-05-01 19:38:20.892754+00,,0,tr +567,1208,"My mentor reframed the ""but I'm not technical"" worry today: ""you have a literature that most engineers haven't read. They need you to translate it."" Slowly internalizing this.",2026-04-20 20:08:59.07981+00,2026-04-20 20:08:59.07981+00,,0,tr +568,1209,Wrote my first FastAPI service today wrapping a sklearn model. The model is bad. The service works. Counting it as a win — last week I'd never deployed anything.,2026-05-04 03:32:20.639813+00,2026-05-04 03:32:20.639813+00,,0,tr +569,1209,My mentor asked me what failure modes I'd designed for. I said 'none yet.' She said that's the only answer that matters this month. We're starting there.,2026-04-14 01:42:15.619079+00,2026-04-14 01:42:15.619079+00,,0,tr +570,1210,Got SwiftUI list animations working tonight. Took three hours longer than the tutorial promised. The tutorial was lying. Going to write down what actually trips beginners and post it for the next person.,2026-04-29 09:28:41.728295+00,2026-04-29 09:28:41.728295+00,,0,tr +571,1210,"Day 60 of iOS journey: I now know the difference between @State and @StateObject without looking it up. Tiny moment, huge relief.",2026-05-07 18:32:59.870751+00,2026-05-07 18:32:59.870751+00,,0,tr +572,1210,"Erzurum is still cold in May. Wrote code with the heater on, dog on my lap, snow visible from the kitchen window. Best work conditions I've ever had.",2026-05-05 19:21:22.371677+00,2026-05-05 19:21:22.371677+00,,0,tr +573,1210,"Asked my mentor: ""should I learn UIKit or just SwiftUI?"" He said: both, in that order, because most jobs still have UIKit codebases. Was hoping for a shortcut. There isn't one.",2026-04-22 01:55:39.146076+00,2026-04-22 01:55:39.146076+00,,0,tr +574,1211,"Sent my mentor the third draft of my research statement. She marked five paragraphs as ""good,"" two as ""you're describing not arguing,"" and one as ""this should be the opening."" Iteration four tomorrow.",2026-05-08 05:36:45.53914+00,2026-05-08 05:36:45.53914+00,,0,tr +575,1211,"My mom asked me again today what a PhD is, exactly. Tried to explain. She nodded. She still believes in me which is the only thing that actually matters.",2026-04-28 21:55:07.193925+00,2026-04-28 21:55:07.193925+00,,0,tr +576,1211,Finished a paper on contrastive learning for low-resource Turkish NLP. The methodology section took longer than the implementation. Now I know why senior researchers smile knowingly when I complain about writing.,2026-04-26 16:29:25.973016+00,2026-04-26 16:29:25.973016+00,,0,tr +577,1212,"Re-made the same time-series chart three different ways tonight. The third one — small multiples by category — was the clear winner. The ""obvious"" candlestick chart was the worst. The visualization is the analysis.",2026-04-11 13:09:22.124013+00,2026-04-11 13:09:22.124013+00,,0,tr +578,1212,"My mentor pushed me to write a one-paragraph narrative for every chart I make. ""If you can't write it, the chart doesn't say anything."" Hardest exercise of the week.",2026-04-24 12:53:46.275838+00,2026-04-24 12:53:46.275838+00,,0,tr +579,1212,Şişli lunch hour with my friend who works in audit. He spends his days in Excel; I spend mine in pandas. We agreed neither of us actually likes the food in this neighborhood.,2026-05-08 17:11:35.968134+00,2026-05-08 17:11:35.968134+00,,0,tr +580,1213,Spent the night red-teaming my own student-services chatbot. Found seven prompts that get it to produce confidently wrong financial-aid advice. Building the guardrails is going to take longer than building the bot.,2026-04-19 05:31:21.330336+00,2026-04-19 05:31:21.330336+00,,0,tr +581,1213,"First session with my mentor was about ""what would you tell the person who deployed your project to production without your guardrails."" Heavy question. Right one to start with.",2026-03-08 15:23:44.125276+00,2026-03-08 15:23:44.125276+00,,0,tr +582,1213,Kartal coast walk after a long study day. The city looks distant from the marina. Sometimes you need that distance to think clearly.,2026-04-21 16:43:58.99853+00,2026-04-21 16:43:58.99853+00,,0,tr +583,1214,Wrote a 20-minute Bitsy game about my grandmother's house in Tekirdağ. Two playtesters cried. I'm not sure if that means the game is good or my grandmother's house is good but I'll take it.,2026-04-10 16:02:24.290276+00,2026-04-10 16:02:24.290276+00,,0,tr +584,1214,"My mentor in games: ""stop apologizing for narrative games being small. Smallness is your distribution advantage."" Going to print that.",2026-04-24 15:41:01.417605+00,2026-04-24 15:41:01.417605+00,,0,tr +585,1215,Did a full GRE practice test today. 162Q / 152V. The verbal needs work. Reading academic English for an hour each night starting tomorrow.,2026-05-07 02:49:13.314347+00,2026-05-07 02:49:13.314347+00,,0,tr +586,1215,"Walked the Dardanelles after a study block tonight. Hard to feel ""behind"" when you're standing where the wind has been blowing the same direction for 3000 years.",2026-04-29 00:07:11.11928+00,2026-04-29 00:07:11.11928+00,,0,tr +587,1215,"My mentor told me: 'your research statement should be the strongest thing the committee reads, your GRE the least interesting.' Reordering my priorities accordingly.",2026-04-14 02:41:13.811352+00,2026-04-14 02:41:13.811352+00,,0,tr +588,1215,"Realized today my reading bottleneck is vocabulary in technical English, not comprehension. Built a flashcard deck. 20 cards a day starting now.",2026-04-22 18:02:23.720019+00,2026-04-22 18:02:23.720019+00,,0,tr +589,1216,"My mentor told me to stop saying ""I'm switching from teaching to tech"" and start saying ""I'm a communicator who reads data now."" Same facts, different positioning. Wild how much the framing matters.",2026-04-02 16:44:17.349674+00,2026-04-02 16:44:17.349674+00,,0,tr +590,1216,"Wrote my first SQL query that wasn't from a tutorial today. Pulled real data from a free dataset, asked my own question, got a real answer. Tiny moment, big shift.",2026-03-24 18:52:52.155619+00,2026-03-24 18:52:52.155619+00,,0,tr +591,1216,"Bakırköy in May is gentle. Coffee on the balcony, books on the table, no commute to the language school for the first time in three years. Saving is hard but freedom is worth it.",2026-04-23 20:33:49.892402+00,2026-04-23 20:33:49.892402+00,,0,tr +592,1216,"Built a small Tableau dashboard for a friend's small business — actual food cost analysis, actual decisions came out of it. Adding to portfolio. The ""fake project"" rule of thumb is real.",2026-05-02 12:34:39.109779+00,2026-05-02 12:34:39.109779+00,,0,tr +593,1217,First bug bounty find that actually paid: a stored XSS in a Turkish e-commerce site. $200 and a thank-you. Spent the money on a year of Hack The Box. The compound interest is real.,2026-04-22 09:32:31.909925+00,2026-04-22 09:32:31.909925+00,,0,tr +594,1217,"My mentor's first question: ""what is your favourite vulnerability and why."" Not the resume question. The real one. We spent 40 minutes on it. I left more focused than I've been in a year.",2026-04-27 20:52:25.684947+00,2026-04-27 20:52:25.684947+00,,0,tr +595,1217,"Wrote a small Python tool to fuzz a vulnerable web app at home. Found a path traversal in 30 seconds. The thrill is in the build, not the find. I get why people stay in this field for life.",2026-05-01 20:37:53.961862+00,2026-05-01 20:37:53.961862+00,,0,tr +596,1217,Esenyurt to Yıldız: 90 minutes one way. Wrote half a CTF writeup on the metrobus today. Productivity is wherever you decide it is.,2026-05-03 21:15:43.764013+00,2026-05-03 21:15:43.764013+00,,0,tr +597,1217,"Read every disclosed CVE this week with a CVSS over 7.0. Most are configuration bugs, not exploit-of-the-century discoveries. The skill we need is reading systems, not writing exploits.",2026-04-24 16:58:05.043225+00,2026-04-24 16:58:05.043225+00,,0,tr +598,1217,"My mentor: ""passing OSCP isn't the goal. The journey of preparing for it is."" Was annoyed at first. He's right and I know it.",2026-04-17 11:46:34.194815+00,2026-04-17 11:46:34.194815+00,,0,tr +599,1217,"Tried to explain to my mom what a pentester does. She nodded and said ""so you break things for a living."" Yeah, basically. She's not wrong.",2026-03-14 11:29:30.700883+00,2026-03-14 11:29:30.700883+00,,0,tr +600,1218,Modeled a low-poly Manisa street tonight. Took longer than expected to get the perspective right. Posting the work-in-progress before I lose the energy.,2026-05-03 21:41:10.903837+00,2026-05-03 21:41:10.903837+00,,0,tr +601,1218,"My mentor in games told me to stop ""learning everything"" and pick one art style to master. Painful advice — I like everything — but right.",2026-05-04 05:34:14.286176+00,2026-05-04 05:34:14.286176+00,,0,tr +602,1219,Released my first Flutter app to internal testing today. It's a study-planner that probably ten people will use. I'm proud of it like it's a Series A startup.,2026-04-25 08:51:59.632227+00,2026-04-25 08:51:59.632227+00,,0,tr +603,1219,"My mentor asked me to define my ""ideal user"" in one sentence. Spent three days on it. Came back with three pages. We're rewriting it to one paragraph this week.",2026-05-05 01:04:12.085463+00,2026-05-05 01:04:12.085463+00,,0,tr +604,1219,"Switched the app's color palette today. Two hours of iteration. The new one is calmer. I now understand why senior designers say ""calm is a feature.""",2026-04-28 12:39:57.425546+00,2026-04-28 12:39:57.425546+00,,0,tr +605,1219,Kartal marina at sunset. Closed my laptop. Watched a kid try to skip stones for 20 minutes. Came back and shipped a release. Brains need quiet.,2026-04-26 03:46:24.737109+00,2026-04-26 03:46:24.737109+00,,0,tr +606,1219,Refactored my state management today. Cut three files. Now it reads top-to-bottom in 80 lines. Less code is the right kind of progress.,2026-05-05 21:27:11.062175+00,2026-05-05 21:27:11.062175+00,,0,tr +607,1219,Today's session was a code review of my app. My mentor circled the same anti-pattern in five places without naming it once. Spent an hour figuring out the pattern myself. Best teaching method.,2026-05-05 15:37:23.579717+00,2026-05-05 15:37:23.579717+00,,0,tr +608,1219,"Found out today my younger cousin wants to study CS too. She asked if she's ""good enough at math."" Told her she's asking the wrong question. I think I sounded like my own mentor.",2026-05-08 12:26:48.353833+00,2026-05-08 12:26:48.353833+00,,0,tr +609,1220,My mentor asked me to print my resume and read it out loud to him. I heard every weak phrase in real-time. Rewriting tonight.,2026-04-06 19:43:34.67212+00,2026-04-06 19:43:34.67212+00,,0,tr +610,1221,My Selenium tests were flaky for three weeks. Today I learned about explicit waits and the entire suite settled down. Reading docs from the start would have saved me three weeks. Lesson noted.,2026-04-04 21:31:23.342023+00,2026-04-04 21:31:23.342023+00,,0,tr +611,1222,"Drove to two logistics warehouses in Sakarya this weekend with a notebook. Six conversations, four of them honest, two trying to sell me something. Learned more than any textbook chapter.",2026-05-02 00:52:10.213535+00,2026-05-02 00:52:10.213535+00,,0,tr +612,1222,My mentor asked me to write the obituary for my startup if it fails. Brutal exercise. Made my actual pitch better.,2026-04-30 03:58:19.062644+00,2026-04-30 03:58:19.062644+00,,0,tr +613,1222,"Spring is finally here in Sakarya. Did my ""founder thinking time"" walk in the park with no notebook. The best idea of the week came back on the second loop.",2026-04-29 06:29:06.760229+00,2026-04-29 06:29:06.760229+00,,0,tr +614,1223,"Audited my first OpenZeppelin contract this weekend. Found nothing. The exercise was the lesson — reading slow, asking why every line exists. Audits are reading comprehension, not gotcha-hunting.",2026-04-26 02:47:55.373256+00,2026-04-26 02:47:55.373256+00,,0,tr +615,1223,"My mentor: ""remote-first is a discipline, not a permission slip."" We spent the call talking about written communication habits. I thought we'd talk about contracts.",2026-04-18 02:32:52.151179+00,2026-04-18 02:32:52.151179+00,,0,tr +616,1223,Studied a famous DeFi exploit from 2022 line by line tonight. The bug was visible in a single function. Hindsight is a luxury. The exploit's author saw it without hindsight. That's the skill.,2026-04-19 08:06:30.411217+00,2026-04-19 08:06:30.411217+00,,0,tr +617,1223,"Diyarbakır has 7 hours of remote-overlap with European hours. I make them count. The rest of the day I read, walk, and sit in my favourite kahvehane. Different from my classmates in Istanbul. Better.",2026-03-24 10:20:20.705594+00,2026-03-24 10:20:20.705594+00,,0,tr +618,1223,Wrote my own ERC-20 today. Deployed to a testnet. Watched the transactions roll in. Some kind of magic. Reminds me why I picked this field.,2026-04-26 14:24:28.599577+00,2026-04-26 14:24:28.599577+00,,0,tr +619,1223,My mentor sent me a list of 30 audit firms. Said: 'read their public reports for a month before you apply. You'll know who fits.' Practical advice. Started today.,2026-04-24 18:33:31.281325+00,2026-04-24 18:33:31.281325+00,,0,tr +620,1223,Gas optimization is its own little discipline. Saved 1200 gas on a function today by reordering a struct's fields. Small but I'm proud. Real engineers learn to love these wins.,2026-05-07 22:12:29.938312+00,2026-05-07 22:12:29.938312+00,,0,tr +621,1223,"Family Sunday — too many cousins, too much food, no laptop. Came back to my notes Monday morning and they made more sense. Distance from work is its own skill.",2026-04-24 15:22:09.26428+00,2026-04-24 15:22:09.26428+00,,0,tr +622,1223,Reviewing audit reports made me appreciate how much of senior security work is writing. A well-written finding is more useful than a flashy exploit. Note to self: write more.,2026-04-26 08:45:12.384518+00,2026-04-26 08:45:12.384518+00,,0,tr +623,1224,"My mentor's first homework: list five companies I'd actually want to work at, not five companies hiring. Different list. Useful exercise.",2026-04-02 08:12:14.86688+00,2026-04-02 08:12:14.86688+00,,0,tr +624,1224,Deployed my React project to Vercel today. The free tier is suspiciously easy. The first time you see your URL in the wild is a real feeling.,2026-04-25 03:15:29.179164+00,2026-04-25 03:15:29.179164+00,,0,tr +625,1224,Grandmother brought me çay every 90 minutes today. Productivity unaffected. Hydration excellent. Best home office setup in Adana.,2026-04-09 19:51:16.732201+00,2026-04-09 19:51:16.732201+00,,0,tr +626,1224,Mock interview with my mentor today. He stopped me at minute three because I'd already apologized for my background twice. Recording shows I do this constantly. Working on it.,2026-03-24 17:39:53.656908+00,2026-03-24 17:39:53.656908+00,,0,tr +627,1224,Studied React Server Components today. Half the blog posts are wrong because the API moved. Going to write a 'what I learned' post once it clicks. The internet needs a current one.,2026-04-18 15:43:26.468556+00,2026-04-18 15:43:26.468556+00,,0,tr +628,1225,"Wrote a Django model for a personal finance tracker. The first model is always too detailed. Tomorrow I'll cut three fields. Less is more, even in models.",2026-05-01 06:11:13.673336+00,2026-05-01 06:11:13.673336+00,,0,tr +629,1225,"My mentor told me: 'self-taught is the hardest path but the most durable. Whatever you learn this year, you'll know cold.' Saving this for hard days.",2026-05-03 20:42:56.322418+00,2026-05-03 20:42:56.322418+00,,0,tr +630,1225,"Built a small ETL pipeline for my own bank statements. Cleaned data, categorized expenses, summary report. Realized: real projects don't need to be impressive. They need to be done.",2026-04-28 10:30:22.081992+00,2026-04-28 10:30:22.081992+00,,0,tr +631,1225,"Sakarya in May: lilacs and gentle rain. Walked to the library, read for two hours, walked back. Reading and walking are dev skills.",2026-04-16 16:12:54.611185+00,2026-04-16 16:12:54.611185+00,,0,tr +632,1225,"Read Django REST framework source today. Half I understood, half I didn't. Going to read the same module again next week and see what's changed in my head.",2026-04-30 15:20:40.015244+00,2026-04-30 15:20:40.015244+00,,0,tr +633,1225,"My mentor's reading list this week is ""go through three job postings and write what you'd learn from doing each role."" Smart exercise — career planning through artifacts.",2026-04-20 23:51:08.599101+00,2026-04-20 23:51:08.599101+00,,0,tr +634,1225,Test coverage went from 30% to 70% on my project today. I'm calling it a day. Coverage isn't quality but it's at least proof I thought about what to break.,2026-04-27 09:56:59.57464+00,2026-04-27 09:56:59.57464+00,,0,tr +635,1226,Ran a 'how to read a research paper' session for 12 classmates tonight. Three of them stayed an hour after to ask deeper questions. Community work compounds quietly.,2026-04-23 12:43:17.10513+00,2026-04-23 12:43:17.10513+00,,0,tr +636,1226,"My mentor in research told me: 'you can't build a club without writing the constitution first.' Spent the weekend on a one-page charter. Painful, useful.",2026-05-09 01:35:30.682563+00,2026-05-09 01:35:30.682563+00,,0,tr +637,1226,Samsun coast walk with three of my study group. Watched a fisherman pull up nothing for an hour. He was content. Good walks have been my favourite study aid this year.,2026-04-20 07:56:26.561124+00,2026-04-20 07:56:26.561124+00,,0,tr +638,1226,Wrote out the application timelines for 8 universities in a single spreadsheet today. Looking at all the dates side-by-side made the project feel finite. Recommend.,2026-04-21 23:00:46.796066+00,2026-04-21 23:00:46.796066+00,,0,tr +639,1227,Ran 5 user interviews for a fake startup idea today. Three told me my idea was useless. Two were polite. The three were the most valuable conversations.,2026-04-23 17:50:52.470952+00,2026-04-23 17:50:52.470952+00,,0,tr +640,1227,My mentor asked me to define 'what is product management?' in one sentence. Spent the session iterating. Final answer: 'continuously deciding what not to ship.' I think I believe it.,2026-04-22 15:29:48.31401+00,2026-04-22 15:29:48.31401+00,,0,tr +641,1227,Built a tiny Notion-clone with my own opinions baked in. Ten users so far. Two unsubscribed. One sent me a five-paragraph feature request. I love this work.,2026-04-29 08:23:27.428189+00,2026-04-29 08:23:27.428189+00,,0,tr +642,1227,"Çankaya in May: jacarandas (no, but I imagined them), real ones lining the Atatürk Bulvarı. Walked home after a long study day. Ankara is gentler than people think.",2026-04-29 23:58:06.672708+00,2026-04-29 23:58:06.672708+00,,0,tr +643,1227,"Today's session: read three job postings, identify the 'real' job vs. the 'wishlist' job. Realized two of three are wishlists. Saving an hour by skipping the wishlist applications.",2026-05-07 23:01:23.265128+00,2026-05-07 23:01:23.265128+00,,0,tr +644,1228,Ran a workshop on writing product specs today. Hardest question I got: 'what do you cut when timeline shrinks?' I didn't have a good answer. Now I'm researching it.,2026-04-22 19:23:23.667262+00,2026-04-22 19:23:23.667262+00,,0,tr +645,1228,My mentor sent me three product specs from real teams. None of them were good. Confidence boost — even experienced PMs ship messy specs. The bar is more forgiving than I thought.,2026-04-16 16:35:22.009681+00,2026-04-16 16:35:22.009681+00,,0,tr +646,1229,Took the SAA practice test today. 68%. Pass mark is 72%. Bottleneck: VPC peering & transit gateway. Next two weeks belong to networking.,2026-05-07 04:10:25.558684+00,2026-05-07 04:10:25.558684+00,,0,tr +647,1229,My mentor: 'the certification gets you the interview. The half-built homelab gets you the job.' Started building it tonight. Three EC2 instances and a regret.,2026-04-28 00:32:27.685097+00,2026-04-28 00:32:27.685097+00,,0,tr +648,1229,"Wrote Terraform on the balcony, sea in the distance. Antalya in May is a productivity hack you can't argue with.",2026-04-15 08:21:42.547662+00,2026-04-15 08:21:42.547662+00,,0,tr +649,1230,Cross-validation has been silently saving me on the last three Kaggle competitions. The leaderboard public score is a trap. The CV score is the truth.,2026-04-28 03:15:25.749571+00,2026-04-28 03:15:25.749571+00,,0,tr +650,1230,"My mentor: 'theoretical ML is necessary but not sufficient. Spend half your time on the engineering or you won't be hired.' Painful, true.",2026-04-10 00:52:46.068832+00,2026-04-10 00:52:46.068832+00,,0,tr +651,1230,Bornova evening walks with my classmates. We talk about everything except ML. Saves the brain for Saturday morning Kaggle.,2026-05-06 08:49:59.321481+00,2026-05-06 08:49:59.321481+00,,0,tr +652,1231,Shipped a Flutter habit tracker tonight. Three of my friends installed it. It already crashes on Android 14. Fixing tomorrow.,2026-04-24 22:22:14.432155+00,2026-04-24 22:22:14.432155+00,,0,tr +653,1231,"Tried Riverpod after Bloc for a small app. Riverpod won. Less boilerplate, easier mental model. Going to migrate everything.",2026-04-30 06:31:34.988041+00,2026-04-30 06:31:34.988041+00,,0,tr +654,1231,My mentor sent me a list of 20 mobile-first startups in Turkey. Said: 'now write the README of the company you'd join.' Different exercise than I expected. Helpful.,2026-04-27 07:33:40.307869+00,2026-04-27 07:33:40.307869+00,,0,tr +655,1231,"Tekirdağ in May: sunsets over the sea, neighbours barbecuing, no traffic. The hometown I tried to escape three years ago is the one I keep coming back to for the work.",2026-04-30 22:01:08.958644+00,2026-04-30 22:01:08.958644+00,,0,tr +656,1231,Did 100 commits on my Flutter app this month. Quality varies. Quantity is the gateway to quality. The hundredth commit is better than the first hundred put together.,2026-05-07 15:41:17.043368+00,2026-05-07 15:41:17.043368+00,,0,tr +657,1231,"User feedback summary from week one: 'the colors hurt my eyes,' 'where is the dark mode,' 'this is fast.' Two complaints, one compliment. The speed compliment is the gift.",2026-04-18 22:44:42.512787+00,2026-04-18 22:44:42.512787+00,,0,tr +658,1231,'Don't release on Friday' — first non-technical rule my mentor pushed on me. I deployed Thursday night this week. Saved my weekend. Lesson sticks.,2026-04-29 23:26:13.915032+00,2026-04-29 23:26:13.915032+00,,0,tr +659,1231,Made my mom install my app today. She found a bug in 90 seconds. Family QA is brutal and accurate. Updating the input validation tonight.,2026-04-30 11:28:48.133421+00,2026-04-30 11:28:48.133421+00,,0,tr +660,1232,Wrote a simple lending pool contract. Twelve lines of code; two days of thinking. Realized the math is the easy part. The trust model is the work.,2026-05-01 16:40:54.444198+00,2026-05-01 16:40:54.444198+00,,0,tr +661,1232,My mentor walked me through one of his old contract findings. We spent an hour on three lines. Slow read is the skill.,2026-05-01 10:18:41.170752+00,2026-05-01 10:18:41.170752+00,,0,tr +662,1232,Karşıyaka ferry to Konak today. Read EIPs the whole crossing. The Aegean is a study room with a view.,2026-04-17 16:48:22.574116+00,2026-04-17 16:48:22.574116+00,,0,tr +663,1233,My mentor reframed my mech-eng experience as 'systems thinking.' Same facts. Different sentence. Suddenly the cover letter wrote itself.,2026-04-27 17:29:45.778926+00,2026-04-27 17:29:45.778926+00,,0,tr +664,1233,Built a small Excel model for a friend's restaurant cost analysis tonight. The friend now thinks I'm a wizard. Real projects > Kaggle.,2026-04-24 23:23:52.137785+00,2026-04-24 23:23:52.137785+00,,0,tr +665,1234,Cloned the IMDB homepage today. The challenge wasn't the UI; it was the data shape. Real apps spend 70% of their effort on data and I'd never have learned that on tutorials.,2026-05-09 09:17:27.418627+00,2026-05-09 09:17:27.418627+00,,0,tr +666,1234,"My mentor's first feedback: 'stop saying ""I made this app"" and start saying ""I made this decision."" The recruiter doesn't care about the app.' Cover letter rewrite tonight.",2026-04-24 02:52:39.1035+00,2026-04-24 02:52:39.1035+00,,0,tr +667,1235,"Implemented Value-at-Risk three different ways tonight. Historical, parametric, Monte Carlo. All three gave different answers. The textbook didn't mention that.",2026-04-20 06:50:30.593619+00,2026-04-20 06:50:30.593619+00,,0,tr +668,1235,"My mentor told me: 'a model that disagrees with another model is useful. A model you can't explain isn't.' Going to rewrite the assumptions section of mine.""",2026-05-03 18:49:12.428906+00,2026-05-03 18:49:12.428906+00,,0,tr +669,1235,"Yenimahalle apartment, fourth floor, the only window with sun in the afternoon. Where my model converges and where I'll always remember writing it.",2026-04-27 03:53:14.239604+00,2026-04-27 03:53:14.239604+00,,0,tr +670,1236,Day five of Swift. Closures still feel like magic. Going to re-read the chapter four times instead of moving on. Closures are the gateway.,2026-04-20 21:21:49.407644+00,2026-04-20 21:21:49.407644+00,,0,tr +671,1236,"My mentor showed me how to read Apple's docs efficiently. We skimmed twice, then went deep on one paragraph. I'd been doing it wrong for a year.",2026-05-04 21:28:55.328206+00,2026-05-04 21:28:55.328206+00,,0,tr +672,1237,Hit a streak of 20 problems solved this week. Felt great until I tried to explain my solution to a friend. Couldn't. Writing about solutions is harder than solving.,2026-05-04 13:54:49.584405+00,2026-05-04 13:54:49.584405+00,,0,tr +673,1237,Today's bug: I had off-by-one in a binary search problem. Spent an hour finding it. Realized I had memorized the template wrong. Templates without understanding are landmines.,2026-04-16 08:54:51.907566+00,2026-04-16 08:54:51.907566+00,,0,tr +674,1237,"My mentor: 'competitive programming makes you fast and confident. It doesn't make you a software engineer. Work on systems too.' Reluctantly building a small distributed cache.""",2026-04-07 18:18:07.177518+00,2026-04-07 18:18:07.177518+00,,0,tr +675,1237,Re-implemented Dijkstra from scratch tonight without looking at notes. Took 25 minutes. Six months ago this was an hour. Slow compounding gets you there.,2026-04-20 07:56:47.789317+00,2026-04-20 07:56:47.789317+00,,0,tr +676,1237,Ankara spring evenings on the METU campus. Studied outside on the grass. The squirrels are bigger than I remember. Maybe I'm the one who got smaller.,2026-04-30 11:56:26.262691+00,2026-04-30 11:56:26.262691+00,,0,tr +677,1237,"Solved a hard graph problem today that I would have given up on last year. The skill is endurance, not cleverness. Sit with it longer.",2026-05-02 14:48:34.131742+00,2026-05-02 14:48:34.131742+00,,0,tr +678,1237,"Did my first mock interview today. Two algorithm questions, one design. The design question caught me off-guard. Now I know my gap.",2026-04-29 22:46:45.481251+00,2026-04-29 22:46:45.481251+00,,0,tr +679,1238,Wrote my first widget today. Counter app. Compiled. Felt like solving an entirely new kind of puzzle. Mobile is going to be the field for me.,2026-05-05 06:47:40.709637+00,2026-05-05 06:47:40.709637+00,,0,tr +680,1239,"My mentor sent me Uniswap V2's whitepaper and said: 'read it three times this week, then we'll talk.' I'm on read two. Already see things I missed.",2026-04-11 14:47:48.035329+00,2026-04-11 14:47:48.035329+00,,0,tr +681,1240,Walked into a small kebab place in Denizli with a notebook. The owner gave me an hour. Heard three problems I hadn't considered. The best market research isn't online.,2026-04-17 10:50:26.090411+00,2026-04-17 10:50:26.090411+00,,0,tr +682,1240,My mentor: 'small city is your advantage. The Istanbul founder has to fight for these conversations.' Reframing my hometown as a moat.,2026-05-03 07:17:45.282097+00,2026-05-03 07:17:45.282097+00,,0,tr +683,1240,"Pamukkale travertines in the distance, my apartment desk in the foreground. Cleaner air than Istanbul. Better thinking. I keep telling myself this is enough.""",2026-05-04 05:19:08.517468+00,2026-05-04 05:19:08.517468+00,,0,tr +684,1241,"My mentor's first question was 'when did you last sleep eight hours?' I said I couldn't remember. We spent the session on sleep, not on study tactics. I expected the opposite. I'm grateful.",2026-04-26 16:42:54.47025+00,2026-04-26 16:42:54.47025+00,,0,tr +685,1242,"Cleaned a 50k-row dataset today. Three duplicate-detection bugs, two type-coercion surprises, one missing-value philosophy decision. Cleaning is the work; modeling is the dessert.",2026-04-21 20:53:42.885479+00,2026-04-21 20:53:42.885479+00,,0,tr +686,1242,"My mentor said: 'your data scientist value is in the questions you ask, not the models you fit.' Spent the session writing better questions about my project.",2026-05-06 05:29:00.708227+00,2026-05-06 05:29:00.708227+00,,0,tr +687,1242,Şişli apartment with my roommate. He's an engineer; I'm a wannabe data scientist. We argue about which is harder. Nobody wins. We cook together and call it even.,2026-04-26 07:21:51.739929+00,2026-04-26 07:21:51.739929+00,,0,tr +688,1243,My mentor's exercise: 'role-play a meeting where you have to push back on a senior engineer's estimate.' I froze. We did it three times. The third was passable. Practice is the only way.,2026-05-05 04:24:21.051424+00,2026-05-05 04:24:21.051424+00,,0,tr +689,1243,Wrote a one-page memo for a fake product launch tonight. Cut it from three pages. Compression is taste. The one-pager is what executives actually read.,2026-04-21 18:56:05.678453+00,2026-04-21 18:56:05.678453+00,,0,tr +690,1243,"Nilüfer has the best autumn in Turkey but May does its best too. Studied at the university garden. Hot tea, soft sun, a notebook full of half-questions.",2026-04-29 10:19:46.387482+00,2026-04-29 10:19:46.387482+00,,0,tr +691,1243,"Read a great product spec from a Series B in California today. Two things stood out: the explicit non-goals section, and the metric they committed to NOT moving. Both unusual. Both useful.",2026-04-30 23:16:01.809345+00,2026-04-30 23:16:01.809345+00,,0,tr +692,1244,Did 8 user interviews this week. The pattern was: people apologize for their workflow before they describe it. The apology is the insight.,2026-05-04 04:38:31.926584+00,2026-05-04 04:38:31.926584+00,,0,tr +693,1245,"Did a content audit for a friend's small business today. The findings: ten blog posts about everything, zero about their actual customer's job. Will rewrite the brief.",2026-04-18 00:04:42.210891+00,2026-04-18 00:04:42.210891+00,,0,tr +694,1245,My mentor told me: 'a great writer who can read GA4 is rarer than a great analyst who tries to write.' Spending two hours a day in GA4 this month.,2026-04-29 00:25:23.315801+00,2026-04-29 00:25:23.315801+00,,0,tr +695,1245,"Wrote a 300-word piece on a complex topic today. Editor cut it to 200. The 200 was better. Saving cuts > adding details, always.",2026-05-02 05:16:41.709375+00,2026-05-02 05:16:41.709375+00,,0,tr +696,1245,"Bakırköy morning walk before work. The marina, the gulls, the people who jog only on weekends. Writing is easier after a walk.",2026-05-01 03:56:41.680549+00,2026-05-01 03:56:41.680549+00,,0,tr +697,1245,SEO update: keyword volume has been replaced by intent quality in every senior conversation I've had this year. Algorithms reward depth now. Old playbook is dead.,2026-04-27 16:33:56.340194+00,2026-04-27 16:33:56.340194+00,,0,tr +698,1246,"Melis pushed me on a system-design exercise today. Drew my diagram, then asked 'what happens at 10x traffic?' I'd designed for the current load. The 10x answer takes me back to a different cache strategy entirely.",2026-04-20 06:13:22.088389+00,2026-04-20 06:13:22.088389+00,,0,tr +699,1246,Built a small message queue from scratch in Node tonight. Used Redis as the broker. Realized: queues are easy when you don't care about delivery guarantees. They're hard when you do.,2026-04-17 16:33:08.812474+00,2026-04-17 16:33:08.812474+00,,0,tr +700,1247,Wrote my first dbt model tonight. The mental model shift from 'transformation as a script' to 'transformation as a graph' is the lesson. Going to use this everywhere.,2026-05-04 22:47:10.783115+00,2026-05-04 22:47:10.783115+00,,0,tr +701,1247,"My mentor: 'a data engineer who writes great SQL is rare. Most write enough SQL.' Spent the session on a 60-line query I'd written, rewriting it for clarity.",2026-04-15 15:08:15.811916+00,2026-04-15 15:08:15.811916+00,,0,tr +702,1247,Mamak afternoon. Wrote queries on the balcony. My grandmother brought me tea three times. Best dev setup in the country.,2026-04-11 02:44:57.802593+00,2026-04-11 02:44:57.802593+00,,0,tr +703,1248,Mapped my first hiking trail with GPS today. The data has 8 GB of noise. Now I know why production GPS apps are hard. Filter design is the next two weekends.,2026-04-22 16:55:46.197092+00,2026-04-22 16:55:46.197092+00,,0,tr +704,1248,Aras (my mentor) told me to write a one-paragraph 'why this app exists' before any feature design. I rewrote it five times. Each version cut something. Final version made the next four feature decisions obvious.,2026-04-20 06:43:01.015312+00,2026-04-20 06:43:01.015312+00,,0,tr +705,1248,Optimized my map rendering today. The trick wasn't smaller images — it was caching at the right layer. Frame rate doubled. The architecture is the optimization.,2026-04-08 05:50:30.678935+00,2026-04-08 05:50:30.678935+00,,0,tr +706,1248,"Forest morning, code afternoon. Sarıyer has its perks. The cousin who works in Şişli thinks I'm wasting my degree. He may be right. He may not be.",2026-04-29 18:40:48.211704+00,2026-04-29 18:40:48.211704+00,,0,tr +707,1249,Audited a local restaurant's site today. Found 14 quick wins worth 30% more organic traffic if applied. Sent a one-page summary. Owner asked if I'd do it for cash. Said yes.,2026-05-03 12:45:59.420356+00,2026-05-03 12:45:59.420356+00,,0,tr +708,1249,"My mentor: 'SEO is just empathy at scale. Understand what the searcher is trying to do, give them the answer faster than the competition.' Going to print this.",2026-04-20 16:11:23.424316+00,2026-04-20 16:11:23.424316+00,,0,tr +709,1249,"Ümraniye is loud during the week, quiet on Sundays. Sunday is my reading day. The neighbourhood I grew up resenting is the one teaching me focus.",2026-04-25 22:14:46.795842+00,2026-04-25 22:14:46.795842+00,,0,tr +710,1250,"Designed a level on paper today before opening Unity. Two hours of sketching, twenty minutes of grayboxing. The paper saved me five days of iteration.",2026-04-18 13:08:12.160441+00,2026-04-18 13:08:12.160441+00,,0,tr +711,1250,My mentor in design told me: 'pretty levels lose to readable levels every time.' Going to redo my prototype with readability as the only metric.,2026-03-16 15:25:41.551509+00,2026-03-16 15:25:41.551509+00,,0,tr +712,1250,Bakırköy weekend market. The fishmonger arranged his stock by color. I noticed. The level designer brain doesn't turn off.,2026-04-09 10:37:13.18687+00,2026-04-09 10:37:13.18687+00,,0,tr +713,1251,"My mentor made me give a 3-minute talk on my own project. I rehearsed for an hour, gave it in 90 seconds, and forgot the middle. Recording showed what I missed. Doing it again tomorrow.",2026-04-28 21:37:03.967176+00,2026-04-28 21:37:03.967176+00,,0,tr +714,1251,Joined a Toastmasters group online. First meeting tonight. Was terrified. Spoke for 60 seconds about my favourite book. Got two compliments and one useful note. Survival.,2026-05-01 16:49:16.517236+00,2026-05-01 16:49:16.517236+00,,0,tr +715,1251,Reading 'Talk Like Ted' this week. Cliche book; useful book. The advice is to find your story before your slides. Working backward from a story I already have.,2026-04-18 23:02:18.557934+00,2026-04-18 23:02:18.557934+00,,0,tr +716,1251,Şişli evenings with my study group. Tonight we practiced presenting to each other. Two of them were as nervous as I was. Solidarity is the first step.,2026-05-05 08:34:17.172308+00,2026-05-05 08:34:17.172308+00,,0,tr +717,1251,Did my third presentation rep this week. Lighter on filler words; still talking too fast. Pace is the next thing. The metrics improve faster than the feeling does. Trusting the process.,2026-04-29 12:07:27.30666+00,2026-04-29 12:07:27.30666+00,,0,tr +718,1252,Shipped my second TestFlight beta tonight. 50 testers. The crash rate is way higher than I want. Going to learn proper error reporting this weekend.,2026-05-07 09:49:20.019048+00,2026-05-07 09:49:20.019048+00,,0,tr +719,1252,"Switched to SwiftData from CoreData on a small project. Less ceremony, fewer files. CoreData has its place but the bar to entry just got lower.",2026-05-06 21:32:03.062431+00,2026-05-06 21:32:03.062431+00,,0,tr +720,1252,My mentor told me: 'ship is the only thing that compounds. Half the senior engineers in this town don't ship anymore. Don't lose that.' Saving.,2026-05-03 01:31:19.392738+00,2026-05-03 01:31:19.392738+00,,0,tr +721,1252,Added a widget to my app today. Took longer than expected; the architecture is its own thing. Now I understand why every major iOS app shipped widgets late.,2026-04-24 13:41:18.342603+00,2026-04-24 13:41:18.342603+00,,0,tr +722,1252,Pendik morning ferry to Kadıköy with my laptop. Writing Swift between the seagulls. The commute is my best two-hour focus block of the day.,2026-05-08 05:34:33.975397+00,2026-05-08 05:34:33.975397+00,,0,tr +723,1252,Spent two hours on a layout bug. The issue was a wrong .padding modifier order. SwiftUI is a foreign language with very particular grammar. Embrace the strangeness.,2026-04-16 12:03:47.323473+00,2026-04-16 12:03:47.323473+00,,0,tr +724,1252,Today's session reviewed my widget code. My mentor circled the same naming inconsistency in four places without naming it. Spent an hour finding the pattern. Best teaching method I've experienced.,2026-05-06 20:19:16.34826+00,2026-05-06 20:19:16.34826+00,,0,tr +725,1252,Mom asked me to set up her new iPad today. I made it tap-tap-tap for the apps she uses every day. She thanked me three times. Real-world UX education.,2026-05-05 04:39:23.441444+00,2026-05-05 04:39:23.441444+00,,0,tr +726,1252,"Built my own Combine publisher tonight just to understand how the framework actually works. Took three hours. Now I read the source differently. Building a toy version is the deepest read.""",2026-05-05 10:40:30.79644+00,2026-05-05 10:40:30.79644+00,,0,tr +727,1253,Earned AWS Cloud Practitioner today. Studied between the rebuilds. The cert is small; the proof that I could keep going through this year is the real thing.,2026-04-25 20:12:20.16617+00,2026-04-25 20:12:20.16617+00,,0,tr +728,1253,"My mentor told me: 'remote work is going to find you. The market for self-directed learners is bigger than you think.' First conversation that made me feel less alone.""",2026-05-08 20:41:35.472118+00,2026-05-08 20:41:35.472118+00,,0,tr +729,1253,Spun up my first ECS service today. The IAM policies are 80% of the work. Now I understand why everyone in the industry talks about IAM more than the compute service.,2026-05-07 21:36:48.961046+00,2026-05-07 21:36:48.961046+00,,0,tr +730,1253,Hatay sunset from the new dorm. Half the city is still under construction; the other half is open for business. The contrast is hard to describe to someone who hasn't seen it.,2026-04-30 16:31:54.739021+00,2026-04-30 16:31:54.739021+00,,0,tr +731,1253,Wrote my first Terraform module today. The 'plan' command is comforting — it tells you exactly what's about to break. I want all engineering tools to behave this way.,2026-04-27 11:51:56.487782+00,2026-04-27 11:51:56.487782+00,,0,tr +732,1253,Mentor asked me: 'what would you tell your past self about this year?' I wrote three pages. We'll edit it down next session. The exercise was the lesson.,2026-05-03 16:03:19.560736+00,2026-05-03 16:03:19.560736+00,,0,tr +733,1254,Built a small ETL pipeline using Gaziantep's open data on street markets. Found a duplicate-merchant problem nobody at city hall had noticed. Sent them a report. They wrote back. Real work matters.,2026-04-09 22:12:18.658965+00,2026-04-09 22:12:18.658965+00,,0,tr +734,1255,"Spent five hours mixing a chorus that lacked a melody. The mix can't fix what the song doesn't say. Producers who can't write are mixing forever; writers who can't mix are stuck demoing. Learn both, in that order.",2026-05-02 08:32:02.555798+00,2026-05-02 08:32:02.555798+00,,0,tr +735,1255,"Listened to Pinhani's new EP on headphones in the morning, on monitors in the evening, and on car speakers at 11pm. Three different records. Mix engineers know this; everyone else should learn it.",2026-05-04 11:53:15.784217+00,2026-05-04 11:53:15.784217+00,,0,tr +736,1255,"Made plov for friends after a session tonight. Six people, three musicians, two arguments, one new collaboration on the dishwashing rota. Studio days are intense; the dinners after are why we keep doing this.",2026-05-04 16:55:41.429607+00,2026-05-04 16:55:41.429607+00,,0,tr +737,1255,"Junior producers: stop buying plugins. The free stock plugins in Logic and Ableton are good enough for a finished record. The bottleneck is your ears, not your collection. Spend the money on a one-on-one mix critique instead.",2026-05-04 12:14:05.69552+00,2026-05-04 12:14:05.69552+00,,0,tr +738,1256,"Beginner illustrators ask ""what brushes do you use."" Senior illustrators ask ""what is the character thinking in this frame."" The first question is a trap. Brushes are unimportant; intent is everything.",2026-05-03 05:28:55.186065+00,2026-05-03 05:28:55.186065+00,,0,tr +739,1256,"Started a 100-day inktober variant — one drawing a day, one minute maximum. Day 14 today. The quality is awful, the discipline is excellent. The constraint freed me from polish.",2026-04-21 13:14:44.934436+00,2026-04-21 13:14:44.934436+00,,0,tr +740,1256,"Book cover brief sent to me yesterday: 'literary fiction, themes of memory and loss, no people on cover.' Constraint as gift. The 'no people' rule eliminated forty bad options before I drew a line.",2026-04-24 16:03:15.224471+00,2026-04-24 16:03:15.224471+00,,0,tr +741,1256,Tatlı sat on my drawing tablet for an hour today. Productivity = 0. Patience for old cat = infinite. Some afternoons are for the cat.,2026-04-19 13:48:54.906409+00,2026-04-19 13:48:54.906409+00,,0,tr +742,1256,Beginners over-render eyes. Senior illustrators under-render eyes. A simple dot says more than a polished iris because the viewer fills in the meaning. Trust the viewer.,2026-04-30 11:03:50.836837+00,2026-04-30 11:03:50.836837+00,,0,tr +743,1257,The first lesson in photojournalism is that captions are the work. The photo without a caption is decorative; the caption without the photo can stand on its own. Write the captions before the trip if you can.,2026-04-30 09:07:09.232043+00,2026-04-30 09:07:09.232043+00,,0,tr +744,1257,"Walked the old Konya bazaar this morning. Took eight frames. Kept two. The ratio is fine. Most photographers' problem is they keep too many, not that they shoot too few.",2026-05-02 10:54:01.365397+00,2026-05-02 10:54:01.365397+00,,0,tr +745,1257,"Documentary ethics — basic rule: never stage what you photograph as candid. The second you ask someone to do something again, you've left documentary and entered editorial. Both have a place; never call one the other.",2026-05-07 09:41:46.617439+00,2026-05-07 09:41:46.617439+00,,0,tr +746,1257,"Konya in May has light I never had in Istanbul. Different colour, longer hours, the kind of sun that doesn't ruin a photograph at noon. Slowness as an artistic decision pays off.""",2026-05-07 01:24:35.950223+00,2026-05-07 01:24:35.950223+00,,0,tr +747,1258,"Cinematography is choices, not gear. The camera body matters in the last 10% — the first 90% is blocking, light direction, and lens choice. Beginners reverse this and wonder why their footage looks like everyone else's.",2026-04-30 23:38:08.232281+00,2026-04-30 23:38:08.232281+00,,0,tr +748,1258,"Re-watched Tarkovsky's Mirror this weekend. Three hours, six tracking shots that broke me again. Beginners should watch slow films before fast ones. The grammar lives in the long takes.""",2026-05-03 13:22:12.096088+00,2026-05-03 13:22:12.096088+00,,0,tr +749,1258,Sound is half of cinema. A perfect picture with bad sound is a bad film; a good story with perfect sound and average picture works fine. Allocate budget accordingly. Most student films overspend on cameras and underspend on the boom op.,2026-04-08 15:23:16.771332+00,2026-04-08 15:23:16.771332+00,,0,tr +750,1258,"Beyoğlu rakı evening with two old colleagues from my AA days. Talked about everything except film. Came home and storyboarded for two hours. The break is the work.""",2026-05-06 01:58:20.684456+00,2026-05-06 01:58:20.684456+00,,0,tr +751,1258,"Re-read McKee's Story for the third time. Cliché, still useful. The framework is rigid; the application has to be loose. Most beginners memorize the structure and forget the freedom inside it.",2026-05-05 12:28:13.186548+00,2026-05-05 12:28:13.186548+00,,0,tr +752,1258,To students wanting to make their first short: pick a story you can shoot in two locations with three actors. Eighteen-minute first short is a fantasy. Eight minutes is achievable. Eight done > eighteen abandoned.,2026-03-22 13:20:11.453842+00,2026-03-22 13:20:11.453842+00,,0,tr +753,1259,"Worked on the Beethoven Op. 110 third movement for two hours today. The trill is still uneven. Practice doesn't make perfect — it makes the unevenness visible, which is the point.",2026-05-04 12:00:08.40739+00,2026-05-04 12:00:08.40739+00,,0,tr +754,1259,"My new mentor (Selen) asked me: 'why do you play piano? not why you study it. why do you play.' I said something about love. She made me write three pages on it. Different question, different answer.""",2026-04-29 12:23:26.430373+00,2026-04-29 12:23:26.430373+00,,0,tr +755,1259,"Cihangir morning walk to school. Same route, eight years, four shoe pairs. The repetition is the music. Going to use this in my recital program notes somehow.""",2026-04-12 12:48:16.440914+00,2026-04-12 12:48:16.440914+00,,0,tr +756,1260,"My mentor cut my treatment from 18 pages to 8 today. I cried a little. The 8 is better. The cry was about the work I won't make, not the work I will.""",2026-04-27 09:18:29.295623+00,2026-04-27 09:18:29.295623+00,,0,tr +757,1260,"Watched Ceylan's Winter Sleep again for the third time. Three-hour films don't drag if the silences are earned. Mine drag because the silences are scared. Working on it.""",2026-03-26 14:42:42.40063+00,2026-03-26 14:42:42.40063+00,,0,tr +758,1260,Edited a one-minute teaser for the short today. Spent four hours on three frames. Cinema time is real time × 240. Sleep tonight is non-negotiable.,2026-04-22 07:21:54.708161+00,2026-04-22 07:21:54.708161+00,,0,tr +759,1260,"Bursa film club Friday: ten of us, one projector, no popcorn. We watched a Turkish documentary I'd never heard of. Best two hours of the week. The club is why I haven't moved to Istanbul yet.""",2026-04-25 15:05:27.698471+00,2026-04-25 15:05:27.698471+00,,0,tr +760,1261,Did the one-minute drawing challenge for the seventh day. Day seven looks worse than day one. Going to keep doing it. The improvement isn't linear and that's the point.,2026-04-20 07:55:07.35857+00,2026-04-20 07:55:07.35857+00,,0,tr +761,1261,"My mentor asked me 'what story does this image tell on its own.' I said I didn't know. He said good — start there. That's the homework for the week.""",2026-05-04 09:57:27.045508+00,2026-05-04 09:57:27.045508+00,,0,tr +762,1261,"Spent a Saturday in Eskişehir's old town with a sketchbook. Three hours, twelve frames. The town is paying for itself in studies.""",2026-04-06 19:47:28.395904+00,2026-04-06 19:47:28.395904+00,,0,tr +763,1261,"Concept art lesson I learned the hard way: the 'cool design' is the wrong goal. The right goal is 'design that tells you about the world.' My mentor circled the same anti-pattern in three pieces today.""",2026-05-08 10:43:50.407471+00,2026-05-08 10:43:50.407471+00,,0,tr +764,1261,"Shared apartment with two other illustrators. We critique each other's work over breakfast. It's brutal and kind in roughly equal measure. The kind is what keeps us at it.""",2026-05-02 15:22:17.923737+00,2026-05-02 15:22:17.923737+00,,0,tr +765,1262,"Read Lucia Berlin's 'A Manual for Cleaning Women' again this week. The trick is that her sentences look easy. They aren't. The easy sentence is the senior craft.""",2026-05-01 21:04:21.120893+00,2026-05-01 21:04:21.120893+00,,0,tr +766,1262,"Mentor reading my story this week made one comment: 'cut the third paragraph; it explains what the dialogue already showed.' Forty-eight words gone. Story is sharper. Cutting > rewriting.""",2026-04-28 14:40:55.828616+00,2026-04-28 14:40:55.828616+00,,0,tr +767,1262,"Adana morning, 6am desk, çay and notebook. Wrote 600 words I'll probably delete. The deleted words are still the work. Mornings are sacred.""",2026-05-09 10:18:29.285861+00,2026-05-09 10:18:29.285861+00,,0,tr +768,1263,"Spent four mornings with the same fisherman at the Antalya harbour. Today he finally let me photograph him without performing. Trust > technique. The first ten frames were stiff; the eleventh was him.""",2026-05-06 16:41:42.314542+00,2026-05-06 16:41:42.314542+00,,0,tr +769,1263,"Aslı's homework this week: 'write the captions for ten photos you haven't taken yet.' I thought she was joking. She wasn't. Trying.""",2026-04-27 18:10:45.533346+00,2026-04-27 18:10:45.533346+00,,0,tr +770,1263,"Antalya light at 6am vs noon vs 6pm. Three completely different cities. Documentary photographers know which hour their story lives in; tourists don't. I'm finally graduating from tourist.""",2026-04-03 19:03:26.853118+00,2026-04-03 19:03:26.853118+00,,0,tr +771,1263,"Antalya seasonal workers leaving the harvest field at dusk. Twenty minutes of conversation, two frames. Most days are like this. Time is the budget.""",2026-05-05 11:13:22.238738+00,2026-05-05 11:13:22.238738+00,,0,tr +772,1264,"Made my fifth attempt at a perfect canelé tonight. Three failed, one was edible, the fifth had the right interior. The exterior still needs work. Pastry is the discipline of repetition without contempt.""",2026-04-19 20:55:38.004276+00,2026-04-19 20:55:38.004276+00,,0,tr +773,1264,"Beyoğlu bistro after a 14-hour shift. Walked home along İstiklal at midnight, exhausted, content. Tired-from-good-work is a different tired.""",2026-04-27 12:13:22.890811+00,2026-04-27 12:13:22.890811+00,,0,tr +774,1265,"Rehearsed a 40-second monologue twenty-three times today before it stopped being mine and started being the character's. The number is exact. Acting is the long road to disappearance.""",2026-04-27 12:28:14.584441+00,2026-04-27 12:28:14.584441+00,,0,tr +775,1265,"Improvisation class last night: ""yes, and"" is harder than it sounds. The 'yes' is fine. The 'and' is where my actor brain quits and my student brain takes over. Working on it.""",2026-05-01 17:41:20.678906+00,2026-05-01 17:41:20.678906+00,,0,tr +776,1265,"Karşıyaka vapur evening, sunset across the bay, rehearsing under my breath. The deckhand thinks I'm losing my mind. I'm not — I'm finding it.""",2026-04-10 11:44:54.817061+00,2026-04-10 11:44:54.817061+00,,0,tr +777,1266,"Recorded the pilot episode this week. Sixteen takes for the cold open. I was overthinking it. Selen listened to take three and said it was already there. The other thirteen taught me what 'already there' sounds like.""",2026-04-24 07:53:56.911114+00,2026-04-24 07:53:56.911114+00,,0,tr +778,1266,"Selen sent me a note after our session: 'the silence between sentences is the show, not the sentences.' Re-edited episode one with 200ms more space between phrases. Different show.""",2026-05-04 08:00:28.554288+00,2026-05-04 08:00:28.554288+00,,0,tr +779,1267,"Read three interpretability papers tonight. Pattern: every paper claims a new method, very few claim a falsifiable prediction. The field's incentives are wrong, and the small number who write defensively are the ones to follow.",2026-04-25 10:49:05.975027+00,2026-04-25 10:49:05.975027+00,,0,tr +780,1267,Two short mentorships in 18 months taught me what I want this time: someone who'll commit for six months and tell me when I'm wrong. Applying to one mentor this week and trying not to over-think it.,2026-04-27 19:29:14.805559+00,2026-04-27 19:29:14.805559+00,,0,tr +781,1267,"Çankaya morning with my two roommates — one writing a thesis, one debugging her first ML pipeline, me reading. Three different problems, same kitchen table. Best study room in Ankara.",2026-05-03 12:53:44.350278+00,2026-05-03 12:53:44.350278+00,,0,tr +782,1267,Wrote a small toy implementation of integrated gradients today. The math finally clicks when you build it from scratch instead of importing it. Recommend the exercise to anyone reading interpretability papers.,2026-04-27 13:51:31.932592+00,2026-04-27 13:51:31.932592+00,,0,tr +783,1267,Sunday İskambil with friends. We talked about everything except theses for three hours. Mondays are easier when Sundays are this kind of full.,2026-05-02 19:50:50.858086+00,2026-05-02 19:50:50.858086+00,,0,tr +784,1268,"Two kinds of interpretability papers: the kind that try to make models more debuggable, and the kind that try to make ML legible to non-technical stakeholders. They share methods but very different audiences. Pick which one you're writing for before you write.",2026-04-19 19:37:53.666079+00,2026-04-19 19:37:53.666079+00,,0,tr +785,1268,"Re-read 'On Bullshit' by Frankfurt this weekend. Short, dense, useful. Helped me distinguish careless from careful claims in our literature. The careless ones aren't dishonest — they just don't care if they're right.",2026-05-01 18:20:56.976286+00,2026-05-01 18:20:56.976286+00,,0,tr +786,1268,For people considering industry research vs. PhD: it's not 'industry vs academia.' It's 'which constraints help your taste develop.' My lab gives me compute + product pressure. A PhD gives you advisor + time. Neither is better. Pick the constraints that will shape you the way you want to be shaped.,2026-04-29 16:15:14.264009+00,2026-04-29 16:15:14.264009+00,,0,tr +787,1268,Sarıyer Belgrad Forest run this morning. The forest is the antidote to the open-plan office. Even one hour resets the slow-thinking muscle.,2026-04-06 19:09:57.581449+00,2026-04-06 19:09:57.581449+00,,0,tr +788,1268,The hardest thing to teach a junior researcher is when to stop. Most new researchers either stop too early (declare victory) or never stop (chase one more experiment). Senior craft is knowing the difference and writing as soon as you have the difference.,2026-05-10 04:38:22.225935+00,2026-05-10 04:38:22.225935+00,,0,tr +789,1269,"Reviewing applications for the autumn cycle this week. The single most common mistake: applicants describe what they did, not what question they care about. The committee can read your CV. Tell them what you'd commit five years to.",2026-05-01 04:29:44.077743+00,2026-05-01 04:29:44.077743+00,,0,tr +790,1269,EU AI Act implementation timelines are about to put real pressure on applied AI research. Worth tracking for any candidate writing about deployed ML. Policy + technical is rarer than either alone and increasingly hireable.,2026-05-04 16:11:09.912141+00,2026-05-04 16:11:09.912141+00,,0,tr +791,1269,PhD applicants from outside top-30 universities: your school is rarely the bottleneck. Your essays are. Top programs admit from anywhere if the writing is sharp and the recommender letters are specific. Spend on the writing.,2026-05-04 17:07:11.644942+00,2026-05-04 17:07:11.644942+00,,0,tr +792,1269,"Zürich morning fog and a coffee, sitting through PhD admissions calls until noon. Then ten minutes of paperwork, twenty more candidates. Slow days are the right days for these decisions.",2026-04-21 06:45:05.086026+00,2026-04-21 06:45:05.086026+00,,0,tr +793,1270,"AI safety isn't a vibe. It's a research field with internal disagreements as deep as any other. If you can't articulate two opposing technical positions inside the field, you're a follower, not a contributor. Spend a month on the disagreements before you pick a side.",2026-04-24 16:15:21.673654+00,2026-04-24 16:15:21.673654+00,,0,tr +794,1270,"Shipped our first public eval suite this week. Three months of work, fifty pages of methodology notes, one eight-line summary that's all anyone will read. The summary is the deliverable; the methodology is the proof.",2026-04-29 00:39:32.395065+00,2026-04-29 00:39:32.395065+00,,0,tr +795,1270,"Founder lesson, month 6: the safety researcher who refuses to learn fundraising is the same person who later complains they have no influence. Acquire the skill. You'll spend less time begging and more time deciding.",2026-04-28 08:10:07.403907+00,2026-04-28 08:10:07.403907+00,,0,tr +796,1270,"Beşiktaş apartment, 6am call to the West Coast, sun coming up over the Bosphorus, my cat unimpressed. The cofounder thing finally has a rhythm. Five months ago I thought I'd never sleep.",2026-04-30 18:36:09.238559+00,2026-04-30 18:36:09.238559+00,,0,tr +797,1270,For applicants asking 'should I do a PhD or join a frontier lab?': the question is wrong. Ask 'where will I have the best mentor for the next 4 years?' The answer determines the rest. Don't reverse-optimize prestige.,2026-05-01 18:50:16.773124+00,2026-05-01 18:50:16.773124+00,,0,tr +798,1271,"Junior Flutter shippers eventually hit the architecture wall: ""I want to add a fourth feature and my codebase is fighting me."" The wall is the lesson. Don't hire your way out of it — refactor through it once. You'll know what good architecture is forever.",2026-05-09 18:23:31.431813+00,2026-05-09 18:23:31.431813+00,,0,tr +799,1271,Flutter 3.27 dropped this week. Material 3 expressive theming is actually a big deal — it lets you do brand differentiation without fighting the framework. We're migrating two flagship screens; will write up the trade-offs.,2026-04-19 07:25:38.54341+00,2026-04-19 07:25:38.54341+00,,0,tr +800,1271,"'Test pyramid' debates miss the point. The right shape for a mobile app is whatever lets you ship to production at 4pm on a Friday with calm in your chest. For us that's heavy on unit, moderate on widget, light on integration — but it took two years and three incidents to find that mix.",2026-04-22 07:20:31.405632+00,2026-04-22 07:20:31.405632+00,,0,tr +801,1271,Started a new six-month engagement this month with a solo Flutter shipper from Tekirdağ. He has more pure-engineering muscle than I had at his stage. My job is to translate that into team-readiness without crushing the shipping instinct.,2026-04-29 08:06:43.22617+00,2026-04-29 08:06:43.22617+00,,0,tr +802,1271,Kadıköy weekend morning with my daughter and a cargo bike. She insists on Moda Çay Bahçesi every Saturday and I let her. Some routines are sacred.,2026-05-02 09:03:15.741391+00,2026-05-02 09:03:15.741391+00,,0,tr diff --git a/scripts/seed_snapshot_data/data/follows.csv b/scripts/seed_snapshot_data/data/follows.csv new file mode 100644 index 00000000..b457dbb7 --- /dev/null +++ b/scripts/seed_snapshot_data/data/follows.csv @@ -0,0 +1,378 @@ +follower_id,followee_id,created_at +1195,1202,2026-05-13 08:02:43.853604+00 +1195,1207,2026-05-13 08:02:43.853604+00 +1195,1216,2026-05-13 08:02:43.853604+00 +1195,1218,2026-05-13 08:02:43.853604+00 +1195,1219,2026-05-13 08:02:43.853604+00 +1195,1227,2026-05-13 08:02:43.853604+00 +1195,1233,2026-05-13 08:02:43.853604+00 +1195,1239,2026-05-13 08:02:43.853604+00 +1195,1250,2026-05-13 08:02:43.853604+00 +1196,1201,2026-05-13 08:02:43.853604+00 +1196,1207,2026-05-13 08:02:43.853604+00 +1196,1215,2026-05-13 08:02:43.853604+00 +1196,1223,2026-05-13 08:02:43.853604+00 +1196,1232,2026-05-13 08:02:43.853604+00 +1196,1233,2026-05-13 08:02:43.853604+00 +1196,1246,2026-05-13 08:02:43.853604+00 +1196,1253,2026-05-13 08:02:43.853604+00 +1196,1255,2026-05-13 08:02:43.853604+00 +1196,1263,2026-05-13 08:02:43.853604+00 +1196,1265,2026-05-13 08:02:43.853604+00 +1197,1222,2026-05-13 08:02:43.853604+00 +1197,1242,2026-05-13 08:02:43.853604+00 +1197,1266,2026-05-13 08:02:43.853604+00 +1198,1208,2026-05-13 08:02:43.853604+00 +1198,1210,2026-05-13 08:02:43.853604+00 +1198,1221,2026-05-13 08:02:43.853604+00 +1198,1223,2026-05-13 08:02:43.853604+00 +1198,1224,2026-05-13 08:02:43.853604+00 +1198,1231,2026-05-13 08:02:43.853604+00 +1198,1236,2026-05-13 08:02:43.853604+00 +1198,1238,2026-05-13 08:02:43.853604+00 +1198,1253,2026-05-13 08:02:43.853604+00 +1198,1254,2026-05-13 08:02:43.853604+00 +1198,1256,2026-05-13 08:02:43.853604+00 +1198,1266,2026-05-13 08:02:43.853604+00 +1198,1267,2026-05-13 08:02:43.853604+00 +1199,1200,2026-05-13 08:02:43.853604+00 +1199,1201,2026-05-13 08:02:43.853604+00 +1199,1207,2026-05-13 08:02:43.853604+00 +1199,1208,2026-05-13 08:02:43.853604+00 +1199,1212,2026-05-13 08:02:43.853604+00 +1199,1224,2026-05-13 08:02:43.853604+00 +1199,1236,2026-05-13 08:02:43.853604+00 +1199,1243,2026-05-13 08:02:43.853604+00 +1199,1245,2026-05-13 08:02:43.853604+00 +1199,1250,2026-05-13 08:02:43.853604+00 +1199,1252,2026-05-13 08:02:43.853604+00 +1199,1271,2026-05-13 08:02:43.853604+00 +1200,1197,2026-05-13 08:02:43.853604+00 +1200,1202,2026-05-13 08:02:43.853604+00 +1200,1203,2026-05-13 08:02:43.853604+00 +1200,1216,2026-05-13 08:02:43.853604+00 +1200,1223,2026-05-13 08:02:43.853604+00 +1200,1235,2026-05-13 08:02:43.853604+00 +1200,1252,2026-05-13 08:02:43.853604+00 +1200,1269,2026-05-13 08:02:43.853604+00 +1201,1203,2026-05-13 08:02:43.853604+00 +1201,1206,2026-05-13 08:02:43.853604+00 +1201,1218,2026-05-13 08:02:43.853604+00 +1201,1221,2026-05-13 08:02:43.853604+00 +1201,1234,2026-05-13 08:02:43.853604+00 +1201,1262,2026-05-13 08:02:43.853604+00 +1202,1203,2026-05-13 08:02:43.853604+00 +1202,1229,2026-05-13 08:02:43.853604+00 +1202,1235,2026-05-13 08:02:43.853604+00 +1202,1250,2026-05-13 08:02:43.853604+00 +1202,1261,2026-05-13 08:02:43.853604+00 +1203,1211,2026-05-13 08:02:43.853604+00 +1203,1216,2026-05-13 08:02:43.853604+00 +1203,1240,2026-05-13 08:02:43.853604+00 +1203,1246,2026-05-13 08:02:43.853604+00 +1204,1195,2026-05-13 08:02:43.853604+00 +1204,1201,2026-05-13 08:02:43.853604+00 +1204,1219,2026-05-13 08:02:43.853604+00 +1204,1222,2026-05-13 08:02:43.853604+00 +1204,1230,2026-05-13 08:02:43.853604+00 +1204,1234,2026-05-13 08:02:43.853604+00 +1204,1239,2026-05-13 08:02:43.853604+00 +1204,1247,2026-05-13 08:02:43.853604+00 +1204,1268,2026-05-13 08:02:43.853604+00 +1204,1270,2026-05-13 08:02:43.853604+00 +1205,1200,2026-05-13 08:02:43.853604+00 +1205,1208,2026-05-13 08:02:43.853604+00 +1205,1214,2026-05-13 08:02:43.853604+00 +1205,1221,2026-05-13 08:02:43.853604+00 +1205,1224,2026-05-13 08:02:43.853604+00 +1205,1230,2026-05-13 08:02:43.853604+00 +1205,1235,2026-05-13 08:02:43.853604+00 +1206,1199,2026-05-13 08:02:43.853604+00 +1206,1208,2026-05-13 08:02:43.853604+00 +1206,1225,2026-05-13 08:02:43.853604+00 +1206,1247,2026-05-13 08:02:43.853604+00 +1206,1251,2026-05-13 08:02:43.853604+00 +1206,1255,2026-05-13 08:02:43.853604+00 +1206,1268,2026-05-13 08:02:43.853604+00 +1207,1213,2026-05-13 08:02:43.853604+00 +1207,1237,2026-05-13 08:02:43.853604+00 +1207,1244,2026-05-13 08:02:43.853604+00 +1207,1245,2026-05-13 08:02:43.853604+00 +1208,1205,2026-05-13 08:02:43.853604+00 +1208,1221,2026-05-13 08:02:43.853604+00 +1208,1253,2026-05-13 08:02:43.853604+00 +1209,1224,2026-05-13 08:02:43.853604+00 +1209,1225,2026-05-13 08:02:43.853604+00 +1209,1226,2026-05-13 08:02:43.853604+00 +1209,1234,2026-05-13 08:02:43.853604+00 +1209,1236,2026-05-13 08:02:43.853604+00 +1209,1248,2026-05-13 08:02:43.853604+00 +1209,1261,2026-05-13 08:02:43.853604+00 +1209,1262,2026-05-13 08:02:43.853604+00 +1210,1204,2026-05-13 08:02:43.853604+00 +1210,1214,2026-05-13 08:02:43.853604+00 +1211,1206,2026-05-13 08:02:43.853604+00 +1211,1227,2026-05-13 08:02:43.853604+00 +1211,1251,2026-05-13 08:02:43.853604+00 +1212,1211,2026-05-13 08:02:43.853604+00 +1212,1222,2026-05-13 08:02:43.853604+00 +1212,1236,2026-05-13 08:02:43.853604+00 +1212,1238,2026-05-13 08:02:43.853604+00 +1212,1247,2026-05-13 08:02:43.853604+00 +1212,1264,2026-05-13 08:02:43.853604+00 +1213,1237,2026-05-13 08:02:43.853604+00 +1213,1269,2026-05-13 08:02:43.853604+00 +1214,1223,2026-05-13 08:02:43.853604+00 +1214,1239,2026-05-13 08:02:43.853604+00 +1214,1242,2026-05-13 08:02:43.853604+00 +1214,1266,2026-05-13 08:02:43.853604+00 +1215,1203,2026-05-13 08:02:43.853604+00 +1215,1261,2026-05-13 08:02:43.853604+00 +1216,1233,2026-05-13 08:02:43.853604+00 +1216,1237,2026-05-13 08:02:43.853604+00 +1216,1255,2026-05-13 08:02:43.853604+00 +1217,1209,2026-05-13 08:02:43.853604+00 +1217,1242,2026-05-13 08:02:43.853604+00 +1217,1258,2026-05-13 08:02:43.853604+00 +1217,1259,2026-05-13 08:02:43.853604+00 +1217,1270,2026-05-13 08:02:43.853604+00 +1218,1217,2026-05-13 08:02:43.853604+00 +1219,1214,2026-05-13 08:02:43.853604+00 +1219,1243,2026-05-13 08:02:43.853604+00 +1219,1250,2026-05-13 08:02:43.853604+00 +1219,1255,2026-05-13 08:02:43.853604+00 +1219,1261,2026-05-13 08:02:43.853604+00 +1220,1229,2026-05-13 08:02:43.853604+00 +1220,1246,2026-05-13 08:02:43.853604+00 +1220,1260,2026-05-13 08:02:43.853604+00 +1221,1210,2026-05-13 08:02:43.853604+00 +1221,1228,2026-05-13 08:02:43.853604+00 +1221,1262,2026-05-13 08:02:43.853604+00 +1222,1220,2026-05-13 08:02:43.853604+00 +1222,1223,2026-05-13 08:02:43.853604+00 +1222,1225,2026-05-13 08:02:43.853604+00 +1223,1216,2026-05-13 08:02:43.853604+00 +1223,1218,2026-05-13 08:02:43.853604+00 +1223,1232,2026-05-13 08:02:43.853604+00 +1223,1243,2026-05-13 08:02:43.853604+00 +1223,1259,2026-05-13 08:02:43.853604+00 +1223,1260,2026-05-13 08:02:43.853604+00 +1223,1266,2026-05-13 08:02:43.853604+00 +1224,1251,2026-05-13 08:02:43.853604+00 +1224,1259,2026-05-13 08:02:43.853604+00 +1225,1195,2026-05-13 08:02:43.853604+00 +1225,1198,2026-05-13 08:02:43.853604+00 +1225,1224,2026-05-13 08:02:43.853604+00 +1225,1238,2026-05-13 08:02:43.853604+00 +1226,1196,2026-05-13 08:02:43.853604+00 +1226,1212,2026-05-13 08:02:43.853604+00 +1226,1223,2026-05-13 08:02:43.853604+00 +1226,1248,2026-05-13 08:02:43.853604+00 +1226,1259,2026-05-13 08:02:43.853604+00 +1226,1262,2026-05-13 08:02:43.853604+00 +1227,1229,2026-05-13 08:02:43.853604+00 +1227,1238,2026-05-13 08:02:43.853604+00 +1227,1247,2026-05-13 08:02:43.853604+00 +1227,1257,2026-05-13 08:02:43.853604+00 +1228,1202,2026-05-13 08:02:43.853604+00 +1228,1214,2026-05-13 08:02:43.853604+00 +1229,1208,2026-05-13 08:02:43.853604+00 +1229,1209,2026-05-13 08:02:43.853604+00 +1229,1226,2026-05-13 08:02:43.853604+00 +1229,1241,2026-05-13 08:02:43.853604+00 +1229,1265,2026-05-13 08:02:43.853604+00 +1229,1266,2026-05-13 08:02:43.853604+00 +1230,1218,2026-05-13 08:02:43.853604+00 +1230,1238,2026-05-13 08:02:43.853604+00 +1230,1250,2026-05-13 08:02:43.853604+00 +1231,1237,2026-05-13 08:02:43.853604+00 +1231,1256,2026-05-13 08:02:43.853604+00 +1232,1202,2026-05-13 08:02:43.853604+00 +1232,1223,2026-05-13 08:02:43.853604+00 +1232,1233,2026-05-13 08:02:43.853604+00 +1232,1245,2026-05-13 08:02:43.853604+00 +1232,1269,2026-05-13 08:02:43.853604+00 +1233,1228,2026-05-13 08:02:43.853604+00 +1233,1235,2026-05-13 08:02:43.853604+00 +1234,1216,2026-05-13 08:02:43.853604+00 +1234,1248,2026-05-13 08:02:43.853604+00 +1235,1213,2026-05-13 08:02:43.853604+00 +1235,1221,2026-05-13 08:02:43.853604+00 +1235,1230,2026-05-13 08:02:43.853604+00 +1235,1267,2026-05-13 08:02:43.853604+00 +1236,1198,2026-05-13 08:02:43.853604+00 +1236,1220,2026-05-13 08:02:43.853604+00 +1236,1221,2026-05-13 08:02:43.853604+00 +1236,1251,2026-05-13 08:02:43.853604+00 +1237,1240,2026-05-13 08:02:43.853604+00 +1237,1244,2026-05-13 08:02:43.853604+00 +1237,1260,2026-05-13 08:02:43.853604+00 +1237,1261,2026-05-13 08:02:43.853604+00 +1238,1234,2026-05-13 08:02:43.853604+00 +1238,1249,2026-05-13 08:02:43.853604+00 +1238,1267,2026-05-13 08:02:43.853604+00 +1239,1237,2026-05-13 08:02:43.853604+00 +1239,1244,2026-05-13 08:02:43.853604+00 +1239,1264,2026-05-13 08:02:43.853604+00 +1240,1218,2026-05-13 08:02:43.853604+00 +1240,1221,2026-05-13 08:02:43.853604+00 +1240,1252,2026-05-13 08:02:43.853604+00 +1240,1267,2026-05-13 08:02:43.853604+00 +1241,1205,2026-05-13 08:02:43.853604+00 +1241,1245,2026-05-13 08:02:43.853604+00 +1241,1268,2026-05-13 08:02:43.853604+00 +1242,1225,2026-05-13 08:02:43.853604+00 +1242,1237,2026-05-13 08:02:43.853604+00 +1242,1262,2026-05-13 08:02:43.853604+00 +1243,1214,2026-05-13 08:02:43.853604+00 +1243,1222,2026-05-13 08:02:43.853604+00 +1243,1225,2026-05-13 08:02:43.853604+00 +1243,1244,2026-05-13 08:02:43.853604+00 +1243,1246,2026-05-13 08:02:43.853604+00 +1243,1256,2026-05-13 08:02:43.853604+00 +1244,1221,2026-05-13 08:02:43.853604+00 +1244,1251,2026-05-13 08:02:43.853604+00 +1244,1271,2026-05-13 08:02:43.853604+00 +1245,1268,2026-05-13 08:02:43.853604+00 +1246,1197,2026-05-13 08:02:43.853604+00 +1246,1205,2026-05-13 08:02:43.853604+00 +1246,1223,2026-05-13 08:02:43.853604+00 +1246,1253,2026-05-13 08:02:43.853604+00 +1247,1246,2026-05-13 08:02:43.853604+00 +1247,1263,2026-05-13 08:02:43.853604+00 +1248,1204,2026-05-13 08:02:43.853604+00 +1248,1216,2026-05-13 08:02:43.853604+00 +1248,1223,2026-05-13 08:02:43.853604+00 +1248,1241,2026-05-13 08:02:43.853604+00 +1249,1221,2026-05-13 08:02:43.853604+00 +1249,1241,2026-05-13 08:02:43.853604+00 +1250,1197,2026-05-13 08:02:43.853604+00 +1250,1202,2026-05-13 08:02:43.853604+00 +1250,1203,2026-05-13 08:02:43.853604+00 +1250,1211,2026-05-13 08:02:43.853604+00 +1250,1233,2026-05-13 08:02:43.853604+00 +1250,1238,2026-05-13 08:02:43.853604+00 +1250,1260,2026-05-13 08:02:43.853604+00 +1251,1220,2026-05-13 08:02:43.853604+00 +1251,1223,2026-05-13 08:02:43.853604+00 +1251,1226,2026-05-13 08:02:43.853604+00 +1251,1232,2026-05-13 08:02:43.853604+00 +1251,1264,2026-05-13 08:02:43.853604+00 +1252,1253,2026-05-13 08:02:43.853604+00 +1252,1270,2026-05-13 08:02:43.853604+00 +1252,1271,2026-05-13 08:02:43.853604+00 +1253,1205,2026-05-13 08:02:43.853604+00 +1253,1270,2026-05-13 08:02:43.853604+00 +1254,1211,2026-05-13 08:02:43.853604+00 +1255,1201,2026-05-13 08:02:43.853604+00 +1255,1208,2026-05-13 08:02:43.853604+00 +1255,1216,2026-05-13 08:02:43.853604+00 +1255,1226,2026-05-13 08:02:43.853604+00 +1255,1237,2026-05-13 08:02:43.853604+00 +1255,1238,2026-05-13 08:02:43.853604+00 +1255,1254,2026-05-13 08:02:43.853604+00 +1255,1258,2026-05-13 08:02:43.853604+00 +1255,1261,2026-05-13 08:02:43.853604+00 +1256,1203,2026-05-13 08:02:43.853604+00 +1256,1213,2026-05-13 08:02:43.853604+00 +1256,1222,2026-05-13 08:02:43.853604+00 +1256,1228,2026-05-13 08:02:43.853604+00 +1256,1235,2026-05-13 08:02:43.853604+00 +1256,1245,2026-05-13 08:02:43.853604+00 +1256,1253,2026-05-13 08:02:43.853604+00 +1257,1225,2026-05-13 08:02:43.853604+00 +1257,1227,2026-05-13 08:02:43.853604+00 +1257,1243,2026-05-13 08:02:43.853604+00 +1257,1251,2026-05-13 08:02:43.853604+00 +1257,1261,2026-05-13 08:02:43.853604+00 +1258,1195,2026-05-13 08:02:43.853604+00 +1258,1198,2026-05-13 08:02:43.853604+00 +1258,1203,2026-05-13 08:02:43.853604+00 +1258,1219,2026-05-13 08:02:43.853604+00 +1258,1220,2026-05-13 08:02:43.853604+00 +1258,1222,2026-05-13 08:02:43.853604+00 +1258,1226,2026-05-13 08:02:43.853604+00 +1258,1228,2026-05-13 08:02:43.853604+00 +1258,1240,2026-05-13 08:02:43.853604+00 +1258,1249,2026-05-13 08:02:43.853604+00 +1258,1255,2026-05-13 08:02:43.853604+00 +1258,1259,2026-05-13 08:02:43.853604+00 +1258,1261,2026-05-13 08:02:43.853604+00 +1259,1200,2026-05-13 08:02:43.853604+00 +1259,1209,2026-05-13 08:02:43.853604+00 +1259,1212,2026-05-13 08:02:43.853604+00 +1259,1215,2026-05-13 08:02:43.853604+00 +1259,1217,2026-05-13 08:02:43.853604+00 +1259,1250,2026-05-13 08:02:43.853604+00 +1259,1263,2026-05-13 08:02:43.853604+00 +1259,1267,2026-05-13 08:02:43.853604+00 +1260,1218,2026-05-13 08:02:43.853604+00 +1260,1249,2026-05-13 08:02:43.853604+00 +1260,1255,2026-05-13 08:02:43.853604+00 +1260,1257,2026-05-13 08:02:43.853604+00 +1261,1198,2026-05-13 08:02:43.853604+00 +1261,1210,2026-05-13 08:02:43.853604+00 +1261,1226,2026-05-13 08:02:43.853604+00 +1261,1237,2026-05-13 08:02:43.853604+00 +1261,1241,2026-05-13 08:02:43.853604+00 +1262,1215,2026-05-13 08:02:43.853604+00 +1262,1220,2026-05-13 08:02:43.853604+00 +1263,1200,2026-05-13 08:02:43.853604+00 +1263,1239,2026-05-13 08:02:43.853604+00 +1263,1259,2026-05-13 08:02:43.853604+00 +1264,1203,2026-05-13 08:02:43.853604+00 +1264,1204,2026-05-13 08:02:43.853604+00 +1264,1208,2026-05-13 08:02:43.853604+00 +1264,1221,2026-05-13 08:02:43.853604+00 +1264,1263,2026-05-13 08:02:43.853604+00 +1265,1195,2026-05-13 08:02:43.853604+00 +1265,1216,2026-05-13 08:02:43.853604+00 +1265,1218,2026-05-13 08:02:43.853604+00 +1265,1225,2026-05-13 08:02:43.853604+00 +1265,1252,2026-05-13 08:02:43.853604+00 +1265,1256,2026-05-13 08:02:43.853604+00 +1266,1200,2026-05-13 08:02:43.853604+00 +1266,1237,2026-05-13 08:02:43.853604+00 +1266,1240,2026-05-13 08:02:43.853604+00 +1266,1251,2026-05-13 08:02:43.853604+00 +1266,1254,2026-05-13 08:02:43.853604+00 +1266,1268,2026-05-13 08:02:43.853604+00 +1266,1270,2026-05-13 08:02:43.853604+00 +1267,1195,2026-05-13 08:02:43.853604+00 +1267,1212,2026-05-13 08:02:43.853604+00 +1267,1223,2026-05-13 08:02:43.853604+00 +1268,1199,2026-05-13 08:02:43.853604+00 +1268,1201,2026-05-13 08:02:43.853604+00 +1268,1203,2026-05-13 08:02:43.853604+00 +1268,1206,2026-05-13 08:02:43.853604+00 +1268,1217,2026-05-13 08:02:43.853604+00 +1268,1224,2026-05-13 08:02:43.853604+00 +1268,1237,2026-05-13 08:02:43.853604+00 +1268,1240,2026-05-13 08:02:43.853604+00 +1268,1242,2026-05-13 08:02:43.853604+00 +1268,1249,2026-05-13 08:02:43.853604+00 +1268,1267,2026-05-13 08:02:43.853604+00 +1269,1230,2026-05-13 08:02:43.853604+00 +1269,1248,2026-05-13 08:02:43.853604+00 +1270,1198,2026-05-13 08:02:43.853604+00 +1270,1199,2026-05-13 08:02:43.853604+00 +1270,1205,2026-05-13 08:02:43.853604+00 +1270,1216,2026-05-13 08:02:43.853604+00 +1270,1230,2026-05-13 08:02:43.853604+00 +1270,1235,2026-05-13 08:02:43.853604+00 +1270,1240,2026-05-13 08:02:43.853604+00 +1270,1256,2026-05-13 08:02:43.853604+00 +1270,1257,2026-05-13 08:02:43.853604+00 +1270,1258,2026-05-13 08:02:43.853604+00 +1271,1205,2026-05-13 08:02:43.853604+00 +1271,1206,2026-05-13 08:02:43.853604+00 +1271,1209,2026-05-13 08:02:43.853604+00 +1271,1212,2026-05-13 08:02:43.853604+00 +1271,1224,2026-05-13 08:02:43.853604+00 +1271,1228,2026-05-13 08:02:43.853604+00 +1271,1241,2026-05-13 08:02:43.853604+00 +1271,1243,2026-05-13 08:02:43.853604+00 +1271,1250,2026-05-13 08:02:43.853604+00 +1271,1254,2026-05-13 08:02:43.853604+00 +1271,1257,2026-05-13 08:02:43.853604+00 +1271,1260,2026-05-13 08:02:43.853604+00 diff --git a/scripts/seed_snapshot_data/data/meetings.csv b/scripts/seed_snapshot_data/data/meetings.csv new file mode 100644 index 00000000..7d35b38f --- /dev/null +++ b/scripts/seed_snapshot_data/data/meetings.csv @@ -0,0 +1,52 @@ +id,mentorship_id,title,description,start_time,end_time,status,meeting_link,meeting_type,is_recurring,recurrence_rule,created_by_id,confirmed_at,confirmation_deadline,notes,notes_updated_at,notes_updated_by_id,created_at +62,23,Kick-off: scope and rhythm,,2026-03-30 00:00:00+00,2026-03-30 01:00:00+00,COMPLETED,,VIRTUAL,f,,1195,2026-03-30 00:00:00+00,,Agreed on weekly Thursday calls. Tolga to send a one-page system diagram before each session. Melis to send one question to think about between sessions. First focus area: persistence and delivery guarantees in his message queue project.,2026-03-30 01:00:00+00,1195,2026-03-29 00:00:00+00 +63,23,Design review: message queue v1,,2026-04-13 00:00:00+00,2026-04-13 01:15:00+00,COMPLETED,,VIRTUAL,f,,1195,2026-04-13 00:00:00+00,,"Walked the diagram. Found three weak spots — the 'persistence' label hiding actual durability, the consumer model being implicit, and no back-pressure strategy. Tolga to come back with a change list.",2026-04-13 01:15:00+00,1195,2026-03-29 00:00:00+00 +64,23,10x design discussion,,2026-04-21 00:00:00+00,2026-04-21 01:00:00+00,COMPLETED,,VIRTUAL,f,,1195,2026-04-21 00:00:00+00,,Worked through the back-pressure question. Picked windowed credit-based for the consumer side. Tolga implemented it during the week.,2026-04-21 01:00:00+00,1195,2026-03-29 00:00:00+00 +65,23,Mock interview #1,,2026-05-05 00:00:00+00,2026-05-05 01:30:00+00,COMPLETED,,VIRTUAL,f,,1195,2026-05-05 00:00:00+00,,"Three estimation questions. Tolga froze on the first, recovered on the second, was strong on the third. Pattern: he over-thinks the opening. Practice: start with the constraint, not the architecture.",2026-05-05 01:30:00+00,1195,2026-03-29 00:00:00+00 +66,23,Mid-point review,,2026-05-20 00:00:00+00,2026-05-20 01:00:00+00,CONFIRMED,,VIRTUAL,f,,1195,2026-05-20 00:00:00+00,,,,,2026-03-29 00:00:00+00 +67,23,Mock interview #2 and goal setting for month 3,,2026-06-03 00:00:00+00,2026-06-03 01:30:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1195,,,,,,2026-03-29 00:00:00+00 +68,24,Kick-off,,2026-04-14 00:00:00+00,2026-04-14 01:00:00+00,COMPLETED,,VIRTUAL,f,,1197,2026-04-14 00:00:00+00,,"Agreed on six months. Set the lateral cadence: every two weeks, one Friday call, asynchronous notes between. İsmail's 'happy week' homework as the diagnostic.",2026-04-14 01:00:00+00,1197,2026-04-13 00:00:00+00 +69,24,Paths-side-by-side review,,2026-04-28 00:00:00+00,2026-04-28 01:15:00+00,COMPLETED,,VIRTUAL,f,,1197,2026-04-28 00:00:00+00,,Reviewed the side-by-side. İsmail leans games but is intimidated by team size. We discussed indie + solo paths. Production lessons translate one-to-one; the field is smaller than the AAA version implies.,2026-04-28 01:15:00+00,1197,2026-04-13 00:00:00+00 +70,24,Paper prototype review,,2026-05-03 00:00:00+00,2026-05-03 00:45:00+00,COMPLETED,,VIRTUAL,f,,1197,2026-05-03 00:00:00+00,,Walked through three paper sketches. Aras flagged the third as the one to develop — the moment of orientation when you first see your trail laid out is the design opportunity.,2026-05-03 00:45:00+00,1197,2026-04-13 00:00:00+00 +71,24,GPS filter design,,2026-05-20 00:00:00+00,2026-05-20 01:00:00+00,CONFIRMED,,VIRTUAL,f,,1197,2026-05-20 00:00:00+00,,,,,2026-04-13 00:00:00+00 +72,24,Month-3 decision call,,2026-07-12 00:00:00+00,2026-07-12 01:30:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1197,,,,,,2026-04-13 00:00:00+00 +73,25,Kick-off + question framing,,2026-04-16 00:00:00+00,2026-04-16 01:15:00+00,COMPLETED,,VIRTUAL,f,,1198,2026-04-16 00:00:00+00,,"Spent the whole session on the one-sentence question. Mina's first try had three subordinate clauses. By the end, single sentence, single commitment. The statement will hang from this.",2026-04-16 01:15:00+00,1198,2026-04-15 00:00:00+00 +74,25,Draft review #1,,2026-04-24 00:00:00+00,2026-04-24 01:00:00+00,COMPLETED,,VIRTUAL,f,,1198,2026-04-24 00:00:00+00,,Walked through drafts 1-3. Middle paragraphs are strong; opening was descriptive. Concrete edit list sent. Mina to rewrite opening for next week.,2026-04-24 01:00:00+00,1198,2026-04-15 00:00:00+00 +75,25,Draft review #2,,2026-05-03 00:00:00+00,2026-05-03 00:45:00+00,COMPLETED,,VIRTUAL,f,,1198,2026-05-03 00:00:00+00,,Opening rewritten. Confidence is right; structure now flows. Discussed the conclusion's technique list — cut to two.,2026-05-03 00:45:00+00,1198,2026-04-15 00:00:00+00 +76,25,Advisor shortlist working session,,2026-05-18 00:00:00+00,2026-05-18 01:00:00+00,CONFIRMED,,VIRTUAL,f,,1198,2026-05-18 00:00:00+00,,,,,2026-04-15 00:00:00+00 +77,25,Writing routine check-in,,2026-06-01 00:00:00+00,2026-06-01 00:30:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1198,,,,,,2026-04-15 00:00:00+00 +78,26,Kick-off,,2026-04-19 00:00:00+00,2026-04-19 01:00:00+00,COMPLETED,,VIRTUAL,f,,1200,2026-04-19 00:00:00+00,,Set expectations. Zeynep to stop apologizing in introductions. Focused project: build and operate a small ECS service. Exam booked for August.,2026-04-19 01:00:00+00,1200,2026-04-18 00:00:00+00 +79,26,Docker review,,2026-04-29 00:00:00+00,2026-04-29 00:45:00+00,COMPLETED,,VIRTUAL,f,,1200,2026-04-29 00:00:00+00,,Walked through the multi-stage build. Image size win is real. Observability is the next step. Zeynep to add CloudWatch metrics by next session.,2026-04-29 00:45:00+00,1200,2026-04-18 00:00:00+00 +80,26,Mock exam debrief,,2026-05-08 00:00:00+00,2026-05-08 00:45:00+00,COMPLETED,,VIRTUAL,f,,1200,2026-05-08 00:00:00+00,,Score 68%. Bottlenecks: VPC peering and IAM policy debugging. Two focused weeks on labs. Reading-without-doing officially banned.,2026-05-08 00:45:00+00,1200,2026-04-18 00:00:00+00 +81,26,VPC lab review,,2026-05-23 00:00:00+00,2026-05-23 01:00:00+00,CONFIRMED,,VIRTUAL,f,,1200,2026-05-23 00:00:00+00,,,,,2026-04-18 00:00:00+00 +82,26,Cert + platform handoff,,2026-06-17 00:00:00+00,2026-06-17 01:15:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1200,,,,,,2026-04-18 00:00:00+00 +83,27,Kick-off + reset,,2026-03-25 00:00:00+00,2026-03-25 01:30:00+00,COMPLETED,,VIRTUAL,f,,1201,2026-03-25 00:00:00+00,,"Cihan came in CTF-hot. I deliberately slowed him down: no CTFs for the first month, twenty reports to read. He resisted for three minutes and then agreed.",2026-03-25 01:30:00+00,1201,2026-03-24 00:00:00+00 +84,27,Reading-debrief and OSCP planning,,2026-04-19 00:00:00+00,2026-04-19 01:15:00+00,COMPLETED,,VIRTUAL,f,,1201,2026-04-19 00:00:00+00,,"Twenty done. Pattern recognition is now there. Discussed the OSCP timeline — month four, not month two. Cihan agreed when I showed him the failure rate stats for under-prepared candidates.",2026-04-19 01:15:00+00,1201,2026-03-24 00:00:00+00 +85,27,Bug report v1 review,,2026-05-03 00:00:00+00,2026-05-03 01:00:00+00,COMPLETED,,VIRTUAL,f,,1201,2026-05-03 00:00:00+00,,Read his first formal report. Findings section was solid. Disclosure timeline section needed structure. Sent him a template; he'll redo before next session.,2026-05-03 01:00:00+00,1201,2026-03-24 00:00:00+00 +86,27,Lab session: writing-as-discipline,,2026-05-20 00:00:00+00,2026-05-20 01:30:00+00,CONFIRMED,,VIRTUAL,f,,1201,2026-05-20 00:00:00+00,,,,,2026-03-24 00:00:00+00 +87,27,OSCP mid-prep checkpoint,,2026-07-12 00:00:00+00,2026-07-12 01:00:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1201,,,,,,2026-03-24 00:00:00+00 +88,28,Kick-off + cycle design,,2026-03-15 00:00:00+00,2026-03-15 01:00:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-03-15 00:00:00+00,,Set the two-week cycle: ADR weeks alternate with code-review weeks. Rıza agreed quickly. Sent the first decision exercise that evening.,2026-03-15 01:00:00+00,1271,2026-03-14 00:00:00+00 +89,28,ADR #1 debrief,,2026-03-20 00:00:00+00,2026-03-20 01:15:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-03-20 00:00:00+00,,"Walked the pagination ADR together. Rıza landed at cursor-based, same as we did. He missed the snapshot-version fingerprint for staleness — that's the kind of detail you only know after debugging an incident. Annotated PDF sent. Good first exercise.",2026-03-20 01:15:00+00,1271,2026-03-14 00:00:00+00 +90,28,Code review session,,2026-03-27 00:00:00+00,2026-03-27 01:00:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-03-27 00:00:00+00,,"Reviewed Rıza's feed component. Three weak spots: error boundary placement, retry policy duplication, and a hidden re-render in a list cell. He saw two of the three immediately when prompted. Sent specific commits to study.",2026-03-27 01:00:00+00,1271,2026-03-14 00:00:00+00 +91,28,ADR #2 debrief,,2026-04-04 00:00:00+00,2026-04-04 01:15:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-04-04 00:00:00+00,,Caching ADR was weaker. Rıza picked hybrid without justifying it. We rebuilt the reasoning together. He admitted he'd hand-waved the failure modes. Brutal-and-useful. He took the annotations well.,2026-04-04 01:15:00+00,1271,2026-03-14 00:00:00+00 +92,28,Refactor planning,,2026-04-22 00:00:00+00,2026-04-22 01:30:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-04-22 00:00:00+00,,"Walked through the state-management refactor scope. Rıza wanted to do it all at once. We negotiated to two phases. He'll write the ADR first, then ship phase 1 in a week.",2026-04-22 01:30:00+00,1271,2026-03-14 00:00:00+00 +93,28,Refactor review,,2026-05-10 00:00:00+00,2026-05-10 01:00:00+00,COMPLETED,,VIRTUAL,f,,1271,2026-05-10 00:00:00+00,,"Reviewed the refactored state management. Cleaner. Two of my line-comments became commits within 48 hours. Rıza is shipping faster than he was, with less drift. Started talking about the leadership-readiness arc for next month.",2026-05-10 01:00:00+00,1271,2026-03-14 00:00:00+00 +94,28,Leadership arc kick-off,,2026-05-20 00:00:00+00,2026-05-20 01:00:00+00,CONFIRMED,,VIRTUAL,f,,1271,2026-05-20 00:00:00+00,,,,,2026-03-14 00:00:00+00 +95,28,Cross-team meeting rehearsal,,2026-06-01 00:00:00+00,2026-06-01 00:45:00+00,PENDING_CONFIRMATION,,VIRTUAL,f,,1271,,,,,,2026-03-14 00:00:00+00 +96,29,Kick-off and reframing,,2024-10-14 00:00:00+00,2024-10-14 01:00:00+00,COMPLETED,,VIRTUAL,f,,1196,2024-10-14 00:00:00+00,,"Set the rhythm: weekly Wednesday calls, no exceptions. First two weeks dedicated to language patterns, not tactics. Buse to flag every 'pivot' or 'just' in her writing.",2024-10-14 01:00:00+00,1196,2025-04-10 00:00:00+00 +97,29,Cover-letter teardown,,2024-11-03 00:00:00+00,2024-11-03 01:15:00+00,COMPLETED,,VIRTUAL,f,,1196,2024-11-03 00:00:00+00,,"Walked the cover letter paragraph by paragraph. Cut 60% of the middle. The sharpened version reads like a candidate, not a former teacher apologizing.",2024-11-03 01:15:00+00,1196,2025-04-10 00:00:00+00 +98,29,Interview prep,,2024-12-01 00:00:00+00,2024-12-01 00:45:00+00,COMPLETED,,VIRTUAL,f,,1196,2024-12-01 00:00:00+00,,Two-minute positioning script. Reframed the 'why tech' question as 'why this team'. Buse used the line in the interview and got a callback within 48 hours.,2024-12-01 00:45:00+00,1196,2025-04-10 00:00:00+00 +99,29,Wrap and lessons,,2025-01-08 00:00:00+00,2025-01-08 01:00:00+00,COMPLETED,,VIRTUAL,f,,1196,2025-01-08 00:00:00+00,,"Buse accepted the offer. We wrote a one-page wrap doc together: (1) rewrite language before tactics, (2) shortlist by want not need, (3) portfolio = real audits not Kaggle, (4) the apology paragraph is the bug.",2025-01-08 01:00:00+00,1196,2025-04-10 00:00:00+00 +100,30,Kick-off,,2024-11-19 00:00:00+00,2024-11-19 01:00:00+00,COMPLETED,,VIRTUAL,f,,1198,2024-11-19 00:00:00+00,,"Set the contract: daily journal, weekly meetings, three months ends in a decision. Defne agreed without negotiation. The clarity was a good sign.",2024-11-19 01:00:00+00,1198,2025-04-01 00:00:00+00 +101,30,Journal review month 1,,2024-12-17 00:00:00+00,2024-12-17 01:15:00+00,COMPLETED,,VIRTUAL,f,,1198,2024-12-17 00:00:00+00,,Read entries together. Pattern in the last week: she's noticing her own thinking. Told her so. We mapped the next month's reading list around the questions that recurred in her journal.,2024-12-17 01:15:00+00,1198,2025-04-01 00:00:00+00 +102,30,Paper reading session,,2025-01-11 00:00:00+00,2025-01-11 01:30:00+00,COMPLETED,,VIRTUAL,f,,1198,2025-01-11 00:00:00+00,,Worked through the disputed paper line by line. Defne caught two assumptions the authors hid in subordinate clauses. Better reader than she was six weeks ago.,2025-01-11 01:30:00+00,1198,2025-04-01 00:00:00+00 +103,30,Next-step debrief,,2025-02-15 00:00:00+00,2025-02-15 01:30:00+00,COMPLETED,,VIRTUAL,f,,1198,2025-02-15 00:00:00+00,,"She wants a long engagement with someone who does both research and policy work. Honest assessment of her temperament: she'd be unhappy in a pure-theory department, well-suited to applied research or policy-research hybrid roles. We mapped three mentor archetypes for her to search for next.",2025-02-15 01:30:00+00,1198,2025-04-01 00:00:00+00 +104,30,Wrap + review,,2025-03-02 00:00:00+00,2025-03-02 00:45:00+00,COMPLETED,,VIRTUAL,f,,1198,2025-03-02 00:00:00+00,,Closed the engagement cleanly. Defne left a five-star review. I told her she should feel free to come back in two years if her plans shift. She thanked the daily-journal rule and said it was the most important thing she'd done this year.,2025-03-02 00:45:00+00,1198,2025-04-01 00:00:00+00 +105,31,Kick-off and decision contract,,2024-12-24 00:00:00+00,2024-12-24 01:00:00+00,COMPLETED,,VIRTUAL,f,,1199,2024-12-24 00:00:00+00,,"Set the rule: three months ends in a concrete decision. Funda agreed. We mapped the three areas to test: market, cofounder, capacity.",2024-12-24 01:00:00+00,1199,2025-08-19 00:00:00+00 +106,31,Discovery debrief,,2025-01-13 00:00:00+00,2025-01-13 01:15:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-01-13 00:00:00+00,,Six honest conversations from Sakarya–Düzce. Real demand for the niche; price sensitivity higher than Funda expected. Market viable; pricing harder than hoped.,2025-01-13 01:15:00+00,1199,2025-08-19 00:00:00+00 +107,31,Obituary review,,2025-02-02 00:00:00+00,2025-02-02 01:00:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-02-02 00:00:00+00,,Read the pre-mortem aloud. Funda identified cofounder absence as the dominant kill-mode. Market was second. We made the cofounder search the next month's only task.,2025-02-02 01:00:00+00,1199,2025-08-19 00:00:00+00 +108,31,Decision call,,2025-03-02 00:00:00+00,2025-03-02 01:30:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-03-02 00:00:00+00,,"Funda chose shelf-for-a-year. She wants to join a logistics startup as a junior product person, learn the operational side, and re-open the file with a cofounder in 18 months. Honest, mature decision. I told her so.",2025-03-02 01:30:00+00,1199,2025-08-19 00:00:00+00 +109,31,Wrap,,2025-03-12 00:00:00+00,2025-03-12 00:45:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-03-12 00:00:00+00,,"Wrote the wrap doc. Lessons: (1) discovery in person beats any deck, (2) cofounder absence is the dominant kill-mode for solo first-timers, (3) shelving is not failing if you've learned the contour of the problem, (4) the next attempt starts with the person, not the idea.",2025-03-12 00:45:00+00,1199,2025-08-19 00:00:00+00 +110,32,Kick-off,,2025-03-09 00:00:00+00,2025-03-09 00:45:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-03-09 00:00:00+00,,Set the hard deadline. Defne agreed. We sketched the three exercises.,2025-03-09 00:45:00+00,1199,2025-04-02 00:00:00+00 +111,32,Discovery debrief,,2025-03-17 00:00:00+00,2025-03-17 01:00:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-03-17 00:00:00+00,,She hated cold outreach but loved the conversations themselves. Mixed signal — worth probing. Suggested the obituary exercise to surface the dominant failure mode.,2025-03-17 01:00:00+00,1199,2025-04-02 00:00:00+00 +112,32,Final call,,2025-03-28 00:00:00+00,2025-03-28 01:00:00+00,COMPLETED,,VIRTUAL,f,,1199,2025-03-28 00:00:00+00,,"Defne concluded: not a founder right now. The day-to-day operational temperament isn't there. Good decision, made fast. Closed cleanly. She didn't leave a written review this time — said she'd reach out again later if her thinking shifted.",2025-03-28 01:00:00+00,1199,2025-04-02 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/mentee_interests.csv b/scripts/seed_snapshot_data/data/mentee_interests.csv new file mode 100644 index 00000000..0bf6ed72 --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentee_interests.csv @@ -0,0 +1,122 @@ +mentee_id,interest,identifier_uri +1207,Cloud Fundamentals, +1208,AI Ethics, +1208,Responsible AI, +1209,Model Deployment, +1209,Cloud, +1209,AWS, +1210,iOS Development, +1210,Swift, +1211,Study Abroad, +1211,Academic Career, +1212,Data Visualization, +1212,FinTech, +1213,Prompting, +1214,Game Design, +1214,Level Design, +1215,GRE Prep, +1215,Study Abroad, +1216,Career Switch, +1216,Communication Skills, +1216,Product Management, +1217,Ethical Hacking, +1218,3D Modeling, +1218,Game Development, +1219,Flutter, +1219,Mobile App Development, +1220,First Job, +1220,Portfolio Building, +1221,QA Automation, +1221,Test Strategy, +1222,Startup Ideas, +1222,Flutter, +1223,Smart Contracts, +1223,Blockchain, +1224,Bootcamp Graduate, +1224,First Job, +1224,Communication Skills, +1225,First Job, +1225,Portfolio Building, +1226,Campus Networking, +1226,Study Abroad, +1227,Digital Product Thinking, +1227,Stakeholder Communication, +1228,Product Management, +1228,User Research, +1229,Cloud, +1229,Machine Learning Operations, +1230,Machine Learning, +1230,Python, +1231,Mobile Development, +1232,Smart Contracts, +1232,Web3, +1233,Business Analysis, +1234,Portfolio Review, +1234,Frontend Development, +1235,FinTech, +1235,Risk Analysis, +1236,Swift, +1236,Mobile Development, +1237,Algorithms, +1237,First Job, +1238,Mobile Development, +1238,Swift, +1239,Blockchain, +1239,Web3, +1240,Startup Ideas, +1241,Study Habits, +1241,Focus, +1241,Career Switch, +1242,Data Science, +1242,Python, +1243,Stakeholder Communication, +1243,Roadmapping, +1243,Leadership, +1244,Product Management, +1244,User Research, +1244,Public Speaking, +1245,Content Strategy, +1245,SEO, +1246,Full Stack Development, +1246,Node.js, +1247,SQL, +1247,ETL, +1248,Flutter, +1249,SEO, +1250,Level Design, +1250,Game Design, +1251,Public Speaking, +1251,Leadership, +1252,Swift, +1252,iOS Development, +1253,Cloud Fundamentals, +1253,DevOps, +1254,ETL, +1254,Data Engineering, +1259,Music Performance, +1259,Piano, +1259,Music Theory, +1260,Filmmaking, +1260,Screenwriting, +1260,Film Editing, +1261,Illustration, +1261,Digital Painting, +1261,Concept Art, +1262,Creative Writing, +1262,Short Fiction, +1262,Editing, +1263,Documentary Photography, +1263,Photography, +1263,Photojournalism, +1264,Pastry, +1264,Culinary Arts, +1264,Menu Design, +1265,Theatre Acting, +1265,Stage Direction, +1265,Improvisation, +1266,Audio Production, +1266,Podcasting, +1266,Music Production, +1267,Machine Learning, +1267,AI Ethics, +1267,Research, diff --git a/scripts/seed_snapshot_data/data/mentee_skills.csv b/scripts/seed_snapshot_data/data/mentee_skills.csv new file mode 100644 index 00000000..ada28a9d --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentee_skills.csv @@ -0,0 +1,113 @@ +mentee_id,skill,identifier_uri +1207,Cloud Fundamentals, +1208,AI Ethics, +1208,Responsible AI, +1209,Model Deployment, +1209,Cloud, +1209,AWS, +1210,iOS Development, +1210,Swift, +1211,Study Abroad, +1211,Academic Career, +1212,Data Visualization, +1212,FinTech, +1213,Prompting, +1214,Game Design, +1214,Level Design, +1215,GRE Prep, +1215,Study Abroad, +1216,Career Switch, +1216,Communication Skills, +1216,Product Management, +1217,Ethical Hacking, +1218,3D Modeling, +1218,Game Development, +1219,Flutter, +1219,Mobile App Development, +1220,First Job, +1220,Portfolio Building, +1221,QA Automation, +1221,Test Strategy, +1222,Startup Ideas, +1222,Flutter, +1223,Smart Contracts, +1223,Blockchain, +1224,Bootcamp Graduate, +1224,First Job, +1224,Communication Skills, +1225,First Job, +1225,Portfolio Building, +1226,Campus Networking, +1226,Study Abroad, +1227,Digital Product Thinking, +1227,Stakeholder Communication, +1228,Product Management, +1228,User Research, +1229,Cloud, +1229,Machine Learning Operations, +1230,Machine Learning, +1230,Python, +1231,Mobile Development, +1232,Smart Contracts, +1232,Web3, +1233,Business Analysis, +1234,Portfolio Review, +1234,Frontend Development, +1235,FinTech, +1235,Risk Analysis, +1236,Swift, +1236,Mobile Development, +1237,Algorithms, +1237,First Job, +1238,Mobile Development, +1238,Swift, +1239,Blockchain, +1239,Web3, +1240,Startup Ideas, +1241,Study Habits, +1241,Focus, +1241,Career Switch, +1242,Data Science, +1242,Python, +1243,Stakeholder Communication, +1243,Roadmapping, +1243,Leadership, +1244,Product Management, +1244,User Research, +1244,Public Speaking, +1245,Content Strategy, +1245,SEO, +1246,Full Stack Development, +1246,Node.js, +1247,SQL, +1247,ETL, +1248,Flutter, +1249,SEO, +1250,Level Design, +1250,Game Design, +1251,Public Speaking, +1251,Leadership, +1252,Swift, +1252,iOS Development, +1253,Cloud Fundamentals, +1253,DevOps, +1254,ETL, +1254,Data Engineering, +1259,Piano, +1259,Music Theory, +1260,Screenwriting, +1260,Film Editing, +1261,Digital Painting, +1261,Concept Art, +1262,Short Fiction, +1262,Editing, +1263,Photography, +1263,Photojournalism, +1264,Pastry, +1264,Menu Design, +1265,Theatre Acting, +1265,Improvisation, +1266,Podcasting, +1266,Audio Production, +1267,Machine Learning, +1267,Research, diff --git a/scripts/seed_snapshot_data/data/mentees.csv b/scripts/seed_snapshot_data/data/mentees.csv new file mode 100644 index 00000000..3de4cc5e --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentees.csv @@ -0,0 +1,58 @@ +id,profile_visibility,goals,major,career_interest,meeting_freq_pref,background_info,cancel_count,active_mentor_id,career_interest_uri,major_uri,affiliation +1247,t,Junior data engineer in 4 months.,"",SQL,Weekly,Hacettepe CS junior. SQL + ETL focused.,0,,,,"" +1212,t,"First role at a fintech or quant team. Build a portfolio that shows analytical decisions, not just pretty plots.","",Data Visualization,Weekly,"IE senior at ITU. Quant-curious, visualization-obsessed. Looking for a fintech first role.",0,,,,"" +1209,t,Ship one real ML service end-to-end this summer — training to inference to monitoring. Get hired as a junior MLOps person.,"",Model Deployment,Weekly,"Final-year CS at OMU. Strong in ML coursework, weak in deployment. Want to close that gap.",0,,,,"" +1221,t,Junior QA engineer role within four months. Open-source contributions to make my portfolio real.,"",QA Automation,Weekly,"CS senior, QA-curious, learning Selenium and test design.",0,,,,"" +1232,t,DeFi prototype this year. First Code4rena participation by winter.,"",Smart Contracts,Weekly,"CS junior, Ege. Solidity learner. Protocol design over token marketing.",0,,,,"" +1218,t,Ship a 3D prototype this year. Apply to studios with a real portfolio behind me.,"",3D Modeling,Weekly,CS junior. Unity + Blender hobbyist. Building toward a junior gameplay or tech-art role.,0,,,,"" +1220,t,First dev role in three months. Portfolio that gets past the screen.,"",First Job,Weekly,Industrial design grad turned bootcamp grad. Job-hunting from Mamak.,0,,,,"" +1224,t,First dev role by August. Two deployed apps in the portfolio.,"",Bootcamp Graduate,Weekly,"Bootcamp grad, ex-English teacher. Two months into job hunting from Adana.",0,,,,"" +1225,t,First dev job within 6 months. Real-data portfolio.,"",First Job,Weekly,"Math grad, self-taught Django learner. Building toward first dev role from Sakarya.",0,,,,"" +1227,t,Product internship this summer. First user-facing product shipped by year end.,"",Digital Product Thinking,Weekly,METU IE junior. Product-curious. Building consumer apps on weekends to learn-by-doing.,0,,,,"" +1228,t,Junior PM role within 6 months. Three real case studies.,"",Product Management,Weekly,"CS junior at OMU. Product-leaning, organizer of the campus product reading club.",0,,,,"" +1231,t,100 users on a real app this year. First role at a mobile-first startup.,"",Mobile Development,Weekly,"CS senior, Tekirdağ. Flutter every weekend. Building toward 100 real users on one app.",0,1271,,,"" +1208,t,A first role in responsible AI or AI policy within twelve months. Pair my philosophy training with enough technical grounding to be useful.,"",AI Ethics,Weekly,"Philosophy MA at Kocaeli, thesis on algorithmic harm. Trying to bridge into responsible-AI policy work.",0,,,,"" +1211,t,PhD admission to a top-30 European program. Research statement my advisor will endorse without edits.,"",Study Abroad,Weekly,CS senior at Bogazici. Undergraduate research in NLP. First-gen student preparing for PhD applications.,0,1198,,,"" +1214,t,Two playable prototypes by end of year. Apply to small narrative-focused studios.,"",Game Design,Weekly,Communication design student. Bitsy and Twine narrative games on itch.io. Trying to bridge into Unity for a junior studio role.,0,,,,"" +1215,t,GRE by August. Five applications by December. Funded admission for fall.,"",GRE Prep,Weekly,EEE senior. Self-studying GRE. Targeting US master's programs in signal processing.,0,,,,"" +1216,t,"Land a BA role at a tech company within six months. Build three portfolio projects with real data, not Kaggle.","",Career Switch,Weekly,"Career switcher. Three years teaching English, now self-studying SQL and Tableau to move into business analysis.",0,,,,"" +1222,t,Validate or kill the idea by winter. Either is a win.,"",Startup Ideas,Weekly,Business senior at Sakarya. Working on a logistics-SaaS idea for Anatolian SMBs.,0,,,,"" +1229,t,AWS SAA by August. Junior cloud role within 6 months.,"",Cloud,Weekly,CS senior in Antalya. AWS Associate prep in motion.,0,,,,"" +1233,t,BA role within 4 months. Use the rigor from MEng for something that doesn't smell of machine oil.,"",Business Analysis,Weekly,Mechanical engineer turned BA in training. Three years of manufacturing rigor I want to use differently.,0,,,,"" +1250,t,Three playable levels by autumn.,"",Level Design,Weekly,MEF visual design senior. Level design portfolio in progress.,0,,,,"" +1238,t,"First Flutter app shipped, internship in Ankara.","",Mobile Development,Weekly,Gazi CS sophomore. Mamak local. Just-started Flutter learner.,0,,,,"" +1241,t,"Sustainable study habits, no all-nighters before thesis season.","",Study Habits,Weekly,"IE junior. Tried twice to ""fix my productivity."" Trying once more with a mentor.",0,,,,"" +1243,t,Junior PM role in 6 months. One feature launch I owned.,"",Stakeholder Communication,Weekly,"Uludağ CS senior, Bursa. PM in training. Working on the harder conversations.",0,,,,"" +1249,t,SEO specialist in 5 months.,"",SEO,Weekly,Marketing senior. SEO-focused. Audit + improvement loops.,0,,,,"" +1251,t,Comfortable speaking in front of 20+ people within a year. Senior IC track or management within three.,"",Public Speaking,Weekly,Bahçeşehir CS senior. Engineer working on the soft-skill ceiling.,0,,,,"" +1253,t,AWS CP + SAA. Remote cloud role.,"",Cloud Fundamentals,Weekly,MKU CS senior in Hatay. Remote-first by necessity and design.,0,,,,"" +1254,t,Remote data-engineer role within 6 months.,"",ETL,Weekly,Gaziantep CS senior. ETL on local open-data.,0,,,,"" +1259,t,Two master's applications with a recital recording I'd defend at the dinner table.,Piano Performance,Music Performance,Weekly,"Mimar Sinan piano performance, third year. Targeting European master's programs in autumn.",0,,,,Mimar Sinan State Conservatory +1261,t,First paid commission. Bologna illustrators' wall submission.,Graphic Design,Illustration,Weekly,Anadolu fine arts senior. Illustrator working toward book commissions.,0,,,,Anadolu University Fine Arts +1265,t,One indie company cast. One international workshop.,Performing Arts,Theatre Acting,Weekly,Dokuz Eylül performing arts senior. Theater actor in training.,0,,,,Dokuz Eylul Fine Arts +1267,t,"By autumn: a clear yes/no on whether I apply to PhDs or pursue a research role in industry. Either with someone I've worked with for 6 months, not three weeks.",Computer Science,Machine Learning Research,Weekly,CS senior at Bilkent. Researching ML interpretability with a faculty supervisor. Decisive about wanting a long-term mentor this time around.,0,,,,Bilkent University +1236,t,Ship one iOS app this summer. Internship in fall.,"",Swift,Weekly,TOBB ETU CS sophomore. Just started iOS this month.,0,,,,"" +1237,t,"Candidate Master by year-end. Strong engineering role with depth, not breadth.","",Algorithms,Weekly,METU CS junior. Codeforces specialist. Strong in algorithms; learning to translate that into product work.,0,,,,"" +1240,t,MVP by autumn. Validate or move on by year-end.,"",Startup Ideas,Weekly,Business senior in Denizli. Building a food-tech idea for Anatolian SMBs.,0,,,,"" +1242,t,Junior DS role in 6 months. One Kaggle top-10% finish.,"",Data Science,Weekly,IU CS senior. Data-science-curious. Pandas every day.,0,,,,"" +1246,t,First job in a team where I can grow into senior in 3 years.,"",Full Stack Development,Weekly,"Bogazici CS senior, full-stack-leaning. Working with Melis Sezen on systems depth.",0,1195,,,"" +1260,t,"One festival-submission short, picture-locked and sound-mixed, by year end.",Cinema & TV,Filmmaking,Weekly,"Cinema & TV senior in Bursa. Two student shorts behind me, one in progress with Tarık's mentorship.",0,,,,Bursa Uludag University +1262,t,One story placed; one collection draft finished.,Comparative Literature,Creative Writing,Weekly,ComparLit senior in Adana. Short-fiction writer. Mornings only.,0,,,,Cukurova University +1264,t,French patisserie stage. 12 desserts in the portfolio book.,Gastronomy & Culinary Arts,Pastry,Weekly,Özyeğin gastronomy senior. Part-time pastry station at a Beyoğlu bistro.,0,,,,Ozyegin University +1207,t,Pass AWS SAA-C03 by August. Land a junior platform engineering role by graduation.,"",Cloud Fundamentals,Weekly,Industrial engineering senior pivoting toward cloud and DevOps. Self-studying AWS and Docker on weekends.,0,1200,,,"" +1219,t,Ship a Flutter app to Play Store by August. Apply to mobile-first startups in fall.,"",Flutter,Weekly,"CS junior at Sabanci, Flutter hobbyist, aspiring product-builder.",0,,,,"" +1226,t,Formal club by next semester. Five classmates applying with me.,"",Campus Networking,Weekly,"IE junior, OMU. Running an informal study-abroad support group on campus.",0,,,,"" +1230,t,First ML role in 8 months. Silver medal on Kaggle as a milestone.,"",Machine Learning,Weekly,Stats senior in Bornova. ML-focused. Kaggle every weekend.,0,,,,"" +1235,t,First fintech role in 6 months. One real risk model live in my GitHub.,"",FinTech,Weekly,"Financial engineering senior at Hacettepe. Python-fluent, engineering-curious.",0,,,,"" +1244,t,PM internship this summer.,"",Product Management,Weekly,YTU CS senior. PM-curious. Working on the public speaking gap.,0,,,,"" +1252,t,Two Swift apps live this year. iOS-focused first role.,"",Swift,Weekly,"Sabancı CS junior. Pendik local. iOS-leaning, prolific.",0,,,,"" +1263,t,One documentary essay finished. 6x6 application submitted.,Photography,Documentary Photography,Weekly,Akdeniz Photography senior in Antalya. Documentary-focused. Mentored by Aslı.,0,,,,Akdeniz University Fine Arts +1210,t,Ship to TestFlight by August. Apply to junior mobile roles in September with a real app in hand.,"",iOS Development,Weekly,CS junior in Erzurum. Learning Swift on a hand-me-down MacBook. Closer to my first app every week.,0,,,,"" +1213,t,"First role in an AI product team that values responsible-AI work as part of the engineering, not bolted on.","",Prompting,Weekly,CS senior at Marmara. Spent last semester building a student-services chatbot and discovering how much I didn't know about edge cases. Now I take responsible-AI questions seriously.,0,,,,"" +1217,t,Security internship by July. OSCP by next May. Get my first real bug bounty hall-of-fame credit.,"",Ethical Hacking,Weekly,"CS junior, Esenyurt-based, CTF regular. Targeting a security internship for summer and OSCP within a year.",0,1201,,,"" +1223,t,Remote smart-contract role within a year. Five contract audits as portfolio.,"",Smart Contracts,Weekly,"CS senior in Diyarbakır. Solidity learner, audit-curious. Remote-only by necessity and choice.",0,,,,"" +1234,t,Junior frontend role in 4 months. Three deployed personal apps.,"",Portfolio Review,Weekly,CS junior in Adana. React-focused. Clone-as-learning.,0,,,,"" +1239,t,"Contribute to one DeFi protocol this year. Real PR, not just docs.","",Blockchain,Weekly,"Bahcesehir CS junior. Slow, deliberate Web3 learner. Whitepapers > Twitter.",0,,,,"" +1245,t,Junior content strategist in 4 months. Three real audits in portfolio.,"",Content Strategy,Weekly,Communications senior. Content writer learning data.,0,,,,"" +1248,t,Hiking-trail app shipped. Mobile-first first job.,"",Flutter,Weekly,ITU CS senior in Sarıyer. Flutter + outdoors.,0,1197,,,"" +1266,t,Twelve-episode podcast live by year-end.,Communications Design,Podcasting,Weekly,Bilgi comms senior. Podcaster building a 12-episode history series. Audio mentorship with Selen.,0,,,,Bilgi University diff --git a/scripts/seed_snapshot_data/data/mentor_availability_slots.csv b/scripts/seed_snapshot_data/data/mentor_availability_slots.csv new file mode 100644 index 00000000..9d20dec4 --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentor_availability_slots.csv @@ -0,0 +1,41 @@ +id,mentor_id,day_of_week,start_time,end_time,recurring +283,1195,THURSDAY,19:00:00,20:00:00,t +284,1196,TUESDAY,19:00:00,20:00:00,t +285,1198,MONDAY,19:00:00,20:00:00,t +286,1198,TUESDAY,19:00:00,20:00:00,t +287,1198,THURSDAY,19:00:00,20:00:00,t +288,1198,FRIDAY,19:00:00,20:00:00,t +289,1201,WEDNESDAY,19:00:00,20:00:00,t +290,1201,FRIDAY,19:00:00,20:00:00,t +291,1201,SATURDAY,19:00:00,20:00:00,t +292,1202,MONDAY,19:00:00,20:00:00,t +293,1202,FRIDAY,19:00:00,20:00:00,t +294,1203,WEDNESDAY,19:00:00,20:00:00,t +295,1204,MONDAY,19:00:00,20:00:00,t +296,1204,WEDNESDAY,19:00:00,20:00:00,t +297,1204,FRIDAY,19:00:00,20:00:00,t +298,1206,MONDAY,19:00:00,20:00:00,t +299,1206,THURSDAY,19:00:00,20:00:00,t +300,1206,SATURDAY,19:00:00,20:00:00,t +301,1206,SUNDAY,19:00:00,20:00:00,t +302,1255,TUESDAY,19:00:00,20:00:00,t +303,1255,THURSDAY,19:00:00,20:00:00,t +304,1256,WEDNESDAY,19:00:00,20:00:00,t +305,1256,SATURDAY,19:00:00,20:00:00,t +306,1257,MONDAY,19:00:00,20:00:00,t +307,1258,FRIDAY,19:00:00,20:00:00,t +308,1268,TUESDAY,19:00:00,20:00:00,t +309,1268,THURSDAY,19:00:00,20:00:00,t +310,1269,MONDAY,19:00:00,20:00:00,t +311,1270,WEDNESDAY,19:00:00,20:00:00,t +312,1270,FRIDAY,19:00:00,20:00:00,t +313,1271,MONDAY,19:00:00,20:00:00,t +314,1271,WEDNESDAY,19:00:00,20:00:00,t +315,1197,SATURDAY,19:00:00,20:00:00,t +316,1197,SUNDAY,14:00:00,15:00:00,t +317,1199,MONDAY,19:00:00,20:00:00,t +318,1199,WEDNESDAY,14:00:00,15:00:00,t +319,1200,TUESDAY,19:00:00,20:00:00,t +320,1200,SATURDAY,14:00:00,15:00:00,t +321,1205,MONDAY,19:00:00,20:00:00,t +322,1205,SATURDAY,14:00:00,15:00:00,t diff --git a/scripts/seed_snapshot_data/data/mentor_interests.csv b/scripts/seed_snapshot_data/data/mentor_interests.csv new file mode 100644 index 00000000..414aa7fe --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentor_interests.csv @@ -0,0 +1,52 @@ +mentor_id,interest,identifier_uri +1195,System Design, +1195,Cloud Architecture, +1195,Backend Engineering, +1196,Digital Marketing, +1196,Brand Strategy, +1196,Discovery Calls, +1197,Production, +1198,Academic Career, +1198,Public Speaking, +1199,Startup Operations, +1199,Finance, +1199,Fundraising, +1200,Cloud Architecture, +1200,System Design, +1201,Threat Modeling, +1201,Zero Trust, +1201,Backend Engineering, +1202,Engineering Management, +1202,Hiring, +1203,Fundraising, +1203,Go-to-Market, +1204,Java, +1204,Backend Engineering, +1205,Model Risk, +1205,Responsible Innovation, +1206,Product Design, +1206,UI/UX Strategy, +1255,Music Production, +1255,Songwriting, +1255,Music Theory, +1256,Illustration, +1256,Visual Storytelling, +1256,Digital Painting, +1257,Photography, +1257,Photojournalism, +1257,Editing, +1258,Filmmaking, +1258,Cinematography, +1258,Film Editing, +1268,Machine Learning, +1268,AI Interpretability, +1268,Research Engineering, +1269,AI Policy, +1269,Academic Career, +1269,Research Leadership, +1270,AI Safety, +1270,Startup Founding, +1270,MLOps, +1271,Mobile Engineering, +1271,Flutter, +1271,Engineering Leadership, diff --git a/scripts/seed_snapshot_data/data/mentor_preferred_mentee_skills.csv b/scripts/seed_snapshot_data/data/mentor_preferred_mentee_skills.csv new file mode 100644 index 00000000..5a237ead --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentor_preferred_mentee_skills.csv @@ -0,0 +1,40 @@ +mentor_id,skill,identifier_uri +1195,System Design, +1195,Cloud Architecture, +1196,Digital Marketing, +1196,Brand Strategy, +1197,Production, +1198,Academic Career, +1198,Public Speaking, +1199,Startup Operations, +1199,Finance, +1200,Cloud Architecture, +1200,System Design, +1201,Threat Modeling, +1201,Zero Trust, +1202,Engineering Management, +1202,Hiring, +1203,Fundraising, +1203,Go-to-Market, +1204,Java, +1204,Backend Engineering, +1205,Model Risk, +1205,Responsible Innovation, +1206,Product Design, +1206,UI/UX Strategy, +1255,Music Production, +1255,Songwriting, +1256,Illustration, +1256,Digital Painting, +1257,Photography, +1257,Photojournalism, +1258,Filmmaking, +1258,Cinematography, +1268,Machine Learning, +1268,Research, +1269,Research, +1269,AI Policy, +1270,Machine Learning, +1270,AI Safety, +1271,Flutter, +1271,Mobile Development, diff --git a/scripts/seed_snapshot_data/data/mentor_ratings.csv b/scripts/seed_snapshot_data/data/mentor_ratings.csv new file mode 100644 index 00000000..0980b484 --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentor_ratings.csv @@ -0,0 +1,46 @@ +id,mentorship_id,mentor_id,mentee_id,score,comment,created_at +1,33,1195,1229,3,Good engagement overall — a few sessions could have been longer.,2025-08-28 00:00:00+00 +2,34,1196,1226,4,Best mentor I've worked with so far in my career.,2026-01-11 00:00:00+00 +3,35,1197,1210,3,Useful for the specific question I came in with.,2025-04-01 00:00:00+00 +4,36,1197,1216,5,Brought structure and patience to a mentorship that I needed exactly when I needed it.,2025-10-09 00:00:00+00 +5,37,1197,1267,2,Met expectations; nothing transformative.,2025-08-14 00:00:00+00 +6,38,1199,1210,4,Good engagement overall — a few sessions could have been longer.,2025-03-10 00:00:00+00 +7,39,1200,1234,3,Good engagement overall — a few sessions could have been longer.,2026-04-28 00:00:00+00 +8,40,1200,1216,4,Best mentor I've worked with so far in my career.,2026-01-14 00:00:00+00 +9,41,1201,1265,2,Met expectations; nothing transformative.,2025-07-09 00:00:00+00 +10,42,1201,1262,5,"Honest feedback, never sugarcoated, always actionable.",2025-11-30 00:00:00+00 +11,43,1202,1230,5,Best mentor I've worked with so far in my career.,2025-05-28 00:00:00+00 +12,44,1202,1240,4,Saved me from a year of bad decisions in three sessions.,2026-03-03 00:00:00+00 +13,45,1202,1246,5,Demanding in the best way. Pushed me to do work I'm proud of.,2026-01-03 00:00:00+00 +14,46,1203,1244,4,Solid mentor; structured calls and good follow-up.,2026-02-17 00:00:00+00 +15,47,1204,1230,3,Useful for the specific question I came in with.,2025-10-31 00:00:00+00 +16,48,1204,1214,5,Demanding in the best way. Pushed me to do work I'm proud of.,2025-07-24 00:00:00+00 +17,49,1204,1247,5,Demanding in the best way. Pushed me to do work I'm proud of.,2025-08-03 00:00:00+00 +18,50,1205,1261,5,"Honest feedback, never sugarcoated, always actionable.",2026-05-02 00:00:00+00 +19,51,1206,1238,4,Brought structure and patience to a mentorship that I needed exactly when I needed it.,2025-04-10 00:00:00+00 +20,52,1206,1265,4,Helped me leave with more clarity than I came in with.,2026-01-26 00:00:00+00 +21,53,1257,1254,3,Practical advice. Some lessons I needed to learn the hard way myself.,2026-03-21 00:00:00+00 +22,54,1258,1252,3,Good engagement overall — a few sessions could have been longer.,2025-03-07 00:00:00+00 +23,55,1258,1230,4,Best mentor I've worked with so far in my career.,2025-06-07 00:00:00+00 +24,56,1258,1211,4,"Patient with my false starts, sharp when I needed it.",2025-08-10 00:00:00+00 +25,57,1270,1231,5,Brought structure and patience to a mentorship that I needed exactly when I needed it.,2026-02-24 00:00:00+00 +26,58,1270,1227,3,Practical advice. Some lessons I needed to learn the hard way myself.,2026-03-25 00:00:00+00 +27,59,1270,1243,3,Useful for the specific question I came in with.,2025-10-17 00:00:00+00 +28,30,1198,1267,5,"The daily-journal rule was the most important thing I did this year. Dilara was direct, patient, and willing to give me an honest answer about whether research was for me. Highly recommend.",2025-07-05 00:00:00+00 +29,60,1268,1236,4,Senior-level perspective delivered patiently. Highly recommend.,2025-09-30 00:00:00+00 +30,61,1268,1245,4,Best engagement I've had on this platform.,2025-10-24 00:00:00+00 +31,62,1269,1209,4,Honest feedback and real-world examples. Worth every session.,2025-09-10 00:00:00+00 +32,63,1269,1238,3,Honest feedback and real-world examples. Worth every session.,2025-10-02 00:00:00+00 +33,64,1271,1211,4,"Direct, focused, and exactly the kind of mentor I needed at this stage.",2026-03-11 00:00:00+00 +34,65,1271,1247,4,Best engagement I've had on this platform.,2026-02-17 00:00:00+00 +35,66,1195,1251,5,Brought clarity to a year of confusion in two sessions.,2025-12-10 00:00:00+00 +36,67,1196,1227,4,The right kind of demanding — pushed me to do work I'm proud of.,2025-09-23 00:00:00+00 +37,68,1198,1251,4,Useful for the questions I came in with.,2026-01-09 00:00:00+00 +38,69,1199,1230,3,Good engagement overall. Practical advice.,2025-06-17 00:00:00+00 +39,70,1203,1248,4,"Senior craft + accessibility. Hard combination, found it here.",2025-11-18 00:00:00+00 +40,71,1205,1219,5,The right kind of demanding — pushed me to do work I'm proud of.,2025-07-23 00:00:00+00 +41,72,1255,1225,3,Good engagement overall. Practical advice.,2025-11-14 00:00:00+00 +42,73,1255,1238,3,Solid mentor; well-structured sessions.,2026-03-17 00:00:00+00 +43,74,1256,1212,4,Senior-level perspective delivered with care.,2026-03-02 00:00:00+00 +44,75,1256,1250,4,Brought clarity to a year of confusion in two sessions.,2025-09-25 00:00:00+00 +45,76,1257,1265,3,Solid mentor; well-structured sessions.,2025-07-14 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/mentors.csv b/scripts/seed_snapshot_data/data/mentors.csv new file mode 100644 index 00000000..8501b75d --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentors.csv @@ -0,0 +1,21 @@ +id,bio,field,expertise,affiliation,max_mentee_capacity,current_mentee_count,preferred_mentee_major,mentoring_goals,mentorship_duration,expertise_uri,field_uri,preferred_mentee_major_uri,profile_visibility +1202,"Director of Engineering at a marketplace company, leading three teams (~25 engineers). Came up through backend, switched to management at the seven-year mark. I mentor seniors thinking about the transition.",Engineering Management,Engineering Management,"",2,0,,"First month: do you actually want this. Months 2-3: if yes, the practical reps — 1:1s, hiring loops, navigating an unhappy team. If no, we spend the time on what you actually want instead.",3,,,,t +1203,"Co-founder/CEO of a developer tools startup, just past one year post-seed. Sold to engineers for a living. Mentor one founder at a time through whatever they're stuck on.",Startup Founding,Fundraising,"",1,0,,"3 months on your actual current bottleneck. Not ""general founder coaching."" If you're stuck on hiring, we do hiring. If it's pricing, we do pricing. Pre-meeting agenda before every session.",3,,,,t +1204,"Staff Engineer at a payments processor. Most of my work is in Java/Spring on systems with no tolerance for downtime. I mentor people moving from mid-level to senior who want depth, not breadth.",Backend Engineering,Java,"",4,0,,"One-month engagement, focused. Pick one piece of code you wrote in the last quarter and we'll tear it apart, then rebuild it together with the trade-offs articulated. That's the whole curriculum.",1,,,,t +1197,"Senior Producer in mobile games, nine years deep. Currently running live ops for a casual title with ~2M MAU. Living in Erzurum now, slower pace, better thinking. I take one mentee at a time so I can be present for them.",Game Industry,Production,"",1,1,,"6 months together. Mentee leaves with a clear-eyed view of what production actually looks like, plus a concrete next step — internship, portfolio piece, or graceful exit if it's not the right field for them.",1,,,,t +1196,Marketing leader with eight years across agency and SaaS. Currently leading growth at a B2B Series B in Ankara. I work best with mentees who want to stop running tactics and start thinking about who their customer actually is.,Digital Marketing,Digital Marketing,"",4,0,,"By the end of 3 months I want my mentee to be able to walk into any room and answer ""who is this for and why now?"" without flinching. Tactics come later; positioning first.",1,,,,t +1199,"Exited founder, two-time first-time-founder (the second time worked). Now angel-investing in early-stage SaaS and mentoring people who think they want to start something. I'll tell you straight when I think you shouldn't.",Entrepreneurship,Startup Operations,"",4,0,,"3 months. By the end you have a clear answer — yes, no, or ""not yet"" — to whether founding is your next step. If yes, you have a problem worth solving and a partner you trust. If no, that's also a win.",1,,,,t +1200,Principal SRE at a payments company. I run a small team and we're on-call for systems people don't notice — exactly how it should be. I take mentees who want to move toward platform/SRE work and want to do it right.,Cloud Architecture,Cloud Architecture,"",4,1,,"By month 3 we will have stood up a small reliable service together, walked through one synthetic incident, and you will have a written runbook in your own voice. If you can do those three things, you're employable as an SRE.",3,,,,t +1206,Independent product design consultant. Spent six years building product design teams in Istanbul before moving to Ordu for the slower water. I take one mentee per quarter — usually a mid-level designer trying to grow into product leadership.,UI/UX Strategy,Product Design,"",1,0,,"Three months. By the end you have one case study in your portfolio that is honest about impact (not just craft), one design critique you've led at a higher level, and a clearer sense of where you want to be in two years.",6,,,,t +1195,"12 years in backend and systems architecture. Ex-Senior Engineer at Trendyol, now part-time CTO at three startups. Spring + JVM ecosystem is my home, but I've spent serious time on AWS, GCP, and Postgres. I try to confront mentees with real production problems, not toy ones.",Cloud Architecture,System Design,"",4,1,,"Over a 3-month engagement I want to work through at least two non-trivial design problems with a mentee — drafting a migration plan from scratch, analyzing an existing single-point-of-failure. The exit is not ""junior"" but ""you can solve this kind of thing on your own.""",3,,,,t +1257,"Documentary photographer, eight years at AA, now freelance from Konya. Mentor photographers moving toward serious documentary or journalism work.",Photography,Photojournalism,"Documentary photographer, ex-AA Photo",2,0,,"3 months. Mentee produces one finished short essay (10-15 images + 800 words), reports through a real story, and learns how to caption ethically.",3,,,,t +1269,"CS faculty at Bilkent, visiting director of PhD admissions at ETH (AI policy track). I take one external mentee per cycle for serious graduate-prep work.",AI Policy,Academic Career Advising,"Director of PhD Admissions, ETH Zurich (visiting)",1,0,,"Six months. End with: research statement publication-ready, target advisor shortlist with realistic probability assessments, and a clear yes/no on whether this is the year.",6,,,,t +1270,Founder of a model-evaluations startup. Ex-OpenAI (alignment team). I mentor people moving toward AI safety as a serious career. Six-month engagements minimum.,AI Safety,Model Evaluations,"Founder, model-evals startup (ex-OpenAI)",2,0,,"End of six months: my mentee has shipped a real eval (released to the field), can articulate where they think alignment work has been overrated and where it's been underrated, and has chosen a concrete next step (industry / PhD / found something / leave the field).",3,,,,t +1198,"Associate Professor in Computer Science, with a research program in ML interpretability. I've supervised nine PhDs and I take one external mentee per cycle for graduate-prep work.",Research Leadership,Academic Career,"",1,1,,"A mentee leaves with: (1) a research statement that survives a friendly hostile read, (2) three target advisors with concrete reasons, (3) a writing routine they can sustain. We don't talk about GPAs.",6,,,,t +1256,"Freelance illustrator, ~70 published book covers across Turkish and English publishers. Mentor illustrators moving from student work to first commercial projects.",Illustration,Visual Storytelling,"Freelance illustrator, book covers",2,0,,"3 months. Mentee ships three commissioned-quality illustrations with clear narrative intent, plus a one-page rate card and pitch email that doesn't read like a CV.",3,,,,t +1255,"Music producer and songwriter, 10 years across studio and home setups. Bandista alumna. I mentor songwriters and producers who want to ship records, not chase a sound.",Music Production,Songwriting,"Producer at an indie label, Bandista alumna",3,0,,"Six months together. We finish one EP — three songs minimum — written, recorded, mixed. The mentee leaves with a release plan and the artistic confidence to do the next one alone.",6,,,,t +1268,"Senior research scientist at an industry ML lab. Interpretability for production-scale models. PhD in EU, six years industry research. I take one mentee at a time, six-month engagement minimum.",Machine Learning Research,ML Interpretability,"Senior Research Scientist, industry ML lab",2,0,,"End of six months: one piece of writing — short paper draft, position essay, or PhD research statement — that I'd sign off on with my name visible.",6,,,,t +1271,"Staff Engineer, mobile (Flutter). Architecture lead on a ~30-engineer multi-platform stack. Mentor people moving from solo shipping to small-team leadership.",Mobile Engineering,Flutter Architecture,Staff Engineer at a unicorn (mobile-first),2,1,,"Six months. End with: mentee has led one feature that shipped through the full review/release cycle, written one architecture decision record, and ran their first cross-team meeting cleanly.",6,,,,t +1201,"Security architect at a global manufacturer. Background spans embedded, comms, and now OT/IT convergence. I mentor people moving into security from adjacent disciplines (sysadmin, dev, network).",Security Architecture,Threat Modeling,"",2,1,,"You will end three months able to read a system diagram and produce a usable threat model in under two hours. We will do real ones, on real-ish systems. No CTF puzzles.",1,,,,t +1205,"Responsible AI lead at a regulated financial institution. I focus on the operational side: model documentation, validation, monitoring, and the questions auditors actually ask. I mentor one person per cycle who wants to do this work seriously.",AI Governance,Model Risk,"",1,0,,"6 months. By the end, you can walk into a model-risk committee meeting, read a model documentation pack critically, and ask the right questions. That's a marketable skill not enough people have.",1,,,,t +1258,"Cinematographer, three festival features (one at Antalya Altın Portakal), teach part-time at MSGSU. Mentor one young filmmaker per cycle. We make a short together.",Filmmaking,Cinematography,"DOP on three festival features, teaches at MSGSU",1,0,,"6 months. One short film, picture-locked, sound-mixed. Mentee writes, directs, edits; I shoot and consult. Festival submission is the closing artifact.",6,,,,t diff --git a/scripts/seed_snapshot_data/data/mentorship_requests.csv b/scripts/seed_snapshot_data/data/mentorship_requests.csv new file mode 100644 index 00000000..e5a2dad7 --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentorship_requests.csv @@ -0,0 +1,55 @@ +id,mentee_id,mentor_id,message,status,created_at,updated_at +23,1246,1195,I've been following your posts for a while. I'm a final-year CS student trying to step beyond 'just writes code' and would like to spend three months working with you on system design specifically. I'm prepared to put the time in.,ACCEPTED,2026-05-13 08:02:55.774545+00,2026-05-13 08:02:55.891248+00 +24,1248,1197,"I'm a CS senior who loves hiking and Flutter equally. I'm not sure if I want to be a mobile dev or a game dev, and I think six months with someone who's lived both sides would help me decide honestly.",ACCEPTED,2026-05-13 08:02:56.093511+00,2026-05-13 08:02:56.102973+00 +25,1211,1198,"Hocam, I'm a first-gen CS senior at Bogazici applying for PhDs this cycle. I would value your time on the research statement specifically — three months feels like exactly the right scope.",ACCEPTED,2026-05-13 08:02:56.272383+00,2026-05-13 08:02:56.281265+00 +26,1207,1200,"I'm pivoting from industrial engineering into platform/SRE. I want to do it right, not just collect certs. Three months of structured work would mean a lot.",ACCEPTED,2026-05-13 08:02:56.450705+00,2026-05-13 08:02:56.459974+00 +27,1217,1201,"I'm a CS junior obsessed with security, CTFs, and HTB. I know I need to grow into a real engineer, not just a CTF player. Six months with someone who's done that transition would mean the world.",ACCEPTED,2026-05-13 08:02:56.633538+00,2026-05-13 08:02:56.642902+00 +28,1231,1271,I'm a senior CS student who ships Flutter aggressively but I keep hitting the architecture wall on my fourth feature. I want six months with someone who's led mobile teams to teach me what I'm missing — without making me precious about the work.,ACCEPTED,2026-05-13 08:02:56.819207+00,2026-05-13 08:02:56.829725+00 +29,1216,1196,I'm an English teacher pivoting to tech and I keep undermining myself in cover letters. I want three months with a marketing lead to fix the way I describe what I bring.,ACCEPTED,2025-04-08 00:00:00+00,2025-04-08 00:00:00+00 +30,1267,1198,"Hocam, I'm a Bilkent CS junior researching ML interpretability. Three months is short, but I think I need a short, honest engagement first — to find out whether this path actually fits before I commit to anything longer.",ACCEPTED,2025-03-30 00:00:00+00,2025-03-30 00:00:00+00 +31,1222,1199,I'm a business senior with a logistics-SaaS idea for Anatolian SMBs. I've been daydreaming about it for a year. I need someone to help me decide whether it's real or not — three months of structured work.,ACCEPTED,2025-08-17 00:00:00+00,2025-08-17 00:00:00+00 +32,1267,1199,I'm a CS senior fence-sitting between research and founding. Could we do a deliberately short engagement — one month — to test whether founding fits before I commit a longer block to either path?,ACCEPTED,2025-03-31 00:00:00+00,2025-03-31 00:00:00+00 +33,1229,1195,(historical record),ACCEPTED,2025-02-21 00:00:00+00,2025-02-21 00:00:00+00 +34,1226,1196,(historical record),ACCEPTED,2025-10-04 00:00:00+00,2025-10-04 00:00:00+00 +35,1210,1197,(historical record),ACCEPTED,2025-02-21 00:00:00+00,2025-02-21 00:00:00+00 +36,1216,1197,(historical record),ACCEPTED,2025-07-06 00:00:00+00,2025-07-06 00:00:00+00 +37,1267,1197,(historical record),ACCEPTED,2025-02-08 00:00:00+00,2025-02-08 00:00:00+00 +38,1210,1199,(historical record),ACCEPTED,2025-02-03 00:00:00+00,2025-02-03 00:00:00+00 +39,1234,1200,(historical record),ACCEPTED,2026-01-23 00:00:00+00,2026-01-23 00:00:00+00 +40,1216,1200,(historical record),ACCEPTED,2025-10-12 00:00:00+00,2025-10-12 00:00:00+00 +41,1265,1201,(historical record),ACCEPTED,2025-01-06 00:00:00+00,2025-01-06 00:00:00+00 +42,1262,1201,(historical record),ACCEPTED,2025-10-24 00:00:00+00,2025-10-24 00:00:00+00 +43,1230,1202,(historical record),ACCEPTED,2025-04-19 00:00:00+00,2025-04-19 00:00:00+00 +44,1240,1202,(historical record),ACCEPTED,2025-09-01 00:00:00+00,2025-09-01 00:00:00+00 +45,1246,1202,(historical record),ACCEPTED,2025-11-26 00:00:00+00,2025-11-26 00:00:00+00 +46,1244,1203,(historical record),ACCEPTED,2025-11-13 00:00:00+00,2025-11-13 00:00:00+00 +47,1230,1204,(historical record),ACCEPTED,2025-09-25 00:00:00+00,2025-09-25 00:00:00+00 +48,1214,1204,(historical record),ACCEPTED,2025-04-20 00:00:00+00,2025-04-20 00:00:00+00 +49,1247,1204,(historical record),ACCEPTED,2025-04-29 00:00:00+00,2025-04-29 00:00:00+00 +50,1261,1205,(historical record),ACCEPTED,2025-10-26 00:00:00+00,2025-10-26 00:00:00+00 +51,1238,1206,(historical record),ACCEPTED,2025-03-04 00:00:00+00,2025-03-04 00:00:00+00 +52,1265,1206,(historical record),ACCEPTED,2025-12-20 00:00:00+00,2025-12-20 00:00:00+00 +53,1254,1257,(historical record),ACCEPTED,2026-02-14 00:00:00+00,2026-02-14 00:00:00+00 +54,1252,1258,(historical record),ACCEPTED,2025-01-29 00:00:00+00,2025-01-29 00:00:00+00 +55,1230,1258,(historical record),ACCEPTED,2025-05-02 00:00:00+00,2025-05-02 00:00:00+00 +56,1211,1258,(historical record),ACCEPTED,2025-05-07 00:00:00+00,2025-05-07 00:00:00+00 +57,1231,1270,(historical record),ACCEPTED,2026-01-18 00:00:00+00,2026-01-18 00:00:00+00 +58,1227,1270,(historical record),ACCEPTED,2026-02-19 00:00:00+00,2026-02-19 00:00:00+00 +59,1243,1270,(historical record),ACCEPTED,2025-09-10 00:00:00+00,2025-09-10 00:00:00+00 +60,1236,1268,(historical),ACCEPTED,2025-08-28 00:00:00+00,2025-08-28 00:00:00+00 +61,1245,1268,(historical),ACCEPTED,2025-07-23 00:00:00+00,2025-07-23 00:00:00+00 +62,1209,1269,(historical),ACCEPTED,2025-06-05 00:00:00+00,2025-06-05 00:00:00+00 +63,1238,1269,(historical),ACCEPTED,2025-03-31 00:00:00+00,2025-03-31 00:00:00+00 +64,1211,1271,(historical),ACCEPTED,2026-02-03 00:00:00+00,2026-02-03 00:00:00+00 +65,1247,1271,(historical),ACCEPTED,2025-11-16 00:00:00+00,2025-11-16 00:00:00+00 +66,1251,1195,(historical),ACCEPTED,2025-06-07 00:00:00+00,2025-06-07 00:00:00+00 +67,1227,1196,(historical),ACCEPTED,2025-08-18 00:00:00+00,2025-08-18 00:00:00+00 +68,1251,1198,(historical),ACCEPTED,2025-12-05 00:00:00+00,2025-12-05 00:00:00+00 +69,1230,1199,(historical),ACCEPTED,2025-05-09 00:00:00+00,2025-05-09 00:00:00+00 +70,1248,1203,(historical),ACCEPTED,2025-08-12 00:00:00+00,2025-08-12 00:00:00+00 +71,1219,1205,(historical),ACCEPTED,2025-04-18 00:00:00+00,2025-04-18 00:00:00+00 +72,1225,1255,(historical),ACCEPTED,2025-08-09 00:00:00+00,2025-08-09 00:00:00+00 +73,1238,1255,(historical),ACCEPTED,2025-12-11 00:00:00+00,2025-12-11 00:00:00+00 +74,1212,1256,(historical),ACCEPTED,2025-08-25 00:00:00+00,2025-08-25 00:00:00+00 +75,1250,1256,(historical),ACCEPTED,2025-06-22 00:00:00+00,2025-06-22 00:00:00+00 +76,1265,1257,(historical),ACCEPTED,2025-04-09 00:00:00+00,2025-04-09 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/mentorships.csv b/scripts/seed_snapshot_data/data/mentorships.csv new file mode 100644 index 00000000..8d5b8df1 --- /dev/null +++ b/scripts/seed_snapshot_data/data/mentorships.csv @@ -0,0 +1,55 @@ +id,mentor_id,mentee_id,request_id,start_date,end_date,duration,status,shared_goal,created_at,terminated_at,terminated_by_user_id,cancellation_reason,updated_at +26,1200,1207,26,2026-05-13 08:02:56.459487+00,2026-08-13 08:02:56.459487+00,3,ACTIVE,Get Zeynep AWS SAA-certified and through a structured project that proves she can operate a small platform — not just take a test.,2026-05-13 08:02:56.462111+00,,,,2026-05-13 08:02:56.462111 +27,1201,1217,27,2026-05-13 08:02:56.642427+00,2026-11-13 08:02:56.642427+00,6,ACTIVE,"Cihan ends six months as a credible junior security engineer — not just a CTF player. He earns OSCP, lands a security internship, and produces three substantive bug reports.",2026-05-13 08:02:56.645159+00,,,,2026-05-13 08:02:56.645159 +28,1271,1231,28,2026-05-13 08:02:56.829223+00,2026-11-13 08:02:56.829223+00,6,ACTIVE,Take Rıza from a fast solo Flutter shipper to someone who can lead a small mobile team — without crushing the shipping instinct that got him this far.,2026-05-13 08:02:56.831719+00,,,,2026-05-13 08:02:56.831719 +29,1196,1216,29,2025-04-10 00:00:00+00,2025-07-09 00:00:00+00,3,COMPLETED,Help Buse reframe her teaching background as a marketing asset and land a junior BA / content role at a tech company before the end of the engagement.,2025-04-10 00:00:00+00,,,,2025-04-10 00:00:00 +30,1198,1267,30,2025-04-01 00:00:00+00,2025-06-30 00:00:00+00,3,COMPLETED,"Use 3 months to help Defne discover whether ML research is actually for her — not as a daydream, as a daily practice. Outcome: she leaves with a clear next step and an honest answer.",2025-04-01 00:00:00+00,,,,2025-04-01 00:00:00 +31,1199,1222,31,2025-08-19 00:00:00+00,2025-11-17 00:00:00+00,3,COMPLETED,"Help Funda decide, honestly, whether to commit to her logistics-SaaS idea or shelve it. Both outcomes are acceptable; ambiguity is not.",2025-08-19 00:00:00+00,,,,2025-08-19 00:00:00 +32,1199,1267,32,2025-04-02 00:00:00+00,2025-05-02 00:00:00+00,1,COMPLETED,One-month spike to test whether Defne should consider founding rather than research. Outcome: decision is made within four weeks.,2025-04-02 00:00:00+00,,,,2025-04-02 00:00:00 +33,1195,1229,33,2025-02-23 00:00:00+00,2025-08-22 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-02-23 00:00:00+00,,,,2025-02-23 00:00:00 +34,1196,1226,34,2025-10-06 00:00:00+00,2026-01-04 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-10-06 00:00:00+00,,,,2025-10-06 00:00:00 +35,1197,1210,35,2025-02-23 00:00:00+00,2025-03-25 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-02-23 00:00:00+00,,,,2025-02-23 00:00:00 +23,1195,1246,23,2026-05-13 08:02:55.85605+00,2026-08-13 08:02:55.85605+00,3,ACTIVE,"Move Tolga from a strong backend coder to a senior-track engineer who can lead a system-design conversation. Two real design problems, fully reasoned through, by end of three months.",2026-05-13 08:02:55.916362+00,,,,2026-05-13 08:02:55.916362 +24,1197,1248,24,2026-05-13 08:02:56.102447+00,2026-11-13 08:02:56.102447+00,6,ACTIVE,"Help İsmail decide, by month 3, whether games or product mobile is the right next step — and, if games, ship a vertical slice of a hiking-themed game prototype by month 6.",2026-05-13 08:02:56.104869+00,,,,2026-05-13 08:02:56.104869 +25,1198,1211,25,2026-05-13 08:02:56.280794+00,2026-08-13 08:02:56.280794+00,3,ACTIVE,"Mina's research statement, target advisor shortlist, and writing routine, all in shape by application season opening. The exit criterion: her recommender signs the statement without a substantive edit.",2026-05-13 08:02:56.283179+00,,,,2026-05-13 08:02:56.283179 +36,1197,1216,36,2025-07-08 00:00:00+00,2025-10-06 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-07-08 00:00:00+00,,,,2025-07-08 00:00:00 +37,1197,1267,37,2025-02-10 00:00:00+00,2025-08-09 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-02-10 00:00:00+00,,,,2025-02-10 00:00:00 +38,1199,1210,38,2025-02-05 00:00:00+00,2025-03-07 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-02-05 00:00:00+00,,,,2025-02-05 00:00:00 +39,1200,1234,39,2026-01-25 00:00:00+00,2026-04-25 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2026-01-25 00:00:00+00,,,,2026-01-25 00:00:00 +40,1200,1216,40,2025-10-14 00:00:00+00,2026-01-12 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-10-14 00:00:00+00,,,,2025-10-14 00:00:00 +41,1201,1265,41,2025-01-08 00:00:00+00,2025-07-07 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-01-08 00:00:00+00,,,,2025-01-08 00:00:00 +42,1201,1262,42,2025-10-26 00:00:00+00,2025-11-25 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-10-26 00:00:00+00,,,,2025-10-26 00:00:00 +43,1202,1230,43,2025-04-21 00:00:00+00,2025-05-21 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-04-21 00:00:00+00,,,,2025-04-21 00:00:00 +44,1202,1240,44,2025-09-03 00:00:00+00,2026-03-02 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-09-03 00:00:00+00,,,,2025-09-03 00:00:00 +45,1202,1246,45,2025-11-28 00:00:00+00,2025-12-28 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-11-28 00:00:00+00,,,,2025-11-28 00:00:00 +46,1203,1244,46,2025-11-15 00:00:00+00,2026-02-13 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-11-15 00:00:00+00,,,,2025-11-15 00:00:00 +47,1204,1230,47,2025-09-27 00:00:00+00,2025-10-27 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-09-27 00:00:00+00,,,,2025-09-27 00:00:00 +48,1204,1214,48,2025-04-22 00:00:00+00,2025-07-21 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-04-22 00:00:00+00,,,,2025-04-22 00:00:00 +49,1204,1247,49,2025-05-01 00:00:00+00,2025-07-30 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-05-01 00:00:00+00,,,,2025-05-01 00:00:00 +50,1205,1261,50,2025-10-28 00:00:00+00,2026-04-26 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-10-28 00:00:00+00,,,,2025-10-28 00:00:00 +51,1206,1238,51,2025-03-06 00:00:00+00,2025-04-05 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-03-06 00:00:00+00,,,,2025-03-06 00:00:00 +52,1206,1265,52,2025-12-22 00:00:00+00,2026-01-21 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-12-22 00:00:00+00,,,,2025-12-22 00:00:00 +53,1257,1254,53,2026-02-16 00:00:00+00,2026-03-18 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2026-02-16 00:00:00+00,,,,2026-02-16 00:00:00 +54,1258,1252,54,2025-01-31 00:00:00+00,2025-03-02 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-01-31 00:00:00+00,,,,2025-01-31 00:00:00 +55,1258,1230,55,2025-05-04 00:00:00+00,2025-06-03 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-05-04 00:00:00+00,,,,2025-05-04 00:00:00 +56,1258,1211,56,2025-05-09 00:00:00+00,2025-08-07 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-05-09 00:00:00+00,,,,2025-05-09 00:00:00 +57,1270,1231,57,2026-01-20 00:00:00+00,2026-02-19 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2026-01-20 00:00:00+00,,,,2026-01-20 00:00:00 +58,1270,1227,58,2026-02-21 00:00:00+00,2026-03-23 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2026-02-21 00:00:00+00,,,,2026-02-21 00:00:00 +59,1270,1243,59,2025-09-12 00:00:00+00,2025-10-12 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-09-12 00:00:00+00,,,,2025-09-12 00:00:00 +60,1268,1236,60,2025-08-30 00:00:00+00,2025-09-29 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-08-30 00:00:00+00,,,,2025-08-30 00:00:00 +61,1268,1245,61,2025-07-25 00:00:00+00,2025-10-23 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-07-25 00:00:00+00,,,,2025-07-25 00:00:00 +62,1269,1209,62,2025-06-07 00:00:00+00,2025-09-05 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-06-07 00:00:00+00,,,,2025-06-07 00:00:00 +63,1269,1238,63,2025-04-02 00:00:00+00,2025-09-29 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-04-02 00:00:00+00,,,,2025-04-02 00:00:00 +64,1271,1211,64,2026-02-05 00:00:00+00,2026-03-07 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2026-02-05 00:00:00+00,,,,2026-02-05 00:00:00 +65,1271,1247,65,2025-11-18 00:00:00+00,2026-02-16 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-11-18 00:00:00+00,,,,2025-11-18 00:00:00 +66,1195,1251,66,2025-06-09 00:00:00+00,2025-12-06 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-06-09 00:00:00+00,,,,2025-06-09 00:00:00 +67,1196,1227,67,2025-08-20 00:00:00+00,2025-09-19 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-08-20 00:00:00+00,,,,2025-08-20 00:00:00 +68,1198,1251,68,2025-12-07 00:00:00+00,2026-01-06 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-12-07 00:00:00+00,,,,2025-12-07 00:00:00 +69,1199,1230,69,2025-05-11 00:00:00+00,2025-06-10 00:00:00+00,1,COMPLETED,(historical record — concluded successfully),2025-05-11 00:00:00+00,,,,2025-05-11 00:00:00 +70,1203,1248,70,2025-08-14 00:00:00+00,2025-11-12 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-08-14 00:00:00+00,,,,2025-08-14 00:00:00 +71,1205,1219,71,2025-04-20 00:00:00+00,2025-07-19 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-04-20 00:00:00+00,,,,2025-04-20 00:00:00 +72,1255,1225,72,2025-08-11 00:00:00+00,2025-11-09 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-08-11 00:00:00+00,,,,2025-08-11 00:00:00 +73,1255,1238,73,2025-12-13 00:00:00+00,2026-03-13 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-12-13 00:00:00+00,,,,2025-12-13 00:00:00 +74,1256,1212,74,2025-08-27 00:00:00+00,2026-02-23 00:00:00+00,6,COMPLETED,(historical record — concluded successfully),2025-08-27 00:00:00+00,,,,2025-08-27 00:00:00 +75,1256,1250,75,2025-06-24 00:00:00+00,2025-09-22 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-06-24 00:00:00+00,,,,2025-06-24 00:00:00 +76,1257,1265,76,2025-04-11 00:00:00+00,2025-07-10 00:00:00+00,3,COMPLETED,(historical record — concluded successfully),2025-04-11 00:00:00+00,,,,2025-04-11 00:00:00 diff --git a/scripts/seed_snapshot_data/data/messages.csv b/scripts/seed_snapshot_data/data/messages.csv new file mode 100644 index 00000000..f0583bf6 --- /dev/null +++ b/scripts/seed_snapshot_data/data/messages.csv @@ -0,0 +1,101 @@ +id,conversation_id,sender_id,content,sent_at,read_at,attachment_id +136,20,1195,Welcome. First homework: send me the diagram of one system you've built that you're proudest of. Don't redraw it; send me what you actually had at the time.,2026-03-30 00:00:00+00,, +137,20,1246,Attaching the message queue diagram. The 'persistence' label is doing a lot of work that the system isn't actually doing. Embarrassing in retrospect.,2026-03-31 00:00:00+00,, +138,20,1195,That self-edit is the lesson. Bring the embarrassment to every review — it's the diagnostic.,2026-04-01 00:00:00+00,, +139,20,1195,For Thursday: write the 10x version of the queue. Don't redesign. Write the change list and the trade-offs.,2026-04-13 00:00:00+00,, +140,20,1246,Did the change list. Six items. The hard one is item three — the back-pressure strategy depends on the consumer model and I hadn't picked one.,2026-04-15 00:00:00+00,, +141,20,1195,Pick one tonight. We'll talk through the trade-off in our call.,2026-04-15 00:00:00+00,, +142,20,1246,Mock interview prep — I'm freezing on the 'estimate' question. Can we do one in our next session?,2026-05-05 00:00:00+00,, +143,20,1195,Sure. I'll throw three at you and you'll do them out loud. We'll record.,2026-05-05 00:00:00+00,, +144,21,1197,Welcome. First week's homework isn't code. Write me a single paragraph: what would your week look like if you were happy in five years. No filter.,2026-04-14 00:00:00+00,, +145,21,1248,Done. Wrote it. The week has more outdoor than computer in it. Honestly didn't expect that.,2026-04-15 00:00:00+00,, +146,21,1197,Interesting. Save it. We'll come back to it in month three when you're forced to choose.,2026-04-15 00:00:00+00,, +147,21,1197,For Friday: paper-prototype the first ten seconds of a hiking game. Just paper. Don't open Unity.,2026-04-29 00:00:00+00,, +148,21,1248,Paper sketches done. Found the first-ten-seconds problem is harder than the rest. Now I get the 'one paragraph' lesson better.,2026-05-01 00:00:00+00,, +149,21,1197,Quick check-in. How's the hiking-trail Flutter app coming this week?,2026-05-10 00:00:00+00,, +150,21,1248,Slower than I want. The GPS noise is real. But I made the architecture clearer; next push is the filter.,2026-05-11 00:00:00+00,, +151,22,1198,"Read your CV. Before you write anything new: send me the question you genuinely care about. One sentence, no qualifiers.",2026-04-16 00:00:00+00,, +152,22,1211,How can NLP work as well in Turkish (low-resource morphologically rich language) as it does in English? Without industrial-scale data.,2026-04-17 00:00:00+00,, +153,22,1198,Good. Now write the research statement around that sentence. Three drafts before our call.,2026-04-17 00:00:00+00,, +154,22,1211,Three drafts in. The third is the least bad. Sending it.,2026-04-23 00:00:00+00,, +155,22,1198,"Read it. The middle three paragraphs are good. The opening is a description, not an argument. The conclusion lists too many techniques. Concrete edits in line comments.",2026-04-24 00:00:00+00,, +156,22,1211,"Rewrote the opening. The argument is now there, but I worry it's too confident. Senior researchers don't sound this sure of themselves.",2026-05-03 00:00:00+00,, +157,22,1198,"Confidence is correct in a statement. Hedging belongs in papers, not in applications. Keep the new opening.",2026-05-03 00:00:00+00,, +158,23,1200,Welcome. First week: stop introducing yourself as 'not CS.' You're a person who reads documentation carefully. That's the actual job.,2026-04-19 00:00:00+00,, +159,23,1207,Noted. Hard habit to break but I'll try.,2026-04-20 00:00:00+00,, +160,23,1200,Try is fine. Easier with a small project to anchor to. We'll set one up Friday.,2026-04-20 00:00:00+00,, +161,23,1207,Docker multi-stage build finally clicked. 1.2GB → 180MB image. I keep posting these wins because the relief is real.,2026-04-29 00:00:00+00,, +162,23,1200,Good. Now we make it observable. Add metrics. The deploy is the start; operating is the job.,2026-04-29 00:00:00+00,, +163,23,1207,Scheduled the SAA exam for August. Mock test today: 68%. Need 72%. Two weeks on VPC and IAM.,2026-05-08 00:00:00+00,, +164,23,1200,Two focused weeks gets you there. Lab through the VPC peering scenarios. Stop reading; start breaking things.,2026-05-08 00:00:00+00,, +165,24,1201,"Welcome. First month is a reading month. No CTFs. Twenty audit reports from established firms, then we talk.",2026-03-25 00:00:00+00,, +166,24,1217,Twenty? I was thinking ten was a lot. Will do.,2026-03-26 00:00:00+00,, +167,24,1201,Twenty. The pattern emerges around fifteen. Skip none.,2026-03-26 00:00:00+00,, +168,24,1217,Done with the twenty. The pattern: 70% of findings are configuration. The 'novel exploit' is the exception.,2026-04-18 00:00:00+00,, +169,24,1201,"Now you're a different reader. We can talk OSCP, but with proper foundations. Schedule the exam for month four, not month two.",2026-04-19 00:00:00+00,, +170,24,1217,Wrote my first formal bug report this week. The disclosure timeline was painful to plan. Realized: report writing is its own discipline.,2026-05-03 00:00:00+00,, +171,24,1201,It is. Half the senior security work is writing. Save your drafts; we'll review them together.,2026-05-03 00:00:00+00,, +172,25,1271,Welcome. We do six months. Two-week cycles. Odd weeks: I send you a real architecture decision from my team; you write your own version blind before you see ours. Even weeks: code review on your app. Sound right?,2026-03-15 00:00:00+00,, +173,25,1231,Sounds right. I'll start tonight.,2026-03-15 00:00:00+00,, +174,25,1271,"First decision attached as a PDF — pagination strategy for a feed with ~10k items, multi-platform. Write your version before opening ours.",2026-03-16 00:00:00+00,, +175,25,1231,Wrote mine. Going with cursor-based pagination because the existing offset-based was 'fighting me' on infinite scroll. Reading yours now.,2026-03-18 00:00:00+00,, +176,25,1271,Your reasoning is solid. We landed in the same place. One thing we did that you didn't — added a snapshot-version fingerprint to the cursor for staleness invalidation. Annotated PDF coming.,2026-03-19 00:00:00+00,, +177,25,1231,Did the second decision exercise this week — caching strategy. My version was worse than yours. Annotations were brutal and useful.,2026-04-03 00:00:00+00,, +178,25,1271,Brutal-and-useful is the right combination. Don't lose the willingness to be annotated.,2026-04-03 00:00:00+00,, +179,25,1231,Code review went long this week — I think I want to refactor my state-management layer end-to-end before adding the next feature. Going to take a week.,2026-04-23 00:00:00+00,, +180,25,1271,Take the week. The refactor is the work. Send me the ADR before you start.,2026-04-24 00:00:00+00,, +181,25,1231,ADR for the refactor attached. Want feedback before I touch the code.,2026-05-06 00:00:00+00,, +182,25,1271,"Read it. Two suggestions — added in line comments on the PDF. Otherwise, ship it.",2026-05-06 00:00:00+00,, +183,25,1231,Refactor complete. App feels lighter. Going to write up the lessons for the next meeting.,2026-05-11 00:00:00+00,, +184,25,1271,Looking forward to it. We'll start the leadership-readiness arc next month — different shape of work.,2026-05-12 00:00:00+00,, +185,26,1196,First thing: stop saying you're a teacher pivoting. You're a communicator who can read data. Try that for a week and report back.,2024-10-14 00:00:00+00,, +186,26,1216,Caught myself using the old framing twice already today. Trying.,2024-10-15 00:00:00+00,, +187,26,1196,Send me your cover letter for the role we discussed. Don't polish — send the version you'd actually send.,2024-11-01 00:00:00+00,, +188,26,1216,Attached. Three paragraphs. The middle one apologizes again. I see it now.,2024-11-03 00:00:00+00,, +189,26,1196,First interview tomorrow. Two minutes on positioning before the call?,2024-12-01 00:00:00+00,, +190,26,1216,Yes please. Calling at 11:30.,2024-12-01 00:00:00+00,, +191,26,1216,Offer in writing today. Junior content strategist at a B2B SaaS. I'm going to take it.,2025-01-05 00:00:00+00,, +192,26,1196,Wonderful. Take it. We'll close out with a wrap session next week — pick the lessons we both want to write down.,2025-01-05 00:00:00+00,, +193,27,1198,"Welcome. Three months. Daily writing, no exceptions. We'll meet weekly. By month three you'll have a defensible answer about whether research is for you. Are you in?",2024-11-19 00:00:00+00,, +194,27,1267,I'm in. I'll start the journal tonight.,2024-11-20 00:00:00+00,, +195,27,1198,Three weeks of journal entries reviewed. The first two weeks read like a student. The last week reads like someone who notices her own thinking. That's the signal. Keep going.,2024-12-12 00:00:00+00,, +196,27,1267,Read three interpretability papers this week. The third one had a methodology I want to learn — would it be okay if we spent next week's session on that one specifically?,2025-01-06 00:00:00+00,, +197,27,1198,That's exactly what I was hoping you'd ask. Send the PDF.,2025-01-06 00:00:00+00,, +198,27,1267,I'm starting to suspect I want a longer engagement next — but not necessarily on a PhD track. Wanted to flag it before our debrief.,2025-02-10 00:00:00+00,, +199,27,1198,"Honest of you to surface early. We'll spend the last month on the next-step decision, not on more methodology.",2025-02-11 00:00:00+00,, +200,28,1199,"Welcome. Three months ends with a decision. Yes, no, or 'shelf for a year' are all acceptable. 'Still thinking' is not. Are you in?",2024-12-24 00:00:00+00,, +201,28,1222,I'm in. Terrifying but in.,2024-12-25 00:00:00+00,, +202,28,1199,Send me the list of 30 customers you can drive to in a weekend. Cold names. Not friends-of-friends.,2025-01-11 00:00:00+00,, +203,28,1222,List sent. Driving Sakarya–Düzce route this weekend with the notebook.,2025-01-13 00:00:00+00,, +204,28,1199,Six honest conversations is great. Now: write the obituary for the startup if it fails. Three pages. Send before our call.,2025-01-31 00:00:00+00,, +205,28,1222,"Obituary attached. Reading it back made me realize the cofounder gap is the killing blow, not the market.",2025-02-02 00:00:00+00,, +206,28,1199,Big call. Real call. How are you feeling about the shelf decision?,2025-03-02 00:00:00+00,, +207,28,1222,"Surprisingly OK. Relieved, even. Going to apply to a junior product role at one of the companies I interviewed for discovery.",2025-03-02 00:00:00+00,, +208,28,1199,Sounds right. Let's write the wrap document and close cleanly. You're not done with founder thinking; you're done with this iteration.,2025-03-12 00:00:00+00,, +209,29,1199,"One month. Hard stop. Three exercises, three meetings, one decision. If you waver, I'll close the engagement early. Are you in?",2025-03-09 00:00:00+00,, +210,29,1267,In. Hard stop helps.,2025-03-10 00:00:00+00,, +211,29,1199,"Customer discovery round one done. You hated it. Note that — it's data, not failure.",2025-03-17 00:00:00+00,, +212,29,1267,"Hated the cold outreach, loved the conversations once I was in them. Mixed signal.",2025-03-17 00:00:00+00,, +213,29,1199,Obituary exercise: write three pages on why your startup would fail. Send before our last call.,2025-03-23 00:00:00+00,, +214,29,1267,"Obituary done. The dominant failure mode is that I wouldn't enjoy the day-to-day operationally. Even if the idea is right, the temperament isn't.",2025-03-26 00:00:00+00,, +215,29,1199,That's a real answer. We close on Tuesday.,2025-03-26 00:00:00+00,, +216,30,1195,Aras — you keep commenting on the Vespa post. Are you actually shopping or just looking?,2026-04-25 00:00:00+00,, +217,30,1197,Half-actually. The Erzurum winter is brutal on a bike but the rest of the year is fine. I'm eyeing a used GTS but the import paperwork is intimidating.,2026-04-25 00:00:00+00,, +218,30,1195,"Skip the import unless you find a 2019+ model in good shape locally. I bought mine from a Beşiktaş showroom — they handle paperwork. Cost ten percent more, saved a month of headaches.",2026-04-26 00:00:00+00,, +219,30,1197,Worth it. Sending you a listing tomorrow — want a sanity check on whether the price is fair.,2026-04-26 00:00:00+00,, +220,30,1197,"Different question — you wrote that thing about 2am incidents and senior calmness. We're hitting the same in games production but the metric is the deadline, not the alarm. Lessons translate one-to-one in my experience.",2026-05-01 00:00:00+00,, +221,30,1195,They do. The skill is exactly the same: presence under public stress. The artifact is different. We should swap mentees for a session some time — give them both perspectives.,2026-05-01 00:00:00+00,, +222,30,1197,Half-serious offer? I have a mentee (İsmail) who's torn between mobile and games. He'd genuinely benefit from a one-off with you.,2026-05-02 00:00:00+00,, +223,30,1195,Fully serious. Send him my way for a single session. I'll do the same with Tolga at some point — he's interested in production at scale.,2026-05-03 00:00:00+00,, +224,31,1202,Saw your 'rename soft skills' post. Endorsed completely. We're trying to do this in EM circles too but the term has been baked into HR systems for two decades.,2026-05-05 00:00:00+00,, +225,31,1197,It's a soft battle. The renaming has to come from within the discipline. We're calling them 'craft skills' in our studio now. Slow adoption.,2026-05-05 00:00:00+00,, +226,31,1202,What's the in-meeting trigger for using 'craft' instead? Or is it just consistent practice?,2026-05-06 00:00:00+00,, +227,31,1197,"Consistent practice. I correct myself out loud when I slip. Made it a rule that I don't use 'soft skills' in 1:1s with juniors. After three months, my direct team picked it up. Took six months for the rest of production to follow.",2026-05-06 00:00:00+00,, +228,31,1202,"Trying the same in EM. Will report back at year-end. Also — completely separate — if you ever want a sounding board on engineering-management questions from a games-production lens, I'm here.",2026-05-11 00:00:00+00,, +229,31,1197,Same offer back. The discipline overlap is bigger than people realize.,2026-05-11 00:00:00+00,, +230,32,1198,"Neslihan — your 'defensible AI' framing landed with me. We spend a lot of literature time arguing about explainability as the goal. You're right that for regulated contexts, defensibility is the actual deliverable. I want to teach this to our master's students.",2026-05-03 00:00:00+00,, +231,32,1205,"Glad it resonated. The pedagogical gap between academic ML and regulated-industry practice is wider than people admit. If you ever want a guest seminar for your students, I'd be happy.",2026-05-03 00:00:00+00,, +232,32,1198,"Yes — let's schedule it for autumn term. Topic: 'reading a model documentation pack critically.' Two hours, no slides — just a real pack and questions.",2026-05-04 00:00:00+00,, +233,32,1205,Perfect. I'll bring a sanitized real one from a recent committee review. The students will get more from one of those than ten textbook examples.,2026-05-04 00:00:00+00,, +234,32,1198,"Also: I have a mentee (Mina, applying for ML PhDs) who's interested in responsible AI as a thesis topic. Would you be willing to give her 20 minutes to discuss it?",2026-05-10 00:00:00+00,, +235,32,1205,Of course. Send me her statement when she's ready; I'll come prepared.,2026-05-10 00:00:00+00,, diff --git a/scripts/seed_snapshot_data/data/milestones.csv b/scripts/seed_snapshot_data/data/milestones.csv new file mode 100644 index 00000000..04c64f31 --- /dev/null +++ b/scripts/seed_snapshot_data/data/milestones.csv @@ -0,0 +1,29 @@ +id,mentorship_id,title,description,target_date,status,order_index,completed_at,created_at +35,23,Message queue v1 with documented trade-offs,First milestone: complete reimplementation with a one-page design doc that names the trade-offs you chose against.,2026-05-03 00:00:00+00,COMPLETED,0,2026-05-03 00:00:00+00,2026-03-29 00:00:00+00 +36,23,"First end-to-end mock interview, recorded and self-reviewed",60-minute system-design interview format with Melis. Tolga records and self-reviews before we debrief.,2026-06-03 00:00:00+00,IN_PROGRESS,1,,2026-03-29 00:00:00+00 +37,23,One real design proposal at a target company,Apply for an internship that includes a design exercise. Submit work; we review together.,2026-07-12 00:00:00+00,PENDING,2,,2026-03-29 00:00:00+00 +38,24,Paths-side-by-side artifact,"A one-page comparison of the games path vs the mobile path, written by İsmail with my edits.",2026-05-03 00:00:00+00,COMPLETED,0,2026-05-03 00:00:00+00,2026-04-13 00:00:00+00 +39,24,Vertical slice or pivot decision,By month 3 İsmail decides whether to spend months 4-6 on a hiking-game vertical slice or on shipping the trail app to the Play Store. We commit either way.,2026-07-12 00:00:00+00,IN_PROGRESS,1,,2026-04-13 00:00:00+00 +40,24,Vertical slice live or app on Play Store,"Whichever path was chosen, an artifact exists at month 6.",2026-10-10 00:00:00+00,PENDING,2,,2026-04-13 00:00:00+00 +41,25,Research statement draft 3,"Three drafts done, each substantively different. Establishes the iteration habit.",2026-04-23 00:00:00+00,COMPLETED,0,2026-04-23 00:00:00+00,2026-04-15 00:00:00+00 +42,25,Target advisor shortlist (5 names),"Five advisors across three programs, each with a one-paragraph note on why this person specifically. No 'general fit' allowed.",2026-05-27 00:00:00+00,IN_PROGRESS,1,,2026-04-15 00:00:00+00 +43,25,Recommender-signed statement,Final statement that Mina's primary recommender signs off without substantive edits.,2026-07-07 00:00:00+00,PENDING,2,,2026-04-15 00:00:00+00 +44,26,Pass AWS SAA,Pass the exam. Cert is the artifact; the prep is the skill.,2026-06-12 00:00:00+00,IN_PROGRESS,0,,2026-04-18 00:00:00+00 +45,26,"Operating, not deploying","Demonstrate that you can operate a small system — runbook, metrics, one incident walk-through.",2026-07-12 00:00:00+00,PENDING,1,,2026-04-18 00:00:00+00 +46,27,Twenty-audit reading milestone,Twenty reports read with structured notes. The shift from exploiter-mindset to analyst-mindset.,2026-04-18 00:00:00+00,COMPLETED,0,2026-04-18 00:00:00+00,2026-03-24 00:00:00+00 +47,27,First substantive bug report written,A formal report Polat will sign off on as junior-credible.,2026-05-20 00:00:00+00,IN_PROGRESS,1,,2026-03-24 00:00:00+00 +48,27,OSCP earned and one internship offer accepted,"End-of-engagement artifact: a cert, a job.",2026-09-30 00:00:00+00,PENDING,2,,2026-03-24 00:00:00+00 +49,28,Two ADRs delivered,Establish the writing-before-coding rhythm. Two ADRs done.,2026-04-03 00:00:00+00,COMPLETED,0,2026-04-03 00:00:00+00,2026-03-14 00:00:00+00 +50,28,Lead one full refactor,"Rıza leads a meaningful refactor on his own app, with ADR before and write-up after.",2026-05-13 00:00:00+00,IN_PROGRESS,1,,2026-03-14 00:00:00+00 +51,28,Run a cross-team meeting cleanly,"Lead a 30-minute cross-team meeting with my team, with prep and follow-up artifacts.",2026-06-03 00:00:00+00,PENDING,2,,2026-03-14 00:00:00+00 +52,28,Pass four mock architecture interviews,End-of-engagement artifact: Rıza is interview-ready for senior mobile roles.,2026-07-12 00:00:00+00,PENDING,3,,2026-03-14 00:00:00+00 +53,29,Cover letter that doesn't apologize,"Buse's revised cover letter, no apology paragraphs, sharp positioning. Recommender-ready.",2024-11-01 00:00:00+00,COMPLETED,0,2024-11-01 00:00:00+00,2025-04-10 00:00:00+00 +54,29,First interview booked,"Any real role she actually wants, interview booked.",2024-12-01 00:00:00+00,COMPLETED,1,2024-12-01 00:00:00+00,2025-04-10 00:00:00+00 +55,29,Junior content-strategist offer accepted,End-of-engagement target. Achieved.,2025-01-05 00:00:00+00,COMPLETED,2,2025-01-05 00:00:00+00,2025-04-10 00:00:00+00 +56,30,Journal habit established,Four weeks of daily entries. Demonstrates seriousness for the rest of the engagement.,2024-12-17 00:00:00+00,COMPLETED,0,2024-12-17 00:00:00+00,2025-04-01 00:00:00+00 +57,30,Methodology literacy,Three close reads done. Defne can articulate the standards of careful work in the subfield.,2025-01-16 00:00:00+00,COMPLETED,1,2025-01-16 00:00:00+00,2025-04-01 00:00:00+00 +58,30,Honest decision on next step,Decision memo done. Defne knows what kind of mentor she wants for the next 6+ months.,2025-02-15 00:00:00+00,COMPLETED,2,2025-02-15 00:00:00+00,2025-04-01 00:00:00+00 +59,31,Six honest discovery conversations,"Real customer evidence, not vague enthusiasm.",2025-01-11 00:00:00+00,COMPLETED,0,2025-01-11 00:00:00+00,2025-08-19 00:00:00+00 +60,31,Pre-mortem written,Three-page obituary forces the killing blow to surface.,2025-01-31 00:00:00+00,COMPLETED,1,2025-01-31 00:00:00+00,2025-08-19 00:00:00+00 +61,31,Decision made,Yes / no / shelf. Funda chose shelf-for-a-year and a junior product role.,2025-03-12 00:00:00+00,COMPLETED,2,2025-03-12 00:00:00+00,2025-08-19 00:00:00+00 +62,32,Honest founder-fit answer,"Defne can articulate whether founding is her current path or not, with one sentence of reason.",2025-03-28 00:00:00+00,COMPLETED,0,2025-03-28 00:00:00+00,2025-04-02 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/task_assignment_attachments.csv b/scripts/seed_snapshot_data/data/task_assignment_attachments.csv new file mode 100644 index 00000000..a1720264 --- /dev/null +++ b/scripts/seed_snapshot_data/data/task_assignment_attachments.csv @@ -0,0 +1,8 @@ +task_id,attachment_id +57,4c15f506-5436-4f61-a9a4-410ac38dee70 +58,13fd74d6-4068-4522-8b2c-487eaaabc02e +59,babc6c79-7252-4d59-82ea-d5b7e1d42132 +60,bfab8230-ecab-4dd3-b553-6202a22c02e2 +66,3159cc61-ab26-4fc5-9964-e4698ca602b3 +67,d77e21f2-9694-47da-9fd2-922e2b0cb0da +68,da9d79ab-7c92-43b8-899e-bd75a127122a diff --git a/scripts/seed_snapshot_data/data/tasks.csv b/scripts/seed_snapshot_data/data/tasks.csv new file mode 100644 index 00000000..5e5668c3 --- /dev/null +++ b/scripts/seed_snapshot_data/data/tasks.csv @@ -0,0 +1,35 @@ +id,mentorship_id,title,description,due_date,status,created_at,updated_at +41,23,Rewrite the message queue with delivery guarantees,"Pick at-least-once or exactly-once and justify the choice. Implementation must include the broker, one producer, one consumer, and a failure-injection test.",2026-05-03 00:00:00+00,COMPLETED,2026-03-29 00:00:00+00,2026-03-29 00:00:00+00 +42,23,Estimate-at-the-whiteboard practice,Run three estimation questions verbally. Record. Self-review.,2026-05-16 00:00:00+00,PENDING,2026-03-29 00:00:00+00,2026-03-29 00:00:00+00 +43,23,Read 'Designing Data-Intensive Applications' Chapter 7,Transactions chapter. Come with one question per section. We discuss in session.,2026-05-27 00:00:00+00,PENDING,2026-03-29 00:00:00+00,2026-03-29 00:00:00+00 +44,24,Write the 'happy week in 5 years' paragraph,"One paragraph, honest, no filter. We'll revisit it in month three.",2026-04-16 00:00:00+00,COMPLETED,2026-04-13 00:00:00+00,2026-04-13 00:00:00+00 +45,24,Paper prototype: first ten seconds of a hiking game,Use only paper. Three sketches minimum. The first-ten-seconds question is the design problem.,2026-04-30 00:00:00+00,COMPLETED,2026-04-13 00:00:00+00,2026-04-13 00:00:00+00 +46,24,GPS noise filtering for the hiking-trail Flutter app,"Pick a simple filter (moving average or Kalman). Implement, measure error before/after, write a paragraph on the trade-offs.",2026-05-20 00:00:00+00,PENDING,2026-04-13 00:00:00+00,2026-04-13 00:00:00+00 +47,25,Draft research statement v1 → v3,"Three full drafts in the first two weeks. Different opening, different framing each time.",2026-04-23 00:00:00+00,COMPLETED,2026-04-15 00:00:00+00,2026-04-15 00:00:00+00 +48,25,Read three papers from each target advisor,"Use the abstracts to filter; full read on the most-cited. Take notes on the question they're asking, not just the result.",2026-05-18 00:00:00+00,PENDING,2026-04-15 00:00:00+00,2026-04-15 00:00:00+00 +49,25,Build a sustainable writing routine,"60 minutes a day, same time. Two weeks consecutive. Report at our next session whether it stuck.",2026-05-27 00:00:00+00,PENDING,2026-04-15 00:00:00+00,2026-04-15 00:00:00+00 +50,26,Multi-stage Docker build + measurement,"Take an existing service, write a multi-stage Dockerfile, measure image size and cold start before/after.",2026-04-29 00:00:00+00,COMPLETED,2026-04-18 00:00:00+00,2026-04-18 00:00:00+00 +51,26,VPC + IAM hands-on labs,"Two weeks of lab work in your free AWS account. Peering, transit gateway, IAM policy debugging. No more reading without doing.",2026-05-23 00:00:00+00,PENDING,2026-04-18 00:00:00+00,2026-04-18 00:00:00+00 +52,26,Build and operate a small platform,ECS service + CloudWatch metrics + a documented runbook for one failure mode. Ship it; document it.,2026-06-17 00:00:00+00,PENDING,2026-04-18 00:00:00+00,2026-04-18 00:00:00+00 +53,27,Read 20 audit reports,Mainstream firms only. Note the pattern of finding categories. Stop CTFs for the month.,2026-04-18 00:00:00+00,COMPLETED,2026-03-24 00:00:00+00,2026-03-24 00:00:00+00 +54,27,Write three formal bug reports,One per month for months 2-4. Real findings or simulated; the writing is the skill.,2026-06-12 00:00:00+00,PENDING,2026-03-24 00:00:00+00,2026-03-24 00:00:00+00 +55,27,OSCP exam preparation block,"Structured prep, lab time, mock exam at week 8. Real exam scheduled for month four.",2026-07-12 00:00:00+00,PENDING,2026-03-24 00:00:00+00,2026-03-24 00:00:00+00 +56,27,Apply to five security internships,"Targeted applications, not spam. One paragraph per company on why this team.",2026-08-01 00:00:00+00,PENDING,2026-03-24 00:00:00+00,2026-03-24 00:00:00+00 +57,28,ADR #1: Pagination strategy for the feed,"Write your own architecture decision record before reading mine. Include trade-offs, alternatives considered, and the test the decision needs to survive.",2026-03-18 00:00:00+00,COMPLETED,2026-03-14 00:00:00+00,2026-03-14 00:00:00+00 +58,28,ADR #2: Caching strategy,"Same exercise. Decide between memory-only, persisted, and hybrid. Justify with concrete failure modes.",2026-04-03 00:00:00+00,COMPLETED,2026-03-14 00:00:00+00,2026-03-14 00:00:00+00 +59,28,State management refactor + ADR,"End-to-end refactor of the state-management layer in your app. Write the ADR first, then ship the code.",2026-05-11 00:00:00+00,COMPLETED,2026-03-14 00:00:00+00,2026-03-14 00:00:00+00 +60,28,Cross-team meeting facilitation prep,"Prepare to run a 30-minute cross-team meeting in our org (I'll provide the topic). Agenda, decisions list, and a written follow-up. We rehearse before.",2026-05-27 00:00:00+00,PENDING,2026-03-14 00:00:00+00,2026-03-14 00:00:00+00 +61,28,Architecture interview prep — 4 mock interviews,Four mock architecture interviews over four weeks. I'll run them in interview format with feedback.,2026-06-24 00:00:00+00,PENDING,2026-03-14 00:00:00+00,2026-03-14 00:00:00+00 +62,29,Rewrite cover letter — no apology paragraph,Cut every sentence that explains 'why you're not a developer.' Keep only what you bring.,2024-10-30 00:00:00+00,COMPLETED,2025-04-10 00:00:00+00,2025-04-10 00:00:00+00 +63,29,"Five companies actually wanted, not five hiring",Real shortlist. One paragraph per company on why this team specifically.,2024-11-11 00:00:00+00,COMPLETED,2025-04-10 00:00:00+00,2025-04-10 00:00:00+00 +64,29,Portfolio: three real content audits,"Audit a small business's existing content, write a one-page improvement memo for each.",2024-12-11 00:00:00+00,COMPLETED,2025-04-10 00:00:00+00,2025-04-10 00:00:00+00 +65,29,Wrap document: lessons from the engagement,"One page of lessons we both write down, signed by both.",2025-01-10 00:00:00+00,COMPLETED,2025-04-10 00:00:00+00,2025-04-10 00:00:00+00 +66,30,"Daily research journal, weeks 1-4","One entry per day, minimum 200 words, written immediately after reading. No retroactive entries. Send weekly summary.",2024-12-17 00:00:00+00,COMPLETED,2025-04-01 00:00:00+00,2025-04-01 00:00:00+00 +67,30,Close read of three foundational interpretability papers,"Choose three: one classic (>5 years old), one modern, one disputed. Write a one-page reading note for each.",2025-01-16 00:00:00+00,COMPLETED,2025-04-01 00:00:00+00,2025-04-01 00:00:00+00 +68,30,Draft 'research vs industry' decision memo,"Two-page memo arguing the case for each path, with explicit weights on the factors. Final session reviews this.",2025-02-15 00:00:00+00,COMPLETED,2025-04-01 00:00:00+00,2025-04-01 00:00:00+00 +69,31,"Drive Sakarya–Düzce, 6 honest discovery calls",Cold walk-ins at logistics warehouses. Notebook only; no slides.,2025-01-11 00:00:00+00,COMPLETED,2025-08-19 00:00:00+00,2025-08-19 00:00:00+00 +70,31,Write the startup's obituary (3 pages),"If this fails, why? Three pages, before the next call.",2025-01-31 00:00:00+00,COMPLETED,2025-08-19 00:00:00+00,2025-08-19 00:00:00+00 +71,31,Cofounder search: three serious conversations,Identify three people you'd actually want as cofounder. Have the conversation. Report back.,2025-02-20 00:00:00+00,COMPLETED,2025-08-19 00:00:00+00,2025-08-19 00:00:00+00 +72,31,Decision call and wrap document,Write the wrap doc together. Be specific about what you learned.,2025-03-12 00:00:00+00,COMPLETED,2025-08-19 00:00:00+00,2025-08-19 00:00:00+00 +73,32,Customer discovery: 6 cold conversations,"Find a problem worth a startup, talk to six potential customers cold. Notebook only.",2025-03-15 00:00:00+00,COMPLETED,2025-04-02 00:00:00+00,2025-04-02 00:00:00+00 +74,32,Pre-mortem: 3 pages on why the startup would fail,Be honest about the dominant failure mode. The dominant one is the answer.,2025-03-25 00:00:00+00,COMPLETED,2025-04-02 00:00:00+00,2025-04-02 00:00:00+00 diff --git a/scripts/seed_snapshot_data/data/users.csv b/scripts/seed_snapshot_data/data/users.csv new file mode 100644 index 00000000..2babdcd1 --- /dev/null +++ b/scripts/seed_snapshot_data/data/users.csv @@ -0,0 +1,79 @@ +id,first_name,last_name,email,password_hash,profile_photo,is_email_verified,created_at,version,timezone,city,latitude,longitude,is_suspected_bot,suspected_at +1247,Meryem,Atalay,meryem.atalay.54@seed.test,$2b$10$6XTivF0RBE/fJbsbTQib6.y7w8wNdEcgEQAuJPylkDBOozgmvjWpK,http://localhost:8080/api/uploads/photos/b9510a7e-8dcc-4455-8d9d-485d2c817a63.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Mamak, Ankara",39.9325,32.918,f, +1202,Hakki,Bakir,hakki.bakir.9@seed.test,$2b$10$Z5u8ooZ6BsYT3jPNM8rwcOiKUjdoSKbhoTdgPHu4mSjsMXGG7OYsS,http://localhost:8080/api/uploads/photos/e67d1d38-6c00-4a3a-814c-0d89ab09d7c4.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Uskudar, Istanbul",41.0226,29.0156,f, +1212,Aras,Inan,aras.inan.19@seed.test,$2b$10$qUhWanNumHOS6pKrevjKgulxE2DVV8UEnkF9UCTL/no1xqOnyfpbK,http://localhost:8080/api/uploads/photos/07cd639b-6708-46a5-bc5b-9fce240f8b0e.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Sisli, Istanbul",41.0602,28.9871,f, +1209,Aydin,Onal,aydin.onal.16@seed.test,$2b$10$5nAJKT3naKNYAp4dk6f/puC7mU02OuEKJ64jKKjRpcLCMNOGnFMOq,http://localhost:8080/api/uploads/photos/c544613e-d9dc-4fa5-86e3-195522f474f4.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Samsun,41.2867,36.33,f, +1203,Didem,Pak,didem.pak.10@seed.test,$2b$10$6m6TRQltBubi34sGGKiusuSHMftr9oyUVHFj2exthYKVUlKNp13.u,http://localhost:8080/api/uploads/photos/f3438376-4d5b-42bb-9bed-94c946343452.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Besiktas, Istanbul",41.0428,29.0061,f, +1221,Hale,Arikan,hale.arikan.28@seed.test,$2b$10$tJKRYA5OtG96Qqz2XBVYJuOxh/sVaZjrleO4xWOQSlutDlzzbHNVm,http://localhost:8080/api/uploads/photos/98407be9-e413-4245-9d47-c72323b9ecc1.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Pendik, Istanbul",40.8782,29.2536,f, +1204,Derya,Karaca,derya.karaca.11@seed.test,$2b$10$YCYf9ARGaIdUeOkzcYmg8ebJzLIksgXSeSOs5KOrJfYX77.f0e67m,http://localhost:8080/api/uploads/photos/b7c9721b-6591-46b6-b6c6-e81211c00c79.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Pendik, Istanbul",40.8782,29.2536,f, +1232,Mahmut,Pak,mahmut.pak.39@seed.test,$2b$10$3zdrpttWtH.pTW1qNTbzq.9k6EEnT3gvLdZzq2ennThiLl3lhDtr2,http://localhost:8080/api/uploads/photos/103182b0-a4f4-429a-985c-00add70be0ea.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Karsiyaka, Izmir",38.4598,27.1099,f, +1197,Aras,Sezen,aras.sezen.4@seed.test,$2b$10$IYYPV8WrjGi3L5dGHVFmRu3v2p0bojOk5PAcoqcs7pIOTUulqB0nG,http://localhost:8080/api/uploads/photos/74924662-8676-4ddf-a03b-e0368e04d3e2.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,Erzurum,39.9043,41.267,f, +1218,Ismail,Dogan,ismail.dogan.25@seed.test,$2b$10$rABBovZPgNrdK.MxfYNY/eaH.99m1fSXxWDsw9GdLPBKUjJqmHQC2,http://localhost:8080/api/uploads/photos/feba9698-d279-4516-89a7-c408150dd1af.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Manisa,38.6191,27.4289,f, +1220,Serdar,Sezer,serdar.sezer.27@seed.test,$2b$10$8xLqWlFGu/9qlAjeS7N34eweX1vUxMbAcQpRs6Pg1V4dsXckiURve,http://localhost:8080/api/uploads/photos/c607fc74-2e4f-4426-a8da-71e8328c2816.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Mamak, Ankara",39.9325,32.918,f, +1224,Pelin,Bayraktar,pelin.bayraktar.31@seed.test,$2b$10$yZCIJOGdC34WDSDIGZUZQuzsru7WVsO7WiMbSzLGgvnM9mOa5VFWi,http://localhost:8080/api/uploads/photos/0d83c26f-4ccb-4091-bea6-aa4c81ce03a5.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Adana,37,35.3213,f, +1225,Pinar,Isik,pinar.isik.32@seed.test,$2b$10$MM4BRFAqxYy.aCPoHCRGIOC/0YEgtyoxFzf20IAWHuR18Yr8DUhL.,http://localhost:8080/api/uploads/photos/1d763186-507a-4a17-af1a-f7047b9e5648.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Sakarya,40.7831,30.4036,f, +1227,Ibrahim,Bayer,ibrahim.bayer.34@seed.test,$2b$10$O1ZPTGCjS05OqustWnPJvOftwjLXwcVb5quYNc0a9gD8.aX2NFM5y,http://localhost:8080/api/uploads/photos/f8408a7e-3a41-4709-96c1-17b282a1e744.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Cankaya, Ankara",39.9111,32.8526,f, +1228,Burcu,Guney,burcu.guney.35@seed.test,$2b$10$e2cIVPn5gyC/.Hn94DulD.yahujgUOwWNrngLf304XFNRF0X23WBO,http://localhost:8080/api/uploads/photos/e214057c-12ae-4425-853e-23d8c8412d19.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Samsun,41.2867,36.33,f, +1231,Riza,Yavuz,riza.yavuz.38@seed.test,$2b$10$efdZKWN/RFM3G4mX.o8FpuAeAIVq7m9Jq5fX8g9JFXxyIeSog7gOG,http://localhost:8080/api/uploads/photos/36ed9c27-cec6-4b24-8644-19325271b7fc.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,Tekirdag,40.9833,27.5167,f, +1196,Gonca,Kahraman,gonca.kahraman.3@seed.test,$2b$10$H2Kx1fGdHD.atYVbcxbxb.egX9oyf9y7/e/uLEMYIcTae5/kzeUga,http://localhost:8080/api/uploads/photos/0efc1e1e-abfc-4a85-9903-5dcf3c79505a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Etimesgut, Ankara",39.965,32.69,f, +1199,Neslihan,Eken,neslihan.eken.6@seed.test,$2b$10$fpVQDesaJC/3B.bh.2o6..m8vtqal7GO/6c5Wst02iNz7NTUlaTfK,http://localhost:8080/api/uploads/photos/8eb5904d-3ba5-4453-88ea-9835c8dd0b96.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Buca, Izmir",38.3911,27.1797,f, +1200,Gulay,Ergin,gulay.ergin.7@seed.test,$2b$10$KmYPxGRLu3eivjjCUai0TOYZr3Ks4/yyuLtiowoQYvrg8ivXSC1Aq,http://localhost:8080/api/uploads/photos/186223fa-175e-4813-8843-70aa9e7193b7.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Kartal, Istanbul",40.9056,29.1908,f, +1206,Ufuk,Gulhan,ufuk.gulhan.13@seed.test,$2b$10$19fnBJ0VlYRT/qzUiu0RoO3S26JidTGwDk07VdyOu2hNvTwQl8fC2,http://localhost:8080/api/uploads/photos/17b8a0bf-7b75-46d2-a80b-c27512e656ce.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Ordu,40.9839,37.8764,f, +1208,Duygu,Kilicoglu,duygu.kilicoglu.15@seed.test,$2b$10$K97Er/cxE/LEcV6CXmbdueinspuZS8PLuGytYuJtwZhDnsdH3Wji.,http://localhost:8080/api/uploads/photos/a3c2cc25-3f09-4ca5-9117-db305f6d3f79.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Kocaeli,40.8533,29.8815,f, +1211,Mina,Bayraktar,mina.bayraktar.18@seed.test,$2b$10$FW1y2GC/8d3KOW/MpSYD5.2XlLccvqLFs22hng6rI7gcHWHcgNC8i,http://localhost:8080/api/uploads/photos/b2d4a7a4-4a41-47cc-994b-e37edca39427.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1214,Eren,Akdeniz,eren.akdeniz.21@seed.test,$2b$10$zXB5HC8ox2nYaVpnqY22T.td8DxSrs6qVu2O4HEz.3vnYVAfGxk9S,http://localhost:8080/api/uploads/photos/d9ef23c4-4857-4ea2-9b91-d43d059976ab.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Tekirdag,40.9833,27.5167,f, +1215,Tayfun,Tekin,tayfun.tekin.22@seed.test,$2b$10$RiejI5nl2ygjpDvdElHL7eRvmz4nSMhT7XRJV/93m6CCb7jD2HN9i,http://localhost:8080/api/uploads/photos/ddb30e6f-37af-4e3c-9926-9ccce80dab6b.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Canakkale,40.1467,26.4086,f, +1216,Buse,Dogan,buse.dogan.23@seed.test,$2b$10$kj8du9dAuEpkOXQAdGM5fuVGl2xh76mDSFcP9GR04ts1IM1BqPVpi,http://localhost:8080/api/uploads/photos/ae1e0065-9916-46ad-84af-c510eae55c87.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1222,Funda,Altinok,funda.altinok.29@seed.test,$2b$10$oiftN3BjQSkpyVKAInZ7lOGk3EzdQupX8aOy.RJud/mkZD9L6qlLK,http://localhost:8080/api/uploads/photos/44e841ea-4272-409f-831d-5733fb1f16dc.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Sakarya,40.7831,30.4036,f, +1229,Burhan,Kilic,burhan.kilic.36@seed.test,$2b$10$2aBbhEMFi/824ZQSHATa5uWI8XvrfOR3l5ZzEFSP7yd.RIq6VtAEq,http://localhost:8080/api/uploads/photos/40e7603d-caa8-468d-913d-555c82b12ca2.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Muratpasa, Antalya",36.8849,30.7136,f, +1233,Dogan,Bayraktar,dogan.bayraktar.40@seed.test,$2b$10$Q6wnJE92y1g684VrgWo1uODSmBoM3xTTpZDHtldBZ9GqjaANIgm4G,http://localhost:8080/api/uploads/photos/36820545-e73c-4bef-9794-0bab8eb14abb.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Atasehir, Istanbul",40.9846,29.1276,f, +1250,Selin,Koc,selin.koc.57@seed.test,$2b$10$n283eU07QzHdC4XAg/Lu3OVXNdgRbt0Y6Q/WftVm0Ipe9dYFoMlm2,http://localhost:8080/api/uploads/photos/3cdcc5e7-c0ef-4647-bd31-29594fb8af2d.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1195,Melis,Sezen,melis.sezen.2@seed.test,$2b$10$lU2l8gDkETsdAEDlVvZGheEbM2DUzQEENTPoaZsW2EzAF3.3n3YC.,http://localhost:8080/api/uploads/photos/e5c33135-dba2-4cd2-888b-1251fa0022c7.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Maltepe, Istanbul",40.9354,29.1297,f, +1238,Ece,Ekinci,ece.ekinci.45@seed.test,$2b$10$NIS9gBxL9dUPUMsCdRSSOepF4ZvNqk0VnWT2JlaoafTrHjvCwTXc2,http://localhost:8080/api/uploads/photos/cdc0e063-6502-480b-a5a9-d21794e87e3e.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Mamak, Ankara",39.9325,32.918,f, +1241,Neslihan,Erkmen,neslihan.erkmen.48@seed.test,$2b$10$nzkUYLgKwjGEegm/.jcrL..nnGGl9SILLFJY59Hw7CFM558p4ziG6,http://localhost:8080/api/uploads/photos/eb45daa9-bc03-415c-bca0-fb2b51eb50fb.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Samsun,41.2867,36.33,f, +1243,Ayca,Bakir,ayca.bakir.50@seed.test,$2b$10$PTgLHB0bls.DPwxiQmqHC.0mVlFVXkFkANC1dPif1hk1R7NdL/h7S,http://localhost:8080/api/uploads/photos/c6e0c474-23f7-4d3d-8f9b-bbe7161586ef.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Nilufer, Bursa",40.2143,28.9593,f, +1249,Hasan,Demiroz,hasan.demiroz.56@seed.test,$2b$10$OC5XTY1cHEpJ7l2Fuc7WwOdw9KTI2QQKGPDLEeACVsbpvFr2Qqw1q,http://localhost:8080/api/uploads/photos/273a504f-65f8-4e8a-91c7-7cd652ecf5e6.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Umraniye, Istanbul",41.0264,29.1226,f, +1251,Mert,Kayan,mert.kayan.58@seed.test,$2b$10$H4fbgPX32ZbCw4pZlbwKM.fbcWnbvJjYiYIInaQUEQmADVc/E8Qya,http://localhost:8080/api/uploads/photos/3b2db4f1-58b6-4f6e-8607-3f90d6d16c91.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Sisli, Istanbul",41.0602,28.9871,f, +1253,Melek,Mutlu,melek.mutlu.60@seed.test,$2b$10$CRFgXvn9XG3oqcvJCBD6Zut4VpKeKr0Uf04HAL/EgLTZ1eTASG6y.,http://localhost:8080/api/uploads/photos/c408cc7a-0e1d-4270-b3fd-e34770c2ca19.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Hatay,36.2023,36.1613,f, +1254,Emre,Kaplan,emre.kaplan.61@seed.test,$2b$10$CxD5s/ktBb.C4.307ZcUg.eLKnWOb3w5E1TxnNUh24a4VSuMKSoXi,http://localhost:8080/api/uploads/photos/d676cbcc-a266-4de3-a747-e0b7ada44e11.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Gaziantep,37.066,37.3833,f, +1257,Asli,Tuncel,asli.tuncel.64@seed.test,$2b$10$GfrsYcMLouSG3KKTpoKynOeOHSbRHuvFih6xeGtfJw3O64eBXxrw2,http://localhost:8080/api/uploads/photos/2d141cd8-2395-4800-910d-8ca8a905feff.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Konya,37.8746,32.4932,f, +1259,Defne,Akin,defne.akin.66@seed.test,$2b$10$o8e2skhJ6eErhN3F1ys1HezdUEEyZFkC6nU16KK9F5DFNDCJdXEnS,http://localhost:8080/api/uploads/photos/20586bd1-8882-4324-a419-2172d72500ff.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Cihangir, Istanbul",41.0322,28.9817,f, +1261,Ela,Saglam,ela.saglam.68@seed.test,$2b$10$aHcb6KUzfR87vywOWx4SyedrrG81rRpTU5ynCJX/k031vv5dIJeZG,http://localhost:8080/api/uploads/photos/e3160c26-2ef0-407e-aef3-e4e228b44b4a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Eskisehir,39.7767,30.5206,f, +1265,Dilan,Acar,dilan.acar.72@seed.test,$2b$10$Er6/Ltr3Z7TKpOwT/zDgKeGUzzlXOyT8c63biQhoJDuR4eW73Pls2,http://localhost:8080/api/uploads/photos/169c8832-7b11-4889-8c8b-cc892a20dc1a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Karsiyaka, Izmir",38.4598,27.1099,f, +1267,Defne,Korkmaz,defne.korkmaz.74@seed.test,$2b$10$VWUlF1rWYCHqIdjc7ooGg.eIihXbCSheXceDxJG1I4yz6qkWagizu,http://localhost:8080/api/uploads/photos/ecf98915-afce-4c81-9b0d-3679dfb11502.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Cankaya, Ankara",39.9111,32.8526,f, +1269,Esra,Yildiz,esra.yildiz.76@seed.test,$2b$10$3hvpZz4TU8DMnYZGw4l3S.hZ.KeKqPvk25nF9bo5IajIR3FiCKFwq,http://localhost:8080/api/uploads/photos/01b66843-c997-4389-ac5a-ec1931ee912f.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Cankaya, Ankara",39.9111,32.8526,f, +1270,Kerem,Polat,kerem.polat.77@seed.test,$2b$10$DMTY..2E9Y4haRF3Sol71eE8vvCIJFfmRxUS3IRUWBM53KT4Ricpu,http://localhost:8080/api/uploads/photos/3ec314cb-df6e-4398-a9ad-3c31ed0fc86c.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Besiktas, Istanbul",41.0428,29.0061,f, +1198,Dilara,Oz,dilara.oz.5@seed.test,$2b$10$V85mjPTIoxBQTQOb3Vq91OFuYwXcbOtd2YgcQvSs3gcz87l8HF8pC,http://localhost:8080/api/uploads/photos/75eeac76-ad71-448a-8d1f-cebcf2402369.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Uskudar, Istanbul",41.0226,29.0156,f, +1236,Sude,Mutlu,sude.mutlu.43@seed.test,$2b$10$W3sblVpiBe1g7BW/RFZlveLmvfIaZRUV.IEPp8hCA49zymnxLnfWy,http://localhost:8080/api/uploads/photos/cc03060f-c0ad-44c1-8585-68008251bf1a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Etimesgut, Ankara",39.965,32.69,f, +1237,Sadik,Isik,sadik.isik.44@seed.test,$2b$10$Y2c6nMJ.Z.HyP/bWHrvb9.L8.aYNXt7O7Tu3DoiAFvDLdEXz2ePp2,http://localhost:8080/api/uploads/photos/c65ac97a-b9ea-4898-bef6-5eeff49c8d09.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Yenimahalle, Ankara",39.9686,32.7882,f, +1240,Halis,Kaplan,halis.kaplan.47@seed.test,$2b$10$u6si3IAmpIT5JajiIwG57.tllfnH2XEtJsHVm30zrc6n3zsNMMjSS,http://localhost:8080/api/uploads/photos/19c1576b-509f-4e07-b3c5-3e1e5b604417.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Denizli,37.7765,29.0864,f, +1242,Ahmet,Bicakci,ahmet.bicakci.49@seed.test,$2b$10$URbtg/tOICr2IZsNGaYi6eEg.lk7deAdZ/pTW3iGnUJ5XAcgVNWHa,http://localhost:8080/api/uploads/photos/1235a0dd-27cf-452b-916f-7a8b52f1c8f5.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Sisli, Istanbul",41.0602,28.9871,f, +1246,Tolga,Aksoy,tolga.aksoy.53@seed.test,$2b$10$gDZzIrVY4VaD1JDdKhLtNOQkJUf.p5Zl0n8qEmu6ztonnoI7yiIKm,http://localhost:8080/api/uploads/photos/7021be72-adcb-4c75-a6c3-d6860deca70e.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Beyoglu, Istanbul",41.0369,28.9774,f, +1256,Cem,Mutlu,cem.mutlu.63@seed.test,$2b$10$uAWydBrjN.TaH632TNDseeEAeW9b0gfQun4fe9UD6UkNAwtB0ZkwW,http://localhost:8080/api/uploads/photos/31ec88b7-ff3f-4995-a458-77db97fa0047.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Kadikoy, Istanbul",40.9905,29.0303,f, +1260,Baran,Coskun,baran.coskun.67@seed.test,$2b$10$l6IiXZ0VnoB74vEHw1NsJ.exe49qylR8czUweezSgrVGz5MH1DqTK,http://localhost:8080/api/uploads/photos/a46e6585-f1d3-49e8-b3a1-318434111a15.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Osmangazi, Bursa",40.1828,29.066,f, +1262,Yigit,Coker,yigit.coker.69@seed.test,$2b$10$LiXOMpv7p68DTa6r6AviHeZIYgECVlqoe3JhavscHFvCuuiEyy4.e,http://localhost:8080/api/uploads/photos/2e1fbf0e-bb44-4a1b-8cd8-271100c3faef.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Adana,37,35.3213,f, +1264,Toprak,Demir,toprak.demir.71@seed.test,$2b$10$GgD0vwOa1iS8r3crkV9ze.SK7Jn1V74N5Pg/ymknR0KRv3smVJa4i,http://localhost:8080/api/uploads/photos/4b2f29b0-d559-4754-a5e2-e7e610479dbf.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Beyoglu, Istanbul",41.0369,28.9774,f, +1207,Zeynep,Polat,zeynep.polat.14@seed.test,$2b$10$ChiSKjkLRl3agABBtdR7helnNSBjK/hq2cePUbthMFHYURCwa6D4q,http://localhost:8080/api/uploads/photos/a21248c3-1953-47ea-84f6-65c5ee03b81d.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Karsiyaka, Izmir",38.4598,27.1099,f, +1219,Pelin,Mert,pelin.mert.26@seed.test,$2b$10$m.a0aZt47.jkBVEuZfcOReHsyXEEYdnE6KtLzSviU9bWeCXUzIlvW,http://localhost:8080/api/uploads/photos/be3d7680-5012-49d2-8ff8-a0dbb7abce6c.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Kartal, Istanbul",40.9056,29.1908,f, +1226,Atilla,Asik,atilla.asik.33@seed.test,$2b$10$ucQKs0ENEyDhx4hzLtxif.y6K/xLTGKMxoZfoB1rII3UqCHBEly9C,http://localhost:8080/api/uploads/photos/445d4588-1c5f-4f22-87fc-b96f8942e801.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Samsun,41.2867,36.33,f, +1230,Hasan,Nalbant,hasan.nalbant.37@seed.test,$2b$10$oah5SBRNibNi6p7vHRBuZerDdJx7q4qK5wDSOX4ui8qDm4iFhcslC,http://localhost:8080/api/uploads/photos/a21f1f1e-3830-499a-ba1a-ee272e3166c0.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bornova, Izmir",38.469,27.22,f, +1235,Ufuk,Caglar,ufuk.caglar.42@seed.test,$2b$10$PMqubNJyZBNPaCnVlTlbi.oIFp3dntd8sAkMhBTfT68hKjwCIOPPe,http://localhost:8080/api/uploads/photos/6ce9e464-07ee-4e1f-b72b-25120f9cd444.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Yenimahalle, Ankara",39.9686,32.7882,f, +1244,Asuman,Gungor,asuman.gungor.51@seed.test,$2b$10$eOGvoyfHOFzkoCRd4yc7TuaWLbT9MFCpkopyOkWimKcH1g3Id0kvW,http://localhost:8080/api/uploads/photos/2ad7b372-5dc2-48f2-8b33-db265087ae9f.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1252,Gulay,Genc,gulay.genc.59@seed.test,$2b$10$vCODT7/FyCSVJOL14PAOdujng8G86tnAyAx4M5PPiKSwqvAHQU8FC,http://localhost:8080/api/uploads/photos/45737484-3087-4ec7-813e-89725931e605.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Pendik, Istanbul",40.8782,29.2536,f, +1255,Selen,Acar,selen.acar.62@seed.test,$2b$10$ELfV87D9E4yAxYKmMuYZWerEpgnoG94ZqTYypv3SKBNT9qL/L14Ea,http://localhost:8080/api/uploads/photos/29f0d4db-55dc-4d3b-b73e-62ab3ece110a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Cihangir, Istanbul",41.0322,28.9817,f, +1263,Sila,Birol,sila.birol.70@seed.test,$2b$10$4W2asI/fRWJN7yyjvrbmQOkeNvZuuwE54VU9vz7fdvz3bK5tNlU62,http://localhost:8080/api/uploads/photos/16e42acc-78b9-4440-80b0-c05d0bf4d042.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Muratpasa, Antalya",36.8849,30.7136,f, +1268,Mehmet,Turker,mehmet.turker.75@seed.test,$2b$10$epOUmBazAc7u3f3oCfXTkO/q4tDKGgkl/Q5lS6IKBLV.w5H9Ev6YS,http://localhost:8080/api/uploads/photos/3b90c760-21ba-4d86-8af1-3d4fdee62afa.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Sariyer, Istanbul",41.1714,29.0568,f, +1271,Yildiz,Demir,yildiz.demir.78@seed.test,$2b$10$O/CYfBA4mRXkNdxJoAjSUOood16vrCQ2NMWixRDbcFFWr1COpgkRW,http://localhost:8080/api/uploads/photos/44288d3b-df58-4d3b-8694-2c1aa072f048.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Kadikoy, Istanbul",40.9905,29.0303,f, +1194,Sinan,Ozkan,sinan.ozkan.1@seed.test,$2b$10$cYA.EuSl0uijhKj98RPdp.b2pX/n.HVBI9uOw430NoVl48qHftrty,http://localhost:8080/api/uploads/photos/5c3727e1-ae04-45fd-8cc0-f0b5e5c206f5.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1201,Polat,Aslanli,polat.aslanli.8@seed.test,$2b$10$Z.EsqifJcRQ7GoNtdiOPzekuaXWpOqdZez3sJRF.9T3IN7sdIssUK,http://localhost:8080/api/uploads/photos/c168dff6-f910-493f-8797-d23c6681d94a.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,Aydin,37.8466,27.8456,f, +1205,Neslihan,Erdem,neslihan.erdem.12@seed.test,$2b$10$zHueXxe1U9LZaMXhSXNBzO1Cnth07FgUpCsw8flXVVB/v7SlYmLMu,http://localhost:8080/api/uploads/photos/83158748-92c0-4953-8bce-5d968ad38190.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Beyoglu, Istanbul",41.0369,28.9774,f, +1210,Ece,Eren,ece.eren.17@seed.test,$2b$10$qzb9ev1/.PoUqL6.Mf1xtuHCFiw0ITnuXU9KlOdEtWZd96k68UWvG,http://localhost:8080/api/uploads/photos/98535111-5cfd-4dbe-8e43-ee6db78a64b3.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Erzurum,39.9043,41.267,f, +1213,Zafer,Sari,zafer.sari.20@seed.test,$2b$10$72.PGTpghheyq8D0AlorD.DYkSUZOUQEuGzg3w3KJwNxMuXUk05WW,http://localhost:8080/api/uploads/photos/09155e47-9f7b-4580-94e5-8e48cfe55906.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Kartal, Istanbul",40.9056,29.1908,f, +1217,Cihan,Sezer,cihan.sezer.24@seed.test,$2b$10$kmre1oS5F0D/62frAVjcB.oWYi/V3gW0kOEy2xrWqC3l7.cbFhU/i,http://localhost:8080/api/uploads/photos/988ffae0-b72d-4361-976c-48642d46ff71.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Esenyurt, Istanbul",41.0345,28.68,f, +1223,Halis,Yalcin,halis.yalcin.30@seed.test,$2b$10$QLj5WRoHtULs.NXuRpisB.qCx5o9i3GUGvDMtBYE0o5AiW4vXorPG,http://localhost:8080/api/uploads/photos/fd82c30e-b67d-4f46-bf8f-6d6e5f1c509a.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Diyarbakir,37.9144,40.2306,f, +1234,Can,Erdem,can.erdem.41@seed.test,$2b$10$A/WFDSateHfObW6N4yzLKecr1xhoq1aNZI.5jPZLoFqAp/3z3jIua,http://localhost:8080/api/uploads/photos/bdea1e4b-6c99-49c7-b9f3-7eec1f03fa24.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,Adana,37,35.3213,f, +1239,Selin,Gok,selin.gok.46@seed.test,$2b$10$E85slLQofyjKoh1tDc8PMOfdCtMdloiZj8Riff9hC9DlAcco19GiK,http://localhost:8080/api/uploads/photos/e2e7eb9d-a934-4bab-9b7e-53d7404cf642.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Atasehir, Istanbul",40.9846,29.1276,f, +1245,Sevgi,Bayer,sevgi.bayer.52@seed.test,$2b$10$.Km33SdDsPlzqgK01IqMyOaO7yiDMOx80e6oDSxELi/a2iWNVaFkm,http://localhost:8080/api/uploads/photos/fa076afc-a542-4bf1-bbcb-1d26d1f44a99.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Bakirkoy, Istanbul",40.9776,28.877,f, +1248,Ismail,Kiraz,ismail.kiraz.55@seed.test,$2b$10$wHIplAs14sesjjAVEUCOL.x58CprpBwkrYzWIJ7ej.PnDxYZ.lHBe,http://localhost:8080/api/uploads/photos/9a91cdea-45c0-4cf0-a63b-918524962b67.jpg,t,2026-05-13 08:02:38.925067+00,2,Europe/Istanbul,"Sariyer, Istanbul",41.1714,29.0568,f, +1258,Tarik,Erol,tarik.erol.65@seed.test,$2b$10$xgP/FdRz6WfxQvE7XwaSu.qqui8376K4FvtjLl2/YG7SQwz3ctjRa,http://localhost:8080/api/uploads/photos/d07f49ea-ac9e-41e8-8059-94a1123d1812.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Beyoglu, Istanbul",41.0369,28.9774,f, +1266,Onur,Cetin,onur.cetin.73@seed.test,$2b$10$TQ0JBS2XZt4sU/eRQP7FoeKoDdeSiUusBEib/MtSoN8d3y8cXKSce,http://localhost:8080/api/uploads/photos/d90dfcf9-9eca-430d-9c49-caf3404a3e30.jpg,t,2026-05-13 08:02:38.925067+00,1,Europe/Istanbul,"Atasehir, Istanbul",40.9846,29.1276,f, diff --git a/scripts/seed_snapshot_data/manifest.json b/scripts/seed_snapshot_data/manifest.json new file mode 100644 index 00000000..7b6a0be0 --- /dev/null +++ b/scripts/seed_snapshot_data/manifest.json @@ -0,0 +1,52 @@ +{ + "container": "bounswe2026group7-backend-1", + "dumped_at": "2026-05-13T08:48:47.783741+00:00", + "sequences": { + "conversations": 32, + "feed_post_comments": 1802, + "feed_posts": 802, + "meetings": 112, + "mentor_availability_slots": 322, + "mentor_ratings": 45, + "mentorship_requests": 76, + "mentorships": 76, + "messages": 235, + "milestones": 62, + "tasks": 74, + "users": 1271 + }, + "source_dsn_host": "localhost:5433/group7db", + "tables": { + "admins": 1, + "attachments": 78, + "conversation_participants": 26, + "conversations": 13, + "feed_post_attachments": 71, + "feed_post_comment_likes": 1639, + "feed_post_comments": 655, + "feed_post_hashtags": 561, + "feed_post_likes": 852, + "feed_posts": 288, + "follows": 377, + "meetings": 51, + "mentee_interests": 121, + "mentee_skills": 112, + "mentees": 57, + "mentor_availability_slots": 40, + "mentor_interests": 51, + "mentor_preferred_mentee_skills": 39, + "mentor_ratings": 45, + "mentors": 20, + "mentorship_requests": 54, + "mentorships": 54, + "messages": 100, + "milestones": 28, + "task_assignment_attachments": 7, + "tasks": 34, + "users": 78 + }, + "uploads": { + "attachments": 238, + "photos": 151 + } +} \ No newline at end of file diff --git a/scripts/seed_snapshot_data/uploads/attachments/015cfd17-c111-40c2-9842-12dd71bd75e4.jpg b/scripts/seed_snapshot_data/uploads/attachments/015cfd17-c111-40c2-9842-12dd71bd75e4.jpg new file mode 100644 index 00000000..b104fa95 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/015cfd17-c111-40c2-9842-12dd71bd75e4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/01cbf6f5-38a4-40f2-add4-d1cb479e4509.jpg b/scripts/seed_snapshot_data/uploads/attachments/01cbf6f5-38a4-40f2-add4-d1cb479e4509.jpg new file mode 100644 index 00000000..1eb1bf10 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/01cbf6f5-38a4-40f2-add4-d1cb479e4509.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/01e7b3ac-381b-448d-9007-136c392f6d7b.jpg b/scripts/seed_snapshot_data/uploads/attachments/01e7b3ac-381b-448d-9007-136c392f6d7b.jpg new file mode 100644 index 00000000..abca3fb5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/01e7b3ac-381b-448d-9007-136c392f6d7b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/03b07893-e564-436e-aa31-9324b3080bc0.jpg b/scripts/seed_snapshot_data/uploads/attachments/03b07893-e564-436e-aa31-9324b3080bc0.jpg new file mode 100644 index 00000000..2e86ddbf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/03b07893-e564-436e-aa31-9324b3080bc0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/05562473-5437-4435-aaf7-42d1ca1f4a56.jpg b/scripts/seed_snapshot_data/uploads/attachments/05562473-5437-4435-aaf7-42d1ca1f4a56.jpg new file mode 100644 index 00000000..07f4cfc1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/05562473-5437-4435-aaf7-42d1ca1f4a56.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0583b226-986c-4b6c-800e-8e160f5881b8.jpg b/scripts/seed_snapshot_data/uploads/attachments/0583b226-986c-4b6c-800e-8e160f5881b8.jpg new file mode 100644 index 00000000..69112e9a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0583b226-986c-4b6c-800e-8e160f5881b8.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/07bd5228-6063-416b-8b58-f329f88a6108.jpg b/scripts/seed_snapshot_data/uploads/attachments/07bd5228-6063-416b-8b58-f329f88a6108.jpg new file mode 100644 index 00000000..b7f1c404 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/07bd5228-6063-416b-8b58-f329f88a6108.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/08f7be01-09fa-4122-9316-87eff5a761d6.jpg b/scripts/seed_snapshot_data/uploads/attachments/08f7be01-09fa-4122-9316-87eff5a761d6.jpg new file mode 100644 index 00000000..4237a192 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/08f7be01-09fa-4122-9316-87eff5a761d6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/09184a48-6ac9-4e64-8e0e-0b37a5d3563d.jpg b/scripts/seed_snapshot_data/uploads/attachments/09184a48-6ac9-4e64-8e0e-0b37a5d3563d.jpg new file mode 100644 index 00000000..86b16395 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/09184a48-6ac9-4e64-8e0e-0b37a5d3563d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/09200afa-a40a-4691-bfdf-50be5f49c8b1.jpg b/scripts/seed_snapshot_data/uploads/attachments/09200afa-a40a-4691-bfdf-50be5f49c8b1.jpg new file mode 100644 index 00000000..e8501fcc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/09200afa-a40a-4691-bfdf-50be5f49c8b1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0a76e679-2584-415e-a0c3-410b9102d873.jpg b/scripts/seed_snapshot_data/uploads/attachments/0a76e679-2584-415e-a0c3-410b9102d873.jpg new file mode 100644 index 00000000..7d781726 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0a76e679-2584-415e-a0c3-410b9102d873.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0afe3ad6-154f-4bfe-8552-e16dddf92f41.jpg b/scripts/seed_snapshot_data/uploads/attachments/0afe3ad6-154f-4bfe-8552-e16dddf92f41.jpg new file mode 100644 index 00000000..6880783c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0afe3ad6-154f-4bfe-8552-e16dddf92f41.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0bed4673-775c-497a-8070-d487bf8837ba.jpg b/scripts/seed_snapshot_data/uploads/attachments/0bed4673-775c-497a-8070-d487bf8837ba.jpg new file mode 100644 index 00000000..b8801fc5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0bed4673-775c-497a-8070-d487bf8837ba.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0c7f5361-8827-4d65-9cec-99409acc4a5a.jpg b/scripts/seed_snapshot_data/uploads/attachments/0c7f5361-8827-4d65-9cec-99409acc4a5a.jpg new file mode 100644 index 00000000..b0c149f8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0c7f5361-8827-4d65-9cec-99409acc4a5a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/0f936ad3-e8f0-4ad7-ae1c-a3814380c106.jpg b/scripts/seed_snapshot_data/uploads/attachments/0f936ad3-e8f0-4ad7-ae1c-a3814380c106.jpg new file mode 100644 index 00000000..e88f38f3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/0f936ad3-e8f0-4ad7-ae1c-a3814380c106.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/11574ede-4b7a-40d2-9296-46f5f8cd4169.jpg b/scripts/seed_snapshot_data/uploads/attachments/11574ede-4b7a-40d2-9296-46f5f8cd4169.jpg new file mode 100644 index 00000000..e6966f26 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/11574ede-4b7a-40d2-9296-46f5f8cd4169.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/122c80c9-6dad-4a94-91d9-38f3cd7f25eb.jpg b/scripts/seed_snapshot_data/uploads/attachments/122c80c9-6dad-4a94-91d9-38f3cd7f25eb.jpg new file mode 100644 index 00000000..5d8e8e5a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/122c80c9-6dad-4a94-91d9-38f3cd7f25eb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/13fd74d6-4068-4522-8b2c-487eaaabc02e.pdf b/scripts/seed_snapshot_data/uploads/attachments/13fd74d6-4068-4522-8b2c-487eaaabc02e.pdf new file mode 100644 index 00000000..0a12a724 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/13fd74d6-4068-4522-8b2c-487eaaabc02e.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1497388c-e6b2-4cc1-bfab-ff6adae986f6.jpg b/scripts/seed_snapshot_data/uploads/attachments/1497388c-e6b2-4cc1-bfab-ff6adae986f6.jpg new file mode 100644 index 00000000..672c6992 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1497388c-e6b2-4cc1-bfab-ff6adae986f6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/14b7d43a-5325-4ae0-8131-57583507577f.jpg b/scripts/seed_snapshot_data/uploads/attachments/14b7d43a-5325-4ae0-8131-57583507577f.jpg new file mode 100644 index 00000000..3d3f3ab3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/14b7d43a-5325-4ae0-8131-57583507577f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/15f462f3-0a78-4713-bb31-c510a1229503.jpg b/scripts/seed_snapshot_data/uploads/attachments/15f462f3-0a78-4713-bb31-c510a1229503.jpg new file mode 100644 index 00000000..11431742 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/15f462f3-0a78-4713-bb31-c510a1229503.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/18638619-e1fd-4a5e-a71e-8f9881020d03.jpg b/scripts/seed_snapshot_data/uploads/attachments/18638619-e1fd-4a5e-a71e-8f9881020d03.jpg new file mode 100644 index 00000000..209c11f3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/18638619-e1fd-4a5e-a71e-8f9881020d03.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/19bc5d84-ad32-4e05-8894-f996af15252b.jpg b/scripts/seed_snapshot_data/uploads/attachments/19bc5d84-ad32-4e05-8894-f996af15252b.jpg new file mode 100644 index 00000000..4d271228 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/19bc5d84-ad32-4e05-8894-f996af15252b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1c19ca33-28ee-489d-9092-1946c4718363.jpg b/scripts/seed_snapshot_data/uploads/attachments/1c19ca33-28ee-489d-9092-1946c4718363.jpg new file mode 100644 index 00000000..e1b022ac Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1c19ca33-28ee-489d-9092-1946c4718363.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1c337628-14b4-4371-a9f2-82954a2b3622.jpg b/scripts/seed_snapshot_data/uploads/attachments/1c337628-14b4-4371-a9f2-82954a2b3622.jpg new file mode 100644 index 00000000..df5074c1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1c337628-14b4-4371-a9f2-82954a2b3622.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1c77fc5d-a562-4ce2-8168-4c931acdf914.jpg b/scripts/seed_snapshot_data/uploads/attachments/1c77fc5d-a562-4ce2-8168-4c931acdf914.jpg new file mode 100644 index 00000000..2fdbc555 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1c77fc5d-a562-4ce2-8168-4c931acdf914.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1d98d68d-1762-4028-957f-c5def43c6c4f.jpg b/scripts/seed_snapshot_data/uploads/attachments/1d98d68d-1762-4028-957f-c5def43c6c4f.jpg new file mode 100644 index 00000000..85d59821 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1d98d68d-1762-4028-957f-c5def43c6c4f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/1f8cc81d-8a2c-4036-90f9-a7347f92f17b.jpg b/scripts/seed_snapshot_data/uploads/attachments/1f8cc81d-8a2c-4036-90f9-a7347f92f17b.jpg new file mode 100644 index 00000000..397209df Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/1f8cc81d-8a2c-4036-90f9-a7347f92f17b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/221fb86d-e5e0-4709-ac12-854d6e83bb35.jpg b/scripts/seed_snapshot_data/uploads/attachments/221fb86d-e5e0-4709-ac12-854d6e83bb35.jpg new file mode 100644 index 00000000..ad56d3cc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/221fb86d-e5e0-4709-ac12-854d6e83bb35.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/23545c9f-8b97-4f7e-99f0-18f926b4e44a.jpg b/scripts/seed_snapshot_data/uploads/attachments/23545c9f-8b97-4f7e-99f0-18f926b4e44a.jpg new file mode 100644 index 00000000..b227a979 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/23545c9f-8b97-4f7e-99f0-18f926b4e44a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2447d792-824e-49af-bf3a-c4b76083612a.jpg b/scripts/seed_snapshot_data/uploads/attachments/2447d792-824e-49af-bf3a-c4b76083612a.jpg new file mode 100644 index 00000000..bc966701 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2447d792-824e-49af-bf3a-c4b76083612a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/24f15107-037e-4633-9784-b0da7a75e66d.jpg b/scripts/seed_snapshot_data/uploads/attachments/24f15107-037e-4633-9784-b0da7a75e66d.jpg new file mode 100644 index 00000000..48b1ac14 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/24f15107-037e-4633-9784-b0da7a75e66d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/25146b07-a57d-439b-b313-92c88aebabb2.jpg b/scripts/seed_snapshot_data/uploads/attachments/25146b07-a57d-439b-b313-92c88aebabb2.jpg new file mode 100644 index 00000000..8827f809 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/25146b07-a57d-439b-b313-92c88aebabb2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/269f9a08-9e08-4d74-9d56-1e1f78a1f71a.jpg b/scripts/seed_snapshot_data/uploads/attachments/269f9a08-9e08-4d74-9d56-1e1f78a1f71a.jpg new file mode 100644 index 00000000..14792058 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/269f9a08-9e08-4d74-9d56-1e1f78a1f71a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/285e44d8-fab5-4b3f-b14a-3da121f1c562.jpg b/scripts/seed_snapshot_data/uploads/attachments/285e44d8-fab5-4b3f-b14a-3da121f1c562.jpg new file mode 100644 index 00000000..4924c3de Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/285e44d8-fab5-4b3f-b14a-3da121f1c562.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/294e0307-a256-480e-9b39-40ecadcfaafa.jpg b/scripts/seed_snapshot_data/uploads/attachments/294e0307-a256-480e-9b39-40ecadcfaafa.jpg new file mode 100644 index 00000000..47129fde Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/294e0307-a256-480e-9b39-40ecadcfaafa.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0.jpg b/scripts/seed_snapshot_data/uploads/attachments/29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0.jpg new file mode 100644 index 00000000..d48d474f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/29dd9d6c-7ee2-4aa3-8046-421d1a26a8d0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2b824303-0589-4f21-9b2b-11995e9dfaf9.jpg b/scripts/seed_snapshot_data/uploads/attachments/2b824303-0589-4f21-9b2b-11995e9dfaf9.jpg new file mode 100644 index 00000000..2841d394 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2b824303-0589-4f21-9b2b-11995e9dfaf9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2c270ece-e645-47d2-acaf-32f0e2af45c0.jpg b/scripts/seed_snapshot_data/uploads/attachments/2c270ece-e645-47d2-acaf-32f0e2af45c0.jpg new file mode 100644 index 00000000..73c6f585 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2c270ece-e645-47d2-acaf-32f0e2af45c0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2c767444-9c81-4691-a424-74b3f0408e75.jpg b/scripts/seed_snapshot_data/uploads/attachments/2c767444-9c81-4691-a424-74b3f0408e75.jpg new file mode 100644 index 00000000..f3ed873d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2c767444-9c81-4691-a424-74b3f0408e75.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2d5bcf29-37af-435b-b2ac-1ef067975257.jpg b/scripts/seed_snapshot_data/uploads/attachments/2d5bcf29-37af-435b-b2ac-1ef067975257.jpg new file mode 100644 index 00000000..66c1cffb Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2d5bcf29-37af-435b-b2ac-1ef067975257.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2da4e5c1-cf52-44a8-8915-ed841f31f8a6.jpg b/scripts/seed_snapshot_data/uploads/attachments/2da4e5c1-cf52-44a8-8915-ed841f31f8a6.jpg new file mode 100644 index 00000000..f3af5180 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2da4e5c1-cf52-44a8-8915-ed841f31f8a6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2eafa847-2d98-47ca-b2f7-397f1e69eb46.jpg b/scripts/seed_snapshot_data/uploads/attachments/2eafa847-2d98-47ca-b2f7-397f1e69eb46.jpg new file mode 100644 index 00000000..f83dcf5b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2eafa847-2d98-47ca-b2f7-397f1e69eb46.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/2ffe33ec-fd23-49ea-a33a-809e703e32bb.jpg b/scripts/seed_snapshot_data/uploads/attachments/2ffe33ec-fd23-49ea-a33a-809e703e32bb.jpg new file mode 100644 index 00000000..e10ae341 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/2ffe33ec-fd23-49ea-a33a-809e703e32bb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3076f1d0-50a9-47c6-945a-2d300f5a6668.jpg b/scripts/seed_snapshot_data/uploads/attachments/3076f1d0-50a9-47c6-945a-2d300f5a6668.jpg new file mode 100644 index 00000000..e5e9658f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3076f1d0-50a9-47c6-945a-2d300f5a6668.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/30c03ebf-a5c9-4e12-a112-5c233fafb3eb.jpg b/scripts/seed_snapshot_data/uploads/attachments/30c03ebf-a5c9-4e12-a112-5c233fafb3eb.jpg new file mode 100644 index 00000000..d5dd6c38 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/30c03ebf-a5c9-4e12-a112-5c233fafb3eb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3159cc61-ab26-4fc5-9964-e4698ca602b3.pdf b/scripts/seed_snapshot_data/uploads/attachments/3159cc61-ab26-4fc5-9964-e4698ca602b3.pdf new file mode 100644 index 00000000..8b917426 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3159cc61-ab26-4fc5-9964-e4698ca602b3.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3463b7da-adaa-409c-a567-34b01e8edd60.jpg b/scripts/seed_snapshot_data/uploads/attachments/3463b7da-adaa-409c-a567-34b01e8edd60.jpg new file mode 100644 index 00000000..ada7a2e3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3463b7da-adaa-409c-a567-34b01e8edd60.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/36054475-350a-4cb8-a8c8-ae5a405c54a5.jpg b/scripts/seed_snapshot_data/uploads/attachments/36054475-350a-4cb8-a8c8-ae5a405c54a5.jpg new file mode 100644 index 00000000..53436a4e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/36054475-350a-4cb8-a8c8-ae5a405c54a5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3699e78e-dc2f-4ee4-8495-c330a40d4914.jpg b/scripts/seed_snapshot_data/uploads/attachments/3699e78e-dc2f-4ee4-8495-c330a40d4914.jpg new file mode 100644 index 00000000..1babdb08 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3699e78e-dc2f-4ee4-8495-c330a40d4914.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/372b56b9-00a9-4afb-8db4-749550c5b715.jpg b/scripts/seed_snapshot_data/uploads/attachments/372b56b9-00a9-4afb-8db4-749550c5b715.jpg new file mode 100644 index 00000000..15abb227 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/372b56b9-00a9-4afb-8db4-749550c5b715.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/38399658-0c65-47a7-a0fc-2a15b64e3bf7.jpg b/scripts/seed_snapshot_data/uploads/attachments/38399658-0c65-47a7-a0fc-2a15b64e3bf7.jpg new file mode 100644 index 00000000..2a1b779a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/38399658-0c65-47a7-a0fc-2a15b64e3bf7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3d1dd692-b7bb-470a-ad38-c31308a65450.jpg b/scripts/seed_snapshot_data/uploads/attachments/3d1dd692-b7bb-470a-ad38-c31308a65450.jpg new file mode 100644 index 00000000..15d277bb Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3d1dd692-b7bb-470a-ad38-c31308a65450.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3e8a36c6-08ae-41af-af30-b97aa77b03e7.jpg b/scripts/seed_snapshot_data/uploads/attachments/3e8a36c6-08ae-41af-af30-b97aa77b03e7.jpg new file mode 100644 index 00000000..46e414a9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3e8a36c6-08ae-41af-af30-b97aa77b03e7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/3eadea80-4440-4a20-b20e-1a6e8db273b9.jpg b/scripts/seed_snapshot_data/uploads/attachments/3eadea80-4440-4a20-b20e-1a6e8db273b9.jpg new file mode 100644 index 00000000..cf01f0ab Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/3eadea80-4440-4a20-b20e-1a6e8db273b9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/405a82c5-5271-44d7-af5d-eceb6d4c836d.jpg b/scripts/seed_snapshot_data/uploads/attachments/405a82c5-5271-44d7-af5d-eceb6d4c836d.jpg new file mode 100644 index 00000000..8ad54263 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/405a82c5-5271-44d7-af5d-eceb6d4c836d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/419725f6-f058-4167-ab47-db955ce619c7.jpg b/scripts/seed_snapshot_data/uploads/attachments/419725f6-f058-4167-ab47-db955ce619c7.jpg new file mode 100644 index 00000000..39da3b2d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/419725f6-f058-4167-ab47-db955ce619c7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/419a8023-f19e-4ccb-8abd-e55d52836662.jpg b/scripts/seed_snapshot_data/uploads/attachments/419a8023-f19e-4ccb-8abd-e55d52836662.jpg new file mode 100644 index 00000000..4eb6743f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/419a8023-f19e-4ccb-8abd-e55d52836662.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/428856e8-ea4f-4c9b-ad8c-d5784a268d59.jpg b/scripts/seed_snapshot_data/uploads/attachments/428856e8-ea4f-4c9b-ad8c-d5784a268d59.jpg new file mode 100644 index 00000000..b9704c6a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/428856e8-ea4f-4c9b-ad8c-d5784a268d59.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/430686e7-3dcc-4f3b-8ea9-d41c84f256e5.jpg b/scripts/seed_snapshot_data/uploads/attachments/430686e7-3dcc-4f3b-8ea9-d41c84f256e5.jpg new file mode 100644 index 00000000..ea3affa2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/430686e7-3dcc-4f3b-8ea9-d41c84f256e5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/43a1dea5-2dfe-4f0b-abdb-6d7c65ba7316.jpg b/scripts/seed_snapshot_data/uploads/attachments/43a1dea5-2dfe-4f0b-abdb-6d7c65ba7316.jpg new file mode 100644 index 00000000..a823eea5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/43a1dea5-2dfe-4f0b-abdb-6d7c65ba7316.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4606c6d8-be15-442f-a0da-0f04862f85f4.jpg b/scripts/seed_snapshot_data/uploads/attachments/4606c6d8-be15-442f-a0da-0f04862f85f4.jpg new file mode 100644 index 00000000..ac8988da Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4606c6d8-be15-442f-a0da-0f04862f85f4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/48ab3d42-fd51-4769-80df-c7c6aa4293ec.jpg b/scripts/seed_snapshot_data/uploads/attachments/48ab3d42-fd51-4769-80df-c7c6aa4293ec.jpg new file mode 100644 index 00000000..d0d50918 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/48ab3d42-fd51-4769-80df-c7c6aa4293ec.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4aa72b48-c3fc-43f8-ba60-d12a1ee542bd.jpg b/scripts/seed_snapshot_data/uploads/attachments/4aa72b48-c3fc-43f8-ba60-d12a1ee542bd.jpg new file mode 100644 index 00000000..fb271a78 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4aa72b48-c3fc-43f8-ba60-d12a1ee542bd.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4b78d60d-60e3-4453-b98b-569d27045faf.jpg b/scripts/seed_snapshot_data/uploads/attachments/4b78d60d-60e3-4453-b98b-569d27045faf.jpg new file mode 100644 index 00000000..500ddbd9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4b78d60d-60e3-4453-b98b-569d27045faf.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4c15f506-5436-4f61-a9a4-410ac38dee70.pdf b/scripts/seed_snapshot_data/uploads/attachments/4c15f506-5436-4f61-a9a4-410ac38dee70.pdf new file mode 100644 index 00000000..d906a9e9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4c15f506-5436-4f61-a9a4-410ac38dee70.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4ca4553a-e2ee-4007-8a2b-02ad23384932.jpg b/scripts/seed_snapshot_data/uploads/attachments/4ca4553a-e2ee-4007-8a2b-02ad23384932.jpg new file mode 100644 index 00000000..cf45dd5b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4ca4553a-e2ee-4007-8a2b-02ad23384932.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/4ff5cf2f-fbeb-4177-9a24-dd1c84ce8711.jpg b/scripts/seed_snapshot_data/uploads/attachments/4ff5cf2f-fbeb-4177-9a24-dd1c84ce8711.jpg new file mode 100644 index 00000000..040028a9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/4ff5cf2f-fbeb-4177-9a24-dd1c84ce8711.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5054f7d3-e757-472a-be19-74c12f5a1a0f.jpg b/scripts/seed_snapshot_data/uploads/attachments/5054f7d3-e757-472a-be19-74c12f5a1a0f.jpg new file mode 100644 index 00000000..82fcc0a1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5054f7d3-e757-472a-be19-74c12f5a1a0f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/509dae88-20b6-4b7a-b034-e36680811d9c.jpg b/scripts/seed_snapshot_data/uploads/attachments/509dae88-20b6-4b7a-b034-e36680811d9c.jpg new file mode 100644 index 00000000..7c050fca Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/509dae88-20b6-4b7a-b034-e36680811d9c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/50c629c3-23dd-402d-9c21-037b0941a7ad.jpg b/scripts/seed_snapshot_data/uploads/attachments/50c629c3-23dd-402d-9c21-037b0941a7ad.jpg new file mode 100644 index 00000000..498164bd Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/50c629c3-23dd-402d-9c21-037b0941a7ad.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/52f47ee3-8f48-4d0d-8109-e82e0671063f.jpg b/scripts/seed_snapshot_data/uploads/attachments/52f47ee3-8f48-4d0d-8109-e82e0671063f.jpg new file mode 100644 index 00000000..6507b0bc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/52f47ee3-8f48-4d0d-8109-e82e0671063f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/54d1a1d0-18c9-4f58-934f-7aa1ea9ad6a3.jpg b/scripts/seed_snapshot_data/uploads/attachments/54d1a1d0-18c9-4f58-934f-7aa1ea9ad6a3.jpg new file mode 100644 index 00000000..5f4471b7 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/54d1a1d0-18c9-4f58-934f-7aa1ea9ad6a3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/54fdd665-a803-43ee-b37f-c49b5632cf12.jpg b/scripts/seed_snapshot_data/uploads/attachments/54fdd665-a803-43ee-b37f-c49b5632cf12.jpg new file mode 100644 index 00000000..f192b9f4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/54fdd665-a803-43ee-b37f-c49b5632cf12.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/58beb9e5-04f4-4557-9f1f-dfb94d2f9d6f.jpg b/scripts/seed_snapshot_data/uploads/attachments/58beb9e5-04f4-4557-9f1f-dfb94d2f9d6f.jpg new file mode 100644 index 00000000..6a42d9a0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/58beb9e5-04f4-4557-9f1f-dfb94d2f9d6f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5903c709-235d-4c64-a122-5c6ab831bbe4.jpg b/scripts/seed_snapshot_data/uploads/attachments/5903c709-235d-4c64-a122-5c6ab831bbe4.jpg new file mode 100644 index 00000000..dae0d836 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5903c709-235d-4c64-a122-5c6ab831bbe4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5a95ed97-d45e-4c94-9f44-db831e4fe000.jpg b/scripts/seed_snapshot_data/uploads/attachments/5a95ed97-d45e-4c94-9f44-db831e4fe000.jpg new file mode 100644 index 00000000..5af08a20 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5a95ed97-d45e-4c94-9f44-db831e4fe000.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5b394c45-005f-493e-abc9-7d83b0a36c7a.jpg b/scripts/seed_snapshot_data/uploads/attachments/5b394c45-005f-493e-abc9-7d83b0a36c7a.jpg new file mode 100644 index 00000000..c0040876 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5b394c45-005f-493e-abc9-7d83b0a36c7a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5d3c07e8-5084-4524-aaa8-42f3eb2141f3.jpg b/scripts/seed_snapshot_data/uploads/attachments/5d3c07e8-5084-4524-aaa8-42f3eb2141f3.jpg new file mode 100644 index 00000000..d4aec78e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5d3c07e8-5084-4524-aaa8-42f3eb2141f3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/5f7f13c3-fd57-49c9-9f4e-20420d6ab0de.jpg b/scripts/seed_snapshot_data/uploads/attachments/5f7f13c3-fd57-49c9-9f4e-20420d6ab0de.jpg new file mode 100644 index 00000000..d538e63f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/5f7f13c3-fd57-49c9-9f4e-20420d6ab0de.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/60460928-e42d-48b1-8761-525d10828a9f.jpg b/scripts/seed_snapshot_data/uploads/attachments/60460928-e42d-48b1-8761-525d10828a9f.jpg new file mode 100644 index 00000000..cb692f11 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/60460928-e42d-48b1-8761-525d10828a9f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/622ab8d5-79fe-4359-aafc-b6ffec8c60ba.jpg b/scripts/seed_snapshot_data/uploads/attachments/622ab8d5-79fe-4359-aafc-b6ffec8c60ba.jpg new file mode 100644 index 00000000..d3ce0276 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/622ab8d5-79fe-4359-aafc-b6ffec8c60ba.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/629754b7-240c-4ff1-b179-b768b54cc7ad.jpg b/scripts/seed_snapshot_data/uploads/attachments/629754b7-240c-4ff1-b179-b768b54cc7ad.jpg new file mode 100644 index 00000000..1999a131 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/629754b7-240c-4ff1-b179-b768b54cc7ad.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/62dbeacd-5c57-4edb-b644-6913a3f56aa6.jpg b/scripts/seed_snapshot_data/uploads/attachments/62dbeacd-5c57-4edb-b644-6913a3f56aa6.jpg new file mode 100644 index 00000000..8ed7ad3c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/62dbeacd-5c57-4edb-b644-6913a3f56aa6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/639e4aa4-b55f-4d7b-b49b-5c19a4d79bf3.jpg b/scripts/seed_snapshot_data/uploads/attachments/639e4aa4-b55f-4d7b-b49b-5c19a4d79bf3.jpg new file mode 100644 index 00000000..4db0f77d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/639e4aa4-b55f-4d7b-b49b-5c19a4d79bf3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/65bcf29c-b2b1-45ae-b15c-abdb988079c5.jpg b/scripts/seed_snapshot_data/uploads/attachments/65bcf29c-b2b1-45ae-b15c-abdb988079c5.jpg new file mode 100644 index 00000000..538014ca Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/65bcf29c-b2b1-45ae-b15c-abdb988079c5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/660c6ab1-6d9c-49ae-bb54-83236627fd8d.jpg b/scripts/seed_snapshot_data/uploads/attachments/660c6ab1-6d9c-49ae-bb54-83236627fd8d.jpg new file mode 100644 index 00000000..f0853674 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/660c6ab1-6d9c-49ae-bb54-83236627fd8d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/66753816-2418-4431-a279-0e4d9f723b0f.jpg b/scripts/seed_snapshot_data/uploads/attachments/66753816-2418-4431-a279-0e4d9f723b0f.jpg new file mode 100644 index 00000000..9e6fb628 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/66753816-2418-4431-a279-0e4d9f723b0f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/684f4bfc-da58-4825-ac7c-970eba701223.jpg b/scripts/seed_snapshot_data/uploads/attachments/684f4bfc-da58-4825-ac7c-970eba701223.jpg new file mode 100644 index 00000000..e6966f26 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/684f4bfc-da58-4825-ac7c-970eba701223.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/6abc3dc5-f8bb-436f-83ef-2160df907098.jpg b/scripts/seed_snapshot_data/uploads/attachments/6abc3dc5-f8bb-436f-83ef-2160df907098.jpg new file mode 100644 index 00000000..8ad54263 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/6abc3dc5-f8bb-436f-83ef-2160df907098.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/6badd8b9-d6fb-4cc8-bca2-2e03300517b6.jpg b/scripts/seed_snapshot_data/uploads/attachments/6badd8b9-d6fb-4cc8-bca2-2e03300517b6.jpg new file mode 100644 index 00000000..befe7db7 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/6badd8b9-d6fb-4cc8-bca2-2e03300517b6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/6ca96872-15de-45b1-842b-d5084e6ad0b8.jpg b/scripts/seed_snapshot_data/uploads/attachments/6ca96872-15de-45b1-842b-d5084e6ad0b8.jpg new file mode 100644 index 00000000..d97cb050 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/6ca96872-15de-45b1-842b-d5084e6ad0b8.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/6e034127-7b87-4269-89f6-50a9e0916452.jpg b/scripts/seed_snapshot_data/uploads/attachments/6e034127-7b87-4269-89f6-50a9e0916452.jpg new file mode 100644 index 00000000..c89a0540 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/6e034127-7b87-4269-89f6-50a9e0916452.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/707fd3c4-4eac-40d6-bbc3-6dfc2463bf33.jpg b/scripts/seed_snapshot_data/uploads/attachments/707fd3c4-4eac-40d6-bbc3-6dfc2463bf33.jpg new file mode 100644 index 00000000..1ccf9b89 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/707fd3c4-4eac-40d6-bbc3-6dfc2463bf33.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/71773e9d-1ac3-4ab2-b674-253c7080a3da.jpg b/scripts/seed_snapshot_data/uploads/attachments/71773e9d-1ac3-4ab2-b674-253c7080a3da.jpg new file mode 100644 index 00000000..9676abf6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/71773e9d-1ac3-4ab2-b674-253c7080a3da.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/71dc32cc-5c1d-4921-b97a-f746c5686b34.jpg b/scripts/seed_snapshot_data/uploads/attachments/71dc32cc-5c1d-4921-b97a-f746c5686b34.jpg new file mode 100644 index 00000000..a2e04c14 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/71dc32cc-5c1d-4921-b97a-f746c5686b34.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/72ec30c3-d953-47db-ac53-7ec168726af1.jpg b/scripts/seed_snapshot_data/uploads/attachments/72ec30c3-d953-47db-ac53-7ec168726af1.jpg new file mode 100644 index 00000000..e2e14b75 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/72ec30c3-d953-47db-ac53-7ec168726af1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/72f52920-ef2a-4205-8a30-b3060c8d040b.jpg b/scripts/seed_snapshot_data/uploads/attachments/72f52920-ef2a-4205-8a30-b3060c8d040b.jpg new file mode 100644 index 00000000..a2e04c14 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/72f52920-ef2a-4205-8a30-b3060c8d040b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/731d440b-df13-4af1-969d-a5f52000714f.jpg b/scripts/seed_snapshot_data/uploads/attachments/731d440b-df13-4af1-969d-a5f52000714f.jpg new file mode 100644 index 00000000..9d1754c1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/731d440b-df13-4af1-969d-a5f52000714f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/73602877-b71c-4cff-9af5-0e0681664072.jpg b/scripts/seed_snapshot_data/uploads/attachments/73602877-b71c-4cff-9af5-0e0681664072.jpg new file mode 100644 index 00000000..b267c7d4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/73602877-b71c-4cff-9af5-0e0681664072.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/73ddff02-97ff-4067-8e59-4504a9a11bc0.jpg b/scripts/seed_snapshot_data/uploads/attachments/73ddff02-97ff-4067-8e59-4504a9a11bc0.jpg new file mode 100644 index 00000000..f380c654 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/73ddff02-97ff-4067-8e59-4504a9a11bc0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/75649364-7f3a-4114-b289-16f1e743d9db.jpg b/scripts/seed_snapshot_data/uploads/attachments/75649364-7f3a-4114-b289-16f1e743d9db.jpg new file mode 100644 index 00000000..30eb2ddc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/75649364-7f3a-4114-b289-16f1e743d9db.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/75b14f5d-e79f-4b74-ac91-3ac203e4f4b0.jpg b/scripts/seed_snapshot_data/uploads/attachments/75b14f5d-e79f-4b74-ac91-3ac203e4f4b0.jpg new file mode 100644 index 00000000..2d7976ca Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/75b14f5d-e79f-4b74-ac91-3ac203e4f4b0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/76d688ce-de88-4d96-9575-c7fe48772d57.jpg b/scripts/seed_snapshot_data/uploads/attachments/76d688ce-de88-4d96-9575-c7fe48772d57.jpg new file mode 100644 index 00000000..477834a9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/76d688ce-de88-4d96-9575-c7fe48772d57.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/774ff526-d89a-4568-9974-ac51cfee141a.jpg b/scripts/seed_snapshot_data/uploads/attachments/774ff526-d89a-4568-9974-ac51cfee141a.jpg new file mode 100644 index 00000000..3cd158a7 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/774ff526-d89a-4568-9974-ac51cfee141a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7a71a564-dfbe-4d2a-9d96-2e5b68c82ead.jpg b/scripts/seed_snapshot_data/uploads/attachments/7a71a564-dfbe-4d2a-9d96-2e5b68c82ead.jpg new file mode 100644 index 00000000..388ff926 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7a71a564-dfbe-4d2a-9d96-2e5b68c82ead.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436.jpg b/scripts/seed_snapshot_data/uploads/attachments/7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436.jpg new file mode 100644 index 00000000..96186430 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7aaa69e9-ac8a-47d4-bd9d-ffbc7ab70436.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7b8658c1-431f-4fa8-91a6-87b9c5b4d060.jpg b/scripts/seed_snapshot_data/uploads/attachments/7b8658c1-431f-4fa8-91a6-87b9c5b4d060.jpg new file mode 100644 index 00000000..04f7aeed Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7b8658c1-431f-4fa8-91a6-87b9c5b4d060.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7b9f05d6-4505-4ea4-8d29-6dadffde428f.jpg b/scripts/seed_snapshot_data/uploads/attachments/7b9f05d6-4505-4ea4-8d29-6dadffde428f.jpg new file mode 100644 index 00000000..f183e349 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7b9f05d6-4505-4ea4-8d29-6dadffde428f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7f1d8b3f-0fb5-4358-99d7-b52e53d9d5b5.jpg b/scripts/seed_snapshot_data/uploads/attachments/7f1d8b3f-0fb5-4358-99d7-b52e53d9d5b5.jpg new file mode 100644 index 00000000..87919656 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7f1d8b3f-0fb5-4358-99d7-b52e53d9d5b5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7f2533dc-3c15-4efa-b6a5-c61b1e0b7f90.jpg b/scripts/seed_snapshot_data/uploads/attachments/7f2533dc-3c15-4efa-b6a5-c61b1e0b7f90.jpg new file mode 100644 index 00000000..d22be628 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7f2533dc-3c15-4efa-b6a5-c61b1e0b7f90.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7f579dbe-141e-49b7-b929-fcb06fe1de23.jpg b/scripts/seed_snapshot_data/uploads/attachments/7f579dbe-141e-49b7-b929-fcb06fe1de23.jpg new file mode 100644 index 00000000..988dd3ab Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7f579dbe-141e-49b7-b929-fcb06fe1de23.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/7f9b08b8-30aa-43b4-bab4-b6b47ca248c0.jpg b/scripts/seed_snapshot_data/uploads/attachments/7f9b08b8-30aa-43b4-bab4-b6b47ca248c0.jpg new file mode 100644 index 00000000..2f9b41b0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/7f9b08b8-30aa-43b4-bab4-b6b47ca248c0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/803359c4-5661-447f-88b0-a60369da7768.jpg b/scripts/seed_snapshot_data/uploads/attachments/803359c4-5661-447f-88b0-a60369da7768.jpg new file mode 100644 index 00000000..5979245b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/803359c4-5661-447f-88b0-a60369da7768.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/822db97b-17e4-42d6-b1c9-dbbc5952d6b8.jpg b/scripts/seed_snapshot_data/uploads/attachments/822db97b-17e4-42d6-b1c9-dbbc5952d6b8.jpg new file mode 100644 index 00000000..dde17cc3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/822db97b-17e4-42d6-b1c9-dbbc5952d6b8.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/823d41a5-9374-4d8b-962d-2ab078532c79.jpg b/scripts/seed_snapshot_data/uploads/attachments/823d41a5-9374-4d8b-962d-2ab078532c79.jpg new file mode 100644 index 00000000..e89ea50e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/823d41a5-9374-4d8b-962d-2ab078532c79.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/823ff246-7840-4870-8185-b8259c102be0.jpg b/scripts/seed_snapshot_data/uploads/attachments/823ff246-7840-4870-8185-b8259c102be0.jpg new file mode 100644 index 00000000..ccdac992 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/823ff246-7840-4870-8185-b8259c102be0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/82505a2c-5eb1-4c68-a1f2-bf0755953744.jpg b/scripts/seed_snapshot_data/uploads/attachments/82505a2c-5eb1-4c68-a1f2-bf0755953744.jpg new file mode 100644 index 00000000..84e70bfb Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/82505a2c-5eb1-4c68-a1f2-bf0755953744.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/82fc8167-6228-439f-8f11-bb512b209e83.jpg b/scripts/seed_snapshot_data/uploads/attachments/82fc8167-6228-439f-8f11-bb512b209e83.jpg new file mode 100644 index 00000000..f1d0397a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/82fc8167-6228-439f-8f11-bb512b209e83.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/84363139-b1ac-4cd7-a888-e94af0226ba0.jpg b/scripts/seed_snapshot_data/uploads/attachments/84363139-b1ac-4cd7-a888-e94af0226ba0.jpg new file mode 100644 index 00000000..1ab82374 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/84363139-b1ac-4cd7-a888-e94af0226ba0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/84697abf-1fdc-4df0-a792-0f728a0ef448.jpg b/scripts/seed_snapshot_data/uploads/attachments/84697abf-1fdc-4df0-a792-0f728a0ef448.jpg new file mode 100644 index 00000000..ea4ce4a5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/84697abf-1fdc-4df0-a792-0f728a0ef448.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/84ca63b0-8b11-4608-a248-f6c06f123bf3.jpg b/scripts/seed_snapshot_data/uploads/attachments/84ca63b0-8b11-4608-a248-f6c06f123bf3.jpg new file mode 100644 index 00000000..48a508b3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/84ca63b0-8b11-4608-a248-f6c06f123bf3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/84fe6469-653e-459d-8235-03d64b8ae6d3.jpg b/scripts/seed_snapshot_data/uploads/attachments/84fe6469-653e-459d-8235-03d64b8ae6d3.jpg new file mode 100644 index 00000000..22a4bdcf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/84fe6469-653e-459d-8235-03d64b8ae6d3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/857b433b-7360-44fc-9f0c-4a27b91aa402.jpg b/scripts/seed_snapshot_data/uploads/attachments/857b433b-7360-44fc-9f0c-4a27b91aa402.jpg new file mode 100644 index 00000000..3b1b8377 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/857b433b-7360-44fc-9f0c-4a27b91aa402.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/867603cc-6f00-4466-a654-c35ddb46f208.jpg b/scripts/seed_snapshot_data/uploads/attachments/867603cc-6f00-4466-a654-c35ddb46f208.jpg new file mode 100644 index 00000000..53132618 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/867603cc-6f00-4466-a654-c35ddb46f208.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8759c547-1aaa-46af-ad2d-ee70a0f8e3c4.jpg b/scripts/seed_snapshot_data/uploads/attachments/8759c547-1aaa-46af-ad2d-ee70a0f8e3c4.jpg new file mode 100644 index 00000000..c3a315c2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8759c547-1aaa-46af-ad2d-ee70a0f8e3c4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/885f69d5-f7c2-4361-947d-106f50faf203.jpg b/scripts/seed_snapshot_data/uploads/attachments/885f69d5-f7c2-4361-947d-106f50faf203.jpg new file mode 100644 index 00000000..e4a675cf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/885f69d5-f7c2-4361-947d-106f50faf203.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/892ce69e-dc8c-457a-b99f-bd859c5b1372.jpg b/scripts/seed_snapshot_data/uploads/attachments/892ce69e-dc8c-457a-b99f-bd859c5b1372.jpg new file mode 100644 index 00000000..bdd488a9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/892ce69e-dc8c-457a-b99f-bd859c5b1372.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8a07a8f8-bfd0-49c9-95a2-11a239f0aa04.jpg b/scripts/seed_snapshot_data/uploads/attachments/8a07a8f8-bfd0-49c9-95a2-11a239f0aa04.jpg new file mode 100644 index 00000000..7ae7a81d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8a07a8f8-bfd0-49c9-95a2-11a239f0aa04.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8a13764c-40d5-4f7c-b92a-cf64b9a42df2.jpg b/scripts/seed_snapshot_data/uploads/attachments/8a13764c-40d5-4f7c-b92a-cf64b9a42df2.jpg new file mode 100644 index 00000000..4aaa2add Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8a13764c-40d5-4f7c-b92a-cf64b9a42df2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8a87038f-5872-4ffa-ae66-aea607a5ce2c.jpg b/scripts/seed_snapshot_data/uploads/attachments/8a87038f-5872-4ffa-ae66-aea607a5ce2c.jpg new file mode 100644 index 00000000..7899dc9b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8a87038f-5872-4ffa-ae66-aea607a5ce2c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8ad0f01d-cd51-4b13-b0ef-acd864245bbc.jpg b/scripts/seed_snapshot_data/uploads/attachments/8ad0f01d-cd51-4b13-b0ef-acd864245bbc.jpg new file mode 100644 index 00000000..a61e04af Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8ad0f01d-cd51-4b13-b0ef-acd864245bbc.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8ad97e44-cec0-4706-a273-00a15fac5f2a.jpg b/scripts/seed_snapshot_data/uploads/attachments/8ad97e44-cec0-4706-a273-00a15fac5f2a.jpg new file mode 100644 index 00000000..50c57722 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8ad97e44-cec0-4706-a273-00a15fac5f2a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8cfe0a0e-51e3-4471-a508-d8e26e315005.jpg b/scripts/seed_snapshot_data/uploads/attachments/8cfe0a0e-51e3-4471-a508-d8e26e315005.jpg new file mode 100644 index 00000000..a91b361f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8cfe0a0e-51e3-4471-a508-d8e26e315005.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8d68dd4a-7299-4f3d-b05c-f03265126314.jpg b/scripts/seed_snapshot_data/uploads/attachments/8d68dd4a-7299-4f3d-b05c-f03265126314.jpg new file mode 100644 index 00000000..ccdbfaf1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8d68dd4a-7299-4f3d-b05c-f03265126314.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8d8e79a4-b71f-4e69-a25c-eae557c8283c.jpg b/scripts/seed_snapshot_data/uploads/attachments/8d8e79a4-b71f-4e69-a25c-eae557c8283c.jpg new file mode 100644 index 00000000..703f8e07 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8d8e79a4-b71f-4e69-a25c-eae557c8283c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8da63c04-f763-4bc0-8728-931e3e4b866e.jpg b/scripts/seed_snapshot_data/uploads/attachments/8da63c04-f763-4bc0-8728-931e3e4b866e.jpg new file mode 100644 index 00000000..501789d0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8da63c04-f763-4bc0-8728-931e3e4b866e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd.jpg b/scripts/seed_snapshot_data/uploads/attachments/8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd.jpg new file mode 100644 index 00000000..080342ec Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/8f8c1aa7-cd5f-43c4-af73-f01a9659d0cd.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9095b1f2-df1c-4369-a440-7bdf9fa3e814.jpg b/scripts/seed_snapshot_data/uploads/attachments/9095b1f2-df1c-4369-a440-7bdf9fa3e814.jpg new file mode 100644 index 00000000..f76bfae6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9095b1f2-df1c-4369-a440-7bdf9fa3e814.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/91cfa343-8864-441a-a818-846a60b9d53b.jpg b/scripts/seed_snapshot_data/uploads/attachments/91cfa343-8864-441a-a818-846a60b9d53b.jpg new file mode 100644 index 00000000..b76591f6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/91cfa343-8864-441a-a818-846a60b9d53b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/92ac16db-e3d6-477d-8592-55383dd67aff.jpg b/scripts/seed_snapshot_data/uploads/attachments/92ac16db-e3d6-477d-8592-55383dd67aff.jpg new file mode 100644 index 00000000..e3124260 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/92ac16db-e3d6-477d-8592-55383dd67aff.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/95887ae6-ebb6-4b50-8fc3-aaec6fcfc3dc.jpg b/scripts/seed_snapshot_data/uploads/attachments/95887ae6-ebb6-4b50-8fc3-aaec6fcfc3dc.jpg new file mode 100644 index 00000000..665502fb Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/95887ae6-ebb6-4b50-8fc3-aaec6fcfc3dc.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/959a9435-8172-4a0c-9e89-d5e7506d42bd.jpg b/scripts/seed_snapshot_data/uploads/attachments/959a9435-8172-4a0c-9e89-d5e7506d42bd.jpg new file mode 100644 index 00000000..af6b695c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/959a9435-8172-4a0c-9e89-d5e7506d42bd.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/965d234a-ceef-45e3-8573-8704f397868c.jpg b/scripts/seed_snapshot_data/uploads/attachments/965d234a-ceef-45e3-8573-8704f397868c.jpg new file mode 100644 index 00000000..79f37750 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/965d234a-ceef-45e3-8573-8704f397868c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/96ed3e31-8e08-46a3-86f9-bc213aaaf375.jpg b/scripts/seed_snapshot_data/uploads/attachments/96ed3e31-8e08-46a3-86f9-bc213aaaf375.jpg new file mode 100644 index 00000000..403692c4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/96ed3e31-8e08-46a3-86f9-bc213aaaf375.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9702054c-0dd9-41ab-bd44-f708c8b08e51.jpg b/scripts/seed_snapshot_data/uploads/attachments/9702054c-0dd9-41ab-bd44-f708c8b08e51.jpg new file mode 100644 index 00000000..98602af0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9702054c-0dd9-41ab-bd44-f708c8b08e51.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/97c941c9-dda5-4b30-b6d6-d59891bff7ac.jpg b/scripts/seed_snapshot_data/uploads/attachments/97c941c9-dda5-4b30-b6d6-d59891bff7ac.jpg new file mode 100644 index 00000000..1534a53f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/97c941c9-dda5-4b30-b6d6-d59891bff7ac.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/990a39e5-772c-4759-a0b2-ff2f04450398.jpg b/scripts/seed_snapshot_data/uploads/attachments/990a39e5-772c-4759-a0b2-ff2f04450398.jpg new file mode 100644 index 00000000..b1ec9bd8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/990a39e5-772c-4759-a0b2-ff2f04450398.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/99932d83-7581-4fab-bd4b-1651748ef91d.jpg b/scripts/seed_snapshot_data/uploads/attachments/99932d83-7581-4fab-bd4b-1651748ef91d.jpg new file mode 100644 index 00000000..0039381a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/99932d83-7581-4fab-bd4b-1651748ef91d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9a4edc00-09d8-4e7d-8c23-95eb96285507.jpg b/scripts/seed_snapshot_data/uploads/attachments/9a4edc00-09d8-4e7d-8c23-95eb96285507.jpg new file mode 100644 index 00000000..2002714f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9a4edc00-09d8-4e7d-8c23-95eb96285507.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9a8b00ad-0ce3-4f23-b6c0-b8e81323d644.jpg b/scripts/seed_snapshot_data/uploads/attachments/9a8b00ad-0ce3-4f23-b6c0-b8e81323d644.jpg new file mode 100644 index 00000000..0261858f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9a8b00ad-0ce3-4f23-b6c0-b8e81323d644.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9add978e-7692-47f3-a17e-d0db756d017d.jpg b/scripts/seed_snapshot_data/uploads/attachments/9add978e-7692-47f3-a17e-d0db756d017d.jpg new file mode 100644 index 00000000..b5118100 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9add978e-7692-47f3-a17e-d0db756d017d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9bd3753b-d669-4a66-93ae-09a2ae936c74.jpg b/scripts/seed_snapshot_data/uploads/attachments/9bd3753b-d669-4a66-93ae-09a2ae936c74.jpg new file mode 100644 index 00000000..351ea87e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9bd3753b-d669-4a66-93ae-09a2ae936c74.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9beb4296-d48c-4eac-b1aa-f3243d90ccc0.jpg b/scripts/seed_snapshot_data/uploads/attachments/9beb4296-d48c-4eac-b1aa-f3243d90ccc0.jpg new file mode 100644 index 00000000..54908dd2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9beb4296-d48c-4eac-b1aa-f3243d90ccc0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/9d6c890f-991f-43af-8555-1d01bb57e1cb.jpg b/scripts/seed_snapshot_data/uploads/attachments/9d6c890f-991f-43af-8555-1d01bb57e1cb.jpg new file mode 100644 index 00000000..6804436c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/9d6c890f-991f-43af-8555-1d01bb57e1cb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/a0a789eb-f11b-4de4-b20d-3adbc2c994af.jpg b/scripts/seed_snapshot_data/uploads/attachments/a0a789eb-f11b-4de4-b20d-3adbc2c994af.jpg new file mode 100644 index 00000000..544e5c38 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/a0a789eb-f11b-4de4-b20d-3adbc2c994af.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/a32d37a2-6f7a-4ae6-9789-64b3fd2a9776.jpg b/scripts/seed_snapshot_data/uploads/attachments/a32d37a2-6f7a-4ae6-9789-64b3fd2a9776.jpg new file mode 100644 index 00000000..fb631e7f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/a32d37a2-6f7a-4ae6-9789-64b3fd2a9776.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/a3cee329-756d-4e45-b97c-95b341fec131.jpg b/scripts/seed_snapshot_data/uploads/attachments/a3cee329-756d-4e45-b97c-95b341fec131.jpg new file mode 100644 index 00000000..9c312ac5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/a3cee329-756d-4e45-b97c-95b341fec131.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/a68e2cc2-2cb5-4c20-a80e-6fdf2c2b9819.jpg b/scripts/seed_snapshot_data/uploads/attachments/a68e2cc2-2cb5-4c20-a80e-6fdf2c2b9819.jpg new file mode 100644 index 00000000..55e8b010 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/a68e2cc2-2cb5-4c20-a80e-6fdf2c2b9819.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/abe607cd-7b2b-411b-ac9f-d36dfb10ecb3.jpg b/scripts/seed_snapshot_data/uploads/attachments/abe607cd-7b2b-411b-ac9f-d36dfb10ecb3.jpg new file mode 100644 index 00000000..60339702 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/abe607cd-7b2b-411b-ac9f-d36dfb10ecb3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ad5fe778-3b5f-4246-9783-350b4b279e19.jpg b/scripts/seed_snapshot_data/uploads/attachments/ad5fe778-3b5f-4246-9783-350b4b279e19.jpg new file mode 100644 index 00000000..2226e68c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ad5fe778-3b5f-4246-9783-350b4b279e19.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ae0db743-2250-4cdd-aeab-8385ba9646b7.jpg b/scripts/seed_snapshot_data/uploads/attachments/ae0db743-2250-4cdd-aeab-8385ba9646b7.jpg new file mode 100644 index 00000000..6a5660d9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ae0db743-2250-4cdd-aeab-8385ba9646b7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ae2d1ab0-9e23-4406-b8fe-5ed2a7bc360e.jpg b/scripts/seed_snapshot_data/uploads/attachments/ae2d1ab0-9e23-4406-b8fe-5ed2a7bc360e.jpg new file mode 100644 index 00000000..fcff0bce Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ae2d1ab0-9e23-4406-b8fe-5ed2a7bc360e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/af2f787a-8e65-4b6c-a140-f899ebc85ff1.jpg b/scripts/seed_snapshot_data/uploads/attachments/af2f787a-8e65-4b6c-a140-f899ebc85ff1.jpg new file mode 100644 index 00000000..96f884df Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/af2f787a-8e65-4b6c-a140-f899ebc85ff1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b0a50830-8e92-4d13-b3ba-80249ddac42e.jpg b/scripts/seed_snapshot_data/uploads/attachments/b0a50830-8e92-4d13-b3ba-80249ddac42e.jpg new file mode 100644 index 00000000..5f4471b7 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b0a50830-8e92-4d13-b3ba-80249ddac42e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b3a3c5e1-5fe0-47ae-a58b-e8626e2cd95c.jpg b/scripts/seed_snapshot_data/uploads/attachments/b3a3c5e1-5fe0-47ae-a58b-e8626e2cd95c.jpg new file mode 100644 index 00000000..a06aa386 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b3a3c5e1-5fe0-47ae-a58b-e8626e2cd95c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b3f17b59-4803-49ac-a986-c6a663366129.jpg b/scripts/seed_snapshot_data/uploads/attachments/b3f17b59-4803-49ac-a986-c6a663366129.jpg new file mode 100644 index 00000000..a9c1e1a0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b3f17b59-4803-49ac-a986-c6a663366129.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b48a824b-2cd3-4650-a251-687e3b1dc662.jpg b/scripts/seed_snapshot_data/uploads/attachments/b48a824b-2cd3-4650-a251-687e3b1dc662.jpg new file mode 100644 index 00000000..0bf2045b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b48a824b-2cd3-4650-a251-687e3b1dc662.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b4cd15e0-b7be-4518-8c5e-cf0a6dc17669.jpg b/scripts/seed_snapshot_data/uploads/attachments/b4cd15e0-b7be-4518-8c5e-cf0a6dc17669.jpg new file mode 100644 index 00000000..c93b2132 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b4cd15e0-b7be-4518-8c5e-cf0a6dc17669.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b4f60172-b736-486c-9dc1-d870c9178e08.jpg b/scripts/seed_snapshot_data/uploads/attachments/b4f60172-b736-486c-9dc1-d870c9178e08.jpg new file mode 100644 index 00000000..f5d84c95 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b4f60172-b736-486c-9dc1-d870c9178e08.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/b51d1367-5399-46a5-b5a3-d5aab9c8d67f.jpg b/scripts/seed_snapshot_data/uploads/attachments/b51d1367-5399-46a5-b5a3-d5aab9c8d67f.jpg new file mode 100644 index 00000000..491b2c56 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/b51d1367-5399-46a5-b5a3-d5aab9c8d67f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/babc6c79-7252-4d59-82ea-d5b7e1d42132.pdf b/scripts/seed_snapshot_data/uploads/attachments/babc6c79-7252-4d59-82ea-d5b7e1d42132.pdf new file mode 100644 index 00000000..9960806b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/babc6c79-7252-4d59-82ea-d5b7e1d42132.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bb1e34af-b9ac-4d32-8daa-158229f1e3d9.jpg b/scripts/seed_snapshot_data/uploads/attachments/bb1e34af-b9ac-4d32-8daa-158229f1e3d9.jpg new file mode 100644 index 00000000..97b427ab Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bb1e34af-b9ac-4d32-8daa-158229f1e3d9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bba33b0c-586b-4d15-a0f0-08263a52d05c.jpg b/scripts/seed_snapshot_data/uploads/attachments/bba33b0c-586b-4d15-a0f0-08263a52d05c.jpg new file mode 100644 index 00000000..f2e7b81b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bba33b0c-586b-4d15-a0f0-08263a52d05c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bbe316f1-407b-4169-ba7a-8c416992f810.jpg b/scripts/seed_snapshot_data/uploads/attachments/bbe316f1-407b-4169-ba7a-8c416992f810.jpg new file mode 100644 index 00000000..40d7aaf8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bbe316f1-407b-4169-ba7a-8c416992f810.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bc1146bd-0672-40b1-bc18-55a93fb875ef.jpg b/scripts/seed_snapshot_data/uploads/attachments/bc1146bd-0672-40b1-bc18-55a93fb875ef.jpg new file mode 100644 index 00000000..b0faec5b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bc1146bd-0672-40b1-bc18-55a93fb875ef.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bcee9919-fc8c-4bfd-b866-34b84ec05d03.jpg b/scripts/seed_snapshot_data/uploads/attachments/bcee9919-fc8c-4bfd-b866-34b84ec05d03.jpg new file mode 100644 index 00000000..91de7f55 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bcee9919-fc8c-4bfd-b866-34b84ec05d03.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bd802c82-0dbc-4ffd-9387-37b314fa7a72.jpg b/scripts/seed_snapshot_data/uploads/attachments/bd802c82-0dbc-4ffd-9387-37b314fa7a72.jpg new file mode 100644 index 00000000..f3065723 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bd802c82-0dbc-4ffd-9387-37b314fa7a72.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bf4e1a21-78bd-4e5b-93b7-6e0e32770a98.jpg b/scripts/seed_snapshot_data/uploads/attachments/bf4e1a21-78bd-4e5b-93b7-6e0e32770a98.jpg new file mode 100644 index 00000000..9c652751 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bf4e1a21-78bd-4e5b-93b7-6e0e32770a98.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/bfab8230-ecab-4dd3-b553-6202a22c02e2.pdf b/scripts/seed_snapshot_data/uploads/attachments/bfab8230-ecab-4dd3-b553-6202a22c02e2.pdf new file mode 100644 index 00000000..9ebecfd5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/bfab8230-ecab-4dd3-b553-6202a22c02e2.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c1380129-e517-484c-9d18-008952595714.jpg b/scripts/seed_snapshot_data/uploads/attachments/c1380129-e517-484c-9d18-008952595714.jpg new file mode 100644 index 00000000..fc17a7ba Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c1380129-e517-484c-9d18-008952595714.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7.jpg b/scripts/seed_snapshot_data/uploads/attachments/c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7.jpg new file mode 100644 index 00000000..544f0a36 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c28ca4c1-6b99-4b44-a232-6e3aeab1f6b7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c2cc9a29-536a-4fae-9e4b-f273c9464fec.jpg b/scripts/seed_snapshot_data/uploads/attachments/c2cc9a29-536a-4fae-9e4b-f273c9464fec.jpg new file mode 100644 index 00000000..f367c844 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c2cc9a29-536a-4fae-9e4b-f273c9464fec.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c35020cb-18c1-407e-9c54-50f53f132bd2.jpg b/scripts/seed_snapshot_data/uploads/attachments/c35020cb-18c1-407e-9c54-50f53f132bd2.jpg new file mode 100644 index 00000000..f0127d74 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c35020cb-18c1-407e-9c54-50f53f132bd2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c6c810ff-57b4-4169-b62e-6785a3f9a3a7.jpg b/scripts/seed_snapshot_data/uploads/attachments/c6c810ff-57b4-4169-b62e-6785a3f9a3a7.jpg new file mode 100644 index 00000000..2d699f60 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c6c810ff-57b4-4169-b62e-6785a3f9a3a7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c720d43b-b39a-4658-9259-1e58db6f117c.png b/scripts/seed_snapshot_data/uploads/attachments/c720d43b-b39a-4658-9259-1e58db6f117c.png new file mode 100644 index 00000000..baffa096 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c720d43b-b39a-4658-9259-1e58db6f117c.png differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c83eee73-ebf6-4462-9460-c51ac8572f1c.jpg b/scripts/seed_snapshot_data/uploads/attachments/c83eee73-ebf6-4462-9460-c51ac8572f1c.jpg new file mode 100644 index 00000000..2cdbc0d6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c83eee73-ebf6-4462-9460-c51ac8572f1c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/c8919521-9bbb-40b6-88d6-32f477ba68d0.jpg b/scripts/seed_snapshot_data/uploads/attachments/c8919521-9bbb-40b6-88d6-32f477ba68d0.jpg new file mode 100644 index 00000000..dafa2c2e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/c8919521-9bbb-40b6-88d6-32f477ba68d0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ca5be239-6e57-493a-84b4-f7f579f91aa0.jpg b/scripts/seed_snapshot_data/uploads/attachments/ca5be239-6e57-493a-84b4-f7f579f91aa0.jpg new file mode 100644 index 00000000..a244ac24 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ca5be239-6e57-493a-84b4-f7f579f91aa0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa.jpg b/scripts/seed_snapshot_data/uploads/attachments/cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa.jpg new file mode 100644 index 00000000..1ff0551e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/cb1e12ea-8b2f-4d99-9f51-873d06f9c3aa.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/cb6a506a-8b79-493c-ad72-a91ebaabb284.jpg b/scripts/seed_snapshot_data/uploads/attachments/cb6a506a-8b79-493c-ad72-a91ebaabb284.jpg new file mode 100644 index 00000000..037218d6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/cb6a506a-8b79-493c-ad72-a91ebaabb284.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/cb894e70-52e6-460d-b8c0-3f639bb23ba9.jpg b/scripts/seed_snapshot_data/uploads/attachments/cb894e70-52e6-460d-b8c0-3f639bb23ba9.jpg new file mode 100644 index 00000000..e22b5b14 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/cb894e70-52e6-460d-b8c0-3f639bb23ba9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/cd1d4cee-b0b8-42c7-a3b4-85875619cad9.jpg b/scripts/seed_snapshot_data/uploads/attachments/cd1d4cee-b0b8-42c7-a3b4-85875619cad9.jpg new file mode 100644 index 00000000..42606db6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/cd1d4cee-b0b8-42c7-a3b4-85875619cad9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ce908b09-af2b-42a0-a251-ea3574f1ac01.jpg b/scripts/seed_snapshot_data/uploads/attachments/ce908b09-af2b-42a0-a251-ea3574f1ac01.jpg new file mode 100644 index 00000000..f09cdcea Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ce908b09-af2b-42a0-a251-ea3574f1ac01.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ce9467bb-a6e5-4fcf-a5fe-a4c9d251c76e.jpg b/scripts/seed_snapshot_data/uploads/attachments/ce9467bb-a6e5-4fcf-a5fe-a4c9d251c76e.jpg new file mode 100644 index 00000000..8acd1f06 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ce9467bb-a6e5-4fcf-a5fe-a4c9d251c76e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d0053fe5-11ff-445d-9d4e-294e908cfd81.jpg b/scripts/seed_snapshot_data/uploads/attachments/d0053fe5-11ff-445d-9d4e-294e908cfd81.jpg new file mode 100644 index 00000000..c540dc3f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d0053fe5-11ff-445d-9d4e-294e908cfd81.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d0356dd3-9450-47fe-90c6-9fb6219e65bb.jpg b/scripts/seed_snapshot_data/uploads/attachments/d0356dd3-9450-47fe-90c6-9fb6219e65bb.jpg new file mode 100644 index 00000000..939b318c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d0356dd3-9450-47fe-90c6-9fb6219e65bb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d0c9622d-1e23-4fb6-b2b8-0d1c56f5d2e4.jpg b/scripts/seed_snapshot_data/uploads/attachments/d0c9622d-1e23-4fb6-b2b8-0d1c56f5d2e4.jpg new file mode 100644 index 00000000..6804436c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d0c9622d-1e23-4fb6-b2b8-0d1c56f5d2e4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d3083363-a675-4746-ac4d-a6671b7ec316.jpg b/scripts/seed_snapshot_data/uploads/attachments/d3083363-a675-4746-ac4d-a6671b7ec316.jpg new file mode 100644 index 00000000..61a44b14 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d3083363-a675-4746-ac4d-a6671b7ec316.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d31b1cb3-68a2-42d6-ac6d-333da7e16068.jpg b/scripts/seed_snapshot_data/uploads/attachments/d31b1cb3-68a2-42d6-ac6d-333da7e16068.jpg new file mode 100644 index 00000000..a2f2dae8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d31b1cb3-68a2-42d6-ac6d-333da7e16068.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b.jpg b/scripts/seed_snapshot_data/uploads/attachments/d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b.jpg new file mode 100644 index 00000000..865b9096 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d4089eb5-a063-43bf-8d65-d2c7cfa5ce7b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d6408a6a-eadc-4be7-96fc-884370ad0a45.jpg b/scripts/seed_snapshot_data/uploads/attachments/d6408a6a-eadc-4be7-96fc-884370ad0a45.jpg new file mode 100644 index 00000000..6664ca64 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d6408a6a-eadc-4be7-96fc-884370ad0a45.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d7242664-0385-4150-8467-da9591fa8d0e.jpg b/scripts/seed_snapshot_data/uploads/attachments/d7242664-0385-4150-8467-da9591fa8d0e.jpg new file mode 100644 index 00000000..86dde526 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d7242664-0385-4150-8467-da9591fa8d0e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d77e21f2-9694-47da-9fd2-922e2b0cb0da.pdf b/scripts/seed_snapshot_data/uploads/attachments/d77e21f2-9694-47da-9fd2-922e2b0cb0da.pdf new file mode 100644 index 00000000..5ccd6955 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d77e21f2-9694-47da-9fd2-922e2b0cb0da.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/d9f27b0a-2d3f-40be-873b-c59ef74aec40.jpg b/scripts/seed_snapshot_data/uploads/attachments/d9f27b0a-2d3f-40be-873b-c59ef74aec40.jpg new file mode 100644 index 00000000..6a125dfd Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/d9f27b0a-2d3f-40be-873b-c59ef74aec40.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/da0a0af2-8623-4d2d-a9f2-b87673310b73.jpg b/scripts/seed_snapshot_data/uploads/attachments/da0a0af2-8623-4d2d-a9f2-b87673310b73.jpg new file mode 100644 index 00000000..5419a545 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/da0a0af2-8623-4d2d-a9f2-b87673310b73.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/da9d79ab-7c92-43b8-899e-bd75a127122a.pdf b/scripts/seed_snapshot_data/uploads/attachments/da9d79ab-7c92-43b8-899e-bd75a127122a.pdf new file mode 100644 index 00000000..a0801af2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/da9d79ab-7c92-43b8-899e-bd75a127122a.pdf differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/daf59e57-90d3-484a-9b75-f4f4f08396b6.jpg b/scripts/seed_snapshot_data/uploads/attachments/daf59e57-90d3-484a-9b75-f4f4f08396b6.jpg new file mode 100644 index 00000000..012bce41 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/daf59e57-90d3-484a-9b75-f4f4f08396b6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/dca99b6e-1919-4d10-b588-ad2634989da3.jpg b/scripts/seed_snapshot_data/uploads/attachments/dca99b6e-1919-4d10-b588-ad2634989da3.jpg new file mode 100644 index 00000000..03b8f67e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/dca99b6e-1919-4d10-b588-ad2634989da3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/dd039305-9281-4c1e-81b9-ffcf2f38eaed.jpg b/scripts/seed_snapshot_data/uploads/attachments/dd039305-9281-4c1e-81b9-ffcf2f38eaed.jpg new file mode 100644 index 00000000..8a096825 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/dd039305-9281-4c1e-81b9-ffcf2f38eaed.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/dd306143-7347-40ff-84af-9fd25db80207.jpg b/scripts/seed_snapshot_data/uploads/attachments/dd306143-7347-40ff-84af-9fd25db80207.jpg new file mode 100644 index 00000000..1d2ebea8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/dd306143-7347-40ff-84af-9fd25db80207.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/dd4525ca-ead3-4196-be44-0c74d5c8b815.jpg b/scripts/seed_snapshot_data/uploads/attachments/dd4525ca-ead3-4196-be44-0c74d5c8b815.jpg new file mode 100644 index 00000000..4fd7ea13 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/dd4525ca-ead3-4196-be44-0c74d5c8b815.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/dd6e0dfe-9f87-4e25-9c5f-b2842db3850b.jpg b/scripts/seed_snapshot_data/uploads/attachments/dd6e0dfe-9f87-4e25-9c5f-b2842db3850b.jpg new file mode 100644 index 00000000..76f93069 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/dd6e0dfe-9f87-4e25-9c5f-b2842db3850b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/de419fbb-ae8a-4504-aa90-620380dbf06a.jpg b/scripts/seed_snapshot_data/uploads/attachments/de419fbb-ae8a-4504-aa90-620380dbf06a.jpg new file mode 100644 index 00000000..60ba58ef Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/de419fbb-ae8a-4504-aa90-620380dbf06a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e10dd33c-c50b-4880-9c06-e33b0e5abcf6.jpg b/scripts/seed_snapshot_data/uploads/attachments/e10dd33c-c50b-4880-9c06-e33b0e5abcf6.jpg new file mode 100644 index 00000000..f3d7f7bc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e10dd33c-c50b-4880-9c06-e33b0e5abcf6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e21732d2-c903-4a2b-9c07-1f17c00ec687.jpg b/scripts/seed_snapshot_data/uploads/attachments/e21732d2-c903-4a2b-9c07-1f17c00ec687.jpg new file mode 100644 index 00000000..7f03cd25 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e21732d2-c903-4a2b-9c07-1f17c00ec687.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e2312e2c-8ef5-488a-bca2-b1d34eaab188.jpg b/scripts/seed_snapshot_data/uploads/attachments/e2312e2c-8ef5-488a-bca2-b1d34eaab188.jpg new file mode 100644 index 00000000..311b73e2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e2312e2c-8ef5-488a-bca2-b1d34eaab188.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e2ebc233-3bf7-41d1-986e-94d7c802f74e.jpg b/scripts/seed_snapshot_data/uploads/attachments/e2ebc233-3bf7-41d1-986e-94d7c802f74e.jpg new file mode 100644 index 00000000..e13ae59a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e2ebc233-3bf7-41d1-986e-94d7c802f74e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e3883d42-6f55-4931-9439-65e123629f72.jpg b/scripts/seed_snapshot_data/uploads/attachments/e3883d42-6f55-4931-9439-65e123629f72.jpg new file mode 100644 index 00000000..88d3da51 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e3883d42-6f55-4931-9439-65e123629f72.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d.jpg b/scripts/seed_snapshot_data/uploads/attachments/e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d.jpg new file mode 100644 index 00000000..45b77bf4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e42b86c6-d2d2-471f-ae5a-f6b7b0a1122d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e45d5a81-d44b-451f-9fc4-f68467ef294e.jpg b/scripts/seed_snapshot_data/uploads/attachments/e45d5a81-d44b-451f-9fc4-f68467ef294e.jpg new file mode 100644 index 00000000..8393a62f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e45d5a81-d44b-451f-9fc4-f68467ef294e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e648dd38-87b3-4f71-a6bd-3365d89f009e.jpg b/scripts/seed_snapshot_data/uploads/attachments/e648dd38-87b3-4f71-a6bd-3365d89f009e.jpg new file mode 100644 index 00000000..aa88024d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e648dd38-87b3-4f71-a6bd-3365d89f009e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e730cb0f-4d54-4f79-9c06-99676df4e298.jpg b/scripts/seed_snapshot_data/uploads/attachments/e730cb0f-4d54-4f79-9c06-99676df4e298.jpg new file mode 100644 index 00000000..93217d1c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e730cb0f-4d54-4f79-9c06-99676df4e298.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e8750e6f-81a7-48df-bbf7-4dc6eaaa16ec.jpg b/scripts/seed_snapshot_data/uploads/attachments/e8750e6f-81a7-48df-bbf7-4dc6eaaa16ec.jpg new file mode 100644 index 00000000..be0eb0f9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e8750e6f-81a7-48df-bbf7-4dc6eaaa16ec.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e95616d1-bce2-4dd8-96ca-6e547f1e062f.jpg b/scripts/seed_snapshot_data/uploads/attachments/e95616d1-bce2-4dd8-96ca-6e547f1e062f.jpg new file mode 100644 index 00000000..e0a99538 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e95616d1-bce2-4dd8-96ca-6e547f1e062f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e99d756f-dbea-44e2-ac6f-a28025c45f8d.jpg b/scripts/seed_snapshot_data/uploads/attachments/e99d756f-dbea-44e2-ac6f-a28025c45f8d.jpg new file mode 100644 index 00000000..696459de Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e99d756f-dbea-44e2-ac6f-a28025c45f8d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/e9f20392-06a5-4acf-8ce3-1dda36b126be.jpg b/scripts/seed_snapshot_data/uploads/attachments/e9f20392-06a5-4acf-8ce3-1dda36b126be.jpg new file mode 100644 index 00000000..07540524 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/e9f20392-06a5-4acf-8ce3-1dda36b126be.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/eb3fa0be-d6f6-45f0-a2c4-6924ec1989e2.jpg b/scripts/seed_snapshot_data/uploads/attachments/eb3fa0be-d6f6-45f0-a2c4-6924ec1989e2.jpg new file mode 100644 index 00000000..7ac6f884 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/eb3fa0be-d6f6-45f0-a2c4-6924ec1989e2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ef174514-76c6-4680-a1c9-d3ec830eeaf7.jpg b/scripts/seed_snapshot_data/uploads/attachments/ef174514-76c6-4680-a1c9-d3ec830eeaf7.jpg new file mode 100644 index 00000000..5adf5ab5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ef174514-76c6-4680-a1c9-d3ec830eeaf7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ef3bb57b-0ec6-4a37-b31f-99493b22184e.jpg b/scripts/seed_snapshot_data/uploads/attachments/ef3bb57b-0ec6-4a37-b31f-99493b22184e.jpg new file mode 100644 index 00000000..3a932a87 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ef3bb57b-0ec6-4a37-b31f-99493b22184e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/f1aba89c-37d4-4e65-ac86-8ef6f8e56190.jpg b/scripts/seed_snapshot_data/uploads/attachments/f1aba89c-37d4-4e65-ac86-8ef6f8e56190.jpg new file mode 100644 index 00000000..0edc0f58 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/f1aba89c-37d4-4e65-ac86-8ef6f8e56190.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/f26c4493-1776-42bb-b1b1-a8b98da779e8.jpg b/scripts/seed_snapshot_data/uploads/attachments/f26c4493-1776-42bb-b1b1-a8b98da779e8.jpg new file mode 100644 index 00000000..312474d4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/f26c4493-1776-42bb-b1b1-a8b98da779e8.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/f41f3ec6-5e42-459a-adb4-88c4839f9ed9.jpg b/scripts/seed_snapshot_data/uploads/attachments/f41f3ec6-5e42-459a-adb4-88c4839f9ed9.jpg new file mode 100644 index 00000000..13ac07da Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/f41f3ec6-5e42-459a-adb4-88c4839f9ed9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/f9aa13bc-7002-416e-888d-6a453fcbb005.jpg b/scripts/seed_snapshot_data/uploads/attachments/f9aa13bc-7002-416e-888d-6a453fcbb005.jpg new file mode 100644 index 00000000..063286bc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/f9aa13bc-7002-416e-888d-6a453fcbb005.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/f9ba3545-14a5-458c-9fd7-ef0d08caaf1c.jpg b/scripts/seed_snapshot_data/uploads/attachments/f9ba3545-14a5-458c-9fd7-ef0d08caaf1c.jpg new file mode 100644 index 00000000..ed8bc206 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/f9ba3545-14a5-458c-9fd7-ef0d08caaf1c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/fa9434c6-a62e-4955-a98b-36ecc90a609d.jpg b/scripts/seed_snapshot_data/uploads/attachments/fa9434c6-a62e-4955-a98b-36ecc90a609d.jpg new file mode 100644 index 00000000..f54df29e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/fa9434c6-a62e-4955-a98b-36ecc90a609d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/fd076b71-ab30-4392-a7fe-39c90391d0d0.jpg b/scripts/seed_snapshot_data/uploads/attachments/fd076b71-ab30-4392-a7fe-39c90391d0d0.jpg new file mode 100644 index 00000000..70139a05 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/fd076b71-ab30-4392-a7fe-39c90391d0d0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/attachments/ff6b3cb7-6553-4f1d-979b-0131615b1a60.jpg b/scripts/seed_snapshot_data/uploads/attachments/ff6b3cb7-6553-4f1d-979b-0131615b1a60.jpg new file mode 100644 index 00000000..912cfa9b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/attachments/ff6b3cb7-6553-4f1d-979b-0131615b1a60.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/01b66843-c997-4389-ac5a-ec1931ee912f.jpg b/scripts/seed_snapshot_data/uploads/photos/01b66843-c997-4389-ac5a-ec1931ee912f.jpg new file mode 100644 index 00000000..2a0adf41 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/01b66843-c997-4389-ac5a-ec1931ee912f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/02cc1391-0fce-460c-919f-b2e696910d51.jpg b/scripts/seed_snapshot_data/uploads/photos/02cc1391-0fce-460c-919f-b2e696910d51.jpg new file mode 100644 index 00000000..4e2e1c60 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/02cc1391-0fce-460c-919f-b2e696910d51.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/02fc3aad-c363-4de3-ab41-819a76413e36.jpg b/scripts/seed_snapshot_data/uploads/photos/02fc3aad-c363-4de3-ab41-819a76413e36.jpg new file mode 100644 index 00000000..3af5c1e7 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/02fc3aad-c363-4de3-ab41-819a76413e36.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/0538aa23-0898-4a92-9f15-c555b686719e.jpg b/scripts/seed_snapshot_data/uploads/photos/0538aa23-0898-4a92-9f15-c555b686719e.jpg new file mode 100644 index 00000000..6852cb88 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/0538aa23-0898-4a92-9f15-c555b686719e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/072950df-9a4f-4e6d-abbf-88ce42d36e3c.jpg b/scripts/seed_snapshot_data/uploads/photos/072950df-9a4f-4e6d-abbf-88ce42d36e3c.jpg new file mode 100644 index 00000000..17fbf76e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/072950df-9a4f-4e6d-abbf-88ce42d36e3c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/07cd639b-6708-46a5-bc5b-9fce240f8b0e.jpg b/scripts/seed_snapshot_data/uploads/photos/07cd639b-6708-46a5-bc5b-9fce240f8b0e.jpg new file mode 100644 index 00000000..5e49543c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/07cd639b-6708-46a5-bc5b-9fce240f8b0e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/084993f6-17bd-4282-9601-0a92b1fadc5d.jpg b/scripts/seed_snapshot_data/uploads/photos/084993f6-17bd-4282-9601-0a92b1fadc5d.jpg new file mode 100644 index 00000000..87938f8b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/084993f6-17bd-4282-9601-0a92b1fadc5d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/08f78921-a713-4ca0-82df-9da5d0d678a7.jpg b/scripts/seed_snapshot_data/uploads/photos/08f78921-a713-4ca0-82df-9da5d0d678a7.jpg new file mode 100644 index 00000000..7993a15c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/08f78921-a713-4ca0-82df-9da5d0d678a7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/09155e47-9f7b-4580-94e5-8e48cfe55906.jpg b/scripts/seed_snapshot_data/uploads/photos/09155e47-9f7b-4580-94e5-8e48cfe55906.jpg new file mode 100644 index 00000000..079dc725 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/09155e47-9f7b-4580-94e5-8e48cfe55906.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/0d83c26f-4ccb-4091-bea6-aa4c81ce03a5.jpg b/scripts/seed_snapshot_data/uploads/photos/0d83c26f-4ccb-4091-bea6-aa4c81ce03a5.jpg new file mode 100644 index 00000000..44310ba2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/0d83c26f-4ccb-4091-bea6-aa4c81ce03a5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/0efc1e1e-abfc-4a85-9903-5dcf3c79505a.jpg b/scripts/seed_snapshot_data/uploads/photos/0efc1e1e-abfc-4a85-9903-5dcf3c79505a.jpg new file mode 100644 index 00000000..38ea9167 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/0efc1e1e-abfc-4a85-9903-5dcf3c79505a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/103182b0-a4f4-429a-985c-00add70be0ea.jpg b/scripts/seed_snapshot_data/uploads/photos/103182b0-a4f4-429a-985c-00add70be0ea.jpg new file mode 100644 index 00000000..911bd737 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/103182b0-a4f4-429a-985c-00add70be0ea.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/10e5facf-a92d-471e-a24f-5162759e97bf.jpg b/scripts/seed_snapshot_data/uploads/photos/10e5facf-a92d-471e-a24f-5162759e97bf.jpg new file mode 100644 index 00000000..2d3612fa Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/10e5facf-a92d-471e-a24f-5162759e97bf.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/1235a0dd-27cf-452b-916f-7a8b52f1c8f5.jpg b/scripts/seed_snapshot_data/uploads/photos/1235a0dd-27cf-452b-916f-7a8b52f1c8f5.jpg new file mode 100644 index 00000000..caa5e802 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/1235a0dd-27cf-452b-916f-7a8b52f1c8f5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/169c8832-7b11-4889-8c8b-cc892a20dc1a.jpg b/scripts/seed_snapshot_data/uploads/photos/169c8832-7b11-4889-8c8b-cc892a20dc1a.jpg new file mode 100644 index 00000000..c12ae971 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/169c8832-7b11-4889-8c8b-cc892a20dc1a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/16e42acc-78b9-4440-80b0-c05d0bf4d042.jpg b/scripts/seed_snapshot_data/uploads/photos/16e42acc-78b9-4440-80b0-c05d0bf4d042.jpg new file mode 100644 index 00000000..f2618d9d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/16e42acc-78b9-4440-80b0-c05d0bf4d042.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/17b8a0bf-7b75-46d2-a80b-c27512e656ce.jpg b/scripts/seed_snapshot_data/uploads/photos/17b8a0bf-7b75-46d2-a80b-c27512e656ce.jpg new file mode 100644 index 00000000..11ac07cd Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/17b8a0bf-7b75-46d2-a80b-c27512e656ce.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/186223fa-175e-4813-8843-70aa9e7193b7.jpg b/scripts/seed_snapshot_data/uploads/photos/186223fa-175e-4813-8843-70aa9e7193b7.jpg new file mode 100644 index 00000000..5b3e0c46 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/186223fa-175e-4813-8843-70aa9e7193b7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/19c1576b-509f-4e07-b3c5-3e1e5b604417.jpg b/scripts/seed_snapshot_data/uploads/photos/19c1576b-509f-4e07-b3c5-3e1e5b604417.jpg new file mode 100644 index 00000000..c7352361 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/19c1576b-509f-4e07-b3c5-3e1e5b604417.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/1bc7d117-102a-4f52-aa8a-fa67eda3f4a4.jpg b/scripts/seed_snapshot_data/uploads/photos/1bc7d117-102a-4f52-aa8a-fa67eda3f4a4.jpg new file mode 100644 index 00000000..ac674861 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/1bc7d117-102a-4f52-aa8a-fa67eda3f4a4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/1d763186-507a-4a17-af1a-f7047b9e5648.jpg b/scripts/seed_snapshot_data/uploads/photos/1d763186-507a-4a17-af1a-f7047b9e5648.jpg new file mode 100644 index 00000000..6db8c9a3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/1d763186-507a-4a17-af1a-f7047b9e5648.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/20586bd1-8882-4324-a419-2172d72500ff.jpg b/scripts/seed_snapshot_data/uploads/photos/20586bd1-8882-4324-a419-2172d72500ff.jpg new file mode 100644 index 00000000..a60ede55 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/20586bd1-8882-4324-a419-2172d72500ff.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/273a504f-65f8-4e8a-91c7-7cd652ecf5e6.jpg b/scripts/seed_snapshot_data/uploads/photos/273a504f-65f8-4e8a-91c7-7cd652ecf5e6.jpg new file mode 100644 index 00000000..bc5e0293 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/273a504f-65f8-4e8a-91c7-7cd652ecf5e6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/29f0d4db-55dc-4d3b-b73e-62ab3ece110a.jpg b/scripts/seed_snapshot_data/uploads/photos/29f0d4db-55dc-4d3b-b73e-62ab3ece110a.jpg new file mode 100644 index 00000000..97425e3e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/29f0d4db-55dc-4d3b-b73e-62ab3ece110a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2aa09727-8f1b-4474-b209-890aebfbbdf9.jpg b/scripts/seed_snapshot_data/uploads/photos/2aa09727-8f1b-4474-b209-890aebfbbdf9.jpg new file mode 100644 index 00000000..ed7251aa Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2aa09727-8f1b-4474-b209-890aebfbbdf9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2ad7b372-5dc2-48f2-8b33-db265087ae9f.jpg b/scripts/seed_snapshot_data/uploads/photos/2ad7b372-5dc2-48f2-8b33-db265087ae9f.jpg new file mode 100644 index 00000000..9d794dbe Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2ad7b372-5dc2-48f2-8b33-db265087ae9f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2af21297-0d15-4a55-b1a6-525b857f9022.jpg b/scripts/seed_snapshot_data/uploads/photos/2af21297-0d15-4a55-b1a6-525b857f9022.jpg new file mode 100644 index 00000000..7938247a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2af21297-0d15-4a55-b1a6-525b857f9022.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2cb48f5f-a4a5-4cb6-8731-74d08f6f0227.jpg b/scripts/seed_snapshot_data/uploads/photos/2cb48f5f-a4a5-4cb6-8731-74d08f6f0227.jpg new file mode 100644 index 00000000..e72c6086 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2cb48f5f-a4a5-4cb6-8731-74d08f6f0227.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2d141cd8-2395-4800-910d-8ca8a905feff.jpg b/scripts/seed_snapshot_data/uploads/photos/2d141cd8-2395-4800-910d-8ca8a905feff.jpg new file mode 100644 index 00000000..5d092f06 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2d141cd8-2395-4800-910d-8ca8a905feff.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2d6b2763-a75a-4412-9aec-a7a822aba7a9.jpg b/scripts/seed_snapshot_data/uploads/photos/2d6b2763-a75a-4412-9aec-a7a822aba7a9.jpg new file mode 100644 index 00000000..c6567721 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2d6b2763-a75a-4412-9aec-a7a822aba7a9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/2e1fbf0e-bb44-4a1b-8cd8-271100c3faef.jpg b/scripts/seed_snapshot_data/uploads/photos/2e1fbf0e-bb44-4a1b-8cd8-271100c3faef.jpg new file mode 100644 index 00000000..3e107520 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/2e1fbf0e-bb44-4a1b-8cd8-271100c3faef.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/3056d122-d428-410f-86a3-242470cd194b.jpg b/scripts/seed_snapshot_data/uploads/photos/3056d122-d428-410f-86a3-242470cd194b.jpg new file mode 100644 index 00000000..6f88d08f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/3056d122-d428-410f-86a3-242470cd194b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/317ac717-5592-43a9-8f10-e3dfad55dc0a.jpg b/scripts/seed_snapshot_data/uploads/photos/317ac717-5592-43a9-8f10-e3dfad55dc0a.jpg new file mode 100644 index 00000000..09fc9967 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/317ac717-5592-43a9-8f10-e3dfad55dc0a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/31ec88b7-ff3f-4995-a458-77db97fa0047.jpg b/scripts/seed_snapshot_data/uploads/photos/31ec88b7-ff3f-4995-a458-77db97fa0047.jpg new file mode 100644 index 00000000..d38ad71c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/31ec88b7-ff3f-4995-a458-77db97fa0047.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/36820545-e73c-4bef-9794-0bab8eb14abb.jpg b/scripts/seed_snapshot_data/uploads/photos/36820545-e73c-4bef-9794-0bab8eb14abb.jpg new file mode 100644 index 00000000..47f77755 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/36820545-e73c-4bef-9794-0bab8eb14abb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/36e491f0-2ebe-4dcc-9448-cc304873dd08.jpg b/scripts/seed_snapshot_data/uploads/photos/36e491f0-2ebe-4dcc-9448-cc304873dd08.jpg new file mode 100644 index 00000000..28885b8d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/36e491f0-2ebe-4dcc-9448-cc304873dd08.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/36ed9c27-cec6-4b24-8644-19325271b7fc.jpg b/scripts/seed_snapshot_data/uploads/photos/36ed9c27-cec6-4b24-8644-19325271b7fc.jpg new file mode 100644 index 00000000..1ddc2721 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/36ed9c27-cec6-4b24-8644-19325271b7fc.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/38456f27-22a6-426a-90d7-835dbe6fb142.jpg b/scripts/seed_snapshot_data/uploads/photos/38456f27-22a6-426a-90d7-835dbe6fb142.jpg new file mode 100644 index 00000000..e9973135 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/38456f27-22a6-426a-90d7-835dbe6fb142.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/3b2db4f1-58b6-4f6e-8607-3f90d6d16c91.jpg b/scripts/seed_snapshot_data/uploads/photos/3b2db4f1-58b6-4f6e-8607-3f90d6d16c91.jpg new file mode 100644 index 00000000..e83673e1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/3b2db4f1-58b6-4f6e-8607-3f90d6d16c91.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/3b90c760-21ba-4d86-8af1-3d4fdee62afa.jpg b/scripts/seed_snapshot_data/uploads/photos/3b90c760-21ba-4d86-8af1-3d4fdee62afa.jpg new file mode 100644 index 00000000..64065ef4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/3b90c760-21ba-4d86-8af1-3d4fdee62afa.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/3cdcc5e7-c0ef-4647-bd31-29594fb8af2d.jpg b/scripts/seed_snapshot_data/uploads/photos/3cdcc5e7-c0ef-4647-bd31-29594fb8af2d.jpg new file mode 100644 index 00000000..e54995d3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/3cdcc5e7-c0ef-4647-bd31-29594fb8af2d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/3ec314cb-df6e-4398-a9ad-3c31ed0fc86c.jpg b/scripts/seed_snapshot_data/uploads/photos/3ec314cb-df6e-4398-a9ad-3c31ed0fc86c.jpg new file mode 100644 index 00000000..0e349e7b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/3ec314cb-df6e-4398-a9ad-3c31ed0fc86c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/40e7603d-caa8-468d-913d-555c82b12ca2.jpg b/scripts/seed_snapshot_data/uploads/photos/40e7603d-caa8-468d-913d-555c82b12ca2.jpg new file mode 100644 index 00000000..70d738e3 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/40e7603d-caa8-468d-913d-555c82b12ca2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/41b27539-6b93-4673-9705-f5123a12eea6.jpg b/scripts/seed_snapshot_data/uploads/photos/41b27539-6b93-4673-9705-f5123a12eea6.jpg new file mode 100644 index 00000000..17c8a025 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/41b27539-6b93-4673-9705-f5123a12eea6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/44288d3b-df58-4d3b-8694-2c1aa072f048.jpg b/scripts/seed_snapshot_data/uploads/photos/44288d3b-df58-4d3b-8694-2c1aa072f048.jpg new file mode 100644 index 00000000..47e240f4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/44288d3b-df58-4d3b-8694-2c1aa072f048.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/445d4588-1c5f-4f22-87fc-b96f8942e801.jpg b/scripts/seed_snapshot_data/uploads/photos/445d4588-1c5f-4f22-87fc-b96f8942e801.jpg new file mode 100644 index 00000000..12ec430e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/445d4588-1c5f-4f22-87fc-b96f8942e801.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/4472fc84-57ed-40d1-b89d-19b7280b2942.jpg b/scripts/seed_snapshot_data/uploads/photos/4472fc84-57ed-40d1-b89d-19b7280b2942.jpg new file mode 100644 index 00000000..162497ac Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/4472fc84-57ed-40d1-b89d-19b7280b2942.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/44e841ea-4272-409f-831d-5733fb1f16dc.jpg b/scripts/seed_snapshot_data/uploads/photos/44e841ea-4272-409f-831d-5733fb1f16dc.jpg new file mode 100644 index 00000000..cdeeab57 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/44e841ea-4272-409f-831d-5733fb1f16dc.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/452dc822-739c-47ef-b05f-944e982df191.jpg b/scripts/seed_snapshot_data/uploads/photos/452dc822-739c-47ef-b05f-944e982df191.jpg new file mode 100644 index 00000000..b8cc8952 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/452dc822-739c-47ef-b05f-944e982df191.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/45737484-3087-4ec7-813e-89725931e605.jpg b/scripts/seed_snapshot_data/uploads/photos/45737484-3087-4ec7-813e-89725931e605.jpg new file mode 100644 index 00000000..3b5e3401 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/45737484-3087-4ec7-813e-89725931e605.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/45b2f931-a7ac-4a87-8e53-7e8bcfba0d22.jpg b/scripts/seed_snapshot_data/uploads/photos/45b2f931-a7ac-4a87-8e53-7e8bcfba0d22.jpg new file mode 100644 index 00000000..1502e36d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/45b2f931-a7ac-4a87-8e53-7e8bcfba0d22.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/4b2f29b0-d559-4754-a5e2-e7e610479dbf.jpg b/scripts/seed_snapshot_data/uploads/photos/4b2f29b0-d559-4754-a5e2-e7e610479dbf.jpg new file mode 100644 index 00000000..40525af6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/4b2f29b0-d559-4754-a5e2-e7e610479dbf.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/59cf7019-030e-42e7-b931-476445deb6b2.jpg b/scripts/seed_snapshot_data/uploads/photos/59cf7019-030e-42e7-b931-476445deb6b2.jpg new file mode 100644 index 00000000..8057862e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/59cf7019-030e-42e7-b931-476445deb6b2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/5af9a7b0-744a-4a3e-ab41-0bfdd28042a7.jpg b/scripts/seed_snapshot_data/uploads/photos/5af9a7b0-744a-4a3e-ab41-0bfdd28042a7.jpg new file mode 100644 index 00000000..8d82fd62 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/5af9a7b0-744a-4a3e-ab41-0bfdd28042a7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/5c3727e1-ae04-45fd-8cc0-f0b5e5c206f5.jpg b/scripts/seed_snapshot_data/uploads/photos/5c3727e1-ae04-45fd-8cc0-f0b5e5c206f5.jpg new file mode 100644 index 00000000..10da933a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/5c3727e1-ae04-45fd-8cc0-f0b5e5c206f5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/5d9a0492-f6b3-4163-b6bc-8edc557d984b.jpg b/scripts/seed_snapshot_data/uploads/photos/5d9a0492-f6b3-4163-b6bc-8edc557d984b.jpg new file mode 100644 index 00000000..9751de91 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/5d9a0492-f6b3-4163-b6bc-8edc557d984b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/61b92f61-f31f-4aea-b7fa-fb82cfae2cf1.jpg b/scripts/seed_snapshot_data/uploads/photos/61b92f61-f31f-4aea-b7fa-fb82cfae2cf1.jpg new file mode 100644 index 00000000..5872fd2d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/61b92f61-f31f-4aea-b7fa-fb82cfae2cf1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/62cd8840-2131-44d5-849a-d620e8616155.jpg b/scripts/seed_snapshot_data/uploads/photos/62cd8840-2131-44d5-849a-d620e8616155.jpg new file mode 100644 index 00000000..29193525 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/62cd8840-2131-44d5-849a-d620e8616155.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/67a214bc-f89f-432b-afb2-53a4c01cc282.jpg b/scripts/seed_snapshot_data/uploads/photos/67a214bc-f89f-432b-afb2-53a4c01cc282.jpg new file mode 100644 index 00000000..30664dce Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/67a214bc-f89f-432b-afb2-53a4c01cc282.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/6cd497ce-8c1c-4561-be3e-25cfecd68916.jpg b/scripts/seed_snapshot_data/uploads/photos/6cd497ce-8c1c-4561-be3e-25cfecd68916.jpg new file mode 100644 index 00000000..75a8fc8c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/6cd497ce-8c1c-4561-be3e-25cfecd68916.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/6ce9e464-07ee-4e1f-b72b-25120f9cd444.jpg b/scripts/seed_snapshot_data/uploads/photos/6ce9e464-07ee-4e1f-b72b-25120f9cd444.jpg new file mode 100644 index 00000000..356db8cc Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/6ce9e464-07ee-4e1f-b72b-25120f9cd444.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/6d780e65-c402-4bd2-b51f-959939d66127.jpg b/scripts/seed_snapshot_data/uploads/photos/6d780e65-c402-4bd2-b51f-959939d66127.jpg new file mode 100644 index 00000000..384d89d6 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/6d780e65-c402-4bd2-b51f-959939d66127.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/7021be72-adcb-4c75-a6c3-d6860deca70e.jpg b/scripts/seed_snapshot_data/uploads/photos/7021be72-adcb-4c75-a6c3-d6860deca70e.jpg new file mode 100644 index 00000000..688f675e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/7021be72-adcb-4c75-a6c3-d6860deca70e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/71c0d9d7-80b3-41f8-badc-f994affefca4.jpg b/scripts/seed_snapshot_data/uploads/photos/71c0d9d7-80b3-41f8-badc-f994affefca4.jpg new file mode 100644 index 00000000..d53c2731 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/71c0d9d7-80b3-41f8-badc-f994affefca4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/74924662-8676-4ddf-a03b-e0368e04d3e2.jpg b/scripts/seed_snapshot_data/uploads/photos/74924662-8676-4ddf-a03b-e0368e04d3e2.jpg new file mode 100644 index 00000000..4bd43cb4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/74924662-8676-4ddf-a03b-e0368e04d3e2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/75eeac76-ad71-448a-8d1f-cebcf2402369.jpg b/scripts/seed_snapshot_data/uploads/photos/75eeac76-ad71-448a-8d1f-cebcf2402369.jpg new file mode 100644 index 00000000..c9d11c5d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/75eeac76-ad71-448a-8d1f-cebcf2402369.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/7705e360-1b9a-4d44-9fe0-7951852c4279.jpg b/scripts/seed_snapshot_data/uploads/photos/7705e360-1b9a-4d44-9fe0-7951852c4279.jpg new file mode 100644 index 00000000..b7f47ed1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/7705e360-1b9a-4d44-9fe0-7951852c4279.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/7c0d6302-344b-4bc0-8e41-96bdbdf87aa0.jpg b/scripts/seed_snapshot_data/uploads/photos/7c0d6302-344b-4bc0-8e41-96bdbdf87aa0.jpg new file mode 100644 index 00000000..5947fe41 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/7c0d6302-344b-4bc0-8e41-96bdbdf87aa0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/7d7ea086-f39e-4c51-b2f2-cffcbd7565f3.jpg b/scripts/seed_snapshot_data/uploads/photos/7d7ea086-f39e-4c51-b2f2-cffcbd7565f3.jpg new file mode 100644 index 00000000..4ce29fdf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/7d7ea086-f39e-4c51-b2f2-cffcbd7565f3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/82741d34-6eed-43ca-b753-84dcfe2e0e4d.jpg b/scripts/seed_snapshot_data/uploads/photos/82741d34-6eed-43ca-b753-84dcfe2e0e4d.jpg new file mode 100644 index 00000000..084f5027 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/82741d34-6eed-43ca-b753-84dcfe2e0e4d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/829df11a-d823-40fd-b172-a53a1350e6a9.jpg b/scripts/seed_snapshot_data/uploads/photos/829df11a-d823-40fd-b172-a53a1350e6a9.jpg new file mode 100644 index 00000000..6631c720 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/829df11a-d823-40fd-b172-a53a1350e6a9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/83158748-92c0-4953-8bce-5d968ad38190.jpg b/scripts/seed_snapshot_data/uploads/photos/83158748-92c0-4953-8bce-5d968ad38190.jpg new file mode 100644 index 00000000..f08d5a27 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/83158748-92c0-4953-8bce-5d968ad38190.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/862fdd6c-db2c-4ee8-a23a-0a06b0ea5df3.jpg b/scripts/seed_snapshot_data/uploads/photos/862fdd6c-db2c-4ee8-a23a-0a06b0ea5df3.jpg new file mode 100644 index 00000000..84d402db Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/862fdd6c-db2c-4ee8-a23a-0a06b0ea5df3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/8724d136-32e8-469b-b6bb-220b2ddd27e9.jpg b/scripts/seed_snapshot_data/uploads/photos/8724d136-32e8-469b-b6bb-220b2ddd27e9.jpg new file mode 100644 index 00000000..d4c553e4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/8724d136-32e8-469b-b6bb-220b2ddd27e9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/89db2b38-acf3-4436-964f-271ef3040c7e.jpg b/scripts/seed_snapshot_data/uploads/photos/89db2b38-acf3-4436-964f-271ef3040c7e.jpg new file mode 100644 index 00000000..6892aee2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/89db2b38-acf3-4436-964f-271ef3040c7e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/8cc57c95-6389-4fa6-922a-84f59cc0245f.jpg b/scripts/seed_snapshot_data/uploads/photos/8cc57c95-6389-4fa6-922a-84f59cc0245f.jpg new file mode 100644 index 00000000..0e5e1e5a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/8cc57c95-6389-4fa6-922a-84f59cc0245f.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/8eb5904d-3ba5-4453-88ea-9835c8dd0b96.jpg b/scripts/seed_snapshot_data/uploads/photos/8eb5904d-3ba5-4453-88ea-9835c8dd0b96.jpg new file mode 100644 index 00000000..d2e8af86 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/8eb5904d-3ba5-4453-88ea-9835c8dd0b96.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/92608c1e-6955-414e-b405-15d6a4525104.jpg b/scripts/seed_snapshot_data/uploads/photos/92608c1e-6955-414e-b405-15d6a4525104.jpg new file mode 100644 index 00000000..d8cd977c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/92608c1e-6955-414e-b405-15d6a4525104.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/98407be9-e413-4245-9d47-c72323b9ecc1.jpg b/scripts/seed_snapshot_data/uploads/photos/98407be9-e413-4245-9d47-c72323b9ecc1.jpg new file mode 100644 index 00000000..b708053f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/98407be9-e413-4245-9d47-c72323b9ecc1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/98535111-5cfd-4dbe-8e43-ee6db78a64b3.jpg b/scripts/seed_snapshot_data/uploads/photos/98535111-5cfd-4dbe-8e43-ee6db78a64b3.jpg new file mode 100644 index 00000000..09a15e3f Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/98535111-5cfd-4dbe-8e43-ee6db78a64b3.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/988ffae0-b72d-4361-976c-48642d46ff71.jpg b/scripts/seed_snapshot_data/uploads/photos/988ffae0-b72d-4361-976c-48642d46ff71.jpg new file mode 100644 index 00000000..c61fc7fe Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/988ffae0-b72d-4361-976c-48642d46ff71.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9a1a9e78-12d5-458e-8c02-ed201f2cf300.jpg b/scripts/seed_snapshot_data/uploads/photos/9a1a9e78-12d5-458e-8c02-ed201f2cf300.jpg new file mode 100644 index 00000000..ee6989b1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9a1a9e78-12d5-458e-8c02-ed201f2cf300.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9a91cdea-45c0-4cf0-a63b-918524962b67.jpg b/scripts/seed_snapshot_data/uploads/photos/9a91cdea-45c0-4cf0-a63b-918524962b67.jpg new file mode 100644 index 00000000..2ac5b8ad Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9a91cdea-45c0-4cf0-a63b-918524962b67.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9c005d50-6354-4bc2-9069-d02bc217b85d.jpg b/scripts/seed_snapshot_data/uploads/photos/9c005d50-6354-4bc2-9069-d02bc217b85d.jpg new file mode 100644 index 00000000..245c3fd1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9c005d50-6354-4bc2-9069-d02bc217b85d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9e1d8d09-d70e-4a1d-8f75-7080442adcf1.jpg b/scripts/seed_snapshot_data/uploads/photos/9e1d8d09-d70e-4a1d-8f75-7080442adcf1.jpg new file mode 100644 index 00000000..f494a48e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9e1d8d09-d70e-4a1d-8f75-7080442adcf1.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9f052682-acd7-4f0a-9fe5-5c91303ecfa9.jpg b/scripts/seed_snapshot_data/uploads/photos/9f052682-acd7-4f0a-9fe5-5c91303ecfa9.jpg new file mode 100644 index 00000000..f21904db Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9f052682-acd7-4f0a-9fe5-5c91303ecfa9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/9f17f245-164b-428c-9c27-327ce43023b9.jpg b/scripts/seed_snapshot_data/uploads/photos/9f17f245-164b-428c-9c27-327ce43023b9.jpg new file mode 100644 index 00000000..f6e3c6ea Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/9f17f245-164b-428c-9c27-327ce43023b9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/a21248c3-1953-47ea-84f6-65c5ee03b81d.jpg b/scripts/seed_snapshot_data/uploads/photos/a21248c3-1953-47ea-84f6-65c5ee03b81d.jpg new file mode 100644 index 00000000..96b61697 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/a21248c3-1953-47ea-84f6-65c5ee03b81d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/a21f1f1e-3830-499a-ba1a-ee272e3166c0.jpg b/scripts/seed_snapshot_data/uploads/photos/a21f1f1e-3830-499a-ba1a-ee272e3166c0.jpg new file mode 100644 index 00000000..c6479920 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/a21f1f1e-3830-499a-ba1a-ee272e3166c0.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/a3c2cc25-3f09-4ca5-9117-db305f6d3f79.jpg b/scripts/seed_snapshot_data/uploads/photos/a3c2cc25-3f09-4ca5-9117-db305f6d3f79.jpg new file mode 100644 index 00000000..9fcd8b67 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/a3c2cc25-3f09-4ca5-9117-db305f6d3f79.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/a46e6585-f1d3-49e8-b3a1-318434111a15.jpg b/scripts/seed_snapshot_data/uploads/photos/a46e6585-f1d3-49e8-b3a1-318434111a15.jpg new file mode 100644 index 00000000..4c741bae Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/a46e6585-f1d3-49e8-b3a1-318434111a15.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ae1e0065-9916-46ad-84af-c510eae55c87.jpg b/scripts/seed_snapshot_data/uploads/photos/ae1e0065-9916-46ad-84af-c510eae55c87.jpg new file mode 100644 index 00000000..b3586246 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ae1e0065-9916-46ad-84af-c510eae55c87.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/aeb8a25f-4321-4084-a16b-3bbdda68f28e.jpg b/scripts/seed_snapshot_data/uploads/photos/aeb8a25f-4321-4084-a16b-3bbdda68f28e.jpg new file mode 100644 index 00000000..cc22b81e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/aeb8a25f-4321-4084-a16b-3bbdda68f28e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/b2d4a7a4-4a41-47cc-994b-e37edca39427.jpg b/scripts/seed_snapshot_data/uploads/photos/b2d4a7a4-4a41-47cc-994b-e37edca39427.jpg new file mode 100644 index 00000000..2910e0ba Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/b2d4a7a4-4a41-47cc-994b-e37edca39427.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/b7c9721b-6591-46b6-b6c6-e81211c00c79.jpg b/scripts/seed_snapshot_data/uploads/photos/b7c9721b-6591-46b6-b6c6-e81211c00c79.jpg new file mode 100644 index 00000000..ff4a77fe Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/b7c9721b-6591-46b6-b6c6-e81211c00c79.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/b9510a7e-8dcc-4455-8d9d-485d2c817a63.jpg b/scripts/seed_snapshot_data/uploads/photos/b9510a7e-8dcc-4455-8d9d-485d2c817a63.jpg new file mode 100644 index 00000000..964324ba Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/b9510a7e-8dcc-4455-8d9d-485d2c817a63.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/bceec596-f17d-4ad4-8a3d-3fd5208648e5.jpg b/scripts/seed_snapshot_data/uploads/photos/bceec596-f17d-4ad4-8a3d-3fd5208648e5.jpg new file mode 100644 index 00000000..256fe789 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/bceec596-f17d-4ad4-8a3d-3fd5208648e5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/bd612177-31b5-48c0-b321-ad5480a9d3d6.jpg b/scripts/seed_snapshot_data/uploads/photos/bd612177-31b5-48c0-b321-ad5480a9d3d6.jpg new file mode 100644 index 00000000..da652c08 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/bd612177-31b5-48c0-b321-ad5480a9d3d6.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/bdea1e4b-6c99-49c7-b9f3-7eec1f03fa24.jpg b/scripts/seed_snapshot_data/uploads/photos/bdea1e4b-6c99-49c7-b9f3-7eec1f03fa24.jpg new file mode 100644 index 00000000..2315f674 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/bdea1e4b-6c99-49c7-b9f3-7eec1f03fa24.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/be3d7680-5012-49d2-8ff8-a0dbb7abce6c.jpg b/scripts/seed_snapshot_data/uploads/photos/be3d7680-5012-49d2-8ff8-a0dbb7abce6c.jpg new file mode 100644 index 00000000..f902ee65 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/be3d7680-5012-49d2-8ff8-a0dbb7abce6c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c168dff6-f910-493f-8797-d23c6681d94a.jpg b/scripts/seed_snapshot_data/uploads/photos/c168dff6-f910-493f-8797-d23c6681d94a.jpg new file mode 100644 index 00000000..86c5af35 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c168dff6-f910-493f-8797-d23c6681d94a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c408cc7a-0e1d-4270-b3fd-e34770c2ca19.jpg b/scripts/seed_snapshot_data/uploads/photos/c408cc7a-0e1d-4270-b3fd-e34770c2ca19.jpg new file mode 100644 index 00000000..a3c707db Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c408cc7a-0e1d-4270-b3fd-e34770c2ca19.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c544613e-d9dc-4fa5-86e3-195522f474f4.jpg b/scripts/seed_snapshot_data/uploads/photos/c544613e-d9dc-4fa5-86e3-195522f474f4.jpg new file mode 100644 index 00000000..eff271aa Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c544613e-d9dc-4fa5-86e3-195522f474f4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c5e688e3-106c-4e4e-a103-8e6835eaf102.jpg b/scripts/seed_snapshot_data/uploads/photos/c5e688e3-106c-4e4e-a103-8e6835eaf102.jpg new file mode 100644 index 00000000..b0c5b60e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c5e688e3-106c-4e4e-a103-8e6835eaf102.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c607fc74-2e4f-4426-a8da-71e8328c2816.jpg b/scripts/seed_snapshot_data/uploads/photos/c607fc74-2e4f-4426-a8da-71e8328c2816.jpg new file mode 100644 index 00000000..e400d024 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c607fc74-2e4f-4426-a8da-71e8328c2816.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c65ac97a-b9ea-4898-bef6-5eeff49c8d09.jpg b/scripts/seed_snapshot_data/uploads/photos/c65ac97a-b9ea-4898-bef6-5eeff49c8d09.jpg new file mode 100644 index 00000000..70e7be53 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c65ac97a-b9ea-4898-bef6-5eeff49c8d09.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c6e0c474-23f7-4d3d-8f9b-bbe7161586ef.jpg b/scripts/seed_snapshot_data/uploads/photos/c6e0c474-23f7-4d3d-8f9b-bbe7161586ef.jpg new file mode 100644 index 00000000..79aa1979 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c6e0c474-23f7-4d3d-8f9b-bbe7161586ef.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c99c66b1-029f-42ff-8db7-7c5bab701ca2.jpg b/scripts/seed_snapshot_data/uploads/photos/c99c66b1-029f-42ff-8db7-7c5bab701ca2.jpg new file mode 100644 index 00000000..db9abd08 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c99c66b1-029f-42ff-8db7-7c5bab701ca2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/c9adf635-f632-45c2-bd6b-14045ee4a33d.jpg b/scripts/seed_snapshot_data/uploads/photos/c9adf635-f632-45c2-bd6b-14045ee4a33d.jpg new file mode 100644 index 00000000..67e4f7b8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/c9adf635-f632-45c2-bd6b-14045ee4a33d.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/cc03060f-c0ad-44c1-8585-68008251bf1a.jpg b/scripts/seed_snapshot_data/uploads/photos/cc03060f-c0ad-44c1-8585-68008251bf1a.jpg new file mode 100644 index 00000000..e59ad462 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/cc03060f-c0ad-44c1-8585-68008251bf1a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/cdc0e063-6502-480b-a5a9-d21794e87e3e.jpg b/scripts/seed_snapshot_data/uploads/photos/cdc0e063-6502-480b-a5a9-d21794e87e3e.jpg new file mode 100644 index 00000000..575ac16c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/cdc0e063-6502-480b-a5a9-d21794e87e3e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/cfc731af-443d-41f0-8bdf-71c7009a3a85.jpg b/scripts/seed_snapshot_data/uploads/photos/cfc731af-443d-41f0-8bdf-71c7009a3a85.jpg new file mode 100644 index 00000000..92fc1c76 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/cfc731af-443d-41f0-8bdf-71c7009a3a85.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d07f49ea-ac9e-41e8-8059-94a1123d1812.jpg b/scripts/seed_snapshot_data/uploads/photos/d07f49ea-ac9e-41e8-8059-94a1123d1812.jpg new file mode 100644 index 00000000..6919da29 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d07f49ea-ac9e-41e8-8059-94a1123d1812.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d676cbcc-a266-4de3-a747-e0b7ada44e11.jpg b/scripts/seed_snapshot_data/uploads/photos/d676cbcc-a266-4de3-a747-e0b7ada44e11.jpg new file mode 100644 index 00000000..7f78bab8 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d676cbcc-a266-4de3-a747-e0b7ada44e11.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d6f53787-7fff-4f81-b06e-efd3bd81f2d2.jpg b/scripts/seed_snapshot_data/uploads/photos/d6f53787-7fff-4f81-b06e-efd3bd81f2d2.jpg new file mode 100644 index 00000000..90128fb2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d6f53787-7fff-4f81-b06e-efd3bd81f2d2.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d79065e7-726f-4be3-b7f6-014259bdeecf.jpg b/scripts/seed_snapshot_data/uploads/photos/d79065e7-726f-4be3-b7f6-014259bdeecf.jpg new file mode 100644 index 00000000..a8d835b5 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d79065e7-726f-4be3-b7f6-014259bdeecf.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d80d7f81-e0a3-4aa4-861b-41e3a6ce5f2a.jpg b/scripts/seed_snapshot_data/uploads/photos/d80d7f81-e0a3-4aa4-861b-41e3a6ce5f2a.jpg new file mode 100644 index 00000000..c319cf66 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d80d7f81-e0a3-4aa4-861b-41e3a6ce5f2a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d8f69bda-9521-493c-adca-a6695bc37670.jpg b/scripts/seed_snapshot_data/uploads/photos/d8f69bda-9521-493c-adca-a6695bc37670.jpg new file mode 100644 index 00000000..f60e0b7d Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d8f69bda-9521-493c-adca-a6695bc37670.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d90dfcf9-9eca-430d-9c49-caf3404a3e30.jpg b/scripts/seed_snapshot_data/uploads/photos/d90dfcf9-9eca-430d-9c49-caf3404a3e30.jpg new file mode 100644 index 00000000..f18aaf69 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d90dfcf9-9eca-430d-9c49-caf3404a3e30.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d951f6d5-168e-48a2-9070-0be0324fa611.jpg b/scripts/seed_snapshot_data/uploads/photos/d951f6d5-168e-48a2-9070-0be0324fa611.jpg new file mode 100644 index 00000000..833f1828 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d951f6d5-168e-48a2-9070-0be0324fa611.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d9ef23c4-4857-4ea2-9b91-d43d059976ab.jpg b/scripts/seed_snapshot_data/uploads/photos/d9ef23c4-4857-4ea2-9b91-d43d059976ab.jpg new file mode 100644 index 00000000..a74994d4 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d9ef23c4-4857-4ea2-9b91-d43d059976ab.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/d9ffdc00-b461-4151-bc96-3865ab09561e.jpg b/scripts/seed_snapshot_data/uploads/photos/d9ffdc00-b461-4151-bc96-3865ab09561e.jpg new file mode 100644 index 00000000..b9f5801c Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/d9ffdc00-b461-4151-bc96-3865ab09561e.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/dd92926d-a71c-4206-a1f2-a1337d9c2dfe.jpg b/scripts/seed_snapshot_data/uploads/photos/dd92926d-a71c-4206-a1f2-a1337d9c2dfe.jpg new file mode 100644 index 00000000..d40bd454 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/dd92926d-a71c-4206-a1f2-a1337d9c2dfe.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ddb30e6f-37af-4e3c-9926-9ccce80dab6b.jpg b/scripts/seed_snapshot_data/uploads/photos/ddb30e6f-37af-4e3c-9926-9ccce80dab6b.jpg new file mode 100644 index 00000000..15985faf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ddb30e6f-37af-4e3c-9926-9ccce80dab6b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e0502296-06e3-44ff-9a60-224d85119e86.jpg b/scripts/seed_snapshot_data/uploads/photos/e0502296-06e3-44ff-9a60-224d85119e86.jpg new file mode 100644 index 00000000..05d537c0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e0502296-06e3-44ff-9a60-224d85119e86.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e214057c-12ae-4425-853e-23d8c8412d19.jpg b/scripts/seed_snapshot_data/uploads/photos/e214057c-12ae-4425-853e-23d8c8412d19.jpg new file mode 100644 index 00000000..ef1af8c2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e214057c-12ae-4425-853e-23d8c8412d19.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e2e7eb9d-a934-4bab-9b7e-53d7404cf642.jpg b/scripts/seed_snapshot_data/uploads/photos/e2e7eb9d-a934-4bab-9b7e-53d7404cf642.jpg new file mode 100644 index 00000000..d8aae8ba Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e2e7eb9d-a934-4bab-9b7e-53d7404cf642.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e3160c26-2ef0-407e-aef3-e4e228b44b4a.jpg b/scripts/seed_snapshot_data/uploads/photos/e3160c26-2ef0-407e-aef3-e4e228b44b4a.jpg new file mode 100644 index 00000000..f459c897 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e3160c26-2ef0-407e-aef3-e4e228b44b4a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e5c33135-dba2-4cd2-888b-1251fa0022c7.jpg b/scripts/seed_snapshot_data/uploads/photos/e5c33135-dba2-4cd2-888b-1251fa0022c7.jpg new file mode 100644 index 00000000..9b7c6028 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e5c33135-dba2-4cd2-888b-1251fa0022c7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e5ffecc8-284a-45c7-af79-7d6d17e726d7.jpg b/scripts/seed_snapshot_data/uploads/photos/e5ffecc8-284a-45c7-af79-7d6d17e726d7.jpg new file mode 100644 index 00000000..40044eeb Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e5ffecc8-284a-45c7-af79-7d6d17e726d7.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e60f0f16-681e-4e8b-b911-13bd8f92f02a.jpg b/scripts/seed_snapshot_data/uploads/photos/e60f0f16-681e-4e8b-b911-13bd8f92f02a.jpg new file mode 100644 index 00000000..cf040911 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e60f0f16-681e-4e8b-b911-13bd8f92f02a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e67d1d38-6c00-4a3a-814c-0d89ab09d7c4.jpg b/scripts/seed_snapshot_data/uploads/photos/e67d1d38-6c00-4a3a-814c-0d89ab09d7c4.jpg new file mode 100644 index 00000000..0c2611be Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e67d1d38-6c00-4a3a-814c-0d89ab09d7c4.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/e6ad181b-699a-475a-badf-168ef9cec141.jpg b/scripts/seed_snapshot_data/uploads/photos/e6ad181b-699a-475a-badf-168ef9cec141.jpg new file mode 100644 index 00000000..83b0472b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/e6ad181b-699a-475a-badf-168ef9cec141.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/eb23d279-f748-4281-825b-3e113ec1fbc8.jpg b/scripts/seed_snapshot_data/uploads/photos/eb23d279-f748-4281-825b-3e113ec1fbc8.jpg new file mode 100644 index 00000000..5c7160c1 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/eb23d279-f748-4281-825b-3e113ec1fbc8.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/eb45daa9-bc03-415c-bca0-fb2b51eb50fb.jpg b/scripts/seed_snapshot_data/uploads/photos/eb45daa9-bc03-415c-bca0-fb2b51eb50fb.jpg new file mode 100644 index 00000000..b9a16c2e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/eb45daa9-bc03-415c-bca0-fb2b51eb50fb.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ec2421a1-ec4a-4998-b873-f6fcf3533509.jpg b/scripts/seed_snapshot_data/uploads/photos/ec2421a1-ec4a-4998-b873-f6fcf3533509.jpg new file mode 100644 index 00000000..f927f4f2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ec2421a1-ec4a-4998-b873-f6fcf3533509.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ecf98915-afce-4c81-9b0d-3679dfb11502.jpg b/scripts/seed_snapshot_data/uploads/photos/ecf98915-afce-4c81-9b0d-3679dfb11502.jpg new file mode 100644 index 00000000..764e3130 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ecf98915-afce-4c81-9b0d-3679dfb11502.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ee1483f8-a735-4487-a434-4d39c380e762.jpg b/scripts/seed_snapshot_data/uploads/photos/ee1483f8-a735-4487-a434-4d39c380e762.jpg new file mode 100644 index 00000000..3049902a Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ee1483f8-a735-4487-a434-4d39c380e762.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f3438376-4d5b-42bb-9bed-94c946343452.jpg b/scripts/seed_snapshot_data/uploads/photos/f3438376-4d5b-42bb-9bed-94c946343452.jpg new file mode 100644 index 00000000..fb66d95e Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f3438376-4d5b-42bb-9bed-94c946343452.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f42d3076-6278-4608-8598-7b052dffc973.jpg b/scripts/seed_snapshot_data/uploads/photos/f42d3076-6278-4608-8598-7b052dffc973.jpg new file mode 100644 index 00000000..b6db8a23 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f42d3076-6278-4608-8598-7b052dffc973.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f5f04630-76af-4949-b23a-a2e90adec4f5.jpg b/scripts/seed_snapshot_data/uploads/photos/f5f04630-76af-4949-b23a-a2e90adec4f5.jpg new file mode 100644 index 00000000..8cf9f088 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f5f04630-76af-4949-b23a-a2e90adec4f5.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f69660e7-ea8c-4a2a-9b8b-29e243e9b45b.jpg b/scripts/seed_snapshot_data/uploads/photos/f69660e7-ea8c-4a2a-9b8b-29e243e9b45b.jpg new file mode 100644 index 00000000..ec9881f9 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f69660e7-ea8c-4a2a-9b8b-29e243e9b45b.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f72e5ef5-3d63-4890-a9a8-41af0d6da2c9.jpg b/scripts/seed_snapshot_data/uploads/photos/f72e5ef5-3d63-4890-a9a8-41af0d6da2c9.jpg new file mode 100644 index 00000000..54b1a1fa Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f72e5ef5-3d63-4890-a9a8-41af0d6da2c9.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/f8408a7e-3a41-4709-96c1-17b282a1e744.jpg b/scripts/seed_snapshot_data/uploads/photos/f8408a7e-3a41-4709-96c1-17b282a1e744.jpg new file mode 100644 index 00000000..00624ed0 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/f8408a7e-3a41-4709-96c1-17b282a1e744.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/fa076afc-a542-4bf1-bbcb-1d26d1f44a99.jpg b/scripts/seed_snapshot_data/uploads/photos/fa076afc-a542-4bf1-bbcb-1d26d1f44a99.jpg new file mode 100644 index 00000000..0adf5ac2 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/fa076afc-a542-4bf1-bbcb-1d26d1f44a99.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/fb06040a-4d6e-48dc-b52c-ff8e5639c422.jpg b/scripts/seed_snapshot_data/uploads/photos/fb06040a-4d6e-48dc-b52c-ff8e5639c422.jpg new file mode 100644 index 00000000..eafaacab Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/fb06040a-4d6e-48dc-b52c-ff8e5639c422.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/fd37e043-7fd8-4965-bac1-351c11d57047.jpg b/scripts/seed_snapshot_data/uploads/photos/fd37e043-7fd8-4965-bac1-351c11d57047.jpg new file mode 100644 index 00000000..8e964107 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/fd37e043-7fd8-4965-bac1-351c11d57047.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/fd82c30e-b67d-4f46-bf8f-6d6e5f1c509a.jpg b/scripts/seed_snapshot_data/uploads/photos/fd82c30e-b67d-4f46-bf8f-6d6e5f1c509a.jpg new file mode 100644 index 00000000..6405eb7b Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/fd82c30e-b67d-4f46-bf8f-6d6e5f1c509a.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/fd97abe4-785e-4b96-a975-b2354ff3821c.jpg b/scripts/seed_snapshot_data/uploads/photos/fd97abe4-785e-4b96-a975-b2354ff3821c.jpg new file mode 100644 index 00000000..72f64adf Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/fd97abe4-785e-4b96-a975-b2354ff3821c.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/feba9698-d279-4516-89a7-c408150dd1af.jpg b/scripts/seed_snapshot_data/uploads/photos/feba9698-d279-4516-89a7-c408150dd1af.jpg new file mode 100644 index 00000000..0bd55116 Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/feba9698-d279-4516-89a7-c408150dd1af.jpg differ diff --git a/scripts/seed_snapshot_data/uploads/photos/ffa4f3ba-69a4-4a15-8f6f-b5fb56c9e4de.jpg b/scripts/seed_snapshot_data/uploads/photos/ffa4f3ba-69a4-4a15-8f6f-b5fb56c9e4de.jpg new file mode 100644 index 00000000..4484e4ee Binary files /dev/null and b/scripts/seed_snapshot_data/uploads/photos/ffa4f3ba-69a4-4a15-8f6f-b5fb56c9e4de.jpg differ