From 3639dc51db07e6aae1b0f5114c01bc3f0044f41b Mon Sep 17 00:00:00 2001 From: Glenn Thompson Date: Sat, 8 Mar 2025 18:09:50 +0300 Subject: [PATCH] Add new blog post about 2025 dev environment and update website files --- .../2025-03-12-lessons-learned-custom-ssg.md | 184 ++++++++++ .../2025-03-08-my-dev-environment-2025.html | 323 ++++++++++++++++++ .../2025-03-08-my-dev-environment-2025.md | 249 ++++++++++++++ .../2025-03-08-my-dev-environment-2025.html | 323 ++++++++++++++++++ deploy/feed.xml | 211 +++++++++++- deploy/index.html | 47 ++- deploy/js/md-to-html.js | 4 +- feed.xml | 211 +++++++++++- index.html | 47 ++- src/js/md-to-html.js | 4 +- website-deploy.zip | Bin 111284 -> 120505 bytes 11 files changed, 1569 insertions(+), 34 deletions(-) create mode 100644 content/drafts/2025-03-12-lessons-learned-custom-ssg.md create mode 100644 content/posts/2025-03-08-my-dev-environment-2025.html create mode 100644 content/posts/2025-03-08-my-dev-environment-2025.md create mode 100644 deploy/content/posts/2025-03-08-my-dev-environment-2025.html diff --git a/content/drafts/2025-03-12-lessons-learned-custom-ssg.md b/content/drafts/2025-03-12-lessons-learned-custom-ssg.md new file mode 100644 index 0000000..83178b1 --- /dev/null +++ b/content/drafts/2025-03-12-lessons-learned-custom-ssg.md @@ -0,0 +1,184 @@ +--- +title: "Lessons Learned: One Year with a Custom Static Site Generator" +date: 2025-03-12 +tags: [web, development, javascript, static-site, node, tailwind, lessons] +--- + +It's been just over a year since I [transitioned from Haunt to my own custom static site generator](/content/posts/2025-01-02-from-haunt-to-custom.html) for this website. What started as an experiment to gain more control over my publishing workflow has evolved into a valuable learning experience that has shaped how I approach web development projects. + +In this post, I'll share the key lessons I've learned, challenges I've faced, and insights I've gained from building and maintaining my own static site generator. + +## The Technical Evolution + +### Initial Implementation vs. Current State + +When I first built my static site generator, it was a simple Node.js script that converted markdown to HTML and injected it into a template. The feature set was minimal: + +- Basic markdown parsing with marked +- Simple templating with string literals +- Manual asset management +- Command-line build process + +Today, the system has evolved considerably: + +- Enhanced markdown processing with syntax highlighting and custom extensions +- Tailwind CSS integration with optimized builds +- Automated image optimization +- Tag-based organization and filtering +- RSS feed generation +- Incremental builds for faster development + +This evolution wasn't planned from the beginning—it emerged organically as I used the system and identified pain points and opportunities for improvement. + +### The Power of Incremental Improvements + +One of the most valuable lessons I've learned is the power of incremental improvements. Rather than trying to build a comprehensive system upfront, I started with the minimum viable solution and gradually added features as needed. + +This approach allowed me to: + +1. Get the site up and running quickly +2. Learn from actual usage rather than anticipated needs +3. Focus development efforts on genuine pain points +4. Avoid overengineering and unnecessary complexity + +For example, I didn't initially implement an image optimization pipeline. Only after manually optimizing images for several posts did I recognize the value of automating this process. The resulting solution was more practical and tailored to my specific workflow than if I had tried to design it upfront. + +## Unexpected Challenges + +### Dependency Management + +One of the most surprising challenges was dependency management. While I deliberately kept external dependencies minimal, even the few libraries I did use occasionally introduced breaking changes or security vulnerabilities that required attention. + +For instance, when updating the marked library for markdown processing, I had to adapt to changes in its API and configuration options. This highlighted the importance of: + +- Carefully evaluating dependencies before adoption +- Writing good tests to catch breaking changes +- Considering the long-term maintenance implications of each dependency + +### Browser Compatibility + +Another unexpected challenge was ensuring browser compatibility. While static sites are generally more resilient than complex web applications, I still encountered issues with: + +- CSS features not supported in older browsers +- JavaScript syntax compatibility +- Image format support (particularly with WebP and AVIF formats) + +These challenges led me to implement better progressive enhancement strategies and more thorough testing across different browsers and devices. + +### Content Management Workflow + +Perhaps the most significant challenge was refining the content management workflow. While I initially focused on the technical aspects of generating the site, I quickly realized that the author experience was equally important. + +Pain points included: + +- Managing front matter consistently +- Previewing content during writing +- Organizing and reusing images +- Maintaining consistent formatting + +To address these issues, I developed additional tools and scripts to streamline the content creation process, including a front matter template generator and a live preview server. + +## Community Engagement + +### Sharing the Journey + +One unexpected benefit of building my own static site generator has been the community engagement it has fostered. By documenting my process and sharing code snippets, I've connected with other developers interested in similar approaches. + +These interactions have: + +- Provided valuable feedback and suggestions +- Inspired new features and improvements +- Created opportunities for collaboration +- Helped others solve similar problems + +I've received numerous emails and comments from readers who have adapted aspects of my approach for their own projects, which has been incredibly rewarding. + +### Open Source Contributions + +Working on my own static site generator has also led to contributions to open source projects. As I encountered limitations or bugs in the libraries I was using, I often found myself submitting pull requests or opening issues. + +This has not only improved the tools I rely on but has also deepened my understanding of the broader ecosystem and connected me with other developers working on similar problems. + +## Performance Insights + +### Build Performance vs. Runtime Performance + +An interesting lesson has been the distinction between build performance and runtime performance. Initially, I focused primarily on optimizing the runtime performance of the site—ensuring fast page loads, minimal JavaScript, and optimized assets. + +However, as the site grew, build performance became increasingly important. Slow builds hindered the content creation process and made it less enjoyable to update the site. + +This led me to implement: + +- Incremental builds that only process changed files +- Parallel processing for independent tasks +- Caching of intermediate build artifacts +- More efficient asset processing pipelines + +These optimizations significantly improved the development experience without compromising the performance of the published site. + +### The Value of Measurement + +Another key lesson has been the importance of measurement in performance optimization. Rather than making assumptions about performance bottlenecks, I've learned to rely on data from: + +- Lighthouse scores and reports +- Chrome DevTools performance profiles +- Build time measurements +- Real User Monitoring (RUM) data + +This data-driven approach has often revealed surprising insights, such as the significant impact of font loading on perceived performance and the importance of optimizing the critical rendering path. + +## Security Considerations + +Building and maintaining my own static site generator has also deepened my understanding of web security. Even though static sites are inherently more secure than dynamic applications, there are still important considerations: + +- Content Security Policy (CSP) implementation +- Secure handling of third-party resources +- Protection against common vulnerabilities in dependencies +- Secure deployment processes (as detailed in my [recent post about my development environment](/content/posts/2025-03-08-my-dev-environment-2025.html)) + +I've implemented a comprehensive security strategy that includes regular dependency audits, strict CSP headers, and secure deployment practices using GPG encryption for credentials. + +## Future Roadmap + +As I look to the future of my custom static site generator, several areas of improvement stand out: + +### Content Management Improvements + +- Better support for content types beyond blog posts +- Enhanced media management +- Improved drafting and scheduling capabilities +- Better support for content updates and versioning + +### Build System Enhancements + +- Further build performance optimizations +- Better incremental build support +- Improved error reporting and diagnostics +- Integration with modern build tools like esbuild + +### Frontend Innovations + +- Enhanced progressive enhancement strategies +- Better offline support with service workers +- Improved accessibility features +- More sophisticated interaction patterns without sacrificing performance + +## Conclusion: Was It Worth It? + +The question I'm most frequently asked about my custom static site generator is whether it was worth the effort compared to using an established solution like Hugo, Eleventy, or Next.js. + +My answer is an unequivocal yes, but with an important caveat: it was worth it for my specific goals and learning objectives. + +Building a custom solution has provided: + +1. **Deep learning opportunities** across the full web development stack +2. **Complete control** over the implementation and feature set +3. **Minimal dependencies** leading to a more maintainable codebase +4. **Tailored workflows** specific to my content creation process +5. **Performance optimizations** focused on my particular use cases + +However, I wouldn't recommend this approach for everyone. If your primary goal is to get a site up quickly with minimal development effort, established static site generators offer tremendous value and a wealth of community support. + +The key is to align your tooling choices with your specific goals, constraints, and learning objectives. For me, the journey of building and evolving my own static site generator has been as valuable as the destination—a fast, secure, and maintainable website that perfectly suits my needs. + +I'd love to hear about your experiences with static site generators, whether custom-built or established solutions. What lessons have you learned? What challenges have you faced? Share your thoughts in the comments or reach out via email. diff --git a/content/posts/2025-03-08-my-dev-environment-2025.html b/content/posts/2025-03-08-my-dev-environment-2025.html new file mode 100644 index 0000000..3e68211 --- /dev/null +++ b/content/posts/2025-03-08-my-dev-environment-2025.html @@ -0,0 +1,323 @@ + + + + + + + + + + My Development Environment in 2025: From Editor to Deployment - Glenn Thompson + + + + + + + + +
+
+
+
+

My Development Environment in 2025: From Editor to Deployment

+
+ + + 6 min read + + By Glenn Thompson +
+ +
+ developmentguixtoolsworkflowproductivityweb +
+
+ +
+

Introduction

+

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post offers a snapshot of my current setup in early 2025, detailing the choices I've made and why they work for me.

+

System Foundation: ArcoLinux with GNU Guix

+

My journey to GNU Guix began through my exploration of Scheme programming, as I detailed in my GNU Guix Journey post. While I initially experimented with Guix System, I've settled on a hybrid approach: running Guix as a package manager on top of ArcoLinux (an Arch-based distribution).

+

Current Configuration Approach

+

I manage my development environment using a combination of Arch's pacman, AUR, and Guix's declarative package management. My Guix configuration lives in a Git repository, allowing me to:

+
    +
  • Track changes to my development environment over time
  • +
  • Reproduce my development setup on new hardware
  • +
  • Roll back to previous package states when needed
  • +
  • Share configuration snippets with the community
  • +
+

Key Packages and Tools

+

I maintain a hybrid package approach:

+

System packages (via pacman/AUR):

+
    +
  • Base system utilities and desktop environment
  • +
  • Graphics drivers and hardware support
  • +
  • Some GUI applications
  • +
+

Development tools (via Guix):

+
;; My primary development tools managed by Guix
+(specifications->manifest
+ '("emacs" "git" "openssh" "ripgrep" "fd" "exa" "bat"
+   "guile" "node" "python" "gcc-toolchain" "make"
+   "nss-certs" "glibc-locales"))
+
+

This hybrid approach gives me the best of both worlds: Arch's extensive package repository and up-to-date system packages, combined with Guix's reproducible development environments.

+

Reproducibility Benefits

+

The reproducibility of Guix for development environments has been invaluable. I can:

+
    +
  • Spin up development environments with precise dependencies
  • +
  • Ensure consistent behavior across machines
  • +
  • Isolate project-specific dependencies using Guix environments
  • +
  • Share exact environment specifications with collaborators
  • +
+

Challenges and Solutions

+

Working with this hybrid approach isn't without challenges:

+
    +
  • Challenge: Keeping Guix packages in sync with system libraries
    Solution: Careful management of library paths and containerization when needed

    +
  • +
  • Challenge: Learning curve for Guix's declarative configuration
    Solution: Incremental adoption and community resources

    +
  • +
  • Challenge: Occasional conflicts between package managers
    Solution: Clear separation of responsibilities (system vs. development tools)

    +
  • +
+

Editor Environment: Emacs

+

After experimenting with various editors, I've settled on Emacs as my primary development environment. Its extensibility and Scheme-based configuration language (Emacs Lisp) align well with my interests.

+

Configuration Approach

+

I use a literate configuration with Org mode, which allows me to:

+
    +
  • Document my configuration choices
  • +
  • Organize settings by purpose rather than file
  • +
  • Selectively load components based on context
  • +
  • Share readable documentation with others
  • +
+

Key Extensions

+

My most valuable Emacs extensions include:

+
    +
  • Magit: Git interface that has transformed my version control workflow
  • +
  • LSP Mode: Language server integration for intelligent code assistance
  • +
  • Org Mode: For notes, task management, and literate programming
  • +
  • Projectile: Project navigation and management
  • +
  • Company: Completion framework
  • +
  • Consult/Vertico/Marginalia: Modern completion UI
  • +
  • Tree-sitter: Improved syntax highlighting and structural editing
  • +
