Compare commits

..

No commits in common. "5b422a67b2d624fb905f8b0edd33d0a1754f758e" and "73c4533926067c587b43cf7efff681f336f5210e" have entirely different histories.

70 changed files with 72 additions and 2869 deletions

2
.gitignore vendored
View File

@ -14,3 +14,5 @@ node_modules/
.DS_Store
Thumbs.db
# Generated PDFs (created at deploy time)
docker/resume/pdfs/

1139
docker/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -31,12 +31,8 @@ RUN cd /srv && \
chmod +x update-all.sh && \
./update-all.sh
# Generate PDFs for all pages (only if they don't already exist)
RUN if [ ! -d "/srv/pdfs" ] || [ -z "$(ls -A /srv/pdfs 2>/dev/null)" ]; then \
cd /srv && npm run generate-pdfs; \
else \
echo "PDFs already exist, skipping generation"; \
fi
# Generate PDFs for all pages
RUN cd /srv && npm run generate-pdfs
# Expose port
EXPOSE 8080

View File

@ -1,15 +1,5 @@
# Resume Website
## Initial Setup
After cloning the repository, run the setup script from the repository root to install git hooks:
```bash
./setup-git-hooks.sh
```
This installs a pre-push hook that automatically generates PDFs before pushing.
## Local Development
To run the local development server:

View File

@ -6,9 +6,9 @@
<meta name="robots" content="noindex, nofollow">
<meta name="description" content="Colin Knapp - Private Consulting Packs">
<title>Consulting Packs (Private) - Colin Knapp</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<style>
.pricing-section {
padding: 2rem 0;

View File

@ -6,10 +6,10 @@
<meta name="description" content="Colin Knapp - CSV Processing Tool">
<title>CSV Viewer - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<style>
/* Additional inline styles to fix layout */

View File

@ -63,7 +63,6 @@
<a href="/one-pager-tools/csv-tool.html" id="nav-tools">Tools</a>
<div class="dropdown-content">
<a href="/one-pager-tools/csv-tool.html" id="nav-csv">CSV Tool</a>
<a href="/one-pager-tools/utm-tool.html" id="nav-utm">UTM Builder</a>
<a href="https://md.colinknapp.com" id="nav-markdown" target="_blank" rel="noopener noreferrer">Markdown Tool</a>
<a href="https://nix.colinknapp.com" id="nav-nix" target="_blank" rel="noopener noreferrer">NixOS Validator</a>
<a href="https://qr.colinknapp.com" id="nav-qrcode" target="_blank" rel="noopener noreferrer">QR Code Tool</a>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - DevSecOps consultant, cybersecurity expert, and open-source advocate. Explore resumes, project stories, and free tools.">
<title>Colin Knapp - DevSecOps & Cybersecurity Expert</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<style>
.hero {
text-align: center;
@ -241,11 +241,6 @@
<span>Process and analyze CSV files directly in your browser</span>
</a>
<a href="/one-pager-tools/utm-tool.html" class="tool-link">
<strong>UTM Builder</strong>
<span>Generate campaign tracking URLs with UTM parameters</span>
</a>
<a href="https://md.colinknapp.com" target="_blank" rel="noopener noreferrer" class="tool-link">
<strong>Markdown Tool</strong>
<span>Live markdown editor and previewer</span>

View File

@ -6,10 +6,10 @@
<meta name="description" content="Free browser-based CSV viewer tool. Paste CSV data to instantly view as formatted table with sorting, customizable delimiters, and client-side processing for privacy.">
<title>CSV Viewer Tool - Free Online CSV Parser</title>
<link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css?v=2" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="tool-styles.css?v=2" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<style>
/* Additional inline styles to fix layout */

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - One Pager Tools">
<title>Colin Knapp Tools</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544=" crossorigin="anonymous"></script>
<!-- Add tool-specific scripts here -->
</head>

View File

@ -6,10 +6,10 @@
<meta name="description" content="Colin Knapp - Tool Example">
<title>Tool Example - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<script src="tool-example.js" defer></script>
</head>
<body>

View File

@ -1,353 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Free UTM URL builder tool. Generate tracking URLs with UTM parameters for marketing campaigns. Client-side processing for privacy.">
<title>UTM URL Generator - Free Campaign URL Builder</title>
<link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<style>
.utm-form {
display: grid;
gap: 1rem;
max-width: 600px;
}
.form-group {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.form-group label {
font-weight: 600;
color: var(--text-color);
}
.form-group label .required {
color: #e63946;
}
.form-group label .optional {
color: var(--date-color);
font-weight: normal;
font-size: 0.85em;
}
.form-group input {
padding: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-color);
color: var(--text-color);
font-size: 1rem;
}
.form-group input:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 2px rgba(69, 123, 157, 0.2);
}
.form-group input.error {
border-color: #e63946;
}
.form-group .hint {
font-size: 0.8rem;
color: var(--date-color);
}
.custom-params-section {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--border-color);
}
.custom-params-section h3 {
margin-bottom: 0.75rem;
font-size: 1rem;
}
.custom-param-row {
display: flex;
gap: 0.5rem;
margin-bottom: 0.5rem;
align-items: center;
}
.custom-param-row input {
flex: 1;
padding: 0.5rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-color);
color: var(--text-color);
}
.custom-param-row input:focus {
outline: none;
border-color: var(--accent-color);
}
.btn-remove-param {
padding: 0.5rem 0.75rem;
background: #e63946;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
}
.btn-remove-param:hover {
background: #c1121f;
}
.btn-add-param {
padding: 0.5rem 1rem;
background: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.btn-add-param:hover {
opacity: 0.9;
}
.output-section {
margin-top: 2rem;
padding: 1.5rem;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
}
.output-section h2 {
margin-top: 0;
margin-bottom: 1rem;
}
.generated-url {
word-break: break-all;
padding: 1rem;
background: var(--bg-color);
border: 1px solid var(--border-color);
border-radius: 4px;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
min-height: 3rem;
}
.generated-url.empty {
color: var(--date-color);
font-style: italic;
}
.generated-url.valid {
border-color: #2a9d8f;
}
.generated-url.invalid {
border-color: #e63946;
}
.copy-section {
margin-top: 1rem;
display: flex;
gap: 1rem;
align-items: center;
}
.btn-copy {
padding: 0.75rem 1.5rem;
background: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
font-weight: 600;
}
.btn-copy:hover {
opacity: 0.9;
}
.btn-copy:disabled {
background: var(--border-color);
cursor: not-allowed;
}
.copy-feedback {
color: #2a9d8f;
font-weight: 600;
opacity: 0;
transition: opacity 0.2s;
}
.copy-feedback.show {
opacity: 1;
}
.url-breakdown {
margin-top: 1.5rem;
}
.url-breakdown h3 {
margin-bottom: 0.5rem;
font-size: 1rem;
}
.url-breakdown table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
.url-breakdown th,
.url-breakdown td {
padding: 0.5rem;
text-align: left;
border-bottom: 1px solid var(--border-color);
}
.url-breakdown th {
font-weight: 600;
width: 30%;
}
.url-breakdown td {
font-family: 'Courier New', monospace;
word-break: break-all;
}
.validation-message {
margin-top: 0.5rem;
padding: 0.5rem;
border-radius: 4px;
font-size: 0.9rem;
}
.validation-message.error {
background: rgba(230, 57, 70, 0.1);
color: #e63946;
}
.validation-message.success {
background: rgba(42, 157, 143, 0.1);
color: #2a9d8f;
}
.validation-message.info {
background: rgba(69, 123, 157, 0.1);
color: var(--accent-color);
}
</style>
</head>
<body>
<!-- Header Include -->
<div id="header-include"></div>
<div class="container-fluid" role="main" id="main-content">
<h1>UTM URL Generator</h1>
<p>Build tracking URLs with UTM parameters for your marketing campaigns.</p>
<div class="tool-container">
<div class="utm-form">
<div class="form-group">
<label for="baseUrl">Website URL <span class="required">*</span></label>
<input type="url" id="baseUrl" placeholder="https://example.com/page" aria-required="true">
<span class="hint">The full URL of the page you want to track</span>
</div>
<div class="form-group">
<label for="utmSource">Campaign Source <span class="required">*</span></label>
<input type="text" id="utmSource" placeholder="google, newsletter, facebook" aria-required="true">
<span class="hint">utm_source: Identifies which site sent the traffic</span>
</div>
<div class="form-group">
<label for="utmMedium">Campaign Medium <span class="required">*</span></label>
<input type="text" id="utmMedium" placeholder="cpc, email, social" aria-required="true">
<span class="hint">utm_medium: The marketing medium (e.g., cpc, email, social)</span>
</div>
<div class="form-group">
<label for="utmCampaign">Campaign Name <span class="required">*</span></label>
<input type="text" id="utmCampaign" placeholder="spring_sale, product_launch" aria-required="true">
<span class="hint">utm_campaign: The specific campaign name</span>
</div>
<div class="form-group">
<label for="utmTerm">Campaign Term <span class="optional">(optional)</span></label>
<input type="text" id="utmTerm" placeholder="running+shoes, marketing+software">
<span class="hint">utm_term: Paid search keywords</span>
</div>
<div class="form-group">
<label for="utmContent">Campaign Content <span class="optional">(optional)</span></label>
<input type="text" id="utmContent" placeholder="logolink, textlink, banner_v1">
<span class="hint">utm_content: Differentiate ads or links pointing to the same URL</span>
</div>
<div class="custom-params-section">
<h3>Custom Parameters <span class="optional">(optional)</span></h3>
<div id="customParams"></div>
<button type="button" class="btn-add-param" id="addParamBtn" aria-label="Add custom parameter">+ Add Parameter</button>
</div>
</div>
<div class="output-section">
<h2>Generated URL</h2>
<div id="validationMessage" class="validation-message" aria-live="polite"></div>
<div id="generatedUrl" class="generated-url empty" aria-live="polite">
Enter a URL and required parameters to generate your tracking URL
</div>
<div class="copy-section">
<button type="button" class="btn-copy" id="copyBtn" disabled aria-label="Copy URL to clipboard">Copy URL</button>
<span class="copy-feedback" id="copyFeedback">Copied!</span>
</div>
<div class="url-breakdown" id="urlBreakdown" style="display: none;">
<h3>URL Parameters</h3>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Value</th>
</tr>
</thead>
<tbody id="breakdownBody"></tbody>
</table>
</div>
</div>
</div>
<hr>
<h2>About This Tool</h2>
<p>This UTM URL Generator helps you create campaign tracking URLs with:</p>
<ul>
<li>All standard UTM parameters (source, medium, campaign, term, content)</li>
<li>Custom parameters for additional tracking needs</li>
<li>Live URL preview as you type</li>
<li>Proper URL encoding for special characters</li>
<li>One-click copy to clipboard</li>
</ul>
<p>The tool processes everything in your browser - no data is sent to any server.</p>
</div>
<!-- Footer Include -->
<div id="footer-include"></div>
<script src="utm-tool.js" integrity="sha256-f5yZtBrRofKWD/H5Hth5syEYPun+WicrCGxKzyzwZ6A="></script>
</body>
</html>

View File

@ -1,294 +0,0 @@
/**
* UTM URL Generator functionality
* Builds tracking URLs with UTM parameters
* Client-side only - no data sent to server
*/
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const baseUrlInput = document.getElementById('baseUrl');
const utmSourceInput = document.getElementById('utmSource');
const utmMediumInput = document.getElementById('utmMedium');
const utmCampaignInput = document.getElementById('utmCampaign');
const utmTermInput = document.getElementById('utmTerm');
const utmContentInput = document.getElementById('utmContent');
const customParamsContainer = document.getElementById('customParams');
const addParamBtn = document.getElementById('addParamBtn');
const generatedUrlDiv = document.getElementById('generatedUrl');
const validationMessage = document.getElementById('validationMessage');
const copyBtn = document.getElementById('copyBtn');
const copyFeedback = document.getElementById('copyFeedback');
const urlBreakdown = document.getElementById('urlBreakdown');
const breakdownBody = document.getElementById('breakdownBody');
// Current generated URL
let currentUrl = '';
let customParamCount = 0;
// Debounce timer
let debounceTimer;
// Add input listeners to all UTM fields
const utmInputs = [
baseUrlInput,
utmSourceInput,
utmMediumInput,
utmCampaignInput,
utmTermInput,
utmContentInput
];
utmInputs.forEach(input => {
input.addEventListener('input', debounceGenerate);
});
// Add custom parameter button
addParamBtn.addEventListener('click', addCustomParam);
// Copy button
copyBtn.addEventListener('click', copyToClipboard);
/**
* Debounced URL generation
*/
function debounceGenerate() {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(generateUrl, 150);
}
/**
* Add a custom parameter row
*/
function addCustomParam() {
customParamCount++;
const row = document.createElement('div');
row.className = 'custom-param-row';
row.id = `customParam${customParamCount}`;
row.innerHTML = `
<input type="text" placeholder="Parameter name" class="custom-key" aria-label="Custom parameter name">
<input type="text" placeholder="Value" class="custom-value" aria-label="Custom parameter value">
<button type="button" class="btn-remove-param" aria-label="Remove parameter">&times;</button>
`;
// Add input listeners
const keyInput = row.querySelector('.custom-key');
const valueInput = row.querySelector('.custom-value');
keyInput.addEventListener('input', debounceGenerate);
valueInput.addEventListener('input', debounceGenerate);
// Add remove listener
const removeBtn = row.querySelector('.btn-remove-param');
removeBtn.addEventListener('click', function() {
row.remove();
debounceGenerate();
});
customParamsContainer.appendChild(row);
keyInput.focus();
}
/**
* Validate URL format
*/
function isValidUrl(string) {
try {
const url = new URL(string);
return url.protocol === 'http:' || url.protocol === 'https:';
} catch (_) {
return false;
}
}
/**
* Get all custom parameters
*/
function getCustomParams() {
const params = [];
const rows = customParamsContainer.querySelectorAll('.custom-param-row');
rows.forEach(row => {
const key = row.querySelector('.custom-key').value.trim();
const value = row.querySelector('.custom-value').value.trim();
if (key && value) {
params.push({ key, value });
}
});
return params;
}
/**
* Generate the UTM URL
*/
function generateUrl() {
const baseUrl = baseUrlInput.value.trim();
const source = utmSourceInput.value.trim();
const medium = utmMediumInput.value.trim();
const campaign = utmCampaignInput.value.trim();
const term = utmTermInput.value.trim();
const content = utmContentInput.value.trim();
const customParams = getCustomParams();
// Clear previous state
validationMessage.textContent = '';
validationMessage.className = 'validation-message';
generatedUrlDiv.className = 'generated-url';
// Check if we have any input at all
if (!baseUrl) {
generatedUrlDiv.textContent = 'Enter a URL to start generating your tracking URL';
generatedUrlDiv.classList.add('empty');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
return;
}
// Validate base URL format
if (!isValidUrl(baseUrl)) {
generatedUrlDiv.textContent = baseUrl;
generatedUrlDiv.classList.add('invalid');
showValidation('Enter a valid URL (starting with http:// or https://)', 'error');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
return;
}
// Build the URL with whatever parameters are filled in
try {
const url = new URL(baseUrl);
// Add UTM parameters only if they have values
if (source) {
url.searchParams.set('utm_source', source);
}
if (medium) {
url.searchParams.set('utm_medium', medium);
}
if (campaign) {
url.searchParams.set('utm_campaign', campaign);
}
if (term) {
url.searchParams.set('utm_term', term);
}
if (content) {
url.searchParams.set('utm_content', content);
}
// Add custom parameters
customParams.forEach(param => {
url.searchParams.set(param.key, param.value);
});
currentUrl = url.toString();
generatedUrlDiv.textContent = currentUrl;
generatedUrlDiv.classList.add('valid');
copyBtn.disabled = false;
// Show hint about missing recommended fields
const missing = [];
if (!source) missing.push('source');
if (!medium) missing.push('medium');
if (!campaign) missing.push('campaign');
if (missing.length > 0) {
showValidation(`Tip: Add ${missing.join(', ')} for complete tracking`, 'info');
} else {
showValidation('URL ready to copy', 'success');
}
// Update breakdown
updateBreakdown(url, customParams);
} catch (error) {
showValidation('Error generating URL: ' + error.message, 'error');
generatedUrlDiv.classList.add('invalid');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
}
}
/**
* Show validation message
*/
function showValidation(message, type) {
validationMessage.textContent = message;
validationMessage.className = `validation-message ${type}`;
}
/**
* Update the URL breakdown table
*/
function updateBreakdown(url, customParams) {
urlBreakdown.style.display = 'block';
const rows = [];
// Base URL
rows.push({ param: 'Base URL', value: url.origin + url.pathname });
// UTM parameters
const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
utmParams.forEach(param => {
const value = url.searchParams.get(param);
if (value) {
rows.push({ param, value });
}
});
// Custom parameters
customParams.forEach(param => {
rows.push({ param: param.key, value: param.value });
});
breakdownBody.innerHTML = rows.map(row => `
<tr>
<th>${escapeHtml(row.param)}</th>
<td>${escapeHtml(row.value)}</td>
</tr>
`).join('');
}
/**
* Escape HTML to prevent XSS
*/
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
/**
* Copy URL to clipboard
*/
async function copyToClipboard() {
if (!currentUrl) return;
try {
await navigator.clipboard.writeText(currentUrl);
copyFeedback.classList.add('show');
setTimeout(() => {
copyFeedback.classList.remove('show');
}, 2000);
} catch (err) {
// Fallback for older browsers
const textArea = document.createElement('textarea');
textArea.value = currentUrl;
textArea.style.position = 'fixed';
textArea.style.left = '-9999px';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
copyFeedback.classList.add('show');
setTimeout(() => {
copyFeedback.classList.remove('show');
}, 2000);
} catch (e) {
console.error('Failed to copy:', e);
}
document.body.removeChild(textArea);
}
}
});

