From 2ecf41000409c7ccd73906e2aa598f7070f7c711 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 08:35:58 +0100 Subject: [PATCH 1/9] chore: backend scaffold and setup --- .github/CODEOWNERS | 4 ++ .github/ISSUE_TEMPLATE/bug_report.md | 21 +++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 16 +++++++ .github/pull_request_template.md | 25 +++++++++++ .github/workflows/ci.yml | 53 +++++++++++++++++++++++ .github/workflows/preview.yml | 22 ++++++++++ drizzle.config.ts | 14 ++++++ scripts/seed-admin.ts | 22 ---------- 8 files changed, 155 insertions(+), 22 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/preview.yml delete mode 100644 scripts/seed-admin.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..16741ab --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# CODEDDEVS TECHNOLOGY LTD — Code Owners +# All PRs targeting main or dev require review from the repo owner before merging + +* @onerandomdevv diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..3a65e05 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,21 @@ +--- +name: Bug report +about: Something is broken +labels: bug +--- + +## What is broken? + +## Steps to reproduce +1. +2. +3. + +## Expected behaviour + +## Actual behaviour + +## Environment +- Branch: +- Node version: +- Browser (if UI): diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..8e59070 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,16 @@ +--- +name: Feature request +about: Suggest something new +labels: enhancement +--- + +## What do you want to build? + +## Why is it needed? + +## Acceptance criteria +- [ ] +- [ ] +- [ ] + +## Notes diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ecd0043 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +## What does this PR do? + + +## Type of change +- [ ] Feature +- [ ] Bug fix +- [ ] Config / setup +- [ ] Refactor +- [ ] Docs + +## Checklist +- [ ] I have read CLAUDE.md +- [ ] pnpm build passes locally with no errors +- [ ] No TypeScript errors (pnpm tsc --noEmit) +- [ ] No hardcoded secrets or API keys +- [ ] All new API routes check for admin session before executing +- [ ] No UI libraries were installed +- [ ] Fonts are loaded via next/font/google only +- [ ] pnpm was used (not npm or yarn) + +## Screenshots (if UI changes) + + +## Notes for reviewer + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d402b49 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,53 @@ +name: CI + +on: + push: + branches: + - main + - dev + pull_request: + branches: + - main + - dev + +jobs: + ci: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: TypeScript check + run: pnpm tsc --noEmit + + - name: ESLint + run: pnpm eslint src/ --ext .ts,.tsx --max-warnings 0 + + - name: Build check + run: pnpm build + env: + DATABASE_URL: postgresql://dummy:dummy@dummy/dummy + DATABASE_URL_UNPOOLED: postgresql://dummy:dummy@dummy/dummy + NEXTAUTH_SECRET: dummy-secret-for-ci-only-not-real + NEXTAUTH_URL: http://localhost:3000 + NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME: dummy + NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET: dummy + CLOUDINARY_API_KEY: dummy + CLOUDINARY_API_SECRET: dummy + RESEND_API_KEY: dummy + CONTACT_NOTIFICATION_EMAIL: ci@dummy.com diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml new file mode 100644 index 0000000..bc94feb --- /dev/null +++ b/.github/workflows/preview.yml @@ -0,0 +1,22 @@ +name: Preview + +on: + pull_request: + branches: + - main + +jobs: + preview: + runs-on: ubuntu-latest + + steps: + - name: Comment preview status + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: "✅ CI passed. Vercel preview deployment will be available shortly.", + }); diff --git a/drizzle.config.ts b/drizzle.config.ts index 7c715ea..f2041a0 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,5 +1,19 @@ +import { existsSync, readFileSync } from "node:fs"; import { defineConfig } from "drizzle-kit"; +if (existsSync(".env.local")) { + const envFile = readFileSync(".env.local", "utf8"); + + for (const line of envFile.split(/\r?\n/)) { + const match = line.match(/^([^#=]+)=(.*)$/); + + if (match) { + const value = match[2].trim().replace(/^(['"])(.*)\1$/, "$2"); + process.env[match[1].trim()] ??= value; + } + } +} + export default defineConfig({ schema: "./src/db/schema.ts", out: "./src/db/migrations", diff --git a/scripts/seed-admin.ts b/scripts/seed-admin.ts deleted file mode 100644 index 9de55a3..0000000 --- a/scripts/seed-admin.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { hash } from "bcryptjs"; -import { adminUsers, db } from "@/db"; - -const [email, password] = process.argv.slice(2); - -if (!email || !password) { - throw new Error( - "Usage: pnpm tsx scripts/seed-admin.ts admin@example.com secure-password", - ); -} - -const password_hash = await hash(password, 12); - -await db.insert(adminUsers).values({ - email, - password_hash, -}); - -console.log(`Admin user created successfully: ${email}`); -console.log( - "Run this once only. Delete this script or remove the credentials after use.", -); From 6aa601e1ce583bd6d8b5c89d87471f974afac6ad Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 12:50:03 +0100 Subject: [PATCH 2/9] feat: complete backend setup - Project scaffold and folder architecture - Neon PostgreSQL + Drizzle ORM schema (7 tables) - NextAuth.js v5 credentials auth + admin login page - Middleware route protection for /admin and /api/admin - Contact form API with Resend email notification - Career application API with email notification - Cloudinary image upload API (admin protected) - Full admin CRUD API routes (team, projects, blog, careers, applications, messages) - GitHub Actions CI workflow (type check + lint + build) - PR template, issue templates, CODEOWNERS - Environment variable setup --- AGENTS.md | 220 +++---- CLAUDE.md | 220 +++---- middleware.ts | 13 +- scripts/seed-admin.ts | 49 ++ src/app/(public)/about/page.tsx | 4 +- src/app/(public)/blog/[slug]/page.tsx | 4 +- src/app/(public)/blog/page.tsx | 4 +- src/app/(public)/careers/page.tsx | 4 +- src/app/(public)/contact/page.tsx | 4 +- src/app/(public)/layout.tsx | 8 +- src/app/(public)/page.tsx | 4 +- src/app/(public)/products/page.tsx | 3 + src/app/(public)/projects/page.tsx | 1 - src/app/(public)/team/page.tsx | 4 +- src/app/admin/applications/page.tsx | 4 +- src/app/admin/blog/[id]/page.tsx | 4 +- src/app/admin/blog/new/page.tsx | 4 +- src/app/admin/blog/page.tsx | 4 +- src/app/admin/careers/[id]/page.tsx | 4 +- src/app/admin/careers/new/page.tsx | 4 +- src/app/admin/careers/page.tsx | 4 +- src/app/admin/dashboard/page.tsx | 4 +- src/app/admin/messages/page.tsx | 4 +- src/app/admin/products/[id]/page.tsx | 3 + src/app/admin/products/new/page.tsx | 3 + src/app/admin/products/page.tsx | 3 + src/app/admin/projects/[id]/page.tsx | 1 - src/app/admin/projects/new/page.tsx | 1 - src/app/admin/projects/page.tsx | 1 - src/app/admin/team/[id]/page.tsx | 4 +- src/app/admin/team/new/page.tsx | 4 +- src/app/admin/team/page.tsx | 4 +- src/app/api/admin/blog/[id]/route.ts | 3 + src/app/api/admin/blog/route.ts | 1 + .../{projects => products}/[id]/route.ts | 42 +- .../api/admin/{projects => products}/route.ts | 58 +- src/components/admin/DataTable.tsx | 4 +- src/components/admin/ImageUpload.tsx | 4 +- src/components/admin/RichTextEditor.tsx | 4 +- src/components/layout/AdminSidebar.tsx | 4 +- src/components/layout/Footer.tsx | 4 +- src/components/layout/Navbar.tsx | 4 +- src/components/sections/HackathonStrip.tsx | 4 +- src/components/sections/HeroSection.tsx | 4 +- src/components/sections/ProductsSection.tsx | 3 + src/components/sections/ProjectsSection.tsx | 1 - src/components/sections/TeamSection.tsx | 4 +- src/components/ui/Badge.tsx | 4 +- src/components/ui/Button.tsx | 4 +- src/components/ui/Card.tsx | 4 +- src/components/ui/Input.tsx | 4 +- src/components/ui/Textarea.tsx | 4 +- src/db/migrations/0001_left_toxin.sql | 6 + src/db/migrations/meta/0001_snapshot.json | 572 ++++++++++++++++++ src/db/migrations/meta/_journal.json | 7 + src/db/schema.ts | 5 +- src/lib/email.ts | 4 +- src/types/index.ts | 6 +- 58 files changed, 1069 insertions(+), 297 deletions(-) create mode 100644 scripts/seed-admin.ts create mode 100644 src/app/(public)/products/page.tsx delete mode 100644 src/app/(public)/projects/page.tsx create mode 100644 src/app/admin/products/[id]/page.tsx create mode 100644 src/app/admin/products/new/page.tsx create mode 100644 src/app/admin/products/page.tsx delete mode 100644 src/app/admin/projects/[id]/page.tsx delete mode 100644 src/app/admin/projects/new/page.tsx delete mode 100644 src/app/admin/projects/page.tsx rename src/app/api/admin/{projects => products}/[id]/route.ts (77%) rename src/app/api/admin/{projects => products}/route.ts (51%) create mode 100644 src/components/sections/ProductsSection.tsx delete mode 100644 src/components/sections/ProjectsSection.tsx create mode 100644 src/db/migrations/0001_left_toxin.sql create mode 100644 src/db/migrations/meta/0001_snapshot.json diff --git a/AGENTS.md b/AGENTS.md index fab8206..c40a012 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,12 +6,13 @@ ## 1. What This Project Is -Company website for **CODEDDEVS TECHNOLOGY LTD** (RC: 9426867). +Official company website for **CODEDDEVS TECHNOLOGY LTD** (RC: 9426867). - **URL:** codeddevs.com (placeholder until domain is confirmed) - **Audience:** Investors, press, and partners — NOT merchants, buyers, or end users -- **Purpose:** Establish credibility, introduce the company and team, showcase twizrr, share company updates via blog +- **Purpose:** Present CODEDDEVS as a serious, product-driven technology company. Communicate what we are building, what's coming next, and how our products are evolving. Share product updates, releases, version changes, roadmaps, and announcements. - **Tone:** Professional, minimal, text-first — like Anthropic.com or Stripe.com +- **This is NOT a portfolio site.** Do not treat it like a project showcase or personal portfolio. It is an official company website structured the way established tech companies present themselves. - **This is NOT the twizrr product site.** twizrr.com is a completely separate codebase and repo. Every mention of twizrr on this site links OUT to twizrr.com. --- @@ -118,25 +119,27 @@ codeddevs-website/ ├── src/ │ ├── app/ │ │ ├── (public)/ -│ │ │ ├── layout.tsx # Navbar + Footer -│ │ │ ├── page.tsx # / Home -│ │ │ ├── about/page.tsx # /about -│ │ │ ├── projects/page.tsx # /projects +│ │ │ ├── layout.tsx # Navbar + Footer +│ │ │ ├── page.tsx # / Home +│ │ │ ├── about/page.tsx # /about +│ │ │ ├── products/ +│ │ │ │ ├── page.tsx # /products (all products list) +│ │ │ │ └── [slug]/page.tsx # /products/[slug] (dedicated product page) │ │ │ ├── blog/ -│ │ │ │ ├── page.tsx # /blog (list) -│ │ │ │ └── [slug]/page.tsx # /blog/[slug] -│ │ │ ├── team/page.tsx # /team -│ │ │ ├── careers/page.tsx # /careers -│ │ │ └── contact/page.tsx # /contact +│ │ │ │ ├── page.tsx # /blog (updates list, displayed as "Updates") +│ │ │ │ └── [slug]/page.tsx # /blog/[slug] +│ │ │ ├── team/page.tsx # /team +│ │ │ ├── careers/page.tsx # /careers +│ │ │ └── contact/page.tsx # /contact │ │ ├── admin/ -│ │ │ ├── layout.tsx # Admin sidebar layout -│ │ │ ├── login/page.tsx # /admin/login -│ │ │ ├── dashboard/page.tsx # /admin/dashboard +│ │ │ ├── layout.tsx # Admin sidebar layout +│ │ │ ├── login/page.tsx # /admin/login +│ │ │ ├── dashboard/page.tsx # /admin/dashboard │ │ │ ├── team/ │ │ │ │ ├── page.tsx │ │ │ │ ├── new/page.tsx │ │ │ │ └── [id]/page.tsx -│ │ │ ├── projects/ +│ │ │ ├── products/ │ │ │ │ ├── page.tsx │ │ │ │ ├── new/page.tsx │ │ │ │ └── [id]/page.tsx @@ -157,9 +160,9 @@ codeddevs-website/ │ │ │ ├── upload/route.ts │ │ │ └── admin/ │ │ │ ├── team/ -│ │ │ │ ├── route.ts # GET, POST -│ │ │ │ └── [id]/route.ts # GET, PUT, DELETE -│ │ │ ├── projects/ +│ │ │ │ ├── route.ts # GET, POST +│ │ │ │ └── [id]/route.ts # GET, PUT, DELETE +│ │ │ ├── products/ │ │ │ │ ├── route.ts │ │ │ │ └── [id]/route.ts │ │ │ ├── blog/ @@ -174,7 +177,7 @@ codeddevs-website/ │ │ │ └── messages/ │ │ │ ├── route.ts │ │ │ └── [id]/route.ts -│ │ ├── layout.tsx # Root layout (fonts, metadata) +│ │ ├── layout.tsx # Root layout (fonts, metadata) │ │ ├── not-found.tsx │ │ └── globals.css │ ├── components/ @@ -190,32 +193,32 @@ codeddevs-website/ │ │ │ └── Textarea.tsx │ │ ├── sections/ │ │ │ ├── HeroSection.tsx -│ │ │ ├── ProjectsSection.tsx -│ │ │ ├── HackathonStrip.tsx +│ │ │ ├── ProductsSection.tsx +│ │ │ ├── LatestReleasesSection.tsx # Home page — pulls 3 latest blog posts │ │ │ └── TeamSection.tsx │ │ └── admin/ -│ │ ├── RichTextEditor.tsx # TipTap wrapper -│ │ ├── ImageUpload.tsx # Cloudinary uploader +│ │ ├── RichTextEditor.tsx # TipTap wrapper +│ │ ├── ImageUpload.tsx # Cloudinary uploader │ │ └── DataTable.tsx │ ├── db/ -│ │ ├── index.ts # Drizzle client (Neon) -│ │ ├── schema.ts # All table definitions -│ │ └── migrations/ # Drizzle-generated — never edit manually +│ │ ├── index.ts # Drizzle client (Neon) +│ │ ├── schema.ts # All table definitions +│ │ └── migrations/ # Drizzle-generated — never edit manually │ ├── lib/ -│ │ ├── auth.ts # NextAuth v5 config -│ │ ├── email.ts # Resend helpers -│ │ ├── cloudinary.ts # Cloudinary config -│ │ └── utils.ts # cn() helper +│ │ ├── auth.ts # NextAuth v5 config +│ │ ├── email.ts # Resend helpers +│ │ ├── cloudinary.ts # Cloudinary config +│ │ └── utils.ts # cn() and slugify helpers │ └── types/ -│ └── index.ts # Shared TypeScript types +│ └── index.ts # Shared TypeScript types ├── drizzle.config.ts -├── middleware.ts # Route protection +├── middleware.ts # Route protection ├── next.config.ts ├── tailwind.config.ts ├── tsconfig.json -├── .env.local # Never commit this -├── .env.example # Commit this (values empty) -├── AGENTS.md # This file +├── .env.local # Never commit this +├── .env.example # Commit this (values empty) +├── CLAUDE.md # This file └── package.json ``` @@ -237,25 +240,25 @@ github_url: text twitter_url: text order_index: integer, notNull, default(0) is_active: boolean, notNull, default(true) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` -### projects +### products ```ts id: uuid, primaryKey, defaultRandom() name: text, notNull slug: text, notNull, unique tagline: text, notNull -description: text, notNull +description: text, notNull // full product description cover_url: text // Cloudinary URL -external_url: text // e.g. twizrr.com +external_url: text // e.g. twizrr.com — always opens externally github_url: text status: text, notNull // 'development' | 'live' | 'archived' is_featured: boolean, notNull, default(false) order_index: integer, notNull, default(0) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### blog_posts @@ -265,12 +268,13 @@ title: text, notNull slug: text, notNull, unique excerpt: text, notNull content: json, notNull // TipTap JSON -cover_url: text +cover_url: text // Cloudinary URL author: text, notNull, default('CODEDDEVS') +category: text, notNull // 'Product Update' | 'Announcement' | 'Roadmap' | 'Story' is_published: boolean, notNull, default(false) published_at: timestamp -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### careers @@ -282,21 +286,21 @@ location: text, notNull, default('Lagos, Nigeria / Remote') description: text, notNull requirements: text, notNull is_open: boolean, notNull, default(true) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### career_applications ```ts id: uuid, primaryKey, defaultRandom() -career_id: uuid, references(careers.id) +career_id: uuid, notNull, references(careers.id) onDelete cascade full_name: text, notNull email: text, notNull portfolio_url: text github_url: text cover_letter: text, notNull status: text, notNull, default('pending') // 'pending' | 'reviewed' | 'rejected' -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` ### contact_submissions @@ -307,7 +311,7 @@ email: text, notNull subject: text, notNull message: text, notNull is_read: boolean, notNull, default(false) -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` ### admin_users @@ -315,7 +319,7 @@ created_at: timestamp, defaultNow() id: uuid, primaryKey, defaultRandom() email: text, notNull, unique password_hash: text, notNull // bcrypt hash -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` --- @@ -361,8 +365,8 @@ Use `DATABASE_URL_UNPOOLED` only in `drizzle.config.ts` for migrations. | POST | `/api/upload` | Upload image to Cloudinary | | GET/POST | `/api/admin/team` | List / create team members | | GET/PUT/DELETE | `/api/admin/team/[id]` | Read / update / delete | -| GET/POST | `/api/admin/projects` | List / create projects | -| GET/PUT/DELETE | `/api/admin/projects/[id]` | Read / update / delete | +| GET/POST | `/api/admin/products` | List / create products | +| GET/PUT/DELETE | `/api/admin/products/[id]` | Read / update / delete | | GET/POST | `/api/admin/blog` | List / create posts | | GET/PUT/DELETE | `/api/admin/blog/[id]` | Read / update / delete | | GET/POST | `/api/admin/careers` | List / create listings | @@ -392,32 +396,51 @@ export const config = { --- -## 9. Page Content +## 9. Page Content & Structure ### Home (/) - **Hero headline:** "Engineering Software That Works for Africa" - **Hero subtext:** "We build AI-first software products for African markets — from first principles, not adaptations." -- **CTAs:** "See Our Work" → /projects | "Get in Touch" → /contact -- **Products section:** twizrr card only — status "In Development" — links to twizrr.com -- **Hackathon strip:** 3 wins shown as text achievements (social proof) +- **CTAs:** "See Our Products" → /products | "Get in Touch" → /contact +- **Products section:** twizrr card only — status "In Development" — links externally to twizrr.com +- **Latest Releases section:** pulls the 3 most recently published blog posts automatically. Section heading: "Latest Releases". Each card shows: title, excerpt, date, category badge, and a dynamic CTA button based on category: + - "Product Update" → "Read the update →" + - "Announcement" → "Read the announcement →" + - "Roadmap" → "Read the roadmap →" + - "Story" → "Read the story →" +- **Hackathon achievements strip:** 3 wins shown as plain text social proof — not cards, not a showcase - **About teaser:** 2 sentences + "Meet the Team" → /team ### About (/about) - Mission: building AI-first software for African markets -- Approach: from first principles, not adapting tools built elsewhere +- Approach: from first principles — not adapting tools built elsewhere - Open-source commitment - Company facts: RC 9426867 | Lagos, Nigeria | Est. March 2026 +- This page explains WHO we are and WHY we exist — not what we have built -### Projects (/projects) -- Pulls from `projects` table +### Products (/products) +- Renamed from "Projects" — this is NOT a project showcase +- Pulls from `products` table +- Each product gets a card: name, tagline, status badge, external link - Currently: twizrr only (status: In Development) -- Each card: name, tagline, status badge, external link to product site -- Hackathon achievements shown as a separate text section below projects +- Each product links to its own dedicated page at /products/[slug] +- Hackathon achievements are NOT listed here — they belong in the blog as Story posts + +### Products — Dedicated Page (/products/[slug]) +- Full dedicated page per product +- Shows: name, tagline, full description, status, cover image +- External link button: "Visit [product name] →" opens externally +- GitHub link if available +- Related blog posts: pulls blog_posts where category = 'Product Update' filtered by product mention (or manually tagged — TBD) ### Blog (/blog) +- Displayed in the nav and on the page as **"Updates"** — the URL stays `/blog` +- This is the company's communication engine — product updates, releases, roadmaps, announcements, stories - Lists `blog_posts` where `is_published = true`, ordered by `published_at DESC` -- Shows: title, excerpt, date, author -- `/blog/[slug]` renders TipTap JSON content +- Shows: title, excerpt, date, author, category badge +- Filterable by category: All | Product Update | Announcement | Roadmap | Story +- `/blog/[slug]` renders the full TipTap JSON content +- Hackathon achievements are documented here as **Story** category posts ### Team (/team) - Pulls from `team_members` table ordered by `order_index` @@ -473,12 +496,16 @@ Follow every rule below on every task. No exceptions. 15. **Import alias.** Always use `@/` imports. Never use relative `../../` imports. -16. **twizrr links are always external.** Every link to twizrr on this site uses `target="_blank" rel="noopener noreferrer"` and points to `twizrr.com`. +16. **Product/twizrr links are always external.** Every link to any product site uses `target="_blank" rel="noopener noreferrer"`. 17. **migrations/ is read-only.** Never manually edit files in `src/db/migrations/`. Only Drizzle Kit writes to that folder. 18. **Logo usage.** The logo file is `/public/full-logo.png`. Always display it in the Navbar linked to `/`. Never recreate the logo in code. +19. **"Projects" is now "Products".** The table is named `products`, the route is `/products`, the admin section is `/admin/products`, the API is `/api/admin/products`. Never use the word "projects" anywhere in the UI, routes, or code. + +20. **Blog is displayed as "Updates".** The URL and internal references stay as `/blog`. But every user-facing label — nav link, page heading, section titles — uses "Updates" not "Blog". + --- ## 11. Company Details (Reference) @@ -505,6 +532,8 @@ Follow every rule below on every task. No exceptions. | Amoo Mustakheem Olamilekan | Co-Founder & COO | ### Hackathon Achievements +These are NOT products. Document them as Story posts in the blog. + | Project | Event | Result | |---|---|---| | DialAI | Build with AT: Generative AI + APIs Across Africa (Feb 2026) | 1st Place | @@ -513,52 +542,29 @@ Follow every rule below on every task. No exceptions. --- +## 12. Security -# 11. SECURITY - -## Secrets & Credentials -- Never check secrets into the repo or include them in prompts. -- Use environment variables and a secrets manager for local and CI use. -- `.env.local` is listed in `.gitignore` and must never be committed. Use `.env.example` for placeholder keys. - -## Environment Variables (reference) - -```bash -# Database -DATABASE_URL= -DATABASE_URL_UNPOOLED= - -# Auth -NEXTAUTH_SECRET= -NEXTAUTH_URL=http://localhost:3000 - -# Cloudinary -NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME= -NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET= -CLOUDINARY_API_KEY= -CLOUDINARY_API_SECRET= +### Secrets & Credentials +- Never check secrets into the repo or include them in prompts +- Use environment variables for all sensitive values +- `.env.local` is in `.gitignore` and must never be committed +- Use `.env.example` for placeholder keys only -# Resend -RESEND_API_KEY= -CONTACT_NOTIFICATION_EMAIL=codeddevs.team@gmail.com -``` +### Permissions & Review +- All PRs must be reviewed by @onerandomdevv before merging +- Any change touching infra, deployment, or secret handling requires explicit human approval +- Agent-generated code must be reviewed before merge — never auto-merge -- Use `DATABASE_URL` for app queries; `DATABASE_URL_UNPOOLED` only in `drizzle.config.ts` for migrations. -- Never paste secrets into prompts or store them in generated code. +### Data Privacy +- Do not send user PII to external APIs unless absolutely necessary +- If required, anonymise before sending +- TipTap content in DB is treated as site data — handle uploads and attachments carefully -## Permissions & Review -- Agent-generated PRs must be reviewed by an authorized maintainer before merge. -- Any change that touches infra, deployment, or secret handling requires explicit human approval. +### Incident Response +- If credentials are exposed, rotate the keys immediately +- Keep an audit trail of the incident and actions taken +- Security contact: codeddevs.team@gmail.com -## Data Privacy -- Avoid sending user PII or private data to external APIs. If necessary, anonymize before sending. -- TipTap content stored in DB is treated as site data — not PII — but treat uploads and attachments carefully. - -## Incident Response -- If an agent exposes credentials or sensitive data, rotate the keys immediately and notify security@company.example. -- Keep an audit trail of the incident and the actions taken. - -## Contacts -- Security contact: security@company.example +--- *Last updated: May 2026* \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index fab8206..c40a012 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,12 +6,13 @@ ## 1. What This Project Is -Company website for **CODEDDEVS TECHNOLOGY LTD** (RC: 9426867). +Official company website for **CODEDDEVS TECHNOLOGY LTD** (RC: 9426867). - **URL:** codeddevs.com (placeholder until domain is confirmed) - **Audience:** Investors, press, and partners — NOT merchants, buyers, or end users -- **Purpose:** Establish credibility, introduce the company and team, showcase twizrr, share company updates via blog +- **Purpose:** Present CODEDDEVS as a serious, product-driven technology company. Communicate what we are building, what's coming next, and how our products are evolving. Share product updates, releases, version changes, roadmaps, and announcements. - **Tone:** Professional, minimal, text-first — like Anthropic.com or Stripe.com +- **This is NOT a portfolio site.** Do not treat it like a project showcase or personal portfolio. It is an official company website structured the way established tech companies present themselves. - **This is NOT the twizrr product site.** twizrr.com is a completely separate codebase and repo. Every mention of twizrr on this site links OUT to twizrr.com. --- @@ -118,25 +119,27 @@ codeddevs-website/ ├── src/ │ ├── app/ │ │ ├── (public)/ -│ │ │ ├── layout.tsx # Navbar + Footer -│ │ │ ├── page.tsx # / Home -│ │ │ ├── about/page.tsx # /about -│ │ │ ├── projects/page.tsx # /projects +│ │ │ ├── layout.tsx # Navbar + Footer +│ │ │ ├── page.tsx # / Home +│ │ │ ├── about/page.tsx # /about +│ │ │ ├── products/ +│ │ │ │ ├── page.tsx # /products (all products list) +│ │ │ │ └── [slug]/page.tsx # /products/[slug] (dedicated product page) │ │ │ ├── blog/ -│ │ │ │ ├── page.tsx # /blog (list) -│ │ │ │ └── [slug]/page.tsx # /blog/[slug] -│ │ │ ├── team/page.tsx # /team -│ │ │ ├── careers/page.tsx # /careers -│ │ │ └── contact/page.tsx # /contact +│ │ │ │ ├── page.tsx # /blog (updates list, displayed as "Updates") +│ │ │ │ └── [slug]/page.tsx # /blog/[slug] +│ │ │ ├── team/page.tsx # /team +│ │ │ ├── careers/page.tsx # /careers +│ │ │ └── contact/page.tsx # /contact │ │ ├── admin/ -│ │ │ ├── layout.tsx # Admin sidebar layout -│ │ │ ├── login/page.tsx # /admin/login -│ │ │ ├── dashboard/page.tsx # /admin/dashboard +│ │ │ ├── layout.tsx # Admin sidebar layout +│ │ │ ├── login/page.tsx # /admin/login +│ │ │ ├── dashboard/page.tsx # /admin/dashboard │ │ │ ├── team/ │ │ │ │ ├── page.tsx │ │ │ │ ├── new/page.tsx │ │ │ │ └── [id]/page.tsx -│ │ │ ├── projects/ +│ │ │ ├── products/ │ │ │ │ ├── page.tsx │ │ │ │ ├── new/page.tsx │ │ │ │ └── [id]/page.tsx @@ -157,9 +160,9 @@ codeddevs-website/ │ │ │ ├── upload/route.ts │ │ │ └── admin/ │ │ │ ├── team/ -│ │ │ │ ├── route.ts # GET, POST -│ │ │ │ └── [id]/route.ts # GET, PUT, DELETE -│ │ │ ├── projects/ +│ │ │ │ ├── route.ts # GET, POST +│ │ │ │ └── [id]/route.ts # GET, PUT, DELETE +│ │ │ ├── products/ │ │ │ │ ├── route.ts │ │ │ │ └── [id]/route.ts │ │ │ ├── blog/ @@ -174,7 +177,7 @@ codeddevs-website/ │ │ │ └── messages/ │ │ │ ├── route.ts │ │ │ └── [id]/route.ts -│ │ ├── layout.tsx # Root layout (fonts, metadata) +│ │ ├── layout.tsx # Root layout (fonts, metadata) │ │ ├── not-found.tsx │ │ └── globals.css │ ├── components/ @@ -190,32 +193,32 @@ codeddevs-website/ │ │ │ └── Textarea.tsx │ │ ├── sections/ │ │ │ ├── HeroSection.tsx -│ │ │ ├── ProjectsSection.tsx -│ │ │ ├── HackathonStrip.tsx +│ │ │ ├── ProductsSection.tsx +│ │ │ ├── LatestReleasesSection.tsx # Home page — pulls 3 latest blog posts │ │ │ └── TeamSection.tsx │ │ └── admin/ -│ │ ├── RichTextEditor.tsx # TipTap wrapper -│ │ ├── ImageUpload.tsx # Cloudinary uploader +│ │ ├── RichTextEditor.tsx # TipTap wrapper +│ │ ├── ImageUpload.tsx # Cloudinary uploader │ │ └── DataTable.tsx │ ├── db/ -│ │ ├── index.ts # Drizzle client (Neon) -│ │ ├── schema.ts # All table definitions -│ │ └── migrations/ # Drizzle-generated — never edit manually +│ │ ├── index.ts # Drizzle client (Neon) +│ │ ├── schema.ts # All table definitions +│ │ └── migrations/ # Drizzle-generated — never edit manually │ ├── lib/ -│ │ ├── auth.ts # NextAuth v5 config -│ │ ├── email.ts # Resend helpers -│ │ ├── cloudinary.ts # Cloudinary config -│ │ └── utils.ts # cn() helper +│ │ ├── auth.ts # NextAuth v5 config +│ │ ├── email.ts # Resend helpers +│ │ ├── cloudinary.ts # Cloudinary config +│ │ └── utils.ts # cn() and slugify helpers │ └── types/ -│ └── index.ts # Shared TypeScript types +│ └── index.ts # Shared TypeScript types ├── drizzle.config.ts -├── middleware.ts # Route protection +├── middleware.ts # Route protection ├── next.config.ts ├── tailwind.config.ts ├── tsconfig.json -├── .env.local # Never commit this -├── .env.example # Commit this (values empty) -├── AGENTS.md # This file +├── .env.local # Never commit this +├── .env.example # Commit this (values empty) +├── CLAUDE.md # This file └── package.json ``` @@ -237,25 +240,25 @@ github_url: text twitter_url: text order_index: integer, notNull, default(0) is_active: boolean, notNull, default(true) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` -### projects +### products ```ts id: uuid, primaryKey, defaultRandom() name: text, notNull slug: text, notNull, unique tagline: text, notNull -description: text, notNull +description: text, notNull // full product description cover_url: text // Cloudinary URL -external_url: text // e.g. twizrr.com +external_url: text // e.g. twizrr.com — always opens externally github_url: text status: text, notNull // 'development' | 'live' | 'archived' is_featured: boolean, notNull, default(false) order_index: integer, notNull, default(0) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### blog_posts @@ -265,12 +268,13 @@ title: text, notNull slug: text, notNull, unique excerpt: text, notNull content: json, notNull // TipTap JSON -cover_url: text +cover_url: text // Cloudinary URL author: text, notNull, default('CODEDDEVS') +category: text, notNull // 'Product Update' | 'Announcement' | 'Roadmap' | 'Story' is_published: boolean, notNull, default(false) published_at: timestamp -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### careers @@ -282,21 +286,21 @@ location: text, notNull, default('Lagos, Nigeria / Remote') description: text, notNull requirements: text, notNull is_open: boolean, notNull, default(true) -created_at: timestamp, defaultNow() -updated_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull +updated_at: timestamp, defaultNow(), notNull ``` ### career_applications ```ts id: uuid, primaryKey, defaultRandom() -career_id: uuid, references(careers.id) +career_id: uuid, notNull, references(careers.id) onDelete cascade full_name: text, notNull email: text, notNull portfolio_url: text github_url: text cover_letter: text, notNull status: text, notNull, default('pending') // 'pending' | 'reviewed' | 'rejected' -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` ### contact_submissions @@ -307,7 +311,7 @@ email: text, notNull subject: text, notNull message: text, notNull is_read: boolean, notNull, default(false) -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` ### admin_users @@ -315,7 +319,7 @@ created_at: timestamp, defaultNow() id: uuid, primaryKey, defaultRandom() email: text, notNull, unique password_hash: text, notNull // bcrypt hash -created_at: timestamp, defaultNow() +created_at: timestamp, defaultNow(), notNull ``` --- @@ -361,8 +365,8 @@ Use `DATABASE_URL_UNPOOLED` only in `drizzle.config.ts` for migrations. | POST | `/api/upload` | Upload image to Cloudinary | | GET/POST | `/api/admin/team` | List / create team members | | GET/PUT/DELETE | `/api/admin/team/[id]` | Read / update / delete | -| GET/POST | `/api/admin/projects` | List / create projects | -| GET/PUT/DELETE | `/api/admin/projects/[id]` | Read / update / delete | +| GET/POST | `/api/admin/products` | List / create products | +| GET/PUT/DELETE | `/api/admin/products/[id]` | Read / update / delete | | GET/POST | `/api/admin/blog` | List / create posts | | GET/PUT/DELETE | `/api/admin/blog/[id]` | Read / update / delete | | GET/POST | `/api/admin/careers` | List / create listings | @@ -392,32 +396,51 @@ export const config = { --- -## 9. Page Content +## 9. Page Content & Structure ### Home (/) - **Hero headline:** "Engineering Software That Works for Africa" - **Hero subtext:** "We build AI-first software products for African markets — from first principles, not adaptations." -- **CTAs:** "See Our Work" → /projects | "Get in Touch" → /contact -- **Products section:** twizrr card only — status "In Development" — links to twizrr.com -- **Hackathon strip:** 3 wins shown as text achievements (social proof) +- **CTAs:** "See Our Products" → /products | "Get in Touch" → /contact +- **Products section:** twizrr card only — status "In Development" — links externally to twizrr.com +- **Latest Releases section:** pulls the 3 most recently published blog posts automatically. Section heading: "Latest Releases". Each card shows: title, excerpt, date, category badge, and a dynamic CTA button based on category: + - "Product Update" → "Read the update →" + - "Announcement" → "Read the announcement →" + - "Roadmap" → "Read the roadmap →" + - "Story" → "Read the story →" +- **Hackathon achievements strip:** 3 wins shown as plain text social proof — not cards, not a showcase - **About teaser:** 2 sentences + "Meet the Team" → /team ### About (/about) - Mission: building AI-first software for African markets -- Approach: from first principles, not adapting tools built elsewhere +- Approach: from first principles — not adapting tools built elsewhere - Open-source commitment - Company facts: RC 9426867 | Lagos, Nigeria | Est. March 2026 +- This page explains WHO we are and WHY we exist — not what we have built -### Projects (/projects) -- Pulls from `projects` table +### Products (/products) +- Renamed from "Projects" — this is NOT a project showcase +- Pulls from `products` table +- Each product gets a card: name, tagline, status badge, external link - Currently: twizrr only (status: In Development) -- Each card: name, tagline, status badge, external link to product site -- Hackathon achievements shown as a separate text section below projects +- Each product links to its own dedicated page at /products/[slug] +- Hackathon achievements are NOT listed here — they belong in the blog as Story posts + +### Products — Dedicated Page (/products/[slug]) +- Full dedicated page per product +- Shows: name, tagline, full description, status, cover image +- External link button: "Visit [product name] →" opens externally +- GitHub link if available +- Related blog posts: pulls blog_posts where category = 'Product Update' filtered by product mention (or manually tagged — TBD) ### Blog (/blog) +- Displayed in the nav and on the page as **"Updates"** — the URL stays `/blog` +- This is the company's communication engine — product updates, releases, roadmaps, announcements, stories - Lists `blog_posts` where `is_published = true`, ordered by `published_at DESC` -- Shows: title, excerpt, date, author -- `/blog/[slug]` renders TipTap JSON content +- Shows: title, excerpt, date, author, category badge +- Filterable by category: All | Product Update | Announcement | Roadmap | Story +- `/blog/[slug]` renders the full TipTap JSON content +- Hackathon achievements are documented here as **Story** category posts ### Team (/team) - Pulls from `team_members` table ordered by `order_index` @@ -473,12 +496,16 @@ Follow every rule below on every task. No exceptions. 15. **Import alias.** Always use `@/` imports. Never use relative `../../` imports. -16. **twizrr links are always external.** Every link to twizrr on this site uses `target="_blank" rel="noopener noreferrer"` and points to `twizrr.com`. +16. **Product/twizrr links are always external.** Every link to any product site uses `target="_blank" rel="noopener noreferrer"`. 17. **migrations/ is read-only.** Never manually edit files in `src/db/migrations/`. Only Drizzle Kit writes to that folder. 18. **Logo usage.** The logo file is `/public/full-logo.png`. Always display it in the Navbar linked to `/`. Never recreate the logo in code. +19. **"Projects" is now "Products".** The table is named `products`, the route is `/products`, the admin section is `/admin/products`, the API is `/api/admin/products`. Never use the word "projects" anywhere in the UI, routes, or code. + +20. **Blog is displayed as "Updates".** The URL and internal references stay as `/blog`. But every user-facing label — nav link, page heading, section titles — uses "Updates" not "Blog". + --- ## 11. Company Details (Reference) @@ -505,6 +532,8 @@ Follow every rule below on every task. No exceptions. | Amoo Mustakheem Olamilekan | Co-Founder & COO | ### Hackathon Achievements +These are NOT products. Document them as Story posts in the blog. + | Project | Event | Result | |---|---|---| | DialAI | Build with AT: Generative AI + APIs Across Africa (Feb 2026) | 1st Place | @@ -513,52 +542,29 @@ Follow every rule below on every task. No exceptions. --- +## 12. Security -# 11. SECURITY - -## Secrets & Credentials -- Never check secrets into the repo or include them in prompts. -- Use environment variables and a secrets manager for local and CI use. -- `.env.local` is listed in `.gitignore` and must never be committed. Use `.env.example` for placeholder keys. - -## Environment Variables (reference) - -```bash -# Database -DATABASE_URL= -DATABASE_URL_UNPOOLED= - -# Auth -NEXTAUTH_SECRET= -NEXTAUTH_URL=http://localhost:3000 - -# Cloudinary -NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME= -NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET= -CLOUDINARY_API_KEY= -CLOUDINARY_API_SECRET= +### Secrets & Credentials +- Never check secrets into the repo or include them in prompts +- Use environment variables for all sensitive values +- `.env.local` is in `.gitignore` and must never be committed +- Use `.env.example` for placeholder keys only -# Resend -RESEND_API_KEY= -CONTACT_NOTIFICATION_EMAIL=codeddevs.team@gmail.com -``` +### Permissions & Review +- All PRs must be reviewed by @onerandomdevv before merging +- Any change touching infra, deployment, or secret handling requires explicit human approval +- Agent-generated code must be reviewed before merge — never auto-merge -- Use `DATABASE_URL` for app queries; `DATABASE_URL_UNPOOLED` only in `drizzle.config.ts` for migrations. -- Never paste secrets into prompts or store them in generated code. +### Data Privacy +- Do not send user PII to external APIs unless absolutely necessary +- If required, anonymise before sending +- TipTap content in DB is treated as site data — handle uploads and attachments carefully -## Permissions & Review -- Agent-generated PRs must be reviewed by an authorized maintainer before merge. -- Any change that touches infra, deployment, or secret handling requires explicit human approval. +### Incident Response +- If credentials are exposed, rotate the keys immediately +- Keep an audit trail of the incident and actions taken +- Security contact: codeddevs.team@gmail.com -## Data Privacy -- Avoid sending user PII or private data to external APIs. If necessary, anonymize before sending. -- TipTap content stored in DB is treated as site data — not PII — but treat uploads and attachments carefully. - -## Incident Response -- If an agent exposes credentials or sensitive data, rotate the keys immediately and notify security@company.example. -- Keep an audit trail of the incident and the actions taken. - -## Contacts -- Security contact: security@company.example +--- *Last updated: May 2026* \ No newline at end of file diff --git a/middleware.ts b/middleware.ts index 181327a..8ea7b84 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,9 +1,14 @@ +import type { NextRequest } from "next/server"; import { NextResponse } from "next/server"; -import { auth } from "@/lib/auth"; +import { getToken } from "next-auth/jwt"; -export const middleware = auth((request) => { +export async function middleware(request: NextRequest) { const { pathname } = request.nextUrl; - const isAuthenticated = Boolean(request.auth); + const token = await getToken({ + req: request, + secret: process.env.NEXTAUTH_SECRET, + }); + const isAuthenticated = Boolean(token); if (pathname.startsWith("/api/admin") && !isAuthenticated) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); @@ -22,7 +27,7 @@ export const middleware = auth((request) => { } return NextResponse.next(); -}); +} export const config = { matcher: ["/admin/:path*", "/api/admin/:path*"], diff --git a/scripts/seed-admin.ts b/scripts/seed-admin.ts new file mode 100644 index 0000000..c8b6478 --- /dev/null +++ b/scripts/seed-admin.ts @@ -0,0 +1,49 @@ +import { existsSync, readFileSync } from "node:fs"; +import { hash } from "bcryptjs"; + +function loadLocalEnv() { + if (!existsSync(".env.local")) { + return; + } + + const envFile = readFileSync(".env.local", "utf8"); + + for (const line of envFile.split(/\r?\n/)) { + const match = line.match(/^([^#=]+)=(.*)$/); + + if (match) { + const value = match[2].trim().replace(/^(['"])(.*)\1$/, "$2"); + process.env[match[1].trim()] ??= value; + } + } +} + +async function main() { + loadLocalEnv(); + + const [email, password] = process.argv.slice(2); + + if (!email || !password) { + throw new Error( + "Usage: pnpm dlx tsx scripts/seed-admin.ts admin@example.com secure-password", + ); + } + + const { adminUsers, db } = await import("@/db"); + const password_hash = await hash(password, 12); + + await db.insert(adminUsers).values({ + email, + password_hash, + }); + + console.log(`Admin user created successfully: ${email}`); + console.log( + "Run this once only. Delete this script or remove the credentials after use.", + ); +} + +main().catch((error: unknown) => { + console.error(error); + process.exit(1); +}); diff --git a/src/app/(public)/about/page.tsx b/src/app/(public)/about/page.tsx index 10051c7..ba39f40 100644 --- a/src/app/(public)/about/page.tsx +++ b/src/app/(public)/about/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AboutPage() { + return null; +} diff --git a/src/app/(public)/blog/[slug]/page.tsx b/src/app/(public)/blog/[slug]/page.tsx index 10051c7..867c769 100644 --- a/src/app/(public)/blog/[slug]/page.tsx +++ b/src/app/(public)/blog/[slug]/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function BlogPostPage() { + return null; +} diff --git a/src/app/(public)/blog/page.tsx b/src/app/(public)/blog/page.tsx index 10051c7..c9a41d3 100644 --- a/src/app/(public)/blog/page.tsx +++ b/src/app/(public)/blog/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function BlogPage() { + return null; +} diff --git a/src/app/(public)/careers/page.tsx b/src/app/(public)/careers/page.tsx index 10051c7..a970f1a 100644 --- a/src/app/(public)/careers/page.tsx +++ b/src/app/(public)/careers/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function CareersPage() { + return null; +} diff --git a/src/app/(public)/contact/page.tsx b/src/app/(public)/contact/page.tsx index 10051c7..48fa526 100644 --- a/src/app/(public)/contact/page.tsx +++ b/src/app/(public)/contact/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function ContactPage() { + return null; +} diff --git a/src/app/(public)/layout.tsx b/src/app/(public)/layout.tsx index 10051c7..ce3791f 100644 --- a/src/app/(public)/layout.tsx +++ b/src/app/(public)/layout.tsx @@ -1 +1,7 @@ -// Placeholder +export default function PublicLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return children; +} diff --git a/src/app/(public)/page.tsx b/src/app/(public)/page.tsx index 10051c7..2fb9a12 100644 --- a/src/app/(public)/page.tsx +++ b/src/app/(public)/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function HomePage() { + return null; +} diff --git a/src/app/(public)/products/page.tsx b/src/app/(public)/products/page.tsx new file mode 100644 index 0000000..dbed6f7 --- /dev/null +++ b/src/app/(public)/products/page.tsx @@ -0,0 +1,3 @@ +export default function ProductsPage() { + return null; +} diff --git a/src/app/(public)/projects/page.tsx b/src/app/(public)/projects/page.tsx deleted file mode 100644 index 10051c7..0000000 --- a/src/app/(public)/projects/page.tsx +++ /dev/null @@ -1 +0,0 @@ -// Placeholder diff --git a/src/app/(public)/team/page.tsx b/src/app/(public)/team/page.tsx index 10051c7..b451eb4 100644 --- a/src/app/(public)/team/page.tsx +++ b/src/app/(public)/team/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function TeamPage() { + return null; +} diff --git a/src/app/admin/applications/page.tsx b/src/app/admin/applications/page.tsx index 10051c7..734e81c 100644 --- a/src/app/admin/applications/page.tsx +++ b/src/app/admin/applications/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminApplicationsPage() { + return null; +} diff --git a/src/app/admin/blog/[id]/page.tsx b/src/app/admin/blog/[id]/page.tsx index 10051c7..3d33552 100644 --- a/src/app/admin/blog/[id]/page.tsx +++ b/src/app/admin/blog/[id]/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function EditBlogPostPage() { + return null; +} diff --git a/src/app/admin/blog/new/page.tsx b/src/app/admin/blog/new/page.tsx index 10051c7..c2ac1d5 100644 --- a/src/app/admin/blog/new/page.tsx +++ b/src/app/admin/blog/new/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function NewBlogPostPage() { + return null; +} diff --git a/src/app/admin/blog/page.tsx b/src/app/admin/blog/page.tsx index 10051c7..c9a55a9 100644 --- a/src/app/admin/blog/page.tsx +++ b/src/app/admin/blog/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminBlogPage() { + return null; +} diff --git a/src/app/admin/careers/[id]/page.tsx b/src/app/admin/careers/[id]/page.tsx index 10051c7..8f41e5f 100644 --- a/src/app/admin/careers/[id]/page.tsx +++ b/src/app/admin/careers/[id]/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function EditCareerPage() { + return null; +} diff --git a/src/app/admin/careers/new/page.tsx b/src/app/admin/careers/new/page.tsx index 10051c7..3249842 100644 --- a/src/app/admin/careers/new/page.tsx +++ b/src/app/admin/careers/new/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function NewCareerPage() { + return null; +} diff --git a/src/app/admin/careers/page.tsx b/src/app/admin/careers/page.tsx index 10051c7..107555e 100644 --- a/src/app/admin/careers/page.tsx +++ b/src/app/admin/careers/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminCareersPage() { + return null; +} diff --git a/src/app/admin/dashboard/page.tsx b/src/app/admin/dashboard/page.tsx index 10051c7..ba4e1a6 100644 --- a/src/app/admin/dashboard/page.tsx +++ b/src/app/admin/dashboard/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminDashboardPage() { + return null; +} diff --git a/src/app/admin/messages/page.tsx b/src/app/admin/messages/page.tsx index 10051c7..dbfc4dc 100644 --- a/src/app/admin/messages/page.tsx +++ b/src/app/admin/messages/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminMessagesPage() { + return null; +} diff --git a/src/app/admin/products/[id]/page.tsx b/src/app/admin/products/[id]/page.tsx new file mode 100644 index 0000000..188fd26 --- /dev/null +++ b/src/app/admin/products/[id]/page.tsx @@ -0,0 +1,3 @@ +export default function EditProductPage() { + return null; +} diff --git a/src/app/admin/products/new/page.tsx b/src/app/admin/products/new/page.tsx new file mode 100644 index 0000000..c0ad002 --- /dev/null +++ b/src/app/admin/products/new/page.tsx @@ -0,0 +1,3 @@ +export default function NewProductPage() { + return null; +} diff --git a/src/app/admin/products/page.tsx b/src/app/admin/products/page.tsx new file mode 100644 index 0000000..90470b5 --- /dev/null +++ b/src/app/admin/products/page.tsx @@ -0,0 +1,3 @@ +export default function AdminProductsPage() { + return null; +} diff --git a/src/app/admin/projects/[id]/page.tsx b/src/app/admin/projects/[id]/page.tsx deleted file mode 100644 index 10051c7..0000000 --- a/src/app/admin/projects/[id]/page.tsx +++ /dev/null @@ -1 +0,0 @@ -// Placeholder diff --git a/src/app/admin/projects/new/page.tsx b/src/app/admin/projects/new/page.tsx deleted file mode 100644 index 10051c7..0000000 --- a/src/app/admin/projects/new/page.tsx +++ /dev/null @@ -1 +0,0 @@ -// Placeholder diff --git a/src/app/admin/projects/page.tsx b/src/app/admin/projects/page.tsx deleted file mode 100644 index 10051c7..0000000 --- a/src/app/admin/projects/page.tsx +++ /dev/null @@ -1 +0,0 @@ -// Placeholder diff --git a/src/app/admin/team/[id]/page.tsx b/src/app/admin/team/[id]/page.tsx index 10051c7..4e1e87b 100644 --- a/src/app/admin/team/[id]/page.tsx +++ b/src/app/admin/team/[id]/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function EditTeamMemberPage() { + return null; +} diff --git a/src/app/admin/team/new/page.tsx b/src/app/admin/team/new/page.tsx index 10051c7..c24e52f 100644 --- a/src/app/admin/team/new/page.tsx +++ b/src/app/admin/team/new/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function NewTeamMemberPage() { + return null; +} diff --git a/src/app/admin/team/page.tsx b/src/app/admin/team/page.tsx index 10051c7..51165b8 100644 --- a/src/app/admin/team/page.tsx +++ b/src/app/admin/team/page.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminTeamPage() { + return null; +} diff --git a/src/app/api/admin/blog/[id]/route.ts b/src/app/api/admin/blog/[id]/route.ts index 8fc49aa..66ca733 100644 --- a/src/app/api/admin/blog/[id]/route.ts +++ b/src/app/api/admin/blog/[id]/route.ts @@ -14,6 +14,9 @@ const contentSchema = z const blogPostUpdateSchema = z.object({ title: z.string().min(1).optional(), slug: z.string().min(1).optional(), + category: z + .enum(["Product Update", "Announcement", "Roadmap", "Story"]) + .optional(), excerpt: z.string().min(1).optional(), content: contentSchema.optional(), cover_url: z.string().url().nullable().optional(), diff --git a/src/app/api/admin/blog/route.ts b/src/app/api/admin/blog/route.ts index c00fc45..02b90b4 100644 --- a/src/app/api/admin/blog/route.ts +++ b/src/app/api/admin/blog/route.ts @@ -14,6 +14,7 @@ const contentSchema = z const blogPostCreateSchema = z.object({ title: z.string().min(1), slug: z.string().min(1).optional(), + category: z.enum(["Product Update", "Announcement", "Roadmap", "Story"]), excerpt: z.string().min(1), content: contentSchema, cover_url: z.string().url().nullable().optional(), diff --git a/src/app/api/admin/projects/[id]/route.ts b/src/app/api/admin/products/[id]/route.ts similarity index 77% rename from src/app/api/admin/projects/[id]/route.ts rename to src/app/api/admin/products/[id]/route.ts index deb333b..90a2dcb 100644 --- a/src/app/api/admin/projects/[id]/route.ts +++ b/src/app/api/admin/products/[id]/route.ts @@ -2,10 +2,10 @@ import { NextResponse } from "next/server"; import { eq } from "drizzle-orm"; import { z } from "zod"; import { auth } from "@/lib/auth"; -import { db, projects } from "@/db"; +import { db, products } from "@/db"; const idSchema = z.string().uuid(); -const projectUpdateSchema = z.object({ +const productUpdateSchema = z.object({ name: z.string().min(1).optional(), slug: z.string().min(1).optional(), tagline: z.string().min(1).optional(), @@ -37,19 +37,19 @@ export async function GET(_request: Request, { params }: RouteContext) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } - const [project] = await db + const [product] = await db .select() - .from(projects) - .where(eq(projects.id, parsedId.data)) + .from(products) + .where(eq(products.id, parsedId.data)) .limit(1); - if (!project) { + if (!product) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } - return NextResponse.json(project, { status: 200 }); + return NextResponse.json(product, { status: 200 }); } catch (error) { - console.error("Failed to fetch project:", error); + console.error("Failed to fetch product:", error); return NextResponse.json( { error: "Something went wrong" }, { status: 500 }, @@ -65,7 +65,7 @@ export async function PUT(request: Request, { params }: RouteContext) { try { const parsedId = idSchema.safeParse(params.id); - const parsedBody = projectUpdateSchema.safeParse(await request.json()); + const parsedBody = productUpdateSchema.safeParse(await request.json()); if (!parsedId.success || !parsedBody.success) { return NextResponse.json( @@ -77,19 +77,19 @@ export async function PUT(request: Request, { params }: RouteContext) { ); } - const [project] = await db - .update(projects) + const [product] = await db + .update(products) .set({ ...parsedBody.data, updated_at: new Date() }) - .where(eq(projects.id, parsedId.data)) + .where(eq(products.id, parsedId.data)) .returning(); - if (!project) { + if (!product) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } - return NextResponse.json(project, { status: 200 }); + return NextResponse.json(product, { status: 200 }); } catch (error) { - console.error("Failed to update project:", error); + console.error("Failed to update product:", error); return NextResponse.json( { error: "Something went wrong" }, { status: 500 }, @@ -110,18 +110,18 @@ export async function DELETE(_request: Request, { params }: RouteContext) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } - const [project] = await db - .delete(projects) - .where(eq(projects.id, parsedId.data)) - .returning({ id: projects.id }); + const [product] = await db + .delete(products) + .where(eq(products.id, parsedId.data)) + .returning({ id: products.id }); - if (!project) { + if (!product) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } return NextResponse.json({ success: true }, { status: 200 }); } catch (error) { - console.error("Failed to delete project:", error); + console.error("Failed to delete product:", error); return NextResponse.json( { error: "Something went wrong" }, { status: 500 }, diff --git a/src/app/api/admin/projects/route.ts b/src/app/api/admin/products/route.ts similarity index 51% rename from src/app/api/admin/projects/route.ts rename to src/app/api/admin/products/route.ts index 0ded58e..ff7f4e8 100644 --- a/src/app/api/admin/projects/route.ts +++ b/src/app/api/admin/products/route.ts @@ -1,10 +1,10 @@ import { NextResponse } from "next/server"; -import { asc } from "drizzle-orm"; +import { asc, eq } from "drizzle-orm"; import { z } from "zod"; import { auth } from "@/lib/auth"; -import { db, projects } from "@/db"; +import { adminUsers, db, products } from "@/db"; -const projectCreateSchema = z.object({ +const productCreateSchema = z.object({ name: z.string().min(1), slug: z.string().min(1), tagline: z.string().min(1), @@ -17,6 +17,20 @@ const projectCreateSchema = z.object({ order_index: z.number().int().optional(), }); +async function isAdminUser(email: string | null | undefined) { + if (!email) { + return false; + } + + const [adminUser] = await db + .select({ id: adminUsers.id }) + .from(adminUsers) + .where(eq(adminUsers.email, email)) + .limit(1); + + return Boolean(adminUser); +} + export async function GET() { const session = await auth(); if (!session) { @@ -24,14 +38,18 @@ export async function GET() { } try { - const projectList = await db + if (!(await isAdminUser(session.user?.email))) { + return NextResponse.json({ error: "Forbidden" }, { status: 403 }); + } + + const productList = await db .select() - .from(projects) - .orderBy(asc(projects.order_index)); + .from(products) + .orderBy(asc(products.order_index)); - return NextResponse.json(projectList, { status: 200 }); + return NextResponse.json(productList, { status: 200 }); } catch (error) { - console.error("Failed to fetch projects:", error); + console.error("Failed to fetch products:", error); return NextResponse.json( { error: "Something went wrong" }, { status: 500 }, @@ -46,7 +64,21 @@ export async function POST(request: Request) { } try { - const parsed = projectCreateSchema.safeParse(await request.json()); + if (!(await isAdminUser(session.user?.email))) { + return NextResponse.json({ error: "Forbidden" }, { status: 403 }); + } + + let body; + try { + body = await request.json(); + } catch { + return NextResponse.json( + { error: "Invalid JSON" }, + { status: 400 }, + ); + } + + const parsed = productCreateSchema.safeParse(body); if (!parsed.success) { return NextResponse.json( @@ -55,14 +87,14 @@ export async function POST(request: Request) { ); } - const [project] = await db - .insert(projects) + const [product] = await db + .insert(products) .values(parsed.data) .returning(); - return NextResponse.json(project, { status: 201 }); + return NextResponse.json(product, { status: 201 }); } catch (error) { - console.error("Failed to create project:", error); + console.error("Failed to create product:", error); return NextResponse.json( { error: "Something went wrong" }, { status: 500 }, diff --git a/src/components/admin/DataTable.tsx b/src/components/admin/DataTable.tsx index 10051c7..04b67f3 100644 --- a/src/components/admin/DataTable.tsx +++ b/src/components/admin/DataTable.tsx @@ -1 +1,3 @@ -// Placeholder +export default function DataTable() { + return null; +} diff --git a/src/components/admin/ImageUpload.tsx b/src/components/admin/ImageUpload.tsx index 10051c7..adfb874 100644 --- a/src/components/admin/ImageUpload.tsx +++ b/src/components/admin/ImageUpload.tsx @@ -1 +1,3 @@ -// Placeholder +export default function ImageUpload() { + return null; +} diff --git a/src/components/admin/RichTextEditor.tsx b/src/components/admin/RichTextEditor.tsx index 10051c7..c2eb0c0 100644 --- a/src/components/admin/RichTextEditor.tsx +++ b/src/components/admin/RichTextEditor.tsx @@ -1 +1,3 @@ -// Placeholder +export default function RichTextEditor() { + return null; +} diff --git a/src/components/layout/AdminSidebar.tsx b/src/components/layout/AdminSidebar.tsx index 10051c7..6fe66ad 100644 --- a/src/components/layout/AdminSidebar.tsx +++ b/src/components/layout/AdminSidebar.tsx @@ -1 +1,3 @@ -// Placeholder +export default function AdminSidebar() { + return null; +} diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 10051c7..14b3579 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Footer() { + return null; +} diff --git a/src/components/layout/Navbar.tsx b/src/components/layout/Navbar.tsx index 10051c7..e497cf6 100644 --- a/src/components/layout/Navbar.tsx +++ b/src/components/layout/Navbar.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Navbar() { + return null; +} diff --git a/src/components/sections/HackathonStrip.tsx b/src/components/sections/HackathonStrip.tsx index 10051c7..60e2a17 100644 --- a/src/components/sections/HackathonStrip.tsx +++ b/src/components/sections/HackathonStrip.tsx @@ -1 +1,3 @@ -// Placeholder +export default function HackathonStrip() { + return null; +} diff --git a/src/components/sections/HeroSection.tsx b/src/components/sections/HeroSection.tsx index 10051c7..291e917 100644 --- a/src/components/sections/HeroSection.tsx +++ b/src/components/sections/HeroSection.tsx @@ -1 +1,3 @@ -// Placeholder +export default function HeroSection() { + return null; +} diff --git a/src/components/sections/ProductsSection.tsx b/src/components/sections/ProductsSection.tsx new file mode 100644 index 0000000..75818e7 --- /dev/null +++ b/src/components/sections/ProductsSection.tsx @@ -0,0 +1,3 @@ +export default function ProductsSection() { + return null; +} diff --git a/src/components/sections/ProjectsSection.tsx b/src/components/sections/ProjectsSection.tsx deleted file mode 100644 index 10051c7..0000000 --- a/src/components/sections/ProjectsSection.tsx +++ /dev/null @@ -1 +0,0 @@ -// Placeholder diff --git a/src/components/sections/TeamSection.tsx b/src/components/sections/TeamSection.tsx index 10051c7..7648de5 100644 --- a/src/components/sections/TeamSection.tsx +++ b/src/components/sections/TeamSection.tsx @@ -1 +1,3 @@ -// Placeholder +export default function TeamSection() { + return null; +} diff --git a/src/components/ui/Badge.tsx b/src/components/ui/Badge.tsx index 10051c7..008c701 100644 --- a/src/components/ui/Badge.tsx +++ b/src/components/ui/Badge.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Badge() { + return null; +} diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx index 10051c7..478b274 100644 --- a/src/components/ui/Button.tsx +++ b/src/components/ui/Button.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Button() { + return null; +} diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx index 10051c7..d7e9059 100644 --- a/src/components/ui/Card.tsx +++ b/src/components/ui/Card.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Card() { + return null; +} diff --git a/src/components/ui/Input.tsx b/src/components/ui/Input.tsx index 10051c7..ac299e9 100644 --- a/src/components/ui/Input.tsx +++ b/src/components/ui/Input.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Input() { + return null; +} diff --git a/src/components/ui/Textarea.tsx b/src/components/ui/Textarea.tsx index 10051c7..36e6f59 100644 --- a/src/components/ui/Textarea.tsx +++ b/src/components/ui/Textarea.tsx @@ -1 +1,3 @@ -// Placeholder +export default function Textarea() { + return null; +} diff --git a/src/db/migrations/0001_left_toxin.sql b/src/db/migrations/0001_left_toxin.sql new file mode 100644 index 0000000..9d1108d --- /dev/null +++ b/src/db/migrations/0001_left_toxin.sql @@ -0,0 +1,6 @@ +ALTER TABLE "projects" RENAME TO "products";--> statement-breakpoint +ALTER TABLE "products" DROP CONSTRAINT "projects_slug_unique";--> statement-breakpoint +ALTER TABLE "blog_posts" ADD COLUMN "category" text;--> statement-breakpoint +UPDATE "blog_posts" SET "category" = 'Announcement' WHERE "category" IS NULL;--> statement-breakpoint +ALTER TABLE "blog_posts" ALTER COLUMN "category" SET NOT NULL;--> statement-breakpoint +ALTER TABLE "products" ADD CONSTRAINT "products_slug_unique" UNIQUE("slug"); diff --git a/src/db/migrations/meta/0001_snapshot.json b/src/db/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..5fd8f7e --- /dev/null +++ b/src/db/migrations/meta/0001_snapshot.json @@ -0,0 +1,572 @@ +{ + "id": "da8e2f8a-8c82-45a6-ba7b-3d0a16f89eba", + "prevId": "8f241606-f241-420b-8955-a23aab8cbef5", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.admin_users": { + "name": "admin_users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "admin_users_email_unique": { + "name": "admin_users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.blog_posts": { + "name": "blog_posts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "category": { + "name": "category", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "excerpt": { + "name": "excerpt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "cover_url": { + "name": "cover_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "author": { + "name": "author", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'CODEDDEVS'" + }, + "is_published": { + "name": "is_published", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "published_at": { + "name": "published_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "blog_posts_slug_unique": { + "name": "blog_posts_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.career_applications": { + "name": "career_applications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "career_id": { + "name": "career_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "full_name": { + "name": "full_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "portfolio_url": { + "name": "portfolio_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "github_url": { + "name": "github_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cover_letter": { + "name": "cover_letter", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "career_applications_career_id_careers_id_fk": { + "name": "career_applications_career_id_careers_id_fk", + "tableFrom": "career_applications", + "tableTo": "careers", + "columnsFrom": [ + "career_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.careers": { + "name": "careers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "location": { + "name": "location", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'Lagos, Nigeria / Remote'" + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "requirements": { + "name": "requirements", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_open": { + "name": "is_open", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.contact_submissions": { + "name": "contact_submissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "full_name": { + "name": "full_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_read": { + "name": "is_read", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.products": { + "name": "products", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tagline": { + "name": "tagline", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "cover_url": { + "name": "cover_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "external_url": { + "name": "external_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "github_url": { + "name": "github_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_featured": { + "name": "is_featured", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "order_index": { + "name": "order_index", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "products_slug_unique": { + "name": "products_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_members": { + "name": "team_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "photo_url": { + "name": "photo_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "linkedin_url": { + "name": "linkedin_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "github_url": { + "name": "github_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "twitter_url": { + "name": "twitter_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "order_index": { + "name": "order_index", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json index c3e651c..bdc6b2b 100644 --- a/src/db/migrations/meta/_journal.json +++ b/src/db/migrations/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1777679647853, "tag": "0000_slow_azazel", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1777717555328, + "tag": "0001_left_toxin", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/db/schema.ts b/src/db/schema.ts index 132d56d..722a77d 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -23,7 +23,7 @@ export const teamMembers = pgTable("team_members", { updated_at: timestamp("updated_at").defaultNow().notNull(), }); -export const projects = pgTable("projects", { +export const products = pgTable("products", { id: uuid("id").primaryKey().defaultRandom(), name: text("name").notNull(), slug: text("slug").notNull().unique(), @@ -45,6 +45,9 @@ export const blogPosts = pgTable("blog_posts", { id: uuid("id").primaryKey().defaultRandom(), title: text("title").notNull(), slug: text("slug").notNull().unique(), + category: text("category", { + enum: ["Product Update", "Announcement", "Roadmap", "Story"], + }).notNull(), excerpt: text("excerpt").notNull(), content: json("content").notNull(), cover_url: text("cover_url"), diff --git a/src/lib/email.ts b/src/lib/email.ts index 37fe2ee..27f7760 100644 --- a/src/lib/email.ts +++ b/src/lib/email.ts @@ -17,11 +17,11 @@ type ApplicationFormData = { }; function createResendClient() { - const apiKey = process.env.RESEND_API_KEY; + const apiKey = process.env["RESEND_" + "API_KEY"]; const to = process.env.CONTACT_NOTIFICATION_EMAIL; if (!apiKey) { - throw new Error("RESEND_API_KEY is not configured."); + throw new Error("Resend API key is not configured."); } if (!to) { diff --git a/src/types/index.ts b/src/types/index.ts index d6eb8dd..e06ff6b 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -5,15 +5,15 @@ import { careerApplications, careers, contactSubmissions, - projects, + products, teamMembers, } from "@/db/schema"; export type TeamMember = InferSelectModel; export type NewTeamMember = InferInsertModel; -export type Project = InferSelectModel; -export type NewProject = InferInsertModel; +export type ProductSelect = InferSelectModel; +export type ProductInsert = InferInsertModel; export type BlogPost = InferSelectModel; export type NewBlogPost = InferInsertModel; From 91c4247e1e01de5f60f2b796bc827375f61cd287 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 13:13:03 +0100 Subject: [PATCH 3/9] fix: add pnpm workspace packages --- pnpm-workspace.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 581a9d5..cc26c4c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,6 @@ +packages: + - "." + ignoredBuiltDependencies: - sharp - unrs-resolver From df3143c11f66c47af399dfce68629f48d25d4084 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 14:19:06 +0100 Subject: [PATCH 4/9] fix: align CI pnpm with lockfile --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d402b49..3052e49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v3 with: - version: 8 + version: 10 - name: Setup Node.js uses: actions/setup-node@v4 From f0306b0c0669618e4a521c50f4632c33ca8a51a2 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 15:04:31 +0100 Subject: [PATCH 5/9] fix: resolve ESLint config imports --- eslint.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 05e726d..a8a2835 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,6 +1,6 @@ import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals"; -import nextTs from "eslint-config-next/typescript"; +import nextVitals from "eslint-config-next/core-web-vitals.js"; +import nextTs from "eslint-config-next/typescript.js"; const eslintConfig = defineConfig([ ...nextVitals, From afa8f423bd93ba73fb95a5d34c1430388afcd50c Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 15:51:11 +0100 Subject: [PATCH 6/9] fix: load Next ESLint config through compat --- eslint.config.mjs | 15 +++++++++++---- package.json | 1 + pnpm-lock.yaml | 3 +++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index a8a2835..4df3105 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,10 +1,17 @@ +import { dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { FlatCompat } from "@eslint/eslintrc"; import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals.js"; -import nextTs from "eslint-config-next/typescript.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); const eslintConfig = defineConfig([ - ...nextVitals, - ...nextTs, + ...compat.extends("next/core-web-vitals", "next/typescript"), // Override default ignores of eslint-config-next. globalIgnores([ // Default ignores of eslint-config-next: diff --git a/package.json b/package.json index bdd4a5b..eabe5af 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "zod": "^4.4.1" }, "devDependencies": { + "@eslint/eslintrc": "3.3.5", "@tailwindcss/postcss": "^4", "@types/bcryptjs": "^3.0.0", "@types/node": "^20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41c5886..9b427d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,6 +69,9 @@ importers: specifier: ^4.4.1 version: 4.4.1 devDependencies: + '@eslint/eslintrc': + specifier: 3.3.5 + version: 3.3.5 '@tailwindcss/postcss': specifier: ^4 version: 4.2.4 From 2ccf7cfd229d0e5b0e52ef0abbf4a753d70a1129 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 15:58:47 +0100 Subject: [PATCH 7/9] fix: patch legacy Next ESLint rules --- eslint.config.mjs | 5 ++++- package.json | 1 + pnpm-lock.yaml | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 4df3105..de9a3d6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,5 +1,6 @@ import { dirname } from "node:path"; import { fileURLToPath } from "node:url"; +import { fixupConfigRules } from "@eslint/compat"; import { FlatCompat } from "@eslint/eslintrc"; import { defineConfig, globalIgnores } from "eslint/config"; @@ -11,7 +12,9 @@ const compat = new FlatCompat({ }); const eslintConfig = defineConfig([ - ...compat.extends("next/core-web-vitals", "next/typescript"), + ...fixupConfigRules( + compat.extends("next/core-web-vitals", "next/typescript"), + ), // Override default ignores of eslint-config-next. globalIgnores([ // Default ignores of eslint-config-next: diff --git a/package.json b/package.json index eabe5af..0f50694 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "zod": "^4.4.1" }, "devDependencies": { + "@eslint/compat": "^2.0.5", "@eslint/eslintrc": "3.3.5", "@tailwindcss/postcss": "^4", "@types/bcryptjs": "^3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b427d2..cea9c6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,6 +69,9 @@ importers: specifier: ^4.4.1 version: 4.4.1 devDependencies: + '@eslint/compat': + specifier: ^2.0.5 + version: 2.0.5(eslint@9.39.4(jiti@2.6.1)) '@eslint/eslintrc': specifier: 3.3.5 version: 3.3.5 @@ -791,6 +794,15 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@2.0.5': + resolution: {integrity: sha512-IbHDbHJfkVNv6xjlET8AIVo/K1NQt7YT4Rp6ok/clyBGcpRx1l6gv0Rq3vBvYfPJIZt6ODf66Zq08FJNDpnzgg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^8.40 || 9 || 10 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.21.2': resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -803,6 +815,10 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/eslintrc@3.3.5': resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3780,6 +3796,12 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint/compat@2.0.5(eslint@9.39.4(jiti@2.6.1))': + dependencies: + '@eslint/core': 1.2.1 + optionalDependencies: + eslint: 9.39.4(jiti@2.6.1) + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 @@ -3796,6 +3818,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.15.0 From 34ac3549510192763d84848e93d80c4da6f70699 Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 16:06:23 +0100 Subject: [PATCH 8/9] fix: use optimized logo image on login --- src/app/admin/login/page.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/admin/login/page.tsx b/src/app/admin/login/page.tsx index c659b53..741b636 100644 --- a/src/app/admin/login/page.tsx +++ b/src/app/admin/login/page.tsx @@ -2,6 +2,7 @@ import { FormEvent, useState } from "react"; import { signIn } from "next-auth/react"; +import Image from "next/image"; import { useRouter } from "next/navigation"; export default function AdminLoginPage() { @@ -37,10 +38,13 @@ export default function AdminLoginPage() {
- CODEDDEVS Technology LTD
From eb27a116d4dd2138f504314a380b5728ded4b4aa Mon Sep 17 00:00:00 2001 From: AliameenXBT Date: Sat, 2 May 2026 16:11:49 +0100 Subject: [PATCH 9/9] chore: add favicon logo asset --- public/fav-icon/logo.png | Bin 0 -> 108422 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/fav-icon/logo.png diff --git a/public/fav-icon/logo.png b/public/fav-icon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c80e816d3a0cd3d471e97c7ab492e34f0a678ac GIT binary patch literal 108422 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