+

Language-Specific Setups

+

For my primary languages:

+
    +
  • Scheme/Guile: Geiser for REPL integration
  • +
  • JavaScript/TypeScript: TypeScript LSP, prettier, eslint integration
  • +
  • Python: Pyright LSP, black formatting
  • +
  • Web Development: Web mode, emmet, css-mode
  • +
+

Productivity Enhancements

+

Some productivity boosters in my setup:

+
    +
  • Custom keybindings for frequent operations
  • +
  • Snippets for common code patterns
  • +
  • Template generation for new projects
  • +
  • Integration with system notifications
  • +
+

Terminal and CLI Tools

+

While Emacs handles many tasks, I still rely heavily on terminal tools for specific workflows.

+

Shell Configuration

+

I use Zsh with a custom configuration that provides:

+
    +
  • Intuitive aliases
  • +
  • Helpful prompts with Git integration
  • +
  • Command history management
  • +
  • Directory navigation shortcuts
  • +
+

Custom Scripts and Utilities

+

I've developed several custom scripts to streamline repetitive tasks:

+
    +
  • Project initialization templates
  • +
  • Deployment automation
  • +
  • System maintenance routines
  • +
  • Content management for this blog
  • +
+

Task Automation

+

For task automation, I use a combination of:

+
    +
  • Shell scripts for simple operations
  • +
  • Guile scripts for more complex logic
  • +
  • Make for build processes
  • +
  • Cron for scheduled tasks
  • +
+

Version Control Workflow

+

My Git workflow relies on:

+
    +
  • Branch-per-feature approach
  • +
  • Interactive rebasing for clean history
  • +
  • Commit message templates
  • +
  • Hooks for quality checks
  • +
+

Web Development Stack

+

As the creator of this website, my web development setup has been refined through experience.

+

Local Development Server

+

For local development, I use:

+
    +
  • Live-server for static sites
  • +
  • Custom Node.js servers for API development
  • +
  • Docker containers for complex dependencies
  • +
+

Build Tools and Processes

+

My build process typically involves:

+
    +
  • Tailwind CSS for styling
  • +
  • Minimal JavaScript bundling
  • +
  • Custom static site generation (as detailed in my previous post)
  • +
  • Automated optimization steps
  • +
+

Testing Approach

+

For testing, I employ:

+
    +
  • Jest for JavaScript unit tests
  • +
  • Cypress for end-to-end testing
  • +
  • Manual testing across devices and browsers
  • +
  • Accessibility validation tools
  • +
+

Browser Tools and Extensions

+

Essential browser tools include:

+
    +
  • Firefox Developer Edition as my primary browser
  • +
  • Chrome for cross-browser testing
  • +
  • DevTools for performance analysis
  • +
  • React and Redux DevTools
  • +
  • Accessibility checkers
  • +
+

Deployment Pipeline

+

My approach to deployment emphasizes security and reliability.

+

Secure Deployment Process

+

As you might have noticed from my .env.gpg file, I take security seriously:

+
    +
  • Credentials stored in GPG-encrypted files
  • +
  • Separate development and production configurations
  • +
  • Principle of least privilege for service accounts
  • +
  • Regular security audits
  • +
+

Automation Scripts

+

My deployment is automated through:

+
    +
  • Custom shell scripts for build and deploy
  • +
  • Validation steps before deployment
  • +
  • Rollback capabilities
  • +
  • Notification systems for success/failure
  • +
+

CI/CD Considerations

+

While not using a formal CI/CD pipeline for this personal site, I follow similar principles:

+
    +
  • Pre-commit checks for code quality
  • +
  • Automated testing before deployment
  • +
  • Consistent build environments
  • +
  • Deployment approval steps
  • +
+

Monitoring and Analytics

+

For site monitoring, I use:

+
    +
  • Simple analytics for privacy-respecting visitor tracking
  • +
  • Uptime monitoring
  • +
  • Performance metrics collection
  • +
  • Error logging and alerting
  • +
+

Future Improvements

+

My environment continues to evolve. Areas I'm exploring include:

+
    +
  • Further integration between Emacs and system tools
  • +
  • More comprehensive test automation
  • +
  • Expanded use of Guix channels for package management
  • +
  • Improved mobile development workflow
  • +
+

Conclusion

+

A development environment is deeply personal, reflecting both technical needs and individual preferences. Mine has evolved through years of experimentation, learning, and refinement.

+

The most important lesson I've learned is that tools should serve your workflow, not dictate it. Be willing to experiment, but also recognize when a tool is working well enough that further optimization yields diminishing returns.

+

I hope sharing my setup provides some inspiration for your own environment. I'd love to hear about your setup and what tools have made the biggest difference in your workflow.

+

What aspects of your development environment have you found most valuable? Are there tools or approaches you think I should consider? Let me know!

+ +
+
+
+
+ + + \ No newline at end of file diff --git a/content/posts/2025-03-08-my-dev-environment-2025.md b/content/posts/2025-03-08-my-dev-environment-2025.md new file mode 100644 index 0000000..6787f3d --- /dev/null +++ b/content/posts/2025-03-08-my-dev-environment-2025.md @@ -0,0 +1,249 @@ +--- +title: My Development Environment in 2025: From Editor to Deployment +date: 2025-03-08 +tags: development, guix, tools, workflow, productivity, web +description: A comprehensive look at my current development setup in 2025, covering everything from my GNU Guix system foundation to editor configurations, terminal tools, and deployment processes. +--- + +## Introduction + +The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post offers a snapshot of my current setup in early 2025, detailing the choices I've made and why they work for me. + +## System Foundation: ArcoLinux with GNU Guix + +My journey to [GNU Guix](https://guix.gnu.org/) began through my exploration of Scheme programming, as I detailed in my [GNU Guix Journey](/content/posts/2024-07-26-gnu-guix-journey.html) post. While I initially experimented with Guix System, I've settled on a hybrid approach: running Guix as a package manager on top of ArcoLinux (an Arch-based distribution). + +### Current Configuration Approach + +I manage my development environment using a combination of Arch's pacman, AUR, and Guix's declarative package management. My Guix configuration lives in a Git repository, allowing me to: + +- Track changes to my development environment over time +- Reproduce my development setup on new hardware +- Roll back to previous package states when needed +- Share configuration snippets with the community + +### Key Packages and Tools + +I maintain a hybrid package approach: + +**System packages (via pacman/AUR):** + +- Base system utilities and desktop environment +- Graphics drivers and hardware support +- Some GUI applications + +**Development tools (via Guix):** + +```scheme +;; My primary development tools managed by Guix +(specifications->manifest + '("emacs" "git" "openssh" "ripgrep" "fd" "exa" "bat" + "guile" "node" "python" "gcc-toolchain" "make" + "nss-certs" "glibc-locales")) +``` + +This hybrid approach gives me the best of both worlds: Arch's extensive package repository and up-to-date system packages, combined with Guix's reproducible development environments. + +### Reproducibility Benefits + +The reproducibility of Guix for development environments has been invaluable. I can: + +- Spin up development environments with precise dependencies +- Ensure consistent behavior across machines +- Isolate project-specific dependencies using Guix environments +- Share exact environment specifications with collaborators + +### Challenges and Solutions + +Working with this hybrid approach isn't without challenges: + +- **Challenge**: Keeping Guix packages in sync with system libraries + **Solution**: Careful management of library paths and containerization when needed + +- **Challenge**: Learning curve for Guix's declarative configuration + **Solution**: Incremental adoption and community resources + +- **Challenge**: Occasional conflicts between package managers + **Solution**: Clear separation of responsibilities (system vs. development tools) + +## Editor Environment: Emacs + +After experimenting with various editors, I've settled on Emacs as my primary development environment. Its extensibility and Scheme-based configuration language (Emacs Lisp) align well with my interests. + +### Configuration Approach + +I use a literate configuration with Org mode, which allows me to: +- Document my configuration choices +- Organize settings by purpose rather than file +- Selectively load components based on context +- Share readable documentation with others + +### Key Extensions + +My most valuable Emacs extensions include: + +- **Magit**: Git interface that has transformed my version control workflow +- **LSP Mode**: Language server integration for intelligent code assistance +- **Org Mode**: For notes, task management, and literate programming +- **Projectile**: Project navigation and management +- **Company**: Completion framework +- **Consult/Vertico/Marginalia**: Modern completion UI +- **Tree-sitter**: Improved syntax highlighting and structural editing + +### Language-Specific Setups + +For my primary languages: + +- **Scheme/Guile**: Geiser for REPL integration +- **JavaScript/TypeScript**: TypeScript LSP, prettier, eslint integration +- **Python**: Pyright LSP, black formatting +- **Web Development**: Web mode, emmet, css-mode + +### Productivity Enhancements + +Some productivity boosters in my setup: + +- Custom keybindings for frequent operations +- Snippets for common code patterns +- Template generation for new projects +- Integration with system notifications + +## Terminal and CLI Tools + +While Emacs handles many tasks, I still rely heavily on terminal tools for specific workflows. + +### Shell Configuration + +I use Zsh with a custom configuration that provides: + +- Intuitive aliases +- Helpful prompts with Git integration +- Command history management +- Directory navigation shortcuts + +### Custom Scripts and Utilities + +I've developed several custom scripts to streamline repetitive tasks: + +- Project initialization templates +- Deployment automation +- System maintenance routines +- Content management for this blog + +### Task Automation + +For task automation, I use a combination of: + +- Shell scripts for simple operations +- Guile scripts for more complex logic +- Make for build processes +- Cron for scheduled tasks + +### Version Control Workflow + +My Git workflow relies on: + +- Branch-per-feature approach +- Interactive rebasing for clean history +- Commit message templates +- Hooks for quality checks + +## Web Development Stack + +As the creator of this website, my web development setup has been refined through experience. + +### Local Development Server + +For local development, I use: + +- Live-server for static sites +- Custom Node.js servers for API development +- Docker containers for complex dependencies + +### Build Tools and Processes + +My build process typically involves: + +- Tailwind CSS for styling +- Minimal JavaScript bundling +- Custom static site generation (as detailed in my [previous post](/content/posts/2025-01-02-from-haunt-to-custom.html)) +- Automated optimization steps + +### Testing Approach + +For testing, I employ: + +- Jest for JavaScript unit tests +- Cypress for end-to-end testing +- Manual testing across devices and browsers +- Accessibility validation tools + +### Browser Tools and Extensions + +Essential browser tools include: + +- Firefox Developer Edition as my primary browser +- Chrome for cross-browser testing +- DevTools for performance analysis +- React and Redux DevTools +- Accessibility checkers + +## Deployment Pipeline + +My approach to deployment emphasizes security and reliability. + +### Secure Deployment Process + +As you might have noticed from my [.env.gpg file](/content/posts/2025-03-08-my-dev-environment-2025.html), I take security seriously: + +- Credentials stored in GPG-encrypted files +- Separate development and production configurations +- Principle of least privilege for service accounts +- Regular security audits + +### Automation Scripts + +My deployment is automated through: + +- Custom shell scripts for build and deploy +- Validation steps before deployment +- Rollback capabilities +- Notification systems for success/failure + +### CI/CD Considerations + +While not using a formal CI/CD pipeline for this personal site, I follow similar principles: + +- Pre-commit checks for code quality +- Automated testing before deployment +- Consistent build environments +- Deployment approval steps + +### Monitoring and Analytics + +For site monitoring, I use: + +- Simple analytics for privacy-respecting visitor tracking +- Uptime monitoring +- Performance metrics collection +- Error logging and alerting + +## Future Improvements + +My environment continues to evolve. Areas I'm exploring include: + + +- Further integration between Emacs and system tools +- More comprehensive test automation +- Expanded use of Guix channels for package management +- Improved mobile development workflow + +## Conclusion + +A development environment is deeply personal, reflecting both technical needs and individual preferences. Mine has evolved through years of experimentation, learning, and refinement. + +The most important lesson I've learned is that tools should serve your workflow, not dictate it. Be willing to experiment, but also recognize when a tool is working well enough that further optimization yields diminishing returns. + +I hope sharing my setup provides some inspiration for your own environment. I'd love to hear about your setup and what tools have made the biggest difference in your workflow. + +What aspects of your development environment have you found most valuable? Are there tools or approaches you think I should consider? Let me know! diff --git a/deploy/content/posts/2025-03-08-my-dev-environment-2025.html b/deploy/content/posts/2025-03-08-my-dev-environment-2025.html new file mode 100644 index 0000000..3e68211 --- /dev/null +++ b/deploy/content/posts/2025-03-08-my-dev-environment-2025.html @@ -0,0 +1,323 @@ + + + + + + + + + + My Development Environment in 2025: From Editor to Deployment - Glenn Thompson + + + + + + + + +
+
+
+
+