View File

@ -1,847 +0,0 @@
%PDF-1.4
%Óëéá
1 0 obj
<</Title (localhost:8765/includes/header.html)
/Creator (Mozilla/5.0 \(Macintosh; Intel Mac OS X 10_15_7\) AppleWebKit/537.36 \(KHTML, like Gecko\) HeadlessChrome/142.0.0.0 Safari/537.36)
/Producer (Skia/PDF m142)
/CreationDate (D:20251202161508+00'00')
/ModDate (D:20251202161508+00'00')>>
endobj
3 0 obj
<</ca 1
/BM /Normal>>
endobj
5 0 obj
<</CA 1
/ca 1
/LC 0
/LJ 0
/LW 1
/ML 4
/SA true
/BM /Normal>>
endobj
8 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 725.88 120.75 739.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/)>>>>
endobj
9 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 712.38 121.5 725.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/business-development.html)>>>>
endobj
10 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 698.88 188.25 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/business-development.html)>>>>
endobj
11 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [191.25 698.88 248.25 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/devsecops.html)>>>>
endobj
12 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [251.25 698.88 333.75 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/team-leadership.html)>>>>
endobj
13 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [336.75 698.88 403.5 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/tool-building.html)>>>>
endobj
14 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 685.38 111 698.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/)>>>>
endobj
15 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 671.88 138.75 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/airport-dns.html)>>>>
endobj
16 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [138.75 671.88 144.75 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/airport-dns.html)>>>>
endobj
17 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [147 671.88 238.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/app-development.html)>>>>
endobj
18 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [238.5 671.88 244.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/app-development.html)>>>>
endobj
19 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [246.75 671.88 342 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/athion-turnaround.html)>>>>
endobj
20 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [342 671.88 348 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/athion-turnaround.html)>>>>
endobj
21 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [351 671.88 439.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/fawe-plotsquared.html)>>>>
endobj
22 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [439.5 671.88 445.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/fawe-plotsquared.html)>>>>
endobj
23 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [448.5 671.88 546 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/healthcare-platform.html)>>>>
endobj
24 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 658.38 84 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/healthcare-platform.html)>>>>
endobj
25 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [87 658.38 187.5 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/home-infrastructure.html)>>>>
endobj
26 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [187.5 658.38 193.5 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/home-infrastructure.html)>>>>
endobj
27 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [196.5 658.38 297 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/motherboard-repair.html)>>>>
endobj
28 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [297 658.38 303 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/motherboard-repair.html)>>>>
endobj
29 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [306 658.38 393.75 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nitric-leadership.html)>>>>
endobj
30 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [393.75 658.38 399.75 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nitric-leadership.html)>>>>
endobj
31 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [402.75 658.38 470.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nuclear-dns.html)>>>>
endobj
32 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [470.25 658.38 476.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nuclear-dns.html)>>>>
endobj
33 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [479.25 658.38 542.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
34 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 644.88 119.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
35 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [119.25 644.88 125.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
36 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [128.25 644.88 189 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/showerloop.html)>>>>
endobj
37 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [189 644.88 195 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/showerloop.html)>>>>
endobj
38 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [198 644.88 249 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/viperwire.html)>>>>
endobj
39 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [249 644.88 255 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/viperwire.html)>>>>
endobj
40 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [257.25 644.88 343.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/web-design-java.html)>>>>
endobj
41 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [343.5 644.88 349.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/web-design-java.html)>>>>
endobj
42 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [352.5 644.88 449.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/wordpress-security.html)>>>>
endobj
43 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [449.25 644.88 455.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/wordpress-security.html)>>>>
endobj
44 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [458.25 644.88 529.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
45 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 631.38 101.25 644.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
46 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [101.25 631.38 107.25 644.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
47 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 617.88 104.25 631.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/csv-tool.html)>>>>
endobj
48 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 604.38 126 617.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/csv-tool.html)>>>>
endobj
49 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [129 604.38 194.25 617.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/utm-tool.html)>>>>
endobj
50 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [197.25 604.38 274.5 617.88]
/A <</Type /Action
/S /URI
/URI (https://md.colinknapp.com/)>>>>
endobj
51 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [277.5 604.38 357.75 617.88]
/A <</Type /Action
/S /URI
/URI (https://nix.colinknapp.com/)>>>>
endobj
52 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [360.75 604.38 430.5 617.88]
/A <</Type /Action
/S /URI
/URI (https://qr.colinknapp.com/)>>>>
endobj
53 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 590.88 102.75 604.38]
/A <</Type /Action
/S /URI
/URI (https://meet.colinknapp.com/)>>>>
endobj
54 0 obj
<</Filter /FlateDecode
/Length 3809>> stream
xœí\[<5B>· ~?¿BÏ¢ˆ7]€ €íÄyNj ?ÀmëIÿ?PPWjgœsv½[ñÃzg¤á凤8ãJýç î+o~fFŸ³ûøéòû8$ö¤ÿ'.ÑQ`ñ¹dvüëò“ûír;5.þ´ }¨¿˜ˆÝƒqN]#½`*>æXoìc®ÓcÏ’“!>X" Ï€•¸†Ÿ×ð_/?ýÍývùýB^¯RÍ´#+ËÇO ¹¿wëÇ¿\¾þžÜ/ÿ¹d‡äJô¹„¨ÃUO?_~¸üp£J_†·._¿gÑ}øùÍÐà²Ct>]¾ <09>bü]ü.¡… )Áv̱ 4:çqüw÷áß—ï>t0G ¾Ê*Ñ£¸Ø~Ý,Œ/”ÈÙ¿?~ïŽD£b/ŽÙ+ôõÏÃ%{n0Æì8epÙ„ÄÑaò%•(ÑeJVZ"ŽXÜÇKöI(Õ+9)Åeµ rNJÃDɲ¤,Eiõ<69>ÜÇK©§ÐalƒôJÎ%RR<52>\©÷#¥5.ê`å,*­2„Æ?ÖùDK;úxÇzœ¢ P#Hôš©Ô Q(â¸%ƒN½@ •¬3GzeÂc12HôCÚ¤•ä!@b4zä#
ýIòÄ)ñ®iIž¹ ±‰ÒÔrјNÒ°lÓ þpY×2ñל,Cëî,Cu¦Î'KÓ»%<4B>ÉYÆQÕ[×Ç1féc;­s¬\¶Ñ<C2B6><37>ßâ •Öäª&æfîjznæ6°Xô¬)ÊìÍ' µKš…o+÷Z KCkÅ,M®µÕu.¹Žîpg.Õeù¦?^~½ü|ñ19ûW}Â<>X}‚üåþò ù„ÿsŸð<C5B8>׈¡ÂˆŸÂãØ): OØX²1DÇЃ¨ïr †g .I#èÿtß„ðöM=¡J
¥Î×ãB#°¢äVOFÑ—fÓ„>:%Q”ˆ. Œ ´J,•ÆSÐ5IÑÇŒ“RSÄE¯”€<E2809D>Ñ%ö<>ôŸÒ0¦EiõÚh=ÏJÔ!WK¦(M§†¨´~ÃÄ•‰¬Ö"©¬ARª²+숫+Mÿ¡ÒÄ¥:=ÄÌi;K>svò„YöûGJ¡q18C_•h%@Ÿ`=õ/F'è ¨NîÐC ¨Æ°ZF"±N¹ìM„l̆ͦ/ÛI•9;3 ÍÝ ‰Œínƒ/PÝâ=Tqy2Œ£:r¨#ô!Fk¡M[¬~ƒ2@M»Ãa0jìºC3ã0rpkÜÂËšájñ1á7¹]0µb-@/,àw%­õau¹VÒÒº]pÝ8iXNãÏ'^œ]ªn~OüÎ1½8<C2BD>LŒz¦%=Ó*í7¿ïÙÇpôX”\ <09>\E ÍÖWh¦`£‹jŠXâæ+
Tc¤l|EÁ£¯(xâ+
}EÁ£¯(xæ+
}…ÒŒ¯(´ù
svbÔÌ2±¼Ýo¢Þp6‡‘`.£MÔ±ÞŒNæš4º«wÓò\çÆÓ»a³ªu%4¡Ñx\ªÐÍýr9ó¹ìÞ"ç!ð3ç3osȸœÛ¼hTœsã7‡óÑaäÜl©u&ã0”<¡`ÆMÐlw˜ð2¼ '\7á&°<>檚ëdÓè\QF÷vå ¥aÁ«N£ÔX7ÕÚÔ5ŸQdø é­ÒèÿaüÞ«3wQà }L<05>äâ«oüt‰= ”E{0´<´²Ü{F[c_¬|ÇÙ°N>tW¼Êu tãÇþ ŠØÊx8Jw¥ý¯•ú°!š­¬w|ÈTVÒcV ÈÐÐä(ÐÂBŸ$2X–œ¼`°(2Ä7;þœú
0„R¦vÙ%ñµP}Wh´LNPÀÕsnµd OjLÏ!ÒÝ<03>Rò9D 4 H^RÎÑÅR ¨Ì çÔW€&ͳ«ÓÓrÂ<72>alpW-ÿ•®â<C2AE>¤™Rϳõ™¼ÈtÜ<\õ‚ï<17>@¥{ηcä©À$ *îßýÅŒ¾Èîý
¨©-"Éo =%¾IƒòP¨=…k|vwnÏòø$XÖoÏì*,û\áW³½däoþ4ëƒZÞµiŸR4”bò>ÀTCêM@«DÍIZ>_%×ôÅd~€¹Õ(&Vâ1÷Sjµ¢s%²?%*+)méŸù_%j$-i€Z0^É„=?³;ÓLPö»Î\Ær8“+ËÌ<C38B>v±G&e54Ó-£Ê™˜íZŸ9œµÐLö¬-±ÛÚ&ƒJy\:”cíH‰Uþ²¥ƒJFŠ5q^p¿¥‰Sf®‡È[R¨d.)qV“\ç¤u>Ë •|H y™·Ô°ž08ácr¸ßÇàoñ´€º˜7˜ü/¥˜…²´g•œ¥‰Ö*ÛR<C39B>Å¥aÝ«‰"è.{º%U³Ó?vöõ¡W½Í½æŠ¬”Pk<50>à¥=­¨ÏZG_ć<C384>XF~JœÃ_4a”àr¸ËŽåŽËˆÍ¹?_¤Çâ¦ê8Åš FËTÇÙESAÿzöêyãð퓳KŠ'ÓÜc|#øÈºÁeY÷„b 9Kœà´ÃO‰<4F>ûÊÒäx"MÂi q1n†Ÿÿ·Ò䘽`Î7ÉžÈæ,q2n‡Ÿ‡éá%8@ðÖÝ߇S±L¶Åù•g<E280A2>rºêhªƒ¡§V¡ì"ǨõtÑÄÿºß1<>ÛÁX޳l‰á¹º0é†nêV>…ë<E280A6>i3êójL&Eíýx<C3BD>ZaäQÞQ<Ödmæ#Ý…žKŸ««<C2AB>7µs>L^Q»¹ø ÔÎ!g¹GgÕ
Ä"žHõ8}‡~J|…ðÐX { ÷çQ —+Z)­ošƒPG¢{¥Óy¤^êæžEwdW³!Z¨¶ÉP¾Ñæâ/@´P>Îrƒ#FÃ*`ñx}gÈ ZÚ{kJ^ï<>‰»¦¬V™÷èê'Âô ÙAÌW^•ž¯·h‡ß °*W idS+:g¯^žŒŽªœaéGý¥tqGYêúèõìú;[=Îx¹4VnR—½øùZÀÇYîÒBO!¹$©5亀î¶ú°Q£øÒïnf8§®^®D¢1iÅÚÝU%-<2D>³µ$,WÉoWÝ{0AOç¶2uÇѓŅ%âàIjíó:¸íÅÏ7q>Îr—àŽ ž„KÞÀËnC5063œS_Ü$hL
=ß_Ã29Ñ ¡É¶âSv|¶°7æúßð”3?Ùœâqžyœƒaµ„º=z½&7S Ž<1B>µ5ßò6½†¶<C2B6>$¹®){ñ©g¹G<>S}¡Îºmpö0Úõkˆá§ÄWXþÉZ“î±íÅò8±Ûë£vPŸ_Ñ$¶Òq<C392>m«ûíܷ宯±Yl }¬“ø¸Ëf~ÇÌ9^ üÌÅòü2)„ã,÷¸.RԶ̤¯Ð<00>]èÄÙ'Ñ,ql:á§Ä5üå*qÀÖšP+5÷öX´LZ°òÈlÞ˜ ïýÚ<C3BD>Þ}ÚÊUrÍo®¹øùÀÅ@ÇYî¸9XàæX|ÒnÑ…<C\5ÃO‰¯\ ÉçZGTkÆTŸú÷\ˤœ÷P”ö¦Lð1ÀÞÝóÎx~é wŠcÑ©qØöâ/v¦ã,÷lÀ"žSÖï…lÀH>%æ ›–º`lg8§¾ºsò½2Çêÿî±3Òrùx¿/‚åö\Ùz×äѾIïðå7+ÖÁo{¬Þˤ¶€<C2B6>^— Ýz{ñóQÏ޳Ü%꥟R;ê%E/Œiì¥|ΩÔ¿²HYÀ'Òw0ŒD™À'З<E28094>@h8_ÃO‰¯°†YQ?V0ŽÝª»ZÀÅ'.ßÙe“úö¦òm_ôLUF!ãÝjóÌÇ®/e{ñó—²g¹eçB¸å¦Ê©>ðz5ÞŒéjÆ­ãs*ú]ßÒ,±qµ):¯B< |³ú·üëG_nÌÿ0œ5µ/]¤Ñß©³^±<>¹n0 %‡ð¸ÃS)Úgú;Ó‰¦´Úh¸uw*õqw'Bë]´/J)MÅöv*QLjiíTZ̘ŠéÂSšr·ÆN¥*¿¶¯³Òj/cíøCØÛ:ÍéÙ3h¦™í…Û g'¢am¶,fwã&ëèƒ4J™ýFy³µrSóìÂ4™ÝšËnØ­j{9•R¥vvÖ5˜·ûµý“S©Û}­c79{sãÖÄ©T®/+ÅõvÉMÅ­³2o œ½ ÓY£ñ°æÞ¿YO8Ì¡8æ&b“<62>…ÄÁ´Î`{êÁ¬<C381>Ö¸™·ÕÒÔš¶¶Ía€èöå× •¦¯vm*_$<24>ŠŸw98»6¯·<C2AF>¯NÉÁEòñ†=P½šæ>qlÏ£žnQèiÙ¸awwäÓÖRr•½§W²`0¿˜»å¹úñ©><3E>ƒÓ7¸¶„às…9ÞŽ²
Ö¶Í>ÛŸ_Ÿ×Ï)wà3„Ó4§lÈßÒV´-Ñ‚Ùíû®‡'½@dZŠùúίghj/=M\U%Äsýùæc²T0¶Þ¶â±ÙÔÐNªGø.=ìH{rÆë½üж½ÕOΚ|HÚÿu¦<75>»ÊšÔ Ô×ë3Î<33>MñI È¢>lÔæ¦™áœºfx¹<eè—CýÀp “ ªÜöâ«ê{Ãùt€ÄôÈú<“Ç_œQÊãhSèm
<EFBFBD>EÒ>b¿8ƒÒ>¯b?å¡´c´)ýƒ-6Ú”öa3Ÿ›ÂÇ`Sx 6eÿâŒ9½â õæ=Øœœ­Èj °b0+é ÖJVD·T·b?«ä%.s¬hrZ »M·XSÚWM¢<4D>5¥}ýd¿_ûNJÜcM}A<>b±Ñ¦´¯®À&iû>Ëþ ¥Ö·nl¸)í{/[D/á,Ü”p 7% {©' Â1Ü´71›ì,(N® f<>|ÝSfL…™õbTkVÖ4¶»±Ò´åõx³% 7<05>bû„jA"?þÀçœ
endstream
endobj
2 0 obj
<</Type /Page
/Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 3 0 R
/G5 5 0 R>>
/Font <</F4 4 0 R
/F6 6 0 R
/F7 7 0 R>>>>
/MediaBox [0 0 595.91998 842.88]
/Annots [8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R]
/Contents 54 0 R
/StructParents 0
/Tabs /S
/Parent 55 0 R>>
endobj
55 0 obj
<</Type /Pages
/Count 1
/Kids [2 0 R]>>
endobj
56 0 obj
<</Type /Catalog
/Pages 55 0 R
/ViewerPreferences <</Type /ViewerPreferences
/DisplayDocTitle true>>>>
endobj
57 0 obj
<</Length1 22332
/Filter /FlateDecode
/Length 15956>> stream
xœ½¼ ˜Õ¹7þžS{õV½ïkuWwO¯3=3==ôÌÔ¬ ›ÀÀ ( Dq#Šæ*ŠÑënD5.ñ2 jãJÄ…“«&qM"¯q|7hèžÿ­êÀ\sïÿùž¯æé:§êœz«Ï{~ïy·Óô°X6wA¦î†ô±kЃ°lùÚáuXÄÌÀŠå£w­n+<00>w<03>¾³×<C2B3>³öî ×Óì3ÔÕ眷éìå…e]n X³jÅÚþÞºþÏú.š]µrxÅšß qÕª•ÃÆ2šáUk7\ôv…ˆZÞùˇwýzÿ!|<³vø¢uì}Ìûð9¾5¼v%šGí@ZåzÝùl˜X+PR½^¿rÝ^¹ôYô ŒuF€†[<5B> 0 €ù”~<15> @¤Òª€ù°Î<> á<†õ@€zL¬TÞñ5 ¡ºƒ•e•eº;Uš§gLÝÙ§ÿѦ¥†âÈȪ×?h9]-?øujoeÙñuwòʸò)´(ü Þ×UKô>ÌÃ&¥¥œðÔ÷8y¬Û´þ<02>!ªß<C2AA>Ok€vÌEÄNªOáÔ‰§”j<>0<>`@ tÁLX ƒ°6ML¨OÔ@;ôÀ,„a8wbb⣯þý·W<E28098>ú÷ÖÿæíÆçàcĕĕ¤‰|žšMÝCS4E¯aXæÖÉ>Í­ç³·æz­Iû²žÐú{¾úg¸R <E280A6>ƒÆ¿™Î3Ï3ÿÙr†å «Ëz¶m¾í¸}ƒCtüÂ9à
»®rÜ»<7yG}Vê§<06>¿vhÿý ¶~îÿëƒ:>jˆÔ"ÈM}7ò°S‡ V¹ÆC<>ðU½ÿدڦ|ZÈ ¨”Ô"°“@?ùx¨Cê'È\Ü$ýÔÿô~âzèû¯ñ1Äõ<C384>!j‰ë!† ÐH˜pb“< q"t$¨Ÿz€SžÁGxa.€Sy†ˆP‡ Á@m<4C>—êq˜&>˜˜ø¬Ò ´<55>xðÀ^åƒ+mE<6D>Àáv `3| `‡|„Z<E2809E>€½ð|³` €™ðšÛ``-j<>0ú94B7ÜÏ<>6ÁùðôÀw!{ᩉÀ<0E>ð”àKàÀ -0Kà:¸Ü ŸÂ;'>ƒ\ %xkâ·<C3A2><C2B7>-p`pAºa ¬C)¼ab+´Â¸ž‚<0F>¬Ps`¬…oÁ¿Àíð,¼¿@HAZ õp3Üò£o£ïÜΉ5°–ÀX x~ÿÑóèЄgbïÄ`¡ :Ôö»á{°¾¯ŒÁ!8ãhZLˆDý„n¢nâØÄÀ2ôÁ°ÖÂ%p%Üá5x >D~C<>¨­C[Ð6twf¡æL\,HÐ-0¾Àµ°n<>{àAxáßá#Ä!·ã-ø(a$dò4jtⲉ]ÏMü @èƒ>˜à"¸®<>à&x^€_‡ð'(# ÈŽüh/zý6â8Þ_%Î'¶»H ï&ß§Z©­*G&Ι¸eⵉ¿ D yÈC 0+`œ«âãØ»a¼oÁ;ð>”¡‚|¨åQZ.F?@ÐaôŒ±€ý8Žãx+Þ<>wàýø0~p^"FÔg·;ˆÉ›©Ôõ¯Ônú÷ÌÕ•å••ÑÊ%•g&ú&nøÑÄ~` 1uN{aÌ‚Ó`!,³áb•×Û,Á.x ‡Çá ØOÃ3pÞ€ßÀQøŽCq*È<>²¨€Š¨u NÔ…f >4-Dýh1@Ãh ÚŒ.EÿîFw£ï¡<C3AF>èh/Úö¡§Ñkè ô ô t}Ž>GÁXÂ2îÃ}x1^Œ‡ñr¼
¯ÆkñõøzüÞ…÷âD+ÑC ÃıŸxøñ!ñ7ÒEn ¿Mþ˜<L¾C!ÿ“ü’¨,ÕO-¢t<>¥ï£cÎe<65>ü<ý•%d9l·â¿Ã¥x:|^À¯â^x6£ÇÐ}<7D>ûán¨‡zxÞd¨…Zà<5A>‡+ 5P G¥HX ×ãv9vÕb6ƒ^§ÕðËÐI`Én±gY`LZ6FJbooJ¹cÒð)7<37>c=_í3X¦v |µ§<zÊÕžò‰žH¡˜JºÅÀØOºÄ@ -9m@ Œ]ß%ÆÆÕúlµ¾]­ëºÄÁ`0• º«ºchY {¬gtÕ¶îe]©$Ú'+Ú;•„}2hÂcÐ9¼y•c :•Ýc.±«{Ì)v©mD¤{xÅØ¼Óº»ÜÁà`*9†:—g<E280B9><67>Ø1fHL>®<#"óÄÁ`*¹Zùþp­v…¸âÚ g-SjÃg ŒÃcx™òcbÌ.v<>Ù/þØqòrªÖ}Ý)<29>c8Ò3¼r[Ϙ¼ìÚÞêå2åjøºÞT²oAàŒ<C3A0>1|åàÀºr°ú%Ôï^ÅJ±[¹³lM`Œ;ÄUÛÖ,ŒÁü<C381>=.ÙÕ-w ŽÁ¼<C381>=NÙ©^¤’û—N jRÉ}©öT»RN :.­¿ûNõþÏ÷kÔ~~­I%ûæŸà RÞ$Γ—<E2809C>–«/Çp¤I9­lÜAåD©d÷ê1®sÙ6¡9•DcTDÛ¾€1´Lÿü«w†'ïÐá PªÊtž@Äž¬— šì+7o`7B7 –ÐÄ•%èòg¦JSà°ºk -K• ž,A¬&˜*AM2Ð3FDz”y l l±b[ '°jxÅQËùâÊmƒ™À,Xƒ…Á1yÐ}¢ºrp°9U„B‡Tél ôÖLRX£RØ6˜)§J<C2A7>ÆiÞÀic[ºÜcr× ; t<>íŸ70¶¿ËL• uâÝW;&¿s:YTMª™*•c[Ücòà¶mÕ+18¶Û6÷6Eª×%ÿxCž¼Qé.¡-óÔ¦-bЭ܃bpÐìJ• ›ì[05½%¨ýŸ9\w*‡sÉÔ©®ÿ¿Äá†oÂáÆoÄáü×s¸)Y¼ÂáÂÿ;7ŸÂacéS<C3A9>cêë-Gš¦ <20>f†bhŠb”[“í$ER$AQPCQE<ÇÀ”öÏé3 Ã]¥Ï1 Í04ÍÐ0ÿ”¾rÅPhxöTúÌ×ÓgšeIžei¡=I_qD(’¦   ަiš$ šbh´ÚoD_%Æq$Œ†ãŽeŽÕþô)¦Xš<06>ÿô9Ž¢Ïjú\•>75? ÍÐ$ÃÀœÂL"†gÐk5ªAÿ?Óç9ŽçI
8-ϳ<Dz<÷õô5
}jоÁð<C381>èó¼X<>†¢<E280A0>Ói4¬†g9 o8AŸa!Y–Ô²,ËR4É2Á ýôµ<1A>8­¢<E28093>×kµœVÃqZÍ7¡o4èþ7ôà Sôy=h&ÛYŽåXãHàH½2Y4Cq
ÀdÔ<64>ŠzþŸÐ×juÀët4A§ãuZ^£ÓA{*}êèsz޳Iÿ èëu:=hôzš­×èu<1A>^g:IŸgyæy
xÊÀó<Ï0Ïx,fÃÿ†> ZS•¾V¯3«áåàxŽç¨Sé³t•¾Õú<C395>èëõÐ 4 :³Á 5èµZƒÁz¾†Óp´FCƒ†4<1A>†ai oÐhÀfÏÔ¡ùzúƒA­ Ðè,  Z­p
}^Ãkø¯Ðçh<C3A7>V¡o·O¥¯ýzúÁ`<04>ÑÈp ·<18>:£A§5l'éky-Okµ4hi“V«Õ²­Õš´Zp8¾ }£ LÑ7XúNo4:Ô%^¶V£Õ|•>£ÕšµZ(Am¢Ñ„là~º¢¶7âhÇB$·ëÐ1@<40>õ,¨g@Çd<C387>rk;ƒ¶ÓèOís±‡û#&Á~Œþë¡14cÁó˜va»0 v`å£Ô.×a¥dáF p#ưSp#f<><66>ó1ÀùÃù˜ó1 $,Åæa–ªçb Ê[çªWYŒ¡ “<>U¯2ÿõ¶ &!£^ù1»±òSèc4ÍÜàaDïõ¡ÙpøQíž«æúŸC@tèFõ|…¬è>èÞ èn è. èžC×Â<СóÔ3õót¿œ§ëœ§k§kž§{è![bºgcºRL÷Øî˜n4¦KÅtÏ¡Ý0tè‡êù_åÀLÝ_fê^ž©»}¦îÊ™ºgêΞ© ÎÔ<C38E>åÑ…=:·GWB—>a¸É°Ý\ ]ºw»î¦íºúâ±ÚŒ¿½„þüxΟH6úKèš= “þúΞ…<C5BE>øÛ­èrˆüh ıR^]j¹ eÕò"”UÛ7îÉÄý%tÁžÖ{ü%4²§õˆÿt.¤ÕÆ5{rGü%Ô´gá™þvå&iÖA«”©=­7ûK¨fOò'þv#ŠB<45>Â<EFBFBD>SEÈ©ÝC“%½g¡ä/!jï¤"^Bh<42>¿ru £'üÇ2óý_¦K$Úãÿ"]bÑÿoâ%üÈÿû™~D¶ûßÍœéÿUëLÿ<4C>ÿÅ…GüÏgÎó?•Tx¨ë…:<ˆ²èNYã¿?s³ÿ¾Ì5þï·ªÍ÷æTz·.T[â%=á¿f¡ä¿ ]Böø×ç”7hüçfÎó¯Iöù—§KèNÙàO'óþ™§ý§eÖûçVß4£K-z3O©Ãù³¬k÷úÛ3^KëOüÓºJíñ”Ç÷øë«/¯K«Ã«m<C2AB>åO¤K$ù„¿fa­?”+a$§üýç0K™~&Ï40YFb"Œ<>ñ2ÖÄ
¬žÕ²<«&$Y`-¥‰_Ë %¼k¡¥ IåLªu+g\<5C>þbÄb˜ Š…<†®·<C2AE>¶9ÚL­ÆBO×ל_wxÇní[00ö°wp¬N©LxûƇoúú¸»kúD)ö¡ ú]÷|õ~°kpÐÑ76kÞ@ }Ò½º„~×½zxLV?AŸt<C5B8>ÉÃ]ƒƒ}cT:GŸtw탅J18°7B\¡qܨv»¦Ú-ƒ~§tëR
¥ÛȨÝ2øˆÚí'J·ÝWÇ»»vÇãj* W«]®¦ÒJ—FÕož…Lw×îLFíÅ<C3AD>¡¬ú½³ü˜JÈ«Ê庻v·æ”.»ërÝóvçêÔæÌÉædµy~µy¾Ú|úÉætµùÞjó½]ƒƒ_ËãÿÇÊŽoÖï±ÓïºünÅ_&v¯\&v/»vt•clËY<C38B>ÀîËïštÍ¥eg-_¥”Ã+ÇîWv<57>].vvŸ~÷×­4Ÿ.v톻»ì¾[^ÙµçtùtÕqìªëGº¿ò®kN¼käú¯!v½BlDy×UÝ_ÓÜ­4_¥¼«[yW·ò®«ä«Ôw)cë^½ ã¯96\xá™\p¦â¿¨Û¨> €<>νÍ èZ${€dfÀSä ‚À.Žff p²Üïƒ=ó‰Äœ£ÅÙåâáËâl¡\„¶b¹(-µÙœ1hŒƒÆ 5Z:öwªïï<C3AF>ˆw<CB86>GÁVì#ΧVÁtØXBò´\;áÒ9¢aiÎt}Ðl ðX ­}FRŽv¹žöW<>®'Øl±Ø<C2B1> =ßnl9ÈLï½èG"óAqöñåå¢ÑThÉp}®—ð<E28094>pÚŽ…÷ŽWŠ®÷ŠÂ{ÅÚì•€LùƼêsu6{CýdÍj¡í­(ߊÔ:C3v[£Å<C2A3>”AVËdµ¡¾1ƒôH©m]yß?«Æ¿b]CÂ'Fšðü°³WôûâKn]fœ{Ç@½³fû,}!J]¢ÿ_Óa°‰¹L<C2B9>³%$ÝÖîZð@(OöG6½žyÍhã3~SwD|Tbô£ß3÷ ú̃5ÅÓñP÷SËÕUå‡ !8 'i2˜·ßH 2NˆY þb Ÿï·_G\G^Í^Å}G÷ýw ß®ó_¸¸“¼Yw³þfÃÍÂ<C38D>þ;á.]—3,KƒÝfCØá@Øát"ÒMü<4D>Ü<06>[ãƒ~wÀ°9±ƒ»]„X.ÀÒtÒät"Žçã& ÑNÂÆsl<73>Ò#§<>§IG±€“vG õËZNr,0è Vlç0ztê…˜ƒPæ¨ËY.;><3E>¶b±ØV,ºh•ÆÑd/ åd*¶êÓ j³pp«>íP+ £© 48”2ã(£„ <E2809E>RS*[<6A>âV¡ÈÅâVA_¬Í¢!¤A¨¡åQù<>ÝlhE õRõÈj±ÛìVDÜ4þYeùܹËÐ#1Tɵôÿ²¤Þbê/:Ï_ãêEQ¬ÇõåÃåÿŒpgÿ?¶qCž<43>DX{Ê0«æà+ƒ®zŽPË•yÈg©>ÐBêà yÞUî+}¸‰è%NwŸæ{½„ÞF¿L|Œ>MðiVêÜt[S¢7ç­¥ŒÑT]_íš)ôS
QTÄšJÛ¬X‡#l¼„r²É9€Ê<>-<2D>çD >ËÅ<C38B>B »ës™ÃŠ\
o<0E>‡¶¢0ÞV
™¡‘òc¡PåRŠD¢6Û¹IÔ$ƒ¢Ý(!…¤¤=Þ<>@Äý¨ÆêG(¨í‡D)kËå—_~9 ¡¡pcC½$Ö ¨ÑbËQ­¨ÁX/Eu¤*J>¤bò<> õQI ÑVcWÞüëþŒÓU\[~á’3.Á­_¢àÊÂúë_þàÂGÊ+ðó]Wܺà!Ù÷âÌ‹ýÑ¥¨‚ü¦íâÆvZºçÇßíKxB;nüÓ þ£¿xד²h«­ÔÊjø€¨å B~$»~åùÄþ‘ƒt¬vàk³SnúR™u¦„Úå}©ŒwJ6Æ`³´ŠˆšÒn.ö3Ã;ìÏÛj'ì%L?&úK˜Ú-E2‡<32>Ž •¡#¦BÚTF<54>«åS—ãè8\-ã×Ñq^Qyéñ„tFo$(=†<èB†<>Sôm<1E>à£ÂE°åêó9³()L£¹º|cÞN3´ˆJF!ß +?Ó{ëù„9ï¸ô­_Tþˆüïí¸R×ʽRyâ…Çž=„ÚjyG T©¿fá=•UÞ®ü¡²oVb±´¨ý[ÿþ"
£ÄkoM®ú©>ÐCî<>ë¹Ñƒl‰-¹wÿ<77>¥YSÐàÇÂæ ÛMf̧;ÆiQ ³ôÂç=ÈSÂôãN7˜©¬Q`Vš 0gR1gˆà|^¿7à zIšŒ¸"¬D„è<âœtQ^œÆÍŸ`I¢fZ6… F!*ÜœWÀN-X ­ˆAtíì?Ýõ‡V~ß][¹d]WÇz£36_:oÑ÷>.:/°ô&4Œ¦í¸Ú—;öÇMÚÂâÆu2+<2B>q•Ï—ýÍŠEh ‡©>ÃCòýË·<>Gü%zïí.·Á‰œ)/1®<>A7-·ÛÝà@Ž”Åt1ÑkÑN?á÷…I³Þ<C2B3>f-æ¤×çYY§ãï\_ŸÇ¿Á| ó<>K&œ$¾Â¹/‡f=ªhÒ6S!£Ü/UéTW¾„ðÅÿ<1YBµ¨ÍæO°Ä,¦‘¨²)¨É¨^-6»5hß4­c=Ùɬ©|·£ØwzmÙ¬½÷ŠÊ/»7”_ˆèÚ®$6®íd¥Ê;×÷yâ•üœ<C3BC>iãìŠ<ÒÆECíÄGÔNj9d ÏËîO0бâÅnß ÛO+F®­ŠU&": “×çjÓÙ aJG9fXt:âál6Þ!þTÄq®ø¼Hˆ%L>VgX˜P¤¬®V•²/‡†Š¦BF(…#UYSØb²×犈!¡Å5®Ý$Æ<±´Î<18>¤$cLµ´"j5Ѝ%¿*j_'h<>'Ùh¥Új´<6A>'„N$Ö~bLFt)!Óֹ酃•·PÍ»©áÎÌÏrÖTvü òæë=~ÍRË;B<>Êi·ÌØRy«òPåãÊ zƒC ¡é£ÍŒ$QÀŠÊÚðE»~Œºïðo<00>°¾p‡<Øãî‰b]ÐÍžZc!q¦Û )°KLÁNº-1Ñtûb¢t×ÄDItd$át$ÉôÉp$â³Z8'jü>VãNW “<>§tÒ$äRÉIÈ)ÚuJÙ*ÌVL:£]U·SÆqmFNaŽY<>ÁSê*¼åiœ„Zð¢bç.Œtáµëqa¤³s¤|hÓ´òÍ]#åCUœ}«ƒ•$¶ã[•tãTýøÈº6>ÑÊW¢*KÖÉ*ê‚ø2ªÌ`<60>9¦0&"à6§Tf¤D}ÐmJ‰zI<>feÄfk±•0)szžÐéã$±`Í(Ã5š
Â'EÀŠ
ŽfW‡÷ƒS<07>gÎÜŒÏTÎåï£L„+l¬ê‰n9>²±ÀE¨>@`<60>ø<49> ¾-×ÖmìbMA·>ân]J$HÖÅ™tËð:ü!þ#&q<>]¯ÃTÚÎqlÜlz“àæv{Ü™ÃG„/ÕùPÖÎÑCŽIÝ2µ†
ÍÐ6v©¢P­ÔRH ¡¨"Zµ[su<73>_£š¬Ö±»#óÏÜ€gmœ¾|ùMËÎ}4óHÏbbÇz™$fúš²ðúò<03>Sëß+êhFä•Î <0B>W9oqÞï|ÜIŸd½k
‡N»<EFBFBD>Ð6 ©c»,iÇb Ž€cžƒp(KœGe¿7ep“K´µg ãŠjP‡§­6†þû4øP.ИÏAûHgÇzÜ92Ûµçz<C3A7>qÿúÇöDÔU\Y³$ºõìã±P”"ð’}•ïMŽ„þ”êƒ</¯þ$ˆŽÓЧÆî‰k
šÏ"Ï9žW9 ÏñMÒäv{xŽ|>¯ÏÍÀè·VñD;aqÛ<Þp„²²²'èµÆ´1£-æ
Çül,#8^ãõP.¿ÛŒŠ”E}þduÔQijÔ*öìáóÏ…Ï…qáóÏ[2®—]ËvUöª(FH<46>B¡„„À*vêœÂý£È!Uc5h¿¬·çt zD·¯ïèX_~áòQO¹\8¿â<C2BF>è¿OÈçwÒÒ±¿<C2B1>œÄv®<76>”7¾û
âöcëÉ3<EFBFBD>ÿôÁ\PQ,(ûħԃTŸâcÀírǯhÀ¹Êù¾æ3ýgÖ<67>=´F1õ<31>N‡Sã`<60>$ f<>uM<ö<>ÛÏ:¸`<60>°9ì¼KcŒi5I»ÝSåQ+:ý1Wäb<C3A4>˜Ê1”9|ôóÏåÏ—Ÿ«NäçFSÁ¤h¼ ´µWøR.*B[PÝ8#P <09>,ÖfÃ@eK4<4B>¢ Ad¬<64>žÀÍ Ž ûe½žT[ZJXë#è7Î<11><>ªÜÀ¯«üØlpbé¸}(ä%I»dç±WÉåÇ«rBÙ(H@ËÄGÔ·©U 7xà~¹þ%Ó«W]ÄÛ¦w,︈×ô…ƒ¶×ä»ú·„·lï:ÈNM{ NÛ9<C39B>ÇM-\fF榟¼MóC Ö,t+
ÎçUÜЗCã'ÌHUÀëÀåŒX%<25>dŒ ‡&<>Ê#N¯É#PyÒóÀkÙ<¢Ml^Õihj©¾ ÁИruŠVˆó<CB86>Á€Ýf:¨è3„"•}<7D>#T9¾§4ñéëÏ" ²>û“7Ÿ«ü¹òëç~Œw ³*¯¡”ºÁ¦¦òZåÔûÒãO¬”*<2A>jÂ/NF È~ÕvŒÂA¹÷%׫ü„ó/6ɼ/ÁšfÜÑ)Û1tK)ÑòEÍLûÒ|3<>ì„jPF%V¿PpgÝóÜ„[Y4âthÒ¢ŒÇN,ãêš-(^ËhÆqt\©TÆêÊèsz5:ÀÚ4^}?ÂN}?Òyø~ÑR÷_3n9ÎÏ, Pü¯T2˜tL|H±7ÐI;“´ZH1$‰U±#F¿¿øÊ6o>$\ÚÍǹ°¹ý[؃Hd©¼þIðçôo—_$oògŽÍxùøÍôˈ<C38B>çvqÒ«÷ÿì¢r݆"§JYKåfêY1øPÎDh^Õ¿ ¼`{5ü“È»ú7…7mï†ß<E280A0>h_µ¼ý•åý(y+»ÝA<C39D><41>Mü
Aye<79><65>•íbÛELi<ÃÔB¿y‡ùyóOÍfJÁÝc5š…1s5ñI׈¹BKƵùða‡ Ú¾oÞsµŒ»*3¡(ؤh$Žô$Ã_ƒÆèmö“x„DB(ž„ä¤ÿOICáhe<>¤Àó¿¡SxîgWn¯üõ±å.| 2±zõc¼ëá¡G¿§<>¬<^ùûã/æ뫱Dó<>û)íÜ•O£Œ²¦PÓ¨>Ð@ üI¾¨×õ¶G=ûă¡7CGBõ 1dȲŠ5žHˆò°{ŸòbÃL­»&®\†H¸F`4b(7y½o8äñ„5H“ç…—…·„ÇÂd8¬5ÝLÚÚ˜;b=Þ<>èAT0B,t®•ƒ(¨ <ÉGâAAx2qáGÇ•õ¿%ãPiŶñª‡~ ¼ù€£ºúM…­<C2AD>Ø,aýŽD†Ô)3Ù$m<>Pm#úé`ú‘:—_ŽFpŸâyŸDv<44>ábªáÄTñ<54>7,ýÁMs._­lmn?çw<C3A7>þúÐ#è<>èœÊÇúî åCø Ô¹oO»èLW˜ò*MÏbãy<C3A3>œ”ê?rÇ}®òß²I:G©ÊÚõ-¼Šôþ‰<C3BE>‰qj4BedÉ(n⿭٦٦ý]øãÓÇòý¬á™È5ü5º­wù7#L£âFè.•kW×âÚ<C3A2>É´[¹ãw]*/²<>mö<C383>9Ññ$éOçÍ™Nsr½»¡„VËp7ê>й™¼Óí*¡Õ<C2A1>{Ü>÷£DI <79>Mü11 …Æ<E280A6>P ]ò$Y …¦Ìá7‡6<E280A1>qoM…ÙÇG®ñ£ãU/Œaüè¸kÒï·WËçCŠÿq¢2²^<5E>Žú@Š2…õ¡~àâL?¢RL?
˜Žèul ß<>â1ާ“d?<04>þþªäÅê鄯b¶ÙUî>*©R WNú/i¤L©Ånó£áJ1D3"<22>þ¥¾çâÇϺ±7sÛ®¹™Å¯?ÜsP/yÙšTmÝûç-ܜͮÜûPwןŸ]úSCØI¦ZÐÇèîmóo¼äü33g®­Ë _x×ëÝá`eÖÁ»—Ìm*´ž¿jñÀE;Ùt¢½ÄaÅÂò<00>ìpÜJ¿L¸ñ.´ ãhÆKÑRŒýÈ<C3BD>±q¦[—
±A·6%š_¶¹±Ýl±¬QGÓ°NË:K˜ßƒûP ±²žaã&¿q©q‡q—4»úìû0ŽÌÑ£G‡ŠåâÑ£Ÿ¨ê@qUª²y¯¨:ÇhhhhHPüb³ê'Ð)æ’Ê›y¥¦6|þžõ37—¹B^ÿð·ýuT_å¾ûûT1ë#|Ç•$œu¿\ÏÄGÔT+RïÊgô»º‡¼ƒ¾Û5·ûîw?íý»Ÿ0M#Ó¨éfº5\«Ý«½«}yòiÉ b!ûÙns*¤?[qRAw$&íz”"f`.íá$)àÐë’»b:ÆH**+C,úÓqÒJ(U¿¬j¡ª5hWC$ÿ`ú+Ê~òíIÎÿøØ¢ì¼uè<75><C3A8>3Ú/ªŒUö^ÔÞ½¿BõIlÛHydçû¶þ°_#IºÁ<C2BA>åß¿¹ñÝ_nxoYׯIŠ—:ñ)uÕ~(Ë<>kœk\ØîÜè¼ÊyÈwÈÿ¶ïmÿßÍ·pœ™³8ÍNK̳Ð,Ç1¼FÃÁ àsÊašnâ4#ò¹ý—¸åÒÄUr-çrNgÒÄq·Ë7qãv9Ò¯q˜9·CÃ1”˯°Êåä Õå󱻃
í{ì.q%4GÖæù·ø±ìWòŒ~)<29>ÌÑ¡¡!—³<Tr|2Tõ÷ŠÕr¡`²¶ÎN'ô…ƒÔÖ´C­$\á (ET51<35>ðÅdM ŸÃ<>SÒI»SÙáƒD¤£¸c¶§VÌ"‰fKÎ×<C38E>~ÐîϤ+ÓüFž=“ê“'Ô:—¬)ç 2×cfÕbIä\ÑÑc[ȳoì¡D@ÀM|Êl ú  í“oËrH Ÿ‡<jâêÎq®vot^ä¾nA; ;„ûá~ô€n—áQá<51>ÈÒ^Øž6<-<yRz)ò’R3žF0Œ“qa&‹²ÙÚŸH¦R5<Ïe²ÙÚtZ“«oh¨CneMnã³NÉùa<C3B9>Á-Ä4¢;<êλb r2âJB]ibãc\]m 4±Q^èJ§ÙZ_­2|M*•4¹\nM:7¹\Άº:ebÙ†ºZlʦSN Os«![ãv9•}Ë|]S$l×Õ¦S\³ÝPÏÞ¸<>ëiÔ [€C/È|š¶4á&g¡¹„~ûXpÝjjÈåœ]v9ÊÊŒ;æt¯ì:>øê¬¿fâ¿ZI(PH(êUyFÅD5…ðu'FЋŒÀõE¶¨^l­ºl#C§â™£Ò ”T<E2809D>ÓXUÇSÈ!HÔ ,EÐD+­Ñ Ø;ÃîÆ@;Ïö¦YÅØXªÑWD·æ½õ®wú¿í_p´óØÚþ%TŸ„9cÊ"ùŽWpÇ_ºìz$Iˆ76˜Ü5eÀONK»„M‡%‰5z§—wü¾rÝ8=þ=ô0úŶR²Ö¥¨{¨>ˆAgÔ°¶ÛÕ$o°ÝÁ,Ãr\ÒdwØY†‰Âa1̰œ<C2B0>ŠŠŽé¢#ì<>"ÁLDÝq#`¿Çíe휉u0a1O<…y0¡¿ÉÜô¸ˆûbâ3èo0b˜ƒšÌÑÑ£Žñòxa´ìødvFõõU meÕý³«î_KfT±ìÕ1&OúÇ04¬Ò×Ëã©n²ê&â5½½Z«bhš4OÚßZ;kiåg³¯*ßpmgåèµëæáÂIWB T
èu¯Ä%õ$"Ô°½RWÙ8<C399>‰DØÎ«Ð
tÍk<17>Ð7ñˆkˆ½ ÚV>û3阄™h<0F>µâ<C2B5>ü<EFBFBD>…‡ø‡4êžá^å^˼–}<7D>{/ûNíçÜxÖ°˜MÖÖØ=~r2̨K7j“h kÉE˜tk£†mmÑ´3í…¨ É´×ȵ♚]5¸¦„Aæ;QwW¨ƒìKíîìP ü£å#—CÅOŒ¦B¹xDñ£Ç•?…yêz6ä?<R.¨¶Ê´Ö61¦µ#Gt-™$¤'%`ZIXÃvØìfIð¡hŒÐè TëcÔâ;a² Õl™rB«I¡¾j¾„ó<E2809E>ª ª
<EFBFBD>u28¥3vÛ¤kÌ+'†¤hµh@¸ï¾íÅh¶cS¾{2[BçæÒi>bõ¦²<C2A6>þð…î«‹Û}@¤©¹«…˜ÕxúüE—¢Í¸FJŽœžðÌ,œ;\<§ÿìX§Ë<C2A7>ÑØ&nZ¸çŽK»ÿ¥r~³-ªw×G<C397>Ò@KG Wd€™'ž¥6€"p½\ó…ÑZt§‰,zÇ:<h»HG1覭­ƽܨñuéKË|4¥3ýVd-¡‰jôg¨¨ÌÇ8¨³P dTÓE_ŒG_¨àð´B@ë“<C3AB>GðIȯ JÈkpKPͲM2ÓÜЊr6«±1_MWƒÂ c½$BÕ<¬÷Ìú'ìª?㢛ߨüç{ç¿hFܶúë¶^zýô«É¿†\2M—wd}}éÍÊÏd°¹öØpêç·ÜR^ÜYÁ
2ãD± B ÂCòŒkí÷±ŒoßvüÖø‰<C3B8>iÐtkiÖpkøÕÖÕ¶¹MüÅÖkw0¼`w`»ÃÌð:J—CÌÍfdn÷hDÜ!ú]~©p5¾o*(j+O…UC{2uæöy “W<E2809C>@<>†€NR lª÷~"W/UÝídîLÁäD|ñã鬨 ÕêÁÆõß{ôæU§¥=…¶M;îþ¢_N».Ÿ,dÓÙ›õÐý·ý©+Úo¼¨çª/ÿý§¨Ô È81N<31>B
šá]yíí±‡b¯Å^I~”<š¤amúôµé»Ò<C2BB>$~”~*ñtú'‰Ãé—šÞK¼~«IO$fűÈjÞ!çñÍv£/`Ÿçõøn
ÖÕf3¤<EFBFBD> Eë2¢<32> êISʈês)¦¹5 jBdÆ•íÈ^ÂðD1ßuO ªQXœ¦@KÉ<4B>UÃ÷ tÙ«™\{a“Eh …X²!™— ËKИ¨—PS¼ù <>(H»ÍnTñÄ4ä[ÂEF<45>¬„eRD (Ú ²r&Õðœd9N·Ä"îœÖ䟟Z"4Fº56 }í÷˜¦øŒeÿ{ùÉ ]Ûqéu·ü+±;`<60> Ö4&V­KKéñê¦iÇÚ^<5E>pg§qßnq¥óè¯PþøƒgÄÑ£WœûávbŸgƒ<à…_ÉC«Ù5ÚóMçY¿Ílb/Ön6^fÚlÙl=®ÿÒ ëgÏf—<0F>‡LoŸp¿5°-,ÇÛÇcŽ'h{A 1<> =žå^3sý}Óí:<3A>×^á§<âìú‰w…õ~ßdnÊT8:>‰ÞñÉ•µ<%ÝJž¡
á½(kÄ%YLêZê9”ž<E2809D>Àfôø<C3B4>y|ˆ4Ðê,$Pbj%<25>J [ƒJDª1oW¶<57>¨W”[P<>yŸõfùJþ¹+Vooã¿ùÁ3?ùÃó?*ôè<01>»öñð<C3B0>}úæ·Vj/û%òì{…g¬lœ¿¢v` å—ª„@<40>å|žG,çäã<AKDÂÁ6OäRÙæ0ÞâÈi<C388>Ÿ*ø¼ MKžðb(VM²xƒ&C bš€hFõÏ1T&<26>î²É(Lë<>C8à8%ª-6äê'׳ªô*-C{QÎ:n­é|äÄüw®Í†¼5^£^
ÍrŽý­åòòï=T÷ùøŠÎ{Öþ¬gZ°^Lº¬Þ¾XûxgùÒ$4V:ˆˆ]`†^X‹á yxFGoçµ×t>즨•ç:]<5D>…Î5ÄyMXppíf!ÝL¸HrciÐ^Çõ&D|wZ]]/ÊõúãsãÏljøô¹¹Å®€“Á­ýâÅmÖiÛ¥{%,)ŠY;Håƒé–î¨Í\B?—õÅ} º[Ö¶Ýv¯<76>´)Úap s¸¬lÈŽŽ ‡ß,+AÎ)?ïp±X}ohTÁS¦<©º«b­~
ŠêV˜
(qð4Š*ÊÕt2D0 YÅ©¸@´”k²ª{Ûp5 <35>W Ò)Ýœ#^yöâÞXXÿÝÈü<C388>í,‡6“<36>®|êác§YûÍÚGM¼ñÙ{<7B>íÞ¥=é&„θ­²cï}ûs}Ú´=Ö=òE¤8<rVÄ<z&[ù³|ÁÂN##=Õ&7âè<C3A2>Ë.üy7qZ<71>¿¹~ýóÜYþ€<C3BE>÷fîºç™+g„»»¦iMF,2¸ÂâËn\ú‡¡ÚÞ_À}ê(âcjdá ÙÖmC³#Îî²c+düY,¶yü%tLž „]m_@L´y2qjÑ<6A>‰D\t :š%«¢­V&ñûø°˜QÒ£ðD<C3B0>MdHB™5­ªîùÑ ìIõ­ÆÞ‡ šH6‡d û<>ݱG}h*7§¬©“)uImEmÈ^UãªåsÂH<C382>Táê Óüœ·IcÕ%/w.ÃmµgZ vVeîâºö%snªï¯L÷h¦}‹ØßÔ@à°.Âú˜ò<CB9C>½¡âÕ½VV­y<E28098>GÛü-tËðEëŒóº&­GÑ_1¬§6€"0$K¢ÖЦõDa1p„yv<79>ã&OÀ/HO„½ƒ‡‰„ù¨jg4·PQà}Á H¹¤¦R<C2A6>Ž j¦m¶j[VÕŒðEB(ÖfM'Eº<45>P‡<16>T'ʰ§ý`1™hiI$[Îmâ Y<>µ.±«ÛÃâüpÅE5¶¶¨­ÇŒ|Ã…èývgœÔûõ¯aËuëY<E280BA>º£˜ F  ~.<2E>ö„£Ö«¬X? ÿ=Ì<>) ùà e0{N`Mö+
&KH´<5A>Z`
ÖZ¬µYkÖR[CA«…|U¸ÀçöxhhŒ’§)å­µ¡ •ðŠY­ó.n‰î<E280B0>Ñæ¼‚;<3B>¥6Óм³Ÿ@*xš Šv>r¤\<"¼9t@UÊJhW<68>íªù¾r±íèøñjÀ7“É8Vp%\Ba<>§¤ýNò­Îf5FÔMjÕ0<C395>Ù«×òÕSy/rYK6eö—œÓdhY}ÖT3Ú¹îêOÛwÃöÓ*<2A>¢ÑÃs•Ws¾• ‡©[@|6]ÂØãp; wüÉ£î€Ö®%<¦owãŸJ#­^cÖ¢Û+7tÛõÈ"*š.;Ì”V :Ác„m“ö²YãÑn7I´ëÝÆ;KöMTðãPñ£GÉÁŸ
œü©`iÌ×MA¥f¨CciÑ<07>[Ÿcˆâ™<15>‡+, ~Öᬡé`¸¨µ;mqŽQ1 ë‰aü]ö4:ëØø¡Ï<>Ï-baš0Û?‡h˧:=ñçÐ1<08>Œ”@f“g…ÈfðÌ „ÃÍžX@Ì·y¦ÄÍžÙQ æi<Ú› <0C>3ÜyyFo§œoL…ÝŠÔvÏ1êº[íu­~¿ÝÀÌ™]œ<16>ñó±ÑˆáLúÆÔ)Ü›*¡é²®GnÌgÚo”ß<E2809D>q¯\BÓŸì!ÍÑJåÊÜŒºÞŒr(q¿©J5¡F3f ãB5ñeŸ4”'­»ªßeL£¡¡ÉÜhc¾±á.Wgó"¥°Ûì_·òTý2æoMÝ ÎqÅ¢)«UßÝCQxùöYç´¬3óK—ïlô·Í¯´,Î[#çµË‘ÆÂ•†¥õ–à¹-£©†ÁJÁŘ½153MR¢C×Åë·.éîÚû­ߙyoexzŽuyØÆh×pz~™¯Ài —KÛu%rÜÙ|VgcùýYÍÈ5™q$>"þ rPOʃN×l¾Uÿ€»XP¨óç2Á¶ !Œ¹@ØÓì Ät³§N™Â** éTÄc& &g2Ä[íQ“« øz¦^ŠdêI·§„áÉFS4<53>!RæÆEª*P\jÅ£V¦ãè¸Q (<28>œjˆ¬*hÌáŠ9$rº¢ÎøIE04òUx·!eVþ‰"81(2½ 5OãÌúøg2Äõsv5<76>×ÜUéŸÑ,/šÖj”»+}è=×p:&»$ŒEm<45>Ÿçn^¨<>Îz±ê•Ç÷œ<C2B7>Y4³7”ßè­Åâ߀€ú‰ß/ƒà„ääKÜǾU¸Ãv¯ðˆí ž²<C5BE>´Ûûù…ÕÌ:rN̘r¬Æiírj¨ÆO¸ ] Ò(v±Û5é˜
㧦´“`×E´È <20><>°JÈÈ$03V éÁ!!é<><C3A9>À$°Ð& N&³U½9äB¹:°Z°“jï`1__>ô"<22>¿¼¿ò%l^±óÆuî¼)oCæÊñ_ª¼ƒ\o¡{êOÿpOåðë?|Õ qª=¸´<>ƒò`#×¼ÕyGäáÈýÑ#Ñ/¢,¡¢3#ÄF!VèÔyrï„Ó<E2809E>žºDGÀ¨ªH·VÃTZHÇs)¿QËSØçf[EÆÍàåqM®NOuIj0 ÁMgŒû$(0j¨?5 XmU<00>°ìNÈrÕW LjQb”„È(–€Ž°štÕ?mDÝyÂ÷G_U'ÀeS•¢“€>§ç¼;v¬žyqå…3sœÆlZJ ¨Žº%K·úããMq¹±ãüŠqCç/ö—ž8=YáÊ<C3A1>Ð]3ˆý³˜úQGoí4ýþðË•§ô֦ʾ•iVTýãJñ)± ÈÂÏä~>áJäÄ-ɇÒû҇ӿŸ¦¿L2³“¨‰<C2A8>tz„ܪxlDç°[7mϺ#5Aɤàtð¹,ã`„ÖM0 §£ŒKv#·j¦éºv¤PJ<01>j¦©~p±|俱՘CS¶óÔ&ÔD†1"¬dHè$ÐdtpFÚ‡Ì}R<>@›æ%ĘA4К4áÂ<C3A1>§H¯b%ì6{¾1ï«f`¦d÷d¼ÃibÖâHm¾aë5—ž^/N?Ÿ£(lö.¨x÷ä®ÞüB?9W0»byôÀÜä¼ßß¶û¢Ë¬<C38B>u<EFBFBD>ˆ$5ÇäW”õ
´¹ÛWû»_¿Ž2ІãðnbÄájyÖʇ<C38A>?Ž”5/‡;å¥ <09>m¼Gs“òûˆD8" 2nñš[¼(àÍz±÷¯µ3ñ¿Å…\ s4\5|÷îJ DMæð<C3A6>ªŒ¨©“ÙG<0E><> ·ÃþPEC§ìÅ9aßNoò·“9Ie<49>Ë[ƒÜÅH-4×50„¼QÎɵi¶M<{ÞPÅdkç¡—÷SdÐRÙ¼pßàŠt¼©g¤XiYÔ‰• <0A>°jb¿Bì†Z¨C„Ùp\WЭҮÖmÒlÒ^­åãlÖSû3y%ôÝÇj&§J((B5<0E>óg²Ûtù]È¥´9&[•¶DФž I¢Ž')®ÎÄP¹M<>Á…þèšpaWÛ^Ù(ŠÖ‡JèϲÑu†{ û „¡ꑲÑ~hôMÇÐqáÍ!Sa|ôÀЈ#s"]<¥³«»W?R·¯V·Š·¸>w9Ž~¬nWòÈ“ÛYã<59>  @*ÎúPÀò£|üjèMÅZ͹©$±êB%E<ó£SóÃhMÐíÙÚ·¸®mÝ·7Ü»©á2Ö$ÐÆo µ^Ø3oÛ¿¼µûÆâíz­‰r¡š¶¾eÝŽš9¹ãªÓ×m<C397>ñšÊ 7®XÔ|Fïô wŽÞ3j‰}€À91ާ;!‹åΈÜ!lÁ_ˆ5A~:ÓjÐÈ|P}AáŒÅí<C385><C3AD>IKXÌ~Ïõ²ë½–¡|à°ëe—ð¶ëe´•Gßt9^vµV3 µY¤dUDb2V¬¥”e­AÙæ¬8±­H…æc<>£'ÜrÙê74ŽÖØ×RçènÑQÄ<51>½åý³¢Ý¡ˆÍ×Ó¼º°ŸIЯ±¦ßNê¾T°eš'Þ"$áAyNÓç_Â,ñ¯eÖú71w1wù9¿Î¯Ç^oöè¢ÔìIDK@˜göX¶;=NÉ+ð•ÐíÔP­AMñDùŒ!™Œ¡„áñ4 LDRtB:u"ÇkT÷9Q£õmJ×XøŠ:0…˜$$2„| †±Hùª{?Õð'šJç«_UÖôˆ¡™<C2A1>ÔÔ5IÍ+Ù‘j1GwµG¤âÔY;7_ßâ pWSÿÒųç„l½è<C2BD>Ä=å-]ñY)g‡gg©`YîʃÁÂ…8zçiÑbkËvÌÌs<19>VY"ãÄÄNá~ų̀&jÍkòÖv±°Ø¸Ø>èô­Î1žc_åÝÈm´]äÛÊmµ]í»î@v5±T0Ùì6Önc˜êL†³±”3ÌòVFX†ãlØTBÇŸ˜n÷1"öÐñǧoμ44zÜa7Þ-;Ôÿ%ÅJS“G“9#öÔ=•jÞÜb³»OIéSýeW©é:TªOpš7öê웄<µ‰xåCçx=[y=RãÌ;ý´%$x=åcèÕ`¯9j俟,œSΚõv#~o0`¢ý
wj&>§n vB3bå«$Fʬw!Ø¢9†Õ³ÖÂe¡xh£e«…â(%ó8OäIº®Á•ÍL©¬Ûãö4¸,VõoL¥F/0Õ¹\ÙTj<54>)
†RÙ†:7Ͱ Çªs#±&ÐSFOsT ýMÑÂb«<62>¢ %T­tC<74>,¸²ê2¨Ü PAò„R8(K¨üøô€„¤i™—FF<46>«é·÷%*5R­<52>ªÖÞ®ÆúNewH…çVqm•ÚTýTþKцÜû¥(Q-ª;ëäo±Ü(_/U÷z¥b³NóÄ­'<27>¬8ÞÊ~¦µø·•¿a†ÒâÊ[µ<> ZŸ®<C5B8>;"ë÷â„Å<4B>ÄŒ+jMù*´Çsº=⢽^Jš~ü÷K“8SþwŠ¡IüM Æï'<27>qïHûPåºBkYH‰¤:"ñqLC¼ïw "<22>D`Šã Îz¡qÔ¶•ÜJ=áyÂ{<7B>þ$jêaz ½Ât;ÙØ<C399>”Ñ@ÛYžo°Y­qÚn³Óö¸5ÏqkLŒ[ó |^´L|¼`jø¯n·Ò÷ÓOÐoÓ¤=céŒIÌù|C\´[yš­kFÑìŒÓ ½™:Âåñdk 7Ÿ§y+9Íhœ1Mé;ÍH»kã©¥¶˜yé½—†”YÊŒfÔ¹Sv ·«gåF:ÍP !1”N3 !¡Ìœ:yŠ,£Léä|
'·DLNS5Œ8<15>@§D'ªJ¦:íª©”7Ê|¢w¤†Obš·¶FB¹÷#ˆÍMOW{í~É6vÚwzõþúÊ/ëÿ±¿99“¸ÍƒÌ>ó@ºó´ôLËDx<d&ú—ʺ9iìñ`ì0™Ûy÷²Ð±”<C2B1>7k<19>GjE <0B>¸8Àx”=™x<E284A2>xXýË÷åo-q"†·;b5ñäL®Ë=3¹È½*y5uòöä¾ä/’úÞ$Š&ødBÝ'^09œžã˜ÉDÓ8œÑÏf"Ød%23СH—GŸe²SmYÎ[,ÈRçßkõí¡Âä @[[ù@Û?Š<>²F±Â<C2B1>)I1ŸØ60),têb5¥êMj(<28>¢z ÎæuŸ=CèÂ?2Çã†ÊÁù·^ÐtÖ´”ë[Ó%4YÙÊÕ¡÷ˆÛüˆÕIz¯·ü7¬ax—c¿ŸJÇ<4A>?÷ËšZb9 IÎÅã½33Lþ?m &?
endstream
endobj
58 0 obj
<</Type /FontDescriptor
/FontName /AAAAAA+Times-Roman
/Flags 6
/Ascent 750
/Descent 250
/StemV 108.886719
/CapHeight 661.62109
/ItalicAngle 0
/FontBBox [-203.125 -428.22266 1700.1953 1271.48438]
/FontFile2 57 0 R>>
endobj
59 0 obj
<</Type /Font
/FontDescriptor 58 0 R
/BaseFont /AAAAAA+Times-Roman
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [0 [722.16797 0 0 250] 36 [722.16797 666.99219 666.99219 722.16797 0 556.15234 722.16797 722.16797 333.00781 389.16016 0 610.83984 889.16016 722.16797 722.16797 556.15234 722.16797 666.99219 556.15234 610.83984 722.16797 722.16797 943.84766 0 722.16797] 68 [443.84766] 70 [443.84766] 72 [443.84766 333.00781] 76 [277.83203] 79 [277.83203 777.83203] 85 [333.00781 389.16016 277.83203] 90 [722.16797]]
/DW 500>>
endobj
60 0 obj
<</Filter /FlateDecode
/Length 291>> stream
xœ]QËjÃ0¼ë+ö˜äGRÆ<>*5øÐŽ´vµ,dåà¿/^9)ô -3ÚÙ]ÍrYŸkkðtÆj<C386>Óxó
ኽ±,IAVD·¸¬ÏÍ<<6A>¬(ø'öf
~†ÍI<C38D>WÜ2þî5zc{Ø\d³e¼¹9÷ƒÚ‚•%hì—¯­{kN²]­ÑæÝE6_³CH 'q5jœ\«Ð·¶GV!D EUUUÉÐêïYT];õÝzÊÎJ(„HEIèщP& í<>TiÕìï Ó<Šž(ä iÓc$cÁüÉŠPvФ$2Ïïh ‡(Ï_bë•|^'ˆ=—o-ö?<S7ïÑÚù´8d,>ÖèF·¨ó ä0Ú
endstream
endobj
4 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /AAAAAA+Times-Roman
/Encoding /Identity-H
/DescendantFonts [59 0 R]
/ToUnicode 60 0 R>>
endobj
61 0 obj
<</Length1 20688
/Filter /FlateDecode
/Length 8344>> stream
xœí| |SUöÿ÷Þû²5]Ò5i6/M i)¤….DšnV¤@Á[i<>JA<4A>BAQŠ#u<>qÇeFÔGÔQ^1 NÁ<>E@;€"P
n J{ÿ¼—BaÄ?Cq~óó÷ñ„|Ϲ÷|ï;çÝwïyi^ `ØÈçÔWË~P@ùèü¡%Eè/?µ¢:×q0 ^׎¿u¦ø”yÇç@P .¾©zâÔw®z$Ðåª/&VÔTÃ@üå(§Ü~Só-;Ó€ðE€fSÕ„©³øVÈZDô¬ª¬˜°ã<C2B0>kR  UUeEHª® ¥â«¦ÎœWCoTOì/S¦<53>¯¨K¿À6¤ejÅìj5T{b ÞR1µ2º8­7@'ä¦êi53y"ˆKöWϨ¬NØ>´ˆ)ôÀ E0ç`<60>çæ¾‚ ¤`4 T 1P<31>AÞC>æE„š<>×!Ï€ïW~‡Aé¹@Ž(=*ºÄ_*¨äúV­UOÒ#QÖë„ê¥ß¯lŸh€VžCÝyG J¾@Xg¦a<10>ÀO9Šãd™-š9ºlþ/ã¹­¸ Æ¥PA«zL•
<EFBFBD>hŸfÛp Ѫ¨^-PY„Z@}~úÅCóD¸q\4«>èNR5Iƒ[ž<vÕ«ò,Ë+ Œ‘³t&ãéNÀ<0F><14>¨ë´nDR§-œÇQ!<16><><1A>r0“P<E2809C>)ŠbŒF%f “0 ·@D?ôFôEo81C•Þi˜‰ÛQ<C39B>Jd<4A>7ZÄTb"fa
*0Y?y,=1“030 5˜0½þe|בŸƒ'ú úCD1ªP ñG¹ˆÈÃ4Ì@µ‚˜Ù·7Dä`Jg†“0U˜‰šÎ|k”oE%& ·rAÂÿK¯Ãÿû_$æJ_´Wçëï¼>üϽاꕌÿÛ¢}a…ùUº'ôy\õßÎA Ì?¿MŸÇÈŸâþR¯»Pƒ!î¼QÅ9îì<C3AE>def¤÷KKuöí“Ò;9ÉØ«g{B¼-Î*ZbcÌÑQ&cDxXhH°!(0À_ï§ÓjÔ*<2A>Q¤Û rQ²—KÝ6xp²Ü¶Uˆ½â¼ŽrI¬¥Ar$±\¡‰¢tÓ¿0Ý>¦ûD\ÉIb<49>M”6çÛD/3¼Ä&JäÛ<¢Ô¦ØC{©bäÛ<Vkr(˜ªòE‰”Ò [«ê
Êó““H½Þ/ÏWé—œ„z?}ž-OŸœÉh«®'Æ<>D1¨± «žB<1B>œT EÙò ¤H[¾œ<C2BE>Ä
*&HEÃK
ò£­VOrDòÆÛÆI°åJA…‚<%Œ¤Î“4Jq|6¸O¬OZ[w¿×€qåÿ ¶ ¥%«ðÈ1’Ñ–/ï8`êj&'I!y% Ï÷F³ºÓ$QnÖÕ-¥'‡—œïµÊèñ˜’“’“$š0¨¼n<C2BC>䮸prRáH±´ <%YàINå3ÏÊw~•¶¹§|²(él¹¶ªºÉå¢U'aÄíÖ†¨(÷jÞŠ¨±®¸Äf•²£mžŠ|s}êFÜÞé#/ô$'Õ}[ÔiøœoTžó)B—­ÂçfÈÙ†HîrI/JQb“hB† ¨Ÿm•ÅC
¥ ÃK
&Iº¼ò:CÜ/<2F>—T X÷-$Rnk;zaOEg<45>:Áð-dS^'çšD*ÎÚ’Ã!%&ÊKD“'©å3¨´û%'Ýê¥6[µAôRyúPT"
OVŠ)9Éj•/ð}^7Æ%'Y¥Úá%¾¶ˆqÑ p§8<-—=kÏzÂGÉžÚ³žsÃËmÖä¤&å.iíçþ"B ª²$ñÿqWúü…#m…ÃÇ”ˆ<75>s[X|AËçÏ8ç봤мM;-ͯWzŽ,7Jü%!AÔÊ¢žàÕh‡—øzˆ8H2”ö¡ÇÏjý7yùqy”¢º†u¦)e9.l¸ }Azþu¬°Xì´°xL]<5D>ß¾Â<11>‡tª
QBq‰UÌ“0ªDb KðòµòÛKdOqÉ™Eèëêl^@Œî´=<1E>G^<5E>ÉIƒlƒÊëêÙÄAuåu^^;Î&lu«éô<>ºêò³ ÇË×Ü- ºß#Ê«HVrR=En½<6E>,^ï&FŽ)YmÄEÅ% ”мò\<5C><¸äü«§l O2 ZƒHÕD©žE¤`‡ à‡~XÖ“øaÙ/kúX<>É$¼ˆf¼AŽÃ„•X<E280A2>#òñGÌÁ2,„cF@…|,#‘¼ )x
Oa3Œ¸ÄÄ<C384>`°° €8ä Óð¹ÏB)ö
¿A:®Å-¨&µ¼„?ÈâÁ3XÍÞáíÐ#
ã1›ùª<>üc$£¿Ç£ØKÒ½ 7®G-V³?aceáù÷g2°â6l†€¡ØLÖR®=ó3Ï!b"sXžj'ÿ3—øz0˜Q†*<†5¤¹šZU¥|(ߌ$c6jñ(°
«àÅëøˆø«Žó¿ðãˆD†`šðYË:ÚçwdË
`B/db¦áïx[‰<>üƒNSù«œ*·êÞ0ôÅ(\<5C>gÑ„OÉI:—Î¥óØ[ ž‹@,ÀoåÙÆØG¢H
FFÓ^t}‚Í€¾˜€IXŒGð6öYEýéögááuLG+v<Ž?á$€˜ˆHjÈÝd;ù„æÑ±ôqºŸ-žÞ×TÀŒ1àœ$!$ƒ '7<>*2‡,$¿%<25>Íd+9Lsh1½™cUl:{]Èr…B<E28098>ðÕ½ªûÔ‡;J:Öwlë8É<38>ü^ ÇÌÇoñ{<<3C>&¬Æ|ˆ±û‰ŠèI $"±QäNr'™K O“ä9ÒD¶­d?9B¾"ß’ä/¨šFS+<2B>£qÔFgÐÛè2úGº…n¡[éQzŠYs°~ÌÅ<l›Î²¥l){™í¢„-W9UNÕê媪To¨Ž«ý5wk¡ÝtúÏí‰í{:б¨ãᎆŽ&¾áˆD̰À…á¨@&c6Æ3X‰ˆ?1(HkÉp2L&ÓÉlr7¹‡<FžQr‰¼F6“ä  f%çÞ´Í¥Ãè0z#­¤ÓéRúm¢Ûé÷LÃô,ˆ…³Dv5+c•l&»<>=Ì$¶‰ífûÙ vš<76>f\ð,Bœ`ÂÕÂXað„pH8¤*UmTTû©§ªïU{Õ_júkjŠ4Ã5eš%šUšm9Va^Æ+çÎ#­l>+`/ãAš*DÒ÷è{HÆXL`Ci6@W<>Eô.ÒDãU³ÕèrŽ vºŒ¾E—ÓtJ
ÉHL¦}}GS‡ Ïp ëÐ&¼F+é{ìeÌVû“¹ô˜Ú 4 o²>ƒmÄGl/ÑOa—àGŒ¤<C592>>ËŠˆž¼. T•ÀÊþˆ—Øtr€ßÚû‰ƒ\GžÇB'ùŽq0zš<>Î>Áop3݉6܆Eø™ LăH%sp¥O°^ª[Ô‰êpò.<2E>$ÔÑPÒ*<ÐLO˜* ÷<>˜úý³°EðÃö7á5º…¾Ä†
ÇU#H¦â.Ü‹é|>nW•`d4„V,Ãæ¬X†y˜<79>R¤`LX/rØPÌ€ \K&“Qx<14>á1<˜<>IÃõ¸ï¡I]L½˜¨
$•8;F` ÿ+åq ɼ ù±+È‚Ž;Q<>X|ˆ=äZÕ ºE5ˆ'Ó:ú!I¾ðú$<24>˜ð>ÃKª^E<>°#ÍïçÿD8z"<0E>b®Á8ˆÁl-R;®£õ|«Æíª½Οåâ‡*>ÃðžÑ¨P¡q M<C2A0>ÈûX…;QIG𙬲ca JáÆ½˜…ÅX ª|•ü<E280A2>ž°¬ÁV§E¶ö´[…
kåïÕ€j<E282AC>j üÉäUZ]è¼üPcˆ1Mëå‡Ü<E280A1>!Æ4!2ĘÆdÐyùÎF“Uvít0YÓ„ž&kZˆ]è¥MôK ªH•ºJ¿G-¨ÆÔZ<C394>N­Ö©™ÎÏß@GéD?}˜ŸŸ^ÍÔ:æå'Ür/) £”¨ýõjÂ(ˆÞK#Ý:??£Ú@/5¹uþºn¿Z?êç%/»ôzlÄ0º„R*÷èA˜Á@GA>¬>(ˆŽ‚@€ÒÞßäï/Ô´* ð kù
“ÃqÂáp8\†oÊÚ í>õ)²³].—áWpˆ1“„d.ìíphï2¬W-ìmòY ׯ_h\¿¾P2Ž,”ÌÃÇ”4iýuþÂþ ÿ†ddddxúöA)Ë+-qëtq™Ú¸ÈLÁË÷ÔGf:<0E>ã¬XƒI*‰0öO'©$˜hßx”X
ro$æýí¯Ð©lhÇ 9sj•§Ûå¯Ðq•pÞ¢Z§\ÏÁnÕ¸T*
µF%PF q Ë™k,¦a âI¨à¥ñ<C2A5>ÚêLŽë ß” m?Ñnpù^ÈvÚ33ûö í—žÚ/5üª×V¿&œØ¼yófPÌç‡4ͪ`D<yÄ]-FÇ «õñÂñxZ5>–ö‰ìKÅH1Þ®!ªrHO^Q¿¥§KXm ½Y Õ<>d¾&€ÎesjuÁt”ÕË[d#ÐËO»SõÁt0†„…ÆFD„‡Ó S¬? ‰5Qc ÕZbUº¸ä bô“/±ÑË¿i¯°Q¹ÖòU6FÈ—Øèåß5éõç<6A>êQÆ¥ý<C2A5>»·^¯eìc,2RÑXn¤Æ{xqð5}à-B9¨ˆjPDͳ»Ù®óò¯šä°:åXr\<5C> Ñyùá&ƒA-9œìP<C3AC>uD™à%©õ<C2A9>ú¦ÞwÁ‡¶]g(;QVV6ôÁ!™ee)çÖ«ÝuÙmÙ®v—òn ÉLqÚ]Á™Á!™}ûÀáp”ùd:é4­ýÔV±‡=Ø«hìg ·Ëo§¦á†<C3A1>TgH°<48>jšO?½°ãdÇ<07>/"fF´Xvû­ôúöçÚ×wèɧzñŶÃIÉ% {ßz±Ãý·añÝ'wulëØObÈâ$Ñò
ɾ¦cT@#vºK—G®Œ¤Ç4ÇBé^ÍÞPºE³%”6kšCéJÍÊPº\³<”.Ñ, ¥s5sCéÚÂèí”0:F;&ŒúkýÃhX¨VcôÒƒ<05>
d§h`%þ®¸ˆ—¹SB§iæih˜†„f„¹ü]AA<41>ncTZà,¢Éк(<28>±%”ÐHÓôg}sí*oèö—ÏBv™«ÝÕfhSÖ~¡<E280BA>‡ÈÓ
û†wûöÁŒéÓ§“é<EFBFBD>BÊH¸­_Zzÿt£Z­±žg“°ˆ‰7$¥§1²ì¬%¬ßö̽®¢^ƒŒ7\ßeqê}Ô@4x<34>XD»õ”ë1ØA( [C­èE&,€ƒ8úõ“çw?$XUk`FOò<4F>{jP¤%2<>eÅŽfefµ€0$ªâMeP9µ”1b2E¨ÕšÈHUt4¢cDÖQ9:&c¸šªblá!¢É¨¦"££"¹DØTÚ˜è()šÅ<C5A1>>!4dI¤@€H/_ë ¤£"5v³^¯õò£Ê.Ózù‰&y“iåR*¯|­—oWºÖË<C396>4É»Kéw€ÖË?u÷—·š6*Ñä'!(VÞ<56>Aaò<61> h™¤•7N<37>(-A$(²WZú¿î•޳¶¼5Ù.—áDYRœƒC2CŒ™<C592>íà¹iÌÔ]ƒÖ¥u-Ôº´w­×ºä¾zµüs×*<2A>)Êä11”yúö1åÝöÔ$Xƒm1Hð·Å ‡_L ‰3ˆ1$>Ѓž:{ ämGäæÏ'e(#©Æt£Áa°Åõ°÷3 Õa´Û{¨z¤ÛIšÝ§Huö'iî·=ùoÄÝñÙ¾¤ŒÐ7²Jrãû§u´%« ë_¾çîçWþ¦¶Qµ¦ŸnÙ±´cv{Ç®7æí&*b6Ù† 0oâÔ1§Ÿ^»qã¶7ÖoY<6F>bÖ³Ñn²l}<7D>õB+ëÊz58b,«YÓ0Àâö2[cH¸3('™‰ HQPd"¦1+™ˆf&?7ËbA``±˜ÇbQËb±Å¢™Åb+‹•×,U¼"Å4‹å,­²‡Å0sƒh1äô`‘˜Ç"AÄŒ8ÆŒàÌ 3"…1±„±œ¡VxrÏ´3ÜÿffÄqÅãfƆ‡RÝ^fl¸OQ<4F>“§8•f…¯YZ¦4¯÷øôÐá><3E>?ÄGËòÑú¦ùº{çút<C3BA>IpÖÊÚ/À¹6'E`+E5¡ëD,x…Cbá LÝÙãf!<21>ñvçòf&€0ùÆ:¾–‘†€`gŽåôB`¡_Ð6Ÿ‡¶5;—ç\C÷c%Ý<>Œî§ûé>ºóh«<ç´Ù´ËÏèfÚŠ-´Çh+Ô´•¶Ò½t/ÝC÷ ˆîF
Ý<EFBFBD>cén,?c7ÓÝ8FwCCwÓÝ0Ð<30>åï<C3A5>”ílú1(ý˜~ ÝBwÑ]¢<1F>Ð<EFBFBD>èG|-ý !=Ó¹Z1)<29>†%¡Ó0Fw!N/}¿áT/ËjfgfyE½Êâ0©,®!¡¯ÅËL ®I/ý¤QtXžÌéC[ Ñù‰1m<31><6D>¶@¤-(¢-(§-¨¦-P£œnG5ÝŽZºKév<I·C¢ÛåUv¦Çp¦G¤ ÒMÏxúÐípÓí(¢Û¡¥[D‡ÅK·4Øs-9ô=ú6Œ°ÐÍôEo¢o)z#}SÑïÒ7 Ý@ßjˆµ GOßèÛ0з` o#…¾ ýGc|ˆ…çÓfXh3Rh3²i3†ÑfŒ¥ÍXB¡¦Í4®a%$GO_Å-`¡ 8¢è¿âi-Ü“-n{Þ§[”Ážu•Ó-f]å\..·S·ýáG<C3A1>nQûƒ9Ý¢ ö{îwºEìwÌwºEìSnuºEì&;Ý¢ ö1c<31>nQû°b§[VìôÒ'^‰ïaIv3sèmèCoƒÞ†"zzüÂ)AÎíñ†ÄD—>ævôJ´Ô®!µ¯‘Ú¤öiR[IjçÚù¤ÖEjo$µRk&µ±¤ÖMj_%gS-q7]ÐÌtRû"©­!µvR@jãI­HÒÝ^jm’ª¨E5æÈŽZ¯è Ê ¢VdS+æQ+š©´¸ÒrSk£ç#GÆÊ:®11Û×î<C397>åœ3˜®Ã<ºKè:ì¥ë …®C9]‡-TþÐD×!ûŒo,]‡µtŽ<>ásºjì¥q X¢`<10>C
<EFBFBD>C6<EFBFBD>ÃX‡y4ÇhÔJ:ǨÓ:S\©$Ò™ô0¹E×ÑuÊ—VjuÇ̇a0[b&A±dX,<2C>¥éˆˆ¬ ö€U'¾;]ŽŽ>H— º´S/i8Gì¯ZrÂÉ+XH&ì$<>¥Ýf­¬Ó`¦/ÀBœ æÑ/ j°'YÖ<59>@yÔ*Ë)ó˳—UÃæW-;D¯@,ÿ4{é «,-æÅwS¼ZÒ`yÍî%¤Á²FT¨«Í7(Ôùv/y¬Á2WV«,w™¯¶ÜlV•>Ç<>5^<5E>¸ƒ,#ìc,ƒÍ‹-ùæqw<>WKVY²Í7Z\>V?yÌ*Kó«‡ÏL4<4C>¶ô2+Am±ÊG¥{I•;Ió°¦D3LÓ_ãÔ$i¬&F­ Ó†h Ú@­¿ÖO«Õªµj¡ óòV·Cþ)4L­üBZ<E280B9>QPl•‘ú~õ…-Å5<C385>BY!-™K
¥µãQ8N”NŒ´y‰ßð1Ê<EFBFBD>BçJŽB¯†<C2AF><E280A0>Ò¦è†zBôH‰.ò—x —»DËÏmVƒ<56>àD˺ç<˜"nÍ6e‡ Δ(ïDG—˜.°c¤‡ GHÏÇx$§lðO¡ô;ùÁÎjò9^<5E>¿š|)+OÉj6<6A>|U0Bîgó=žB/­ð / òWÃ.+OÉjm,D™Qëã=æã%<25>¯d^¼¬<%«u:$(¼<04>Ná DæÕ×Ää×ÇÇ+£ˆ…ScÏçlH(ȯOHP8µØ p6DÔÊi B1 òëcÍ
…DÁ¬PÌ$J¡Œî¢¤tRŸ£,V"1ÒÅ1û8­g9­ù<1E>ãß•Ê\‡ƒ4ðŒ/•Š•Û
*ËmåÒ}·V™¤Úq¢X?ÞÓù´Ì^>n|•¬+*%<25>­2_ë”^Ä]*»ØòëQZP\R_ê®ÌoàP`«È÷4^]”–~A¬Åçb¥]ä`EòÁÒäXW§_Ä<5F>.»¯c¥Ë±ÒåXW»¯VbAYãE%õZäzòJ}ºêýBòJÊ£­žÜCõ@eñ°šæF¯@V@ïðHþ¶\)À«¸ssd—Å(?ùìt™æ°F¯!+:]lË…c欚Y0LÊ÷ý«©©©™9«fæ,yÂ}è¨ù)q8’»"¿f&P(%Ž,”²‡<C2B2>×h
$w¹|JRÖÙ>½¾ÀË×ú:{<7B>,”²äNÆÎå>—ܧÓu|ýguê<yÔÒW‰;ÌD<C38C>‡I±…ÅT
),î|Ä´Ë•ÛC<C39B>Ž™5ÄAjΣ3m‡¾6äs>ûž9«Óêœ<E280B9>Ú7ÒGÍÙ)9'òd9ÎÍØL‡Cù2<C3B9><32>YTŒJLª£úµøNË¡…w@o‡ü”g)zÞøóv €·#PÁ òvÄÛŒ ~!æ§Š~aå§ŽPþ"Æ€áü˜οG$ŒüD!<E28099>hDñïaV0Ñü{ÄÂÌOÁ¢ ˆ~
VXø)ÄAä§`ƒÈ¿C<¬ü;$ Ž;âøIô€<C3B4>ŸDOÄó“è;?‰DèÁO =ù $+؉üRàà'ÐÉüú"™ 'zóoŠþ-ÒЇƒ~
öG_þ ÒÊ¿AÒø×ÈT0 ýø×   ýù׸
éük DÿÙÈä_Á<5F>r0€…\¸øWȃ‰|\Å¿Dò/1Ùü8®†Ç`äðã\~×(Xˆ<~×ÇP âÇp<C387>Ãp5?†" æÇ0¡àH\ÿ@1
yFa(oÃh¯Çu¼ %Æ<>ƒ"~cPÄÛp†ó£(ÅH~e(æGq£c1ŠŽrŒæŸ£×óÏ1×óÏ0þ&` ÿ ¸<E280A2><50>U(ãG0 7òØŒr~7+8ü¦b?Œ[0žÆ4«1<C2AB>ÂtTòC˜<43>‰üjœ‰*þ)faÿ·b2ÿ·a2?ˆÙ¸™Äí˜ÊâÜÂâNç`?ˆ»PÍb.¦ó˜§`-jøÌÇL~wc—ŸÜÊ?Á=
.Àm|?îÅl¾ q;ß<>E¸ƒïÇbÜÉ÷¡sø>܇»ø~Ü<>»ø><€¹|Ä<¾K0ŸïÃRÌç­ø-îæ­x¿á­øîá{±LÁßc߇±<E280A1>ïŰˆ·â,â{ñ(ó½x u|Ç}|þˆûùüIÁ'ð ߃åXÂ÷àI,å{ðòÝx¿å»ñg<Äwã/øß<>g°ŒŒ¿â÷|žÅÃ||žSðy<Âwá<ÊwáoxœïÂ
¾„?ò]X‰?ñ]<5D>ðß…z<Á?Bó<E28093>Ј'ùGhÂÓüC¼Œ?ó<>X¥à+ø ß /žá;±å;±FÁW±ïÄkxŽïÀëxžïÀß |Öâo|þ<>ù¼<>—ø¬ÃJ¾ë!ñíxõüŸxKÁ·ÑÀÿ‰wÐÈ[ð.šx 6àeÞ<C39E>XÅ[° ¯ðl†—·à=¬æ-Ø¢àV¬á-؆×x ÞÇëü|€×ùûhÁßùûø'šùûØŽµ|v(¸oðmøëø6|„õ|v)ø1ÞäÛ°oñm؃·ùVìU°ïò-؇ | öc#ßO<€M| b3ßßCØÊßÃa<05>`Ÿá}¾Ÿã¾GlC ߌ/°<>oÂ1ìàp\Á/±“oÂWø<57>×øˆoÂ7
~<>ùFœÀn¾'±‡oÄwØÃ7àöò ø­|~À>¾§lÇ'ü]tàù»¿Öôÿ<C3B4>šþå/¼¦þo×ô#?QÓ<51>ü¨¦þ‰š~èG5ýÓ£¦8WÓg\PÓ?ù‰šþ‰RÓ?ùQM߯ÔôýçÕôýJM߯ÔôýçÕô}?ªé­JMoUjzë/°¦ø_ªé-¿Öô_kú/®¦ÿÒ?§ÿrkúO}Nÿµ¦ÿZÓ/^Óßù?PÓ!ÿž-ŽêõÚ+øk<C3B8>+{q.EÐw./ºþþºnç%ÿÉåÏ-—<Wÿ.ÒåE× À¯ÛyÉûsË%Ï5 tyÑ5
Òw;¯ÿĹª.Eê"]^t- ÁþÝÎë¿r®ÁÝ=W‚ƒº<>—¯Pü¼rÉ?¨ î"]^tBC»<>—¯Pü¼rÉs í*J—]<5D>ðpC·ó®dž..—¬­á]¤Ë‹î“)¤ÛyW2O—KÞ3M]¤Ë‹€èè°nç\É<]\.Yo¢»H—=11ÝÎË·y~^¹äÝ>¦tyÑ ES·óòmžŸW.Y[Å.ÒåE<0F>ÕÙí¼þ+çjíþ¹&$˜»<CB9C>`¼‚±—KÞGºH—=‰‰b·ó®dž..—¼<E28094>$v./º½{Ûº<C39B>{c/.A—"ôî"]^ô(8<>önçåÛ<?¯_Šàì"]^t3ú÷ïÕí¼€+Y—KÞ3ûw./z,²²º<E28099>p%kâârÉ{fVéò¢ÈËsv;/ ù
Æ^\.ùÉ&¯tyÑPX˜Ñí¼€¾W0öârÉ»}aéò¢'bäÈ<C3A4>ÝÎË·y~^¹ä}ddéò¢÷FiiA·óÂà¿Ö±\ŠPÚEº¼è©˜0¡°Ûy¹W0öârÉûÈ„.ÒåEÏÀÿ‡>
endstream
endobj
62 0 obj
<</Type /FontDescriptor
/FontName /BAAAAA+ArialMT
/Flags 12
/Ascent 905.27344
/Descent 211.91406
/StemV 87.890625
/CapHeight 716.30859
/ItalicAngle 0
/FontBBox [-664.55078 -324.70703 2000 1005.85938]
/FontFile2 61 0 R>>
endobj
63 0 obj
<</Type /Font
/FontDescriptor 62 0 R
/BaseFont /BAAAAA+ArialMT
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [175 [1000 0 0 0 333.00781] 186 [666.99219] 232 [556.15234]]
/DW 750>>
endobj
64 0 obj
<</Filter /FlateDecode
/Length 254>> stream
xœ]<5D>MjÃ0…÷:Å,“E<E2809C>ì¶4 #p”
¼èusY»Z²¼ðí<E280B9>B3ð1óf<1E>ŠîÜ9€~D¯{L0Zg".~<7E>aÀÉ:RÕ`¬N7*]Ï**ºs¿- çÎ<C3A7>ž4 ýÄÉ.)n°k<C2B0>pOè{4­`wýžÐ~ ágt á Ž„ŠWÞÔŒ@‹ìÐtɦípý߯×êÂÕÕ<C395>ö 4Få&$ cŒqh¤”tæßüñª­bÞn%‡†UO5ÏtzàÐÔ¬WjËìùXè嘉IVîÞ.ä9‰»}½Æˆ.•¸ŠålÖ:¼'|Ȫ\¿i]wÑ
endstream
endobj
6 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /BAAAAA+ArialMT
/Encoding /Identity-H
/DescendantFonts [63 0 R]
/ToUnicode 64 0 R>>
endobj
65 0 obj
<</Length1 5040
/Filter /FlateDecode
/Length 3289>> stream
xœ½W pTUþÎ}¯’ð’¢B|¯}$$¤;ÿ„ðÝÒü„$@7XÐMH"‘¿È‚#<18>¡<><C2A1><EFBFBD><19>¢£ã¸Ëº¼4<C2BC>zDF™evÔjvYf™A<E284A2>ajÄYgGpV$o¹·3(SÔµµµ·«ÏwÏùÎ=çÜsow¿ÈD$Äf×F~·äz)@Ÿˆ5´ÅW"sÚÀ×°¶]{¶eòx@
ò½KW.këlßá\<5C>€c˲åë—fÖ·ç¬@kscÛº4ÇO¸~Àæ¦xã&üË*€,âÙ7Ò‡Ô `hs[û:×ixü€gùІ8ZÑ
à
€ô¶øº•î°ë@nÚCñ¶&ªq$*äúÊkÚíf44Mè«VþáŸ6žú]œoÝ÷‚#•G ÆUpb/ÒÀà<C380>×ïœoA,¡?$<24>ÌÙLµhÂ2<Œåˆc5¤T,»‰ç¿Ã À‰^ÊO{c½1åóëC°¥rk¶<6B>ö‡}ëúVßÿ䣳ʯR¶[è/MZ(ð½üݽ±/÷(Ϥû¤ÝÊ&ÉGiüLXâf¦í)¤ ¨aý¹ƒãVKn¯påúÕk`@ƒÚGºOjÓ@ûg ½èóúÄJ/àxÚ¦v3šîpZ4ÏÙ5]BºCž.IlpšÓ5<C393><30>ö±·ª6§¸xÖgå3o”Ïò\+Ÿé¹QŽÉå7Ê=Ÿ•ß(QZíÍ–íÍö:ÖZ׿p„¿8lI¿þ2_å¹y¯ÜiN§¨8ÝåÝËp»öëC%=]`fF†èrVzúõ˜­(ûstwef
<1C>•%ðî>¼Çãᇈ<E280A1>ÙÙsúÐÑæFŽô4îìûÀþ}ï€s½¯Ûÿ*Ý  ¿Yïär`6`$lÀ{<18><>(ćT Ý8ƒ÷1 p
Õ8@÷#<23>Y<18>6š„¡ôKŒAÏãb=Và ªð=xÑ<78>£öˆ18 ×<>†<LB °?°Oáüíߣ `á¬ýï ÛÁ0ù¡+ÉÏÚí'Q<>Y؇£x<C2A3>î±+p7F¡A,C3Úð¾ƒ}xgqކð£“P…ù؆=x='§ÙÍv+æaZцÝ8…3¸Œ?R6½A§í!v·mƒAÇ8L|'žÃ‹ø!ß Nã4.⪣ù’.<2E>²{¤}ݶ‘…!0ÆhCÅ&ìÃOñ6ÞÆû¤R!<21>¡¹´:(A§Ùé.Ùå˜e?Áo
0 “0a ¶ažÂóx¯á5¼…Ƈ”F:«dì3)[2ä9޵öcöAû„ý Hp ãF3ÐŽuØ­Ø<C2AD>Ý87ñ+¼<>Oqƒ\ä¡<C3A4>¤R7] <>X6+bìçÒ
)!”!wÊŽ'{_é½h/³Ÿ²ß¶ÿ òQˆ±q<18>ɘƒ:Dшf<(îÇp]èÁœÅy\À ôÒ½4†ÆÒZ@<40>ÐKtŠÞ¡Ïc¦²"VÄždûÙ~v½ÃÎJƒ¥<©P!-öJû¥Wå=ŽFÇ*Ç÷<>][zz{×ö>Ú{ÜÛOÛoŸ„ ^Š3<C5A0>†é˜<C3A9>9¨Ç<,Å#¢× ~—p‡p‡q=8†ãxgð[|†kø7(Mô!‡T*¥ñTN4…¦R<C2A6>¦S˜fS=Í¥ù¡8µÒÚHß¡Nê¤çèEz‰º©½Mgè<1C>£t…®ÐçÌÁ\,‡é¬€,ÌÂl>Ïâ¬<C3A2>ÖÆv°ìv<>u3KT!UIq).™ÒIé¬tNz_ú/y°Ü.Kþ‰üŽ|^¾(ÿ§|Íáq”:æ:æ9sœã<C593>k<EFBFBD>/;¹t½æ:<3A>$Îâpì¶ïå¬g{ÙØÈîÇ÷ð3€ýœMÃyl Cô2üø:1
£ðü ŒÀ¤#O Ã10†äÕïójê½yCrÊxÏÝîêŸíÉÊTúe¤§¹]N‡,1/¤WÅ4³ fÊú´i~®ëqÍ,ˆÍ¸fVÝîcj1á¦ÝîiÄ5sé_y)Oã'y´r”û}ZH×ÌwƒºfÑ9]3wõ¨f~"æ3Å|—˜+A=êõú}šÊij&Å´<C385>Yµ¶9Šý>ê1ø¯ƒß‡À@lbj|Csމ©Ü#dÖƒ!s<>œ”Š7š5s"¡`®×õûLšÚ /1¡O1³Šûóuš)å×Fô¨×ïkáõc[¿F½qe`IŒÏâDL)5YŒçÈ.6êAsà#å|¥þeÚþ5ÒdùUñ¦D•iĶMK©1®Å·OóûÂuÚ“mŠFLÚM!jOí¢IqK¬U3Óô)zs¢5×LÔFƒ<E28099>Á!=Œš¨‰$ƒ„â÷õälœèÍðûzü•þJ޽9SxùÛ)û/Of¿Sdø}áÚ[}!žIŸn1SkIt“å<E2809C>ã¢i ãr½|DÉï µ˜iSc Ï¿<>LG¾G×WaRLÿäÊíxŸÅ™ï¹
>åÇyëF˜ï›[æ [H«‰t}7j½ÉB0¯i<>/ò[(äס%hRÌo¡Èg¡p¸×oa¸O«2¥ü*~nZBKLoLhUZs¼Ñ”óÖFô¦D4 ™¨´h&ê#^ÓˆæÞš6E£üŠyYÄIDµ*­µ/B«ˆ<C2AB>ˆnø-ø|aÍ”
j"s"fG0×4Ñ\¯W ™'k"æÉ`®7õ[ðߪTÓBZrúj.ñYð÷[¤¢ÔEÌŽ\Óˆ&)M÷š'‰Üÿ¤tð×£Ï`A<04>òCªC÷ærƒîÕ½Ñ\o4è·Pê ×ýåx-ŒøŸ;<òë.óY):<êÿ¨Ã£¿I‡Ç|£<0E>½s‡Çù,Œåÿÿ×á ·w¸ØÂ°b#+íõ”UO“ÏÑþz2*º<42>š<EFBFBD>!A×<41> nÚå¢]Nú´r6ãÏãÿÁ$N2º¹È$&#¼ÁÜ<C381>p<EFBFBD>27ö3þæ³ÇðãèÆNìd Ì<><C38C>Ì V0`cXÁXÁÜ<C381>±˜1Ô0 EÄÙŒ<C399>g<EFBFBD>-´RÆ0™É(Zàf¶šÊÜIrGé#šIµ‡³Ô7WeªÇ)L3±*<2A>Hnž­ž W <41>B>adjÊ{šr^SvjÊcšr¶¡
-’ŒÌåW5ÊÔer<65>2¡F9FQ…$c@¡òz¡b*?.T-TÖ*þBå
ýXÈïZµòyµò³je_µ²©Zy¤ZYZ­x«•%C”¡C”Ü!ŠE<1B>díÎÚ•…46vïRvïR,ºzhD@­´èO‡ËÔbßÕ¢­ÉzŸjÑ·“õÔÊ»éqÉ•:PÄ8>Š ÀõT*p
þo<EFBFBD>"Õ¢5ÉŠçUV%+.ªÇéA”²5YvQµh\²~Z™Fe}1G"èæèOVìQ-žô½«VfÓ0”P>TŠ2Aë(î÷õ¡3Y_ Zäè®÷©vE”T{·XŒŽ¨×µêµK¦¤zµÄrSRýmÅ 0ª¿,Rÿ­¢Z=U_ ¾UQ}#°\=ê þ6xœGÇ«TJÏê<>{Ô—Vú…2oo½€§Š,™Ž¨[ë Ô5%ÍKª«Ëx† õÁÀrµÕVJ,zÆÈRK|cÕºÀ1uN`µ:;•izPÀ´ÀQ±<51>?JežZÈS'U¼«N êx¾<©ŽJ%Y"¶7¢b†Z\bÉòuxýõ¾2áWç.s-vÍu<C38D>u<EFBFBD>v•º
\ù®{]y®îþn<C3BE>;ÓÝÏ<C39D>îv»<76>nÙÍÜp°ìŒbþgs€ÓÃÁ)s)¹‡qÉRÿE¹ªÁ¿MÚqÏÚÉ9“ûWd<57>¯
ÞAÄúdñ<EFBFBD>Fž¹7\1ÿ./jŽä;/6GóúºL…‚=t‰C4ÒC^ºªvo0Í 3j"]
µXt9Ô7 N^¢K!Óˆ£Ñ°9OÄA]
{PÏ!éacPÄã ˆ<C2A0>n[SnºÌÝ‚¸ÛE„[€]nïr·®-E¡`WQpq”`pÙâ(á.£T奄‚]<5D>€ðJ7©TÔ]šnŠ@y"PYY(ØUQÆ]ºF…j#]e#øŠö¥èÚ]+è…_Ñ%)ú…ýB0½c<C2BD>ÿ£iÊ7ó;´ðÙÇ;ù“WL5ÅôPÌܶöæÃeÇMëzüÙ¾G²Ø†fŽñ&óY½)h>®µ®…<C2AE>w ;9½Pv¡3Téê4šÉ…ÆBñÀvhóŽU¡Ûrm½•kÕŽ;ÛÁƒ­â¹6‡î@‡8½™ç
ñ\!žk³±Yäâ{ µÔMYs‡ÑþðÃÖ¬Y„ÿ¨Ûý
endstream
endobj
66 0 obj
<</Type /FontDescriptor
/FontName /AAAAAA+Times-Roman
/Flags 6
/Ascent 750
/Descent 250
/StemV 108.886719
/CapHeight 661.62109
/ItalicAngle 0
/FontBBox [-203.125 -428.22266 1700.1953 1271.48438]
/FontFile2 65 0 R>>
endobj
67 0 obj
<</Type /Font
/FontDescriptor 66 0 R
/BaseFont /AAAAAA+Times-Roman
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [0 [722.16797]]
/DW 250>>
endobj
68 0 obj
<</Filter /FlateDecode
/Length 228>> stream
xœ]<5D>MjÄ0 …÷>…3Ážtk %CÀþPwàØJjhdã8Ü¾Ø SèBIÇ{}Ó
ð÷<1C>ÁS Ÿq<C5B8>[v<>ص\9¦ÖÝbã½¾™}-¸hš"“€àÖw8=û8â™ñ·ì1šátïÍ™q³¥ô<C2A5> RÁ”<02>ãýM¯vAà »h<C2BB>TBÙ/÷Þü)>÷„еùúëÆE<C386>³¥Br†A1$ÿï~Pãä¾lnê'RˆN4õ±¯\ýïaÊm9#•B3R-ÂGN)¦JÕú@co9
endstream
endobj
7 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /AAAAAA+Times-Roman
/Encoding /Identity-H
/DescendantFonts [67 0 R]
/ToUnicode 68 0 R>>
endobj
xref
0 69
0000000000 65535 f
0000000015 00000 n
0000012891 00000 n
0000000321 00000 n
0000030905 00000 n
0000000358 00000 n
0000040311 00000 n
0000044585 00000 n
0000000434 00000 n
0000000593 00000 n
0000000784 00000 n
0000000977 00000 n
0000001163 00000 n
0000001355 00000 n
0000001544 00000 n
0000001709 00000 n
0000001893 00000 n
0000002081 00000 n
0000002269 00000 n
0000002459 00000 n
0000002650 00000 n
0000002838 00000 n
0000003027 00000 n
0000003218 00000 n
0000003410 00000 n
0000003598 00000 n
0000003789 00000 n
0000003983 00000 n
0000004174 00000 n
0000004363 00000 n
0000004554 00000 n
0000004748 00000 n
0000004936 00000 n
0000005124 00000 n
0000005320 00000 n
0000005512 00000 n
0000005708 00000 n
0000005892 00000 n
0000006073 00000 n
0000006253 00000 n
0000006433 00000 n
0000006624 00000 n
0000006814 00000 n
0000007008 00000 n
0000007203 00000 n
0000007395 00000 n
0000007584 00000 n
0000007777 00000 n
0000007966 00000 n
0000008152 00000 n
0000008342 00000 n
0000008509 00000 n
0000008677 00000 n
0000008844 00000 n
0000009010 00000 n
0000013479 00000 n
0000013535 00000 n
0000013654 00000 n
0000029698 00000 n
0000029929 00000 n
0000030543 00000 n
0000031048 00000 n
0000039479 00000 n
0000039715 00000 n
0000039986 00000 n
0000040450 00000 n
0000043825 00000 n
0000044056 00000 n
0000044286 00000 n
trailer
<</Size 69
/Root 56 0 R
/Info 1 0 R>>
startxref
44728
%%EOF

Binary file not shown.

Binary file not shown.

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Business Development Resume: Revenue growth, client relations, and entrepreneurship experience.">
<title>Business Development - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - DevSecOps Resume: Infrastructure, security automation, and compliance expertise.">
<title>DevSecOps - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="DevSecOps consultant and cybersecurity expert. Led teams of 45+, built open-source tools with 10M+ downloads, and architected resilient infrastructure for government and healthcare clients.">
<title>Full Portfolio - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Team Leadership Resume: Management, mentorship, and distributed team coordination experience.">
<title>Team Leadership - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Tool Building Resume: Open source development, CI/CD, and custom software solutions.">
<title>Tool Building - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Architected geographically redundant DNS infrastructure for Flint Bishop International Airport, achieving A+ resilience standards for critical aviation infrastructure.">
<title>Airport DNS Infrastructure - Resilient DNS Design</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed ad revenue tracking application for content creators with real-time analytics, secure API integrations, and data-driven content optimization tools.">
<title>Ad Revenue Tracking App for Influencers</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Revitalized struggling business into profitable operation in two weeks, developing revolutionary open-source tooling that powered major Minecraft projects.">
<title>Athion.net Business Turnaround - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Co-created FastAsyncWorldEdit and PlotSquared, scaling Minecraft world editing from 50K server-crashing edits to billions seamlessly, powering a $2B game brand.">
<title>FastAsyncWorldEdit & PlotSquared - Minecraft Tools</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Designed secure, scalable infrastructure for Improving MI Practices healthcare education platform with CIS Level 1-2 security standards and high availability.">
<title>Healthcare Platform Infrastructure - Secure Design</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built self-hosted infrastructure cluster with 100+ services for data sovereignty and developed WireGuard mesh networking tool for quantum-resistant networking.">
<title>Home Infrastructure & WireGuard Mesh Networking</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Explore detailed case studies and project stories from Colin Knapp's portfolio: cybersecurity, infrastructure, open source development, and team leadership.">
<title>Project Stories & Case Studies - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
</head>
<body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Co-founded sustainable electronics repair company reducing e-waste through circuit board repairs and promoting environmental responsibility in tech industry.">
<title>MotherboardRepair.ca - Sustainable Tech Solutions</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Led distributed team of 45 contractors at Nitric Concepts, bootstrapping company to $4M revenue while implementing DevSecOps practices across timezones.">
<title>Nitric Concepts Leadership - Team Management</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Architected georedundant, nuclear war-resistant DNS cluster for government clients, ensuring extreme resilience and A+ security standards for critical infrastructure.">
<title>Nuclear War-Resistant DNS Infrastructure</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>
<body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Transformed OhMyForm from abandoned project to thriving community with 32K+ Discord members, 10M+ Docker pulls, and sustainable funding model.">
<title>Open Source Community Success - OhMyForm</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built high-performance ScanSnap scanner service processing ~1 receipt/second with batch capacity up to 50 documents, featuring automatic cleanup and WebDAV access.">
<title>ScanSnap Scanner Service - Receipt Digitization</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Revitalized ShowerLoop website with WCAG 2.0 AA compliance, modern responsive design, and improved accessibility for innovative eco-friendly recirculating shower system.">
<title>ShowerLoop Project - Web Development & Accessibility</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Story Example">
<title>Story Example - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>
<body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - [Story Title] Case Study">
<title>[Story Title] - Colin Knapp Case Study</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built AI-powered cybersecurity consultancy ViperWire, delivering enterprise-grade security to SMBs with automated threat detection, reducing incident response time to 15 minutes.">
<title>ViperWire - AI-Powered Cybersecurity Consultancy</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed web solutions and Java plugins with Jenkins/GitLab CI/CD, WCAG 2.0 AA compliance, and comprehensive documentation for diverse client environments.">
<title>Web Design & Java Plugin Development</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Created Docker-based automated WordPress malware removal tool that eliminated persistent attacks, reducing infection frequency from daily to zero for MLPP.">
<title>WordPress Security Automation - Malware Removal</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed custom Minecraft games for YouTube creators with 15M+ subscriber reach, implementing DDoS defense, anti-phishing protocols, and data privacy measures.">
<title>YouTube Game Development & Cybersecurity</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
</head>
<body>

View File

@ -376,11 +376,6 @@ html[data-theme='dark'] .main-nav a.active {
color: #dc3545 !important; /* Red for unwritten stories */
}
/* Bold story links that are written */
.main-nav .dropdown-content a:has(.nav-status.written) {
font-weight: 700;
}
/* Dark theme support for status indicators */
@media (prefers-color-scheme: dark) {
.main-nav .dropdown-content a .nav-status.written {

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Template with Includes">
<title>Template with Includes - Colin Knapp</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script>
</head>
<body>
<!-- Header Include -->

View File

@ -1,106 +0,0 @@
#!/bin/bash
# Pre-push hook to generate PDFs before pushing
# This ensures PDFs are always up to date when code is pushed
# Don't exit on error immediately - we want to report issues but not break the push
set +e
REPO_ROOT="$(git rev-parse --show-toplevel)"
DOCKER_DIR="$REPO_ROOT/docker"
PDFS_DIR="$REPO_ROOT/docker/resume/pdfs"
GENERATE_PDFS_SCRIPT="$DOCKER_DIR/generate-pdfs.js"
# Check if we're in a git repository
if [ -z "$REPO_ROOT" ]; then
echo "Warning: Not in a git repository, skipping PDF generation"
exit 0
fi
# Check if docker directory exists
if [ ! -d "$DOCKER_DIR" ]; then
echo "Warning: docker directory not found, skipping PDF generation"
exit 0
fi
# Check if generate-pdfs.js exists
if [ ! -f "$GENERATE_PDFS_SCRIPT" ]; then
echo "Warning: generate-pdfs.js not found, skipping PDF generation"
exit 0
fi
# Check if PDFs already exist and are up to date
if [ -d "$PDFS_DIR" ]; then
PDF_COUNT=$(find "$PDFS_DIR" -name "*.pdf" -type f 2>/dev/null | wc -l | tr -d ' ')
if [ "$PDF_COUNT" -gt 0 ]; then
echo "PDFs already exist ($PDF_COUNT files), skipping generation"
echo "To regenerate PDFs, run: cd docker && PUPPETEER_EXECUTABLE_PATH=\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\" npm run generate-pdfs"
exit 0
fi
fi
echo "Running pre-push hook: Generating PDFs..."
# Navigate to docker directory
cd "$DOCKER_DIR" || {
echo "Error: Could not navigate to docker directory"
exit 1
}
# Check if node_modules exists, install if not
if [ ! -d "node_modules" ]; then
echo "Installing npm dependencies..."
if ! PUPPETEER_SKIP_DOWNLOAD=true npm install; then
echo "Error: Failed to install npm dependencies"
exit 1
fi
fi
# Check if npm is available
if ! command -v npm &> /dev/null; then
echo "Error: npm is not installed or not in PATH"
exit 1
fi
# Try to find Chrome executable
CHROME_PATH=""
if [ -f "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ]; then
CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
elif command -v google-chrome &> /dev/null; then
CHROME_PATH=$(which google-chrome)
elif command -v chromium &> /dev/null; then
CHROME_PATH=$(which chromium)
fi
if [ -z "$CHROME_PATH" ]; then
echo "Warning: Chrome not found, skipping PDF generation"
echo "PDFs will be generated during Docker build instead"
exit 0
fi
# Generate PDFs
echo "Generating PDFs using Chrome at: $CHROME_PATH"
if PUPPETEER_EXECUTABLE_PATH="$CHROME_PATH" npm run generate-pdfs; then
echo "✓ PDFs generated successfully"
# Stage the PDFs directory if it exists and has changes
cd "$REPO_ROOT" || exit 1
if [ -d "$PDFS_DIR" ]; then
# Check if there are any PDF files
PDF_COUNT=$(find "$PDFS_DIR" -name "*.pdf" -type f 2>/dev/null | wc -l | tr -d ' ')
if [ "$PDF_COUNT" -gt 0 ]; then
# Add all PDFs to staging
git add "$PDFS_DIR" 2>/dev/null
# Check if there are changes staged
if ! git diff --cached --quiet --exit-code "$PDFS_DIR" 2>/dev/null; then
echo "✓ PDFs updated and staged for commit"
fi
fi
fi
else
echo "Warning: PDF generation failed, continuing with push"
echo "PDFs will be generated during Docker build instead"
fi
exit 0

View File

@ -1,45 +0,0 @@
#!/bin/bash
# Setup script to install git hooks
# Run this after cloning the repository
set -e
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
GIT_HOOKS_DIR="$SCRIPT_DIR/.git/hooks"
SOURCE_HOOKS_DIR="$SCRIPT_DIR/git-hooks"
# Check if we're in a git repository
if [ ! -d "$SCRIPT_DIR/.git" ]; then
echo "Error: Not in a git repository. Please run this from the repository root."
exit 1
fi
echo "Setting up git hooks..."
# Create .git/hooks directory if it doesn't exist
mkdir -p "$GIT_HOOKS_DIR"
# Copy pre-push hook
if [ -f "$SOURCE_HOOKS_DIR/pre-push" ]; then
cp "$SOURCE_HOOKS_DIR/pre-push" "$GIT_HOOKS_DIR/pre-push"
chmod +x "$GIT_HOOKS_DIR/pre-push"
echo "✓ Installed pre-push hook"
else
echo "✗ pre-push hook not found in git-hooks/"
exit 1
fi
# Verify installation
if [ -x "$GIT_HOOKS_DIR/pre-push" ]; then
echo "✓ Hook is executable and ready"
else
echo "✗ Hook installation verification failed"
exit 1
fi
echo ""
echo "Git hooks installed successfully!"
echo "PDFs will be automatically generated before each push."
echo ""
echo "To test the hook, try: git push --dry-run"