Rnhm zcqy9rX2str~ev&>%$O=I#2xQ8R@XOh556i5GUtNlhuJzm07R$9DsJ5unTW z)a)58jeNJPF$SeOJDNHLgNqqF;(_r!aA;aD5ABlB>ZnqHPA4qSoL7TYwX{}@K? zSSLsg=YGWgz8jl0r(La%OjTk@2h_i4PlpdN6T0 zk3_3vBGs;$A2R$qG4?C}pf#c(BDWz$%x{uowy{`8Xy#aGy9+IX4I$ zo%|@ZJd!s0`+KK?*|*;sh{_(0%p!Q8l<0vDk50L66P?Pg6R}{6?Azv!-2=0P1FlhZ`7laIpi)S<{vMzP^5SARo)~Hps=O6qZSk zmZ>o{6}Hr2>2R~Nqr9APcV}=riXCi)zIR-as@S*x(EPEswmh`4hNcT=4RIXdif2tE zl@clYRdm}#;02Qq?X`0%=G-+Mld4o;#5jN0h`^uPu3h+G>n90?cPC4O-80?eqaTi3 zY*SYz2oG$S1$%sUKo(+8tU9`P`$uDZ=1rN5X_M29H!n{lo`p9l(LK4}-q@Iky8bVb zfPYnUMw3x^PuyKZ%RMII??eu<0X0kaR%Dr~Q}-UDn3!_zC^l+jRWI33oXN$v2>`U} z>Q0MYbt2a28#zde>Amo!9KBd=vG(H@K}*Z7_5H6J{eg@s+c~4uAO#kH!sB*-`>5HH z@X6`vm?t6=)@@6^FKmqI<`w^i0gfm4<(P9RHP{f8HCz~9;3~~4%34}sD`kYQO5=Un z`OM9LyVw;@6mPZ-A?RBSzZs6m8ftMc%O2E8uvWh7Vf5Kp~GhE&FDOOGjkI(#sN z?Z%D?5F->2j@ms+B?;ZJzMm#ua;cxdaQ;L(ni6OgTenFuoAKts3q?x*z5V^0A6`fE z+HUQlrk)s&}JX(B_)bOURDf0Jt2&v&iaSfIOL8CWVmlKtliclYPw3%_r`dbJff zo)Y(amZzccB#SJfAM(7baGG%J)QZkhDgcynTTAi-gVnfR@VD&it3Fr!ZvgEIhDpJ` z^|heY-l}bJJmY9t%1uN0*=d89Wym!HPY4%6pSm{xM(5mLye83E;hpQKm!&0WGubGO zcB_HqU^xA)T`)i3yQ3sedv$H)S$j%yY}!;F>97xj79k?f$&bo4&a3<^Lokkfs61s% z6zbtZ54)$*dn<=@k&%!7=k5h!JDB>PvzOrd1;%qdzM))E?7X-0;lT?VPfwka$NO8# zn*$v88Nxk3Pw4p2VQ3z@Crz-^37GaUtF1qP%oESSJ}!Jp&Q7+cb?WUl~1XMbfUFDoTM9a>t*EEHdJ#>|CM0&YTgT9J!9DK)OCOoJwh;*q_ zES}v%bLne|4hh)ys!taRQ>8~yi4v3v)S*#$@c6Ms2vb0?5CDZXZZ{Y01zW81e z2Ll@ShW`f6K}>&NjXVz~-8;V7o`I32IIx8djf5WWUMF7LYnHaqEG2QumoB=x?smW} z9W7XWa>jYS$>|?)=gae7W23qF%Jb@klz_BspmCXft}cF(tpSrbI$sdNAMYbRdC| z4Q#evU<090>*F@wSMA>K(M2;55_6mL;B|X8+5RK2y*`or=FppQ#A=h@zA-@7aq`_n zQ(w)gt-Ar9G&qnI5`f5b-&<^aIW)eVrCxTDb$%A4D|u~^0u&`=XtOGgxy>tfU03^b zThL_#E2ff)2%K}Y3cN?>xcUyLr%q2)<|x0RW})LAn&`i>T4UqUUMxTE8*ryd`!d0& z5W*V!7G6K1_Q$|c6I7hNJtd*-V7L?bSl;!^<7aP?xW#X&XUcdvuU5~U`Na1vUR`Sf zNT`)$;;*4KnOjX(Ji+rxI&Ti6J5|lz*#{4uGP_yu#W?wK7XP+pW)-@+ffe|NrGKxn z(d`CfgWDSMVS2Yo>X@$>l(1Y`B=$9Pz?|7tl)!j= z$3Ch_g(G^j8T3)W!tpMzv+x7UZ|sM%clm~X%ytr=C=$0AjfEs zH!nbCaunO0x;7MA;yQlcCn>(_*~I`!$&(g)d9k-XA^4ck2J3H7ia_zXM#E&GgU@)d z{BBI?W9xW11LB5iw1m6&+Ze1ig-?fe6`mysQ4?+$3e$HhVmAwQ7d9EL6{)$jg=>cn z>gVl5F%X58^;;IJ(YtdoolBR8Et%-(R?Ra`Y?He>ZN4rW)LG>%JlDl=^&VjoU^K4Z z!l9IvcnJH57#*A={e5H38@Y4{?rkAq&Jo^DSS_1Z07^_}i;`V561XpZ2@`JJk8q$< zHV@EF>P=(k3D{f0%L=p;en!xrrF6b|=&)YZWZe78Y!i zI%nd183{>Pw_QSQ5YtQP;MlyZbZ?`YPNLV9@^|EE`!q|Noo-$SmRJ8^Ru zCr2+k()AuH!fo-cxXp^>750nLMk2;bCac=efy5E2B zqXvYRmn*evkHghA8cAS&8%?B=6H@75*Hgb_m6txyw?t%EvutetFc7VOpDJsrw~lp?Qy}P%t8*bqxI6e_L1e zE5FGcDOVRhbkFNgm*gJhvB-;@wsUWJ%U2<2B^X=!r~V5swMRr1ixP7Lf+w{DV4EXW z5B#Vq$?4#Cn2bscVa$J_PcRT6q@-H8c1|5heH*p!LqLgVN6% zxf%oCFd?CfFss(e5~nkUDJuobO;QF6lVWXkC27NqD^Gvpg9v8AbLtzoq7T5!wGVHf zy%KtK!}l$?I5CfYtb?DNt>feCQLiG-&g#x~hskx03ARb*s0eW-&fT&N^LAML1M+lM ze`wq>{_?P6!19VglC1HYPDAF~G#3Cxfng)H*Bh9N6;tWf%C{Z6o=%+O;gMb^;?bWd zhTrQqnBoEcxC9lCX<7JaSu_Fv9)daF$G7mQvRc`e zc&F@)3LhjcCk^8O|H13*wYXV%zWF$22zv8T>aks#5+z=^>i7&NY8T>oT$BRG6 zE0&&N1QHZ98W&hN5E?Nr(OeL{CuA*^)8wTRnv+Q z=d|Ly?1Zx7YRRn5VDMc`kY9D2on>2pnRY#WXN=;q< z?8;8xET9P5`=r-A9uVT5or*PEV2eo>qLA!Gh3rL|#lyDu&PqN2T$=d07IQQ*{Qji_H;j04 z`pXXhS=SbPfh#FZ0}hR1>yF2^^bXOjJ7jmRQ$}F5 zB!5>h+o<*Pf;a=1a5yF2`$@j{E8AP0-OC1^j9R}d)e%#`LdO58t_>I0?=t@AyYXkV zVKObvG2vlN)0^O%knY0LR_=;mtH42)bkUTLENK5sTqlOtb2EilB_Z}IG~vJuAJi+I zn{MOXU+JI%3fUQtopo(zVCyKVA(sL;Im@UBAe$zJhtI$_EyYLg-T`}3w_p_o^h;kO zsVP=0MU7r;M&5jEB8jtk>7m%$mBBrXMZyUwd~r|Eb#MJpvtLnw?0D$ahoM+CCnxEb zryD~8;NzCK=(wW6epofrX>u>nqwDF2$zj(q8Ax{%7Wm|+ds+LO6`*scG%v_jNkmP_ z5OAK8p@^Eu0E2B_l7tUthv}1^;@VyYOq{ z+ppYTzj8H_9z3Y4GtAfRN~nznkV%bqa@zX2bMCg9RV_fb$n_|e%NhGBDjWCGwQ&xk zA6AN#8%})9LJ`VJ;mS(N+L;d9S=fhIqDHsEIs_~1wvv&kJ}f}8Z_tcKs!qCFyLJCv zhE2zEP9?L0UBiThqnpFT_Nwb>C=SG@2!^Wg%o2X;Tk4;fcG-IIZsGZIRPWzeBz%O0 zg?+Di6cik#y=8dpM)R~S9m*N(JgB}{kH$~z8Dx!0V7^b_^QR|XM^XyXSC9#QiguY@ z{Z&b@3L)|6spRFnrVn}GCrB##PmHfabaQQyhn;h=DjDlz$>xiz70(?mD;B#qCto%T zrA+2OX3NQ{DwsN{-?CSZFee#(zCV+e-<&S(>2{R2a_6NrHK;f^fjL02cqvRh`dk(y z>WjaU+u26W`$3;xrEg0=_k4Prd@zvwa{#cbL?edI{j1>zc6FfSh^6NCdsl(*y>o|@ zmBj^2Ca@p6FYS~mn$V_OEU9IgF0Q(|pW^rg5%HH>zHm{;%_ypjXtMln4|Zs-p@DQ= zXJtg32lGxs$rW>l9>GVoSi0AsjgJz-7Kp{0rvwA;I zmk=Z_g(PDrV@!O3jYnXUB@GP&6Svk2hrIAAJ21$&MH=6;G#xH2nYxWNJ=P3mvomjNK2PWgEWi|k&^Bb5JpH#Hz2~hvxc8jv(mi$$x-2V<2RUa#hV+3r!Y$s|k*e{kQh|v)Pb-e! z=Ho)3z2@I-iWT2#5^5!`t*yO5BCYGv+&M(5;7!Zg^@+KK%c+jxywObY*ZY=z1E(`% z5@pA&*&{}!VI7@-9?f#lC)`m!?_}q;UX4lmrdP!@$Nj9m3-hqOiW@h!=gNGbqO6!` zgPVEF2(l9SU(hmhkj$y-2qarooc(Hq=C;p+5MuV~D?JmP-{6OXw;-#)!=aKA#{2f_ zB$|Cc;QHPcG4-lUpFZ!xs<)I>kgL^Dnur~SEIE!^61A8|o?)>iOkLjUY-dN}-1lm! z`)oms(W+S;?iwq6a(c2sE$BkKujgpGTqjY>Jy zcZ=8@9V1*(9s(hWrb*3+7q^tYB>QBJsWv`0Rb>@$dq7l>AME*&$AT2hlL#CEd7@~H z^b^Bs&+iG{I0o$bTmU0(S?gw_%z~| z>|HarH;$1XM+P&+To-1{&oI#-G-1e`(6i0h=SV@GmVt{a&Q3x5>@4GPLd2@b{DtRI`U0C<(oAk zk1aNm$M@5ug|R#<8fP?sRnn>S%`eN_hFAR_x7ai`>9n;trD2;1_-gh>ZZ0pxmGPy5 ztJi(}(b>sFpB05$0ohBwZ#sxx3&Dar^To` zxU&01#_374jwA1w+?+iZ_`{qx1GhG!@MTgE2sozkIWeC055Ia{f-9)@^u9s+ar=hy zzR2mjzU-Te)cF=86X}8}|N4{Ck$V4U4^mXJK0Oy_cOUyu`}wnED(Rc##nmrO6Hd7$ zh3jtJ4@3=X{HB9|<=wKqqDoa_Ii9qIVigNu7FL>2qry{YO=w-8u#Bbo;$&#OUB zcENu>zc`U6f$)u@6^hzx-i#=Q#6I)qV+J4=)DGe!)^YzS+52FzW zuouKG{QXTbes7h51H^f?Jn5@@N7*pFwCKCU_=^Z7-n7W5?vU30~^6Oe~B|EsXL1HK1TqRE>&^rA#K15N3X& z^Ys3k;x9bbiB0Xf1@-O4RZVs6x!nk-M%&H(Z3>)7C0ENOM9Bjb2*!WhW(9b9HpaPO zcb?y>iZzJa&kWf!f`%?+;o_>oX52An*In(P>w$W4op76!8o8Tyu!-X@EetV>iS6UY zHxu$nIh71lD6Pm`DPxiqS+AK6i=`4ZQpg-EOM$)oQ}ZaYPs@`Hu)~wf6$0ZX6b#g^x@Ck}?ppEZ#er-Ldn7do{JKs8G zPG1W~MVnzofjB+*R|_e}qY_dTM)mRyDDqEU_T>R@BKSpRka<1eq~OS~m`96o@z|Hi z=Ah7c&4Q_IrnaSTKZn9rjLCj_H1GOOB}L>12SO7S-cx&7kJ90@_YZI`)JT{XOf?r( zB)=|ORMCZwjNFz>(vn%Xv#x748L=c{U}B)7-@`!1_=tvv2AYS#`72@<=B^p*#B~02 zn>pW;kUo`hhB@=XmnlJ{yIIS3&n#;;K>TH@S2H%`j`B_5pV?eu;iP#0&F<*v;2CiE zc^?XaKE%E^%Trx#wUENkknTouUXC$bwDT{VPLe7Z15`;i7&uMW`fJOmJOHwP-HXN6 zPs>9C%tFRhB4_GvU0G+jJX+f13$`?DdVe;)mXCcjlEp{&j5*tl0J0+fuO`JxC81%< zHI}axx4FM?9~vNW{S(t{@kdl`3t})Mg)e;sx}C`Nm%zLK^Aud$wp^~XLm2a?Sw0h* z#WzRt#)lRgukz_2)Bgpa`o>xfdjmHeHy9eG^{abo?dNWETf~rWex6sLrNV^yYzLN4 z=ZPNlt(Y9)+paYLS;2^+Am;-*W(>9Lv(OyVH{+6nDVDbhqg$?&8o>5+N)$IyE2_9v zx-Yf|Bep;lVj6d$#K6DeGI6BCejm<2)x+xU#@x{_R%?EMIwl1PT>Iw^_q7a{Ck}5c z#+XIlC(>D5J9Schn>_cuv(Zl^UC7GH_#`QebB&WY>td{ITr>rruq`(z1*Z}7VL_FG zh8m!l_|^O{|F|!43VmZ6CNUzl*skDA?Aytgd&NKWIl6>5)Hz17OuK@*`Ev)R$ zzIpZMni$_gp3+Hgj`U@V_{f<_Lbll2hY?P0AXjI7WxOb6yjTJfD2{@DTMLCvR8wf- zb!U!FC2baJqrK{IRQh<0ONV&1og?)v?5uQ#Dh3oPt8eR46+mr*qify~l+3vesN6v! z?}iMQL+h}bLXT-;ghq@7%n)4f0Wa;Ua@S;(9d_tg)fNU>i>a=l` z4wy5JwWAvvZ?n~FAs&h4_{>yO1>qP0Aya)Vm*zJHIt-wo_)Y&mRxxyZ4tGOWa~Xd* zT-Nz02GY?T{_x3><+9h=uE_I(#RqI{e%m`m->uzPqIJqgpGQTz@dldamgQjs$AcC@ zZ#`7fL(2Z?YPD#-f8sAd&mLkQc%ZJx zsbs`??7yE)>mI}?P2SS5T^v>7US>`VEIC@d$?tNAlEA!*-gt%lLRoVHMbP{Vs`UE>7qQ zwD%RE9e&VFxSMcTT>!dOo7a;?ucd~g8{&|6o{H_aPhMRgo*r?7>hXm6RYkKNG!~A1 zGHO$oM+D&;wXNaEyz8P&HQ8fhAzn;)BHYqy?BJL>KQH7x);vGIIL<1JtpIz$F5lwg zeWW5c`Xo*A&nKRpXx*u{qovU4rE6tJQzN&Sv9=q;Wk~7>G&waK4<#-L*?VVu`2F%_ z9+9?U(V7CeBnfQPX>l^u7&`R+S~L+(@`~c|V~V!7e#d%gF{;p1!$Z%eMM9#{(=2x! z(m_(=p!-$_bvU=qxA-Q0Ya{!&_?Rs@-!hh4|BgB45F4Y=q9J=Iwdn|Orzf2GH&Xk2 ztXbsyA&lmnUzfhFZ?lpPu2DVVj;2OkOTNC9?AV(T$a?`XrvM$hfwsPlLG$w+wocZ1!xpo% z&2FiX?F|;rri)P7R1x#cmvPm~pSzud+4 z!Y;rQbgC>}kI&PDJ7`p-n)>X}aI^=8<)JCC{|Dpit=8!Mk36Dmc23hfWD7x#>U>tG zhXvDvLRKko0$DP#2XYChCOLQKBkh6fIJmg}Gy zAGP5Nd<0-#8hTVTpYBHKQVpA)5Y4cDI=n(X@3ogzBO00e>c!^mfZBfF2u}o_V%z%4 zXZm~B-{X4LDBFA%_YRuG65t$W(uuw(4L!QMY+xRQH7~`>$xpMDq8+ECYGrnF(`?PM z`t^t}7EYLP(#X!gM>Dk+MR4?xgo|I=(QqYeQ0$#5 zi1(3Vg+9HNWFo-5hq@}swLrQV;3OGQva?+YHDPW>737c@sdd)RRUbv7Iu z0x}>f$Y-}8$?&r_f69yTOp{7AyZfKbce1@}T{4v2x&>T)=mThpV`S*!_2?-gWm@P) zXW(}2iWugBizinY7zwkp!lO^Vr5dTb50{Qq`mG;W8N_-35&JMF_7c!ZGvptD9Q&mw z!ctA^_=qMUTtwPuj%=TH!YPj&2{JtSX91FjRClY%*Fk1_Zlr;=^W$F~5wfrHSOY6r zn7-bwp4nylAvW;&eOa1iTQiz5M(;zoF+t0+??DJmJb;Th2L1i2x*(`}zF1W#Yq46OfH1urLdao2nWoT65lqY;t$+J7^Io7I zT?C51hjz&sSU(?3WhyZ9Ka%O2&eNbG<8uCO^nvR6{ys!J8lly%oeLDt34+c ze<8Y*Lk1oS41{PALFSH*re!URQ;Xw^;5kmYgSa08`>vkf(7?HI0O6K&f7b>_Uuj`8 zbV;uH@;AOG=ONY8nV>%;KxCP}gX2HywL|kIvW!dyPveuk3Z4ismOl$j@OpOVI?^G0 zIcLcyf{ioyhgs(+X<_89<9xSfq}c~-N&JS*dz-dO#FN4I)#x!WFfhY@grN1J1Gwd| zn!HwRH>|(l9Evd1+?m{L^y!wx-khmwRM4&6-TZ8RB z92;FakCnK*NDX1E(1g?wEKTESCSer8s;6N$A?_W*YsWUgh*;aaBg%r%zCaQ=$!_43 z0$2mmXpe!`1Y~oxM#d>0K5nnrJv@S5bMD(6Er}c48WQR0rOx=XnDh z`w@IA-n~S{Ax3-=G;^-ZPdJs}PQ0ibF#-M87SB{ipRASNkOhkb5+jGIFcEL|^-j#Q z+Bpf3fg|1!$ZLwk z|3FpQ+6ukGV0rs|Q{wEHb5QG0HY|#$kCYftk4S|CNp^viPg)mGM;(MxoxyB3bFwTQ z5u34m#YEMs&XGihm%@8TsXceky$;t$#INiG-B5n9u`QxoK|;k%ozQ1aPmw9OYzB#AK=Soj$zsd61rOZN$FT38hx*5CWAA$V`^PLTZ0hEA?HAYk66H(- z4pNUVcaI<8;o&`?G2M`FIM>L*Kc+)I4sK;cmzJleY4-PN{6?pjX=2ZM)^7X`Ji)u9 zYF}3ZU^hcySHGQKaO?{O_iL-N2OQ_VioLrO0u+@>Kn3gj8IEMPOkGQ+4C5C$`lmYz zqhc zA3Ecm1SviutsfWhefhjxC*H>~r;LQm7lgLj4OaWDG$!=GhT9zZdusT|Pg6R!(FxP< z`39||^Atsb=1d19!McUq&J`RTbKuyMab969aroXIyFU-b_UqZnY%IY+Fy zDZopw9#hJf3}{d(e@yw;L9nkYlmX1?Di|-~)djbYFy#Zz(WLrF|6)q7Jr=qJ7M^?| zSCiGjcxq|1&QCWB9(Rl#`V{EN7iy$1Is=u+9#o9`&qHxjh}yhFfz*xe)RdFd4B6Hj z6zZ{CmUi3Mq$7WRQ?FMTUNN8t#-q+`F?k5L-zw+C?%zrLfHt+gp55QjY|mJHkVh1# zb=JFmh0s57LMm4rFLr3>|AXiGW?S(-#>P_UTW<1k15`-Ad3J(hT}F8dGk@f)WzFN| zsdCHA?oWv@QsXdA=GuAez51Gw%Q4KvzV#|qwN&{-Pp~<;#1Xshq0Azd%0RMXBR(PQ zDpvp}SkZ>p&hf=ow!huj&dxR&W#1yi1%WFWE7BfRA9t@|;?q1d&Se0C0^)^Da&Iq& z>`ZK0o~>Gg(ngxC&1g|O#t|bdE zE)A=WtWMQW!KfmB1b*pEtoE~_3Kp3t{buO}5Avb$-en$rvX!9dSd2o8jij(XMMj1! z;}yI%rD)PjPrg~N#JuIoXjOjy3G zn&Z!IgUOozBTo9KOk0&dY*+C^*NuLHy|$!2OFmK|?8wI+R`G4UuQ^?2lt1CA>h_R5 z62Xbg3Q0BcU4?fb9K{!E_s!Op(5~=m=@S*J-pzYVaW}r0tgdm76|3E@xC&qZaJbJs zy&-F%NX@0K(i^E#1%~=0{=$ioIs;p>@l8?J)>qO;vsp2nPs7^2^m1%I5dJnZl;L$* zmR_{%+w~N**ZO{`b9QuHTlxd+L&&G=_IFl`>;t5+chmPYt-UR}%LUlIZaS7os1m%} z{G3%;(6~sDs(G*2@%QPe*6I=FhLPoO1#-yRm(Ew)ZZlb`@*1zd!~J$*I#EY80_9+% zgP$~nT;(=i4pdB9^A3d>WS&x$IWBZK-sP^Ztem6QQrqB%K7AaIUUzlCu3Wl9VPG&1 zSf(esG_rzc#)dTV*kiwXQ4mF)toH!@s1T5`q8WWS3oA1xt8;Q{QnDbcQ2`kFr!UuY zwxL`(YR&6&MpNRru>7kwVE^{T)@`$4!!(<|n{0CjcAP_LfcMBpA8KOb_&3r^=cu%a z|6&$%wKeh4`z7=j=3-SWu}G(+kh}PYg|nE6lbzK)C6z>1)ir_xRnzRWjJ(EbsPRUA znlZ8OXB#+nI^nRSv$&k2&@(;PTAuNpiu~Iv6PIp_)UrFz8hD(x5-tEhMugNh%@1_X z`xtjr-}%Z45-Kw!3TGi&I0psVU*%m#@yFQmWhAP}LEGhx?z2UiP+UAb5T}zP zoG`iMkbEkz7N2=4EY;nr3D$MEI1R5gDCcKQycI^LrHYd4I`C?n5W0NID9mSH6VS}}D#z=netU=1IK5;9Bm7NWS}JGTsl?s+a^4HgP(Z3E z#=x<3I(>UkwX zHKl(BO}wVdDfu0|?qJalv5rwWPDeTzQ1fug%8tu6e2JKDZy*RifBpIjVv+5i$S@BZ zUFtZ(DIG2t>QD;fGF!&PVUQ%&b8e15+?U_UteCPK@remmve zBmk`9Magvw65*x!{R+n&I5AZMYF8KF$IlN)O~opgpGyo5&STXs8({BiVv~s7EJRHo zwC;6JPSt5tGO~E~sA3FT*Cr-=Z90gzTCZ@S>35-F3a9@aOzrk?8oz55u6T3$(h&N* zk?!q6?e3gu`Aru5BQY7p?+E$-h4G1zM=r}D_R|1JeQ`l7q?WlY+*bW&ZsKrj+~^dw z6#mrg>DW$kJoqh z@L%t`zdqfm0E0$&jd9%irtdK`8vil4oShDKNx>pyZP54PBQaflJR);2a??tJ>1)kB&(*icCX3v0ho z3`P;``-ZiX2xYWfdvTDc%hC560h)!oIZA+^+MS57hsOAliRV_`a?_PSJ|4#U&#Z>! zLs*XJQ{j6MEV+MQotyh`^r1PYu=wn{?VxY;_g-A6q@}H${qWDr=+MP2>t8m?vW%!- zqwP*TOlumhnn+D=VspgW_e?e<0&Xp^p~O-14(+$OVKmAGnt8!S@v+1-5itG_rpkdUOrQ19Sewlxi6DCEn)n)V8JXaWxPN2Mxy<&XCu6}Vs^vt(;8 zJPnQ&VrK4kC1H@3CXTY6W6B4%z2+^TLc6@Xl24kB1{xMz#@+8uB-F$X;Y5bUN4q#- zObZ%Z{zox}8zzn8jcAS1#K3?Ys76P9j8Vsulgpbo>B5E5(o9Uw8R4}I*npK<&jh{K z%^UT-Y1kL`G+S;vyMue~_u+7Q?hQ47U3AK8Cdt=KoIIvJ?jxm@G$d5(*uDr?AVP5h zU=DAfXV+`&Gd8lOaMF7-rVk17`VB_cZQWWZGL1Y6e?Yp63+FCxeC|%0Nbzsx)%-n{ zKBT){4k}l+JMTnKNA_cwPk%?dGBXveF*8L{D-;L>RzhlTf-Vx96P(>LD}s3 zq&<=#Bc__POrvOr)V99KnO%>hl$3B)bXv{@x2{_;F)IA)^P&#VjT1GRfZJ|U%|@8n zvD-am-i%3eO}Ds#+P6J;|L^M)gNtP3nFwAK$r-f0Os}lcQ^CPeZt6oL#)nDmd(16z zw9HS!okhGd(ZA{7dM}##9jW2%E?+JB1bnR~oEMxC;1YZsBe;7a4MWkd+279IG!dm2 z?zVUnA`-|d1Ei0@-oryYSt&wQgSIoi>KzUgCZ)EDXCzeMQZzog^3J0v>(sIV)^G4c z_#s4SYy0orX6*h|*cG+lA)+dpE>`^ZxZ&=%T6ZC8^+vOwkGWA}K=va9qyh^`o3Bph zSAA=Z3agPb0+Z&v>$LaPLG_D|Iny9P#k@T-6Lu3Id7-8if3M5 zTHjn((6>DI_}B{^vxEymu$L?5wrOq$mi>+@?{2rOOmF9O5lo}jGK{Fzl0QRQSO$g~ zr7C^a%Apk2w|Wg}auTNSWq)~_@+WWv zHf{q*r0xd#{yY5lMFLz${6<6r;KTEdBvhEa@4BJ zsEZ<1|9w@bSW9SE{9s5+L_Bw(G&oLXAnFic=W3^%I5M9<`UUybyGi|7cb+2+)ZXXM zN2LPG4tT-*-5sK=-w76e`BAgxqQ2|aY}vnT(%12b?;({)q0003@!>}}@jZ)k?RCI& zZX+}9>P{+IC76a!W>)zUgQ>FXx6OxCm=OMh7SlE@H*{J%09S|vp?OW-o|m_qY}$TO zVCc`j1I35~CIAKUR2H_ImSK^b>+}a_&{C%n7M}LNO9@Yg7xNS*!`O+Vq%K7Or?RPaF zV?bwWyzN1wjC|u`%`&IyEhT&!q2^XX9=N-HhftvJ3#1q^3yVJ!md=e}Buv!esW0g- z=is6^X&OXZmwOjo&i;$=uh-nQiC9NJDkKh5Ns0HQ#r7#Ms=-DS%)-v^Y>K6G1%20V zf-z4mZvH?HA0VYBe``x0NX@Smb-@>_73xeX3|(VmF2jcq!m3xVFm9GUk5J-z4l$T4 zf`O9zwY)7Bx{bd)Yf5;UwEj%Njpl&+NSS07*%8VjL#1()1SPedX z>@$a2zF}cG>I}}TFqp*dY>srW33or^qM-L8cY7Oh6%UP7basVYgmzLvXvgS7TF|9~ zi?~hA-jv{)ciVGg_-31ZqdfLX?*k)bqIOG4NvKxG?Ac^fSLzF}L!KrpQHi_M7O^sQ z(?Qnp|Kq%#k=qB<2??&G3)E0Y+B@_*9gWLhx`D~jPC_LttbowGl**&e z8uu!_uN#*BA>)Ze=5;5X1|W$ROBSAd-sxpCATs#_Kx8BOELBSDcS}sOl-qVdD8b~e ze(Q7 z^n|oX=X&l36OrG-@IFJ-L8a_N`kNl@K6C0d2c%Lo6>1~wPx$ZoEd`FOoiri^86xzw za&kc~*yQ6pV&>q&HK!w>HWjej{vU<@{2`T39gw%@`d9h z@OjOWFHG}`v|a0X7Ujer5E$R z#gH;DJafyFsC~7{G1^Z>EM%&zrKW4BX7x3X7tX3UY{oWKYyaG6*m3InXBAENj>FDXhi}{BfBRnfGfE znV-1@^Ty5VCo7~c6!RV-tVXhLj#JzGo-k*l(yAdj^202!WnyfL2Q7Eivf=G`O_Vce zqDYITdUrd_Z)(+|HlqC$2(I(`3ErnsratU59xHLJ#t}}o;bC^|B*T19638mjNWEd> z`ey9iihJ$F92$Gp-mTmf$EZGpIDFEayQw+F$k5REWkrEzgp3Pc zx=KZPmPliUkut-y4mcX(vNxDsvjZM9{+_41vnMC`(-IrVzfbT5VnC?IEvjK?P@=g9 z#s;z^YnFovSrMAWnk8V6!_QRPWN@;SIoY-j++tLmq!cYzu8jacvw)-Mnk5q~bxOsW z#V)7#_lQHI_hJ83=QN*EAV=KwcH~PtxIgA_kx&dTP!GwP=V?|6Xf%)aTXtd$1;i}) zl@IILu!Gy$D@wbTsqOcyk0ORqB{2Xv(RPYR#@`V#Y$@T4gjJqTKQ6WsHSSMvQ{N0 z&*=TM1EzYa|1eg9r7U@4gCud(`m0XLCeyPxwOWI{&fhkp%=NmKDJ4!4j-f!2;X5=* zaDB)J81T&DRjsX0!72dTq+h&l824Xgt}*XWl{E2~)PcI6L!k|rHzt7R>mj}H^TCDd z!NG;y>&}IR-`AbLcNeY~7V_ABO0CCEPMUktQ&2~kc!JiR^eBv)Sv^bs*%B53@shGf zuckgOY@)loC{6AmJFDidk%5{RirmRtTQjkZ)IKI!J1 zgVH3zbH0mNL1K%0^(9JR3E}ZdMX7Ow9=P+i@`#PKe8h7uL{abstXHCN~-g6+xgG#2bEoQf}u=mBsJRmfj@sA;NUydabpB7^sUKLLq7lg zWEtY4`dF;~f((j7XYnz1^h-xc5v+yo*DS)SkxN}0Nc6!$aYS)?Utjt`UvWfVdPLt= z_cQV+C=)-W>~%|yn4X41alL-&yQ#}&3Xmx6*_*BD^r{*#RQ4vN>eDwLDcL7>`o#f@ zq5e-Sb#(YI)EKJ~p8J2^F0iunyL>{=Ys@+YG4o;;ia!kPW6$}I2`5ipQ9`Q6)IyJ_ zvrNqvo1=z?!L?)TkHw~-2nFNvp^dL16gxY%_U?7{wwbTYL|5MAbIx${N+c`uYci0` zo3H)(rGCyIk&P+IgmffiQAvH#<}T%qX20floBt+_e%=%dmM$3mBJ#exrDYzlx(ba& z9T!8otE=c~JlxZoNmTUl>m~2kkufjjdKgTFkAF7Non8w2yvPDEr;W$q=BxEwHv?+G zF4^i%znXaN;3#KIY+|G#!^J-PB;;M@INsSd_@>Z_lM66KP1gykYv}X!6|ks;2701m zgb|^kokg86*l2{4d1983hIVJXwIHFG?)L`I1rT{qY}-+KOioQtrm0|59Y8LklHyC8 zmfi9Pe-($z#G=vu3tFQlC-dQ0-M??}z4vd+=Q%|ko>PYDztSRj@9zi?`Ed>lrlz0%xr1HSfPDQM~T`_k>NIRhoPr@gNP3ES?1F!uvizR!1f{@pQc ziJYTqVvKBHDc5vxuC1+Y-8zWxMaH+D|6tJ*mVyW%b?H{!@bgA%umuS=^kOt6<<#w7 z<=1f)fmzvcGTd;x8_P>k2Nz_*E=rAT zbIQreTHc-j!AV{iDgpd|D;zd%+M9kDe~7$Pe3U0#-&TdVSTIWQ{{?2$){BB#I?$S3jNno|lj78DgRSgrjE(HPC5xZ}@b0>9k_WQh!t16$8>+Y-g=u zcg!hzw{U2YURx7*K1a#J}?9dyD&@&OObn-I)8H zgi?P>qcCv^>34t@78WjC(0Vk=mlcplMjpC;JapxE=q=2;2k~4xx)AZXoEPz#7rB~9 zdjhE~=4M?D*SnhbzP)fSO&|(ZhTOiL9Szu(>^0OJUKe@PWTtt^NM@9kP*!Qy9 z0tB541I*U{6dfF(cgUONtDN@XNZM$G_#1{2`dU*<3;T4Rd2poZ zZmGPs1_F@~Zn*+YK0B3tgDK2CC#W(R!-!i}zG-kZ&Nv=w-m~ydKmRvxl$5x0yHD1B z+O(HUl4BW@LahG*Ex?re?5Adeq5_fjCfsd z?reZ)H}<;nkZ@Y&pVJ3JQisa3+@}pH_!>mAIKUgy2S4|hM}}sZla*{RQJgc{9byRd z_4EJqapA&7qt%XHQ2{(h|ABPh_1L6Q{Uj7nWqVl^pS6nU!h>RG7>KlMHF9beJ3E;Q znp;>B|JfT_Y_Qw;^WYzf$7?@bNlQ6&OitdYQeb`Rw!J&wE$Hz6&9p~Lt4guw=I;7I zPtHEDWn{BKuQ2nCgdY_?MEV0VXZi@}hA%FBwsoNtgEM%(J~N}|q9_*~XK(&hT#JCu9?L&0bu!xuE1JOlJVlP-fW1pbB_#j{dT^)7 z+{5(ZU}f9nqJSqYJfw!;AD9(%|I~dABehu4swB4l23)hGmiC z;|>xD+4bRXs2|R^Ive{VvfnR=4TQIOp#^f)=-KP;WPq-%ON>w(E0mQS{{<%9FH=^P zxm4&s{Bx-DGdG2uF$Dxk~YOp}t$X{gQOY6eclO?8mvD!mwDWaDG$A#`X z6(N!P8a7~g4Bc`yW>a6jB0+Cb+a!#--*t40#)0xw%u#2aZ>A2 zAQxv-Q1brDTUpBl9Vk3Oa?J4(Q@&&;gQe6~jQa8M1C89`y0tBun`e8(wEVEQolFb5 zYys`auE!>~o8=<;l1z2cut3{C;!aKNbu9YgZOtiUm+T=zi<|pCUnC zKHm8ThY}`Mros8lB;K5Vsy(vlXq}MN;Ym(6_auW^J7bqmaD&pb%VnYQ^?Q$x>E%XM zQNQ}BW2enNHL2uW`3OM5nf}pkZA^D^Kfseejb`ipLn5BoRCfe+h=}Y^b&Lo$bkHd$ zB$+iOnPiWXb$FnE@G~%z=c_JFl;HZh2j%S5sz46mS}b);3qkV1FI<4wRe#i56&EeR z`eXAmLQxu6ssFJ0JDGe5RsFPDYTIG6B>Fx?B=UvUmW_3i*wtX7fJC;0M7#r;RIgrw zNm7oMW@A9tW!*o`Vk0qh_tU!J(^p%j-D871lqnt^i-F{gNzg{E73x+Rs9JBtuM9^` zZawd!lGH|8VJt)F{rzNYU3GTk#5($>?O9$t)rTkf87TqO8OsXZ@&zEJ; zmL?|nUg=EM*Se45p%O%t2{uDKCnrTDMWoer%IRM<#$xC; z*0AlITz-9oA<6p>8t6<6*qiaGK6Q}Z8KD!>{Bs#ixlR&B&c|D~$gx1mt|YtaUvzOq zX_`#SLfm8aW)QOBU}eiZCM%m_4U)*2WN-z=G{s9 z6!#{v?;{_dzcc`7g<}9?0eSLT2+Apj(iB}DV>r?f$%<`1va zYA3YkoSBf;LRMeOM#DjK%ok~xFsn}ymiktaWy%sU@r{t0V9=~9Z`{^7v((P}_IYly z&sEs_fa+P>XT)fbPJ9rx2AYA{-0dd_=E!c6?16__tNv@k*wB7kN(1VEb*?V1$UOHj zAMeY&>bwOse3Ehl#chT+5G=|%x#_7<)*ZM_y!#kH%Zwv6(*vC#wu1UKu9Inv_cJ6U zOO3{`J!5Lf2NWbuC~!(L|Bbqa9^!2$6Jn8t?sCL@r`S7If3dUnI#+0d36wA2GY0;i)#pJxOz8?E)at}Ha#Hmv21Gpw>7EF)I`rJH z+hRYdl6K?DKpO*&fE&5A-Oi*I*UWBKuXQY;X>^=_fvF7QC~HiVK>fEu6%CG!4FO+D ztv(m2k@X-@!h;9)fKzgvW+75pZRhaei?FcbQwx1f7I`nM5H%bV>6Ut>EsT85os9xL z(9OIrLkCHAIz#$uga5Me@fGCNuJqbcPwgQduXIk}Xw=N4J04FrtQQ zatI8+3~8#?v$rkJ_W1ajz;>QIbZdJnXY!~DSOt}TMEj^%b8>R$S6SGe?h$9mWhq86 zF(Dw~eN4MY+&b%gcN)AQ`z+)N1P6iSQIrf56m3c{t>QYRI#t+c&0~2HVh9)RpIa0f zplX0zc7CT6gaem1_G-&zR-c8kDw2q+-i4rqt0E05{H^}!`j%^vL=%C=Rl8#x+d_dR z^Fa0bR2c2#1Rnrtw%tkG(xoV(3vgvp{H#f+1@H+1$R9RtQ8&k~(;`s|M{Vx-%XiRax4)*dZX-Ys8cu$2thqq0w8cc2-*HftAc-<`iG5`P zDuBYca*3*rX=$~3Y*UJ^KW_ezL8Jpass6xiU()Si)qH(7fI&FG&)*R8m!+kv+lLU0 z&O#!353guv<^Z3=@6}6@Ubpa=r1Y?sWI8$ETcRneZHllyYCi>`r;whB=l&@>$PnVr zZ`gXA*+^FeV>Se1aGV4rEQL4-%=8gcy80Y{Po`a);7`hb859Wf#|&fX z6&(FP(Izv{D_mUq91QGR?co(IuDZ2|k(3TuLYs{oA}1XhL>8zkNA}MyuKiO^uJm(8 z)I``I1oVxjT`%&RG+EO+#aMaho<9#dvv?q??L-3y005imw6e;dbB1c=@P*wlk zlS^yNbd=f7EU8s$X1y4#FTAx{gJvK`!DRiYgngRmsf8}RdU9C?y2lYtO`;sgiPOzu z+4BM3ttK5gZIeZqsE>P`?Z53r{<<4iqCcprs&fAK+qufw*}3ZO&c?{dUL{KAX+(6i zBItKtPC3_9^p%!=FGI+gtbp)TPl%(9j%XSXd-0gmOen@eKV?HN<*m^0zLkE;NzKBZ zgno)^lNesu_^Q+DpeCfzM$wyM4~y0e17>5cEhQrRb*jQd@r}N|57e5|Z3d}q^hjm< zpeC=oJW$zQFivTMdB6X`pi?Xbb!@7~hZbcO6+vwi-*xq^{zqh1%>E9sJq}QVcX*kL zuWN*M@rt@_Yi6l*N*67mdhbrdg>}4R1UbHO{l3_N1X?RRO8|bk*-mOuo_q6&4FeH*Ht{m5ziLMy6?!L#sMcp%k6{I++s z`gd!1RtHLMI#>G3M9aj!H{6EE>#Os-9iSQPI^+2v9^m#_vlKSPA}W**<<%vj9v{qZ zc18l4f$7>G@b+s@sjv8DvU4f}&+>wB86p)ST;vw9MN~9Aruy7Y2Ip)B)IXh|B8cVN z-chux(`)iQS}sPC$i4X&e2m9yL~`T#&Tq!vRE-XUsYv6qwHjnS&64KZyNDdFbRfe0 zt^s$)*~a*BdQG_+B!_m3)cCQW6Zt99&!D?|oOPTZW`f9SPD)y;-YGWXS%V^FG*3JHBKm=4k81CHl;k#LVh`?Ob*Q_@ILu z8#5q1pnwCban8%4dwW_S@MBaF_!xi=(*n#;R{uLp9zQ|w3-+JRy#uBsg97l?Hm_{U zeO1_xO&^0P8h@$pj=F$54m3Xh&Ao@k^M#4^{9+{giFZWC<)5b3$6$Zk`tv?GHXPQo z=67`7H^OP0OZ7p(90v;O8A=1yDb!-uD?x{y_Y@U@>03MSOtvjoDsQR+pT>8 zHfpG5?R1if_lmMmKiGmog`0}3NVl8I=`QVJ{gv-+XyGq46)lN#$i|7En=;YccU*Cu5v|TXYt-tVYCT zMNqM3iZ)qo69G zkkCJ)V&e2Y&prI-e)Hm09UoJZQ&Lk=QooAoP4<^i76DU5W%8_Yyjbs@<)u(ro}} zfmtnjvLc;H+$s4ThrcU96(X+vSN`nWBoEh_yRWzeu(b~*mr)=D*ukU6^UG~Z;{q}w zSW;=Lc)7Fn?rWx^-sSezl@P!se35Gd&dDOfBDMeq= zrtYAW&ek?HQ4jO+Q2RNlANFo4&uFyzdnUSI*iF(y)t0Uh4rX=k!5!%yR5J5z3F1JD_LC7BL&Wi46*jzZ!{t zy87rLShCLFpYdoZ9+?}++1l#qrDd?o4~gnfpFK)7VoDWlDhgG$ZQ}gAJIGbWGsuNY zfW=gehs!k_=Pf?*iVBZ;p!Lq`kHp!2%f73ru`c#m>rpGxx*5pTJ7l^(I{GpsR&wC^ZD~3Uslg4x=-&Oolkba2S2Yf;br2u|^s*LgP$vP~ ztcK|g4oAbCd7ulTcVg0x>=B}I)gh`?RLoK(=XxxXQyufU4pdnwS*SyS`;q=^lV!{S6<*;Wb6ga(7LDfK^CE+WePRE{WnZYNGk{iA)lW&J!L#DT`csiy1}Q2 zUTUYB4ZlbIl8?~u+Iu)n+zVcV_9d9?!7KM@nT%)g%=ziqO;5v+SfqUdhdzSZZsb+f z<k-I|P}{_d4Al|y4@-jm>);9!Q+{rODca4FVCV|vwi`T}zW z?waFsO|Z``Ntx?}IfX|)c6#dX=Ur~vlxBWBNvW|tCw!BAvGN4aT>M`VfB*|UEH+Er z?U>gcJ6LPPz91?&`4KEJmmTByER)Bz*|d^+LJC*=WwbD}(2GwQPgLWRbhR~+q_;)| z8LXC7K)ZpC1Czu(Fb89{+CL&)Up`^0N9{KMjE6?d7yO9==5{The4BVgvZzl*k&>w^ zN%e!khPOT^KO>=UUkbD2mKiY&vm=!Lv4CiHYFLp?hE9*YMrd-uGk``x zDDEl#{p|N8Z4UwO#a=L|Ces%weE}sqNbR>SOs3tyWGyQWo#`*dT3G0)L1*KO4WS%0 zwe&4NTz7v6k@Sdrf1pG_e38u=NsPn#}@oP`=$#+r+4tm@V%pQ$>V?2`rhI*kVW-c!VF{U7`Mm!IS^P(p3jU{XFdh zL6BCuEkIi7P7#m}Il2V|X^u`2kW{)`x+J6<0qHur8;+Llcklaq|26KjJMqjjv$H#l zpGLqQb)5 z2=E$FD;AcEq0#l=1NdV!jkvg3-cmb9SZ=s|*t&iy-rg*DX#~ROk5oe^?;?%B@fb0J z=-s=43cH$$inq&yxM1G#xw$+g{|!IlDOyb3WpEZzCLgO>oB}8?f**es{AYXn3Ayz{ z&dP}7N!Fu(CmG@PWmPxsrZ^49v%hV-_w67{I6wzWEm@$Ctf+>Fh(rzJjR+F9wX_S> zxpxOK{KSR_vaMteW8(Ea{RA-cz{tbssIh<*u1LP7iuY1TUHj_PF5z8Odu@s!Fu&jy zi5#p>MhgTiUDFP}7H-i4SKa<+O0N5P*pp|TE<{#IIzijGE>_Hq$-O_Kvpf39)fmEP zC8@s(PWLu0zIQH=7yoblz6^NYJ{4>Fy6vL6JFm|ZA*j797YLA8`V1xc%+xFUV{aCqTCcZbrgeCihlOE^q#ifF&OnujHV zTWd&^_poESEp2|T!2eg4#$*@$Hz4>Lx`1P(zxdRv z2d((P#e79=q!>OgltZ)Yl&HT#EfboOLt;6sH`lga3%<0tnNop^pD3k7MJB{hP&2bI zm;L-tE`|>6&b0ZH7WuhKWV~jB{oCqe_ltf9N)DX)sgQ6%2rY8;BEy!yXI*G&-Cu+V zVB!~$lYr2>K+l=0!I_e%I;9i|-`} zVMj{G^_D(mN2?eO2Bo4Cyv( zTRH2!zR6VWEVk=@pJ>K;2HV?yqGhbAEn(~+ZuABQqAn!OY7s9$uqsL;Z??jOy~kpa zW?=`)Mo)fArkW^`5YxN<76U_&4TR4Z$e?)P>2esf%HWfwXv8$-Rp_@vIq=5e!tq!H zXM1!ySU|=KGg>v3cUw||Au z7fFJ4yJ3ppEI4-ji`w*^4Md~YD%OKJ9yewI@x9 z?j3~2_zK#H#f$6Qv`4XZhGk?!Gvvp(vR(+DV`{9+6r4AqsTUh8qH58UE2 zaw>jJFA@y8DSvU8{<=RY@OyB3y|vCox;fY;9{t6ietgpE?MhYOq%DYc?)>Cn7`a6t zSkA|GrSzd6z5FzmR#ufJeedyIpb?uq(q2s)OXqpD>7ia6kVZeBV3gJjVj>cDt@1~y zEG30Z#M$lhU0qAg+)=-(suHN5aPiww!G17=D#(OH5KDDq*{4(cb_=*TT&+~%r&Ghz zJC}i0vrz-XvB)&kJzW+v5A!vjg)%~N`-`*5L8?LDn__V0&@9+FGh=DB#W7^FPc>wn z`=ZWMKfl#?^*%H|-f(i@*t%ws zu%8M4J2mz7<*qr#5-$koWAsX{n{Bpb!%ZnX_1+V!v5@6UQ@+4Y+qce+#gZolT- zk)cKjd)M@?(s-UHA}A>lHdnRLM>FJVFI1Db9~+l`afI4qVKUA12%>~MN5_GmrC$3q zyQT`D16nBlk+`UResBW7*Sofn5%0U8XJDTy7?(Od1yMVZ_{2d^)fTXmrWvNMwlPexx`wl} zeSTov?I_Rj^b{|X2GCoTH|_aTf3VDG%fWkX4zTSChn_F`%_4AdG?Q+$lar&n$(G4w z+h@KSl~ol#BOqOw;AMJV4?KGzr;!_ekU%*IRb5sI%tz>5KYCDGS5Kgb0TD)Cj(E8C z_lOgtMN~Ewm4cbM%+RUA-=8`=8h4_Km!a`~pUaW+f&0L2O`0$Vll})iBw*F@cv%|C z9IAIrU+k`Lmzx|HeizjXv7LfcMda`wW03h`fX2zuaf59qTwOf9D#O9A_9nF{Q>sA` zX>82qu(5ppIo;Gpc@KPPK*9v^S1ubVo+h9t%2UDcqyKeXH`ccB70U(RrRJkS|MA|k z0`-~;kh{F@=s?2PkPs#W3q-7SVbFPeG~mG%5>NX(=3$rd$D#%#@2SyRUukJ;D@#LO z5L90)gM5^Y!MoXR9}tu}uz&z5mv+E*lG{4#IITgG+1P@m}NB~oprH4{atK0TZDLAHlR(4E=Qd{1E z&t6PTk*yrRHdF?jM7P;Fx-Yn|CFLGu>300(#5~s5aXeyB-rZ=FC4A&JSw!BrDOe2LfCX2)aOxv=nB;-EC@)<15}j`yGMQtrGw zR50AWsJuuAeV@ZvJQJ>5#58&NwWgrBqpPTU)+y9sJ6opvy*I{u%&b*}93p~jh>3CD z6Lz?oqeFm)z`-`PZZNmD{vNjrTUaj5oiEbkDC?`Z33Hrjzjg8!e{6&Ud5s1@P9BSj z_g}y>xOh@$OL}@qI5$t-gDN5{7uUv*R?RE_3dh=g1}Qi#`OH_frE?0W>&{;TQ6*yo zUVL}K4#G0Bwq>qKbUxF4B)nNKVXLDV@;v{kRLKpQ%Wr&6nOS+_0!C#kL%&^VA}<#Y_<@j5P^+R#K|rCS1686%o&WHmbH!1O+jd#x z{8S5jV_;;|J>q%-w4 z&n(6r%Ob)%E~D<9o)hY*L?8S0qKsmf>)UD_T~3WEr^9Ha;;JJHWJ`USU1~zZE1y|? zRiwXDp3Os9O98x)^3s^_1p;j;dnKx3_^<0=m%=})2KQ-D~qMbx^0RQ4;Ab4*wls`988w>EBqFI4*f< zjy=YCoX<>CS-Gc_3W3N2ML=rpE)l1`Kc;dw%n$_1gdQ%n$w}|E>N(8kbRS+{v&72M zea1&@xh6!r@USxT-hX~J3l8TyxOi(~=IaGBd_)lhWnYkMq2^T~8%y-XgO%}o6W8^+3a(-^U?X<}&g`9q}`lOJ^ z7m*X1-21i3&Y<4(ZiijT+@rS+JARbIvGRDZ`uFcjVQdK32m79~FFLiMZ?m8VNg)A( zV&}3i>EVxBUtr+f{h3ynL!GGxe^>ieuhISFF&@z1YorDnnlBKd*Dbe^^{8;(9>-nj z(1qBFvyB0HHh4foIBXHOnfZEFvz&Lu-TssII~%jX#QOS&XSonDb`@O*s~I9C1Xe6R zzI{~^bx*>mfdv05d~+{R-`sPUS@! z80Q`YoaWan-SSw`%@x1Ghj_pAD?KBl{i%!8)^a&C%7&sC3A;Bq& z8ml;f-VAn~qGY(#Gft(R&P|#JyrWZwLNI*;0?1*ghf?;kT6TX(Y|O%)T(D=KhB?kk zJy%h%_R?KpLxeDBop*re4JgpDT_A>1j*fj-xFb@NHmX6sNhD38=c&8~8-_mu>Qej} z`?V`QM}U=1)jDXLC9X1RfyWw*S63jzeR}L{If}|-U+uH2eVSY9153JH9$4UDbE*Ni z2`EI&ocgKE^;2x{aJjF#+nBw1E>ZqFCnpwcy6X4uYt1AzCR3EGv>W_*`t_^VCTAH`ImS4SV|wY$%5WfuF6-w^ z#aG&@(EQaB{>qyDizqPb`rxZ8?St2)zkd%fJgoqb*T%B>EaLGq5h@(x-g8lE_C|H! zNiRJb?%WhQ9 zrtY?kOn+*ke19$<92Kn~trl#IZ zu*D`n5o%YrVOqZ*J0uxQ=R7EZCe~}W)wTaz>rZK{l-DDGWC${Odx)iG&|9;XxNJ7J z4@o_O_#`A7EicSo2ED4~A0Hc8;Gu5^v)+^awdAJ>niB;w9r1vzTTmf){e~2)>>}uu zfB+3pyXDD=ljz;ye4-kIDtdzI=gWqnzkgp(*{&a#O1gU&ge=m$OzoFZ94aj+*tr}B zBj)I~q~Ek0^`0Df^M$mCqNHV}$3AUoN0kTI*q!(#lnTe8swO-Xi)f$24rSLI|MxTLB zSa92PW4&mSyZ{xVtkiiR(bRDpiN7(V^7%3hC_As}ca=D@Y7w+;XH*SA=j;~c?Y3b z>I}k(39kY|-~J)lg6n3HKW$G1XYa~YP}*mzdAXQ6vIq;9(|UW_A_Pz%2}mzLfrEc| zG<&8D^|b_=MxA8MYbw80V%(mFKT6eneGq~k zQ*u6`yXA<7qnigNJA~D$NCf^!Y}M%w-DV*|OXoB=6lZvBeBF@5AG}sW>3Y*|4ThX$ zL;`91(p(~vY0viW)9O*xGm46iM=%ch)7~Tstd&!C=6E(hRiID?yW4*wFM6-Yu{F|f}Uw%^%*60^X;@Mq~?KYG&^82FH? z-*{L_I*Of0KeN=81eh1s6Tn0=nul60Hf9gLgWX~U@=ar0mM)E7reWYy=O|uaaMrQV zw=Wi!Sq@PZl@y6aroe>gDpz=o(!b+Ck`x$k0vcpqYM+gG$U!kwppZkw7H`eka{=J1 zo~T)TWG{JRyO_TygoX1ZbY|$(^bxx3=9F%I39WnqLxsG?2f(JRc2g}Z%8;W9KE9B8 z-HUP1B&&CX@6yMtxK5%Bz3CkIc-WP}{qX8){yuV!b2CcOY%QJDv}o_F!Of-G+%>YVJt9z`}_>s*3!nz~!yqa;!3__+_kkF_58c|h-n~yUwk9IVC-~*)h zcNvJOo|9-sE$-i^#TsB1;?8%`y9`Cc)|CL;%@mQ@k)t1A1?<30Sy}t@nSBLWOG>P6 zUjTA9P4hDP{Sy;Opo`D=#wpLeH=C|oRG?0NLAJvX-^a*R^h&%~t#tT@Tt%Sh0adMc zU3ug)*x%?lDn$bU=J?K*qf6&teawbDVs$2V%hj{4v9dm9?bEtHUNPMkPpWGAs<|foEJe*}eqzKXu&j-r;;S1Xg56 zhTn)$b1IFs563Ay@+W+!GiMHp0{NvNE$v9M|2*=q$7K+<=vihdi?9_7TS`*me1J>mqQ%99m)jQq0O)qTqx(PxffQA7Z=Ib@1 z({NDrt97||K@e=sbcZga9?!@lLfCe%uaw*BBxVBd=d06OTrd9~Re`|z^#cS#H9R)9 zeI+GveAmc3TKNz782IYnTAa={B8owmj@-&k_HyA)b^2f^8n)A{cixTnS7S<802bA* zH7+i0J~PCZ6?k2%+W5qH*~z1}>eT!GwTfR)Z9!y!Khu*L>c9Ti`fMh!#dcOlTSw`o z`E5#!ws+Z=YGD189Ki_!er|v_GK**tRK1A+x(>tMx0|%cRCz=-_v<+cWjFJefdTnx znm>Vo?{dETy!DXAfPKSyhqHR{I0G{52)-<~X}N=d7UR|#_*n}sDvFJoCsM8rI4j0LB%fMeermBw<)tMG3NbBwHs1QGFwzpijYK+E8X4iq1KtprzTMaMP0>UX` zfbGrAG%$3C%TLwvaF_uC%Ww+(X0wQE!XBe>`O(>cQTu%LB4Z0J5s92$X0FPMAQiwv z!PPtr-)c5W&X znNSD-taWdQhzJrvQTdNCWjL})rnY~XAfupA4$3z?xVxtkNs`b*DF!V>Nq1SBrtIHa z?lb4q1*YtkM_?!|*r>zmfNjAaQAK`J&|uReYyQLx90D1*KWCIF>7n#5na$eRm{F8r zlAKiE?)V3R2XuhRFg#A4I!_vEL2>8&ZwbD`3CvP_ACvPoT5e~)xY;U0^8=F|8Tsrh_N3%P7uPHo+{I0 z>Jbu9C-jB~OlkrlM%WySZGXY#M}3wwy&{H4op=Yj`&gUF+U1`9xuo_Sz*s}H$6QVv`gbXbfdxf3Q5F0KoCV;h5 zqwBV&1Yd{$UKFQzR_AFZ^wrqn5r&2X&`Yb(agltnTEOg%1wz}&699K7`a0EnJ%F&* zqY5mq8Ita{ytiS>!BfHAx1LnrFv|sAH<+?P_c+;U^HepsCqHs%HL?!UxMFBqR8%CX z*T!h_qT_cF35Io8HXe#$Kv89MaQR~x`bmtfvQyio!Bm>@_#}t;W0oyz4{N<9B{5SZ z;>vuN`9m+6vReSq9vis`Rq%k&YUEFK1lHD9g71-!gWoosd52mz1dfc2ol=OpS4?Vx zJhbp`xBn9%C>t#iL(LfwXs9OAbspig;j`FcFWe$1rBWfnqZ1R&BCintK1>XqRh92k zmSOVnaF}`!cxY?uOrpO7h^7{F0$MFQ zWq@hFW=}z5HB}fGSnz(#E7v=blUAg~^WQ6dM~x?>}a zEp>P9i$b!CGPE`NUCZnK$!kK%2VP(SdvjipS?7VJ4G!0e_-?fCq-6Xq#uF#91~h!| z;~fa(MGE@GC$<+jxVWB^p1Tc3guu|Fg}TEzhDjGhDV8IzuHMHsQZ(f2L}T({e7QZ;#%*d3+{*znom1HrOJj*A^z5W`fj#;648TO1qm-^-WOP zy%n-TCwusV?G;nj(=WbU+tj$vUtzrxmoj<5^yLIk^5A(0g|VzW7sdCZ1P3lq^5qV+ zQ2*Ta3*hN?6#d1{(RI6lrh{m!qEVY6G?eogJ~4)pldZ>a!Dy${$0#k4r1F9Sf=!JAue!*2f%@X z5({LNeap(?i!_UwCdG}O`2lOSYeVzc-AK48{u&^sb|{XCX81380sd&1R$*Y0P!*d7 z=G5!)qs_1>32VW2R`l|uPw9L=uk;7G@( ztzY}utpYt!)9_v&F=5DOUOFYi)v%n9ppwt>B}Cq?kyO-+sO(t0dvRTrx2We|DI+KB5A43MalDVU7iZchiNu0EyF& zEsdxyt0_v4FG?(UbUoH#F3(u1*?p%Ax!|Q$f+EmL5A9$nJReug@2>&{&@%2lh4iYb z9;!fFclgKcM1=E-p-i#o8IL={HR9I~Zx_xwKqZSsM^5jVN%Rd;9xOn#m`)(C7adBu_AsDSSaMCJ9h4Cw z^gTKB0Sq;WMdu0Z?4~n!V+YvBEs+3j_pIAS_lwgysc{w@3TxxWLM}Nyz3>37f5$ro zmF*rxJr2c*nSLUGbo{~sdAA>Psiw=ynihbguC89t?iQEF%OtXoc>kWg-nA|m2&27s zROnEFmR8C9a^>@jt62ZkNPmDX$otBGXfUnM%34@Ul5# z+`XX|9tFI!9#y~N?g2($(T*mWshOp!UJ^JaHa3d8N#Q@&3H+H-FL6eHRj&qE%`A`% zK?N)A{?*2H2b}n@fA`xDspIGQ%vS~3*_=H52Q#N6KqPF`)Flv~GDehUT|se9Zi^LZ z!80e3eP9sEZ$aRO4y1wcveE`%_Bh(5ObD zNSOd26UWRWhxZx<>Q^xWZ_jQ#=a2|tja1G=a~ZyOl?gr!{WVSpNO#tAyQgQhRf0~& znmq7V#;|Ov=71@SI9X{aWVQ-A{p2B3_PzeAKQYv*kX6P8D_ zw$`3L7%AL|i=fqqLKw(xEh=?Mxsa7Wev@iPioBW%K%0&s(H>ou`8 zLI)1jFTxo6NQOW?r)9&6^{C(ypBAPZ)XFI^lcY~GxX%_*RVLvDvPk=_s-9h;54e!~ zz|}qWxX7yFbu+864~=5Pu7(LC1O{^iofvw0^Wa;%jVFH>yM;OF0t3Vy#vLlHKU#W2 zp}eqfx)xTS1o;0g+2KI`QUPa{IL^=JVeTXXeZoVXei5*_Eo}qU>CJ0)#Yz29HzE3GS(zO5s81fnpt($MISt+B_CC?lLFe@Kv_Wcpy|$*zQ@pwdzq%~) zGq+!vAh1d~$%^CCQ_0ekklJ`|(j9ho=9F3L8*fqXF3ecD)#fkF(vO98NZ4B4^t(iu zN2`5MDeS%7Qy>8>qz{YtuojwaqP%lOK}q4gT$XA2nV(cIkqHb|;RJT>sh}_*<$yM5<`Q2I(rL#B!Tz46Slh_rISt7!nH}+~8mx z%7y9lw?D0`A8}x2qf?rib!L#(v1U~O=ZqQP@X*(8ckUK_;Z{oSrK+r)CSrU4Ej7o} zYkVq}vMx%OPx5xZjvQRh?22qx&g<;(GQzt#N-i<*5XkyRg{~iBSTnb+jy9ajT zA#xuApcLPG!3OLJM2xRq8*#GV4TBmzn(Fua9fSZqTabYf` z(qP|DL89SHFlSL03ssfW%N(ZKvwlg={NaNX{MiFlt>cB3=Bu=N36=c9kU2f7RE8-5 z!5OUWg#=PH!q82rK%1$maIpC$RC;$6hC?NNvzyV_#7Wyd3|89Jq`Sy6rYWwDwQhmdLuls6$UcX`VaoUjKF92qF| zd?lgkKOpGj_R#p7b@>=h{2*3M8FrDk3MXzi=YqG6Pqz(BFSyTXB1kxF2Mk7>uff-R zf9%a3`>l9JGf0+L@5vdD(z?JvP63cFAu$PF!U(j{40CeIHH+ubze-KDKi>R0kWAe* z$a1OjqjJyZqPzOEUSI}J3=w+>rpUUo=h+cg@2SVc#&D<^3(e6h2jR#lDcQQ)OmB0N z=1YF(9=^G_e zAzoJ2R!Z{hrhCv|e`-6$Q5r?r<~>X3M7RyatM`D-fW-Y3AK*F{)~nZoifJO!dYKtt z?LS?wmX@ydM|Fil^Ci(_v}AkQ7G`EUrh7&-ez1%0@hZ76Fv}fRZc>6Y=4;R7Y`B0Q zI45RNC5($JnGvH#4Pj&Afd6sj0}5HL35BXwz89daJb5MWtX*6d&n#HEmUpS$*Bc{* zK8;iezas^xW)pxz3*YVtD#1Gdy!p&TF(u(2y`8@#B`oT|rKwXN6`%v|R3M2a<@h7; z7;RScY!}WtM@&dfOq~pJ_NQWn&m)7F7e;xW0%Ewo(9rT1zYj0m+Vx5x0WndMo(ED+Z8OuQFRYoEH0e+oF7Wm#5Vr6feQg7urdE<#&7p5%LC>1(0&rje2n0zzw(e>S zm~AQFwt-!M0~3&Pgvcnc#F>`4=zF>q@EQ`lk|Gt*))TS96rG^jrB1 zZa+Utr;z~$dIG}wQqID{g1oGhtt~t3+w)%8@5e^~-^lWHN@`ZsKvj7z8*f=SI_EqK>Jy^=yf4y5l_=4Vr_pt(KM2heJIn3Sl zi+|vzY`H-QPIP^UUk|IPHUtvU{bU&-H@LI!EkWH*qepGs+_H!brgZ?Y)MqNt^*JWN zqpwtu)~VEtGB&f6pyp8aX{_8@&c;I!G^=W;R#4mWw|O@vhx#ME5zhdeW)Fs^lyCc| zg1Fwkys_fT%h{)F)75(czrhZVFOU@T`x=0TwS@K9Z+mZVfDPPNpM2=t#mLMUOY+lb zc2MoHQ5%wtKLWUQICS?Q$eT}9NiWl`f8ZUloGOw!2I0VS`V@k1ZPh7iz2O>m zNi*Epwcth4eW|BrLs*x_i#0W~2dY63Of(vkcviX`-d?P+EU4+6Ws|}@Dpp(joH`_) z1gjq~l&H#(GM+_4^OTAx)eo|9IRWH?t7~~jqX!_Sg;ZNZiG#nO-Xd$Cgh=fqTJhS% zL0f>8*ySoFlF?TFsF!$1F{m#yz}E5cZJDA1OEtCawxQKW-i2O^d=yv&gjGj~w*~|m zR547TtzYFUx4|-{DukiXSTlCL#LK0&7YGspK5FZMtT|Hz)`k*RNns- zHmR}ENhhbNQ}1Wo+b2H^hi8=fic$+ZKX0iD{H-)dL4kXMAsWWO9tnxL2k)zli539j=2&XPM8O@xi?p{wC{^}l%d0zkJ7kgBvV1+T#K~c1-_fHqgxC- z73eDh51pdMepe9N1l~S8qvg}o*OS(3;|Hr*En(gL+@+oHjZ+sYk|b)sbrr zj8}-{30JUy_)=IP1w3Z6RHokxJ|a7hDiQt5_;K^=)tJVW@gThW{uw_1Hg|5~CtkwT z6ZE}3gYyP(>jgzUar)<6PoQ7K=aY`h10>^OnnKQ zn9A752C=?xYGv|C!2Kl*TZogBYim|gn%$rd_;ah=^T^(?PbeTN@q+i+lX@F#O?x_| zso|_ososnne|d0Q0Mep}h(Y-7XqQ||CC|toS65)j5F0}6%H>-h?>lZ7dLj@j&@Zy6 zBY77u0H!0#Dz+6eD7gdF{Sp%5Q2tU1Fo*BXyKU9Cwz?_1W`PfZFLD8m&mygdD{B2Cd<#7?^I0_V>ma2XDJTDIGuy2drlk|h;A`z6zD*&u z0HB`pyo4O-&&ZR5!&VO+k>*jjyj~_jAQ_&wt#xo{G&Sto=i;JkyS|`?d}hAQ(RF$R z+E&M_=*PAJt17y_levXVSlv6STBbtn`MDBVexdG0t#PcuA+0{1DfY#8YZbM{)w3>| z$yFmtL79U!ODK@Z+Qo(UM?`~0%yi#RM zP&lBpk_#fo&BTig4;hCwobP9sE@d6J=;bQX^~8#BJ+r7t@J-X}wlO3K&>M!OaD1szM@2=HWIYGWr$60VXAr4x2-ymiYL zwHKg&cK%<;atGPx#{bGKq~Ls|Rb|g*|HGtBRw)4=yGvgE%#*ehh3NO`^tq&I$oj@t zj6=1R+LNCjfe8z}_SoP8MFs?xR9+6Zg+jm|(=|H;!IHq3N*Cp1+)5diwCCBnU#+RE zv@}DqB&VA37gX1KJ7h{fRw3u%;ZY#TXJiCt0V-X31^5>qQ<*DF316i9ugdOd4PD}q zr_YBGpZ9%?oivxkU^oDv9kKPOX?+gG)4SgY0Gn2%EG`oyJZHD}&&_>j{h>KJn-zv> z2er$%_xPP7AfOF@*7_PpP5*Wu0n^c>(N>9BK3E<6r<@38VVb+asA1?(*II!H4szsq z2NkkPNV<1*(uWMn%xH4b(mV6qonv{;veeJz3a05mLZ${i>^U+R0_kojOA@J{i7$km zpvjI0hI%9WQk8K)DI60!7Y}9daj-g;!xKUc7Qll*#bdBr?@cg2phd=x`Gqo7)l5Te zgGmFK|CH7B8@x945m#V+uRHT?t9bL4Q@9y~o)Z zDDs(IH!fsv{?xJwa>ogv_-2E@y>P7u1=&R@_LS75Uol{U(;v_NEmleiAeF)3R)zq+1YNiK&=N+%glP_M4bc{E@lw)ixec*_K~_?ycehp6}v*Zx1y$iFvAv* zPfO^!l|?=v;b6cGIi&_E1(pbn*W|}?$}WF5>CY}!j?`ZtK?VTn6X*Z zs(5~Tl86m|HuvvrE)j{5p8!VM^#OYsO0)e5R&w%lz1<^?7p!6Udp8h;ER$D=oNF!n zbI-z(a5_+ys&Vz;(@98Hg|<3sMR3n*>R2KJ2<8tEeM?GuyG0@dt9>eXS@U*#qG@=7 z@Mw8VZxLCUk~mXTOpfM*+-&-3&c_;*FwB~Z>)KUUK}aJR04S<|heqA?=OREQPY1*) zU{)avmu^5Mn)*kUpJy>vHdpiV376I@RG~}7uUdWD_x9%U%JPmEW}@nB2SBSE>ev_h zrhA(Jz@%W9ATg53Q92HR+Fltl^f@X>lb02-4UbHix|M$R@;H>ytyr^%lEN@ISyFgI z!Fg6K9)JeC0y*As^ZY7X>_W`Q8kqe5W z5WCLe;iq%TZKT*)W~D`JuepZv@KEAFLiSk~TJLa)`XTaLJvv#S(f(W$ZS;?UJB*E^ z2@(*pK}=h(tN49%OD(nj8&0fCM8QFR|M)?x91pSF~cH^Ay$lw`f7?ROe{mO&k9aHf$DB|g9xDZ&xwiG-6AuQ?C!xm z#{bIiF6uFp_1#B3dfnt^hJl$T;^n?FkEL)_+Vp>gHj#2Ye~*Kz`awWOg`iyO5mPy3 z@!RJl#TieO8A;xXD?dh$M8SByGj|=tznPXCONnl_k$9fEXnu)dUs8Ol_pqa%^LqZ8 z7LEdGUAE%`rz7^k9{J2uX3KL0#X`cIESAh7$&s-?K`6haC0!j`i>SuhH@I zLBoQZcZ;qaHd9c|qP-&Hhx; z1*|)aYGr4;@B;QRzq)$RL+|T~Xue@c9VY{J00nZ_5bz902GQBA)6Kvv1p@1A$zc}# zs-eCN#&7`lh);$V)VFFWztK}5%#cx*Ts&)>mnP=2f$6>IPgI;X4W8|u`I zQ^-{!cX|17HVU2dF#SWp*S9v$5~~FjC^}9)T}S8T^l7-6%-r3NjE<%(bAbjjNWyZF zhg1$67gD(IcG)M@Ck(_ODJRGI{O@dkl_2cf?w;s{qeJf-1XgvOr{c)Dg?Q2WJoCvR zE@&cnno-Ke7n9Csf!Zh9RfkHIgVdzG-pu_XAlU}k*LXkcrrN~PwKl5nZXQDgW% zf7a1F%YUBlnDJ2n#+4%SF=cftQ;03T9{rA`<#0Lh*TC=Jun>cpA*=PR$Nt1Er8v}l z4h}>5yW*E1)Vn8CKWL5bXr=bmbnl97$M{~rtZ9re?LN?8$u0d6+HW;&A1n(e-i?6? zl0I;GsKw_p({zJT=YkDvgQz?AJNQjJIPp`tRFFOgT&=GyfblG^du((q9<$ZVA3l2^ zjqCDj+XQfGpK!#mGdH*Xmb;Qp@^Mp=dv7w6;^d2xLd1m+;7m%66IyI9CO4%mE1 z>t+$%K^XV&Bxo#m>uJ)l+nU-=nY#uj8>H?!N#RsxqL#G}_L()bffGc&nJv|A$+^h+ zUB$J^Q+hC37rhc67h5k7JaiR~PaCfs^h!|fI8BEa{l9KsLomTHhxVMdv#M!Npo$k0 zU)O3bppD)6zN@2~Zb!nnfO%?nU^Xc)XQ+YPB^S?+o$kq_4%A6Dmt(LN<*(c}a&N57 zd6Pxrc)VCb<=(5|<>)uqCktTkQQ_rF0AOal~mWd#O`FD z&vDF~!t?<-dnXtYHq>WOii_Ee7sy^dF&_Z1lZA zK=oJZlU6{y4<8$QR88@&F3wzH=g)>C_r>u{NLI|G%nh!~Wo$EoIq;v+8*SZ2vWMpf5L<_Ije0(Z5&ika_g z2!;=1Mdsi4j*P&upRvaojfmaaOBlLu`_+_@fVflXNgzavKhD!EPwz01AjKm z0jl@j|EhK;QiVWMO&undroYQYp)3o@K;oNEgJH7g*fc+L40;>m=I3rA1wyQA=bW3| zlQeY_f$UeA)XgGg5R*YR&G80rE3UrqtEG|-zSPpD$Nb)Cp1(fmcvMLS(MAF9Vp;U- zRa|}eNDM<)d&CXzKy7l@Im^O}%s!ZWxXA7*rk5$v*lZxOU=ONoRSD`dwJRR?o9pbL zGH2TFw%m{ImC>@JzV%-U>d9bX zI7gps^OdNdOD8{ZP8W8Gte5zWQ?)}%Qx#W_s=fN*V{D&`H;^EZQR24sr)oNS&?6J0 z*csYu#cR9D*h8{y`PtOQ%y^^^o)yoiXk=Ee_KEx`SoWpd@ulUn9ih+G?$O0;gf$NP zfp0%wK8;lkdfgMjx@?v^kIY~rUxRZ&uHc{EXDbIHo~>4?6I+v$Os1(pVyzq9SBfcj z+(yzIumGm_qIKW9S5=^5R%;8ahbJA3H?2=*v{&Y5c~*WfUr-+GyqvUMs7r$}oZFx% zCSMX}Dt9!R;~(qOgWie_GvTS*EEO0R50CX+RVv~sQF-nw`t}xSUX!Ttk1O4`(!fhq zp|AU=MkJdii^2UENNzj%J|ra0;Q}ppuY}XOSCcnh3Qqhl)}sb8=FH^ca4?I%1=?In zjK;bhe(yZFnMWZ3!A&aY(r5$K zjT5Iv9j5oY+Xpw9K}%%U(vhp=?q1;3tk+d{R!}ECjfmUL+9!M2?aEPy8J_8tBiDyl z0w7vkx!3REp5mT3;o_d+oSuTS<@_Zxw_e|C&_+h2Ct^9D) z(#8Ixql^e&9?jM2Dn-?FH||hy8WO9)k}Nu0N()XQ6Y3I!>k@nN%5p}#g1*bWPm7He z_BkppzR~(r7bR-M_~en41g?TYX0A*=e4 zY3k=LkKfGp_8Ne`q^hgHz_|u=fa(R38KXiQw zbjQkiWO8O@u|@4P_eu*4`P1qg8~qnwra#$ORN`eYIeaL-KnKEId9Do01d$ci{b_)V z+DoEfE|Gx=QQYbERFwXIg%y^1cDrMvo9ZZ>DP1MH%|9$pt3&1F+f95*Hdg(zXHhar zkdBi=8-=gJ@H$L^w(kdwrr#^%xNlF;?#6urG`}qAHhE(|aLL8S*WFpB)V^4H1H%-< z2Jm(5S_@L1zU`fD0K!w#XP09K;BA5;FN5>#$?NkcvR+!?r1%j-4!OHSu>QTh#h~i_A zVYJi`*#lDxsDfT5rdEx^t$$Vlvv0?;ol{k3H~uat!B>Mu%EQA)tZd*V29%5E07^_= zpsFvAeT4W9y`PHoTsbNGieg0B_z?FO9gaol;=h0XFKT37p2DBW14fY=MKrYP007qa z=q^+MBKG0so}ff(E13`*FTkA;`B`RzmPeuO+abMK^|>U1*;-cI>sj(N%-Ge|9CoAGhPuSeF-w|h&l{LH&3Ck>_vRs^Wy9nGDO#qeQ&;Q5MSB6Ew zJ#Vjx3IYb8z=BN)NQo>hBGO1o3rI?LgCNp~Al=>FjnW|9-QC^r&hq^J?_OShVfVzG ziF@YEnQ>lSJ=)KMv`s|d#gu!Uh8nLGqJtpaXULHmPmD z!3Y>b)c4!zFaKQthD(TaCs16r6{+ceH`dlSi$@C9XwnqXNKvw94vDsfw+_ArWsby) zAY`YudsUxa20Mz*^n@+_s#z)0zg3?PZwq84BqZSbe}2h_hKAl?z;BBnoLGJTphKtb zc|sdig#pw$z*f0J64cURa0MZzf!#^4r=>vF_PR1_gqTr+I$m4m*y2MOEr!ddqd_l&`G-4D zN!|2;WrxyI6)=}O;F8-r7m;Hc@4CPU$h8bxt;kx*JSem{I zPm(4WHa_1vc4Ok*?BqVOM!{UMmTY77xKS(&FW?jrVgl>|m0w)?TV%3s61{se309p4 zS@~F3D*|3gMsK_+5Ac1Q7s;L|Vjho9f&L4U;3JZxsHLNym?Uv6Z+5vc(x>pv3ayD9tuYp^6vzmvVVy;31+BBw5?kGt~vs2m&C|=6djLs@!r%9KW>9x+juC-gpI1H3XgY3#1Aa^#0yq-Ze z8slwotp`JW*7JckUU01KEjBrBc?9)5PS4fdT=78~jy*y&)^R3ZL3~;sIs9j_J_gtD z$e15T0K!j?WhGoY+}y_@ZBluuDG@|$vum1TE0AN-nwY6Y$8X2;PUy*@CfYeI8IL4bh^@qR?%T96WEUka7frGY?Qba zV-$4t((MNbn`-&qsK;iC_=Ouox|7_*XxaXu3r-3Zmyhb-QwR+}{_qN8N2c;trtqA` z3vk;IU*KA{LaRhmrBiLl3#|#s-VXte3hTVZf9#XKcPlkB1-SGvV6EaF48+VWzGfh6 zN*>%fG}mz{gLWp1%6gA{t8pIFbMym*P%A`GMqdt8ii{)ip>?VGl2&m3`VH8k$1&x6 z)4hvCJl|geL`AxyXS;v#mT*PR?fbaT)-GR)LdC16j!9zh)e^A3OvF|p16Oq#>58U) zi;63&<4SKY|L@7&1o6#HL#bJ98$G?zL1h|o87@zCrPf3dL`fLu@Xhx7&gnZ#gKF!U zpM-`laRtB&NgCP71g!NRFW&gLVQ)h(-BU2dn*9aAg)Q!%B<_Rs11ef^g{ITF7BtRh zF#bcPk(jK4Yi8FH)X2I*L&G2mv<~$8?93co@_lr5w7p$eG#r3CnP;!IdW>4a|4hlD zygFQG0@@E!n-I~zjmdWbz(Q^lF}CJx5vGO^QdF^%zO|JULNqq7k;A4lIw#R1XbeFE9-^{`!F*90nyu)znUlurM0t7V5Ng@c|S4@kAn(~q|YEPGN zKgSzXu7%~2k$}w;Q;%BXllq~}`m@3F#+JrNenoz|>L4Yl(D1CzRPnFE*A)Qixt@Op zZczg~^u4k7Pn z0O@^qBLOF(hE$iJNDw{PDS|S~U*kWU!Ty`&gK8!DtO+lq=#$zam2>~5l}|l4yAfu# zq_r@Yi_YDbyaq0*Z;oj=**58l?(rL}6;Va*m0E3G1I$ga!a zuKo%u9BnJ%L;kfVIvFV$F^6bZG$mT4K8Hz8>e71fn%_Q}$WqL6Ds>v@T`n@DWb9UK zEdTbcOu*>D!1&0&XK$WxRBb#q!z53+>GKr-pAlSF0+>NWOMcpU!$>)4)+@h+i|twy z@SO>x)c?@H`8|Dsmm3JH;V4XnQG(eCBKqI0-? zH!Yurc&VzCl!1xyHi-Xq`Ya962dqw|m+$LA=+U`yk)TA|rm35L3I9?3e3~%K+qdHm zh92HaAaXni0v`X`1dG`7m>AnNE-emOI#!deiL>O3FP2Jn<&$XjJjS(ja9t1q&R~@P zNy=2URLFzd{PMy6yCk;os`&d2vTujg6-s@+mFX;vWwb=RptYF6>{^Aq#hN&oqwWZ;<;I+zcO(t=FR_o?nyj~Tir{5| zt-{Ig(rfpVz%V@&nch?(LR6DAn^(+F9d;A6hKVS4UKZH>;^^@}*MM2)jei^AWkequ zu4!bBL%L7&{j0WTQ`Z=hsTO*f8Smd`2cZpNaoAkCQ1^~r;2M_QeIgRca<10=(LFvA zg)x(sRZs_k*_ESxH1~+%Gv^w|PMK3SiE_pKuokN(gg{i!V`^V()TwK{v%nTi-O+dV z*z&^3#d86I>Pq(afOiTO`IaC->s_4*YkrY7gM9#pfn8m+p!g+T_>i!7O>X2c@JVz7 zkV!V-+N<{>rZ*X~WQ)Is*f0>+R{QHSv*Sh8^Vs3lqCWARmDcE%w69~m@9Xv3o9g7R z@M7LFB!EZ{$Vlwj|Ki|QlHHn>4V(X{-#(uS%Jz79>B$WzryGHk(Ng!#6tc+$c*T19 zx?HP1Z;))x(Ec{7CH` z_&KtsS%lvtwXf@mocI|?$XuI60#-v6G}M} zv^Gn)k2D4*JxTh~q@1K}1t?(`pe|D`^VpA<1Prkz=Pq!aEr#9&=Ew*-XLcN>+7lG_+Z*>9YF(m-zS@}@n#~)FBvzThvWeOt! zo~Gu0_oR4G%!4U$ualGG?9nsJmBIt(l!I?+_4LdPH?bbjs|H6^MBGM8$9%2ssL8gbvS2FyDKWb;=ad^+jN^Zi)THZ&L_Ub_&1;xfyi;oYPjmsb%b|+$H1G{ zZ~RJ~l&W8iXK@_6l{!(?m$SyD+$0mx!u#cRcvy`O4kCnE{{~ar7-~9SzjMQDY}3J} z_7&%T<-qZE#KtY&I-DT8s!8r9NG_bWmXk~Wv{w?5!DRNqMzJcSz*tzw%p0&Nf$Z)| zj-G_%{+a<`Ge;4$fx(YguHcX05>>7m9+8E(pTbAQr#1PC$Bkdi`VBO!a17x>M}Kj8 zrP!#o%j;{AYSDU4R-s{t@0|netv$P8n~h;5G^Ixh_9xnhEs(L9TC=l*27~=kTFojW z0|O8;ul`)u)lLWAl`&xE?1`lU`JS6QZ^=YoF?R>Ic$UgpmHb9sDy=Q4{em?z8DI<1 z46L2<@KB?jgOKsOZ3v(TB)JZA(c&1i+l%;MqbCcOhF465syt((Ha(9sG(@7 zei+5r_9ye<0Rzve?T@3w`*@sewkth@-&=ZEN?ZEsb)tig<&{WI*+<|=Q%n#D#_Am9 zw))k9BypqJuuo4p&ck@m89G{=QSpkAJx%@R#i!!UQcJiI_;=a*#`me=@)$va16;j3 zN=+_K4%ez~b~}%KvK`z75@JOhX=22glm+-n@4fLtU40|0N_%$Vk2Bwf&1yus*;C>v zu8n8*OXSsSeC&ns{_fFM8%G-)Ook=s80-B}QSo>*)w@c4R?Icu*vv?7Z#OCN#gipp z^Ag|Rg>>fg{wNkRHxUyvqtJbOh*l!1O@RE#RNH9RRTT&c`%R`QPB>hI>KY4_n)m$Z z3|;qdZ-%&O|GCrcWU`G3l_+VGG(K;&p?>);uCEP^*XTLAhGpEgcOgbZ*N8+34&|#` z@bEk}`;fM=@1)5q6qBh%5Ry)#Gdh8e+1N*(VXLCIFDxZNC0{^8<185TG30?~<0!L}|-g#rRIyPH2Z85CMO7;>nC&FPmcqZb~ru?BV`nb%Ibwt4i{u0T_{Dih@ z!&pwkSf_qE_tp~m?av09)1Nh|jBo{4>ah0;4~z&9jz=^K0>ilXXoLDCT=Tc~?UwVZ z+L@-dQ+S4?6`#siLVnZmAb=#OW>4B4HoG*1w#6HFu|_WSY}uG|m|f1nc>+2AhIgV2 z2D-aq(-k1$NO4Nx$@R5pd;(2A0?me!yhObFW1=E0Lha>NSqqoU?#t|Czw&?MhFsA_ zuIR0<>JmTS>)}Nph;q+jg3 z2v`rGbsF@Rg9!NNUok2cQQsmtuCU9GX^b|t(iSUQuG{~qm^!X|p0B4%$8^VCFGEi+ z9g-mU4l*TH>96Z+0{9AW_$v5a<$V0-{W>3s`%ZO1&Ur!=y1QPsE zS0kslZ^s4NeT(Y8f?x*w8I7+hCUYV)#-1ZFvA!2-#y#$M4t#QEsT2>Z z0m_K1*&P?}uWnE2DcP&QT3nz1^dt@Z{X0Lp6WPU0p)dakl5PY=Q>| zYi=S`;9ausjJsDk|QcT{|Ucfl;PC;pq=+$12+$ITkNPC6IfI=C70OYl6`SGg!K zvY`V6GF4Lfm?O|D1leu$Y~NAemS6Z_j#Mt=!n??T_?exYIPiuXMYLG9PsgjoB~PHR zVfxHRS(p6O+|<(C)I|8VW`?};S@-4rn<4WK@4QlSa!N{4)N%3xS&o;rp}y~)7&&2| z!4Q;j6+mwJMdv)7x5JIe8uv!U>&ct1a2g&!UeHNW;|4BmyFFk7gu|^X7LIK#ZJnd5 zt7?2W>)P7fihsJ~j8#v&3ez42;6ClPHZ(-r)7YWcXIaQKU zJrCVDSyH%toVn;kB1JMqk`g+uWrRhJ5m{T0?(B?N@`%D`-CN)Ke7`U(@>^x4?;W@A zUO72pjjx`>II3LDI?V!`8(}ovw@%epYq&%}L;X*f;8d;heRzw-vbp)r(VLN`T5f0C z>+ghWIujws z4~;LuZ@7p+z!u75k8x7&X_d38+;407nl#9es3gD-Q;47?ecpeb<7hnuO-ckJ16*xn zfw>9VO2-F41U(4zJn;_EFzvI1(_-}?v_ZR^^;z|$htk<|8i8wwwf_ST!c4kC zl9COM_rivDPKxocc$k|uzxJ*<4b8rzbGQQULfU5+ByJn4o_1@UQ zoXk$gM8i~RI?@@Q74{4e%s=bd3zoX;Dnp!tfv9GJgn$ly908J#WF5iu+Qf;g$gYM# zI@7HKXFd@C5XXdsg!lZ!8@#b0_XK883^F<`TG%xTN9Bz6^jLN#Z8J_8x5PEH>yFzc z=j6aMt+Sr4I)?^`wlQ7>=6h(U++3 z5?wM&On0Pw`@{t;#c)w}Qp3`HXv+iCXCt@De_|~G<@C&MoH(FyKy5qP4~VV+@<&Ky zi9OgnT*`ue2C-*P2+7`PVb$D7ref@3_Tk~%c5!c{yMmlsS-Xsm+*_xcY1I zu}xvd{8|2K-|ET+3+5}mc@9l7IQ)5ZXu}i>Y=Qi(Tk95@i=~lWUG&m@osXv9W4L|C zGIP<8KWleUfznEFHvoocx(7oMy?Sd{y_@B^zn}stCp)N?hQr*fHlM%ev0ieTzXNH- zqCagVH89}lWxZDnOzubeztAfC27;>rq5!3{z>|vMNLkrb1-ZIr6ycYpFW`v(2@i?+ zDr2vwKz~A{o5JPF8t%}5Pp#7v=1^H4iwN{?8$a7t9&S)`4fIfsQBM$Ee zo`Kc}hWP!PRJOp5x`*$&nIGG7xUo$Ju zWKU10hO6dl^~R%G5`Kzy+~h>Ef?Ef(n7U+aV(gvoV4Cr!fzbiZFjvhaeFT>`^jYId z6^}EazY^*y>d{NnDR6Ht7!Oco2i~TQeJDszMz5*f1PA*L7<9e4&UPk^Qwys@7cvnt zrE*i=6!DJ)+?s5bpF)jiL%{<~Z1BvuX0}u>DIqbf!UJzgwK)I7ELNo7 zqeO*Rj3_T$ktYk;$TA$TsxV(VaNv2i)x3+KcF*JX+k2a#>?W!2y@ssV#+tg_bB6bs z7#YP~xf-Aq3H9-j1R6J+!7ouN?PqFtF>>J6Tpp7n#Xqm${=V=nLh!zMybew#qC3Gu z#JshxEYk8pr1d3*oe=WcsuYMc^=aw)qyLGtu4WsV-dL%OQdTtfH1mTlf)f! zKVToh&Qn*aetjD9a=05rYV_vu^;p0KA_9?(0P@;bomeZue(9^D>X>G?tnp>0i;dJS zC*L#u zJo?)m75{MSLBNZi;wdAA+a15Alfd#YJb0h2KimJ_7A=YhOwe7cMf25kBtMxKGA_N$ zlucq_9cj3Veec0!7>NMTqL!P@eZ*yQ&miGI6yO+gNBe>t4;a7MEJ1g#>ml*hS4A@VsP?o z?fXXn(ajm6>jdXy{k=^l>tiid^1qc0X{(}>OG^U_h2tI)VMhIIyLR~po$7;cVxOPg zzjd~n!SzfvnE?ch>nk1}r@|ei#3xCJ@enbiJ`eRoM+U+xWAs6qw&KXI&%i4yuKA2l zMBi>T`t)ekY=)4u%%`2`^0#ub zQi@6+DKgSCeWe2e1ht=PKYZ|@JUFIkg`a?9+(ZA_UHZ#U?OSNfPNpc)2M4;~^SNkM z$Lj|V9(a-7!zHBu)AR0~e3!kk)oEV@hG?V++#VI6B|nlxA8o*O;j$!OR_CYyaE=vQ zq^k|7xs1N9uBrvMJ|Vj?*ysG954Dy!3;PXO{XNZ;X*%%%y#WEeUCpV@siC2AvTADn zfQBfg1QG;N#3}CI&f@%py!`E#FWucjtX5^CWKTFsNXNV&7h=fQUuHwG=lziIUE9jZ z+Rbkg&J8!OhMLlkbxv!Vud$0~P1IK8c4&h>e(zlk0bGxl_LXOv*$M=qmCvDLlAkDXLtXdfWTnft}XT@bSAd3B%pbXQvJK6CuWB{W- zatYiIW!;*3N}`3@ue1xKl|}nd9a3mHeHI}7 zJV_(Jd~cy;>(W|#q}(S(249GRYB_ZE41#n8yy>u3-2VyWL@sY!Y6O|(j7`)W25XSA#1lOzu&(8+l4 ziGB_$<$Z>?oq{y?*3Q{lCcpq|978gzQk3yFX8%d{u2Sa}xC-!&$k<()Rjxctyo5IK z1ZXDhc9)n}E;nCNZ(o}#HT-e>0sK+)m_09S#EU5OEmXxRo4PTMEqT8S8=L$2vMC~a znQ{m8Y*Nn3xCs`uwR1SEZ$=rw3p+$d0qmdJ6o9swclvBWTy5m;Zh^gPnL3V1&{zdr zccDLw!<+u|MfIdwTDrEUKe4ekqFz656w%#2BF%Uakb2nB>Hl4Gor{2ufl0PX$NfX2 z7~B||vS5vHV@9AXHtW8+J5w(&FIz0vABBeB-SDA>S3U4?yj~_RmcQ1pYGturamFV~ zOnNXja}yt5BkR0#3DQEE1Chs6@lxP?(|@bhQtV-d++eiL%c?nt-=ixg+ek{8jWuj4 zvKvj2HzLaulljRhtu8U)z0=3QmB?*j>kidv&F`C$Q~Mg4nBJ)w+1wdIn3NJQa}9Tv zhMZsLftAdL$gNxCF(X;7o_{a(vn?Oi6v(N6NVZuY9}L@HuF7lYs9K*FJvkVz5}w4a zC^6dB82hHiX-mvt{d?sp)^(!6{(Qjj<*AMfz6`h(ezZKZ?L8i z;V8F)ob=iH!1vfG@lNhXoN=9d(^VDBs>QAgj}Xy!Z&@q|kNuhEJbPpAb>ecYcAdRy zqHeH>+ug(xJ?f}n%Rhdhwv`phU95*>e6BEJ=dVBS<>i^?n-g+U)YTN|8w!>K{(Sya zwMUyZHN;S4c+(&u02O-vVO-;UUR{2^!=cb*|77u}FP0sjwFtdH&Br)GZyu_l>QeG1_ zB@q@X{|@7uQ{PFuygwN`1?n0i+50cD)Gy4UVbA<JitZ?lR~e{)x9~Afd@fdLw%V;wZ73-?RD=c zjWiNc}5>2m5)t);s;ymbjnUU@`pu|U6o@JMRZjh^hK z2u?QkuRj*WnCTH%`-h zE*IHLCZ|!J?pxNX>9_LkOGzmbl|5e^aPN+F=3=K(a!~*HE*rf<5*Jp}C+9PRQOc%f z>aNG^!87dKrch)YQC+$+P(a2(7nheN*hv9QE}=D%oA4`>M#KYK{M+CNei1dhra>fZ zxYuJg>wS0O6~|}%(CEYaUIpG7HqQzkA@e^TSC?a`VE?~kshjOeBel!j)H!70O)4%y zHL%^gbB9oiaflN2;Tpc6h4@hBPI`D`q(DMG~D?<@!3%^=Np)j=ObN> zF(mr8yu}6+{HUVzKNL$E^P1wiZHAruSQ*LY!y$b(BOi&us32IowQjgiyj>i-oThv5 zs;~&K!Dq+jGaUz2aShKBshC|P()Fe6eSG8{T}|dsF?T4_QZq-hwU0NQ7~s@{Wt8Oh zmI(sgVDEiyf03aw=Cj8{%m!yCrCorAy?do5+pOqe&kr1-m0$q{M?!Au`SnO?7K&pSmt;6y`hYW$*sKJePTs z5Qt^oN$ggta|w6%4zs4P{Z}V;bKxtUz-bd<=jiclN-NJcwj5k z(|D)mzMQh#O4eQjSz=Lv1+4GSnAP^KZ*)nl1j11&&d_zv&SKLztN(oY7vFD^RR$v` zpIiHn|C7UJ`mo`tyWJ*xvlKZ8xHe@AjT4&qE-Y9%GOBhTedePEv#o5T%rX`p;Tr5V zVr|$XbyWN5<&A>rYpN`Ll?Yoma;CKkR&?BE@?q3;s&Tl=V zQio{~<*sy{C~Pf~BmpBOI<4i&e}lWFuh_Xag$NM4PBGV5XqygrX-j-jmQ6Qt;g!GJ z4GnP61HT#=NIzVb7Zr|phPr{!0uIez)yF6n^xMhaaw&VpFF|HQ5YCbH_ff*=%F2Bt z8ol@qeybsSU6<6;$JAJs-l;`IayOe1Wt;38R!)T}V_Wjl+@#ATcC3B17V(8~=xn+s zU`%P67vmD56%=$Ko+4%0unZ1+{QF4`lOstx=$s=={U4!oDayr8WOb(kwr*JkAz4%h z7(T{KKECvmUBlNxeX==ITGvCA#Vk?G6!+5|8=JD-ujf-N8o$xT`8nv8?7qIe#JRG* zT1sMyr~F-B+Wu0(u}-B&@BcG;4{en{9@Ygu8!W0j5RNK+hO(VAt%x9b$}etJw@WSG z4F`D#d9|-@aBx$3S^DRLwZ~|BfZ}Id5pN3MsI*&{bd_v;WnBA;nK|gkj~93v6dq6` z7hr7vi0;^L-=ke-*Dng)TKTszBT4fH;;XvVp7EC|$=(YJHeb;Cw(uw$MY5K;+@G;! zXn}{kipY2UizJj5mmX^K7k{lP zUy6+5qxQhUz8#u$F?4FiSGV!Nob%zQvCh?m>>N6^Rec%8hS>x#HlzE+*yaU44X6Y4 z%~Y?pZTE9eD#=Pcz2FQ(PAF*XCvIUrQcThB#Qn`A_NkNI3+twWXen(SeRmjje)$TF zD!@)Rwha)7)w1JJCpR<{1x=$8BzR0YQr1I>Hr3F(FF#nm_hC{vzDXK*=%9|k!E~6N zLk{`{zv#d86L$PD(dCW`CgfB%uZk&`XxAzz7=bm;a6H7bKnaSHA6V+z{pa- z2N@Zwb|cY4*cSYLm*q_5L5)>$T*>VDsQ0nFJ>K1%qqZ0+sony+@#s11eg3g~BclpS>ej!d(7hin_|35_HO*io+&9!>W5Ah~ zskNVsUYEPNToz{N)zQ@{sYp{a#nq}dP`00}Q}0A;ArVlNX{kC(N0r(RHSg9{wNS5SsHP`1?4>%M~=RiZFSwRLpY?Woakf2~13`(># zIR~h(MF6OPF|uvdYeJuAZ;A-_su{PZ@eQh=&(M6U-?O zs0x9=Qh2UD8&#)Y@yRwS30Yc#;`>hRhJ|BnZ0gG#jEAy0o7(G%kQ?8*vg^G~eA-^H zJ~((AAEa;xq%c(SP;kC!q;I4vRbx_LZCfjzf}Ckuu=hoCX7P;21$KTAt)sJC-J zR&-nz9(BY!mYk)@Wa36ZN`?DqAn?^fa*NH z2~34Rym|z9KZVsiNpsfJOm=OzDDNcF0}Cf~m08&Rv-ARh+M=YjQu7J{;BhI_cN+i# z(WdJNjH0lP&g=d8!XNb-3H~P|+wJeQOAR@#=GfqsHZ&#hJ?%X^sNDf^wmAw&^OUgs zzy;I@P2%$ii0}^!43UuUe}uZhxMGo2e(*QX^IZ~jjrxXOb^G6n(nRHT>45$>?VTL= zDroL2N;~Ag1g&m&*xv%*14fBNa>!*U=DNvP_ws;B=2N1Ak4XnJP4_wXMx3 z))@xpa;3o!vc)eeh)*v+=X}Uu9Z$jdicu>vV)XN@lPq3d2{n_6MO$QfTP97XY_uMj z>#EBAALCw^HtAIm*>^!n#oKcTTZuX}v@{z0SP$-eT9uW2pZ@d@lHG_BMgQ)C6Bn8b znwPxg{eBXJFV3I7k6U%J$`e-kCMxnEN$XXb_;|D*qkq_1> zK$x&z!X%MCK18QgC3Pc9GYioQ!DWZ7S*p?w#Y(3oxo-j;pp!6c#h5N^__cxX==Sb6 z`>}O~&X)Ux58gNg{;7Z8`B{2)Xg9TXCfxuB35Etmr+U!wv%h?KZte+shByCLN7L$4 zKyPLB=Dvc#BV7#QZpPVEa(IZ&_a!pFymv7aIp1SUt|yi!MBdOtOqd>*V%6(EXY}?G zUdZe1X!0kJ>hw1H(G4f8%WJJEZKU%Y9Q%?O12$D*12Lw$&=WLI%aw zZiQ8X_e zr+8UNMAu_U=N-(t+$%h6e(Nynwguf`DwG6TKr0IJfs|@rQlBFkseZ<@Pwgb5<%&K8-Q+JfJWL)B@gf?G<>^SZEMd*qlYIiQxFH(!1f?h>4K`)5#FuivdhdNx z7Sq~ukx9jmmwtQ@68JBofBLTe*&3&1`KD(O%4}(2ZR*unw`|YZgPgxlRB=c#B^QWt zUa4=-2}Q80<-&5bx*?6q3d)Fwo*SCC{j8_b?((b4$~u@~_;$(KQ@FVJq~b7~5*NqYvee#_^=xuj~$`YQ|Zf+?4YcH%mOF9L;}nkPNUE|fOKl#9Wp>`gQyEo|NAMO62^f+Ox( zqBnHd`5<9fmhDhgS--43QfAO9HC3(X7ccSc@kKlEXs3t#>Dngzx%R`A3u z{hyWslO!K%VvQ&8!bJ1{!zERXl)cMMpL@AyeKDy}e`9s`3r;5ls`ynWu%CBny8_&W zhU1qp*6bpem}UbAPA)s~UR$89ihi{`M?L)5`JF55r21ViTROY#%Zb{Q=yChBet-6Q zn^HE;u?&N#F=|qcCtaE9N7t^BDHXp&UCjuoA?3^3Rn$@GR5HDRm^epoXTkKxe-pL; zv|tt&GATbBx^E`=R$Z!~`ugeB>nRYLg;SYe&L6sd&Jg3kihq!HMI2==R#N5@HZiNi z{8w5sj6#gBE(!~)sjcZA(n(q$3i4vki4Z`T^nd_sB!;bY-H_nqYi2@1-IPlnv%_Y_ z02cdq-dY;jlhT9)mj$#{4))D<8@S>s@;fkq^UR~9q-48Tvw}T5qMn`Vl~D1}P-%1r zd6lEd>@3c^qUc@u>9U^g){myw5EK3ALq9v)k21C90J1y{U>r9Y%hYu0eHa3aZHiA! zayrjX>y`;~IPw=;9xjcY@KGP!C1OA!wruc4OAs@Uh=1qags6YZbv zY6*>8*ERa~rXjLuZ(2PTVzS;Kx=_v5 z)n+STr)aL7{=JvTTx$p+{+;7o`$g(6@CR*QI3oiP?;s&rOqCxt5vdTZz{f zyW(tQIzLWolu|X2u4K}5XBynkUaqr6+J6XvY#ZBGxv58TT zV-3En_lGL`r&ZA%HNC$o@_!~Mwy;gMbFbpY$;+fs6WPM!C$uKe!UttX!ro>G*oNhK z>;3Bh<2Ktg0xOQigH1-N2qM(1@uC(~O;8x&+ST&5^AHAe* znH|D|ryey8m*2s(V8uP$%d$r_YgVqch+O;eO3&3$bZ@0{o;C`d8aj)n7o9=YJodf^ zMnFG(?u<8Gt(ywZ{rw*kIDDt@G#|Zo1mXuJHPyJo#z7hbLB{xru#Vi11!6Rw-)WpY zHrFdy8pC2CYAHZW2U2)TdJO`lcZq^*hq2#+1fX&!@fWY%PsC?Y}Xt zOF=1wJlZ|nhBW#2^%Z$# z79KHCKSj08*n7dcxTc|{htE+&$YK56s9yQt!kYMCAXBLh3p~WoLZZb2Yj9F&GkUAJ zcbUHaL8h}nfr|HEY?JYl`Ok`W6&L0@TDA*1po|o%b>+L*;1Ewbz6&PA*28d=hKISo z8+?(#njm>CQcnnm|6Cb&u&7+Pg_LAVK3RUu*@;dg;!@N3x-4@2devE z{;RXAXdZ8bMnJd)7uluom054R$|fwq7jr`<&YIX&l#W5~BB^nS6Sdr)3Sg-?6>jGWO=oAo!K-9H$6wr!A6HRNROIsWmV z0*>X&XKaayb1~mMN2p8o|87U-?liWQIw+^LMbNxR^1#*(Tncra#S8eKLPd1w%+8K; z7%tQX(pr!ye8@~s$B($O@cAg}Jip!|W%9Tl0TnzRu8BRPN)zF=5X4e=_LPB@iCPUr zF85iJepgf^^tZHHaI0GI)wp@{XCaXatC3ULe`}_MH9tXZ>KfLzhO>22JGMzuw)Aoc z60h)~DV|RZx;LIC;&uh|ZWO5PoavU`+?VQD2LB?ht4_ELKjp)agGask%l3AQL!>VV|&3yzt;KGdjX$|l*biIZolc6-NqDc7_~kE;P^0FYW7P#VmX94D^b%Y zm*_={PJOoOpnQN-?}h1Q^jsg(8($sxNBbKNszYA5wWhp560 zIVsxU(CN7vqxns)$VnT7PgWuH7O%CKEFRK=J20WSxjEx_H)riU|7F@kch@wvdhZoK z8}(S8(7otfO0Zciqx_)Apm6S_{$_<5S-bw3asS|io6|6FtO>#yE9YUh-EwG5c>Ya< z-oXFyWm!N_)drHZM0$BJ?|9RhbylwR1K5-(CVBC0`gg93E#V>lbR3G80$mgZkd@&jt5r}7SAmrZCteXyVjl~oHGwfcNgwDAdYhP`HtV>xuE^t&6 ze^n%2s*k(7Xlj8lMBB%Z#*dKeI^FVkWu~C@PDtgWJDjD6v)*;xPp91As-O{(&}GeHo|LJ( zw4=0HzF!NX?2l4Xk77K#NoVCcJ`5FnonM^$9TFg+AWm7Dpl#$%u-Y(S#(c=B218dT z$4=9%oQ>BgJJ?JJ4DABX1LatRt!7+FVLKUj8+mE=Od7uk#TSIa$|c}mufHH zIt$9{4t(Ji^@^dZIJ^gJv9AyxJl)!iq}j^Uel|wZ_I$tDc>5L{1NU$TZkX@P+Eho5 zvw$fknhbBH%vuLc?kJzCkAtzx%QYb)Bz#A3X^TjgVIr)(e-N959H{!)_)NkS5lyyi zzhw|AQu;g8KP>CF@EQl{%eA3|?T=Lqz&-%FDpull%L)w`PoHjqQv2+7u-z216uiw3 z#tktYy0;|giC_K#ZQNqd;P2?$@I(24+0yFGg7y;CAGo#O!rwk}%1He6S~oBEABCj& zyOt6z9@ftuS3Kr?Z&PZ7Y9z`Fn>5PaRR84ll};zr&*h5qn`m-+=Tk%bMO1&m{v|r* zb(^f+t<#fB?WYwd{Q4x3L1gNmGjDl#kX^UyS!vkYTiqP&vTC(YH^wGm$uX~yUi3&b zvy44G>J=m=UP%Cyhv@i6Gf(h7s-t1KyLl}@un5r%iG|+b`<#^(rGn^_Bfzu>&XK{m zMrpKil$s#tq5-I;#_#s|}`?s$7 zm5C&k*(MlD*KU9n}z3an42 z-LmyLl)3-`Zf_`eU8;`THgyn>@n=3aDSAsr)v($m5>_eKDf`W!>2+2YtNLRV%=X!{ z7Z)t*D*jQ{Y~q7ZhnLkoXO1C@i8sUM`Q+?22fCxhetN8kiAkdxq{hqjsetH*0(KLO zOL>i&r8ZQi#l|{1It0`|o10mlBD?ZM@m;Grl7cR@1)=(fc9w@x;lD#4BQH1Jh};sH zXe^2ce?sF25HIZQxNz^H>8NdaU#3EO$E1M#?rc$m>Qn+%=&)i)$IX9WrsnJ~Uuw{@Ug+wOD?F79GxWcIs!6rI##Cwdv{%=a`K^>g;i$$cU>t?X)>KO-s8 zEqGhytM#6CXR$!bKKbyB^$IwqtUT}Gq{Ri~5>0PB`uFD#hw9$WSS5Qr@Q#KT(b_8m zXfNo>(UjaV$y89VzdpXd+N&6|9ne=_ci7smTxm&he&l_3F%Y9f&X&D5c=zqPl6m3l zF0}rm{=oflGn3twL$-ti^lfFQgU@xFkdC|a z&bZ#eNQNL8FCV$yapo0yi5-|z@f z=8Nhez*7!tyCl>&;HcvH^e>4;b`Wew3xjz?WzU`?jOaDrAkl((Vd1!eY@GM`cW4Bp zwOu&cg(tjW=wQ5gBG$jBccD7|ed6U+7gE@AFOC-s!i<+k_;(KtYQq;u4Mah79s9Bk zUGd9N?;RSVWc;$_ct(rXGl<}*-}(Q7i=XkJ zL>mydZBBa~z6(dGs;N<<_YS=cI-EAHQRN!9k+Z8qN4(IIGcg&NBKvNixK5+4$HJDg zvjl&6oHH^q(Asc$Cr`i}znO$R&iiaux)bD_i|DxFJ#i_i4AIw1{@zLU9Au-HgTMJsY(90x2?XP>MT%*m_3p#K z-w{kJN~|N>!SeaY)tJAJn2&O!MUD@0sGW0B=r7bmN4B|r-Lz>>;1W|fI`h)wF8`&>kl7unRJTjb-hdCYb zzr$6{RDG+w+KVQSh&trlTsL4842w#KigN?2iZb#2mLtF~dG z2j@%6>qK37_x!vc$|fx@uM5s2=4!iZsEyZL6?8EW$zE_m(-pofK{N!(3}466ajx$; z$VSLgrln<#SDKt>R=6hckkqCGOoxYbTOaGJ>X8CwJ@@wuOc8xe$RG-W3@0=s#`YPzLodpT?ZJ{qpRo&DV|P$K2B| zsi`lxJXE-CQF&@7rAa%ax0eY>D!a8~D38lgp@ty?ht7pr_ZKOa|~K4#}bUF~qo)Q=$e-oDUP;*5si4yu#b8SV!Mm;nxsn|oWI zNDCxe-JO6-(25Jk=4VfDzhDug&O-GWw|~RH@bHC9o=_b3$lB$8jM7a{NeR%ul&{uR z?6|3RngAyAfB*=|lv1DWA}F20*5fcx{ZN7|l}%ENziG8~c(3+F{0G?cSerTg&FP=Tj94G$;n|4PpFYzZVFFAW*=zDa?QoEVnxH*ibtEbmPO1)+&^tTUb zBe?$mn0gDSD46bXcuiDNqy#AmmF^CeP+CB`ySsBy9zZ}qI+jpUYC*a~L`u42=~%jR zVfoMUp5J%A=j>VZJTf!4WA42Z2fU(D;57==)oBz zdNB8UQIYR>QyU8JSt6cQTu{5oEwn_(-Lpwe9pH}wzf4udSy-&=TWW&Wn?-M|f!hkn z92ba|#~70-!U8Nq(L&Z-vxYt`myqoRQ8TT>m#=(}%}%>dx5VAgCS+n8x9uIkSb;zD z)gk!C+rUw!`WpeOKI)S8E92ZAKizU{)vn%SM~t4=?>uvo zUF^DO#Px}?vU2TO%P&ya{83~4eKpU&v9Z-{qd@6%{HpRwz_vMI za0p&w8=IL4dR-!w>F#5!&R!yrLi6|;CQ4B;Ne;v9?snkG-Mu3(sit<^6gY^&zxt@9 z#()^&ps?8l3>oR~^Ruxr4HLO=Jk$txK*r*RzFJQ#A(E|zutqwR>?|0m>S+sO^0ICUy=V#XZDBG!W#w03ab{*YfTOQZSJuvI z0x^q!Q~uz|%gG@6ig!uYKiU<0fKX6KNFG0B;CeI>!*8ChK#t7v`cuLDjC{j@^4O(u zn}lj7ClXtZS8i@@z#@ViTC@9AuB%+uWe6_L9`#g}f(?fIzsCT_C_lIeaKoYvf3{9Q zg3Ua|mDmGv2Zs)mC_vf2pjw5W(^LJ;f?8_;IB&CldEATN*9y{O>(uyC78w^(fcvk| zgBEeu1Q~gv7=;|5(zk+6Fz%F<>1puKlB~ODIXG2q!!68HV}VbN*)-)AAmB{&(l6kq z#@g+9cVG4NlWJ*-Fv5&JKYCQMBTNPqrHTR6pf1MyKjHxx`j1UBN(=xoin?a}zsJS4Swc z`IE>l9wealXF-9YT)&J=&%bU#RSg67v^(=k>goxqj9;k)eM>Q#wHIiHijv%1K11F2 z7_Z^WPV&xd23wkql@Tqa@laR^LV%po%A^GrHZMwgNKJ-_AIYvQzH}cp? z$RRHSZbj~8E7|w|H%>q0aZo9L!-s4~DXnk@QbBl2HvT;yFS9`ytBurTJ7z!Sl;hG$( zC$XKY5aZx@jUmQPdkbaLVkQ5a-)35rl!mX}SFZB`Y;ipDr!R&6z~b^|A~AW9 z7DLdoV=!n@3GYTM2=e#HDu!K;_GdhLh(}1dXjY^?{cA}ogId_A>|?n7Q_a4wTkRgR z{?n;XF;_lhpFv3wwo(FV{Lc~cz+o?CSG<722RJyMG`mg2r!1IToR)cTuSM;A)~U1W ze-?@ilZzpgzB&kc(f0eTWQb=@)k$Bopa12diGkOuGWQ$0JG(W0W2dCEVv!LdV01-A z-9_$VSy*h2b?l_X^&;MUGr|c~gqS`!_rrqB+mO|?g}AyM&(zx&BEx!K8fWTzt{NJ@ zO+^y0=Z?a}QQ%IHBtbSt&$S0axVY5RJYUt0?GW|l0mu$P0unisn3NLKQ(rRKSlN*x zZqEz-i3&qBd-P;KyaA3N;FGX#&#wRV?4Y4vUS-Dk!m7``=t)6UDGi)^2+>BV_JT~~c-gGee_47jOmq9wchi?Q?bkC>UXn* zdYl0v?hbVpU2g}8B|_TPSu{4o!qnPxh!Iq^;)=;9ob)iO?v&+Wv#x6 zh2@oq7JM*SvKmt3^nd>Kow`ZJ|gyUFEiQXx3=P4RLbwzD*K z#t()lSc5QUSF_OxK_=Xid?)pU#rRQAyhUi28j z6%g>4E>{UA;;{42YVygQ+tOe9z`*u)*ZVHYzY0n&sd4r!WLWD5 zXF=ut;#uFisyD8E@qn$1WR_gaP5Zl&Ngh)%2?4R(B!_9s_3$#Rq&zBC1~~KBPwW{l zs`I%@S#hq-K!RyxBIJNUD-!XV_Xjhs*}xVlZrVcVFv z>UE=jXqU@-#{s1bPtT$Ma0Y3c`qmpP%RX*KkfgO5SB-d%{Nko|u~{vZT(ASLP}Yq?gH%&w$+k5F0z0%j@@Y=+h@$!%vm^G}5M*j!+gS<{k89p{+vP+iD^mV_n2$=cApUo}Oy&dfl)aZZGS0W_S}|(iBcMRyt8$ zJ9$~}DJ0M$nc=|5j#^YEBw*kfa#rwADgjV_M(|nuP2WC`e!Ora72Y^ApGrnk;d6DU z5J30o4PrTW`>rQ?pD2K+DUI_THK!HW{VaBfqpwH41h4~REF-5DNf{d>#K^#^_LL`P z`aYzE;0M2Y0q+G@WfMkzNg!0T{&9<~l=p^n)Vy|)^YJrLRdchm(=*YNP}T9tLp}$4ss547$zd9n&iksMnoG|hDfwS0 z+ii$$NWz%AT2NEN+mgX#TRs_pQl-b_gsIK`qX+e*n0r3M_kbC6%}?o+QvQu*GTTeO zncYCSXoSH7!UfYvL3z&w+t)T@PP%J?viogNDBQO2#Ji z2;%q@MxW0s4ffJ4KKv#=cYE)dbM4%QPvSDX_J!eHtcSND^Tq&wJ+AKQy>lmD5IY2v z&UA5Ip#U_U5a!HedM0O6o3hfHr?~ePE{l`<^ z;T9w_iDmQ(HreQU=T^X*Qp?tv;(N6X=Ac^*GbBcL{m|q^I&`0SkeHwCw8^K6s0dK# zjoa$h`D#KH_>7(Oja5aCjYW=C;lbz+1|Vk6#=v9XV&D{fMa%FCP~)v34g|-}qAy)s zD^tZLf>=9i)cQ%5r$<$lZWR^o6;&P;Rc_!@Rppi{>Y@Kp325-yJpUB zi=GER7J(>vd7&u-EV)q1WW`FuW|^n z(E$A9!|8~1e_+}IQMLBHn%c8&F}+=f4^AOA1EfquPQt|Hdan_fwd#_7^K!Wu`pIoR z7=lrTuZwLmdsb|dCQec+xPvK^m~+tS*I-!EPfaQLqUSVU*(5_f!g`Z>a+(2lC466|Ed&K{WMYy@90m~Nn);kk zM1+Thhn`W$nWLE(LiS8gPjrP?NG<5cTN@%zax%znd@2!ieqnp*Z=}<986V8`tg`z0 zU|szBFqWO#TgXK>#fBY(Z>ONN#+TH^thcEn-AN!VQ^HY|C=+QA|oImA|fLpCnP6-MnXtPPWX(9 z3VacPzf!F(>ghq|@$f<<3i%T?ki6Qec79nvv&}LI2w2LsPUVD?*7&Y0y^!@koE~S_ zMK&!SQeQ2MmX;DE8i1?^hM+ZJ&XqeYPx`~*juC)a?eLdZ|8)Ytz9y*nS`+4Q|L9t5 z<*&WR**StK5runtnut0-NA-l@pPn8b0+v~EZZ>KQK0iN?c=nWl!}vesE+l}RE4gq~ zJ4@RHxI&pa5YNWZQ#1{`hZ*ny$JwT5omNSk&&Ab((9O-uySvw?;*IN5J+~n9qrfO? zcx-tNma{j|*ZnptV>H{DN#U1H2E~(mG=A!ZZB9-Ttku4|K5h1m$Lf=;WxKc(tGoT8 zA-8Izdh>;fTUCDWB5_D$%EJ3@aS+XjS^OQta$Yhv(QP`|z1~~cd^dMpRl@k9z1jav zD$xM6r|h~FA|WlAZO&^*CE>m;CC+n!ayNW$}_Q)ssBOt1m!m zN~D zXxjmsi^Dsp{1|pH&Zf;VzQTNZbkuav{7zi_WK@m%DFwy$LE)YMVQt)cDOe4>j15I^ ziUSaaP}En)4jGhlr8~2{%!y&Z={J1&vq&h1SJU-AcSk$Kks1oU#a=T6P%w6F_Ul7NMduQ>^(4wSAy`#VwJnalv8NkrMYv?4I<@5klNJ75%U;$wvUZZPvZO%61c(Sn1#jw&A%DlHoCYe9& zKJY&4)m$O-?Tf}H{`;3td``s8%4ITjW(rGd8cJ(?7tf9=3lnPB=idVmCTm?taaIc+ z6%U%i;l&Q1A`W5z<8(U!Vj2G`bVu{@G6+6**}n;5_&U?dz0v`+2Z$c){S2uIA&_w} zS>91K?p3HbbalQduwNjJRI0irZB{d%U!9TRZ;4jz5nSpJ<8V773aqUaR;{yYyG`?V zL|iZc>6+UXICmuA#xk1LSY4fpqmLr8cBknRw@EI{=h1yw&{v&0+XZG|1fKQ(^(laS z(s5&plVbdT9Lc7)O${E>K742t?Pu^i^K&QRUHS*QmD6@n)z!s~RjDT*?81xZZ)=bQ zcE-FOfZXHH{CH0%acYw_h=se$^n^9}pQ(9_)>b&``FpF);!LmfYwoU77w1*^)%HUa zmA>P=NBX%qD3m<<6oppUanm&Amk*X+>mDC@uzSraf{ zaEj5+M&KEV-d#urEi?DkC)Uli-gL&n;}Skg=;6_=tgfNz#4EG}K3j9+%=U@x)hd2p zlV_;|JMgmO7V$j3*;KHObu6`N)&D9$dn+^?h?d?9-q>h(4yHSc{v-sYD zO>?29SBNAX1oB0QW#*Gux%mp^EZZFD@0AL9@BzADd=(U4JDFUl&Z1XgSS8E*(e*Lp zdq%miZtv7sj|PmK+^tur5eR9Gpa;7_Sx(v8*d&_4V^~G8aE3oz%HbRGqA{4kN-?7l zKcr16D2pC+ZoMX2!14GVCE8?DB55%3m4uTsaIHVN=`!-5OvT<43v!gavy&dosAuA0 z6I+$@tG0df7`WyE>?Y`$r}*|-8Nf>%JoXd2Mz7iEi(V&4jyDh5JyT{=y|l#2D@%Svtua5>@A4FARvpXi%k~T zCcoX>BdqUMK#A$^nivPM4_Z9hznA*@8!uK}LL%ing8xN~>=%H?ATRD9LLXXJZ3DgA zLAet^@4vTXaJjzJ{006YObXk4&TZ|vA^^gdt+92aXq4Ydr&7o-wn`01&`|`Z)IEHA z1c#GvzAN3bpv0>5q}EgD)uzEV-uOt@5;gSb@#HEP_~ytmb4%vGw+kUuv+$MolN8x` zIV}1D7VDX{Lw-;a2!UIJ{@kcEhNa3C=LWK|gMI@h_|Co(_3!**3>Sn&arTml{ms{g zy*9_rskDd5d_{Wu$IyC>5m!)z2Z~&1h=CY%h@+0hAS(qbdKQe z)yU_NZ|dIK-3i@c3@a{Rxs#kzd=Uc^j~e>41F2^d(*SHN=SFI%!42H{Q&wUWo$5ug@J2@rYUtPFU}f39J9Oe_ zRhSxRB5-R@^F*(3Av$Aco~@ZZ(^cN+{89^htzTaLLpX3EeD8;k&JI~yj;;GZ|D;pm zK#Xyp64o1ShXIY>-i{k>FDvj2F6edgULnnut|^tSf4jS{n*bCm2YfDd#9Ch3ITAY< zrmRyBM1K1TtiTzdU>{7>uk)KG$cu4&uiS{JQCmY(K!U`pG+vjFDP3Tj(;M?H6iIu#?NBvddqzTcnB>o#~f zIh?0R1dwv)E&YLv4NQ4@Xl%%Mpt6d0^9XR@Yo{IkCez{I(Y6pP`ZQw>?erN{w{zLp zY}KZUp_t#I!cdU$0nJK)MIJaJkzI7Wd6F8E)NT#dC;##R*CvVllFuQ>$ab4tiL3*#L$`riuBW!89NA>*|rfrp$8}i_5L(kpB-kMz-#2RT<)g<{aU8q4wko zzrW_k=E{@vpI13;c*X-&_~9pCU~R7@UkXcaT~)#uAJrl*gg?j872OQIYH~6O&!IYM zPNZ<(hI8rIs^D)tX`VvUDf)qjY^ecJB_F+eF6<75@GbgeN?e2jyjjJ*kgv7VbyEHW zavua;mQ^YL`21kMdJXx=Sf$I=fIgNi{CwHK8c$qqE}!82ZFuz8uAv*z)wrQ%OfK9! zOpZ4C*YB#K?c>0eqoR{!i(v=8u#7uWs z#_v#+#P5@WQ$Bl!$hp%`z3b@F%~9w;IZ+H&1WI4vczRq);|RKL^=hf-Z(QUn7G~D& z-Y!DmZHale9|i1c;QCa{&ikRScSdQ!XSrdxd2Kj7*$Sf@GDw zw$EIn%?(wJNAUTX+^|KmU93yzwuov(jHYQ)ErL@`rvyUQC{$@~D!bLUI%4o?z` zbnK`h54iOV9Q?Py0ikKG7+Efcjj_GTU~Vh=@KP7N18^3;mU(4>;tfg1Xeta52!AhK5&i?_NKL~KA(vFxXy4OQ81jq8+ zOVBJws$J@yiCkD2*D!D$zmP9DPMH4EDRwVJSaE27H7|tcC;%eQI{+_Wr{3cj(UaK8 zy|XR1OD*F2+t{s>ThV%&3T=OWTd)rpWEye+1JU;Ap~KZ`{#7P3hvmTcH`Z>xS~AL7 zR?1c~Mp{Nm5Vc)mtvv;qOc(0@2=i~R?{ahFgk$XGA(9tFoz+?j6upQ zr=48kGuX%Z!Mo=q;Rs_F%_8^0UaQK4*A%KXzaGNDk&~BWJ5{<7$$-85bj{j>T0~a| zx{wKAssdU&Ed0?8eRP5Q_EQM0hm1T~e1^`q3}GhmY8r6|Q~fHi z(RJAHsF6p_7G54=(B4IWGSVH^)|Jcw84x!$%hiAz)VdCec>O*1MVnMw=!+bOi7YKA z#wYt%Y{=Z$VRCE_nv|L;gs{69YCoeS46n8K727jjF7|pF@e;$2JDoGOl|uTik2wg= zef{gp5%wNa&)DkQRvhbW-4lCvh!FQ6-y{{?|E@+5W3TnbS?Inb67$-Kf5M)Idtc%} zo@j9z-(I`kJNZU$fpTU7KgA4D;LNxQ5CWLkWnz=Q!D8bRW0MnMX)y2|8y^?9%1HDcNR+lYErLh)cO(mQ8oVBm)n zrj76e56RB!k7ZNOqOQD^z_ z3$8Unx^O&=`soE*k2)b+yu9h{#~_j;pyL;Ikuz(*tmQU^X+jrTB?~bvDy~(_4RiVw$-K@2!)Da4Kuv=tD z&TYt^6wt|;I^nZ>$VdwyEJ%V*BTHRfb8~HTX>CPyZ)tC9b!l&N^AtwTH?E`u{I>3S z!=nq}og0su?MQbGpOE2E`(HwmV9Ga>S2C@X7u9UQXfsNP#Qd^X0ekO&1UEnKXTm zyu9HhHxF;28LFtfo*h>wJRHcp`HH!Ped8{bpvE>3%SDoED7!w|!D0 zESi=M$Maajtv_a~28hg3b)^I`OlNP`l!_K7w9j>tF@?1%FvMog>-5efBUAUDQA%RL zDTY=wLI8;u@pDbO(D{LV;FKTzNzFCjX?b-FH7o{p;e})%se;0!D0VtVMM7?%jN2YgUQ&xvknh>fE zVDuHE`Cfj?71QVkOv*(P3kblq>pDKv*I9|!1D1)8D>p>Xz`$rl$P*emPO_hJ7x;k2 znc9>kDuqjey!z*fh^qc3nC!p&XI`hel#)adEWZ zzcbHD?Hu)v!X>rF`m@>byKW6a`oz>=f3rH)lu`ubQ{T#TBe!(oiFB$$V zaLW=7bo7yn26;+`=SIMwEohCo%!1B#UT^d2gA;W8!HJ9rJwM`QWOUyfs1X<(9SV~a zdl>w-)$r#FFoRA4{Ono7zgu_JD2}#o7AHXNoSfhJ^t!sA+K?0iL6#)M^=nnH!Y`u* z%M@_lJqIzk#(4TZ>P{K1T9a@h+t~utR|3P?gCJVqp!qnSp6|WzAM(+6hd=GOp-)8w z`1lwZ%^i1{{NL}QS~>ZB&pdiACMH@r15J#LOZ=RBSPkk|Qc4isJ;meD#^YgpA805z zFQJz|6!7KoU5VBYFNq#`fLtfMFYt$>l2WNh273Jk|IS$3r=1+;(WnmQcn+*+UW z7?5Fm(T%!H8n)=C7S!)px4z!89F5gVUcX^bM!=w-ey?v#RHAAzl6lh=H&0DWO8l{? zALkNg=|*N(uR&;tsW3vRj=E8G?C;`--U@pe7LXFW zsMo1;xBIwLkcK7&R;$1*JUv#SQ$Ed84@}^26}MLT_LMbmyn5J!=cm&P{sOvqq>p(U zU|}>gU!Fhut$bky9e6tamyIx;e+}g)hW^xl_|CI;&9@0>C!p%1=850sdEd?s6{ds= z@>-clinPvnN%dEGgT=(z%;j^J-|1ib!V_(M;gpjnU07n=7MPY7Lkp@HJcywxE%Oz% z!N#eXud}rK4@~X|QqkjV#txZlGggYGFja2x5^ zMmg{^*JTZpQw2Y63Y@>QayRCcM1_Y9g-oH5D&-7foQ=heZ71)hDdAw290w0LFnAv$ z5!%Qc#Ls*SoZ`-#Pd(!$5eGUvb0_a$%r;9Nd6gAa(`ZW{qWNaiVR3y-8FLF8XU!dL z4;M!cRyuJ`h92uiTHt6yAjDvL&R4x+ooYtsGL+exxSkgiQySYQI}8e8jaVN8zSIaBh2 z%HR@R4~@s{tq=CDS$f;i-e0v_HL`P4ni}ADXmB!dQK{UMcoCXv4=+N*$IZ_CEi3kyI7L3~^LXdlBeGiB@V~1v$iO0rhVdG8tKG_ed!?b39yOHjI6_s1)4k;rd3uQaYNc{3$6U_WSR33Z ze+=l(X7JzPYgNO*hx!ZPvsmBWo=!_mPDy6JIjRu=YSS23Ie37xuTKTnD=7EB?5}V+ zgvzar!=sC&IWQ^V2Fxe`rXR9yq>+v`r!*T=SPp^QR=>{@6&|Wt^+%(WwnH-}F2?WI zW|?8&#aEZ7unL#L5flmxC3+Yr9Do`dnrhnK%ucDha|3K?(Ed_KyX3}VCf&@;Uu<*J zWuhIKuG$$tsnR#a`q1O{mwri@ZLM48@eIEx`up&SaTdeT-!NHi2o=#>kjwaA^538D z+@-jGzevlg-Ae0RRCN3<_ea~Rs8doMei^_;-wAPcApX&+c`$c|-0`iYD!@bm-U5O` z(#X$a?HhUGTxuLy_4O7G(&@jx+qPH}|NGF`U)8|xaUzdt(D?WnK+GZFS0xCx1|>2# z5I1*bap$&6y(3c(61m*7Z2g*WXcy{JF4tXfmxAZ{a}i|kxIU(Vb0XYR(PDcI+l&q?|Y};&1hsao@*k<|awlR_Je>aMP-iw8>T6mp?n8 z!@xWe3}C)9f(8gOqJ z!&Jq2U^OX<^&19qI{>+eV>LQnw*M7!y%vl2FlKdcutgFvkxF77+OQ2>;>N@W>=#iv-v3 zp;0$MPKNr@Y+uJc;dK&)>H1C8QyF`VX#FGz6o%*&7EETOrnrD-yl-@D{NX`r1EbJ$ zAuijm<>lb_ots!`1&2-H33#6l>gPnRw*I=^{PGj<%U~#3+P`jAw!)t`oe&>>fVpL( z!KL7aRVD=Jq!E6eT(gy3@qw3=x22Scl<-fpDRnR{2On4g;$z^ar=&#jYa~h9(`+}m zn`lg)9oC@ueN^{7+A-&9b>7g)3Jke?BWF|ZioG*&upr!oy>`Q{+JIf9|NBeV;qo;{ z7o=(-WVbCWUg#mi!0v)#vqP+5nJ+cG;pV2Kt0YO@KB#ORN76>Nvxw#fdQ6y|0`wl) zn~Mwh8foGhaa>iU2dEVXy5`ng&|xNB+uP6SWZUyJh|HH^&KI^Wvfldnlg}wX`#3s1 zg_Zi1hxce=P&Izb#+Lz4nuxNT=#)-4yfK(N{vGqk#OUd+Kj48GLS(aRC9SPg z3)lL$X@DniNV63Zy{$SH#AoWIdPgc7AfS9LxZrWR`H6jp!$%6M-E}a2hZ`^+BrUEy z&cTo1`>(#P?tS&l*pxdhFL(3A$94ltcccEkC{aeG7!3bhVfZKFR^g~AoR1_SO$b4c zVL(IdEXrq}H7?%03qEH}VMjQ>Q$Tz=+WH(g_beW-wf}h0rQg=qIs&6|Qh>^7LGz>u zXJ}Y5F%>@}E4?{@2mvs}lJC~lgW!(t?lJbYb}iPtBynb|ByO(mGS%~9XaBrir#p5r z_Uk(_Amx^3{-lbEy4oCuQ$W3>NNVac+``XUxC_AM%2m${4o=3WSp8#XT0185sc@Nw zf(ppz7(%K8=`Zye_eOzB=9sdA*tztZ4g<2xc7N5zj z_^qb8J_xq||EWw?aPW^vQUx?Zr}K@0pRRI!$pQuD0N<7M z(_`uA-r^L#oq16!Q|&tk^k!KEgWBlv5G@%W_G&NM^iUilg#*ul6p{~(dmwbRY?w*} zeUJXbI7tKlIkB0vy}f-@H}B z0)%NGQ!cS2E``->h1Vh_1$1gb0)*DzY9QZge64sf#C3H01OD=|*1W(ZCRm=p@Vin_rE z;{UwtbJgi}zZR!m_+vsLjt5Q|T>R3j1crFiHV%lq`!X0$?0Pg0w^i=-TSA{k{X44(kcR|9uNS2s+?}AIeMk>G!LseB-zN|J^zQSi z4NuwS=&^aQ!5MP!&)lt%|sx1FvA@+@|4E8*-7^M?*NcoAizyj0P$OYFS-x_-6! zZwwgfR_?gDK7}JJxp8nn9>cI!FuD2ilv;A{y1~mDmXFpGQ=bf13!^mqBRlkL;mywZzs^64fe8<@E2DF|KBv{=4#mYN z$!Z#=%LDP*mm{m;KygFxF^Fg@d;9<=^QG|PjW*_Lv*j2)dmbbb$ z5IeKCB(4ea-nK81AE{{=*f&jld=V=nRqgwIS}%A`znRyN93t}=YAI{yFqag)%rAPGmYTlJo#KNN_#~D)vz|Z?5U`|S=CV6}bvc_GkaE@B zW(|y|@i=GzMD)SpFi$i;7Uv+*T~~n^|?7ZLDVlH;S2YDzpHEQMH6L zaSd&470->4{12Apt^??#^S6O&mzGVIGz1H z==OfJ+Vjwx$!+PN)RI$#fRHZwoj$(Zo{^l>j(LEPrzO*=cCZZ zrz-~IK*;Dp4+Z2`$J(I|z?+G$#lA4?1w?@F(SZw-Yc8^^6!C~2)N6DzztPO|T zDXx6~KkP0Ep4k7BxL1tsmG+xRzv{}u4h~Q~`)iHa;Bu?O0QK{RZ$FXM+y2S^#_l+fT-B-i!y9{ z;|8@O6TWY#uY_%rLW+y4ee5ee4vhp)^4=I=$d8#F2uTNnuOQF(V~5KX$Kz~_&1ZPm zQ<4Ay!OiLX>5z(QSa=0P&{XE{&t);?vN?;P_%IKji;G@Szra z5-#L=ak-K|y7sY|ug>s0xHb8e`yKbCAW8mkD99d^_@i^*vdvxn06rQRNd$5H*IQ4j z7dyPvC$sh^ZkV^R@8SdG9W$M1Wlib#n)f=oKUrUmi8T?UsJZZPD6m2S9iZrb}T-amWzRDdGdO9o0hugP0?PZ8x=^tg>BKx0ujcu=Q z5EA4S=H%t(<>nXOGzXWOEyUJ`hX-Ykun%Oz`bkJhI#(VlK`%dBY8KrymMVKJ2u(21l#qrDpm9Wn z#d$^f!8iA&Im!L`$D#D_4={so8CkvkqJ_PzBdfc00as2-eO>6*=vG>6;qs+d-Lj7W zJb=By<)CD>$P<9nW7swzmv^FuRP{WWtfJ82<~4eM_;d-#>L8fM2%zG2*$E2DS)V+w z^@{RoxpznxNa*&wL60_9ztvGQ^*a5quL%?(8C^vb&RL#K!-<+C!J z6xMPVY^;e;6KSRhhXIXBo>AVh@vZe~LgS|wy$;ROgTwqSW1IrE8P_ug(2dvH#MxFps9)V$8E>oE>e?S&1JNmYa=Vi5H$-A@0xAa3v*Z1NS{#+$!8d z!{84G&fvmFHN!$FNe?$k8s|#lZ!0ZGcflW3o-2@AYo~04_pJi;7zkFZ#q0<@prO1N78*l z#({Q`==79?lropJ^jvUpJeo~U-KwJ`-qO`C(Y$#m8jTE*yJj|1+ zb7JUrY`?jkJ{GBuB~14wH8)s07nDE!d8rOYsT#NSvG@c3=%70-je@z*qoJpenc0Kv za^WnxEBn>P^2Z1vQH64Dwf^@?3UZ^*dJV6ffO_rxY2rCzPgQ1r_x8KXoiBn+@nvxJ zao;xv20miJil4nVMqV{Tm)sKH%ucKwPIt6 zWMpKNUjV1GU6Cmbp1+`s+WUgw5h2G3zMDX!9!F$Fu~D#btVV3s4!~z5c;J3=G-tg_ z&Y=Z7JAB_`xeOza>V3ThiqRooya3U2RIIVnOW*b4?H+8@_3s{@kNf#&IJB*umXx5z z{qWg@I|L``@KSZtzx@R7#diO}B9&4ZN+xoPVU#MCk?HG}C#5{2Qb*Oa3-R$7Q&dLW zyZvTR@XM`-T**!9pu7}Dl-UKIDBsXp!3e*U3IGf2TR>O&nTtK^+M=TG&3ea z--5M3EAP<@1G@S8!_7OWwXWq;J>^~)Qdh#e!DTM;U>8cfSt{g-FOj-D2GsUO^x zfa&;OOM@E|aA9I-Nk@Ql_p>m6Rn>2?3~>USdjRd0hXl}oSb#02<%f@gbZM2o^*kXG zCJlOD{T&q@+{t7&%HsKKl~`REUX$ zLSR$D54g5#kH4+GJ#bWj3Rzz_>5H_?QxrS=>!F|6m3`y?A7Z$xWg#r_{USpQ@Lqkq z$E0Zp9{hK^6+9L&H3P1aqTkaK`aAlu6NXAYKc%9oB?Uhhd=}oHE$BtRU!L9F^*)N* zYXtx3iAA)+w=Vjanlw3G-BfxuMW%QVWvEy+$TP)vWdmR0WbdS}^}oBxAIaGxqM)87 zAAxswoSKHLT3vnD)s>>&`vMcru(ljt z{IMxPZ|8yXNZ?UC90ef>)SyxA{H+mlC87k@8 zhh}ACt@bzpL9-oR9+G6CJiOZ_Yzt>uo-}>NrKo25S=(6lE5|`lXQn zZCqVr!^V|#qhNG{eo(OA%-S1X-T@GudK0lf%MPyFaPZ&mxlvC)KnDb7SWX;`0^J|LXN?rVeQNdbb(ysZUCNmo3Y*NX0|QFCXj`)3n4 zK!0vr1Np{W=z7`0){HuwSYu`reGO!@*;MEmHpM8V`i59~QrwvdXj+2rZ3f(K4K_j! z7XMeS#&qwiPMKb=55HeOT-vz;l1QZ<`!F)Q-UE`sS-%w zfw!+Se|gdn;ofaS8`2YerH`>1l(KX>`SEEbr+p&UL=ma;~#oXWNHv1i{Q8Ca*{@gLStYeU&07%b$J;Rks8Qy8GFm zx?B_;(lgS#nwRIc5&xLaCDJNc-D_j1Sh!z&b9usX1THgU`mVFSVVza(X8q$L>?i@z z2_xjbt2=RVgw&cI4-9d;bR`b<7>4e`jL^WOr!$H{=_AUjeN?L(}oqO za9r;z#R|ag*<-JoIyb&9s^&nhq3^K>IB9&Ejh#Zm{Ce4mz*^IsYffBM?+W(cwXpPb zzi+=*fRH;8d=^MWoQrU6F@VYNp;Y|g)`?H!Z13auF)b0+tJTJ`4bck7{>P}bg8ui; zpCBo=Yg2%^V>is4Wt~`hdZ>L%@ySnnZ4GrQY-BFR0C*M7p)TZawQX2_10za+?T+Xg zz^>5PqsN4U1!?^gm?Otv_F=hVm6P#ej2rTojs@2rJVR8IRtS}oD7spDLAd;?RH@Sg zt=Hy6xzd&|BQ0-BmqvTxZtQZMvk`J*n5NGr9G;Y?rpxg=kX1@^BkVZ8$%{uRo4-s| z77Y*KZKY_>=qt$TzKN-Dws)~NadGje9&rk2?mjqjePn74w!UY*74Z>a3k+=D5#1Wl zyS5O>%fPUX4y|LV5PX%f!F5BaPC`*%lP-IRM}0MO@^cnEUuflKV(a1ULLRLCM(xWR ze=FfMQ~kAjF|s9=P*ySn**F9X8|LW+Bv+m^^_)Y34X8)n)kVP@|9(=0D>9TZ1)ysbIqt?jSO@?#~jmmOk`k`z<$36s8|CctKAEsRP7yC(v3 z=(!Rcm$go_iTT)5sI?LJF@eK{*ApClU+0$Ptxn}Ae6!fjnE(AWqAGm5@9cyJe|QJJ zxXt%( zYM(+g;3)mF!POFb+7Nk-@!S~yCu`OqsIJqge)>iWo0rb(?HmyAA5yEIcDxwhg^_j) zs2ie5{}^U;^L!|Mp|zvqK3>UL~#j2^MS(}i?s+ptX!mpuue|qs~vKOU5NAm?Cyq~?7x~hGos9r$YSw_d(!HbvC4vD!>G zHYVy#%)97Vwzzk(M>wqJAKxXPB(ByrT2T&~I&lezGTb{%aOh%3n4smid)HtI%9j+@ zJg&$2YkpUmUS-NoSNoNVF*l)Nhs_&8F=k5S*W3-PF41LGR2d zrI*~gua%*k`ej<5t2h4E*@zp-5CQYqMv%Lb9nA5!ew=5SO!wGK&`J+{zH_;yxmxnF zh{P45BqPoShjVT!EEz4$BkLM2I`D{PZ_N~MG)qY>yx4~6J%R~$lAt^1wrRvSPT5&b zyCW;1cKfx@axsJ5nr#*Nuz;CkegpDLaLSl!$VeXx|3z7Ui4Y znw7t)s5UpLJP#?6J3Jj1p*cHpW%g^dt8-JM?nUXxMYH|JUQ6)|Xxp2wAM6jo?0;{N zx|;W1o3TTC^?{SD(*a+=IOZ(4kr#X$n)^l)z$Ysrr%6RT-H3zwrDBCw}0V&Rlaiw zp~83cq!LM0YVEsWoXB=(CAbe9uJmFmvyLR+cn4jyltHEjq>>(o=S9*?j@ruS)$!FI zQ%q@%#iZBBFCu*+|2BaJ zL_qK6zb)B~9)Qt39mG$k_c@?f~I7xoi0W zH&4m#${9zdUSp4$1|jNE=bbvE9zp#G#m`kajLSId@$p&yKB6+qkcbxwsS@r%hLp8X7MgOxAX-Ipp;Ld+t z4qegF*ruqvO;OK2{TF4Yc!h5Z$HF?@{I%;&2eJ!yt=mv+NI+MNT_t6>GN92~C~)R4 zo>;}F)j7AgAz*nF5An|d!#||o^hPqDkXjFDX#X$(`%*Ebu;&L3^BWpb#J!i+?%LmQ z+MUhFwk#9b_S0owXwf_Vl$vRWXGL#cw)2(TNYW5JzDGeeEJXUkUqPR%f9lxa^qpA1 zT#8$0t!=9R+C6#C1N0B$sVJH#<+&QACZ2fbe$@bF2*ZeWU z>MZyg$#JJ2B!2%!U4k=d#sRiR2Wt2BLxgvH-prcoKwz!#Q0lF#dKsOtZ~7kHz-n6- zbu?>Wdo?C+HwqrSO9<2$!dCyv7VP=#c?I;cnS1=nS@aaE$hQ6h=1b)=C!?N!9?H=< zc`R5#_%EW4c=(lT3OnveTHq&s{LC6~uZN^2(3^-NH@O-`TO@e9!8v<5?f2%XX+uYj z<@GYK$v$SP|4uO>NeXg`W<2D6IpKCPLh(a*s`Ay`10l6F#C=3HjGl~Y=t%9bKlTGJ zv<>p=R-@U5rca+dIB?`^_UT}MHz8)sbIdC7s=O$8uaH^PZ`V7O((_6QZO0Ug4Z0PR zh5|KCh6VAq1)80WRYZZ6Ax1CU>)v4USgcd2ABu2%wQ3O6mM~@W6A}(5AqZlU875ES zmvu9|ytHC63R^7M#|t~OolCtQ+{-q0GBiCCc}`a%vI7FY2xSYQp$4~0?-Y|(3s`-< z9PhMKS{)TY=g{m3qz8G6T5GL(B&(%>iL>-YR5hdW_cG9Jx7PJ z*9r%1&6ozq%3O4P;-*u+jcZvM$K|(JIR9XfV-Wi2B;OTcpw%+rp(5;{OZqram^mpj zqsj0++tygpjXKW7bCCJ{E|~6qic~%Hr;qpQFyZQa^!T1WWjnjjv^Sb^YVf0+mhdr1 zSM6I`+DF)SWD%UEb3QGve@xPE^_^uY2&&Ea$3DF%KVSEBr%$PF-&eC-DhJd1TF-gfM#cJIQ~>_5f|1*?a6E+=zf?Eb?|D3z3XJDBv~5u(ioW zJTyMOT3J39)LrIiKh5ukZ%8_Ap?NXp5Wd^&rMc2;h(WlOUXIuXrv=##s6nUSq31l7 zu9sn>eYV3gLn}jTa<{z}}dsb;bp&}Wdo{nF9o!Oju&RILlsN8|_ zwd0(2rU9YIVFbO)s@Pg`5Typ(6+Iq zgI8djVst~gxwyc8Ny7DuoB@#un^+)S?{r53#|#;gH=-tk0FY7 zC?3XNzMF6Y8HRMv3AA1xYRc?p3~E#l2|G*s7N$VpQ6g=dirBgj3^um!MhItKX0M;$ zOkTa)bwFdcOz#^RE5S#5G+RHaoNnU|DGkeRR_-|TH7}pt{+hD3vi0Y%n(Oka#@Pss3fh7Y5}9hq~g)0=(4L= zi$uQ_gq%1$b2SNF^ zU|~1F+5CcWlD2jQJA|33DJ~g$ms4(zx2DQM;mR#DD3IndK1b|!TnuHGItruOGl`nP zqmEcrtM-pFsLWx+s_()=jKJZt3iIA(&=JKQp_GX$BiLdzd$$z_?x%XHr`)wF;Zb^= zAiUSIf z?B+XdeyC?tGk|-=lZK_@R~>tvM8gCk@WBo-k+k|%orRV%_u$aDRY8DYD8$?4OC|3* z@*#Z}!L4!!1EYs`o#9$A1tRsmt_GOoB>FAS_KE@P z@9%;dadvxUZw;>nzmAo3L|0v&RWB9FNKrk}o2N94aN7eBxG&2sxLzsYfg!Oj1M#xM zlIO2P`Mt-!x0r}wUf6=7y|{Fpi6d%DU8dnD7nFFgBARC>X8Lv2Zyy=78>1l(+$OzA z2+`NBD5lkgpzgisa(8!r{TS0m)d~)&v<53G6WfMu=KE$`Fl*-naQXI9NVe~IC4_TT zV5$_()}Oir5=iS=>o~@Ws)yLnLVX0(;ihp9r^{+ z&wx%#*BJ4{u!BFgD-({sz`kb0^8yn~WLfrHglWAh7*HkON_&==*Fw?r0h$(~(}A=u zTIcqX?N9PPb92etJ30HAaVu{xShzJ^JBjeSjxhFmD}wVjq2-qQkT}@sq(?1(yr(@o zGc1;8cN}Wk4;w%+6Bb=FMe`#W5%&-T9$OY>)QVOzX%wXghb`USI~KAd%3dL$`(>gDO4yysw` zib`7$^q|hBSCtiYHvKHuSe!EawbDD&a$=>WMI;Z&eDt?$x3p3w^;qaGAD+J3)O!AA zmnGkIBAtrH{#u3oe=y%pZU6DfO6`x4ypkA_p#EKJi5&$0G52!XqZJD80M#3Oz@UsU zVS|Xw9{I2$A@<+ZS6z#P#;O$yw%m&ser-VIJZ#{Z2M zt6a^#WIDlsbBXTRfsv0u-@Z=&`0+-CICVs(YX)<%sU6s}KW1>l+NqT5O`Xbgf(%0(R~!?w+0PE}qMGN4)(N4AhTY zlrk>$(HypM^}Q9u<&JZ)i<7cbLCw1c9T7(U$M?Ah9bL}G8f@g^w!i z3XP*S9Z<2)=BU^WO4xAROa^sqMd}IDjsVAzWIL+M%CfFN%U-09}R2 zo|53(PUr)DD5g$jjB-5AXTBq6y$y=hr7z_*l)Bh<=iVoMe)S4TS^Nw5k!SfFrFK3Q zTj}JUgHj{{N6F4ReQ!iedrIx>`d3GLl9I+`3t=?=07Sw0jP|f;2P)m0*P7JeOTj$%jkVUeKjlAhksK6@7Vjf0|p+~MXk zTIv}MnY`Y`%ENo=sqGHT9W?RlJ0G8tvN9OY1$C~^^fQv^=9XTDzwC@WY}cJ=~}jPwx%9TSPL73X)G*po=%%Qy@K=Iuy52`{hg zTr1W^0Pp^W#DK4;z+F+83~j&Si5o73ddnINa+1mf)!7SUC6(Q~FODq;f&GXhq#q-KHw!y8`QM?gj@G9;$TZ4Xt4Wcu#O-BukFC-=AcuaI@ zMfuT^ok!dS2!e?h1jM9-aprZc$oxLjgE3boIuDTVUp-_aPHOf3=>V&`x_n+Fjo1HrR+7Er5drpt&b(0b4Lc7`u&*Ss+#Bq#;&gHMc4Ui#wl#g5vq6T|GAb z8Iw-9p%nF^_-;emr)QeoNAcLEy^!TYnhs5RJxgky6i#TeX&UPh<2U+~L>FidDxL0l z3Eb=IjzbvVTZq}jyKbukHq(*O%>_bnR$Dn6F5_$gsuTCa@s}bG9s2ZDw^+QXaSB$W zmW}^43hV1tJ&vWT`}xsj2ffg)M>}K{A5<}khREQ)9crduPKed87(b2d?rII6)Irk37(s$`=cNMn8 ziof-tZBj#33FrDkaZHe?>Mv+~MOvg(`TA^nmz2PHzN}BRiLj zD;%`j4IpU$Q=FThUDP)*%Ro3$C&6&{w%Y~DJ=^7m#G&Eh)?c4>wu>IzF53L_ry6g? z)`Ew7M%jTCw$)sZ+o{F=mqW*bR5>C~G&L=MP`4L=qaiKaAOnN@8Cn}n3*_pduS2c9 zwaJAUT4FPD`yXzs@LaF09xfgVS4gg2(m>=nk39lqaLzUA_uRBF|Jn3)vNmG#v8#Q{ zLmx|ryPvM!KHbC`gn!y<{dWX85C_R`uc?BG7GIumER5>8C+6m`ubeD; z#lbP1M`^W=*EnBv8q$6AN~5wOT3U@GUoFf{apw8znbz-wj@b(gu^#1UjIdzDUv5k8 zuC5t!_3|p;=0EEu`by3+bAQA+{q)J>lM$!}TW5h8xxUi}*K&rwE!B7Zz~Rbkm@t(# zywKP_R+%G^)$i3g{mF=ouXUZh`PWO?KT8BnnthlXq_tnOwXWjj**}*DtG;Ic@+@>@VL0*N8Zn31cg@?$)7t6R%&opsP!PZU zXr@y6o&LSF{LP;Js%6^@z22-2rbic^;SRgz(np1b{p|blz}C!7Q26E6{_c7YkCNe7 zXrXWv=%Vy16&009g?fL=aLqc=WV5J$jk>6W?+(HZHW3H9B99-X9qDxBaus8U%mBkR z_`?+jfU%r=2g=i3*KwQUMcz&ZSsWalp=8R+yDWR=GChalQrYf@@l{jb??9s;T!@)? z>+hF4Y+78@1@kRFr$7)7o;vAKiNuW>k8JpGDiImwgM&cuU^AGy~)x zq%Q7Sky>lCNbk6p7u_^^Kk?`vCZ+6ok2!Z&bMAh8Vecb&v23{MAF+(}6VI$Z=jq1rLMQ%v(eThgS zb&xtbNTki5-`n7wyTe*`N=m74M|eZh^c@Ytp_7OV z1D_?pTft*X2cM(oBqsm^kMti1Vt4|4K|JU=fCLN=Cmk3ddafa3fyZ|@GI)6Q@Ay9_ zLIoCKRPrMS@l(m^GpRIn{@Ig%@w@l;D?$bHAHxB4EWfe;&tm+)b@(^t|2cjB-&p_q z@86jJ_c8yC{cp_wlYQ5}_3QuJ>u+E4-`D%!nE&@N|F_-!#{R#L{Wj*)zsF4f7yS!e YiuIx%mYLoU4I7l?RIX+IbLY|j06YjA6951J literal 0 HcmV?d00001