My Development Environment in 2025: From Editor to Deployment

+
+ + + 6 min read + + By Glenn Thompson +
+ +
+ developmentguixtoolsworkflowproductivityweb +
+
+ +
+

Introduction

+

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post offers a snapshot of my current setup in early 2025, detailing the choices I've made and why they work for me.

+

System Foundation: ArcoLinux with GNU Guix

+

My journey to GNU Guix began through my exploration of Scheme programming, as I detailed in my GNU Guix Journey post. While I initially experimented with Guix System, I've settled on a hybrid approach: running Guix as a package manager on top of ArcoLinux (an Arch-based distribution).

+

Current Configuration Approach

+

I manage my development environment using a combination of Arch's pacman, AUR, and Guix's declarative package management. My Guix configuration lives in a Git repository, allowing me to:

+
    +
  • Track changes to my development environment over time
  • +
  • Reproduce my development setup on new hardware
  • +
  • Roll back to previous package states when needed
  • +
  • Share configuration snippets with the community
  • +
+

Key Packages and Tools

+

I maintain a hybrid package approach:

+

System packages (via pacman/AUR):

+
    +
  • Base system utilities and desktop environment
  • +
  • Graphics drivers and hardware support
  • +
  • Some GUI applications
  • +
+

Development tools (via Guix):

+
;; My primary development tools managed by Guix
+(specifications->manifest
+ '("emacs" "git" "openssh" "ripgrep" "fd" "exa" "bat"
+   "guile" "node" "python" "gcc-toolchain" "make"
+   "nss-certs" "glibc-locales"))
+
+

This hybrid approach gives me the best of both worlds: Arch's extensive package repository and up-to-date system packages, combined with Guix's reproducible development environments.

+

Reproducibility Benefits

+

The reproducibility of Guix for development environments has been invaluable. I can:

+
    +
  • Spin up development environments with precise dependencies
  • +
  • Ensure consistent behavior across machines
  • +
  • Isolate project-specific dependencies using Guix environments
  • +
  • Share exact environment specifications with collaborators
  • +
+

Challenges and Solutions

+

Working with this hybrid approach isn't without challenges:

+
    +
  • Challenge: Keeping Guix packages in sync with system libraries
    Solution: Careful management of library paths and containerization when needed

    +
  • +
  • Challenge: Learning curve for Guix's declarative configuration
    Solution: Incremental adoption and community resources

    +
  • +
  • Challenge: Occasional conflicts between package managers
    Solution: Clear separation of responsibilities (system vs. development tools)

    +
  • +
+

Editor Environment: Emacs

+

After experimenting with various editors, I've settled on Emacs as my primary development environment. Its extensibility and Scheme-based configuration language (Emacs Lisp) align well with my interests.

+

Configuration Approach

+

I use a literate configuration with Org mode, which allows me to:

+
    +
  • Document my configuration choices
  • +
  • Organize settings by purpose rather than file
  • +
  • Selectively load components based on context
  • +
  • Share readable documentation with others
  • +
+

Key Extensions

+

My most valuable Emacs extensions include:

+
    +
  • Magit: Git interface that has transformed my version control workflow
  • +
  • LSP Mode: Language server integration for intelligent code assistance
  • +
  • Org Mode: For notes, task management, and literate programming
  • +
  • Projectile: Project navigation and management
  • +
  • Company: Completion framework
  • +
  • Consult/Vertico/Marginalia: Modern completion UI
  • +
  • Tree-sitter: Improved syntax highlighting and structural editing
  • +
+

Language-Specific Setups

+

For my primary languages:

+
    +
  • Scheme/Guile: Geiser for REPL integration
  • +
  • JavaScript/TypeScript: TypeScript LSP, prettier, eslint integration
  • +
  • Python: Pyright LSP, black formatting
  • +
  • Web Development: Web mode, emmet, css-mode
  • +
+

Productivity Enhancements

+

Some productivity boosters in my setup:

+
    +
  • Custom keybindings for frequent operations
  • +
  • Snippets for common code patterns
  • +
  • Template generation for new projects
  • +
  • Integration with system notifications
  • +
+

Terminal and CLI Tools

+

While Emacs handles many tasks, I still rely heavily on terminal tools for specific workflows.

+

Shell Configuration

+

I use Zsh with a custom configuration that provides:

+
    +
  • Intuitive aliases
  • +
  • Helpful prompts with Git integration
  • +
  • Command history management
  • +
  • Directory navigation shortcuts
  • +
+

Custom Scripts and Utilities

+

I've developed several custom scripts to streamline repetitive tasks:

+
    +
  • Project initialization templates
  • +
  • Deployment automation
  • +
  • System maintenance routines
  • +
  • Content management for this blog
  • +
+

Task Automation

+

For task automation, I use a combination of:

+
    +
  • Shell scripts for simple operations
  • +
  • Guile scripts for more complex logic
  • +
  • Make for build processes
  • +
  • Cron for scheduled tasks
  • +
+

Version Control Workflow

+

My Git workflow relies on:

+
    +
  • Branch-per-feature approach
  • +
  • Interactive rebasing for clean history
  • +
  • Commit message templates
  • +
  • Hooks for quality checks
  • +
+

Web Development Stack

+

As the creator of this website, my web development setup has been refined through experience.

+

Local Development Server

+

For local development, I use:

+
    +
  • Live-server for static sites
  • +
  • Custom Node.js servers for API development
  • +
  • Docker containers for complex dependencies
  • +
+

Build Tools and Processes

+

My build process typically involves:

+
    +
  • Tailwind CSS for styling
  • +
  • Minimal JavaScript bundling
  • +
  • Custom static site generation (as detailed in my previous post)
  • +
  • Automated optimization steps
  • +
+

Testing Approach

+

For testing, I employ:

+
    +
  • Jest for JavaScript unit tests
  • +
  • Cypress for end-to-end testing
  • +
  • Manual testing across devices and browsers
  • +
  • Accessibility validation tools
  • +
+

Browser Tools and Extensions

+

Essential browser tools include:

+
    +
  • Firefox Developer Edition as my primary browser
  • +
  • Chrome for cross-browser testing
  • +
  • DevTools for performance analysis
  • +
  • React and Redux DevTools
  • +
  • Accessibility checkers
  • +
+

Deployment Pipeline

+

My approach to deployment emphasizes security and reliability.

+

Secure Deployment Process

+

As you might have noticed from my .env.gpg file, I take security seriously:

+
    +
  • Credentials stored in GPG-encrypted files
  • +
  • Separate development and production configurations
  • +
  • Principle of least privilege for service accounts
  • +
  • Regular security audits
  • +
+

Automation Scripts

+

My deployment is automated through:

+
    +
  • Custom shell scripts for build and deploy
  • +
  • Validation steps before deployment
  • +
  • Rollback capabilities
  • +
  • Notification systems for success/failure
  • +
+

CI/CD Considerations

+

While not using a formal CI/CD pipeline for this personal site, I follow similar principles:

+
    +
  • Pre-commit checks for code quality
  • +
  • Automated testing before deployment
  • +
  • Consistent build environments
  • +
  • Deployment approval steps
  • +
+

Monitoring and Analytics

+

For site monitoring, I use:

+
    +
  • Simple analytics for privacy-respecting visitor tracking
  • +
  • Uptime monitoring
  • +
  • Performance metrics collection
  • +
  • Error logging and alerting
  • +
+

Future Improvements

+

My environment continues to evolve. Areas I'm exploring include:

+
    +
  • Further integration between Emacs and system tools
  • +
  • More comprehensive test automation
  • +
  • Expanded use of Guix channels for package management
  • +
  • Improved mobile development workflow
  • +
+

Conclusion

+

A development environment is deeply personal, reflecting both technical needs and individual preferences. Mine has evolved through years of experimentation, learning, and refinement.

+

The most important lesson I've learned is that tools should serve your workflow, not dictate it. Be willing to experiment, but also recognize when a tool is working well enough that further optimization yields diminishing returns.

+

I hope sharing my setup provides some inspiration for your own environment. I'd love to hear about your setup and what tools have made the biggest difference in your workflow.

+

What aspects of your development environment have you found most valuable? Are there tools or approaches you think I should consider? Let me know!

+ +
+
+
+
+ + + \ No newline at end of file diff --git a/deploy/feed.xml b/deploy/feed.xml index 84c094c..edb3452 100644 --- a/deploy/feed.xml +++ b/deploy/feed.xml @@ -6,7 +6,7 @@ https://glenneth.org en-us - Thu, 02 Jan 2025 08:57:11 GMT + Sat, 08 Mar 2025 10:36:20 GMT Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard @@ -41,6 +41,215 @@ ["personal", "tech", "keyboards", "glove80"] + + My Development Environment in 2025: From Editor to Deployment + A comprehensive look at my current development setup in 2025, covering everything from my GNU Guix system foundation to editor configurations, terminal tools, and deployment processes. + Introduction +

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post offers a snapshot of my current setup in early 2025, detailing the choices I've made and why they work for me.

+

System Foundation: ArcoLinux with GNU Guix

+

My journey to GNU Guix began through my exploration of Scheme programming, as I detailed in my GNU Guix Journey post. While I initially experimented with Guix System, I've settled on a hybrid approach: running Guix as a package manager on top of ArcoLinux (an Arch-based distribution).

+

Current Configuration Approach

+

I manage my development environment using a combination of Arch's pacman, AUR, and Guix's declarative package management. My Guix configuration lives in a Git repository, allowing me to:

+
    +
  • Track changes to my development environment over time
  • +
  • Reproduce my development setup on new hardware
  • +
  • Roll back to previous package states when needed
  • +
  • Share configuration snippets with the community
  • +
+

Key Packages and Tools

+

I maintain a hybrid package approach:

+

System packages (via pacman/AUR):

+
    +
  • Base system utilities and desktop environment
  • +
  • Graphics drivers and hardware support
  • +
  • Some GUI applications
  • +
+

Development tools (via Guix):

+
;; My primary development tools managed by Guix
+(specifications->manifest
+ '("emacs" "git" "openssh" "ripgrep" "fd" "exa" "bat"
+   "guile" "node" "python" "gcc-toolchain" "make"
+   "nss-certs" "glibc-locales"))
+
+

This hybrid approach gives me the best of both worlds: Arch's extensive package repository and up-to-date system packages, combined with Guix's reproducible development environments.

+

Reproducibility Benefits

+

The reproducibility of Guix for development environments has been invaluable. I can:

+
    +
  • Spin up development environments with precise dependencies
  • +
  • Ensure consistent behavior across machines
  • +
  • Isolate project-specific dependencies using Guix environments
  • +
  • Share exact environment specifications with collaborators
  • +
+

Challenges and Solutions

+

Working with this hybrid approach isn't without challenges:

+
    +
  • Challenge: Keeping Guix packages in sync with system libraries
    Solution: Careful management of library paths and containerization when needed

    +
  • +
  • Challenge: Learning curve for Guix's declarative configuration
    Solution: Incremental adoption and community resources

    +
  • +
  • Challenge: Occasional conflicts between package managers
    Solution: Clear separation of responsibilities (system vs. development tools)

    +
  • +
+

Editor Environment: Emacs

+

After experimenting with various editors, I've settled on Emacs as my primary development environment. Its extensibility and Scheme-based configuration language (Emacs Lisp) align well with my interests.

+

Configuration Approach

+

I use a literate configuration with Org mode, which allows me to:

+
    +
  • Document my configuration choices
  • +
  • Organize settings by purpose rather than file
  • +
  • Selectively load components based on context
  • +
  • Share readable documentation with others
  • +
+

Key Extensions

+

My most valuable Emacs extensions include:

+
    +
  • Magit: Git interface that has transformed my version control workflow
  • +
  • LSP Mode: Language server integration for intelligent code assistance
  • +
  • Org Mode: For notes, task management, and literate programming
  • +
  • Projectile: Project navigation and management
  • +
  • Company: Completion framework
  • +
  • Consult/Vertico/Marginalia: Modern completion UI
  • +
  • Tree-sitter: Improved syntax highlighting and structural editing
  • +
+

Language-Specific Setups

+

For my primary languages:

+
    +
  • Scheme/Guile: Geiser for REPL integration
  • +
  • JavaScript/TypeScript: TypeScript LSP, prettier, eslint integration
  • +
  • Python: Pyright LSP, black formatting
  • +
  • Web Development: Web mode, emmet, css-mode
  • +
+

Productivity Enhancements

+

Some productivity boosters in my setup:

+
    +
  • Custom keybindings for frequent operations
  • +
  • Snippets for common code patterns
  • +
  • Template generation for new projects
  • +
  • Integration with system notifications
  • +
+

Terminal and CLI Tools

+

While Emacs handles many tasks, I still rely heavily on terminal tools for specific workflows.

+

Shell Configuration

+

I use Zsh with a custom configuration that provides:

+
    +
  • Intuitive aliases
  • +
  • Helpful prompts with Git integration
  • +
  • Command history management
  • +
  • Directory navigation shortcuts
  • +
+

Custom Scripts and Utilities

+

I've developed several custom scripts to streamline repetitive tasks:

+
    +
  • Project initialization templates
  • +
  • Deployment automation
  • +
  • System maintenance routines
  • +
  • Content management for this blog
  • +
+

Task Automation

+

For task automation, I use a combination of:

+
    +
  • Shell scripts for simple operations
  • +
  • Guile scripts for more complex logic
  • +
  • Make for build processes
  • +
  • Cron for scheduled tasks
  • +
+

Version Control Workflow

+

My Git workflow relies on:

+
    +
  • Branch-per-feature approach
  • +
  • Interactive rebasing for clean history
  • +
  • Commit message templates
  • +
  • Hooks for quality checks
  • +
+

Web Development Stack

+

As the creator of this website, my web development setup has been refined through experience.

+

Local Development Server

+

For local development, I use:

+
    +
  • Live-server for static sites
  • +
  • Custom Node.js servers for API development
  • +
  • Docker containers for complex dependencies
  • +
+

Build Tools and Processes

+

My build process typically involves:

+
    +
  • Tailwind CSS for styling
  • +
  • Minimal JavaScript bundling
  • +
  • Custom static site generation (as detailed in my previous post)
  • +
  • Automated optimization steps
  • +
+

Testing Approach

+

For testing, I employ:

+
    +
  • Jest for JavaScript unit tests
  • +
  • Cypress for end-to-end testing
  • +
  • Manual testing across devices and browsers
  • +
  • Accessibility validation tools
  • +
+

Browser Tools and Extensions

+

Essential browser tools include:

+
    +
  • Firefox Developer Edition as my primary browser
  • +
  • Chrome for cross-browser testing
  • +
  • DevTools for performance analysis
  • +
  • React and Redux DevTools
  • +
  • Accessibility checkers
  • +
+

Deployment Pipeline

+

My approach to deployment emphasizes security and reliability.

+

Secure Deployment Process

+

As you might have noticed from my .env.gpg file, I take security seriously:

+
    +
  • Credentials stored in GPG-encrypted files
  • +
  • Separate development and production configurations
  • +
  • Principle of least privilege for service accounts
  • +
  • Regular security audits
  • +
+

Automation Scripts

+

My deployment is automated through:

+
    +
  • Custom shell scripts for build and deploy
  • +
  • Validation steps before deployment
  • +
  • Rollback capabilities
  • +
  • Notification systems for success/failure
  • +
+

CI/CD Considerations

+

While not using a formal CI/CD pipeline for this personal site, I follow similar principles:

+
    +
  • Pre-commit checks for code quality
  • +
  • Automated testing before deployment
  • +
  • Consistent build environments
  • +
  • Deployment approval steps
  • +
+

Monitoring and Analytics

+

For site monitoring, I use:

+
    +
  • Simple analytics for privacy-respecting visitor tracking
  • +
  • Uptime monitoring
  • +
  • Performance metrics collection
  • +
  • Error logging and alerting
  • +
+

Future Improvements

+

My environment continues to evolve. Areas I'm exploring include:

+
    +
  • Further integration between Emacs and system tools
  • +
  • More comprehensive test automation
  • +
  • Expanded use of Guix channels for package management
  • +
  • Improved mobile development workflow
  • +
+

Conclusion

+

A development environment is deeply personal, reflecting both technical needs and individual preferences. Mine has evolved through years of experimentation, learning, and refinement.

+

The most important lesson I've learned is that tools should serve your workflow, not dictate it. Be willing to experiment, but also recognize when a tool is working well enough that further optimization yields diminishing returns.

+

I hope sharing my setup provides some inspiration for your own environment. I'd love to hear about your setup and what tools have made the biggest difference in your workflow.

+

What aspects of your development environment have you found most valuable? Are there tools or approaches you think I should consider? Let me know!

+]]>
+ https://glenneth.org/content/posts/2025-03-08-my-dev-environment-2025.html + https://glenneth.org/content/posts/2025-03-08-my-dev-environment-2025.html + Sat, 08 Mar 2025 00:00:00 GMT + Glenn Thompson + development, guix, tools, workflow, productivity, web +
+ From Hugo to Haunt to Custom: My Journey in Static Site Generation A reflection on my evolving journey through static site generators - from Hugo to Haunt, and finally to building my own custom solution, highlighting the valuable lessons learned along the way. diff --git a/deploy/index.html b/deploy/index.html index 5fd60a6..c17ffcb 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -61,7 +61,26 @@
-
+
+ Tech + developmentguixtoolsworkflowproductivityweb + + +
+

+ + My Development Environment in 2025: From Editor to Deployment + +

+

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...

+
+ developmentguixtoolsworkflowproductivityweb +
+
+ + +
+
Tech webdevelopmentjavascriptstatic-sitehauntguilehugo @@ -73,14 +92,14 @@

My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...

-
+
webdevelopmentjavascriptstatic-sitehauntguilehugo
-
+
Tech techguileschemedevelopmentfunctional-programming @@ -92,14 +111,14 @@

A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...

-
+
techguileschemedevelopmentfunctional-programming
-
+
Tech personaltechguileschemegnudevelopment @@ -111,14 +130,14 @@

I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...

-
+
personaltechguileschemegnudevelopment
-
+
Tech personaltechgnuguixswaywmnvidia @@ -130,14 +149,14 @@

As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...

-
+
personaltechgnuguixswaywmnvidia
-
+
Tech personaltechkeyboardsglove80 @@ -149,14 +168,14 @@

Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.

-
+
personaltechkeyboardsglove80
-
+
Tech worktravel @@ -168,14 +187,14 @@

Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...

-
+
worktravel
-
+
Tech personaltechkeyboardsglove80 @@ -187,7 +206,7 @@

As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...

-
+
personaltechkeyboardsglove80
diff --git a/deploy/js/md-to-html.js b/deploy/js/md-to-html.js index 0c5fc57..cb8a070 100644 --- a/deploy/js/md-to-html.js +++ b/deploy/js/md-to-html.js @@ -280,7 +280,7 @@ async function updateIndexWithSummaries() { // Create the HTML for blog posts const postsHtml = posts.map(post => `
-
+
Tech ${post.tags.map(tag => `${tag}`).join('')} @@ -292,7 +292,7 @@ async function updateIndexWithSummaries() {

${post.summary}

-
+
${post.tags.map(tag => `${tag}`).join('')}
diff --git a/feed.xml b/feed.xml index 84c094c..edb3452 100644 --- a/feed.xml +++ b/feed.xml @@ -6,7 +6,7 @@ https://glenneth.org en-us - Thu, 02 Jan 2025 08:57:11 GMT + Sat, 08 Mar 2025 10:36:20 GMT Aesthetic Meets Ergonomics: My Deep Dive into the Glove80 Keyboard @@ -41,6 +41,215 @@ ["personal", "tech", "keyboards", "glove80"] + + My Development Environment in 2025: From Editor to Deployment + A comprehensive look at my current development setup in 2025, covering everything from my GNU Guix system foundation to editor configurations, terminal tools, and deployment processes. + Introduction +

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post offers a snapshot of my current setup in early 2025, detailing the choices I've made and why they work for me.

+

System Foundation: ArcoLinux with GNU Guix

+

My journey to GNU Guix began through my exploration of Scheme programming, as I detailed in my GNU Guix Journey post. While I initially experimented with Guix System, I've settled on a hybrid approach: running Guix as a package manager on top of ArcoLinux (an Arch-based distribution).

+

Current Configuration Approach

+

I manage my development environment using a combination of Arch's pacman, AUR, and Guix's declarative package management. My Guix configuration lives in a Git repository, allowing me to:

+
    +
  • Track changes to my development environment over time
  • +
  • Reproduce my development setup on new hardware
  • +
  • Roll back to previous package states when needed
  • +
  • Share configuration snippets with the community
  • +
+

Key Packages and Tools

+

I maintain a hybrid package approach:

+

System packages (via pacman/AUR):

+
    +
  • Base system utilities and desktop environment
  • +
  • Graphics drivers and hardware support
  • +
  • Some GUI applications
  • +
+

Development tools (via Guix):

+
;; My primary development tools managed by Guix
+(specifications->manifest
+ '("emacs" "git" "openssh" "ripgrep" "fd" "exa" "bat"
+   "guile" "node" "python" "gcc-toolchain" "make"
+   "nss-certs" "glibc-locales"))
+
+

This hybrid approach gives me the best of both worlds: Arch's extensive package repository and up-to-date system packages, combined with Guix's reproducible development environments.

+

Reproducibility Benefits

+

The reproducibility of Guix for development environments has been invaluable. I can:

+
    +
  • Spin up development environments with precise dependencies
  • +
  • Ensure consistent behavior across machines
  • +
  • Isolate project-specific dependencies using Guix environments
  • +
  • Share exact environment specifications with collaborators
  • +
+

Challenges and Solutions

+

Working with this hybrid approach isn't without challenges:

+
    +
  • Challenge: Keeping Guix packages in sync with system libraries
    Solution: Careful management of library paths and containerization when needed

    +
  • +
  • Challenge: Learning curve for Guix's declarative configuration
    Solution: Incremental adoption and community resources

    +
  • +
  • Challenge: Occasional conflicts between package managers
    Solution: Clear separation of responsibilities (system vs. development tools)

    +
  • +
+

Editor Environment: Emacs

+

After experimenting with various editors, I've settled on Emacs as my primary development environment. Its extensibility and Scheme-based configuration language (Emacs Lisp) align well with my interests.

+

Configuration Approach

+

I use a literate configuration with Org mode, which allows me to:

+
    +
  • Document my configuration choices
  • +
  • Organize settings by purpose rather than file
  • +
  • Selectively load components based on context
  • +
  • Share readable documentation with others
  • +
+

Key Extensions

+

My most valuable Emacs extensions include:

+
    +
  • Magit: Git interface that has transformed my version control workflow
  • +
  • LSP Mode: Language server integration for intelligent code assistance
  • +
  • Org Mode: For notes, task management, and literate programming
  • +
  • Projectile: Project navigation and management
  • +
  • Company: Completion framework
  • +
  • Consult/Vertico/Marginalia: Modern completion UI
  • +
  • Tree-sitter: Improved syntax highlighting and structural editing
  • +
+

Language-Specific Setups

+

For my primary languages:

+
    +
  • Scheme/Guile: Geiser for REPL integration
  • +
  • JavaScript/TypeScript: TypeScript LSP, prettier, eslint integration
  • +
  • Python: Pyright LSP, black formatting
  • +
  • Web Development: Web mode, emmet, css-mode
  • +
+

Productivity Enhancements

+

Some productivity boosters in my setup:

+
    +
  • Custom keybindings for frequent operations
  • +
  • Snippets for common code patterns
  • +
  • Template generation for new projects
  • +
  • Integration with system notifications
  • +
+

Terminal and CLI Tools

+

While Emacs handles many tasks, I still rely heavily on terminal tools for specific workflows.

+

Shell Configuration

+

I use Zsh with a custom configuration that provides:

+
    +
  • Intuitive aliases
  • +
  • Helpful prompts with Git integration
  • +
  • Command history management
  • +
  • Directory navigation shortcuts
  • +
+

Custom Scripts and Utilities

+

I've developed several custom scripts to streamline repetitive tasks:

+
    +
  • Project initialization templates
  • +
  • Deployment automation
  • +
  • System maintenance routines
  • +
  • Content management for this blog
  • +
+

Task Automation

+

For task automation, I use a combination of:

+
    +
  • Shell scripts for simple operations
  • +
  • Guile scripts for more complex logic
  • +
  • Make for build processes
  • +
  • Cron for scheduled tasks
  • +
+

Version Control Workflow

+

My Git workflow relies on:

+
    +
  • Branch-per-feature approach
  • +
  • Interactive rebasing for clean history
  • +
  • Commit message templates
  • +
  • Hooks for quality checks
  • +
+

Web Development Stack

+

As the creator of this website, my web development setup has been refined through experience.

+

Local Development Server

+

For local development, I use:

+
    +
  • Live-server for static sites
  • +
  • Custom Node.js servers for API development
  • +
  • Docker containers for complex dependencies
  • +
+

Build Tools and Processes

+

My build process typically involves:

+
    +
  • Tailwind CSS for styling
  • +
  • Minimal JavaScript bundling
  • +
  • Custom static site generation (as detailed in my previous post)
  • +
  • Automated optimization steps
  • +
+

Testing Approach

+

For testing, I employ:

+
    +
  • Jest for JavaScript unit tests
  • +
  • Cypress for end-to-end testing
  • +
  • Manual testing across devices and browsers
  • +
  • Accessibility validation tools
  • +
+

Browser Tools and Extensions

+

Essential browser tools include:

+
    +
  • Firefox Developer Edition as my primary browser
  • +
  • Chrome for cross-browser testing
  • +
  • DevTools for performance analysis
  • +
  • React and Redux DevTools
  • +
  • Accessibility checkers
  • +
+

Deployment Pipeline

+

My approach to deployment emphasizes security and reliability.

+

Secure Deployment Process

+

As you might have noticed from my .env.gpg file, I take security seriously:

+
    +
  • Credentials stored in GPG-encrypted files
  • +
  • Separate development and production configurations
  • +
  • Principle of least privilege for service accounts
  • +
  • Regular security audits
  • +
+

Automation Scripts

+

My deployment is automated through:

+
    +
  • Custom shell scripts for build and deploy
  • +
  • Validation steps before deployment
  • +
  • Rollback capabilities
  • +
  • Notification systems for success/failure
  • +
+

CI/CD Considerations

+

While not using a formal CI/CD pipeline for this personal site, I follow similar principles:

+
    +
  • Pre-commit checks for code quality
  • +
  • Automated testing before deployment
  • +
  • Consistent build environments
  • +
  • Deployment approval steps
  • +
+

Monitoring and Analytics

+

For site monitoring, I use:

+
    +
  • Simple analytics for privacy-respecting visitor tracking
  • +
  • Uptime monitoring
  • +
  • Performance metrics collection
  • +
  • Error logging and alerting
  • +
+

Future Improvements

+

My environment continues to evolve. Areas I'm exploring include:

+
    +
  • Further integration between Emacs and system tools
  • +
  • More comprehensive test automation
  • +
  • Expanded use of Guix channels for package management
  • +
  • Improved mobile development workflow
  • +
+

Conclusion

+

A development environment is deeply personal, reflecting both technical needs and individual preferences. Mine has evolved through years of experimentation, learning, and refinement.

+

The most important lesson I've learned is that tools should serve your workflow, not dictate it. Be willing to experiment, but also recognize when a tool is working well enough that further optimization yields diminishing returns.

+

I hope sharing my setup provides some inspiration for your own environment. I'd love to hear about your setup and what tools have made the biggest difference in your workflow.

+

What aspects of your development environment have you found most valuable? Are there tools or approaches you think I should consider? Let me know!

+]]>
+ https://glenneth.org/content/posts/2025-03-08-my-dev-environment-2025.html + https://glenneth.org/content/posts/2025-03-08-my-dev-environment-2025.html + Sat, 08 Mar 2025 00:00:00 GMT + Glenn Thompson + development, guix, tools, workflow, productivity, web +
+ From Hugo to Haunt to Custom: My Journey in Static Site Generation A reflection on my evolving journey through static site generators - from Hugo to Haunt, and finally to building my own custom solution, highlighting the valuable lessons learned along the way. diff --git a/index.html b/index.html index 5fd60a6..c17ffcb 100644 --- a/index.html +++ b/index.html @@ -61,7 +61,26 @@
-
+
+ Tech + developmentguixtoolsworkflowproductivityweb + + +
+

+ + My Development Environment in 2025: From Editor to Deployment + +

+

The tools we use shape how we work. Over the years, my development environment has evolved alongside my technical journey through different programming languages, paradigms, and projects. This post of...

+
+ developmentguixtoolsworkflowproductivityweb +
+
+ + +
+
Tech webdevelopmentjavascriptstatic-sitehauntguilehugo @@ -73,14 +92,14 @@

My journey with static site generators has been one of continuous learning and evolution. It started with Hugo, transitioned through Haunt, and has now led me to build my own custom solution. Each ste...

-
+
webdevelopmentjavascriptstatic-sitehauntguilehugo
-
+
Tech techguileschemedevelopmentfunctional-programming @@ -92,14 +111,14 @@

A few months ago, I shared my journey into learning Scheme through building stash, a symlink manager. Since then, I've discovered that the gap between learning Scheme and applying it to real-world pro...

-
+
techguileschemedevelopmentfunctional-programming
-
+
Tech personaltechguileschemegnudevelopment @@ -111,14 +130,14 @@

I've spent my career as an electrical engineer, not a software developer. However, my recent journey in to GNU/Liniux required a tool for managing symlinks, and that's how I began learning Scheme—spec...

-
+
personaltechguileschemegnudevelopment
-
+
Tech personaltechgnuguixswaywmnvidia @@ -130,14 +149,14 @@

As a long-time user of Arch Linux, I decided to explore the world of GNU Guix to see if it could better suit my needs, especially with my growing interest in functional package management. The journey...

-
+
personaltechgnuguixswaywmnvidia
-
+
Tech personaltechkeyboardsglove80 @@ -149,14 +168,14 @@

Hello there! I'm Glenn Thompson, and today, I want to share a significant part of my recent journey into the world of Scheme, GNU Guix, and static site generation.

-
+
personaltechkeyboardsglove80
-
+
Tech worktravel @@ -168,14 +187,14 @@

Two weeks ago was a whirlwind of events, taking me from the conforting embrace of Amman, Jordan to the vibrant streets of Newcastle, England. It was a journey filled with highs and lows, professional...

-
+
worktravel
-
+
Tech personaltechkeyboardsglove80 @@ -187,7 +206,7 @@

As my career trajectory veered from being an integral member of an electrical engineering team to assuming the role of Deputy Project Manager, the nature of my daily activities underwent a significant...

-
+
personaltechkeyboardsglove80
diff --git a/src/js/md-to-html.js b/src/js/md-to-html.js index 0c5fc57..cb8a070 100644 --- a/src/js/md-to-html.js +++ b/src/js/md-to-html.js @@ -280,7 +280,7 @@ async function updateIndexWithSummaries() { // Create the HTML for blog posts const postsHtml = posts.map(post => `
-
+
Tech ${post.tags.map(tag => `${tag}`).join('')} @@ -292,7 +292,7 @@ async function updateIndexWithSummaries() {

${post.summary}

-
+
${post.tags.map(tag => `${tag}`).join('')}
diff --git a/website-deploy.zip b/website-deploy.zip index 7fc0184779d103eabfa3c31f8c601101566b8df3..f436ae3859b3c4118baba836155aea414723097e 100644 GIT binary patch delta 33978 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 delta 24685 zcmY(IV{j%wzvW}wwr$(C`NX#Q1QXlV#J25BY;%%KY-5t0_uk#RyIuY752sIcbyuDK z(7*1ig>E^9LR66lhkyh5Pop#@OF|@q{-fb(^{-M$Uoc?*?}ReN|1*J?(LM=^)>!tK z4FS&*uA7pdBMLogt!DMFn*ZczqW!ljTqpiNYE)e}1_a!HyfVY0&?Eo6|Ef80xC8aS zy$UOG|KrVD$%FrIRp>zEf7Gx8FHCSMW3rU*XME_Be|!8_|MrOYUz*Sh<^R!|ZC_?k z>HZn@OaP-P=Ve#5`kkf>mER$bH-|zEcS2<> zd^FL02%Mb{aXs^6x*6N=$N080oxqj)ppxH}qoNk*Qs3{W12)Hvh*w&-za%;YDLF~8 zXpDz9oU)lA#2SggiKIo~S$L+I!qJolR(?N5NfU6@1(04~;=oOT7=-Mi>lnL749{8N zrl{t8lX~&wQ6tApajR+>l>amYf@pm1)g>UHPVoZ>b6!5`=SGGVaZI?AiU zd1={!?cgGGU>kJbTI)JK>c%G@Q)sof=i7%`fd-KH=|sXx)W6sji`Z=sU=&PW+Ds*Ff6j^fucKM5aS_>DN3 z*r!lcPfzBcN(1d%vh8q07B|3hNJl}+=*IaVuj>V9o4jt$!JW6)`lrNsnC$8e;p#^r zuMb|=#=H%-Ex-w}1ZJD?+)RyGRujzmgwLT?;1lET?-FslNyKMi$GTY3@vMCY^~ltp=@}dz8^Ca*}Nb8bGet%l%)EWdbqRPH-}W^9~1RMX~uU zYIwOI(v|3T0Keolgr$dcRs!?RFBzQ`MZ*4OCF39QJjhu4hZ_>c!UG)>-`D!T>6I_* zsO?$2dS3}bc&W_MM0N3(0*cJex4VI3=9@vySAKzS7^)*Pe0jNAeaN&>G--q}bhf zC#J7L9oxNZ8J#8W&|@nnnJc1{giu2!E&c$fwpW_;5mEdzem<4kOoNCk_)Vb))aXYt zw$so|Bo95c^)ZDzBm`q3>WX>Lbzdy*J)Uj;c%=d-TV-_8cjEZEPBcdKGF1i?yE+s( z;WRF1i?%AuHaEFQkMmLLpGY7IaQr!M)fxy!7Y2N1(M*_)d3e01U(wmWc4VgNg;9p{GdTskJd;d`suQT zeL1Kpbo^9KNwb5xDq zP%54$l9%Wl05GyvhsiJU;UBC7v={XMOt?r!p2FnpZEIkq|E0ps-ayOYj*uLw9+#s|T+0eWXUm zJ|Y_n1eiGpSd$}f9l*kVQXz{3ud(Fj6Lph*PT_#5l3qp%Ebi`Q$`Tq5j^ZCDz$60r z{$`7E&-0@$&Nha6l+4TU;0V*>OC5kd_ypZGj{GuLi3cJUM#XrOdZ^kd6ylQ4Pov;` zu!W7INRbnrrs~&&2}FRb=aS01sVE9bgD8tpQgf9^eF8QM%UR${WW@gJNA5p}5UF;= z4daIyH=2E7ixkD|cTh5$!m75X+*q>o9KP={tnD?~lT^aFvme5%JgB}zoxZ27`K|DE z|HM7(^#$J9$EDplx51S!UlD8-t3D~dA-PUF+XVj2G>`z7{2La$8?wIbCUuV3f*n9u^e|L$JQ677C%jC9b2hat zyLXxNAMeqhZpHFw8|lvxU5Q`JCoL77>v1S+_6OEapf9MjXDrP-1%-79CP<;^c(dlb zYT(~tnDqlw#8{5y6QQAA*v;C<--hbBb+91r`Y}dbPGfR-U=V4)v#Yxusge~68$6@2 zPN5FRe?`)R4(3=OaY2oWL|V}>?Tle+J9=R@z*_@pK(Y6^n(ghd12@jEMQLimv>g=q z{s3CGoLcXhg_8B{S*82F=BpBpLZeb{%PB zQ8H`LnBlq@Z)pzQ;K)z#3t6&5e}~fJyaC-DVT`>_UASgoTE}Pf)GW-WFHH%i@WB71 zgKnt~qIfk+I9B1l76$4qBGs|sktPLwa?m|5(9kmM^q9%ovL)Xjk!w4e%;zhjZ_QBq z#A2v0v4vcej?FVDp#Pxf9PF@Rs`I_pXo3$S;svP!?l@X?iL@iOgHXzEW!Xa1ZUZqj z?JewgUn4$#ravog_Nv13hZLM>Rc-{%_&KEx-On&-A9SeOxY!TP*#pMe;Y4)oi|=cD z4z%@V?#HgI_KyWpVX#+P!Zh=fe%J;N*JmnGEJK`D3JjYjb3-v5alBC_qGZJY3je(**o9^L2Q^ZHYk)!vT^P-jPqAnEACC&st`7{JIW3^l2qRpLQ$glwe(+ z80*`39?@F<#4MTHd;~ppAYKY9rW9*vat9!%(jZ-(dcegzy2jXZuC|t?ua@h3J{fS= zT?~JN#*=l1vta%FZTx-LU+q;phhxpzWq2}`?{;Ge?by1Xj{L|>V+W4{-3G(}9ofeP zo36F32GR5A{JU-2E``3N3y}t@yjK@7{Ohj3R0tBb9UPXepg9024i18kb#noE=bt9A3#Ssv@?;+wsYa zQZRA9uj-Pocu0!Vrsc)QRSfjELj)7G_6d`Bk5&O$n5Zia`}5g`3U2FKz<+eKIUk$J zVL7;&`J#lXF|3~>CG-54{dBPKNy_`sxUi!ny1~Pw7p*_}TEb0S_sDqk{O&f^Lia3W=rxGkkl!2zG)h%1{Ss&uY`{IF{;)R_cFK0GO*nc$B$CB1G12gA^hnl{>- zVkisK(~4bhYoy}3=w66etVIz;MFWLEuXP5(QXF?6X08_`6lrvW<4QYIit$WiLO4e} zk)^vp$>(RnuFa_b?8*zT*!BF;z(8veTwu@_o@9DGf6KCP+XVtzJ|z-{$)=)SqGR`s zTRoqH>SaKKH*H3i(hKMyk!O=m^&zD1_a@J5s^z<2bmHjpQgT!Vc&8WDX^F}r)l1l5 zvdt#Xp))V4)+l?)eI?>W_?EG=rVQPSm|u{9QO{fT-Sxf1n}3O)Z4w?Y(d*ZQP6<1{ zzhA+7)&f1;Wq?Lza%vgL>)$a#XBo)bf9rT|kpee*M*8-Di8;&_5(klSSyKy)y9PAH z;7V&CJ?XI*k-pBJbNS#4^H*2DZC`Zc<*i)RIEM9cweX$52ITvQ@yE~~T{B#>GSs1c zvtXvU;WyQ6l&OwZzEH z^{-rKB7C@$XIcdRx)DAsYi{4LPwBHLYdD@NQ>;Lnx+pN4e>7lcpFF{(XHS1j-3|eu z_W@6;hY7^39a}gzaFb%#x6v5$QEiAVeG{?hIQReU`ZP>frcsBR?(P)(?9>y=UjX$hyQX?sU?BqJ&!r%64^6uYe*`d z%ZD67)pG*$WGoA>xiB!bRWB13pTIih3 zneQb`6x2EQxrjGq*5E>4Gg>t&A4yjVsfMtqS_7M=GyMCW0IU-}@^4nF)h%7;%jxZ7 zOaih?j*vJwfNCl7)!KeTb+>CZ)N$U-LE~@w5{fX(Hxupyxt3m1(wo%!vbkhe6UC0V z{iMNOUs!H$0Q-Bxr|ZHS4^ID=QxzlF2Oze1l9dgJ?9_7OsC~H%NxC`^|Lb||TpL17n0~-dOd(WFi{VbB zbS}M~v^Ls6w_IjO7nB3QOWLj@L)sHEGkG8hHyV608u@@=d{VH2yMtB`cpq!B1R1mJ z6$T$Kd#ZGYA5JWtU{8*O_*^eSEa+yEmg1z4LZWC!R|d;~8h%E-;rjxtdk@mwct)^d z2m1;$6<<+uuL#Qt@$ZXu(>Yd+<#*CgTf7aFctn8{8nsdO^4i^XhVL)3lLr*_z%h|Z zq_1w7xS`iEZilpMum>6HNAIkSqr^^5_+mpTJ9r^S-9PfH>YW z@zFac--I>h6r(H{^}Eyr?DbV7b>B|k-*oQ!Qp^;~^sNzLLE}5~lkxj?2pt<|=>D$5 z%>Wb)S761>Yk7DCm*zt-*mQNg@w_dMRN#9t!R?sIMv(PaZah(CzA^w>I+DBY4E?#Q z!#tDk>yN7}3j23XIgHl|=t;Ieh5wVx4F4rioQy#R(6Ikvdl_eDm>r zodpUr8L?hzphI~DmkG?j{(k*iJ~rwkjMcf(LG@bo`FS*Ywh`rW{BzR3^ZoOvJ7R5V zPASmu?Uy9_P{TQ;_CYUO?p7O}kg#sMLx50@L;Kd!Re8B)b9S!)zaMA!&~S^hYFaJ* zR-nTUXJ^gGEIR=|eO1krVdiL9bIO!5!dItGje~BNf$%TxS|^~J*Bh0Wg$>cFrfNjh zX9l3|!PbLyDPs8dbeQDf1=bJaK4@@F8#nfGHM0}Vwd}4+tvE)wTYlDB{hBE_WG{5H zscDU?P0q2tQ3;fgrZ3i$-vze8)&A`L+n8}d$O2qlwr-!0t zEpM(_f2(UM!h@UDig`x6je~j4sE^I6Ag}+u{Q;YKI>!syAK25eXTCnuUWe01e0Bnd zrr*8FJk5Wy3Fx!d($vKaM4g@K&g=B3<7y8)q}iPWR04fcwDDgyvfehY{-ilHQBV5+ zoUaB%=jpDGi7Gmn33o{9bMouZVWekSsAF1Q7wTE7FT-e_lsS(QTvSu`d+_eskSq~+ z_TN+P9=)$_3n zTjc=S_UD80YMOaxtqtAx9g zchR$Z8yDss@T={I!rJxQ&-7Gwt#onf@72XQ(E?lRw!8dQF=zJ^Hq+NXx6Ot2(L1b3 z?V6YgCa!rfzt~CFY8{ANcz$G8qS0_>#11d_8HSJ_V5>BMUK#m6v+7CmaC#MvLJ=({ z%ZbJ&p#0u!6L>C1a%C$7AIH>W-!<%HFPh|cgg?~Ta5Z(cg7t1dIQ5?r|54?za)b-p z=?nDpdI71Hz}N@u}oYdGyfz@XGxH6hdXzeE||=qQx0Pa`Tb{^`YAO1hAJe&jJAj zx^8&S6j|x6Ke6*?^o*US%(?p3k4bdEA_Iv1{Wv^xwKBYdjD3-j;Z^F)50hEY)$`P_ z)tHH{sp2gLN{4|zoJmah$krY+zF)|!(tbG^Mz_)4t^NSLCe~zE)5|Wuw_mdDi$hbh zr*Vu!OQjp#TuE&t4TI%8V5)n`| zATjuxQN%PO;ujIhZyN779aeuxPdwKXBE%37l7V#iaw=u)X~JHE87&Q+WfkEM%Qh*6CIR-nV?mS#2auC@ziZq z!B`zEgeSgzCK-T0apO_bI#8`xjsaVTW(|r^Gf2v}gfD;$mb1b{j>a zc_(Jw|JT2z5jq;6Wp}a9=1UZ?F;rIsm>z6nG>)*pKhOHV%L?Hw_+1go2i{ysE=_jm z;JOk}dZj%_Rp?zcfGAM3KC|V#3(?Y)!mU}gnB8Y8eUlnjM48=yLPCyGF%^1oFv`)3 z%u|BhAFt{ud{D3EG^y6Su4QSA+o?LCkysvmUyt{#N2XqqaT?J9Aj>ZGc~i$N%)WIf z8N!(OZ*^MsPZntY%L+|7L_8n%bvtb9tC8g(&tOXX#c^V9KwNe(#OQ?$tP8k6;~2>K zjc8snud*$%t-^rGUL2#DpLP>`gcG_!Fov$66Eyqc@|Odj$UGL?$(~H2^GsN1@R$;R zG`FI&tjaDaJglo23Hc)J9&SWxDC)-C(<5YBAVoQ}e<7%Bx=n!*yezP81~;EK$EidD z!kufX->Ce{fSFV28vTInCbQ*?qs))t&>~4d2?1bh)K^9-^KM@znBd7_BLSA; zPkmUfj{cb-5!K0tMt-iR96Cz+49(;avk1=LgArMk|HqBbD7AKoxXVH+rg`3xmXBma zbP~^IiZwQy4&SeWkg+ezQZXG7CPw*)*VTO)xEwznAewTs8;T(IMhl_L=6p7aopx^# z#hD6fZ=@L8yRq@&t|Or+PY~afL_!4w{Wm9ePZz-^9+dJ8pp)AfAOOTnN|rUq$DZ~! z1vzJ>uz>F?9yzcIaj!#jfU?32E$}JNzyN zD~yu^dIxWYU`JgYA?B#2lMR=;fpMB8Q~27{(!fRw}XltcrMWV1(wwa0)3Bic`gB`gFrArjz=po z9~Mx?`+#~#Y&Ko_7P3umKXQT^y&7L0X$@%uREcj<3n;-DVa|9(cz46Vx#E+czO>Qt zj4R}1Gc|q{j@FhzN@KWNp-kp=(@tNJT6z_P$Csp(Wj)|mV09o|2J9E=B<6T=bN|Yq zUYPO5K!PLT5sJLmHpbfO~&$>q5vCk0Dp)9fnM;4G4Ft7cUvX3HQC}^u%=PZKUG|CP4Z$$Z|I}| z+ng!wJg#RKx(1zz6>gxctF_}mcN0)gKWy>z54+W%Q5lycjapub`fTv>4 zsbd7`8Pcy#$yG?EnW~d{k9?gTt1mzTl{BJ|uw1S@F;kyNOaUzM4YG)RvpdqlRt8&= z@@KA}NgqPp0XPSPnvd?fKp~1A@+~ln(Qn@ z6LT3XTbD0fSfoW`w?$cE`B3kd;WCLF1?Y`*n$YV_=|+`4gn-<|D7QqvTHXYK<^cox z3Dvko?P2-mJ~PLcuhn59KLZjKk}Q5Q)n%Pc^sCF5ag*~AAHJi$U*Dm4x-ic`ug-$o z>{a_TH<N)+XX%!@(!iHPA0?H!BqxSYl7xQ(LL&}T&?v9(baKpf< zRT*^k%~Jtu0&*QN4sBmMlAi7jL`PD?bCNj(_GF6eX0=G{iAA-s7WC;cexS!s9NIzF zfFmyGm+vQr)6$^3T(KO8YozA}7UK#xAuO2h6-1Z$OpojJWpt~?&~tUfqr3&7`TII? z=NR5Nl7|?hqfwS@HRQCdw3u-n=9tQBdU!xdLgtzrfa-Iv$w8cz<45=b-SWJUVCylc z2J{^Wu6_s*r#LzDW(b%|Yq+NjxBN^fs096aHN31cUp9vN9QgeQ?>vMHmL}pkazYB- zY7(}(5ENwFR{-Z+b>k>zt8kW`gWn?1x^%4zUrpm#JJhb5FNqz!Pz=>2^q%*ILP@~d z73KZ6DZ!(!og+ahxx@Tl;H=)Yy`pMEwfIkH6y;LB#b!%t6|NS`(Yh|R35aIe;8G$a zzEv-@UA3>pllqCMccNxy-Jmw`>?=@f2q5ur_cH?Ek2o?uSu%$ozX+H|H>D1djj}X| zAYoyN%ffaJ9L1d>o_ZB535JK_DcSEN7CA#9O;&lS^tQecu8EF6K(~;*Rbn*r_QgPu zqjE>bOaHv=wGdoQXV(%>_e4kphK>Yyia0b_wF&b8rnIUOgwhcDX5JBmvkcQabnHY+ zW?LbL=7Ig9=^-JxZ9-4Ky6ng%-?se7tMYsC)Z`0l0t zkBzD3jQ;%mgT1*jApNmTl|#sqhyGE7nZ<_hN)giIL2sxCNM}MpL6D5seLGK_K5?#= zms=LhUK&1+sO2lDSmfSyeJkPPx@})A9<=x;Q2poP*m8I9)uq@%p6E(Wq(1O7C zwPG$YSu3@$*!5Yf35VcTf#NqVyB+8)bGN2s!snuAcE(O55PV|!y?VVn=x(=}x|!u= zeY(em^1~*-c2$_S`40!(Tc)SecG)EN;i^n`Iulhuo)tuX<03m<3Awsr-wVu29kPfN z9J4?F$+FNY-wGG0#~w`{LX@*yOVKYTsTq(?=--y=a`a8n@@<|k+Dgb5@{vyUPY(!g zcFT8eCp7rjKxmM{hUzXE*^+q8s}0^cMMVz?g!rs=tWLgAI?1%DJUPs6QpM zjJ$a7+l$ZH5-2Sw4i_mX2TolP7ODEyZsKQ{sXbLi#XN4P7PWT=ya_ypFZd}lmn0>% z5kQV-0ZC&(Q3Z%fHy$Gs+NzCnVFwnGAa@jOur3TQ__c6}k*Ri}b zi9rDKw35a+d~WcO0;-D(GDfwfwTR?T2lwp5fnq~FZ-4mnpOXYN-t%LrN+Qvuys-zE zSBvWw8wSyLo4KSimYAHk$2J%?!lNnElSEaybsOf^ImU~7s`g(>S+WB=P&*KcLcnP0 zN}LwuED>}0hSJGxwBVj9Q2I@Y)tb>a*>sFKSG25HZC%hTHDW(>Pjsrpv49ztm^KZh zKw8yg$D80`c;v-Y^6ALCB=q}h4HA&uQezL7;r!HtCwf_BeC+DjeILZ4tka&fh8+zb zCK(#oFOxuK70M8PHo<$D|=RZMw8ffbJHJ?UH>Qkc7Q6Qy{|eX2FA?j0FyPerb# z@C*puy^7@x^i*7Ja#DE4hDcY$3-L|tN=Fepbrw<+S#<^xI4bHkW;}<2h_-9YYLs-( z30@>qJNc&4>SnWJ9j)Q$szH#cSvsYSWu|u9Y4l#F_)cbFHr%Txjm(%<w(0 z_VYTaP;EcgIp}|Gwg|^jcsS|c15c!Wz{A+=56)|Ox?E!Cc^rX*3y%n7P1szwx!mol zZ<)mfLvbLR=tc=*Y1{=~enVkCuAH9n+!C+LpR?Fpyt7cR`blakr2eSDfrOYYJ-nC5 zYkjQ1Ql1ukGTuG2GakIWp&Y*UV>$W5Ppi{E7`=o{_oLU(XqZ16SIFVI2iQDgCMDRf zEh=|;+77JdNp6~g|8tX(tJfJT$tWb!?Zz8jRsxbTK4m$y*>ILphntHN%*f9D@={D* zkMni-7uEq@@u{z%wh_PCp>0%8i6q|Mm-%39;`nG}(fc9rH3d&Ndnba1TnvAS)RU94Gx+u5 zFuYnDF2PEV1z_t~{F zV{UtOVRo>CVwIjR0;WTIod~cheu+ass~lm@=+gv$J~a-u5-8MV{LHkfiMjYxkje1t z(}=SZTwQ#&wdzs_2%HcfvpKBTl-f0A@23lSJH}t`psmIydDI4nAicR`0N$ZGYySwa zJt4Qc8m?54%!sAro03E%O`3O^ja%waqtsOPIjj8(TgRGqc|9|xbHS4nGzl9P(iy!0BDv++g>a6vs3;H->=4# zGfzK0Q(mKm-eYvwl;Voe=`AkF&B^Q;+B8v3q8|O3`0@z8^QMNqrm^(NbOlx%r}(_$ z>pMn(^7&D0x*)4=B1md7T!m2|7c_3cvg#^bNYs-J{nmt$*M4*>q<8Riz0NTRzHe4N zW8%)VMr=rZ3wY7I>vC9iQ(H>35*(Pe)t6G5ey32t^js;jHnf`k^MiG>vOx+FjBz6Y zyD?zR?%KY*^2?<4t@+L|tWZ8CgTSZ5nOa*pkjZP!R7k`czKqS!i(#A*6bYjRV?kd< z84sDhq9JFBac|ig$SVK$f>vffoI1nF|HFcNjVXbz4ruk%o+3MJFrMNXMe_Tr0wghl8%;G?r^TL~i}L7SwYAg(e_viYW)px?_^+K8HdWVHaCS6Bn`ZS{Jn z0s)?8Lcg;v#nHXaXY00jEqzlZU(ut|in#v7p@PU)PFl04WU#W02q~F|RYnp;59XQ~ zBHFwH9N0@472!%W-h$@T@`2kus>YSxLqrb#eUj(EM#D17y2xaWQJmq_`hp7^Ju|1X z($SNCQ;PohfOYto1@|9^z$2ia_?Sx5DHZxW`PebNtRn_>h`Od0Ei{);+}cuSlu+ z)32fXG6q(oca!5}cJy5Qva+fm%s`Rc2D0zEvag|(v>=ySnW(oFN;T935%;u8Hq4?@ z8CFEiH>%?R<%K@cY8w)m{_-%z%(M@g(toZYKb7)U;?%4?i!>ck1;9jejLdU**_AZg zCk5~t)aw+VcPtrGumxF3PqR`P!c1h`&wncW?QIf_r4e1;&*m z(Zo+6s{KYwJ%-(C)IX);uvOVv*;+wFxxfh%erq1y`+RxM;FKlaNAv;<4Li{C74q2rJ`lXAOFByz=E31Xs*>;;kPu%`;k-@6vwzGUx^X zjWnEK97s#7UGE?vMV!gqG`%_e3LIz`&KGDlmL{&qk@N>8^4?|O=(hTnm%tZ7z8PR= zK8E%f*uJO8z4hSSBYICsxPm5m45@AY_6ag9pXm}5XgT>l0x)C4Vz~^xw|LtBG|xAW zZ)mC%yO2E3@mZ$mlCQs6H{<6^Z}#ka#7q?ATvI2wP*DGFi?_p4w28770y2y|Ip%br z)+iE&DOG2Ot%tM9M?_lEK!NKU1Pm&9f-WHuuo0pYn7k=fPVXMIc_-D^lz>R=)iL-YR(}+6O3EV4QlrZ)12Ln&0R~CLal2U<$O% zd?>#(>zJ;B%Y}Qre**bZ@x97@>y=g(ins^=Al>Z1@0iH#cusEZ165C-&RCf<=rajr zsD9t#U9MlA#+j~Z#pTlTk5O5`1j`U!S#Tj9=dfel1;{+`Cm{Jb zY_q8O1CFj|WoS};t4QSt6CIfFMm*`zGp3u!>O$FyUq*hFa^%?1XY~<}+XimXz?j{T ztSn9riuzl4RZT|*3N0*>+atz4N=2UYjZ>2E840KT98_2 zWCCyE;+zKnaWL;#G!!?C2R`Ph1#p#w+IH+Bk(lVQQ4Iv%_Ofg~y!Lf@BV;xW^xPBI zZPk!*r@3KmLUy%Em6*^!DlO|Vwv6!CDu#&8foo(JNGVrT;lH|O>q$YgkQm-Ml+^0@ zdM~!tZD#Hyfj^oVEJ2RIjVy5MmoCe%yOkHcgpqE9+ANsVZy=9E&Us(r^aiIR(GR?K+S+PcY`P%RLD2($9=&U-Z zPz*O*fFpUXgJm5PjbO>OTD#>}z%F02*`D7-~*(zMUZC*A2OXaO#3= zlCE(Q9+=4MXr<E{%Kpevhz&Fjs z35cZYygNH0BYT#ChFY7ZSy@5t+;IUf>RJlNQm=;``V7Vq->N7S5?1rWgy72J*&bXf z-)8F^f#g?V^re1ne~BXSudjM&c!``jOrm0V#?mUk7?-;3;bn%c>?Lx(PUn^q(w7pV z&!m;hiF-2x-A(x~3mr!sPvTbpn7q_vG&ZHBY>Xx31?(oSQ_NV+HM7vvZ7*PCgL1>B zxjV-mLdKpFO!(KAY3MsdyoEm3z87q-c6vQh0na#iWS=&^FY}0%N_Osy4Z(a0dV5F9 zQWHuTCO@aH#I=qwf2e$)_%NcW_~F!D?gSUpvr7p6rPrScn>jJ0|8tW5M_Vz&?@WGtAnLPkyw2+kP8^b}rE)E?ol){_F%HG6W z2$;?*Y7swQM$@5oLF*$aIfrL>ebN+r+5E1p$l zLH)H@k2*?_gw37gP_jvlmrWVrp#CCJRhd`EbQqT8c-E~nSQ;k#xMk3_GUY$fQSSc} zc)hpnTz)K3vbXq}m)$ltZp6oQ)CH51pXg_*C9Clq>Vc{>L)3;jyNZTn;Tk_004x{_ z)wGoiupr&^{q^G;B5Z>JBZ2eJ=|bp^+OH}4CoGgW%d>}%umd+Y5n=6@X4ruTX);iY zQ=ml3Gpdw-JRAnfi_fJ^e+O}ynZT!I}4o&&Vc=Fj`HCC;! zTHRQ1k^O89PtW2AT(FeTaw!T&C!j7=7=m!m?l5=R>L$B3Pl{I`!Uir$#8$;%v0R-Q z8s}GylKgmb5R|p^ZCHu=Q)`x9c8`J&_mPQk(t-BlV`|;~#wf8*1;~hiVc~LdJ+ZX$ zPJu{zn^m7*e*aNUaxR6EJQNr$B+q#warED2yofQu4WPX_FL`T? zf~w17$nVySw=yv*jb9&y^jbnUn7Hth9#)LWLr$;R1*{Hc4EJD z)Z4dhS|my9>LzOS#FzEz$B_%F=;RCCMT zP9uXowFm-^pPih{0}(n#u3>sX%ji_bTvwjTQ(nKax+pEq!?jqm%Ynz1gJ1kA2SOR) z9Fs6f3`66d+KZV?T#zs>a+BO|t`1SNTPUS7d9v<44lpyQkLS*Uv#IOHyjwX*s;h5 z*|ylZvotN?&Fv;Sc#4&X34ug|m7^_Iro(^*!P5*512O|&?@m6NFspZRDr}GNY$-Aq zJfPvdA}|gITno$iZB#x$uvwIK3UkH{sEOG~qT-aflA?pZ<~P&F+x&uf`K=&K$P6T@ zI4KzO?Q`hoEP?Wa1L-}CS4{QLr;??iLUU``LA=Q#b_e5IO9nI7O^Tyei~OMsOA802 zm?)&JhtCas`ArYhHd-D!BA|}Bbc7Sox)XJVv_gN7$;iJBQ?!9!!vSxh&2=DnrS5nZ z^CjL?gaUKO##8ZO1y5OFBpi&~-1+Aoz50xksyHh@DuB~5tMfCPXTChq#o$GJb04xY zfm3gb(?*Jl`NNC6VZ#b7@-({u3N5pl1O22+cz~^9nteKD1vJe~=A{h>1xelvIP&sq z%M2T?@6kxahD=anG43~PEH)+4rfap5dy>3<-M!lpQ}AplnAmF$gCC^ieGUii+qcW0 z@K3?GM<9_~on4{cS#{2ghE~IsSs)RNN)|TjPA&MAIaTy4WCM2Fya{a!1a$V3g0D@V zIF_wyv%SY9Mcan?Da-8*op;n=&PZ(HQM24n}IPPv+7XcLPts zduXEm^gY<%+QDn*B2!ldM%>?Hy!ze*MI5`fK@QC7G#WkElu)8O5x6)y*3tMlC?H@2=b ze?&_+a#oH_cSTf7EizJ%(oyIliCRsV9N|Lmth;-y3UZ4T%g)kfg;4RJd##d^$d?vT z+s4-HPd2?uo*nyg0%Mj?sll-y=q3xf__Ut^wUh$cGrkvAvM@)=-U88t)hrPhzk!7% z4YS)QBRbBNfeEaF3rs%@q+-Ldv~kXUhik|^ZU7*!WIZ`w7G5fIx=ysNnrI(iOnnKY zWSR#BrJ$FBGRi1o8#H~`7%hL4BB|fOtm-l|;!9jUKVc`cq8~OQIKp8s5SWvA!IJ%+ z?y}GgK;ARKdE(*$a4T`cRPS=)WP@!FbBU^0api>N9L=phZiR8~xrn&o7?z;HwU%RB z$Lv#SP06Y$SfKN#$N==+)sI{B3y?Rn%Y;|`UfID~zCRk?jVMg{6*q||URc&;Sr8jr zaE^+OOZ4)#^U_^W*gFM^f#1&>?2>h%QZR$fQo9HU^Ru|W=hVGP&r}Q*k?v#Rc&Wn*`)=`m~HF_$~3MZtN0A(UdM{k&m@6TeYd4&Yt(R3 z@}j7uqze?$JU$fgO`6?o+l~()9@A7Yatuv#M{^t?#uITkT_q1=v@W9!eNFNafhjQZQS-_!b+kU=Jm9=3UKm$nANB3ZSOg;+?<+a*0;1%x++G-cHmtpwt({cdWcC%v)XDBI=f^0 zDP<#V$FrZCpl>JfQc+6hRnGgCCHu#yG&Iu`(7DYn!NPjq{IuSZ0o0UGHRzOQo(!)# zChAX;`FO)I=ksG-s{C{}7+PQoMSNZ7l^;oh6Ax|&1 zw6<1(Tlj{1*lBmCiTv5}@3;1vlab+d-PcRk&}w|G9F_!|cAkz(+V0V1&e@1wz-uZj z*JzhBXQU&yM~=Ews8p-IQy6A%4c7v^nY&}}!l#v5h8$2<$4rSXZk4>S@@qg4h)OHb zHGp%$8l$vV5IoU znIEvmF=_bs;g?q^Otx*CBw|oOCQor5t_RUAFr= zpMOuFIu3MCaIt7}%(e5*$P=rKpv)0<&9-Kb_C zz)1@dkC;n{>+|Hw5={0AC@RE+Orh-NliALN-l(H=18wh-~9;ep1(4_ ziK3C`-Bg9IwuV7PgGqbq8#1_GV7UCy0$LY;4-wOtfp-m49LT{en7MWmk_gp2GUzaN zO`m@7{sbRsv?zt3S~$haXCrH&_Ez@@X6PR3?hiP&GXu7vgr`D&`08FDHC*L!ZmJXZ zHKY?RngU2Gqguy=i0z7oNO-^_TLCyOXd( zH|{BA7iBa7>LPAIGXs^D9@cTi$6Bil*jw{nYZoi5Y#Nt3EtiFOzLC+wKKGqelA-|sQr zlmr02i?+_*qpVASd5zbOnnNlN_)ru*qnBMJt2pAf_{GK`kaSNO72hN9^J-z`pvfQKdgvHWRe*8NVDG7fT66GKN8#1J%~zp7&_ z$%#H4w`Ze%8F`%|SIM+FM)3qmL{yD2H%M&UM)e#mgv4D^Ig%*5g5HXX>&6#Z-UY?2 z@^;yuW#ML5V8y=qY&Nh23B1G3Pkn0&XfDzGDE307XVhxY$5RXnKw!6vdy{g|^J_rG z@kqQe*RTfxLp>|dM-*gp8FoBBBD1g$(Nz$N?wp$1q{GIB_56~SeagRHG~yczfVExF zm8Q*H*TH9uppnc33tW4<8ya;?%23pkkVOK+3{cY-l!;&wX8UnctJOlY7SXc)cs~q=V;Lk^gr1!Ppq}c0-0& z$8$)L#{abxrg$~aywzj|Z~SAo8dS&dDyI#uT$KaIRK%POU@~n&3`1z}&GvTgOG&oE09^Y?`2& zBx15n8*8#>%+KH7%7|gW1CM%?>L!s&Q#IL4BtG?48{aJ1>uL?xZJKW-t0MctFSz4dCTC8q+Pj$Z-Kwm(Urs93^MiIYY zHG@7fxaIjX_3u&UK4z;=BSr7N)iZi$DI0e&Gd+sD_rP#gW^(O1b!&4~q0eQeoR*uJ zB(U>|CQ6Mq!Me0rYOgyobFu0O)9if16VpB51gA_9JH^pZ?_-UDmsTw~x#uOL(Rk!a z1?sF!Qzo&--oevD1U^|B9B(ojMq~>3=vSl-!bcgpohn~VC*~_CaUa&q_;f3 z%|Yr}SYgPYPd7a1zvefbsgt!OAG)5k(uWdggE#qT4TZx)7|qDyW7w!F^;`K*g*fxT zb}m8cZ1@|^L&G40c)snuW|e4$rC0Ae>kv^n3{gG{DCwov0<=L1%G@aC!FyyC*dNZr z^Gc!=Ual1hxPi~7gHRl~`(hE%Wz`Tb(CGUTNO#MNd&x3YEh-zO^1fVuw-_mR5(>g; ziFspiH+d)}jZw|wooxQX+l%M!+ZyGLy~9So#4_EJdr4#_5(-h3=>X%p*dco*y6|cF zR{UPBKNVa188B^k-K8p6wJ1RpCulxb%8o_h*;EhSfQ^+)N2bgk3}t(X=~ar9T;iLi z8?O5^>Ut#{q4#Q2(% zzuZBvx&eu)b_Uq~6|GG?88OhOubDXw_tVwgJjfaAl^S=6-SiD#jRwq_Lk_p*UqsKj z$HH)okH9Ov5ydiD`UzUI#M$5RqU1VNrxXk?4=Hfg(dM~inXbHSL?xwi_)R^olaA-s)`HPy|805(A7Witin9wd#tQ{X8tyT%so#?|lvi zR3^aXS~C(+=J^LPU#rfSnl!w`(IjdDh6i(Ytq?z!y=VQ{Zq&}FDlvJxi?EgV`3S%q?r`Bfp!oXpJyvQc zKnTz+`>PzCJnrnxysTGdv&o0Rv)YjRm%XnD=#PcjBo+~@_QV&i5&4*-w=lm@oN8?{ zgB)P`Be0ExmyUsnZgZS|ku;IHk=%LIDAg>^rl%F{VH;~80p>KBV%S`(M^$7-hDlDF zDy&%&*WEaZpd{3sZrAry#WvXosc8Am*P4JGRRSUV-8Nc(5t^r)d6PzYth!%j-)!d+ z@%He%V|NUNa_3;yz+rKh{45mVIBa;Y!(uWld!i~fc-J9-wPn|j+Yt5X$9I~!E(LMg zsleeqhY+?G#f}{~Xxdv4XXB9|j}T_xn5Gj@X8f12=kt|irz=x0dP&QnDlV7VDnXz= z5IH+2LVu%z+;sG}eX3h;7mS45X9NBu@h=fe17TS*Ts@_meXn~Xcqcvxi=Gmalv>;` zusJ`?1Y3+X91#-b-LGu$%n_Zos_Dtx73ydD?*N(wYFed3QLpv~2_S{ju!T;N?gv0H0uf-UK6prY0tDuAF8<1$X0 zs+oit|G7F}bPR9TX_=F0lC*MjetZ=xV&o_WyKVVmH}PFWQkX@fZuYj_C5st?op|df z+%%V6=H4;TL&2+1niTNa*GycXY}KWj3Cp=8bhPE9E!sDXXr}ZJ6BOBsIHs zW~W`B{A08vTd7966Xw&~d9LVAk-kXQ(n!6EF%)C;vSg}MD&|3SmNOWINPJALdUZo(1d&AP0)DC5!Km#@ny_7OY#QP5waxc!!(IRc)+y39)WdSP ztPS*2>97_%#t>UphvbF@+vgbyUo+aHL4%!8G@T=bU>7#;T0_?$k#ZWJWaK37@!PMx z%67f#>obOIU3UZ4(FsH9cZCp|rMD?3K1Nm#@gWkKtc?l`TlD&<(}0B2_OFe5S1kb17ftpU1RE^`RG8LSVuPwH%TP{n30X zBjNcn-puY~#Do61f5HqnuJD3ix3=ivIN2S zK;IK>*P8BuDXxuI5~A?AyX!vxMSuLEhPRac!N&WYCA0n=YCC$(@4NKW^B1b_Z=TmlF{jei}sdMrbLGRpWo7Wu&K)01{> zEhp!*C^V&C>)Vg|Yn}l0z+Gncu?9cn^1~X?`9PAv)$P^*)y1d_KF_yx4v^!3gn1?u z?&DTneKbHPouwOv#^NlQ-@CF2mIr!6KpF4*DvBiEkWJs_S5|Pz(OO##1D$A7qfIAI zq_`01D(6@@BDi>@;+uMhg#p~X&d1)no^Q1gwFKGEL>g%OIh@3`OSRnrAIA>(u1rP&Qu?h|=}lK_H-|ptGrOdBZS^))Nps=E_i=#+J%T)~Baiz}H`$NX zOUDP$Rt>bf=c%G*>15R%VDAYT+vUR1#f|Zk9^Wpidm9~KuhfRLy>jL~VBt8l+eJ?H zHY`%pAg&fVV>*9Og6<6F%*e{yHQS@@*xGwwYLzp^ne*0BjeB@bc`IF=o z_5lsQnZf?^G`l=s$Hd;v%<-=C{fTDp#|5f~-b_;#Qk_dZ+A>@4{YitR=fy4<1dQ2> z-R5TJdelP^MaluuDu-sF#QRmDT+rN*_P#{G{rV2f;))yo(N^=5C+M-^J1Ai1Fc2dS zB4w95JC5t5<5ohj9%FtwpGisSBNQDGO$ZH_Nv`7M3D6T1WEfoEDm}bV)$YHSXj(3e zJuL_+gP?&7B$^FmkA388r;1aqct4Z-JZ1xxMv&`nx$Lm3ke{3^W>@EwW*o4IUw!T{Tt5MgyW` z1_ocwC7_YqpZ0sVQ3+y}#p~&RZnkg^Ni!0*Q1H93^04z`pI_a++h6`zc}>Oe-NQz=Mqp$D>*iw30^>Yx{2}!MKwb?R zdOV17?ngL!dLKoXT9=9!h7iM;=G@*6fF1g-hG#0q`RYth1K}1fn7G7O?l#M=hKJie z13aF)%L@rrm6&2K$W-CpBs<7%0yU_;g5IoSxL<}hhB686QfUm1R;vm57;o4B-Q>Ou zn{DD4UjkO~;2*aKlcUoP=(p~-d%YBh@v?@^RBZ9JW9x}f*`$qfwo*Q;qcu2U1Futq zu+XOLP+gl1Wose7eGxt?_U47Be)jBoAdy)ZO_GeaXP5??w7ib3sMt#oM#fTib`%|h zP~h$kdZb$LDiF+8G+38)RJVrfQ-@5XmqrzP@5L}u(V{q#<091Nvb7R{#ozf3Z2k$7 zbH$y-%6C1rx^DBBg?WS2-4hR^MAZJdYyYkONx6o%57f*((pist#^~LJB^cZV^dnwn zco*nnqhG$0Ss#}Q@gX!yLmfO~`+}qB2Xc1Kst5ThRd7LcZ$H8YQ3bMuRU;vDj^`q% zeiFSi8>)ls8)j5}brCV4bcyq{M9||@vc+26E4{6qNh`6j>c#Y(BSq9smkWY_7?v$F zWj_|)%c$+Gr5Clf(R6;9mq|qjFdAsb3@d8m$Y8<{do`}5+`nd(g=N)fDjKi}QAFxg zqQOyKSvPS_Fs^IJZ6#Ih4+$A~opOViXPC3=MbouvBLaD$|htt0jS^hOk zC{rVnf$BnV>iI%*G$ZC<=OG;>DRV zSc^nn{W9L;#$N4HW=|r|=vBQ@rrDZ4r&!HEEbRR&Bh@^8TWcy=Y#%sRT;&-xe-@lK zqM8c<7{(il&e*nHzvVX10j|(1oO=DdHW=7K9mRXB@_5&$eru3A99W(~p_Gw1!7$A(u z<%hHW%Gv_#&^*d4x!l!?OzJO$UAXg-V^cm4@`dYn zMpUEfyeIiasxQ%^qC>;MI@rdt;AS>%g>S!P#|YQTozrNXhO0TbN61<~fx-&vi$k|4 z^MkpD%b>x0SwWMP#Mw3SfSB>cB^d*6SjOUu)Zn=<&Lxv1@TLDv9|6Bb6g&KVJoVTT z3K(ktgE?}N`XozbD?pRm2xE9+b>kVSIHR0X7l7V7H3LV`40cuJNVAu zUtrL-h<}zy0`Q9qxAUT#C|Z_7lD7q?*s#%QOBb9+;#I$ERc(tVRz@wk6&EYWR4=X6 zcnXU2Y|QvAONoj?$D9+f@#z&cvE^OBo_eCY*^PRL;hv?UMsW`PGt}>4NI5D>P7Sv( zTu*Ft=JQKJAsr&d6G^%%3P(Tb`AWJ#a2e+spBD04MW96A@c3!W^aHg(YTeE$mRqZF zWK9q!UQDSFjvAnyul^n-ByZ^JSXyh7vK!Bq>1w~)uB5QxvP}+Ub@}F@IBWtV%)JT) zEq;;_Ok)gax!n;ROYup=X|m_LaD6PUD2~hdv$AOK<*O zu>EHB+X5Kzwr-H(*K3Nm+^pLZcJQ#{vxY_Z=wjg#PCZEYCU(Cwk>Gc=PtCBJuH`q` ziWhwZhJ_pu&SxZy7Te_ypUCJ;vWSyv6Ji7=jb;)vT~(v4(%&D;bu=b#Q*)=(-9qAs zuO-G(+BdAKo$hE-1Cioh$sJsrrHDC^<+mX9kp%*RFRX>tu;>y88Gbe$#fd+ylgZmH1J%w-p#0d9{cTZs*2I2q9cTX`N z0I~mLe_h`^04jL#H>b&D6r=$640it$K=QW