From 4a18f3907d0965a0fd71a9352be01a0bc6b0bc35 Mon Sep 17 00:00:00 2001 From: Fernando Rych Date: Sat, 21 Feb 2026 09:58:57 -0300 Subject: [PATCH 1/9] new skill 'nerdzao-elite' to simplify code generation planning, quality, testing and validating with multiple skills by just invoking one single skill (this one) --- skills/nerdzao-elite/SKILL.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 skills/nerdzao-elite/SKILL.md diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md new file mode 100644 index 00000000..c055b8a2 --- /dev/null +++ b/skills/nerdzao-elite/SKILL.md @@ -0,0 +1,20 @@ +# @nerdzao-elite + +Você é um Engenheiro de Software Sênior Elite (15+ anos) + Designer de Produto Senior. + +Ative automaticamente TODAS as skills abaixo em toda tarefa: + +@concise-planning @brainstorming @senior-architect @architecture @test-driven-development @testing-patterns @refactor-clean-code @clean-code @lint-and-validate @ui-visual-validator @ui-ux-pro-max @frontend-design @web-design-guidelines @production-code-audit @code-reviewer @systematic-debugging @error-handling-patterns @kaizen @verification-before-completion + +Workflow obrigatório (sempre na ordem): + +1. Planejamento (@concise-planning + @brainstorming) +2. Arquitetura sólida +3. Implementação com TDD completo +4. Código limpo +5. Validação técnica +6. Validação visual UX OBRIGATÓRIA (@ui-visual-validator + @ui-ux-pro-max) → corrija imediatamente qualquer duplicação, inconsistência de cor/label, formatação de moeda, alinhamento etc. +7. Revisão de produção +8. Verificação final + +Nunca entregue UI quebrada. Priorize sempre pixel-perfect + produção-grade. From bbd6c51d0c7b7bf569d552c353ed2d9838a08b42 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:23:03 -0500 Subject: [PATCH 2/9] Add AWS Security & Compliance skills - aws-security-audit: Comprehensive security posture assessment - aws-iam-best-practices: IAM policy review and hardening - aws-secrets-rotation: Automated secrets rotation workflows - aws-compliance-checker: CIS, PCI-DSS, HIPAA compliance checks Features: - AWS CLI commands for security audits - Python scripts for compliance checking - Lambda functions for automation - Bash scripts for monitoring - Kiro CLI integration examples --- .../security/aws-compliance-checker/SKILL.md | 516 ++++++++++++++++++ .../security/aws-iam-best-practices/SKILL.md | 397 ++++++++++++++ skills/security/aws-secrets-rotation/SKILL.md | 465 ++++++++++++++++ skills/security/aws-security-audit/SKILL.md | 369 +++++++++++++ 4 files changed, 1747 insertions(+) create mode 100644 skills/security/aws-compliance-checker/SKILL.md create mode 100644 skills/security/aws-iam-best-practices/SKILL.md create mode 100644 skills/security/aws-secrets-rotation/SKILL.md create mode 100644 skills/security/aws-security-audit/SKILL.md diff --git a/skills/security/aws-compliance-checker/SKILL.md b/skills/security/aws-compliance-checker/SKILL.md new file mode 100644 index 00000000..b15bea11 --- /dev/null +++ b/skills/security/aws-compliance-checker/SKILL.md @@ -0,0 +1,516 @@ +--- +name: aws-compliance-checker +description: Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks +risk: safe +source: community +category: security +tags: [aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli] +--- + +# AWS Compliance Checker + +Automated compliance validation against industry standards including CIS AWS Foundations, PCI-DSS, HIPAA, and SOC 2. + +## When to Use + +Use this skill when you need to validate AWS compliance against industry standards, prepare for audits, or maintain continuous compliance monitoring. + +## Supported Frameworks + +**CIS AWS Foundations Benchmark** +- Identity and Access Management +- Logging and Monitoring +- Networking +- Data Protection + +**PCI-DSS (Payment Card Industry)** +- Network security +- Access controls +- Encryption +- Monitoring and logging + +**HIPAA (Healthcare)** +- Access controls +- Audit controls +- Data encryption +- Transmission security + +**SOC 2** +- Security +- Availability +- Confidentiality +- Privacy + +## CIS AWS Foundations Checks + +### Identity & Access Management (1.x) + +```bash +#!/bin/bash +# cis-iam-checks.sh + +echo "=== CIS IAM Compliance Checks ===" + +# 1.1: Root account usage +echo "1.1: Checking root account usage..." +root_usage=$(aws iam get-credential-report --output text | \ + awk -F, 'NR==2 {print $5,$11}') +echo " Root password last used: $root_usage" + +# 1.2: MFA on root account +echo "1.2: Checking root MFA..." +root_mfa=$(aws iam get-account-summary \ + --query 'SummaryMap.AccountMFAEnabled' --output text) +echo " Root MFA enabled: $root_mfa" + +# 1.3: Unused credentials +echo "1.3: Checking for unused credentials (>90 days)..." +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 { + if ($5 != "N/A" && $5 != "no_information") { + cmd = "date -d \"" $5 "\" +%s" + cmd | getline last_used + close(cmd) + now = systime() + days = (now - last_used) / 86400 + if (days > 90) print " ⚠️ " $1 ": " int(days) " days inactive" + } + }' + +# 1.4: Access keys rotated +echo "1.4: Checking access key age..." +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' \ + --output text | \ + while read key_id create_date; do + age_days=$(( ($(date +%s) - $(date -d "$create_date" +%s)) / 86400 )) + if [ $age_days -gt 90 ]; then + echo " ⚠️ $user: Key $key_id is $age_days days old" + fi + done +done + +# 1.5-1.11: Password policy +echo "1.5-1.11: Checking password policy..." +policy=$(aws iam get-account-password-policy 2>&1) +if echo "$policy" | grep -q "NoSuchEntity"; then + echo " ❌ No password policy configured" +else + echo " ✓ Password policy exists" + echo "$policy" | jq '.PasswordPolicy | { + MinimumPasswordLength, + RequireSymbols, + RequireNumbers, + RequireUppercaseCharacters, + RequireLowercaseCharacters, + MaxPasswordAge, + PasswordReusePrevention + }' +fi + +# 1.12-1.14: MFA for IAM users +echo "1.12-1.14: Checking IAM user MFA..." +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print " ⚠️ " $1 ": No MFA"}' +``` + +### Logging (2.x) + +```bash +#!/bin/bash +# cis-logging-checks.sh + +echo "=== CIS Logging Compliance Checks ===" + +# 2.1: CloudTrail enabled +echo "2.1: Checking CloudTrail..." +trails=$(aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsMultiRegionTrail,LogFileValidationEnabled]' \ + --output text) + +if [ -z "$trails" ]; then + echo " ❌ No CloudTrail configured" +else + echo "$trails" | while read name multi_region validation; do + echo " Trail: $name" + echo " Multi-region: $multi_region" + echo " Log validation: $validation" + + # Check if logging + status=$(aws cloudtrail get-trail-status --name "$name" \ + --query 'IsLogging' --output text) + echo " Is logging: $status" + done +fi + +# 2.2: CloudTrail log file validation +echo "2.2: Checking log file validation..." +aws cloudtrail describe-trails \ + --query 'trailList[?LogFileValidationEnabled==`false`].Name' \ + --output text | \ +while read trail; do + echo " ⚠️ $trail: Log validation disabled" +done + +# 2.3: S3 bucket for CloudTrail +echo "2.3: Checking CloudTrail S3 bucket access..." +aws cloudtrail describe-trails \ + --query 'trailList[*].S3BucketName' --output text | \ +while read bucket; do + public=$(aws s3api get-bucket-acl --bucket "$bucket" 2>&1 | \ + grep -c "AllUsers") + if [ "$public" -gt 0 ]; then + echo " ❌ $bucket: Publicly accessible" + else + echo " ✓ $bucket: Not public" + fi +done + +# 2.4: CloudTrail integrated with CloudWatch Logs +echo "2.4: Checking CloudWatch Logs integration..." +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,CloudWatchLogsLogGroupArn]' \ + --output text | \ +while read name log_group; do + if [ "$log_group" = "None" ]; then + echo " ⚠️ $name: Not integrated with CloudWatch Logs" + else + echo " ✓ $name: Integrated with CloudWatch" + fi +done + +# 2.5: AWS Config enabled +echo "2.5: Checking AWS Config..." +recorders=$(aws configservice describe-configuration-recorders \ + --query 'ConfigurationRecorders[*].name' --output text) + +if [ -z "$recorders" ]; then + echo " ❌ AWS Config not enabled" +else + echo " ✓ AWS Config enabled: $recorders" +fi + +# 2.6: S3 bucket logging +echo "2.6: Checking S3 bucket logging..." +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + logging=$(aws s3api get-bucket-logging --bucket "$bucket" 2>&1) + if ! echo "$logging" | grep -q "LoggingEnabled"; then + echo " ⚠️ $bucket: Access logging disabled" + fi +done + +# 2.7: VPC Flow Logs +echo "2.7: Checking VPC Flow Logs..." +aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --output text | \ +while read vpc; do + flow_logs=$(aws ec2 describe-flow-logs \ + --filter "Name=resource-id,Values=$vpc" \ + --query 'FlowLogs[*].FlowLogId' --output text) + if [ -z "$flow_logs" ]; then + echo " ⚠️ $vpc: No flow logs enabled" + else + echo " ✓ $vpc: Flow logs enabled" + fi +done +``` + +### Monitoring (3.x) + +```bash +#!/bin/bash +# cis-monitoring-checks.sh + +echo "=== CIS Monitoring Compliance Checks ===" + +# Check for required CloudWatch metric filters and alarms +required_filters=( + "unauthorized-api-calls" + "no-mfa-console-signin" + "root-usage" + "iam-changes" + "cloudtrail-changes" + "console-signin-failures" + "cmk-changes" + "s3-bucket-policy-changes" + "aws-config-changes" + "security-group-changes" + "nacl-changes" + "network-gateway-changes" + "route-table-changes" + "vpc-changes" +) + +log_group=$(aws cloudtrail describe-trails \ + --query 'trailList[0].CloudWatchLogsLogGroupArn' \ + --output text | cut -d: -f7) + +if [ -z "$log_group" ] || [ "$log_group" = "None" ]; then + echo " ❌ CloudTrail not integrated with CloudWatch Logs" +else + echo "Checking metric filters for log group: $log_group" + + existing_filters=$(aws logs describe-metric-filters \ + --log-group-name "$log_group" \ + --query 'metricFilters[*].filterName' --output text) + + for filter in "${required_filters[@]}"; do + if echo "$existing_filters" | grep -q "$filter"; then + echo " ✓ $filter: Configured" + else + echo " ⚠️ $filter: Missing" + fi + done +fi +``` + +### Networking (4.x) + +```bash +#!/bin/bash +# cis-networking-checks.sh + +echo "=== CIS Networking Compliance Checks ===" + +# 4.1: No security groups allow 0.0.0.0/0 ingress to port 22 +echo "4.1: Checking SSH access (port 22)..." +aws ec2 describe-security-groups \ + --query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]' \ + --output json | \ +jq -r '.[] | select(.[2][]? | + select(.FromPort == 22 and .IpRanges[]?.CidrIp == "0.0.0.0/0")) | + " ⚠️ \(.[0]): \(.[1]) allows SSH from 0.0.0.0/0"' + +# 4.2: No security groups allow 0.0.0.0/0 ingress to port 3389 +echo "4.2: Checking RDP access (port 3389)..." +aws ec2 describe-security-groups \ + --query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]' \ + --output json | \ +jq -r '.[] | select(.[2][]? | + select(.FromPort == 3389 and .IpRanges[]?.CidrIp == "0.0.0.0/0")) | + " ⚠️ \(.[0]): \(.[1]) allows RDP from 0.0.0.0/0"' + +# 4.3: Default security group restricts all traffic +echo "4.3: Checking default security groups..." +aws ec2 describe-security-groups \ + --filters Name=group-name,Values=default \ + --query 'SecurityGroups[*].[GroupId,IpPermissions,IpPermissionsEgress]' \ + --output json | \ +jq -r '.[] | select((.[1] | length) > 0 or (.[2] | length) > 1) | + " ⚠️ \(.[0]): Default SG has rules"' +``` + +## PCI-DSS Compliance Checks + +```python +#!/usr/bin/env python3 +# pci-dss-checker.py + +import boto3 + +def check_pci_compliance(): + """Check PCI-DSS requirements""" + + ec2 = boto3.client('ec2') + rds = boto3.client('rds') + s3 = boto3.client('s3') + + issues = [] + + # Requirement 1: Network security + sgs = ec2.describe_security_groups() + for sg in sgs['SecurityGroups']: + for perm in sg.get('IpPermissions', []): + for ip_range in perm.get('IpRanges', []): + if ip_range.get('CidrIp') == '0.0.0.0/0': + issues.append(f"PCI 1.2: {sg['GroupId']} open to internet") + + # Requirement 2: Secure configurations + # Check for default passwords, etc. + + # Requirement 3: Protect cardholder data + volumes = ec2.describe_volumes() + for vol in volumes['Volumes']: + if not vol['Encrypted']: + issues.append(f"PCI 3.4: Volume {vol['VolumeId']} not encrypted") + + # Requirement 4: Encrypt transmission + # Check for SSL/TLS on load balancers + + # Requirement 8: Access controls + iam = boto3.client('iam') + users = iam.list_users() + for user in users['Users']: + mfa = iam.list_mfa_devices(UserName=user['UserName']) + if not mfa['MFADevices']: + issues.append(f"PCI 8.3: {user['UserName']} no MFA") + + # Requirement 10: Logging + cloudtrail = boto3.client('cloudtrail') + trails = cloudtrail.describe_trails() + if not trails['trailList']: + issues.append("PCI 10.1: No CloudTrail enabled") + + return issues + +if __name__ == "__main__": + print("PCI-DSS Compliance Check") + print("=" * 50) + + issues = check_pci_compliance() + + if not issues: + print("✓ No PCI-DSS issues found") + else: + print(f"Found {len(issues)} issues:\n") + for issue in issues: + print(f" ⚠️ {issue}") +``` + +## HIPAA Compliance Checks + +```bash +#!/bin/bash +# hipaa-checker.sh + +echo "=== HIPAA Compliance Checks ===" + +# Access Controls (164.308(a)(3)) +echo "Access Controls:" +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print " ⚠️ " $1 ": No MFA (164.312(a)(2)(i))"}' + +# Audit Controls (164.312(b)) +echo "" +echo "Audit Controls:" +trails=$(aws cloudtrail describe-trails --query 'trailList[*].Name' --output text) +if [ -z "$trails" ]; then + echo " ❌ No CloudTrail (164.312(b))" +else + echo " ✓ CloudTrail enabled" +fi + +# Encryption (164.312(a)(2)(iv)) +echo "" +echo "Encryption at Rest:" +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].VolumeId' \ + --output text | \ +while read vol; do + echo " ⚠️ $vol: Not encrypted (164.312(a)(2)(iv))" +done + +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].DBInstanceIdentifier' \ + --output text | \ +while read db; do + echo " ⚠️ $db: Not encrypted (164.312(a)(2)(iv))" +done + +# Transmission Security (164.312(e)(1)) +echo "" +echo "Transmission Security:" +echo " Check: All data in transit uses TLS 1.2+" +``` + +## Automated Compliance Reporting + +```python +#!/usr/bin/env python3 +# compliance-report.py + +import boto3 +import json +from datetime import datetime + +def generate_compliance_report(framework='cis'): + """Generate comprehensive compliance report""" + + report = { + 'framework': framework, + 'generated': datetime.now().isoformat(), + 'checks': [], + 'summary': { + 'total': 0, + 'passed': 0, + 'failed': 0, + 'score': 0 + } + } + + # Run all checks based on framework + if framework == 'cis': + checks = run_cis_checks() + elif framework == 'pci': + checks = run_pci_checks() + elif framework == 'hipaa': + checks = run_hipaa_checks() + + report['checks'] = checks + report['summary']['total'] = len(checks) + report['summary']['passed'] = sum(1 for c in checks if c['status'] == 'PASS') + report['summary']['failed'] = report['summary']['total'] - report['summary']['passed'] + report['summary']['score'] = (report['summary']['passed'] / report['summary']['total']) * 100 + + return report + +def run_cis_checks(): + # Implement CIS checks + return [] + +def run_pci_checks(): + # Implement PCI checks + return [] + +def run_hipaa_checks(): + # Implement HIPAA checks + return [] + +if __name__ == "__main__": + import sys + framework = sys.argv[1] if len(sys.argv) > 1 else 'cis' + + report = generate_compliance_report(framework) + + print(f"\n{framework.upper()} Compliance Report") + print("=" * 50) + print(f"Score: {report['summary']['score']:.1f}%") + print(f"Passed: {report['summary']['passed']}/{report['summary']['total']}") + print(f"Failed: {report['summary']['failed']}/{report['summary']['total']}") + + # Save to file + with open(f'compliance-{framework}-{datetime.now().strftime("%Y%m%d")}.json', 'w') as f: + json.dump(report, f, indent=2) +``` + +## Example Prompts + +- "Run CIS AWS Foundations compliance check" +- "Generate a PCI-DSS compliance report" +- "Check HIPAA compliance for my AWS account" +- "Audit against SOC 2 requirements" +- "Create a compliance dashboard" + +## Best Practices + +- Run compliance checks weekly +- Automate with Lambda/EventBridge +- Track compliance trends over time +- Document exceptions with justification +- Integrate with AWS Security Hub +- Use AWS Config Rules for continuous monitoring + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-compliance-checker to run CIS benchmark" +kiro-cli chat "Generate PCI-DSS report with aws-compliance-checker" +``` + +## Additional Resources + +- [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services) +- [AWS Security Hub](https://aws.amazon.com/security-hub/) +- [AWS Compliance Programs](https://aws.amazon.com/compliance/programs/) diff --git a/skills/security/aws-iam-best-practices/SKILL.md b/skills/security/aws-iam-best-practices/SKILL.md new file mode 100644 index 00000000..381c8fa0 --- /dev/null +++ b/skills/security/aws-iam-best-practices/SKILL.md @@ -0,0 +1,397 @@ +--- +name: aws-iam-best-practices +description: IAM policy review, hardening, and least privilege implementation +risk: safe +source: community +category: security +tags: [aws, iam, security, access-control, kiro-cli, least-privilege] +--- + +# AWS IAM Best Practices + +Review and harden IAM policies following AWS security best practices and least privilege principles. + +## When to Use + +Use this skill when you need to review IAM policies, implement least privilege access, or harden IAM security. + +## Core Principles + +**Least Privilege** +- Grant minimum permissions needed +- Use managed policies when possible +- Avoid wildcard (*) permissions +- Regular access reviews + +**Defense in Depth** +- Enable MFA for all users +- Use IAM roles instead of access keys +- Implement service control policies (SCPs) +- Enable CloudTrail for audit + +**Separation of Duties** +- Separate admin and user roles +- Use different roles for different environments +- Implement approval workflows +- Regular permission audits + +## IAM Security Checks + +### Find Overly Permissive Policies + +```bash +# List policies with full admin access +aws iam list-policies --scope Local \ + --query 'Policies[*].[PolicyName,Arn]' --output table | \ + grep -i admin + +# Find policies with wildcard actions +aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text | \ +while read arn; do + version=$(aws iam get-policy --policy-arn "$arn" \ + --query 'Policy.DefaultVersionId' --output text) + doc=$(aws iam get-policy-version --policy-arn "$arn" \ + --version-id "$version" --query 'PolicyVersion.Document') + if echo "$doc" | grep -q '"Action": "\*"'; then + echo "Wildcard action in: $arn" + fi +done + +# Find inline policies (should use managed policies) +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + policies=$(aws iam list-user-policies --user-name "$user" \ + --query 'PolicyNames' --output text) + if [ -n "$policies" ]; then + echo "Inline policies on user $user: $policies" + fi +done +``` + +### MFA Enforcement + +```bash +# List users without MFA +aws iam get-credential-report --output text | \ + awk -F, 'NR>1 && $4=="false" {print $1}' + +# Check if MFA is required in policies +aws iam list-policies --scope Local --query 'Policies[*].Arn' --output text | \ +while read arn; do + version=$(aws iam get-policy --policy-arn "$arn" \ + --query 'Policy.DefaultVersionId' --output text) + doc=$(aws iam get-policy-version --policy-arn "$arn" \ + --version-id "$version" --query 'PolicyVersion.Document') + if echo "$doc" | grep -q "aws:MultiFactorAuthPresent"; then + echo "MFA enforced in: $arn" + fi +done + +# Enable MFA for a user (returns QR code) +aws iam create-virtual-mfa-device \ + --virtual-mfa-device-name user-mfa \ + --outfile /tmp/qr.png \ + --bootstrap-method QRCodePNG +``` + +### Access Key Management + +```bash +# Find old access keys (>90 days) +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate,Status]' \ + --output text | \ + while read key_id create_date status; do + age_days=$(( ($(date +%s) - $(date -d "$create_date" +%s)) / 86400 )) + if [ $age_days -gt 90 ]; then + echo "$user: Key $key_id is $age_days days old" + fi + done +done + +# Rotate access key +OLD_KEY="AKIAIOSFODNN7EXAMPLE" +USER="myuser" + +# Create new key +NEW_KEY=$(aws iam create-access-key --user-name "$USER") +echo "New key created. Update applications, then run:" +echo "aws iam delete-access-key --user-name $USER --access-key-id $OLD_KEY" + +# Deactivate old key (test first) +aws iam update-access-key \ + --user-name "$USER" \ + --access-key-id "$OLD_KEY" \ + --status Inactive +``` + +### Role and Policy Analysis + +```bash +# List unused roles (no activity in 90 days) +aws iam list-roles --query 'Roles[*].[RoleName,RoleLastUsed.LastUsedDate]' \ + --output text | \ +while read role last_used; do + if [ "$last_used" = "None" ]; then + echo "Never used: $role" + fi +done + +# Find roles with trust relationships to external accounts +aws iam list-roles --query 'Roles[*].RoleName' --output text | \ +while read role; do + trust=$(aws iam get-role --role-name "$role" \ + --query 'Role.AssumeRolePolicyDocument') + if echo "$trust" | grep -q '"AWS":'; then + echo "External trust: $role" + fi +done + +# Analyze policy permissions +aws iam simulate-principal-policy \ + --policy-source-arn arn:aws:iam::123456789012:user/myuser \ + --action-names s3:GetObject s3:PutObject \ + --resource-arns arn:aws:s3:::mybucket/* +``` + +## IAM Policy Templates + +### Least Privilege S3 Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:PutObject" + ], + "Resource": "arn:aws:s3:::my-bucket/user-data/${aws:username}/*" + }, + { + "Effect": "Allow", + "Action": "s3:ListBucket", + "Resource": "arn:aws:s3:::my-bucket", + "Condition": { + "StringLike": { + "s3:prefix": "user-data/${aws:username}/*" + } + } + } + ] +} +``` + +### MFA-Required Policy + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Action": "*", + "Resource": "*", + "Condition": { + "BoolIfExists": { + "aws:MultiFactorAuthPresent": "false" + } + } + } + ] +} +``` + +### Time-Based Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "ec2:*", + "Resource": "*", + "Condition": { + "DateGreaterThan": { + "aws:CurrentTime": "2026-01-01T00:00:00Z" + }, + "DateLessThan": { + "aws:CurrentTime": "2026-12-31T23:59:59Z" + } + } + } + ] +} +``` + +### IP-Restricted Access + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Deny", + "Action": "*", + "Resource": "*", + "Condition": { + "NotIpAddress": { + "aws:SourceIp": [ + "203.0.113.0/24", + "198.51.100.0/24" + ] + } + } + } + ] +} +``` + +## IAM Hardening Checklist + +**User Management** +- [ ] Enable MFA for all users +- [ ] Remove unused IAM users +- [ ] Rotate access keys every 90 days +- [ ] Use IAM roles instead of long-term credentials +- [ ] Implement password policy (length, complexity, rotation) + +**Policy Management** +- [ ] Replace inline policies with managed policies +- [ ] Remove wildcard (*) permissions +- [ ] Implement least privilege +- [ ] Use policy conditions (MFA, IP, time) +- [ ] Regular policy reviews + +**Role Management** +- [ ] Use roles for EC2 instances +- [ ] Implement cross-account roles properly +- [ ] Review trust relationships +- [ ] Remove unused roles +- [ ] Use session tags for fine-grained access + +**Monitoring** +- [ ] Enable CloudTrail for IAM events +- [ ] Set up CloudWatch alarms for IAM changes +- [ ] Use AWS IAM Access Analyzer +- [ ] Regular access reviews +- [ ] Monitor for privilege escalation + +## Automated IAM Hardening + +```python +#!/usr/bin/env python3 +# iam-hardening.py + +import boto3 +from datetime import datetime, timedelta + +iam = boto3.client('iam') + +def enforce_mfa(): + """Identify users without MFA""" + users = iam.list_users()['Users'] + no_mfa = [] + + for user in users: + mfa_devices = iam.list_mfa_devices( + UserName=user['UserName'] + )['MFADevices'] + + if not mfa_devices: + no_mfa.append(user['UserName']) + + return no_mfa + +def rotate_old_keys(): + """Find access keys older than 90 days""" + users = iam.list_users()['Users'] + old_keys = [] + + for user in users: + keys = iam.list_access_keys( + UserName=user['UserName'] + )['AccessKeyMetadata'] + + for key in keys: + age = datetime.now(key['CreateDate'].tzinfo) - key['CreateDate'] + if age.days > 90: + old_keys.append({ + 'user': user['UserName'], + 'key_id': key['AccessKeyId'], + 'age_days': age.days + }) + + return old_keys + +def find_overpermissive_policies(): + """Find policies with wildcard actions""" + policies = iam.list_policies(Scope='Local')['Policies'] + overpermissive = [] + + for policy in policies: + version = iam.get_policy_version( + PolicyArn=policy['Arn'], + VersionId=policy['DefaultVersionId'] + ) + + doc = version['PolicyVersion']['Document'] + for statement in doc.get('Statement', []): + if statement.get('Action') == '*': + overpermissive.append(policy['PolicyName']) + break + + return overpermissive + +if __name__ == "__main__": + print("IAM Hardening Report") + print("=" * 50) + + print("\nUsers without MFA:") + for user in enforce_mfa(): + print(f" - {user}") + + print("\nOld access keys (>90 days):") + for key in rotate_old_keys(): + print(f" - {key['user']}: {key['age_days']} days") + + print("\nOverpermissive policies:") + for policy in find_overpermissive_policies(): + print(f" - {policy}") +``` + +## Example Prompts + +- "Review my IAM policies for security issues" +- "Find users without MFA enabled" +- "Create a least privilege policy for S3 access" +- "Identify overly permissive IAM roles" +- "Generate an IAM hardening report" + +## Best Practices + +- Use AWS managed policies when possible +- Implement policy versioning +- Test policies in non-production first +- Document policy purposes +- Regular access reviews (quarterly) +- Use IAM Access Analyzer +- Implement SCPs for organization-wide controls + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-iam-best-practices to review my IAM setup" +kiro-cli chat "Create a least privilege policy with aws-iam-best-practices" +``` + +## Additional Resources + +- [IAM Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) +- [IAM Policy Simulator](https://policysim.aws.amazon.com/) +- [IAM Access Analyzer](https://aws.amazon.com/iam/features/analyze-access/) diff --git a/skills/security/aws-secrets-rotation/SKILL.md b/skills/security/aws-secrets-rotation/SKILL.md new file mode 100644 index 00000000..663dfb73 --- /dev/null +++ b/skills/security/aws-secrets-rotation/SKILL.md @@ -0,0 +1,465 @@ +--- +name: aws-secrets-rotation +description: Automate AWS secrets rotation for RDS, API keys, and credentials +risk: safe +source: community +category: security +tags: [aws, secrets-manager, security, automation, kiro-cli, credentials] +--- + +# AWS Secrets Rotation + +Automate rotation of secrets, credentials, and API keys using AWS Secrets Manager and Lambda. + +## When to Use + +Use this skill when you need to implement automated secrets rotation, manage credentials securely, or comply with security policies requiring regular key rotation. + +## Supported Secret Types + +**AWS Services** +- RDS database credentials +- DocumentDB credentials +- Redshift credentials +- ElastiCache credentials + +**Third-Party Services** +- API keys +- OAuth tokens +- SSH keys +- Custom credentials + +## Secrets Manager Setup + +### Create a Secret + +```bash +# Create RDS secret +aws secretsmanager create-secret \ + --name prod/db/mysql \ + --description "Production MySQL credentials" \ + --secret-string '{ + "username": "admin", + "password": "CHANGE_ME", + "engine": "mysql", + "host": "mydb.cluster-abc.us-east-1.rds.amazonaws.com", + "port": 3306, + "dbname": "myapp" + }' + +# Create API key secret +aws secretsmanager create-secret \ + --name prod/api/stripe \ + --secret-string '{ + "api_key": "sk_live_xxxxx", + "webhook_secret": "whsec_xxxxx" + }' + +# Create secret from file +aws secretsmanager create-secret \ + --name prod/ssh/private-key \ + --secret-binary fileb://~/.ssh/id_rsa +``` + +### Retrieve Secrets + +```bash +# Get secret value +aws secretsmanager get-secret-value \ + --secret-id prod/db/mysql \ + --query 'SecretString' --output text + +# Get specific field +aws secretsmanager get-secret-value \ + --secret-id prod/db/mysql \ + --query 'SecretString' --output text | \ + jq -r '.password' + +# Get binary secret +aws secretsmanager get-secret-value \ + --secret-id prod/ssh/private-key \ + --query 'SecretBinary' --output text | \ + base64 -d > private-key.pem +``` + +## Automatic Rotation Setup + +### Enable RDS Rotation + +```bash +# Enable automatic rotation (30 days) +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql \ + --rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRDSMySQLRotation \ + --rotation-rules AutomaticallyAfterDays=30 + +# Rotate immediately +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql + +# Check rotation status +aws secretsmanager describe-secret \ + --secret-id prod/db/mysql \ + --query 'RotationEnabled' +``` + +### Lambda Rotation Function + +```python +# lambda_rotation.py +import boto3 +import json +import os + +secrets_client = boto3.client('secretsmanager') +rds_client = boto3.client('rds') + +def lambda_handler(event, context): + """Rotate RDS MySQL password""" + + secret_arn = event['SecretId'] + token = event['ClientRequestToken'] + step = event['Step'] + + # Get current secret + current = secrets_client.get_secret_value(SecretId=secret_arn) + secret = json.loads(current['SecretString']) + + if step == "createSecret": + # Generate new password + new_password = generate_password() + secret['password'] = new_password + + # Store as pending + secrets_client.put_secret_value( + SecretId=secret_arn, + ClientRequestToken=token, + SecretString=json.dumps(secret), + VersionStages=['AWSPENDING'] + ) + + elif step == "setSecret": + # Update RDS password + rds_client.modify_db_instance( + DBInstanceIdentifier=secret['dbInstanceIdentifier'], + MasterUserPassword=secret['password'], + ApplyImmediately=True + ) + + elif step == "testSecret": + # Test new credentials + import pymysql + conn = pymysql.connect( + host=secret['host'], + user=secret['username'], + password=secret['password'], + database=secret['dbname'] + ) + conn.close() + + elif step == "finishSecret": + # Mark as current + secrets_client.update_secret_version_stage( + SecretId=secret_arn, + VersionStage='AWSCURRENT', + MoveToVersionId=token, + RemoveFromVersionId=current['VersionId'] + ) + + return {'statusCode': 200} + +def generate_password(length=32): + import secrets + import string + alphabet = string.ascii_letters + string.digits + "!@#$%^&*()" + return ''.join(secrets.choice(alphabet) for _ in range(length)) +``` + +### Custom Rotation for API Keys + +```python +# api_key_rotation.py +import boto3 +import requests +import json + +secrets_client = boto3.client('secretsmanager') + +def rotate_stripe_key(secret_arn, token, step): + """Rotate Stripe API key""" + + current = secrets_client.get_secret_value(SecretId=secret_arn) + secret = json.loads(current['SecretString']) + + if step == "createSecret": + # Create new Stripe key via API + response = requests.post( + 'https://api.stripe.com/v1/api_keys', + auth=(secret['api_key'], ''), + data={'name': f'rotated-{token[:8]}'} + ) + new_key = response.json()['secret'] + + secret['api_key'] = new_key + secrets_client.put_secret_value( + SecretId=secret_arn, + ClientRequestToken=token, + SecretString=json.dumps(secret), + VersionStages=['AWSPENDING'] + ) + + elif step == "testSecret": + # Test new key + response = requests.get( + 'https://api.stripe.com/v1/balance', + auth=(secret['api_key'], '') + ) + if response.status_code != 200: + raise Exception("New key failed validation") + + elif step == "finishSecret": + # Revoke old key + old_key = json.loads(current['SecretString'])['api_key'] + requests.delete( + f'https://api.stripe.com/v1/api_keys/{old_key}', + auth=(secret['api_key'], '') + ) + + # Promote to current + secrets_client.update_secret_version_stage( + SecretId=secret_arn, + VersionStage='AWSCURRENT', + MoveToVersionId=token + ) +``` + +## Rotation Monitoring + +### CloudWatch Alarms + +```bash +# Create alarm for rotation failures +aws cloudwatch put-metric-alarm \ + --alarm-name secrets-rotation-failures \ + --alarm-description "Alert on secrets rotation failures" \ + --metric-name RotationFailed \ + --namespace AWS/SecretsManager \ + --statistic Sum \ + --period 300 \ + --evaluation-periods 1 \ + --threshold 1 \ + --comparison-operator GreaterThanThreshold \ + --alarm-actions arn:aws:sns:us-east-1:123456789012:alerts +``` + +### Rotation Audit Script + +```bash +#!/bin/bash +# audit-rotations.sh + +echo "Secrets Rotation Audit" +echo "=====================" + +aws secretsmanager list-secrets --query 'SecretList[*].[Name,RotationEnabled,LastRotatedDate]' \ + --output text | \ +while read name enabled last_rotated; do + echo "" + echo "Secret: $name" + echo " Rotation Enabled: $enabled" + echo " Last Rotated: $last_rotated" + + if [ "$enabled" = "True" ]; then + # Check rotation schedule + rules=$(aws secretsmanager describe-secret --secret-id "$name" \ + --query 'RotationRules.AutomaticallyAfterDays' --output text) + echo " Rotation Schedule: Every $rules days" + + # Calculate days since last rotation + if [ "$last_rotated" != "None" ]; then + days_ago=$(( ($(date +%s) - $(date -d "$last_rotated" +%s)) / 86400 )) + echo " Days Since Rotation: $days_ago" + + if [ $days_ago -gt $rules ]; then + echo " ⚠️ OVERDUE for rotation!" + fi + fi + fi +done +``` + +## Application Integration + +### Python SDK + +```python +import boto3 +import json + +def get_secret(secret_name): + """Retrieve secret from Secrets Manager""" + client = boto3.client('secretsmanager') + + try: + response = client.get_secret_value(SecretId=secret_name) + return json.loads(response['SecretString']) + except Exception as e: + print(f"Error retrieving secret: {e}") + raise + +# Usage +db_creds = get_secret('prod/db/mysql') +connection = pymysql.connect( + host=db_creds['host'], + user=db_creds['username'], + password=db_creds['password'], + database=db_creds['dbname'] +) +``` + +### Node.js SDK + +```javascript +const AWS = require('aws-sdk'); +const secretsManager = new AWS.SecretsManager(); + +async function getSecret(secretName) { + try { + const data = await secretsManager.getSecretValue({ + SecretId: secretName + }).promise(); + + return JSON.parse(data.SecretString); + } catch (err) { + console.error('Error retrieving secret:', err); + throw err; + } +} + +// Usage +const dbCreds = await getSecret('prod/db/mysql'); +const connection = mysql.createConnection({ + host: dbCreds.host, + user: dbCreds.username, + password: dbCreds.password, + database: dbCreds.dbname +}); +``` + +## Rotation Best Practices + +**Planning** +- [ ] Identify all secrets requiring rotation +- [ ] Define rotation schedules (30, 60, 90 days) +- [ ] Test rotation in non-production first +- [ ] Document rotation procedures +- [ ] Plan for emergency rotation + +**Implementation** +- [ ] Use AWS managed rotation when possible +- [ ] Implement proper error handling +- [ ] Add CloudWatch monitoring +- [ ] Test application compatibility +- [ ] Implement gradual rollout + +**Operations** +- [ ] Monitor rotation success/failure +- [ ] Set up alerts for failures +- [ ] Regular rotation audits +- [ ] Document troubleshooting steps +- [ ] Maintain rotation runbooks + +## Emergency Rotation + +```bash +# Immediate rotation (compromise detected) +aws secretsmanager rotate-secret \ + --secret-id prod/db/mysql \ + --rotate-immediately + +# Force rotation even if recently rotated +aws secretsmanager rotate-secret \ + --secret-id prod/api/stripe \ + --rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:RotateStripeKey \ + --rotate-immediately + +# Verify rotation completed +aws secretsmanager describe-secret \ + --secret-id prod/db/mysql \ + --query 'LastRotatedDate' +``` + +## Compliance Tracking + +```python +#!/usr/bin/env python3 +# compliance-report.py + +import boto3 +from datetime import datetime, timedelta + +client = boto3.client('secretsmanager') + +def generate_compliance_report(): + secrets = client.list_secrets()['SecretList'] + + compliant = [] + non_compliant = [] + + for secret in secrets: + name = secret['Name'] + rotation_enabled = secret.get('RotationEnabled', False) + last_rotated = secret.get('LastRotatedDate') + + if not rotation_enabled: + non_compliant.append({ + 'name': name, + 'issue': 'Rotation not enabled' + }) + continue + + if last_rotated: + days_ago = (datetime.now(last_rotated.tzinfo) - last_rotated).days + if days_ago > 90: + non_compliant.append({ + 'name': name, + 'issue': f'Not rotated in {days_ago} days' + }) + else: + compliant.append(name) + else: + non_compliant.append({ + 'name': name, + 'issue': 'Never rotated' + }) + + print(f"Compliant Secrets: {len(compliant)}") + print(f"Non-Compliant Secrets: {len(non_compliant)}") + print("\nNon-Compliant Details:") + for item in non_compliant: + print(f" - {item['name']}: {item['issue']}") + +if __name__ == "__main__": + generate_compliance_report() +``` + +## Example Prompts + +- "Set up automatic rotation for my RDS credentials" +- "Create a Lambda function to rotate API keys" +- "Audit all secrets for rotation compliance" +- "Implement emergency rotation for compromised credentials" +- "Generate a secrets rotation report" + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-secrets-rotation to set up RDS credential rotation" +kiro-cli chat "Create a rotation audit report with aws-secrets-rotation" +``` + +## Additional Resources + +- [AWS Secrets Manager Rotation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html) +- [Rotation Lambda Templates](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas) +- [Best Practices for Secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html) diff --git a/skills/security/aws-security-audit/SKILL.md b/skills/security/aws-security-audit/SKILL.md new file mode 100644 index 00000000..350d976f --- /dev/null +++ b/skills/security/aws-security-audit/SKILL.md @@ -0,0 +1,369 @@ +--- +name: aws-security-audit +description: Comprehensive AWS security posture assessment using AWS CLI and security best practices +risk: safe +source: community +category: security +tags: [aws, security, audit, compliance, kiro-cli, security-assessment] +--- + +# AWS Security Audit + +Perform comprehensive security assessments of AWS environments to identify vulnerabilities and misconfigurations. + +## When to Use + +Use this skill when you need to audit AWS security posture, identify vulnerabilities, or prepare for compliance assessments. + +## Audit Categories + +**Identity & Access Management** +- Overly permissive IAM policies +- Unused IAM users and roles +- MFA enforcement gaps +- Root account usage +- Access key rotation + +**Network Security** +- Open security groups (0.0.0.0/0) +- Public S3 buckets +- Unencrypted data in transit +- VPC flow logs disabled +- Network ACL misconfigurations + +**Data Protection** +- Unencrypted EBS volumes +- Unencrypted RDS instances +- S3 bucket encryption disabled +- Backup policies missing +- KMS key rotation disabled + +**Logging & Monitoring** +- CloudTrail disabled +- CloudWatch alarms missing +- VPC Flow Logs disabled +- S3 access logging disabled +- Config recording disabled + +## Security Audit Commands + +### IAM Security Checks + +```bash +# List users without MFA +aws iam get-credential-report --output text | \ + awk -F, '$4=="false" && $1!="" {print $1}' + +# Find unused IAM users (no activity in 90 days) +aws iam list-users --query 'Users[*].[UserName]' --output text | \ +while read user; do + last_used=$(aws iam get-user --user-name "$user" \ + --query 'User.PasswordLastUsed' --output text) + echo "$user: $last_used" +done + +# List overly permissive policies (AdministratorAccess) +aws iam list-policies --scope Local \ + --query 'Policies[?PolicyName==`AdministratorAccess`]' + +# Find access keys older than 90 days +aws iam list-users --query 'Users[*].UserName' --output text | \ +while read user; do + aws iam list-access-keys --user-name "$user" \ + --query 'AccessKeyMetadata[*].[AccessKeyId,CreateDate]' \ + --output text +done + +# Check root account access keys +aws iam get-account-summary \ + --query 'SummaryMap.AccountAccessKeysPresent' +``` + +### Network Security Checks + +```bash +# Find security groups open to the world +aws ec2 describe-security-groups \ + --query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].[GroupId,GroupName]' \ + --output table + +# List public S3 buckets +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + acl=$(aws s3api get-bucket-acl --bucket "$bucket" 2>/dev/null) + if echo "$acl" | grep -q "AllUsers"; then + echo "PUBLIC: $bucket" + fi +done + +# Check VPC Flow Logs status +aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --output text | \ +while read vpc; do + flow_logs=$(aws ec2 describe-flow-logs \ + --filter "Name=resource-id,Values=$vpc" \ + --query 'FlowLogs[*].FlowLogId' --output text) + if [ -z "$flow_logs" ]; then + echo "No flow logs: $vpc" + fi +done + +# Find RDS instances without encryption +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].[DBInstanceIdentifier]' \ + --output table +``` + +### Data Protection Checks + +```bash +# Find unencrypted EBS volumes +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].[VolumeId,Size,State]' \ + --output table + +# Check S3 bucket encryption +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + encryption=$(aws s3api get-bucket-encryption \ + --bucket "$bucket" 2>&1) + if echo "$encryption" | grep -q "ServerSideEncryptionConfigurationNotFoundError"; then + echo "No encryption: $bucket" + fi +done + +# Find RDS snapshots that are public +aws rds describe-db-snapshots \ + --query 'DBSnapshots[*].[DBSnapshotIdentifier]' --output text | \ +while read snapshot; do + attrs=$(aws rds describe-db-snapshot-attributes \ + --db-snapshot-identifier "$snapshot" \ + --query 'DBSnapshotAttributesResult.DBSnapshotAttributes[?AttributeName==`restore`].AttributeValues' \ + --output text) + if echo "$attrs" | grep -q "all"; then + echo "PUBLIC SNAPSHOT: $snapshot" + fi +done + +# Check KMS key rotation +aws kms list-keys --query 'Keys[*].KeyId' --output text | \ +while read key; do + rotation=$(aws kms get-key-rotation-status --key-id "$key" \ + --query 'KeyRotationEnabled' --output text 2>/dev/null) + if [ "$rotation" = "False" ]; then + echo "Rotation disabled: $key" + fi +done +``` + +### Logging & Monitoring Checks + +```bash +# Check CloudTrail status +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsMultiRegionTrail,LogFileValidationEnabled]' \ + --output table + +# Verify CloudTrail is logging +aws cloudtrail get-trail-status --name my-trail \ + --query 'IsLogging' + +# Check if AWS Config is enabled +aws configservice describe-configuration-recorders \ + --query 'ConfigurationRecorders[*].[name,roleARN]' \ + --output table + +# List S3 buckets without access logging +aws s3api list-buckets --query 'Buckets[*].Name' --output text | \ +while read bucket; do + logging=$(aws s3api get-bucket-logging --bucket "$bucket" 2>&1) + if ! echo "$logging" | grep -q "LoggingEnabled"; then + echo "No access logging: $bucket" + fi +done +``` + +## Automated Security Audit Script + +```bash +#!/bin/bash +# comprehensive-security-audit.sh + +echo "=== AWS Security Audit Report ===" +echo "Generated: $(date)" +echo "" + +# IAM Checks +echo "## IAM Security" +echo "Users without MFA:" +aws iam get-credential-report --output text | \ + awk -F, '$4=="false" && $1!="" {print " - " $1}' + +echo "" +echo "Root account access keys:" +aws iam get-account-summary \ + --query 'SummaryMap.AccountAccessKeysPresent' --output text + +# Network Checks +echo "" +echo "## Network Security" +echo "Security groups open to 0.0.0.0/0:" +aws ec2 describe-security-groups \ + --query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].GroupId' \ + --output text | wc -l + +# Data Protection +echo "" +echo "## Data Protection" +echo "Unencrypted EBS volumes:" +aws ec2 describe-volumes \ + --query 'Volumes[?Encrypted==`false`].VolumeId' \ + --output text | wc -l + +echo "" +echo "Unencrypted RDS instances:" +aws rds describe-db-instances \ + --query 'DBInstances[?StorageEncrypted==`false`].DBInstanceIdentifier' \ + --output text | wc -l + +# Logging +echo "" +echo "## Logging & Monitoring" +echo "CloudTrail status:" +aws cloudtrail describe-trails \ + --query 'trailList[*].[Name,IsLogging]' \ + --output table + +echo "" +echo "=== End of Report ===" +``` + +## Security Score Calculator + +```python +#!/usr/bin/env python3 +# security-score.py + +import boto3 +import json + +def calculate_security_score(): + iam = boto3.client('iam') + ec2 = boto3.client('ec2') + s3 = boto3.client('s3') + + score = 100 + issues = [] + + # Check MFA + try: + report = iam.get_credential_report() + users_without_mfa = 0 + # Parse report and count + if users_without_mfa > 0: + score -= 10 + issues.append(f"{users_without_mfa} users without MFA") + except: + pass + + # Check open security groups + sgs = ec2.describe_security_groups() + open_sgs = 0 + for sg in sgs['SecurityGroups']: + for perm in sg.get('IpPermissions', []): + for ip_range in perm.get('IpRanges', []): + if ip_range.get('CidrIp') == '0.0.0.0/0': + open_sgs += 1 + break + + if open_sgs > 0: + score -= 15 + issues.append(f"{open_sgs} security groups open to internet") + + # Check unencrypted volumes + volumes = ec2.describe_volumes() + unencrypted = sum(1 for v in volumes['Volumes'] if not v['Encrypted']) + + if unencrypted > 0: + score -= 20 + issues.append(f"{unencrypted} unencrypted EBS volumes") + + print(f"Security Score: {score}/100") + print("\nIssues Found:") + for issue in issues: + print(f" - {issue}") + + return score + +if __name__ == "__main__": + calculate_security_score() +``` + +## Compliance Mapping + +**CIS AWS Foundations Benchmark** +- 1.1: Root account usage +- 1.2-1.14: IAM policies and MFA +- 2.1-2.9: Logging (CloudTrail, Config, VPC Flow Logs) +- 4.1-4.3: Monitoring and alerting + +**PCI-DSS** +- Requirement 1: Network security controls +- Requirement 2: Secure configurations +- Requirement 8: Access controls and MFA +- Requirement 10: Logging and monitoring + +**HIPAA** +- Access controls (IAM) +- Audit controls (CloudTrail) +- Encryption (EBS, RDS, S3) +- Transmission security (TLS/SSL) + +## Remediation Priorities + +**Critical (Fix Immediately)** +- Root account access keys +- Public RDS snapshots +- Security groups open to 0.0.0.0/0 on sensitive ports +- CloudTrail disabled + +**High (Fix Within 7 Days)** +- Users without MFA +- Unencrypted data at rest +- Missing VPC Flow Logs +- Overly permissive IAM policies + +**Medium (Fix Within 30 Days)** +- Old access keys (>90 days) +- Missing S3 access logging +- Unused IAM users +- KMS key rotation disabled + +## Example Prompts + +- "Run a comprehensive security audit on my AWS account" +- "Check for IAM security issues" +- "Find all unencrypted resources" +- "Generate a security compliance report" +- "Calculate my AWS security score" + +## Best Practices + +- Run audits weekly +- Automate with Lambda/EventBridge +- Export results to S3 for trending +- Integrate with SIEM tools +- Track remediation progress +- Document exceptions with business justification + +## Kiro CLI Integration + +```bash +kiro-cli chat "Use aws-security-audit to assess my security posture" +kiro-cli chat "Generate a security audit report with aws-security-audit" +``` + +## Additional Resources + +- [AWS Security Best Practices](https://aws.amazon.com/security/best-practices/) +- [CIS AWS Foundations Benchmark](https://www.cisecurity.org/benchmark/amazon_web_services) +- [AWS Security Hub](https://aws.amazon.com/security-hub/) From baf41677b4b0611983d5183e7a6bc0175a4a3e96 Mon Sep 17 00:00:00 2001 From: ssumanbiswas Date: Sat, 21 Feb 2026 10:33:25 -0500 Subject: [PATCH 3/9] chore: sync generated registry files --- README.md | 10 +++++----- skills_index.json | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 99fa44c9..b94865b8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 883+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 887+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 883+ Universal Agentic Skills for AI Coding Assistants — Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 887+ Universal Agentic Skills for AI Coding Assistants — Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Claude Code](https://img.shields.io/badge/Claude%20Code-Anthropic-purple)](https://claude.ai) @@ -16,7 +16,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **883 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **887 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - 🔵 **Gemini CLI** (Google DeepMind) @@ -39,7 +39,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [📦 Features & Categories](#features--categories) -- [📚 Browse 883+ Skills](#browse-883-skills) +- [📚 Browse 887+ Skills](#browse-887-skills) - [🤝 How to Contribute](#how-to-contribute) - [🤝 Community](#community) - [☕ Support the Project](#support-the-project) @@ -307,7 +307,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 883+ Skills +## Browse 887+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. diff --git a/skills_index.json b/skills_index.json index 9aa6336a..1366a2d7 100644 --- a/skills_index.json +++ b/skills_index.json @@ -539,6 +539,24 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-compliance-checker", + "path": "skills/security/aws-compliance-checker", + "category": "security", + "name": "aws-compliance-checker", + "description": "Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks", + "risk": "safe", + "source": "community" + }, + { + "id": "aws-iam-best-practices", + "path": "skills/security/aws-iam-best-practices", + "category": "security", + "name": "aws-iam-best-practices", + "description": "IAM policy review, hardening, and least privilege implementation", + "risk": "safe", + "source": "community" + }, { "id": "aws-penetration-testing", "path": "skills/aws-penetration-testing", @@ -548,6 +566,24 @@ "risk": "unknown", "source": "community" }, + { + "id": "aws-secrets-rotation", + "path": "skills/security/aws-secrets-rotation", + "category": "security", + "name": "aws-secrets-rotation", + "description": "Automate AWS secrets rotation for RDS, API keys, and credentials", + "risk": "safe", + "source": "community" + }, + { + "id": "aws-security-audit", + "path": "skills/security/aws-security-audit", + "category": "security", + "name": "aws-security-audit", + "description": "Comprehensive AWS security posture assessment using AWS CLI and security best practices", + "risk": "safe", + "source": "community" + }, { "id": "aws-serverless", "path": "skills/aws-serverless", From be8d2847341575172aaf5f42c91776325a595893 Mon Sep 17 00:00:00 2001 From: Fernando Rych Date: Sat, 21 Feb 2026 18:20:09 -0300 Subject: [PATCH 4/9] Novo skill @nerdzao-elite-gemini-high e Cards do precificador agora responsivos --- skills/nerdzao-elite-gemini-high/SKILL.md | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 skills/nerdzao-elite-gemini-high/SKILL.md diff --git a/skills/nerdzao-elite-gemini-high/SKILL.md b/skills/nerdzao-elite-gemini-high/SKILL.md new file mode 100644 index 00000000..84f64fd2 --- /dev/null +++ b/skills/nerdzao-elite-gemini-high/SKILL.md @@ -0,0 +1,46 @@ +--- +name: nerdzao-elite-gemini-high +description: "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade máxima e eficiência de tokens." +risk: "safe" +source: "community" +--- + +# @nerdzao-elite-gemini-high + +Você é um Engenheiro de Software Sênior Elite (15+ anos) + Designer de Produto Senior, operando no modo Gemini 3.1 Pro (High). + +Ative automaticamente este workflow completo em TODA tarefa: + +1. **Planejamento ultra-rápido** + @concise-planning + @brainstorming + +2. **Arquitetura sólida** + @senior-architect + @architecture + +3. **Implementação TDD** + @test-driven-development + @testing-patterns + +4. **Código produção-grade** + @refactor-clean-code + @clean-code + +5. **Validação técnica** + @lint-and-validate + @production-code-audit + @code-reviewer + +6. **Validação Visual & UX OBRIGATÓRIA (High priority)** + @ui-visual-validator + @ui-ux-pro-max + @frontend-design + + Analise e corrija IMEDIATAMENTE: duplicação de elementos, inconsistência de cores/labels, formatação de moeda (R$ XX,XX com vírgula), alinhamento, spacing, hierarquia visual e responsividade. + Se qualquer coisa estiver quebrada, conserte antes de mostrar o código final. + +7. **Verificação final** + @verification-before-completion + @kaizen + +**Regras específicas para Gemini 3.1 Pro High:** + +- Sempre pense passo a passo de forma clara e numerada (chain-of-thought). +- Seja extremamente preciso com UI/UX — nunca entregue interface com qualquer quebra visual. +- Responda de forma concisa: mostre apenas o código final + explicação breve de mudanças visuais corrigidas. +- Nunca adicione comentários ou texto longo desnecessário. +- Priorize: pixel-perfect + código limpo + performance + segurança. + +Você está no modo High: máximo de qualidade com mínimo de tokens desperdiçados. From 2904b39c44ab65bb7047130aa3d13c4c5b1767cd Mon Sep 17 00:00:00 2001 From: amartelr Date: Sat, 21 Feb 2026 22:24:04 +0000 Subject: [PATCH 5/9] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20antigravity-works?= =?UTF-8?q?pace-manager=20to=20community=20contributors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 386abb11..7a04519c 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,7 @@ This collection would not be possible without the incredible work of the Claude ### Community Contributors - **[rmyndharis/antigravity-skills](https://github.com/rmyndharis/antigravity-skills)**: For the massive contribution of 300+ Enterprise skills and the catalog generation logic. +- **[amartelr/antigravity-workspace-manager](https://github.com/amartelr/antigravity-workspace-manager)**: Official Workspace Manager CLI companion to dynamically auto-provision subsets of skills across unlimited local development environments. - **[obra/superpowers](https://github.com/obra/superpowers)**: The original "Superpowers" by Jesse Vincent. - **[guanyang/antigravity-skills](https://github.com/guanyang/antigravity-skills)**: Core Antigravity extensions. From e086bafea905b9386ecb394671bbeda7251afda3 Mon Sep 17 00:00:00 2001 From: Vonfry Date: Sun, 22 Feb 2026 10:12:40 +0800 Subject: [PATCH 6/9] fix(front-matter): architect-review, code-reviewer and etc. --- skills/architect-review/SKILL.md | 2 +- skills/c-pro/SKILL.md | 2 +- skills/code-reviewer/SKILL.md | 2 +- skills/design-orchestration/SKILL.md | 2 +- skills/haskell-pro/SKILL.md | 2 +- skills/multi-agent-brainstorming/SKILL.md | 2 +- skills/performance-engineer/SKILL.md | 2 +- skills/search-specialist/SKILL.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/skills/architect-review/SKILL.md b/skills/architect-review/SKILL.md index 1af17c57..2067f790 100644 --- a/skills/architect-review/SKILL.md +++ b/skills/architect-review/SKILL.md @@ -1,6 +1,6 @@ --- name: architect-review -description: "Master software architect specializing in modern architecture" +description: Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions. diff --git a/skills/c-pro/SKILL.md b/skills/c-pro/SKILL.md index cf6c1547..eaeaa980 100644 --- a/skills/c-pro/SKILL.md +++ b/skills/c-pro/SKILL.md @@ -1,6 +1,6 @@ --- name: c-pro -description: "Write efficient C code with proper memory management, pointer" +description: Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming. diff --git a/skills/code-reviewer/SKILL.md b/skills/code-reviewer/SKILL.md index 3c65fad7..335740f8 100644 --- a/skills/code-reviewer/SKILL.md +++ b/skills/code-reviewer/SKILL.md @@ -1,6 +1,6 @@ --- name: code-reviewer -description: "Elite code review expert specializing in modern AI-powered code" +description: Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code diff --git a/skills/design-orchestration/SKILL.md b/skills/design-orchestration/SKILL.md index cf7104db..f41b654a 100644 --- a/skills/design-orchestration/SKILL.md +++ b/skills/design-orchestration/SKILL.md @@ -1,6 +1,6 @@ --- name: design-orchestration -description: ">" +description: Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, diff --git a/skills/haskell-pro/SKILL.md b/skills/haskell-pro/SKILL.md index 648aeeec..f29160b1 100644 --- a/skills/haskell-pro/SKILL.md +++ b/skills/haskell-pro/SKILL.md @@ -1,6 +1,6 @@ --- name: haskell-pro -description: "Expert Haskell engineer specializing in advanced type systems, pure" +description: Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance. metadata: diff --git a/skills/multi-agent-brainstorming/SKILL.md b/skills/multi-agent-brainstorming/SKILL.md index aa8a3de2..bb4b173b 100644 --- a/skills/multi-agent-brainstorming/SKILL.md +++ b/skills/multi-agent-brainstorming/SKILL.md @@ -1,6 +1,6 @@ --- name: multi-agent-brainstorming -description: ">" +description: Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent diff --git a/skills/performance-engineer/SKILL.md b/skills/performance-engineer/SKILL.md index e67e5399..a463deec 100644 --- a/skills/performance-engineer/SKILL.md +++ b/skills/performance-engineer/SKILL.md @@ -1,6 +1,6 @@ --- name: performance-engineer -description: "Expert performance engineer specializing in modern observability," +description: Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user diff --git a/skills/search-specialist/SKILL.md b/skills/search-specialist/SKILL.md index c9844e62..75dbee62 100644 --- a/skills/search-specialist/SKILL.md +++ b/skills/search-specialist/SKILL.md @@ -1,6 +1,6 @@ --- name: search-specialist -description: "Expert web researcher using advanced search techniques and" +description: Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis. From b46236568b38ac1fb9f406c7162145c9802b2148 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 06:17:08 +0000 Subject: [PATCH 7/9] chore: update star history chart --- assets/star-history.png | Bin 52128 -> 52820 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/star-history.png b/assets/star-history.png index aeaa81de2497afd1c65228cd6de0f5803cdf9bfe..2863e7591398df5d63550a42c08aa2d0ded321b0 100644 GIT binary patch literal 52820 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 literal 52128 zcmcG$g@hy33#&=@yjk?z_(WyWjU8 z+~XrWaQ0byuC?ZxbBrW3xXhAdAS!F5QIz*K}e(+Xy7*$Oq&ki8=9G- z>qU-@M1EO-Zyc;1O0Oj%pi)t}@fN+9JIW28tw(Rd)pW`gY% z?DsK9bzfvVklk9iRk-rw`jnS8n+fYzdW=6$u%2T1Xh;!_`E$%!S^qn}Hup+Wu7V-S zvFxv}RwgW@XJ=mySX(6z`-|h!hZ9I)F#NyylE_F$wSz(+)nnT1eYPRcoSJL-;lt8Z zm|IZEN2>XoCX+KL>vsS3!(W{@(~6 z?!??*WKb0*{7K{H3VSO@LQWm~0|mC2h*dI&!eef8)N6B6V)KCsg}i$*e&pYG70)|+ z1Md&`XM)tB^U%@5lzQX?Tn&B1fFD0~svwMVAWP^Uv^gxMVp3KdCJb3Q>3^e37kMG{^@#l*6Zpge>4O?eKycS-E_hputKv!rRT(8=4nukV8$SD zAfo4%`}k%JlC{)i4ZxDkNVc{>VOt{Q=aF0$nSEW3k_RL3FAGNLI9-`Kg_446i5K|E zka}?2%U_&8YZlPd3$}Ln9<(MQgx7IS*l&$=aiSxD#}J+v7K;RSSX~BZ+Nm;Q=E6h% zJ2{4&XBw;o%SneGi#l`x=TRP#DZC@Ek^qG@YQnMW4IY(#00Rjp&(R;={8FB9qqs6? z8Fd6rG;f2(gId`R)blrlu&TuHH${yFg_Zc-4$15IRQf{b zo9!|K1zRs>uSL`(HHt1ls3PnY>b!GEw_~T;kotyZzEsBn3jUT*YpOqTK7ZbnPa3oa zrJ=VLjolGIOh|8F%P1o#t=du)%R$`v{DgC`<*7Z9b_##*#psbRUJ40hJi|P*sGv6O z4PGT)H$9L1mVBzsn68U}V6qolblHZVobUG3<_(8!MNbldj zcq8w``4&|pmZngED%=Mx*ou3NT)2Y-gBcS~64K#iDMl+{dj02{2h1By8S;#Ba^dPhyI!!Ahu;uP3VI$krviJ)C*F~nGIZ@2kP;4KFn6RLw) z&<}{=^4B@;{*FR^IpdXt`!g^R3S$%eW$_X0%fXRhcR~2{LEUF)@?`dWj_`V6al4f` z?_AV2B*!EZ_A2V!o%QN&nlE2R=u2dM3FlGn22BaYE)+Irl_(R!{Mw%7e8^ODG=~r6{_IPE`2~p! zvo!Y8gNRpf*hdTuoQ;#-bE$o@*RzB9gCp2eDQ`U4T84ade{8RQzjl8)lYr}o`=cHj z^J`s?pPmwcN`4GSh8>gP`}v55ozF zPx`v4<-piRta=Y!`Hh%2xS@36#RMoZS}bV((a+6<=G zS5iZzh%*dh!^A-04Huw~cEC7+(_^$2zD9-P!)}ONH?pBSJX6w>p$WK{$nKvvj%`@t z_A67)()YaWlzzLNN*e{Q((}ot@1f(6w--m4>cmbspA`l8t2p&D9@yn_83GLqY73D?~Yn_Q7FkbC)|YcwB;xhv0xI%!0! z(lo^QK%AnZ70Q9R@SIrbwM)>c_eJbMpNL0g)30D1?^(9_C7mZdReXH6XjRThHwNF} zgbD5^hv(co2Zb-*D1vpZfT*sqGl17#(&ucZiKvVN;fmyg}qtjlQ9;lU@olV!8KKUfcsU z9o*kRxW6k#N6=vLMR-5gF-_;uMqkTXm0~x>cGA5XA=FsGMiNm{ zI&mNq3P4+K&qJpl4aGM-4^*l9*ld2&Rvfjc*L=P@7&xCxm`Gs;DMbdg?Mpg4rI7t~ zZzi6}{X`o$+*m&4W+;Ar*_eC!6dwGN%>=jAi>XR*W;+j)2$R7=;=i=YyOZVI|G|=p z2W|S5O)<2GiW1WK?h(T#62Bpt;L4Q|j!3c*!2l6G7W@$k22OTW><~QmeIA`13x*4- zSF$hF$-6@1sKst`&7TbJXlXC7{mwL}ky>rluui@o`};TM*1>4cO?8o5Ir<)rWb)lo z`SCpe!MSn!9POj%AI}$sGfHG0UFz1aChw)jL%JtZ1M*F&oH9 ztM&S(Gey0J)_UX0E`v1>4-_H&C|o72{32>4&6S}VxI1nOJ4Tr%Oo-QJ7s-bnMex(| z&l+7N0)aL@RM!D{F9+72W2g6a+;|N6>vB3}tw{ue_))l56`Svr3%EzzPrj_@@vCy5 z1rFT(>!ddudF)_F6a-xfwqh(F9UP^-*$v$2jc?d@YxL&v%eS~ksa~Fy?Uebw8>ht9qL$LnF{Xg$Yh~W2nrP|{_VCw{B%+Zzu}0n zE*eMZ;V~9O8!lEMCw!t`s5N3w=OlYh(CiE~@U-mrkGhlpNzGf|ZPSh2gP5xBu_uB6 z3K09B`8|e>ZGsompMo*;_S!>TIlrJ5l2iFmp=*Ykl0JBf9m<7Utbc=4LevtElObkCAwkJ#^qw;mMkRPR4oVob`5Z#d=CAx6vQ9DY!8g zDUb6;KV(te@8{k6&pbKULH9v{_`3pmPYJqsA2%Og0r)*;dl0D~q=6JD@F!TR;!sZJ zgs_NDicZhoxo7lDY>_F*fxg!b6++0s|uItfkv*L_7{lk=F3 z0}&%$Wbbng6WiVCPpYx)S|2DF5G1wY#jjG*TRy??^jUG<`+5GWEL)X>_3hbPKa8sl z#dgUhlS6DM3wPQ6WS8Et0jcBuR9^=>a538X{Imrh#+pBM@In)B*?Yu3%;T$k#A56d+N(ybC^~eru^$#2*)wG$ z$SpJiE|*qei#Po?f}9k7^oU#n{~x$sY&vMDsca0vkHX{0?MRO?X)FKPj-C9@jEt*F z`q#(~ii<4kj;~}|S3~FOD#23+3HR)(qEbBT?4$FtR(t-Qcl}s_;pP6{`^6>ck}f0$ zNmRj3Jopc4l-24e)y|gQiTCB#3CGy+s%ASxNxx5YN$`{L{k1k< zJMiL1g|zBo!$%f@Y1_x>5y+xZSZF7Ct4bqlVc`T-!~Yq3nqugoP}*ykv+pAKPciH7 zoRUVQ%-KW!&rM?)HnV$p@#Y;a*F`>>4^_wyy?gIi{$TBp?B`P|E zvM#{sC1M_cClHSwMrDeGtRras!SIJnnWJ!!z;rGBE99}M#5YqDVJTRM&w+FB)l0jo z;C=J)Ky3C9uNSSk09qCoCnuVZpbz%C4NMI$+91K3<|c@q1b*^?;IPSSL_;#332)g!O2!a4*=&|ZZdW5IXF;J6um?KEw5 z%i=gAXpCiu!5$o5sg=N9k6>3hZEPw*1jx5SPgktzPQ+N-4hm@eOj5j{#f2Rnm_(3I zyDbzMIrTXr!8&r0Nf~p$ozU-Y2T2WU`OCq!O}D^r89tf$ToV}e$gv~!Ny`9!`w)`p z?m7?FiG&3@{2?SBWs(|2=U+_3n}1FF24V5hx-QC zFP{fPG&Gh?VrJCHCt7kC-boYW_;UFBTavphiUrgv=|f7(lj=4aKL&gBCgj|sgJV1o zGNSWW60tZjRe9^?I8DcRBgZ`~JH0DW9DiOrFcvhcCP)A@#+F2T7`BVo&VXLMG_cj6@E=kHM@;ItU`7|S$}C;6w> z0Q-bf&tANevrJ)#jhR~7RbKl!c)EVx~hdw;I}`SS{L5unyLG|ZwTCN5|)d^Wgx zXj4>F6w_<*$E!J;HRgMZF~{-st(3L(7RyTil7t#7Y?tku*!=jG?uiI0vRrN%=~0N>b1vGLKuN^5Ji4*Xh6 ztEx1L%gR2~InG&?mzKWo>+4gJk&!{(EM1DL1g0v5Mosgghmn3uQT*FIOnU2D*Gj zr9}e=>Pi?s_q_rT(JAA7o{jd6oMCc<9zoR*V^e|=R&ix!VpU)ZHC|LoMn>_^uCC%I zPoBhdua1t5k3VQ$7&13A`~CCh3wAy}ZBLa_{e$K}iqot*#;qG2NJwGq9{5}6&RApslF_Zi}a5TP5WrS~Wl3NrPBaL9M zi{+|fpdcw}X`w+MS==C(<^@XVXLomr$`{T4fdL#}5n6U(Vd3{_Xjx>TIzJYR{dRn27fD^fXgce4EFD z#d9>}RDb;bJxOg#i=p57f_FBncBu;=KmU}=5Mb|`8@&7=8O57Ld|B5gc!7p;s2W>o zPrm+;Tma5oUa6X2CF|Zkf7fsN#oe0)+O+3_FGZOwp)J2N-v0tMs1bzE5rLPg=;^B^ z%T%MuoDUy9lSe$QnCeeTN_zEWeCAZ~+2+6VYdv4z#jm#6y(QoEY~p-;LKUFbg;Pgt zePI?-{5ieK#_T1yE|3d*22p3BLoGN%IS#h$Y(QAWmvH8Lab=xQ^^CCN>%hRk2r8N3 z2n8A07d&2D5@g|Y5Ly$>T4{# z>{xkR8H=!ONxzHD|ed5u^VhZ|I}I4n1BU#JJUTz<%}lR(E&qI0ug%B>o4!gaxSd zrw|)(qWMjav5~a!M3WC(MC5*Wgg|Is!#E3u3#`;+;SBvU5S*5Bc@|npzdqe7=--pD zJo~ytaSKg2`#J_GvF(fmUV|i|rS;%14a1s_b^TnNBzaa?1_BVFqoRk$=rPJhKHoKg zGBI3mB_4;J!88x}e~~_=X#U6~FugfX_uDnUq6cDP@4NmBjm*!pUEbb>E#7VI)-QRL z>s5Ev)z3LEw#?iN@C;Lbi=GJWq-SMiP1e`f_wwJbsjI^R?mpHw(0yQkdDu1zR8gfmP@1T68UIHTrSRfx}W;tG&{$j!ED|t4Gr@%*#L#lv~w1UI@4dJxW=tsKf z->>)E_X7?((O2XCo^DSW+#N)TtGQ=NPZO((5MKAOR-8}~xD2_DEAu}JJ|5&Zf^~=C zi;>@VqSJWmd>_Ig@w1^tTT<1K?sy-4(f6IeYE*cU|`7jfK0Wbg5jCjqdAS zK{topS_bt_?6+6j75&G@$6-2#t}wF!GimlVhp?|L; zM{CXMJ6T#=&XjtG88hFj%`dBHJjxdLoLvW7B^8rOnS6uo?bqDQb10^ZOM!%7mL4C5 z$bSDO(8-?<>A}#S(bg54_SSF|sNlLze+1nTF63FfwBq6-L6t$6|AQDKdZjiQn7uMuacx3{+#Waboh11tOpDTmn_ z+dBs7NEW!5qPM(!bZ-x_I?0NMP%Q!`adC0ksi>&rGHhvA7(33j1vU$ci<{(dnMdA# z$qlMvdi=PAf`S4Ia+s<5wR7lG1I+ilJoZE5hm1j zduG52H5fiaU>^2o&-k)E#^gg5rNx5pZ_iUey5nVKEm;y*0mJ@j^4u;(WMnU|I&R;i zwQ~O$_jttdI6gX(ijIyhewQHZz4tthT2LcCE^Y$KD=$}Jd-CL+iqPh#@_lIlSPdH8 zKDUD3QuA2F2J}7oaw5M3+?HMZ{-#=nL}qPmEu2|3hnh28$>?%)WQ4xluyJg1a*~3lYBDLyIlSwaWOID>xakT;~`gZ^tx6>d=BaK9_8^ z=~)-{#`T)*>EyzN5_~?%&irGCZf?()DweazPJ&qCPGxp;TTK>@u6Rxd@BKdJyB^*u zpT6C5DDvO+dKg0Rb&;dyVUL6#HNr zhj*+MEmgmCog5w6MRse(g=Ey%7+=O>#Dc2@hiEiEkx*IP{c-apCau^!qX=Xc5y2LLWDJ^jhsk6&94zGL&=eoh7-x9m?L zf^Pn%nv^dtc##=-sN37w*?m2~l22y#b#C6Rduc8RJOThe@(cmjj~rkO77Qd1tFE^h z#glqdkJsz* zDY#z@4Gg>o2wp0q@PWud2l6Q(i2cLE__1{2i_W$Bwdw^gQ7I`YV+7Vw!2N6^HuzlGcZFm)acX z>WpH!oD6kVD}9gufz>HU5R38Sa2vv2^xH0bn%w*8@87?uk5#fZ+#3z;5Eg@2)Ew*R z=H?b!KkueERoienX+Q-#K&SP|W4*6v-fQ|-Y2JMm_m`vX;-d%y1H=2oL;|6^i`82I zuSJ31-gI5sXK1@j>RH!j4oYj+b^L$509KA5X5OvF3lHtPHU0+pteVwX{A!~>A+`TA zGc$8!S1biFfsA^lu(y*eC;7as1CQUyMu(nt_C!v0Hv2j-b9Hs~0l3&{zM;|sv9N$r z0RBFegsinU7mL}?S;7CfhTON#aLitS*~ z-FIvb52Ne(`T1pK{)OKbY{S{Y^?_$QGc;XCh+PnpPil%!2jN`k^tWa!B7=EeIFGKP zuj11KohIyygxRUpy~uWO$Ac-ve|5Zbp!2MY5@{x;|P%Zc6VR7m+&1 zIE<-l;fojT!S+u@&zU~^ScxSB>|}`Qvo>4!jkKSB8MDa+OnUlB%){W#sV?8U{T zJM)dzC3(}rklr^_$&&6>^~o{=9jnrkvNHDKuU}dAXy7CyBs-LV_qu=}pY7 ziKY;R`OOC%<03w+crs(3*9ICI8o7C|LD+t9KJTvj<8;boDJv<7s0kc210Y!Bx;L)p z_)~(dj{h&U16ms?c6%~Ti@FvW8Tn8?sRo2s@4vrNO@j0aZS|-4-jcEx6U(Txa&U0O z<48F0Wu8swn0x@6aT9bu1i;DYdFIkhVTsGdm?DQ3@^UM7dMk3`lu2-_0s+ch@8jH8 zyH(+xw$!Pe{_0qQmk_W>s}I|EDEbWR?XSTM!4BpQv@~{AL29@7oQoVJ!4~= ze~=!<&dweIf^SPO!pFLr`Z?NLEWd|iikbWV`5D~?Qe)4TY%hJCS=l(s2N$>d!All9 zj3B-@BGxC)G#{u4EFiS_^gc?h0q2a*VOk9fet+---)L%j|9qbf4F4~S3{YCqrUj=* z+{+g?$HV=P|c3qm~ZagwMsV(5KF=7g0>CyGleOqq>t&Xv;r6QnD zX7dRKbq-Is(v@Zb0vFO5Bz7_)eR}&hwa^yTsoo&)VkK((;nV{X5|2Q9 zM&v|92${92wtaU^Z37XB6^;oTfwbF93qthl!O}-z{5}&z;R#*l^mk48pY$Il&vFE% zFwyDU4o_A%oM}X_-Z;A{21;CQEyO;WW#JXe>%O=V^=ZEv_*_?iwkg=h`{9YFmX%f2 zi`%T?;#l{1qh_!4Si(9KNeN?PJH^p@GIj<)bWvShUAHfA;WX_seari`WYw%HwrWDg zm*F2hlWzaK<=E*@N`1o99;Pn~p+)f+->OTSjRPkFM%HBpk zX$d+Rm8B|Be&&1B`}mraO?Sk04IiR*AK-Fxa41FOeg{Bc4As>cl+!pF4#ri*JwN}g z>VIZ$((F|xT19-9^hk03_}}2RN2B2_-+Hvw%J+yeR-JN>SK8VN@WuCg+1`t;CP9~f z9a}R+W%>pOaV@Q^o*GxAIxaL#v^dW39fL!$GgoD)sDr)<-2H;jdC|eq-kunt9U)-l ze$#e&Aubi)w1u7(5G4M@(+IQiSPdM&Iso6H0sQZe`2FQDT7jOCpI=jx%gXmjUi(P_ zs8yZ@a+s?dEM>XcwW-x_95rhe~m2(3TG4X`|erx^A^uKBI zgb%}l>sbhbw&!*7L`GdrTia?2=z`E~22ki)hR*?up^I%jo3+=>@!xBlMVQOpJhz_1 z67wAhd`zop5NE)}f!a?~vbgK&VBoP)@gMbmBq1ejb4lnzoP@EL6yv1$M%Bmnaf?l- z2&V-s#h;pVoL*kzw}h1KS6&$dXU<2TU($4T00pUj!OLL$2flb#Vp0gWSK}IP$mF1PIEQrNH9J??P7~Gzg#T>&u!{CJC7_aEv1bpX=o65FfunR zTYkSvcRyVhbbHkYB0&;>2~B&5*#rZpxsF{s2H{l4X{PFPOI4Ly>iFiG`@ex+8)xVJ zrlpi;Mq6n-)+*K(uL0WFPl$W_mMSGTH#hKX#`=qi-{$9{EO&BL1!o%6Mnc0j<*x6Sb{*3Wdm(R=RB)}Cc# zWR#y6yL6&v<3)u5t*ze)ng;%l;2)Sq1Zii>z`6BrQAx?R!urlk^=(FB zDa#tV|goNJDK4O7ZI*9$7uTbP9+z z=wfBMN96isTy-~=YuQGbJ~-qY**(f1lWmTc(L|(EMK%A|lK};Q2x{AfRr_ z`)#VozsP?8#Jq$^UcUhU!Os@;_nOsI75$5e7RL4`sCY5g93lHWCsC$N>3zP*kyYuQ zf6jZxwfrkTcfTcKlXp>81WV$qRJ2csKQH0p_ciX`{(N8#H(Dq0+&+OFzW9xcro4P_ zIXH9QLbxKgE84{_ORI;rctS}=M8)B3{mnFS{XoSksc36DMZ_9*gE}@l_@kIVaOVqD zY*G(eKtwtpuxblj&2<4^zdshgAD{pIn~Bn$9t8X0|CS_Z9Ft+PF~yAk0IIsog_2na4w23SzItSooB(hVXe`tR0GiDVS6 z{30_s8ORZB9^Z%+4Y+W*tQl81rbqzEHXK^^Zof9tFfho})zGLa0RgQ6oVc}k;XRv} zfhh#T{QXru1mR_XlDS_44+>0TT6wRja#*2X+jn=lo;!z-`(1>xsYfdEfl)v+G7MZ> zEvsKF)~k0iYMgQS7t4hZPHMq%P~6PDJNfbtNVe*^(@ukD4f=3sS4N0j@Kx<0DUv(UayZ}RH zOvsxKF1I%=idT>V1lf6)AGnVE^DfeJKp^sx=E0Z`xw2UskF&SyCU&3ugoy4Y*pzfw~1Mnnok2FO7u7YI4yTuaAjg0d`K z$KpzG9V0@j)Z1|)`2IY&UKEfB*94IxxdDVahM?K3apzXUIlKHBPhab0n(h4&f?PJxP~;s}C-Oc49V1BZ<&pv(n^c9=znS)7#%j;`!HnLI;-Q@K_9D1LfT?Y9L z&LL==Fvv0|y~&TQfh1b!=FRwSH?GIL?ebsd5J*e{j%z*dULGqH!vL}Pq1*d=hukUU zpX*RLDgpM8fuMPRX~y|Vr^;OCOJ4fGQ#=7bbS8-gG^SaXhKynfk6$P3JDg~pD;m3x zm3R5oSe`!RX4kJ_>Du4`^`aRNZ%h$YBtLYzNc)P`x>FFT+f)r!(5fyod;NS;T5>WY)h!<)4I)H>mUr!Lpac^2l$G`K z-~Lq4*a~1k!X*F`O0%i6@i#X&1bI_@2sj8J!AG>&`lTR$MN7-in;+jkQ_yP95&wui68s5?$pgWy8XC1ek#D1Jz4H87k}QChlV0)u7#)S>FM=l3A(p(wNo0^-;~5fQ zoV}fq2ElIwC|F*6K+OWk)H=tvtJUmRjM!8#;I?g`5~u406gWY^l>#A7>mlkTM3x4$ zh<`9kuzFjU%+N)0{b1$CU&UvQOqL5xp4!Ue%jefKv$gh)pvLkZeI%@r%p_oRVr=Xo zbT!fjGByuFNI-)Fh4l)64XG(3ZzDH#^>VuL~G}k zrA2nLKe`hHNZ>nqHAu!dc~cT6LDC*gwQ1NDc1cMZ(q?Y@J@3W@G z^%vHSCY)upWYiBpSn9H}u)qO&U?Xk9V}w*(4RrQTh3&&400Ssb8T&i-gK(a)cIb1o z;{^~SnBwI0H2LZ5qUV$md+_z#(pE*&RxwEdN9SUqW%})3j$nCm9xEj;DJiMFi^J9G zsZu@jU;yX0pS4~5DbL$l&ke52a_yo>2QO(J9-b%!eq!g~P&ICJv-|)uMwWX3fMxMO zR5``?S>Es`CLZK9A3zW?Usul@A=JZCkgD5$+128GE#S+$7eZ+6{Gx!J9TvQd>jUuD zee9znzuQ{R2$+sRtM9Q@KL}0LPOYbtKM`Wfs8#jh^z>b3F9kSJn@u3U3C}xumv^uB zE&#Z83iN!3xVl{#GNa$dYHFr}o1c;cZgHQQ3S6!whXKN3e%yM#n8^vo&pI9!ZLgx>z`9$`{ObS&O8)mBKBOllC%b2>Sns(Hi;}qmE6*>@`2(*!+L`1IWO+i>O#sfZ{pSnz8|Mvs}#E zxBZ~B+Xz1R11SW409fu6vY+xWpdcl{z52n+6}fLe2a@RJX!_QRVV{{VW6Dn|$gh35g! z;Iy&jz`Uox^c;|FyUup!(5b^+hOViPLA}GJ9i$XqK!F}YxE(>KJfIhcTL82RJwj*Z zUe<@qI~oQA?n7Mfrr%UxDWD4nhOOicuLY8mqvf%f`Le*1jOTtsa)*}z5w{acI|;?b zPb)zbQ;?HWb9ZxlFIww~e)4@0+))`|YrtegNXiN>@5Y|vf})iMD9ESf0fdTy%O9vB#W1{ARNMHs6O5^rV9bM#2^UMJPNa zH9=3Se(BZ~U*|VUNyTEjpX@I3AGgM{tyJr=aS#^5q7)8bP=5-$JD|{f-N4n9L0Lvo zog@H+3au!!11|rwotoI#*w;Y(G^nv59K>`bc|-orF`?EKu@LN3398lh1Kf16xv1Zm zTz-cfRe z@z4*Q5))cJ^kIPnrF6@*7fqJJrRDc$c6;A(xE-k=D04!n9%E#hKr>oa0R#to1N0*Rymg-N8OqKaeiDe9#G)p2Gl)!|w>YMoH? zr{vY#2M>o1BWLCge~mt$S>98F#>l$&<_sP~5=u(%8$l%;EJn{LJG^Mw;TgFG`N(&{ zV69iktUOaXXX$JgHZriDJsJBWGt@lLC}I~Q#cqbd&>pYG65iLRfO)l)FKxAq1`NKP zLnIfHU)$tAY+S-SE}w=R4!gCnmC@|f&?vA#Gp#nf478A#UWy*5+We&h#c6d-O~%RJ zzvZA=Xhi%Om;z3k!;KZ57ZHR_j`e&TnSAhBclM| z-(MIzLJG8opl$HvbORgxd0goPT`csvz=7NW(TA=S3PL#;H2ne| zs_EJLFhJ?~vCtN~BN69-&*hBvg(v$pA-V_BG9wI?ess6oQ40qDQ_+4Wbc@JjAhUga zma0fBL)eV{0%T=9Ev*l)OiVbg0>nr$P{{KVI+$V}BDzAupJV*k`DT&DyI`9$EH#7T~k&;q~P-j5p!Ohs1ww7*N7R;uk zq=Xp!{|u6S@AfGc5E7(VNX)XcvqQOFRe&)6@R$!&)&~3fG}uV{O>?DQb(#`@!~X|? z>kxH1L^lzr4FW|@8v)_AwziZ;#U95zR8>^O{`Kou5zyZi0M^O?_7;Br{A6=;GX`W6 zFeL9k6+#)p;^K#Z)dOLPfdGRO^!L=%)?$L*mD-w`H&tvr?MuT-%*3fox5H{~ZdDIs z9u9!U87mr4n=~?c3Yv7l1i@9HP6YD!b-$ z>5=PcI=lgZ?FIz^BTTTWV~Exc+e+PrLR*$6Pq;pSpcxSn@eh>Wia-JY5S2&k)vL7g zGepOcI!Pla#{r$2S)Qm=yQHxADQHg`*gwbK-Q5jk>%YFO_OP-l%*xH>@CU6(09?EW zX#v3sE-x<;g*-2vyvgUdU>P<1{hPnpPd(EFF#$9OuxRV(C<3ECF6~=`9w#6gk!56N z%E+iAx+o&07{HBqhIrj_L64bmw#p!jF3^`BK%nrVf72k{08NH-Q$QHa9)3JMq6JD^MZI_{cI~ zRqYCP2)-xf*>EuUK<0J6+8dBx*lz^)yqYHfVP^p)XKYIg3l>2^!F(XT4DNcJ3;RV9 zu7Rqr0>XKYj@*hsTOCk4t%{3_xp#kw7D&=L_M&&-bl`P>rUx~3_1EQJzjlCv^ck-` zTHIkEcPQoRB4?Ts^Rt+T{Ck9;RBrSvl@v7E%z_&;Grt6FU9Ui^nH9<*XoSiDwQTUi zKM$ceQ%r~e2Mu&}4P4~sH#O-eS*AaUK>`6{?G!&ao&u&97}%-{atIJ~yg>(6F~}z- zNC%Ygp|DhQ5VFwv$X1*5p)S`BoFOkHpZdzr8>yWtQ~5EocrrRTrYvwfXj6SL0r@}` zvQ|j4AVUd>$}HV^A}*Xyb}*YycEq%SD!Mv@8~DDg6_ahv<*E-nTou&H*b=<@dcc;5 zc+pwvqUB{o?lH__|5qin5n&GrKp_c{d+zV^bDIwX=w)cF^Kwg2N3d@7wF>+n3Q+jr zribqZD8mv_I~sF07Z`!3P1u3~r^(O7zV9>K%!D7f?yR7X)H9Do?fK76*LPmf z&M?wquGGj21Y9*oK);bMU>(hnHnI(bJ0}NnN9mXzquZ+?F_dnBuH|)VRW8~9vyF_T zCcrxLx8y2dy>MgGnW?Rc#bhGN445I_@>3c0XAmc;-^%#gy*yJgxW)!*v(d^ayT7Xv zp`YXci`uX7DaDOv4YkPRJ<1D6c^3Tp-BKK{nDd(R($PfaHlOzNRyoXbyj&S(d6g1H z7q_zBgY-rHO)3oKoV&IBz+LKMhDDb$!jNJC7UCM)I#Z9m;A=;s5vLv*3omnpHh0)5 z7D9~oZ>eC`!cEviUGsQdjW5tXVQxG-u$FEowJk0#^l4orub8rTa@gVF4JTaQg9p*X zfM5L%S|?N+dYYxL^8^H`?j9i5$Ruo~4T z7t^iCM#v9g0lxSdVIgmOW9hl zM4gc}mmQnf(&_9wsWcWWhB&1p!UAhjWJbc?9*^9zdVOMriJ-PZr7VI=gddHkfsBAr+Kws2w63j%fv#IDU>Y%0HWekuE4Y=pe(|s8zPmMJ5Zh zChU9a4wJm8@DtliZi$!UtW6>R!3R0IXYBu&ho*fX=Ajvt!j-T%dv6k4uO>Wn^d_{Q z*sXl#s=P?z1=aws3Fl8)tnIB-%R?%#gW%TqV@ik$&U1Ef*$aeCs$^!S-7d|r<_q`s)F7fqF0FKmCmTX8!sidVWGfGUZ<$GoSlZNC3MdMwI%;Mmqk_MM3~^g2CiirI438Gprsnhih*=9=9K9unlJgT{ zYahF=tRstZpdxS=hMv1t|V40|rQ-$Ed33jR{S|NbsO z+v6o^x-GJmK#iz}|64uX-qIG$ycI)8d&n1k_2!Pd_LJ?maZdrt0hJ9MNjkrC1_&Q# z**#(;EYY`hau{E{Vz)L2`GWWaT36m#_!Rz*_%WVWBFOBBxUIgj*+?3PtrK=g!r6s_ zp*pKCT(5FnWxxE88)|>K;zxTDMEN)(^^4>_`6AZx@j;V2B!X|sb0R1`^!B2KtmEj- zU*#2#cw7$mjn1FuBkMT653WkL?~wz8-m%|)+E#&rpo;ME^Y2bW3{_#xG|xvtg&%=% z6$!0*hE$+1REa0nol|2$pD@wSCn^ZxBKY)=%r5T^j;)~X2$Nil)-y|yE57L2h#Z*Q zb5*Ha&s#!BHGHZpM6A1ePXq&Ohsj3vMDCV#a}U*1v@3`4|Mp;wrP_Q9Bei4Z)llLO z0jVroRaP<0UDGeyE?sECutf8Ev@0 zAkV}Yx-XDy6>;_?#C52l!#lsjW#7nwA4q(>6#sAW;@uu;R+mwap}-SR2`oat4eT7J z;sMX|jv7~PQj+hGN5XNc3p0o4q(Nb!GrlNj0AZHmsEkqlisqf{69B- z7mkd?WcwUhn2?&G>moskG?;wHg9eiYiXNgpYzhPqwft|xe$|a8qAYuxx`ZC;Ke#E` z;i#Vk-X4z<bv$u?JiDj=o1vtZ zsHaaT+KQix3!XL%m#&f{9|u^DxGt3-s1Q8TD}`}+zq8;QVEEVb{&2XFr(m!-j%*E; zqsoDCk{qc^!h*Aq8S}HUoE%2J_*kLsk$uMV%_Kfs+swj2j={;qx*2ICy}TI)<}NfC z8qv2OPh;78tK!ZBC-`{IZ|)ijd`f>M?NnBz>|dXb+2=I6?@zolHXTe~7aS&}ct}ko zi)>)w!tk#wvchg~Z+x;DwGic#{VosvY^ctQ7cVT{=z1??MN58nV)RRB5e+xdn%EH| z@-_^MBT6J5$9V%@Jp?X~QGPjnSe^>8#`SMxI(fVrZ_lZLG?xB1ZUWT^F$hLOtKU`6 z$PM#1BGU?CRpmg7+sTGi%GmdCkCde>bsqYM;3X}Q#+JS{P37wCP05Bs7cE@asembG zE#r#*-`mzIj#^spUXx{Bv+<9i#m)RVhyX*B{x<|_>ytVbaHAJ%u`D_B+(Jw(Fdm-i zEmAQNf4xBac~@L*1qsC47Cmm?zOl3LuTnzZ!ijR9?9K4()ijaD^nz9zQ_Q2mWN^&3 zNrxzMl$c48SK);nH-9Pc9p}m2b;B}<2nfN8qDmpsRU3mp1QiY4mG%v=Q3cp|=}Bj~ zkn;#J3uJv@rut-{v8f>nZRFnIV0vJCtZ?~%m!-G3R?SuaXNUwVRj^0t>nUNJAGWB$ zYT3i8;*aRFeHV5Aw-#ZEVU|g~n+#sakQF=T_x;O5<)XjO)sWoGo=TA+%m_Dba+}?N z|NM(KzR(MI_Vbdtt@gT!8g-*&feBW=`@d@z!C%#2^X!0`9&=I2W~sHY_$i^cp>zmQ zVmVEps2yesV)y7Z>uWv=*hjzR^r!K$=?aD6U6I0Hfy9G)&Ww84c!Di@q#)5WDRw;S_5J^@&=ahf zMXPBU3Dcn_&Yruqm@oCuyJ@D>KK|#PbWtik2=m|Ikb5e!zRYkX{-^2Uj92+VM%l6C zPrUtCb)>Oc`9|46_OcD zyKlS6-cK*ze6W%bV(q80Cu0LX@eZ~%VZUw&f3)Ya?l3?-9Ax&7F)kBvON565*W&%} z93iXy_>*3cMB0LVZa*NmGN0`veU7uo9(8t7v3S_Nkh7b_a5S~ z?hUfqOZJ>SEv8cgW2p~+K}=CDc#Xip5cJ4%uKgdPzB(+*=X-mD5T(0I0TGarP89^C zM39z{QaYqtl#&#sTNI?bV-YFoZdgK)T9$5jXZ?JC*ZU`2&(1S*=EQyOb7r0r{uGF9 z=cP;h9)VLQI|)$bFRp@=m`VBBo4Hz8{5>K{e0kH4c&ih%nh~WnywbFpEmM*cVoqb| zqT_;s2T5p{$6soSiK$E}I2qiWw|)W+2>ET#atPZ+O9+cS0Y;Y8xchf98)JpBMg<1? z{L)F4(c*3mNg;>=^UI1a(Z&A!sL2%%uvtAj;hx&I8vo{4Qdm$d$)(6~O}aMFE466v z{Vt#-t<3o{4u{d*$60a=c%T+6o98uF80%Loq%Sn>F5DIM4?GWX49A~IXqTBRXFCn8 zPdioz1J9(2q%-OeW3+gyAC|f{Y$)r@!3Fo1{Uej&ib&;F=R5F|}!X<@}-J*)Z2qv|VXN*E~dUl?? z-WQ8HUZN4YAH5?}dUYx<)LEq&RNDA6?> zOlMAew}xJD+y+7?{Yo&=pZGUtKFS66**e6s1Uu08a(r)cQ+L5E^@cmj+UCIUNl zcbV5ks%7UaM!R%2LmTBDm<^4nbooOJ0yYE2XZhh*EbbX|92A%Q@^caLz`9oO^BW3Z znN#1f7ulLaRs=lgf70c*Qp%8D=Xl!x)v5EYujXHxn6C)yDC3`_UpB+Ww|zx+bm`E( zNayUN&nOiLB}`^TcMm#b`;^o1G10<#bif}3otG%D%zexTiM44Da8N|tn0FZJ?W8Z| z?*B;acSq&)CL0r6(@_5Jc7t*e%JCwJu*BU0XUJBe($x2f>HB`%wG_7O9wz8Y>?wadk+blro(%)<=AZ)wr!kSwWPRN9C`TWM`OUecRPWi5 zMGqU4-^-UNSSXl1wmmHVkl5I7@gj?{p8}&dFdJP%Pc};?NJg06Pm?IPmxOW)`^W-BGg(oT&y|D%n;>tj#q5wZ)Y2_4CVX& z(WV6cJAi1gVdd*>w*R7h*VnN-6=ACb)WQ=HcTP|cX{+^Wi|K7^$51ZlRI+y}v@zM; zM>}Mqp`7PlK?>bRr)lda2OfH^8%60$b;;5~Ty8Cc_LqF6jY{exz{dNWp z>f2`UhtuDC9k^bi7%(Jv(|iH=PDPyS;0C&Mq1u|dqCW~?JP=GKa~#z=@w-yOHu&xj zNEu_LsvcNgEzXwdgw}t)CO}ILMQPW-l*2xK;M?&V__HJ_b37Y(jq5{l!Z&o(Kn3$x z*D{=+6DUxJ^dUrCc74C4?C+5gQ)GU`SSri8V&hEd)85CO)xqn%3u!IZ71G4`bRB$N6LP#G!Gqq#R65Pa(u%(r63C4@Mb4cPpN<-q1~&70 z(yD5Sl+#TbW_ql;6n1u5XZNEpPSBZF$k5=_?;WxS$ug;Yu1xsSshhX@jbP@(yTz;r zJ|%ye)jFUis!%g1Pb(?L5WdnD(3 z?`d_9S*qaPdQ_7Z#&>y3qM2P62NO{!{zRU);m3lRcV(`cdfZmK=}v_9p3x7lJg_Dn zq1)=;yAI;rJi>%R5-|%`;N5P#dpa8ew|jEbIiq>l=hVrT8x8#IOq|I5Xr7xG#bsem zQcPV##qkLWp1aaY)aC`N%sO?if5pnFu=8AwnmG#xZ&M7E)K?wuB526i$eq|yM8_dTryGXb?AyZxRX{9?Ysn}ROK8Sl5|M)to5=mI>M zl)Q*pCwV}SP&CbzxZt&~J8#?6x+PJ%K}7>6i1EEj9SpKEUu59f*DRQ!Zkm|6j>&O* z!%sF_dvELzjEp94$OM!31-#{HL0`!JFSeI#=?XYe%TI02U2dDS2Rn4-TsC|W+C1)H zNJ-TL^NL^a;UoJG{RAO4PIIEn6^y^Q&Rbau&R+6iU03H;d8UOAgfQ~7Zg69NUXz;m zFZ)r-Hx{sY_o2HcaaVzmN-T%Jp`nQLVv$1K;Z2l;wAelX(QcHT69M$$T>p?jp!IfD zT<16HU2T^Zg1nn$i%@%$dvEwSI_HQeEA*T5mfU8 zG7NH_u`+Z!TKz>+$O_n*LbIP)Pu^oJ-xKv7`BK?3&BAm^y9RkFi!B>q#o$)ATkd%h z$sBj}Cn7mgzyE$GK;cP#9GD-xtR*6);whHoSa0QFbiU>BVX<8{bVdWM?|$u;Uv=2* zqHQ4ec^M!fy%%9LLg@rHw^pMcXEsHIMl;#SH_cV`)0(hDdI*iER({g=)>$- zquHE$fpwMbOD_c=1qS!l;d*)C4roY0m=>}38?~ew_391HFrP>Tf z3TCwr15%coXL{pJFD8eJ2Cy8FsV`CtmZDzbFoKQyGZC=$Fl`XP5Od<0w|^@6i`Xob z`!2@u4c}Pao^$HOm&Dp2xQ3#7Dw1r?W>8BnUsP>Y&OTL3CXMOevyvr*PSwKxxjY7I zhwpiB7gFn}Cvqbfl#vy!9g9Zc(BS3f-;3vrlVtJ=QMLuV^Ukj|B8AstHGwy%sMzbs zzXn#KR*x6IAp=y%TsGf8UxPlUEi4N+j!sF1Fl#pQBkXu$QR~%baU2gWv}C_# zqReY^Bk8w}ZAZ%EF;VAMF|A5?U16LU_#f+6Q0C>Oq-pcrR>ffQ6VFY_m%_HyDQQ+G zD|~$(iukvB@6F{s@F_RNgGAt;*tc2FU49$f3PTJJ4A3{32F;cHS#$Q{1R7enripP0 z{f!LD?1VN?qti)~BP*CC*dIKJ{~o?3)Bp}UG2K9<%og?bDg=I^Z- zww9|@T)Ls+HVHcq1-l0^QQ+bw!vi=*eap}(N}&7ILTfXWxBeI`o+9bOBI3Ca@TpOq4 zm?dj2$4u%<`M#&1h*k=j3WI9Tdoc62g`ATAbbJ!f_bU-5JzOT|-2ok6MTPV_W@1^% zbR-Y@`u^N{Hr{60De_@*zv8&WzfWs|=r5{-rg{!7h11};@lH6skFsjprD92r zTHnoV39)r{HeT!ZEEe^bz|HE^V8{AjCaN}t$yhDJi)U7s#)q0qiv;_j#lRK^wW*mbJ3$lj&e zsl-y)Jg+oeU98_9Mgne?YWlsFU-# z>y?YD?NbQ-;2O_-S3?0kA5)Xm?L>GHN?M$+AD)3DEUhnWaoZ^)fWN#cc$r$}{S0N> zrex`wAft5LZ+2@d>2fzsZkZfKnV|`q7#ezS7ebJM;CM)s%7`=v1*QdTb<^P@?tI43 zDEQ*h+HtA<2aBfV=GLJDy|h&1rd0gByuUtn!f^v5T1C-|mXrZjEM2f4c{4aG)?!hR z28N?WTY`v4mTDTJ8VKF<{_!-0qvIx;8m-}Xt8(?86E)g)(jHcoZw=(UFfTJQ!AA29(H(H3+Zrc$p|m&2 z^b3z1xuHX9x?oB0LEo6#O0P2y^)H69)29@M2FhAeB92$_d0#Dx+D042{WRl;kRy7PgkEEKR(aP(n9Pluh`DQZ9H9#{mu_4R#Jx z5P#fWY&Q}%=>?eNPU;Sn7hZG7a{n3czj%`C*7~{Zn?+kOUSy3W(o2x;vOxqJ9NYBA z-fA5bAi8q%Y}7!##q#)u$oec*xL%e-5U|D+iS&auKYUG>l_G-jPE|ggZvDx?X+rm&$=g>^T3aeh9 zx^D&ZMzAm1KTv}SW#p`?M^b!DS79B zmJhB6uOoa&pcvH{lIPGZ123o-xv@iGxK2^|?E!qxP_QMMx{hhX~ zl_f3Jm!i>$yKUn!3aiD2H3Lz`$vmu=vc?OBGLN-FuO6VWO?XOc+QdQv52a?;oU*Z2 zqr>8#SCO(&I^f0+`R+kA1m)o4Z$+EMk3}m|Ht|n5kPe}rVo;xmp3Q}T|6NU`HPIkC7Q;6r@FAEaw8ge0vD-giWGt4FIG*I+ebYBr z)A-TmdEJgHSt+?kPRI^Fn?oTR#zwGLOy~-7)opKue`kX~5f*Lxs6?fH_-R*I%*EbJ z)as#$AySR&$@pA2|MMYM$F^*oE?%*typZ)jG^8ovKdYN4dd5!F&6zQK@iJR4hHPr? z<2f~&CHs5uF^tY-*`1Uk-hUHoqFRLDsr#-z-Oyf<&+R~CQi>X5?8ecLCwnPG!mi#J zg8AV0S^F13GOPr%#S5I8n{B^IYsG{q_wj;N?=XkaMS0sVYAJno@SvqRHUwCmlh$*GPm{L z9eUNP%T}*4N{oB;GCzG({Z{m9WLC(SIl27Oh^XufNnde}^FS4rGRO(6s*CHL4OvTX z-Ox4fNC~7NWLvFk`4Q}CpR3dv1)=Mkf;RW`PQz>)LauIRwN&m5*6U2u!Nn6v31eHA z%}HahG#J`H$W@U(44IgKXKXJrO1Mm@uAay(r_L^ixlQJCJQc9VYX0ng@g11R86n3# zNeA|6&Vu*Fbez?6-DNBAf5>aNsAFTDjhsStz)Oj+{L z0A80sHp7o*Lff_`f2Vcmpajb0V#LnHS`+KhrE`qHZhOuEa+`Z?}l3T zofVt9jOCVkv65v%U2m@wJz%N9IaI}oLM$q5*TidmlxQy#?iK@W`Os7G*$mc73cIlC zv2W{W$9o!|j=q0Y)l8os&i?ht{Pl(n%o+C?!7NPj)&s~$n5Cd}s>D^R(d=3c!cH#i zsh`IAKH@rS?dJ|~gzC~tqo0Yh`!{Ni9p`exKE?2o2uW?-)3~>RHdHPJQ-EZsTQ7(H z)-(Oh+Y!`GJrSt-VV0KjxXrSeaE->@Uo`g57+=!Ve0fD>UA|k8HhJic!QYd`dg%IcIB7RcOdF9Wd_;gL!8_3}bz4VEeiR))^%3yRc(Lvve*Ze$CYKL{3&B?-Uq(9Kw|`6cV3{C9H!^o=EBM>#d-BxZ zqn0fknh?8H$&e4x$fOXfqRGJ&9+bSCUv7y*F}Tenm&6whm0`&*xXX4=?pm}oKL&aP zKf43qHcq4ji^qr$DVf3xwbumiMA(sM5xe54&jmlBA|6!CR@bGw9yj5Xh>nMP+YzI! zg;VSly(~9DevG?x`9{v187RYE3qsBWHdI~^4R3)pr+NGG3>9m`^*a4k1~&EpIEjTW zNh=!aOG%BWSH+bE!vg|3{V>wRPxbAxxs z??|4qD?U~MB*m+`&rk|ke)K)Ke}@UR2I+8m>KxREs~Lk1&WfwUvrUFqNV-ekKEFq! zWm&cv=Ji_jVotjb#bfCy2iaX|Z znDpX!e|oIB$HJOxkmc@i4~o+^J=iDL;2mfQio!Y9WiQ8Gv=M&SUvpqS1sC3I&WhsN zvh$H5`UG&!5yo&EzJ23{{X7eOqvAXbhLF%-xgvOqG<>`w>2j67to^9gBC+iuj65o@ z%ckQ*7#aQ%NS^=nm{DTMuvCPJ-P;1$-JKZSD$13=i6)*TC?qoB=_hQ{{&s=h;N+@7 zMN0UQko0F$kdM&2 zCT)D5YU>`Sq?8CRPYpH+Q|Ld|7&pFGqSun!>A=kD9DKOiclZQpSGQ{?CkQj%SZb7# zd)bZKmX2gdApto{ss^Z=hLf4{xi3S{rCjFCCv7na@yb1+Vd_I<5B!*8+C=%D%EXI8 z+u3j8ge2<&UU32R5Y#~AF|nQIIpWR7JpairBKJRHSW6mb>w^67;Iuhmu95iKY54q& z-cBFZ7|0_4$Qh;I@9s0Jh+x?*qQ0IBZx`i%<5>lChu61~o{#nUJBp-ZAGR!z$B;J( z#va8}V7X#uPdO~?dq34;f2Fl5q_dnHB2E`so9DAr_Yj`d`}9Uk0OR1DI=NVfb()l9 zzY|j=lwi^BMI}HpaP2v)AJtNw;38XY(wosI*V6z7ojiG4SD>sgY)F|w`mg$$nnMRXxj|kii#<5+cYj#ftUk!XdU(mIbT)Vu0QVlEn7%B$Hw)pg$Wtj z1Zo!X`0BxtN!}X_^6Y3eYI56~TrxTN$-ZXk-tarJdo`V}!WVV*j*jR<61uGP*F?YW zxZ_<^qP*PAED^k}N7)_kB=(~sv98EHXlg&_9e0W%YY^wuCwPii;|*uH#vpa?C{SvS zPZrGL$1iyP5X~Na)vp~$rBF~b8NN^E(!x7uJ22o|jsiU4$58U;4x}+}5Sk28JnZ># zCjyG_W%?yl-Y3`#!9Cg+U_a zb@j?ZfW$2_BU@l(E`jrxQ6Sod&Xk!im402!!#3G@uyr$nldvuOjIg?4<~QOeMPLYT z%>$;qjPn&niiD3{F{3FoF_uVcq;TfV$(ue2{Z%9*p=a-WT4JCbIZaXWFD>NdR^DSc zI`iwT&1A`4D}*Ptl>|8re=#I4~VuaAO%akPRL|%e$ z0rIMWfIJ8wdHr%x<>9fWZ=U&yR&tS^WF(%p*HWZ--pJv1OF2J&qcksM^J06ocA0`? zJsQ*aae16A!^q0|$n5Z7h(=kB@Kaa;>7>N0XBu5wAn_WXr3AfkFt%}unAf&`L(2#| zU?e_a7&Di>jv!NIQ((nPkz*su@60tk$7?%g=igNzA~h02Y8jj+@fLa8A{H9PHplZk zGeZ>zz}w{Rm*@W)S7IZ4)wTHK276M2**vV8=y_iRMDy%Vx+nf(am0kYtE$S)oDQTH=A)3tD0d zGBCqehhr7}73O>JtX=jt_QiBWFa7XpBe|$CPybo;Z=3NqO2wcibsz*iB`zgC(L`>_ zCLT|JK@5ahKD585_;&X$NL%0vHQ*0>%T$n(VdoR!pA-^Q zPsidft(ot#KGy}2Hb0OFZoIuz^#YL_5S{T##R)W(Q2on)@b3~I*(f4{P z8y>*vIlu%`34hv?SN5|wy{ywTHZZi#2crFm-wUVK=9sRKE~NtF2UezSe$uqmB1?%$ zA@)bKYC&y}?TY%2)6ai>-*)QcWECJk{2ZV~%0~0@bcc-I`0X%B`_8lZT1iZ8EN5Vx zw>UM4@0_EwW-$jbmr1gP*QS#rcr{4B{hE!Hv>=@{#!gPc=&;@7Om4j}T^+=WT03KX z{$|d!3uVFiO_UiQViM=dkqqfg4n6aT7FeTloLvs|Qk{lwm41U#;s={&5djFc}g;)%voWC8UjW2bj zS{iM)YDq+D_oY({<`e^k0%dmWW%!0=QmS4Bh4;wIon?XT5`pL(JNDz?92F{Ep^W|@ z?wHu9lmW&gz5W|T`#7zk*+Vo-s&YUXwOwt=ty1G^@dZDpKLu3|Be)8zte4s#wUS3D zc#Gx+19bMl)x#(X^vK2Po`T9_$J?djwg)>Lt#!fChk4$o_Op!Dd>6kD(&SsJr}c%1 z$Vt}M3T2Oz@Gtn$A&7sxEnUcdAk}`l4m`RYSV7mIwt>8clINdS+$VhfK4=ZmV7&@4 zb+IYlO4}0e+NUqU8gL>2>$}~o`k-L17`AY%l8imNCe=c6B9B=Fz7mG4jL-LhV}S!$ zUvR8~*bqeTq?WV%?Z;ni#?Pd^cj~+cGHlJitOr2tZ}|)e+TjkuKCh(Pa2bJ2VFe)W z#=KX>Y@{_12e(8kT@nv24+2I%zt!-13mg`%d@pb8sug(9K%)y2{+Zc_oX|U|2_M>ItUP}K!kWO~p%65QAa$gDcL?zX zfg5nHE|lkILexq6ub7nj1XGa{iel7=<+FELPBZy~)XSVtEqSlHzS9d>FP&MZ@K8ll z-~~K+=XT!xL8u3`h<*z_3jwtBP?;{C z7jp~J=gWCfqVjS%j%UdMJ`^V}s5*%tk%)QCs679_wU|C0^12N^O)90 z?&_wM@9YFl`1_A7i*?V#e`JJ!I{XOWZ|@%qJ?p)F@2&%29cT7B^g$=!b7o%dBvIS< z(Rv<}rZc7^U`3MssWM54;|ckgPw+`Z#!Q4MW!;s$@CQv}gt- z%E+*R_=K7-Aw}~-Z^-Wnn%vSLin94D2Caj6 zynj8j;E#KsRi9B9@5G$x)wY_(yoWgy#lb3YXH5GA1w~p~)6Y2vA>G$}G*<6va30Y5 zsSDFxd|pzqYu_U%!az{gTw{PwE3MF^h?3I zO211YHa7SCA0AaCVk}}8TjCS8R%!PPv{-<1JJ~)rk?t*n>~BY1_o9u7zfWjM4%f~+ zd;E|jHY*z-$MXOpH_;=`YzxhoeG%qfP6M|>Eybl37viGB5HO^%SiFyH<=aj5K)O)z za`&|+LFzI%>6fuZnnErTqF%i-Rj_mjRvimXb;ZK;7J~)~!RXCR;?Do7q%HLhDHwt{s8}O|^@5;Yor=Z@+T? zXelWtcc&QZmveMO==@gA^}{n^G)cC2)R}!TPrsDg;kq8(v*E?byT}AtHb;t~VqK}E z@x^oic`AGJugb$0e`Ft&+B$Ws+Rv`2VS`fWr(mnclcDE5wf-`(Z_cMc3eV%z32@J) zf+1el(d=@Ks9)HKPQXl{@?UA_RIE4s%%TU3x@}iVlKEaX6XAcj*mP<~CGedt%6A33@sOt-QIx_R|*V{8XEiO=$Qe zFSg$&_lv{2&MMFvm3}wt#22aT**Rn8lhbypHdlaBmrVNqgxmA8Sq4R#EL4^r zUah7@&I}Z>*$uVyfmkVpkwDn2PSz#%5K7CPY|H^7iPM;pUekQZn>|;2m2{UTFmLeU zh_Uz_UxRc{K07Jq`tMR|g=llkr7Y1gISCCpCinfcJaU^Tq|b#^5|&m(Pdt2Jz<--+;E1t* zyXapa9KfQz_0|C-nrqUE;7Xk@jA}V+rmY#!9hmwn%is{yR_m7k(~*$oO8?{P$1kd; z8J>Z7WMuqt@R~9aYj(VE(;wSVt#V(>Vf(9#di1pQ7p2)IqraF* zR2&GlEmPf7NMPSgphNZ{yvUuUB(qB(Wp;z)uTjFS&$<4=A|!z!9zA?>ZD>jQyDr=sTL^3m#xj$#bqy z#xKCRkEKjP;X%EM>txK3DD&yiMAb!kL=ZF*`ea{$+?W-6WP&zkCq4e|S;EC(KfEc^ zNG>>Z8e6l2GJ!C|#?&LpEWrTr0wKrj*hO6#$N=;2dSvbB&p9;yTtqVr6me2brP!F; z!fy5uK?(w=zE3jA6x?wQwOmF~N1bbz z^3=*WSjxB!wuviP< zKyxC83D<-mJ6wPdoQf5>kLgE@9eKU)>hfFAG0eNROUcmT{TEr-4FV#DqX6IADcu)3 z@~W4@L3|jRNY3jk&>~5sAJU9oSsHR5rsbH<(@ZD!(`1&avWke0h6oKl=B%&z&| zO*PmN%E;Z?_!|xBg3$mzXOT#NrkU)41s#{4roUD$c#~0NA(w(5i`k1|4&)+&N>16V}p+x>$$}+yPqspX`G?MbZsyL z;RwSL4)*-^UDk-+s>*eD{;h?R#I}CJv?3+0NF`nhp~zZcy+;id{ks{S_ZqE^%FjT| z=L9~a9{3PF93L7FIC>JVKjm@d%bhjQyD&SQ5dQ;6_U6)%^{0_ImlA@$YiKP#hvQd* zyiPsFPnY_C!t1O4H-sK=LwVv%kM^~P`v;We9ADC_V|U94{v1PYlde^S|bAd ztGaUL5SJSp1zf*_%$JISn`RazBgj!a2;N5nett*4&vKWeK+n^P3SjSG8qar?O=ySW z8+lh56<}*HvH)K>L1vC*Hk!NBWHGk^n*?&dLU5El@9nEI)^|uL!j@=$5{~VT9=v1! zMr3vV1ls)RE#mcI zM+wM;dNPx0_=$du{prQO%0`q1fL?^YO0s)wp_VdHe4=hm8-ImNZVqt|Bqo}Hf`(0e^95am`@2Y36il7QZvy>xFBVUzN@3~WukSZ;KH7OoIceM_dzN&xzV;Gx8tTgmqacT*vK-dy!gL9#xRp3mV;?#v ziGg6wKb86X)J1!=<@Hb@$SOlKv2wV6H14JYay1s3WxqSSL43_>=|b?ScKd+uVj$o^ zB)7zNmd4!&Gc-6O*T2`0VN+Bc`nF(k`uB0rHCc!5EWxq`xJc#WMe9@#t-*4XI&eTT zfXtc#u{9eru3vZScrPz6gP`TFgaCI~yNR9s#qYM>PRo))e>N1@K)EwPOyeL`CirZ| zhtLBFR|<;u!!qn$^plArgHvqr8fwVHmY1Y zm;6+TCuNqUJHNJV_FWoV78)M=x;_By{Ob&0>^D}shUmMNpqbm&V-0VkXouVjO^(S=<2*x@*|ZTA@uO4^pgDx9K2FE;+UJx&uaDdW=5EV8fHE!4yEcU zKsz7*!t|(B#}hQnMx^l1!-QLVAEzGTWT@m`W{C-Hj-_g0Pz~r8ynW&S;W|jw`sgFLUK-|H9pB;l`ai(DDa*H?k9Jkxv3{2yEni&HNhr?vBRAqQG+A z*X0rp^8N4B*9IldJd;p72t z5AJ4BnLk>0z-DH>?Ap^?#wntiI@`FTDs5>Q=QQ1`tGr>{adSb;w7Wj7zMu}gYd{0? ze6H;?JZ9M@iI`+vdUH*MUPA@P&;)I2g6~m5LnOYQt20}^8oZyS``?<}Z_4KP7+Gt^ z4a%Pdx>~8y#<3IJ>b-12IF`ONscFc~NGdn)`=p->>}f?Y3zAcB3(58l3_WlnYBrzF z8Qp4Hl^%%jA`+o&%K+qI>=US>>lcyR+jZE&eLF>CJhw# z_7_;pMmaPTh0Q$NDT#TwT{7eCmWq2g9=E!t^z7bb{>=BnQGSqZK3Be!f+Rs7z&DA| zE>jS5g=01aIj`v;D^-baeHUcGec0}8DA(a*b(*R(w+8uyDR9*1M^(-^-d#^ZM|kN8 zM0%eUIe`$zB=sf~Jw8Mye;?*>NbEc=`o`+}D_M}%YCP$(CaDjK*k5DF*+(5>JKf3UKOMaej5W(Wc~4Y@0-*Z4*{a(Kbw0j)&JKEfH0ZWkvQt_NJ(boL;u@rx!=}vaOZny2ZUti zVEaG>cDg!s`B=Q?Z2w@PyWp!f^oVW6x?@+!-D|k&wWc`*u$ZF8%O^$NbF;d!_|` z?)}Df$S^x=$PnBrQs$n68)Lu0tSF_&sOI%g)a;RQuhCF(Am)IlSC~Ey^EDp+DuN>{ znoCOh#jY1uDVb>XZ>x>KO}u@Teki!tXh)P|-%zKObo~RP&thfP=`SNZ!$+?@Jf?eF zBuf7-*fjpxofA?^2l3}^wl=h@`~4~H8tJM(edyV+Srv;x(R))}z1uhTm1*%@RJ7d| zCBR+jGJXN;WU-7#lT&6mJNKv8Yg-5^l8_Pz`|QE9KTbX4Hj_EP3VF2)AS?RF-1k{J zx0OrA$X0VAu=M|4*sny#Gb+4jOy}}-b7|jn31C53yyZFR8fNp5_ev6qj3n?5@2=?c z$W3Xw@!GYfVI;?6Y}8;v#&Gihxb3dyv3rmt!bXUP@0a6roaP&i4RHhZ_oTG@4--{x zm=;#`!(*IZ{n5No!43&*V`7i!jC_3e; zU-|;(TA~By+Iw%|QptpJaYO68J_4nWB>5@zxH-}D^2N7Kg94w`w)a^^3(WXK(+dPd zX4BQ%R$?S#D&wg$lQHDZ1L)M3wyW1LwVTn)+|zNk2H9LjV73PYRX1g?wEt8Uz4v7J zqEl0!64P(>`N|FX6v>6a#e3LZf#>qn4}5vN+ubjf_`M+P$TcshhG=krM0UV0v&NBzlN&i@5Ib zJZqOoDAex{Za}4m`BKjl~?~WirP)j7``*EhcE0b9%79dIig5 zG~?($c53kQHSMFtW&$qKSKXLM*6V5G+1TIY?~hh)RQXW47KEs!eJW8d=@i3$&G%YO z(;&6xr~3p|GNY(jQm`T>3dsYHt=ax0=gGevsASJI=@vq8BE?E!=r8pTPCJS@Xvb5_ zo_FSf-8KFOJoY5~)93>VR)s_bwG_V6Z$j?%DKG6iDxiGI4A+SiwWd8$=M#NKN(PZ} z0D`lIfGdw#N-^UX#?b-YO$)8`^th1Qu! z_LQ!){6Q@Cs1RJJnyz%ZM(4+gCPkB1*u|s6472|9ES%0wtJV)?f*DkF-z`#7Zx{#?Eye3>@bHm&`sVXSR;gcWF-&64 zX9uZHv2B~JbEQR5bG3Gx`9xeNpu1t+A6$Tu;T0z5g&>GA=o@{~wy<@A9p?G2qHWH9 zrc~m%b&Bi36h?bwol^o;P#yqEw3!zX}O1c$J2z?2)aJI7a{J z(!d}(d!y1=&a3N8Y=nby&e&@8I($mE)1dd%=2d&NRMpq@D?#nQ>_I@*mr3`g$1FI~ zck(ckN%~%qOCR^$?><_)RH=4HsJ7(qdhRg6g@s$(sxR30iZB8Js0fzP|{lT1UCii) z+A3-mw`|70SkOWP|LnXnc;{fFV+?Hh<%h?wKFr#xU%cv6#}=8LpwetGovBWn;KayS ztQ;eWqX652H(<7b-$78jgVv4^48RFdVDMA3S?sCMv7N72pa64KY{`b?+=f5-k}hM| z^FH*zH9Aeovh>fM)pvWVAcD>27p?BtXKAHbWWkvitIAa+*J>n}XE-t-qD8&pe5wh4RU87AU zkR}$yEiPObt0x6PQx%M64Q|;~m|~1M6jJ`6$W*mgiT5>p)rvOth9!>3TEqhQGF`{` z|DIHTTq;hhwTTsa@PcrhFVi%*HKmmnAyR*?Zcsxt{x=w-9x$-qGzMOysyE~b2P0!* zdi=3O85=3KO6=tArFNsfGyJ#C1HzlK(**^tFuAkxDc-a*MnP}>D4HX!rK>&#-?3@^ zT+nwa=S76gygfDn_89!D;=42lo2LW{&Oc1v;^)ZX-$T=LcU0UCymQ$5F651a$i>(4 z9K18umz93~zew)5eQTBDqqlc>V{^K}-=mGncb&$_&RqjCT*p$S7NBVC2wxelhZ-Zq z2)axq-`F*}ua*-;kNr2|IrxUbJ64AM%t5`D1t;g*W-4&8ODpZMI-EBT}>%K8Bo6^Gv?QyvnrGx8ss)n z9$){W{y3#Q+ai=#?D3)419REN`BxTQ28%WDg>sS~gKx(x1rgGryZEVT-~e%v&-x^r zs)2QyFvjCwj>3mEG*?eKF{|P|=t|P;Oxfk^Rfp=gI;f2N)M39e9XtDPnrAp*bG)*| zGpi0Hv7LofJ}Q>%cD*5cQiV@*VHcFJNZqlmWN=kQmQds~i?G2!SCVx)%Q6kLse;7HA|!mPNDfY+YlGL0+-p2RCqh}T}S zesT~^8RVHr@T-p3X`bJ6{p`j6#4Lru{PV4P&`|oaf6z$D7Zs_ycfa>ZZ3WJjW?a0a zhvt7$^NqtGXes7p>-d|owEEH?>(2tOaFn;CYNN3iKE?P+az41O9e+axETmaEVX??w zef2am`P-wM;3!(5OV=O!JIGFnN_G?z<7eCJp-GEqk%|9w!uNha>M^bF*6E({&Mq*3OIRs+rC+{+_h4FcMnEOd34E1 z@KS=&U}f32@%4XmPzO@*K57Axqr$ZR7e8K|GQZKHS}W3>pn21bELr%UAB(lmV$mJ5 z2zkj#9eexd?OauA-7W&3A{r`qqEkYh|LY5$l=R~NH2nG*k)rEi(i&|P+vWV37#S|P z^Wn8^ydOPvfPvk6|>iL$L_Sh*TTTEUkES=DFep+q+6ev$Q@h1RDY`FFJn4+2{8E{)#3%B><9Q3X|{_~}mnnkb} zvp|2i->pI@3fhd5>H*pGz;h%kh3XPEGL(i}G~@alFb|8c?i)TX%`x_BQ~sV7v+6-) zU&615-!he|uC7;(TKu2#mgr+MJK#v;Y(bg{FK(W2JYp6oxRv2gQu?0Q(U9;0@8lkO zVeWJD7JW?7T%}s9(bsi0&8VJrB0zU?lJ>A3sUE2rXu8XWSFLSR=c`Su(3T zcXX(a?umr2`ibP|uz#pFR@bl2s{3#IuZpy#n283ZPawKPg%;N?!X2;yxSy=p3FJh0 zQ1-9VRDwIi9mYG?Dd0qU7I&_fpqQ~}qH3k;t@oCZwcGP`bO34hba%M7leqyGw?U zMmiisO1fd_W~58HbEG?m_#WPKzQ1RF!Cdpqti4z4weG#5KoEu67*#KL?8v(5v;bPf zYUG6CNx%rvE@2veD-6^&KA;KrT%EVe=TsF|S9isi25Ipa-&2K7xx5JmK+~m{yD31t z*QEVF;?`5#_<|ZUgi&N4uI1R;!uq?w31yOaN>n8z?pL8MfZmXJfU(#5nwg>GZLY|5L0MKkx9#luBpN)auQh2 zEv?)}Fh~*j(ygju4}>$L?$(%VMC08JYk?HXB8^sw4DRAU^S*sax+S(POwiC{U@hkA zDf4uM>$eLLoCe3EEmMW>Sw_l9O%DC!!2q$l2CRcF`0N)H65$uF8#wq^vx~eAWxb-WZjz2Le`u(xQq_(lI{o!DLB)KDC zEHCK_N0>98l3Lo9M!-%-!ozylt6Ou&pSd{SR2AKVHyu|YUQc$-{el)@gg&Vhp)$|VSs!zH1-KYiU?SMlsVO4m0N`g*;VhH(8MEO=UG zFiO2JTFY357$t@_xZ~Vnc*Jt?k9CZ$rI0e=ecj?X3S>%s{G0Wl{l8us07}tLX6UI( zOKP+P!@vAMPXssY4Hs{^-CA%KcOaT`CiDc5^&1w$sm?K;1W&!}w06P3iM*s2!bu^}h{m=rfnT8_Qd)0a_E9x{dWtUAigSG5=Lt%o>;4%;uq9(sV^E!zwn zX>xgdV{gNazE}ZaLb(2;kHUBVx#iJL@rdf>A1%WWQylX+fb=^N%_`A1$vzd7c*5*jU;)#=ol>F3o8Lx|!6-8b?IYQJ zwo0dbQ|`8g&txzGWN760Nc;u@jOMOM;VsoF+s{!xe&wQ0eQo%iF=+CK$VrX?C)%jC zv&ijudl?%mt;bKr_;?t_46H1dK7@Ww5j4g{K?skhlBKZ817 z1S2*j^2xhCAqO&!BY=_gx#0mgPpf9_5dZKao9Ei(hit$b0|GlXgv8J**c2lcxuo}a zHOs(hT*vZ=QFM_o!mwTlntZ^gT*!Gi%aFi++z#-Rt1Qssd}3$#+}A{`s`!H~fE8|M z=S5%*$BMljnJ;#5EXp`{9S+|(Nf=G?CoWhe?<-(2CG`31m`=5dRzY|-b>tUqA-Nb*@PdGYPM<5(5uYyFj zX9`=sWLp4?NX!I6&*e}6ovp4{j=WF_q-?rW{g}DtAb?rwCxdTfsY2nsyU}z-I;UQH zA((&FsL)u}tSSTC63WT~4BwGj%TXG$p5>*PY!T9#I)4-4I5(&O-ZDCNZWo4TBKA90 zwRK{L@jqCpD^ocv&0j#uf0obeKKBdT1tyVecm?g;ZUMfTZweXpbtm9V7Piwo4HCUd zzvb(46%wToAYC%JxM2I7R%QfC_ziuQ<9s>*!xhi=3G^RPr)lf|FN`c7a1*b7>dlD$ z1RF=P=QX$83v*I_J%1tBl1Ll;pTH&VmCa!MD~Kz2*!Hf^iBo$9q1FCi3%ynF2b)%U z`je_iLv*?VQcti|7XyVX2bvG-RZ0O-k~jVt<>B!GLSx!WbgZ*>y1*cZ)7bHY*XpD* zFZ@UL(6&*yOT}jFPE7Z3XO8oYgu?nztYEoA$^V#(I|A&klF<-{SBq!u_D+p>#!M|0$iznhCpwjPROc#cj6t#4d8feO97_NFg5AG7ZvQ&)V{*ORcZjZqM!q!mb1+ zjV}6bC|9;XUByaHi-c2A)}q4ubVrP&U@0r`S8-~ACImOU7XVY$&@g;i}vpYgy6CK@mZUu<^FEEr~2{~1b zF5|)Z!m9%AotU4;+LqSlab&n92bVsW{artbtIyD-a846$%!G$xwEK9~z~Yh|7a-H! zVd&4_mY>CfP+Y-tZjh#Xh)n4_aY`3`8EWk(5%4h!TX=O@?v3}qjoKI7CvB)?%X5x5 zFKt>FIq2iJUHcjU$q$m2dfsCBvCn|gYz?2I*`>amFM7UlF&6Y800)_OeHUC0q_q+< zQFCX9c~8W2B)O{Ywd0qua1c2;8qCxwApXaq^=Bx=9ybyx!Dy$t7K*i^OYR%RFu=By zgc)?3J;;8D59-Sc4-X92`aSzwrah=TPL$k1?M3!wPwNSmP5eNIPy1FtvS>ly9a`w+MKMm zuMK+n|Fy^}nX>dQwaX*Vjzwyi;pUKIN3#o?U;25|&?<(dZ6drH@!YuJeTyl) z0WFPf9Dr+p81ng;XhZu$s8(_@Xu58K+jax04r>mF>2nIBdDDzykjl6$bW))P;_k*{ z7BANd8$R6p2Lvnw=8ksq?VGRD6Q>z4)fskTxrBm*9QUib%_v)6^`v<|LRBLZXL9b> z{&-dx-g_rSy|<3lI<33CmLJLNemDX@jxX#CXw~x>h>(vaG}qje6j4CWce141V@do3y_z&=eer7_`STo>o} z290sK`4K;~u0IP%0|YLJ-w_|g)wEFpc+h*QDgfQRM2@H8<(IVa)`R6m7pp2P?G&bF zVSCo-vjjDXTKRQmbsnKnc0ZUZ*_&7E=;+(8T>ZIN1TX0>mOpQ4VviKy-;`&-79?Ne z%(y#lj=MXl8>iJ_tJsn{S&f~6rYMX|`n`wQFPy!<%vpIIp=pIaiF@cD6Hz&`{grgx ztV!{ERg(5Bja!jUOdYIEE!^WjkJ)&_n0=cU#c0xUZy@QVM9(Ay<2oH18b zn}9=}{1;o-IE~6yD?J&i656awT1#MWar>BZ1gSS|N1OZR5`+}QTG(LG2{ybY_k#Dg z)h|&#uXHy65ZyYabAR-NO?1f1sb`H77jmEDY4UfO`Dt*(KWyDJ&qwj$(VWH$&8|lb zg$<#Frfq8Zh8%@KBj1%- z(X23EtU=rhwrf{4gw;)zQd5+e2xl$tOwQL!sgJvJk^&CJ+X8?Uij-dk@XS01kPo%X zYRpfn7t}-6v1I)ATM5;|{^7bu8ArRe4x_~w1M*zU58}fUCss=h$fDeO6hXb}T3Iem zD{eu;fdhkR{QqsfEKVvw)PfCFFjlFl-qk>t0N^6NJC8*4Sj?IGoZe=3P8s}+)pJvb z0lhi-+9P9m%n9bcS!J8toZ^^QSuh_7Ln-Ev#84XW^9JOz#4a^`4jwu5wIzA|P#o%) z)&JW;F8ilw@Q0$&DTMR5##RGV!|A!4_1M-C|THE!?Bxx$`*s+%UBGNe{f~ z90|Eg(OiYTZPHqpj{S@s z4oON+q^o}6#k6E^4zz}RiN=i?5>^e()&hEEV1bQ;X zE+zFhykKixUrA<^jcOdtJt2Pwfs}%49G%@-Ew%A%?Em=B#*fjKM;MHax-|lfcZH7L zq)o`YnFJ}&3lKMEeB%fq4yUqt7l+Daj8MO<2rsUxBw)gf5rZAHHVwFsIn9Xon8 zkvxLAULAq!>}AeP7iKDWO|WRVqZf7QFK`@?J^wNr28>Yu%)RjE8vpuL4p?ft1p+r7 zsq$~MzPoXiX6`Q^kS>EYeuw5o%xrs4dViEUA8H!#db3)eU;xJljYdaGaVtwS|7^%TE=JG2Pk^X^khGX!#> zY0*$1V3m89zxzGc;JSv^{lbLb8H)ywObK1=10m~}4>iq2uh6#Qg_bmR4Td-S`SldJ zZ!kegOs!^fP&F`ye9^h_-)?4gQf}fx4tD9ZSo1a!TbJP7 zR63qcX)j7wfa7#a`2D(o;LI8LuB5DvDK6p%<=jnP^*z*Po%o3_hdB(S&G41gjfPL& zq2dR^#I~gc9#_O)zr#lQkTS{p_3Zd*4DCkE_Q{$`Nz+q%MrCl<4;Z@vG_Rl}>vyNB_9GKQ8m(bV* z>^-gpu&EEO6O$X6ROi}r3ufI4a>XbvyPU}KlGwKNceM4;(+jdivVG%#|dh>qniB7Rn z5O1*PCd;xhfNgu#(r=fC((m*sSKwcts~ffHQ!I7%l=)r6MEhAbSAcbc{i?z(=|Fo! z`+f>J;nX((Qz6Z*o2Q3^iRnlC8*Q!EAIcj%sp>By-*trgs zBFpUd22W~$f7yliPmfj^;-M&=4_nN$@Xh14&?8AX&u>TxFZ1@@pyJ2ByZo(os_CtS z*QOC5etSmDLaOzJ?Y649b9Lov1|8K+hwB|qtLNk4hUE@Gy8^Sp3BS)&t$AwXcNTW0 zYpFZkpB!lNaM0pVR2VIeXldwPp`*zwGOL-Rh-m3;Ad;zapZ4-6tNqzx&aolv4p7d% zB0krdh?Rlp@n(@@=IeAtqwM}v&onO$Xiz7v$HzGkFMy^$-gxolCd8&pdlSSEhnQIz zo^FYxt5pL$M~GtDKrC>mn-nN4;Lk5`uxAVK!s@JHdemu(TjYy5Q{Y`JCA>Bi=v?>+ zUt>J#(cvMLV$R+;=54(QLf?KVW33lrSnyESQfKUmA6V&7Fl$zYw7qJovwJ%}?8&bt zfuXh#enVDIpu#Mww1~8==nr4O@0&fL{w~!}=GgKSQ$W+ zJ$}#>DLs+Wu1&7Nrzohiy;vl1e0rSNA=~mPye6fxtSut|Tt41={B4z@kzprxJ>x+# z)s^~fuFJ4uQ`S zSDqF#8Ra18D!bo(-)cQgZD5}N5>!ke_{xXtDBfF{KKa~BiG`v?vEzLif~2g?fp_c0 z{rcqbq^>20fM;*ieE#I7x3sW$@R?6Z+?mUG>U<8*N0p{}A^nCvF|t|W_y_+T$zoMUPStF4tiX&B2pDOhzV91(7L_1>R@GJZaQa0n=r>Hu^bmkfoPn9_lRGKX*TTPiJw?cnF~ zux=Tkx2(XSgM(pPsRNX5q+GPIj%aQ{U94gx!2adfuh*)+(kkDY9*_oaTOuJ&*%MMPq~v9;`RnL6bh;kC-u_4Kigs9Hue*eIH%X;eFh>Oje~gG=y;umNQp>pHgf>BAOys zbw7Op#ulkr#7jHmtcE?|nM;j%7N$@v`nX&duj)$m}EgX{A3{8=@>W z0p(>ps!c~TUz<0yRc1l6<#AA}7>6e5`%|(F{s;)d>a9u1^hO%hx*D)oU3!`aL+mYE zTKZZE$XtGstM&5tA#iF*T&KhhuJP?O>4f(NWR#!GXx_(fYj`<1DGIMGsLWmc$e3*) zU=^yK<+}p+trX^h&U|!sd9D;aFI#HizvO)+p#jyEibmRfu6!*ybYrc!6l3+L*JA?A zz3-}u&Wzd5%@dZCZ*TsfQmb*|o`L+oi>qv$&Mlkyq%1qB2(R|@dw8t&ZqlOm^2m>( zepg$$o=1(>fes41JUCv$Ki3x+ADqFhNx7Vx)BPCYEHNfP5c`w-WSS5u)rB}GdfR_n zSX`oim7NlP>aXL_Vg`=9Od>V;>rr#xE{46NgzY%+Q<$0}U`v<|HPF3(98n*Tkq;6x z>T9Q|0$@ju$!tp3G2P*+d95@Ze9`fjDhJEn-_K5R=R{uNj_UXv@7+<-)rE_HXd2>f zQ0t|9lV?B^&4IGX+$bHxRHt>N;Y@}J(?JwTCX_m;o>zjezv210x7Qw871V&Z&(g>) zAv+hO&qCr|{gz3KGo0Yc*j^#qz?b~v?6ql`2{g6FzEYL^yZY<311Ej6pQJ5T=2DCA zev{%z245a3kt^a~E7>zR<}Rrd=_}TzOhcT^qFu<<1-~N?T^nBVZ)+6^^RurRhDlNQP{hZV$UX)eD252wxL$;txP5V7`?&WVITj2 zef7iSLk9-PA+|$~T#uNIzdDS2hr`DB8|C|dyKnk)Q*^6c821Lk+jNeOX_BY)`GTPL z=?)CcgnT8c&={vWWeIT;N~2XZXa)s(FC;~J=&vJAWS=6Qt;qrJI-6MNFeDHYXb z6LmwJwO{WBeBPYC5CcbC)sd@Ue|OTnp=?2>NqOiK&W4$Yx$4O~U&f!`cB6Y(H(dyZ z!XR9=aN4WF-dueb@7>(3-2=P=doC@nC~>(Kr66bkc*GB_IfsfayGIcJ%(RS5Tndgl zrn4Ilox=dR2C|#}nZY18kQkaFF@KEhQWR^{xU#YE^D=Xq9-V~GBZyw5V$qXtt|Cc% z^l|Ss1rky7GCJ)--h!lm#kyVxiBX$(B~thz9I7I?kb96jo{(<8IvI3?&3#EYyowF` zBIaDXA1{tsU0=Z)6^|zC$t(?sPn75I+`P;0Q=f)eTCKZUj;Hx`q-r$^*`{CkP-Lhu z-h9+YncYjs@_g#}&4UZ40{KP~#mny$ZxSh_iI5|7I^|9+>N#rL;y*jaj)1exN@eVA zE3%m;6LhIE0$#Dba(t7Q1f(7 z`e%mbUgkKA#B_Xa_>Lc8Yk6%r>{cDdDhet|zpa?t&Y@uIh;>Ga=kRcOI{KAuY_4Q@ z;4svHWaYQGar#Nl$4Kb_rBuM{#h}a!Gp|6lZE&4{NJF7iQwrBre*dPRDAtPwZ5;FV zxHfSY(j~RQTL$ny^@SWFb03XAVp>;LYSl**$;e=#CBCB^<_a!KNtb_C>_r<1-K0bf z7Dn;n?A64t2RVLMzvtOWqe<3RGjAf+2c{d{@dO zbK9$_zlyg@#EoySC@qJk(_x#ZnA`6pQm<2>dY+N?itu%4bs8&Jw6;tA!19~;QA(SN z%c@1huGLT)sl3HdUpmQVLa{e^xIr08>BM}kWf76uzmlgTVF|Of*nd55PA3O96`KDL zE<`Q>X3NQ6s>SouHoL{!f5lVTd&ZZgZN5;`qgD&&eB>Mtobwtkod*|?9`t(P<}D%M z4TTE9n06wB(&!d%&gpXCFDDN<;QnoL+5IDe2tE6@hbea!ns zlCi#1;1FsKWk=99Nc6cB`E<9JvM<$2X(`Kjwz@W);fLnhuTx5D&l|p0g{1UI)g)0~ zYn0X2?DOb1ja(^f;_wZOibtk&AHBld5Lv)|9Ys7?F^I!aLT*JoOQ_1ov-aoJj!Rap z41GLWJW1tgVsbnskQUd=5a5f`Xk+;Q?Dd=*HtvHDFeI~{YWAa^*dl&gvAMVylYcRaTzms7!OkW3?>qB- zv27m2bfU5AXWj?59ZV^xpyc`>Ogeyyq|4KJ`0dQyxMo|{zBL*)ls;;ILKq=$8T!2< zl4I`FuSQD6lT=dxn@9D-e3a#qb~PA(ig>CnB2-i>_Utr+f`D}B_MnMoaR{HPmg9(r zISw|agGQQt8#fr`AvR`x?w|dc_=#$;q3=znfoA4DIHfV3{=$_m5F7H3Dp;LiKk4$_q-j5U;-?__ULvtzXB_PHTGZ z+n5lwk-ci3vS5bqZbi;d)f;l;v<>zhpW>^6il}yu9|+c6f1F-(AgnUH$kv5frw%+C zd(5dXTssupN!)KDR>1JrFqgCVcP%-Ke2rYB)h0BbRGjdIqM}pYy33(dExxD|#8Yt|LQhhIA!sA; z1?#$FsgS6(gGG}o|Iiqo%Sn%?U0QGu&<1ofxVJVfF7(_y7$X_UFf%#Q8H{g7gT&y) z!>+4L+1jIMkHFYH!x#78$LS`22>uo&s7G+BIJ;YK9+Q#&6U`QE?DajhY!$({()%!u zQa&w`Jb%>p-5Yd4A+aCMXh&blwNF2Y;Dvu^10lEY+g+fD93$S6PV4I)y?FG+TV?pM zUxsGEz25t1CUT`Hd-_Ea?`#AUU3>puREVaLzK-Hh@~~YsTK<{dzex}M5GOCwCVbE; zJglxmPX)+K%=loVEYv*c>cYzlDy12rAs_M?^m;uOm3Cat?(_k1jP0RPtH1ZMPuQe3 zWQtkUzru=p*=rZ}$b1#70XM8ASbGhk@gXd2%{fH;cDtA1UM^>WlpC@)7&RLtn_fj3 zv57->;qPBz)-;>a4j<<9Pjf%=9n{ubNE6GQ_=i=JHU)sh=IEEvwrGi9SnU&KLMe_} z+a&bzZ++4BiH~Tm$L=xcXfz_&&&K%m3rNm5@gv<&j2rP2=G?I6mR=x@SC*?CPolw<7s@O#)!lF@+n zTovSBA2!aG`2+LnU=sEUkJIZ>d#$L`r(l+>H2~lsL{iD^2>HVYx^T_fHmj`RM6O0WKP>q&pR>jJrvgC-T#WTSogK z^psiTHsor26%&1%ptC4(>UcuE_p|sa&gQtz4{|l-pmoez)<@{O;~;eCj6UeV78Wc>Pe0? zj)ZF&UI}^$gYyoFHC{9oq08_`;5*K|O^B26pswo{b>^JRm_z1GyYgW`bz{Oi;yJr)H*d(`j$i`_D@C`2;E!^tP5}J^F9Jn&(9nG*FnX$g#S?_Q9qqNj_jwLdseZLXJd{bjY^iCE~YQ0cmS%#X_ z_ak65_rGJNC1&<0#6PO6sag8IK-Q)*R8%Pku>AWlgjqbj%~e^UjJJeHiKF53@_s)) zO6MrqIM2O@4*E*}J8Ts>U!VicjM{U_g2#1ELWk`H30Y}UwCOWtW|0%Vw9DCu$C@FW z?XnI9rsCCEh0Z$>4ia6?c~#UZ{Oe$EdlHsraFXu>WRNiinzh@HkY7`CLj`gh1O?=; zW7c&Dn-GohrCAy&p(DBolsEn=HT8%XWy}pKxOl|Hh)quEm?8$5b2XP-G)=Ll!U=K_ zOG~xiEg2)6aY(m|<|N2H8tDZFlFV`iBs1n-2OtMW2M5vC+4r^BkmXwLwhz~MjZ1h( zZi=?pWk2#^^awmE|MosYGQ#$cb>4t07Ud)#ac6VWAG=E%MS59^H(x;5YVEgQbl4j~ zTB294xjLT+R5Vsgy^jkgpZ>LgXrv|Svvo=|B?|I#@O?{aC>dTLhhns)rKEl27fY!sB zCC4AdBk*iwU4*7E(aVR9%XA)JNWZ_3?N%$b(d~0>Bp79x!su}+vCZ`ltv~qqZ;$s_ zZWUz|bq7Cu_9Oi;#jOlWd9zMm?z~d^Y8o-qRY$N|cx&axg950Dl8z+}air6jHC12H z20=808+4{-sB?O4CJnxML6gqvc>}t@eEIIKor06%ibc9>a^d4D!{Igt({Unb=9p31NGNOES2*|z@lWnfSQ=r4 z#remzHpBbjcnqd47yrOZWybt6t4fQFbEt&g~y5yfAc*pWxU!$14pH7H~{nJ14*i6 z#h@K@s($|-iixXXgy^8$w+h1>%(n#zBTp0<-o%yJq2HD!j!QqfEoj?pcZw_iyAK|-(Jh8=xi{XULt+in?(n7Yg-EX8Down0Y_|Q36vPAu*o0VF>e-z-t z`U!`v4l@i>-M%*cXKdYLR$^FjP0(Fc^+m>MtFw&$!qxBtyout|ww?7v;O}iA>EpRW z!|E|_lex8ekAL>U@ivtBG38)1DvIo-5Bd4-P@_>pj@sI_}w_- zn-4-h(`k=E9UBj0pDDTSnYtDBB&6H@IoHk5uGJ_#Y0$VBE+if@xsC4jLDAUC)EYNV zzaGT0VnHqsrz@CGDnb&Hi($vUG0q;p;_-I~#6LosHMa|d($v~JyDmYLV^7prXk-hQ zAM@V*p-Usw8*!2d9#iy~CD@s~&mQk_Ct1IaZYyNcWDhdheb@$_!8t&fdI$Tid!iT} z^CXHx58s?6(%-|C{8tTqk6opy$zj2*(c_=pkSCKQq)4UVOx@#$Xz1c;wdfr(R}$=t z=p9opq}RM9Xw>etuYx3==-2mjUFKF=Fm6qmO#h;S{I3EB(@?2o&`qF7mB-y)@>IY@ zwbQrF_RSYOOhgAcs1mZj)$Y@|Yx9go-B;6AqG(J*`4}AjgK7z&7XTb8uS(UbTx_KD;dNb#;y7SQ+kZ^w7T({0CGc|sPA!b@sNgWG;PI?neJCyngB;)`r+2N`##YNk27Xc z7NT)q$v5P^+xA4SVP*UtayJ=|ZaJG|ctg3n0CK-<9OoLj9L?~w8s{6iqL&ZYU@@M{$Z2JFcSuEzpmWe^>I-IDBW_si#d-T&*Q{#h_#bC&|N6&DvgDf*esT5-J=e^Nt=Ye`Hg{SX-fr=PfR~>BB4_1$`FInXH!ey!7S7Gpu z!mjmA(n>Gyk1~lQ6ottH__Bxq@rm1dYrDfwNL3U!$m=*;bU3EVpB48dxACT!fnv5b z<8(Di(DC&0fc5^dg;fMfDldHy){`kWbe%IIn+dB_N*#CbD+;CrU(n-yrH5%#^v+1u zbx}_uW3l7vrz#+uQrih>0UfBf2;mD+MLb3|l7g_Tg}lKWMhnDPS`;53N<5m(+)U0s z=dz+dGDzr18hb_X3QD8pA=4z}^0@eej3*G&Ac%R@>$HyqcLa8hi+F5UXEPz#Vor9| zx6DL1nESxtRhIF?mwF#88T1&B@QOq4Vj)x+Yys4};0yCUpxX@GKM0#}o?xz7ce?*< z+Tf!@XS)8;StxUJWRBq_vZ|p6gg>aMlgiROVaANyJUkMaLQWT=Hw{cn4pj)S_;QTn zQIe){f~A-uoGUmgE~PyO2M66qnf6C3V}KIkPGYp1Y8vsxRG>H;NK*Qiiiebli(H9j z7QNkpr!q6eJ5+(Xg1Dr22NxSGFIc6!s6a5l@h`r($6AZ-94P2m40b|HL-cEL5tYr4 zq902V@+BvRG$Z|}({xTGlY=*zmXAd5JNFk)q)0+&qwi?Zme0twGG;+Y~ zwYq-fB`7HPMWrIoASD&Lmzs$lg1I}wJ6Zh}*RFJ#9(ninJLM5&?cX@sN#l`RR8M{aO z!TZm9YvKQN=oADm?lU|6+ZRppWDc3>BQX}^%o#IAS9ZVF;?vI=+79%*oYt zT?#}{25k33S2u%T6%DbCgFOt^CVlj9rdErWF|7&KWb#xtFv*~7HGdLccS=YZ2ZL7 zoiMAl*2VuZ$a~piR-7_T7x;0Y+4tD+heF$Cp0uHW{Y<-x`Gn=2=H_N?2s}Q-8o83c z)~s6R{>o$4uyLd9IN-R`u*K8R!m22J{tkGRc3c#29saZLph6!3W=|!SktxNy@m9t% zzM$h`d_nUhn=W|fwg#ExZA3U`5r0BInVftgQ><)5hhWS}|FadwxDi~#?(|shculKb zTp#v!XUQ4^R+EP4P}|hpCp^1;EX0B;3~4>W;dC))PMG|#Fn{-~JdSJER-PqjOzHEm zH*em66Nk3npvU5*&trMz>>s(gH7)4`154m)h6iQLyL3{UfHNK(R$6`BHt$F{4Q!4A zIZh_%6&#hO+&zoCC2Xj&g!9#y?+1pB(h7IwfeA%X09P-l#7S*4!FE>FrXVHGCW{Xe zIY9{Ce5N{k&TAaDneBOX_x5YdYri2BwwV%y&kQ4*nVfWO$q0B&YHkJ1n4cANT4~(^ z-iOPL#b+4q9Z{h?npu%R;1jl)acGRrbg1^+54K|L96~E`paGf%w8MrD21Uw*j zLeaO+nb!=huAVk{F<-GmhL?|DjJjNhSb4f+7P4_QZGGq4~(Fo{1Dwq%O~2u zYz(F!Z~#8+Jy2oTlA1Ej;B)NhdsLaF^7e^-C2e21{lK?Hzl

8Qps2PiYIgzO=~u;$Th9wE8mER;5LBA47VNHv zb0mZCs`{6M%&n;O0o#~T;NCvG9K`3k^(PInV`0px%6RWTO%k&BSrf8nvnDNl+@Atk ziEab286S?>tTlny9Ac3ftsf=jAxzWfIB(Z!Yl0j&?t9nUd%YW(?uA@-Obm4YoZdFf z8%&#tNxqf%mUN!Xb1CdN$^~16ByE-$bPJ*s8u_30ZEj#Gc$IIg<0x6$==tHQ)2E%+KLP;TMpE5pOX6Hu=lk;5AEQ zn@>%Y^p&9d)8ALDnp?lNnUl$1sGDszm@xh2sh))gK5QO}jM-&DMi>}6;xCd9ygkLn zf?BV4Mw|kt=H?*Kgu%159>1XM>&G&O#fAWUoxBojE8Yy6u_D?U_Ozi`%M--$jG=8* zv^VAD<(0_#iZrTp>eC29Up9Kb@%`G4m$>_h!;Ou!U?5gP~?PY|e66azw+bx|U0oSYmVJJ;uU8dwTE)${(&XI*skr&r&-e441|7tVdF#`p?k7p;0u zp3$XNii@gszHbq;ALh(-k?xv9cw~ZPr#n*q06Ts4js^5ZL5wnJ)vrTO7OXkV&}48# z<+t~NHKkccmXbER`k&kACBbNx>$jQP|eQHuFm}Z`wEraL+!tL?G4lse)5J`my!lMm- zRS{UWGN<8Lb7MP5|xRJpvq&6b!VgQGXVt@UoMKw&VV6 zyF!2OjUbFR4Zcq3it(SGo<>|(O6W5024PItO(dY*SK9za>GeWsYbFC=^jN$ z?c2nf|K~LE>-`g>e@GQ1Im4FDRA?fzy}ccg^s#Dbc2nqhy#dVAuO_MJAtSNe|w2cU_5i}`&D>G#eSbUv~8JMTz_ra;M1)Z4!!Y|Tx ztr{giDC`we!rD@cr{#-D{VICIBKaXz!=pBmTvuD$>w}xydHA1rD+D2!KzxBQJZU7D z)O>ion9)@k%@Orc8p5(}@H2bx6uCPiZfGuGOz4$P=Sid6aoQlK$-k^d+7onV8fP>a z<3I{T|9IyF^O$*KqHmQjX*5ao+_nz+1>rq@EZr~PDmTCOia07)z^d~%aXS^5nGi5Q z#wBO<-7SBET(6GAgC}<{EGI7C3|Q3of1E>H_eJVX!%bN zGy22t5wPIDMB8zNaS>n!qRzhjwVDI2YgxPQ&0>DaB0nA_oa0I)cxEJoV0ytBCBC9n zt*zi5ztsfA0!p^oA*5e!{}d zawY>l^%b-&qwZlnFJwV{t6`Cs>C&Xu?MRE5z3C5(?U`IkF;HSp=6gmKgE!1_NNu#) z)F*Z53dxl2CtdLNM^4HebfUVg_N zm>0jl$Z)3V@3t8il;|Em)R(;B!v2toR1d#ZQU#G@P!a3F{v7HpE;3N0H-d) z@xy9JafwJekFxA2ayvzFNvB7rTghGK^&@e&?*4Ac!pr+#1qB7-KU9h|J!q;1{5o=z z6-n2k20fV3Lb2b)@a&xM=5S}1l%;Wp9g)2oV_v;wSzpT+t96lF2U7xR0cF4a%y+$% zX|ku8BhZO3dU$sTM+?d2ZaiJ+PLQfp1sZw#W7gt(4P$cXl#v);ip8waV>K-lC^mM! z!2Ux*e$AMY6^!ap_Qv7l6YqOjP9znUax$CJiV7pjk*_HuR>#GqrG8~P>?$ZF@3%DH zwY0QURumU!U@H?QQoM5zqdcY}CA~3pays@5R%Xmwf$K`)wF;z8X-r3GTt*JM!j{G~ zJWlRjz357+);TylgGuKml$4Y-;|VEgLcjfqMn*=G>F+3|OB2qz+=%%Upeyaj7)MAOcX0WADEL_#{f9;M$_ye%>(CF3Z zKC`??_GqnPtJ*BUBOX22-Mv+@t?iS*A0P;iPuXWzD4OCb-FsW&8xvUu#5_ZaG;RpJ zo2MNpQrv8>qTBQ*62oX~YHC7h&yew7H?V9xng3lH1q>I!1H7N|uHv=CoLkn17tE@?8LB+)Z%(6eJacef z=z|<%fYa42olGcg70nr!`}I1}nnR(Q(As!3t5Qyl>p{{JC%yedY= z6}ypX_Dp43gw^X*;J>%~(*u<8XZY~zJ-Ywr|L2AMpMMD>JYqI Date: Sun, 22 Feb 2026 08:32:30 +0100 Subject: [PATCH 8/9] chore: fix nerdzao-elite validation (frontmatter, When to Use) and sync generated files Co-authored-by: Cursor --- CATALOG.md | 32 +-- README.md | 14 +- data/aliases.json | 5 + data/bundles.json | 8 + data/catalog.json | 265 ++++++++++++++++++++-- skills/nerdzao-elite-gemini-high/SKILL.md | 4 + skills/nerdzao-elite/SKILL.md | 7 + skills_index.json | 90 +++++--- 8 files changed, 350 insertions(+), 75 deletions(-) diff --git a/CATALOG.md b/CATALOG.md index 2516fa29..2c2a6f6a 100644 --- a/CATALOG.md +++ b/CATALOG.md @@ -2,14 +2,14 @@ Generated at: 2026-02-08T00:00:00.000Z -Total skills: 883 +Total skills: 889 -## architecture (58) +## architecture (60) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | | `angular-state-management` | Master modern Angular state management with Signals, NgRx, and RxJS. Use when setting up global state, managing component stores, choosing between state solu... | angular, state | angular, state, signals, ngrx, rxjs, setting, up, global, managing, component, stores, choosing | -| `architect-review` | Master software architect specializing in modern architecture | | architect, review, software, specializing, architecture | +| `architect-review` | Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system desi... | | architect, review, software, specializing, architecture, clean, microservices, event, driven, ddd, reviews, designs | | `architecture` | Architectural decision-making framework. Requirements analysis, trade-off evaluation, ADR documentation. Use when making architecture decisions or analyzing ... | architecture | architecture, architectural, decision, making, framework, requirements, analysis, trade, off, evaluation, adr, documentation | | `architecture-decision-records` | Write and maintain Architecture Decision Records (ADRs) following best practices for technical decision documentation. Use when documenting significant techn... | architecture, decision, records | architecture, decision, records, write, maintain, adrs, following, technical, documentation, documenting, significant, decisions | | `avalonia-viewmodels-zafiro` | Optimal ViewModel and Wizard creation patterns for Avalonia using Zafiro and ReactiveUI. | avalonia, viewmodels, zafiro | avalonia, viewmodels, zafiro, optimal, viewmodel, wizard, creation, reactiveui | @@ -40,11 +40,13 @@ Total skills: 883 | `event-store-design` | Design and implement event stores for event-sourced systems. Use when building event sourcing infrastructure, choosing event store technologies, or implement... | event, store | event, store, stores, sourced, building, sourcing, infrastructure, choosing, technologies, implementing, persistence | | `game-development/multiplayer` | Multiplayer game development principles. Architecture, networking, synchronization. | game, development/multiplayer | game, development/multiplayer, multiplayer, development, principles, architecture, networking, synchronization | | `godot-gdscript-patterns` | Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization. Use when building Godot games, implementing game systems, or le... | godot, gdscript | godot, gdscript, including, signals, scenes, state, machines, optimization, building, games, implementing, game | +| `haskell-pro` | Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programm... | haskell | haskell, pro, engineer, specializing, type, pure, functional, high, reliability, software, proactively, level | | `hig-patterns` | > | hig | hig | | `i18n-localization` | Internationalization and localization patterns. Detecting hardcoded strings, managing translations, locale files, RTL support. | i18n, localization | i18n, localization, internationalization, detecting, hardcoded, strings, managing, translations, locale, files, rtl | | `inngest` | Inngest expert for serverless-first background jobs, event-driven workflows, and durable execution without managing queues or workers. Use when: inngest, ser... | inngest | inngest, serverless, first, background, jobs, event, driven, durable, execution, without, managing, queues | | `monorepo-architect` | Expert in monorepo architecture, build systems, and dependency management at scale. Masters Nx, Turborepo, Bazel, and Lerna for efficient multi-project devel... | monorepo | monorepo, architect, architecture, dependency, scale, masters, nx, turborepo, bazel, lerna, efficient, multi | | `multi-agent-patterns` | Master orchestrator, peer-to-peer, and hierarchical multi-agent architectures | multi, agent | multi, agent, orchestrator, peer, hierarchical, architectures | +| `nerdzao-elite` | Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation. | nerdzao, elite | nerdzao, elite, senior, software, engineer, 15, product, designer, full, planning, architecture, tdd | | `nx-workspace-patterns` | Configure and optimize Nx monorepo workspaces. Use when setting up Nx, configuring project boundaries, optimizing build caching, or implementing affected com... | nx, workspace | nx, workspace, configure, optimize, monorepo, workspaces, setting, up, configuring, boundaries, optimizing, caching | | `on-call-handoff-patterns` | Master on-call shift handoffs with context transfer, escalation procedures, and documentation. Use when transitioning on-call responsibilities, documenting s... | on, call, handoff | on, call, handoff, shift, handoffs, context, transfer, escalation, procedures, documentation, transitioning, responsibilities | | `parallel-agents` | Multi-agent orchestration patterns. Use when multiple independent tasks can run with different domain expertise or when comprehensive analysis requires multi... | parallel, agents | parallel, agents, multi, agent, orchestration, multiple, independent, tasks, run, different, domain, expertise | @@ -111,7 +113,7 @@ Total skills: 883 | `startup-metrics-framework` | This skill should be used when the user asks about \"key startup | startup, metrics, framework | startup, metrics, framework, skill, should, used, user, asks, about, key | | `whatsapp-automation` | Automate WhatsApp Business tasks via Rube MCP (Composio): send messages, manage templates, upload media, and handle contacts. Always search tools first for c... | whatsapp | whatsapp, automation, automate, business, tasks, via, rube, mcp, composio, send, messages, upload | -## data-ai (144) +## data-ai (143) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -173,7 +175,6 @@ Total skills: 883 | `cc-skill-clickhouse-io` | ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads. | cc, skill, clickhouse, io | cc, skill, clickhouse, io, database, query, optimization, analytics, data, engineering, high, performance | | `clarity-gate` | Pre-ingestion verification for epistemic quality in RAG systems with 9-point verification and Two-Round HITL workflow | clarity, gate | clarity, gate, pre, ingestion, verification, epistemic, quality, rag, point, two, round, hitl | | `code-documentation-doc-generate` | You are a documentation expert specializing in creating comprehensive, maintainable documentation from code. Generate API docs, architecture diagrams, user g... | code, documentation, doc, generate | code, documentation, doc, generate, specializing, creating, maintainable, api, docs, architecture, diagrams, user | -| `code-reviewer` | Elite code review expert specializing in modern AI-powered code | code | code, reviewer, elite, review, specializing, ai, powered | | `codex-review` | Professional code review with auto CHANGELOG generation, integrated with Codex AI | codex | codex, review, professional, code, auto, changelog, generation, integrated, ai | | `computer-use-agents` | Build AI agents that interact with computers like humans do - viewing screens, moving cursors, clicking buttons, and typing text. Covers Anthropic's Computer... | computer, use, agents | computer, use, agents, ai, interact, computers, like, humans, do, viewing, screens, moving | | `content-marketer` | Elite content marketing strategist specializing in AI-powered | content, marketer | content, marketer, elite, marketing, strategist, specializing, ai, powered | @@ -406,7 +407,7 @@ Total skills: 883 | `webapp-testing` | Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing... | webapp | webapp, testing, toolkit, interacting, local, web, applications, playwright, supports, verifying, frontend, functionality | | `zustand-store-ts` | Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state/action separation. Use when building React state management, creati... | zustand, store, ts | zustand, store, ts, stores, typescript, subscribewithselector, middleware, proper, state, action, separation, building | -## general (216) +## general (214) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -455,7 +456,7 @@ Total skills: 883 | `brand-guidelines-anthropic` | Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand co... | brand, guidelines, anthropic | brand, guidelines, anthropic, applies, official, colors, typography, any, sort, artifact, may, benefit | | `brand-guidelines-community` | Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand co... | brand, guidelines, community | brand, guidelines, community, applies, anthropic, official, colors, typography, any, sort, artifact, may | | `busybox-on-windows` | How to use a Win32 build of BusyBox to run many of the standard UNIX command line tools on Windows. | busybox, on, windows | busybox, on, windows, how, win32, run, many, standard, unix, command, line | -| `c-pro` | Write efficient C code with proper memory management, pointer | c | c, pro, write, efficient, code, proper, memory, pointer | +| `c-pro` | Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critica... | c | c, pro, write, efficient, code, proper, memory, pointer, arithmetic, calls, embedded, kernel | | `canvas-design` | Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art... | canvas | canvas, beautiful, visual, art, png, pdf, documents, philosophy, should, skill, user, asks | | `cc-skill-continuous-learning` | Development skill from everything-claude-code | cc, skill, continuous, learning | cc, skill, continuous, learning, development, everything, claude, code | | `cc-skill-project-guidelines-example` | Project Guidelines Skill (Example) | cc, skill, guidelines, example | cc, skill, guidelines, example | @@ -523,7 +524,6 @@ Total skills: 883 | `git-pushing` | Stage, commit, and push git changes with conventional commit messages. Use when user wants to commit and push changes, mentions pushing to remote, or asks to... | git, pushing | git, pushing, stage, commit, push, changes, conventional, messages, user, wants, mentions, remote | | `github-issue-creator` | Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error me... | github, issue, creator | github, issue, creator, convert, raw, notes, error, logs, voice, dictation, screenshots, crisp | | `graphql-architect` | Master modern GraphQL with federation, performance optimization, | graphql | graphql, architect, federation, performance, optimization | -| `haskell-pro` | Expert Haskell engineer specializing in advanced type systems, pure | haskell | haskell, pro, engineer, specializing, type, pure | | `hig-components-content` | > | hig, components, content | hig, components, content | | `hig-components-controls` | >- | hig, components, controls | hig, components, controls | | `hig-components-dialogs` | >- | hig, components, dialogs | hig, components, dialogs | @@ -560,7 +560,6 @@ Total skills: 883 | `micro-saas-launcher` | Expert in launching small, focused SaaS products fast - the indie hacker approach to building profitable software. Covers idea validation, MVP development, p... | micro, saas, launcher | micro, saas, launcher, launching, small, products, fast, indie, hacker, approach, building, profitable | | `minecraft-bukkit-pro` | Master Minecraft server plugin development with Bukkit, Spigot, and | minecraft, bukkit | minecraft, bukkit, pro, server, plugin, development, spigot | | `monorepo-management` | Master monorepo management with Turborepo, Nx, and pnpm workspaces to build efficient, scalable multi-package repositories with optimized builds and dependen... | monorepo | monorepo, turborepo, nx, pnpm, workspaces, efficient, scalable, multi, package, repositories, optimized, dependency | -| `multi-agent-brainstorming` | > | multi, agent, brainstorming | multi, agent, brainstorming | | `n8n-mcp-tools-expert` | Expert guide for using n8n-mcp MCP tools effectively. Use when searching for nodes, validating configurations, accessing templates, managing workflows, or us... | n8n, mcp | n8n, mcp, effectively, searching, nodes, validating, configurations, accessing, managing, any, provides, sele | | `nft-standards` | Implement NFT standards (ERC-721, ERC-1155) with proper metadata handling, minting strategies, and marketplace integration. Use when creating NFT contracts, ... | nft, standards | nft, standards, erc, 721, 1155, proper, metadata, handling, minting, marketplace, integration, creating | | `nosql-expert` | Expert guidance for distributed NoSQL databases (Cassandra, DynamoDB). Focuses on mental models, query-first modeling, single-table design, and avoiding hot ... | nosql | nosql, guidance, distributed, databases, cassandra, dynamodb, mental, models, query, first, modeling, single | @@ -592,7 +591,7 @@ Total skills: 883 | `reverse-engineer` | Expert reverse engineer specializing in binary analysis, | reverse | reverse, engineer, specializing, binary, analysis | | `scala-pro` | Master enterprise-grade Scala development with functional | scala | scala, pro, enterprise, grade, development, functional | | `schema-markup` | > | schema, markup | schema, markup | -| `search-specialist` | Expert web researcher using advanced search techniques and | search | search, web, researcher, techniques | +| `search-specialist` | Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles comp... | search | search, web, researcher, techniques, synthesis, masters, operators, result, filtering, multi, source, verification | | `sharp-edges` | Identify error-prone APIs and dangerous configurations | sharp, edges | sharp, edges, identify, error, prone, apis, dangerous, configurations | | `shellcheck-configuration` | Master ShellCheck static analysis configuration and usage for shell script quality. Use when setting up linting infrastructure, fixing code issues, or ensuri... | shellcheck, configuration | shellcheck, configuration, static, analysis, usage, shell, script, quality, setting, up, linting, infrastructure | | `shodan-reconnaissance` | This skill should be used when the user asks to "search for exposed devices on the internet," "perform Shodan reconnaissance," "find vulnerable services usin... | shodan, reconnaissance | shodan, reconnaissance, skill, should, used, user, asks, search, exposed, devices, internet, perform | @@ -700,7 +699,7 @@ Total skills: 883 | `observability-engineer` | Build production-ready monitoring, logging, and tracing systems. | observability | observability, engineer, monitoring, logging, tracing | | `observability-monitoring-monitor-setup` | You are a monitoring and observability expert specializing in implementing comprehensive monitoring solutions. Set up metrics collection, distributed tracing... | observability, monitoring, monitor, setup | observability, monitoring, monitor, setup, specializing, implementing, solutions, set, up, metrics, collection, distributed | | `observability-monitoring-slo-implement` | You are an SLO (Service Level Objective) expert specializing in implementing reliability standards and error budget-based practices. Design SLO frameworks, d... | observability, monitoring, slo, implement | observability, monitoring, slo, implement, level, objective, specializing, implementing, reliability, standards, error, budget | -| `performance-engineer` | Expert performance engineer specializing in modern observability, | performance | performance, engineer, specializing, observability | +| `performance-engineer` | Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distribut... | performance | performance, engineer, specializing, observability, application, optimization, scalable, masters, opentelemetry, distributed, tracing, load | | `performance-testing-review-ai-review` | You are an expert AI-powered code review specialist combining automated static analysis, intelligent pattern recognition, and modern DevOps practices. Levera... | performance, ai | performance, ai, testing, review, powered, code, combining, automated, static, analysis, intelligent, recognition | | `pipedrive-automation` | Automate Pipedrive CRM operations including deals, contacts, organizations, activities, notes, and pipeline management via Rube MCP (Composio). Always search... | pipedrive | pipedrive, automation, automate, crm, operations, including, deals, contacts, organizations, activities, notes, pipeline | | `prometheus-configuration` | Set up Prometheus for comprehensive metric collection, storage, and monitoring of infrastructure and applications. Use when implementing metrics collection, ... | prometheus, configuration | prometheus, configuration, set, up, metric, collection, storage, monitoring, infrastructure, applications, implementing, metrics | @@ -717,7 +716,7 @@ Total skills: 883 | `wireshark-analysis` | This skill should be used when the user asks to "analyze network traffic with Wireshark", "capture packets for troubleshooting", "filter PCAP files", "follow... | wireshark | wireshark, analysis, skill, should, used, user, asks, analyze, network, traffic, capture, packets | | `workflow-automation` | Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost... | | automation, infrastructure, makes, ai, agents, reliable, without, durable, execution, network, hiccup, during | -## security (88) +## security (95) | Skill | Description | Tags | Triggers | | --- | --- | --- | --- | @@ -743,11 +742,13 @@ Total skills: 883 | `clerk-auth` | Expert patterns for Clerk auth implementation, middleware, organizations, webhooks, and user sync Use when: adding authentication, clerk auth, user authentic... | clerk, auth | clerk, auth, middleware, organizations, webhooks, user, sync, adding, authentication, sign, up | | `cloud-penetration-testing` | This skill should be used when the user asks to "perform cloud penetration testing", "assess Azure or AWS or GCP security", "enumerate cloud resources", "exp... | cloud, penetration | cloud, penetration, testing, skill, should, used, user, asks, perform, assess, azure, aws | | `code-review-checklist` | Comprehensive checklist for conducting thorough code reviews covering functionality, security, performance, and maintainability | code, checklist | code, checklist, review, conducting, thorough, reviews, covering, functionality, security, performance, maintainability | +| `code-reviewer` | Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Mas... | code | code, reviewer, elite, review, specializing, ai, powered, analysis, security, vulnerabilities, performance, optimization | | `codebase-cleanup-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | codebase, cleanup, deps, audit | codebase, cleanup, deps, audit, dependency, security, specializing, vulnerability, scanning, license, compliance, supply | | `database-migration` | Execute database migrations across ORMs and platforms with zero-downtime strategies, data transformation, and rollback procedures. Use when migrating databas... | database, migration | database, migration, execute, migrations, orms, platforms, zero, downtime, data, transformation, rollback, procedures | | `database-migrations-sql-migrations` | SQL database migrations with zero-downtime strategies for | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime | database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime, zero, downtime | | `dependency-management-deps-audit` | You are a dependency security expert specializing in vulnerability scanning, license compliance, and supply chain security. Analyze project dependencies for ... | dependency, deps, audit | dependency, deps, audit, security, specializing, vulnerability, scanning, license, compliance, supply, chain, analyze | | `deployment-pipeline-design` | Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up... | deployment, pipeline | deployment, pipeline, multi, stage, ci, cd, pipelines, approval, gates, security, checks, orchestration | +| `design-orchestration` | Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature imp... | | orchestration, orchestrates, routing, work, through, brainstorming, multi, agent, review, execution, readiness, correct | | `devops-troubleshooter` | Expert DevOps troubleshooter specializing in rapid incident | devops, troubleshooter | devops, troubleshooter, specializing, rapid, incident | | `docker-expert` | Docker containerization expert with deep knowledge of multi-stage builds, image optimization, container security, Docker Compose orchestration, and productio... | docker | docker, containerization, deep, knowledge, multi, stage, image, optimization, container, security, compose, orchestration | | `dotnet-backend` | Build ASP.NET Core 8+ backend services with EF Core, auth, background jobs, and production API patterns. | dotnet, backend | dotnet, backend, asp, net, core, ef, auth, background, jobs, api | @@ -773,6 +774,7 @@ Total skills: 883 | `memory-forensics` | Master memory forensics techniques including memory acquisition, process analysis, and artifact extraction using Volatility and related tools. Use when analy... | memory, forensics | memory, forensics, techniques, including, acquisition, process, analysis, artifact, extraction, volatility, related, analyzing | | `mobile-security-coder` | Expert in secure mobile coding practices specializing in input | mobile, security, coder | mobile, security, coder, secure, coding, specializing, input | | `mtls-configuration` | Configure mutual TLS (mTLS) for zero-trust service-to-service communication. Use when implementing zero-trust networking, certificate management, or securing... | mtls, configuration | mtls, configuration, configure, mutual, tls, zero, trust, communication, implementing, networking, certificate, securing | +| `multi-agent-brainstorming` | Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-age... | multi, agent, brainstorming | multi, agent, brainstorming, skill, idea, requires, higher, confidence, risk, reduction, formal, review | | `nestjs-expert` | Nest.js framework expert specializing in module architecture, dependency injection, middleware, guards, interceptors, testing with Jest/Supertest, TypeORM/Mo... | nestjs | nestjs, nest, js, framework, specializing, module, architecture, dependency, injection, middleware, guards, interceptors | | `nextjs-supabase-auth` | Expert integration of Supabase Auth with Next.js App Router Use when: supabase auth next, authentication next.js, login supabase, auth middleware, protected ... | nextjs, supabase, auth | nextjs, supabase, auth, integration, next, js, app, router, authentication, login, middleware, protected | | `nodejs-best-practices` | Node.js development principles and decision-making. Framework selection, async patterns, security, and architecture. Teaches thinking, not copying. | nodejs, best, practices | nodejs, best, practices, node, js, development, principles, decision, making, framework, selection, async | @@ -797,6 +799,10 @@ Total skills: 883 | `security-scanning-security-dependencies` | You are a security expert specializing in dependency vulnerability analysis, SBOM generation, and supply chain security. Scan project dependencies across eco... | security, scanning, dependencies | security, scanning, dependencies, specializing, dependency, vulnerability, analysis, sbom, generation, supply, chain, scan | | `security-scanning-security-hardening` | Coordinate multi-layer security scanning and hardening across application, infrastructure, and compliance controls. | security, scanning, hardening | security, scanning, hardening, coordinate, multi, layer, application, infrastructure, compliance, controls | | `security-scanning-security-sast` | Static Application Security Testing (SAST) for code vulnerability | security, scanning, sast | security, scanning, sast, static, application, testing, code, vulnerability | +| `security/aws-compliance-checker` | Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks | aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli | aws, compliance, audit, cis, pci-dss, hipaa, kiro-cli, checker, automated, checking, against, pci | +| `security/aws-iam-best-practices` | IAM policy review, hardening, and least privilege implementation | aws, iam, security, access-control, kiro-cli, least-privilege | aws, iam, security, access-control, kiro-cli, least-privilege, policy, review, hardening, least, privilege | +| `security/aws-secrets-rotation` | Automate AWS secrets rotation for RDS, API keys, and credentials | aws, secrets-manager, security, automation, kiro-cli, credentials | aws, secrets-manager, security, automation, kiro-cli, credentials, secrets, rotation, automate, rds, api, keys | +| `security/aws-security-audit` | Comprehensive AWS security posture assessment using AWS CLI and security best practices | aws, security, audit, compliance, kiro-cli, security-assessment | aws, security, audit, compliance, kiro-cli, security-assessment, posture, assessment, cli | | `service-mesh-expert` | Expert service mesh architect specializing in Istio, Linkerd, and cloud-native networking patterns. Masters traffic management, security policies, observabil... | service, mesh | service, mesh, architect, specializing, istio, linkerd, cloud, native, networking, masters, traffic, security | | `solidity-security` | Master smart contract security best practices to prevent common vulnerabilities and implement secure Solidity patterns. Use when writing smart contracts, aud... | solidity, security | solidity, security, smart, contract, prevent, common, vulnerabilities, secure, writing, contracts, auditing, existing | | `stride-analysis-patterns` | Apply STRIDE methodology to systematically identify threats. Use when analyzing system security, conducting threat modeling sessions, or creating security do... | stride | stride, analysis, apply, methodology, systematically, identify, threats, analyzing, security, conducting, threat, modeling | @@ -877,7 +883,6 @@ Total skills: 883 | `convertkit-automation` | Automate ConvertKit (Kit) tasks via Rube MCP (Composio): manage subscribers, tags, broadcasts, and broadcast stats. Always search tools first for current sch... | convertkit | convertkit, automation, automate, kit, tasks, via, rube, mcp, composio, subscribers, tags, broadcasts | | `crewai` | Expert in CrewAI - the leading role-based multi-agent framework used by 60% of Fortune 500 companies. Covers agent design with roles and goals, task definiti... | crewai | crewai, leading, role, multi, agent, framework, used, 60, fortune, 500, companies, covers | | `datadog-automation` | Automate Datadog tasks via Rube MCP (Composio): query metrics, search logs, manage monitors/dashboards, create events and downtimes. Always search tools firs... | datadog | datadog, automation, automate, tasks, via, rube, mcp, composio, query, metrics, search, logs | -| `design-orchestration` | > | | orchestration | | `discord-automation` | Automate Discord tasks via Rube MCP (Composio): messages, channels, roles, webhooks, reactions. Always search tools first for current schemas. | discord | discord, automation, automate, tasks, via, rube, mcp, composio, messages, channels, roles, webhooks | | `docusign-automation` | Automate DocuSign tasks via Rube MCP (Composio): templates, envelopes, signatures, document management. Always search tools first for current schemas. | docusign | docusign, automation, automate, tasks, via, rube, mcp, composio, envelopes, signatures, document, always | | `dropbox-automation` | Automate Dropbox file management, sharing, search, uploads, downloads, and folder operations via Rube MCP (Composio). Always search tools first for current s... | dropbox | dropbox, automation, automate, file, sharing, search, uploads, downloads, folder, operations, via, rube | @@ -902,6 +907,7 @@ Total skills: 883 | `miro-automation` | Automate Miro tasks via Rube MCP (Composio): boards, items, sticky notes, frames, sharing, connectors. Always search tools first for current schemas. | miro | miro, automation, automate, tasks, via, rube, mcp, composio, boards, items, sticky, notes | | `mixpanel-automation` | Automate Mixpanel tasks via Rube MCP (Composio): events, segmentation, funnels, cohorts, user profiles, JQL queries. Always search tools first for current sc... | mixpanel | mixpanel, automation, automate, tasks, via, rube, mcp, composio, events, segmentation, funnels, cohorts | | `monday-automation` | Automate Monday.com work management including boards, items, columns, groups, subitems, and updates via Rube MCP (Composio). Always search tools first for cu... | monday | monday, automation, automate, com, work, including, boards, items, columns, groups, subitems, updates | +| `nerdzao-elite-gemini-high` | Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade máxima e eficiência de tokens. | nerdzao, elite, gemini, high | nerdzao, elite, gemini, high, modo, coder, ux, pixel, perfect, otimizado, especificamente, para | | `notion-automation` | Automate Notion tasks via Rube MCP (Composio): pages, databases, blocks, comments, users. Always search tools first for current schemas. | notion | notion, automation, automate, tasks, via, rube, mcp, composio, pages, databases, blocks, comments | | `one-drive-automation` | Automate OneDrive file management, search, uploads, downloads, sharing, permissions, and folder operations via Rube MCP (Composio). Always search tools first... | one, drive | one, drive, automation, automate, onedrive, file, search, uploads, downloads, sharing, permissions, folder | | `outlook-automation` | Automate Outlook tasks via Rube MCP (Composio): emails, calendar, contacts, folders, attachments. Always search tools first for current schemas. | outlook | outlook, automation, automate, tasks, via, rube, mcp, composio, emails, calendar, contacts, folders | diff --git a/README.md b/README.md index 24a5086c..75ba736c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 🌌 Antigravity Awesome Skills: 887+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More +# 🌌 Antigravity Awesome Skills: 889+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More -> **The Ultimate Collection of 887+ Universal Agentic Skills for AI Coding Assistants — Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** +> **The Ultimate Collection of 889+ Universal Agentic Skills for AI Coding Assistants — Claude Code, Gemini CLI, Codex CLI, Antigravity IDE, GitHub Copilot, Cursor, OpenCode, AdaL** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Claude Code](https://img.shields.io/badge/Claude%20Code-Anthropic-purple)](https://claude.ai) @@ -17,7 +17,7 @@ If this project helps you, you can [support it here](https://buymeacoffee.com/sickn33) or simply ⭐ the repo. -**Antigravity Awesome Skills** is a curated, battle-tested library of **887 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: +**Antigravity Awesome Skills** is a curated, battle-tested library of **889 high-performance agentic skills** designed to work seamlessly across all major AI coding assistants: - 🟣 **Claude Code** (Anthropic CLI) - 🔵 **Gemini CLI** (Google DeepMind) @@ -41,7 +41,7 @@ This repository provides essential skills to transform your AI assistant into a - [🎁 Curated Collections (Bundles)](#curated-collections) - [🧭 Antigravity Workflows](#antigravity-workflows) - [📦 Features & Categories](#features--categories) -- [📚 Browse 887+ Skills](#browse-887-skills) +- [📚 Browse 889+ Skills](#browse-889-skills) - [🤝 How to Contribute](#how-to-contribute) - [🤝 Community](#community) - [☕ Support the Project](#support-the-project) @@ -318,7 +318,7 @@ The repository is organized into specialized domains to transform your AI into a Counts change as new skills are added. For the current full registry, see [CATALOG.md](CATALOG.md). -## Browse 887+ Skills +## Browse 889+ Skills We have moved the full skill registry to a dedicated catalog to keep this README clean. @@ -480,6 +480,10 @@ We officially thank the following contributors for their help in making this rep - [@Nguyen-Van-Chan](https://github.com/Nguyen-Van-Chan) - [@8hrsk](https://github.com/8hrsk) - [@Wittlesus](https://github.com/Wittlesus) +- [@Vonfry](https://github.com/Vonfry) +- [@ssumanbiswas](https://github.com/ssumanbiswas) +- [@amartelr](https://github.com/amartelr) +- [@fernandorych](https://github.com/fernandorych) --- diff --git a/data/aliases.json b/data/aliases.json index e23fb537..c585b759 100644 --- a/data/aliases.json +++ b/data/aliases.json @@ -93,6 +93,11 @@ "security-scanning-dependencies": "security-scanning-security-dependencies", "security-scanning-hardening": "security-scanning-security-hardening", "security-scanning-sast": "security-scanning-security-sast", + "aws-compliance-checker": "security/aws-compliance-checker", + "aws-iam-best-practices": "security/aws-iam-best-practices", + "security/aws-iam-practices": "security/aws-iam-best-practices", + "aws-secrets-rotation": "security/aws-secrets-rotation", + "aws-security-audit": "security/aws-security-audit", "startup-business-case": "startup-business-analyst-business-case", "startup-business-projections": "startup-business-analyst-financial-projections", "startup-business-opportunity": "startup-business-analyst-market-opportunity", diff --git a/data/bundles.json b/data/bundles.json index 0fa7a83f..018f7f49 100644 --- a/data/bundles.json +++ b/data/bundles.json @@ -163,6 +163,7 @@ "ruby-pro", "rust-async-patterns", "rust-pro", + "security/aws-secrets-rotation", "senior-architect", "senior-fullstack", "shopify-apps", @@ -213,9 +214,11 @@ "clerk-auth", "cloud-penetration-testing", "code-review-checklist", + "code-reviewer", "codebase-cleanup-deps-audit", "dependency-management-deps-audit", "deployment-pipeline-design", + "design-orchestration", "docker-expert", "dotnet-backend", "ethical-hacking-methodology", @@ -233,6 +236,7 @@ "linkerd-patterns", "loki-mode", "mobile-security-coder", + "multi-agent-brainstorming", "nestjs-expert", "nextjs-supabase-auth", "nodejs-best-practices", @@ -253,6 +257,10 @@ "security-scanning-security-dependencies", "security-scanning-security-hardening", "security-scanning-security-sast", + "security/aws-compliance-checker", + "security/aws-iam-best-practices", + "security/aws-secrets-rotation", + "security/aws-security-audit", "service-mesh-expert", "solidity-security", "stride-analysis-patterns", diff --git a/data/catalog.json b/data/catalog.json index 37c59b90..b0c71606 100644 --- a/data/catalog.json +++ b/data/catalog.json @@ -1,6 +1,6 @@ { "generatedAt": "2026-02-08T00:00:00.000Z", - "total": 883, + "total": 889, "skills": [ { "id": "3d-web-experience", @@ -1055,7 +1055,7 @@ { "id": "architect-review", "name": "architect-review", - "description": "Master software architect specializing in modern architecture", + "description": "Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions.", "category": "architecture", "tags": [], "triggers": [ @@ -1063,7 +1063,14 @@ "review", "software", "specializing", - "architecture" + "architecture", + "clean", + "microservices", + "event", + "driven", + "ddd", + "reviews", + "designs" ], "path": "skills/architect-review/SKILL.md" }, @@ -4768,7 +4775,7 @@ { "id": "c-pro", "name": "c-pro", - "description": "Write efficient C code with proper memory management, pointer", + "description": "Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming.", "category": "general", "tags": [ "c" @@ -4781,7 +4788,11 @@ "code", "proper", "memory", - "pointer" + "pointer", + "arithmetic", + "calls", + "embedded", + "kernel" ], "path": "skills/c-pro/SKILL.md" }, @@ -5783,8 +5794,8 @@ { "id": "code-reviewer", "name": "code-reviewer", - "description": "Elite code review expert specializing in modern AI-powered code", - "category": "data-ai", + "description": "Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code quality assurance.", + "category": "security", "tags": [ "code" ], @@ -5795,7 +5806,12 @@ "review", "specializing", "ai", - "powered" + "powered", + "analysis", + "security", + "vulnerabilities", + "performance", + "optimization" ], "path": "skills/code-reviewer/SKILL.md" }, @@ -7669,11 +7685,22 @@ { "id": "design-orchestration", "name": "design-orchestration", - "description": ">", - "category": "workflow", + "description": "Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, skipped validation, and unreviewed high-risk designs.", + "category": "security", "tags": [], "triggers": [ - "orchestration" + "orchestration", + "orchestrates", + "routing", + "work", + "through", + "brainstorming", + "multi", + "agent", + "review", + "execution", + "readiness", + "correct" ], "path": "skills/design-orchestration/SKILL.md" }, @@ -10536,8 +10563,8 @@ { "id": "haskell-pro", "name": "haskell-pro", - "description": "Expert Haskell engineer specializing in advanced type systems, pure", - "category": "general", + "description": "Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.", + "category": "architecture", "tags": [ "haskell" ], @@ -10547,7 +10574,13 @@ "engineer", "specializing", "type", - "pure" + "pure", + "functional", + "high", + "reliability", + "software", + "proactively", + "level" ], "path": "skills/haskell-pro/SKILL.md" }, @@ -13147,8 +13180,8 @@ { "id": "multi-agent-brainstorming", "name": "multi-agent-brainstorming", - "description": ">", - "category": "general", + "description": "Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent has a strict, non-overlapping role. It prevents blind spots, false confidence, and premature convergence.", + "category": "security", "tags": [ "multi", "agent", @@ -13157,7 +13190,16 @@ "triggers": [ "multi", "agent", - "brainstorming" + "brainstorming", + "skill", + "idea", + "requires", + "higher", + "confidence", + "risk", + "reduction", + "formal", + "review" ], "path": "skills/multi-agent-brainstorming/SKILL.md" }, @@ -13356,6 +13398,58 @@ ], "path": "skills/neon-postgres/SKILL.md" }, + { + "id": "nerdzao-elite", + "name": "nerdzao-elite", + "description": "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation.", + "category": "architecture", + "tags": [ + "nerdzao", + "elite" + ], + "triggers": [ + "nerdzao", + "elite", + "senior", + "software", + "engineer", + "15", + "product", + "designer", + "full", + "planning", + "architecture", + "tdd" + ], + "path": "skills/nerdzao-elite/SKILL.md" + }, + { + "id": "nerdzao-elite-gemini-high", + "name": "nerdzao-elite-gemini-high", + "description": "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade máxima e eficiência de tokens.", + "category": "workflow", + "tags": [ + "nerdzao", + "elite", + "gemini", + "high" + ], + "triggers": [ + "nerdzao", + "elite", + "gemini", + "high", + "modo", + "coder", + "ux", + "pixel", + "perfect", + "otimizado", + "especificamente", + "para" + ], + "path": "skills/nerdzao-elite-gemini-high/SKILL.md" + }, { "id": "nestjs-expert", "name": "nestjs-expert", @@ -14257,7 +14351,7 @@ { "id": "performance-engineer", "name": "performance-engineer", - "description": "Expert performance engineer specializing in modern observability,", + "description": "Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user monitoring, and scalability patterns. Use PROACTIVELY for performance optimization, observability, or scalability challenges.", "category": "infrastructure", "tags": [ "performance" @@ -14266,7 +14360,15 @@ "performance", "engineer", "specializing", - "observability" + "observability", + "application", + "optimization", + "scalable", + "masters", + "opentelemetry", + "distributed", + "tracing", + "load" ], "path": "skills/performance-engineer/SKILL.md" }, @@ -16199,7 +16301,7 @@ { "id": "search-specialist", "name": "search-specialist", - "description": "Expert web researcher using advanced search techniques and", + "description": "Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis.", "category": "general", "tags": [ "search" @@ -16208,7 +16310,15 @@ "search", "web", "researcher", - "techniques" + "techniques", + "synthesis", + "masters", + "operators", + "result", + "filtering", + "multi", + "source", + "verification" ], "path": "skills/search-specialist/SKILL.md" }, @@ -16398,6 +16508,119 @@ ], "path": "skills/security-scanning-security-sast/SKILL.md" }, + { + "id": "security/aws-compliance-checker", + "name": "aws-compliance-checker", + "description": "Automated compliance checking against CIS, PCI-DSS, HIPAA, and SOC 2 benchmarks", + "category": "security", + "tags": [ + "aws", + "compliance", + "audit", + "cis", + "pci-dss", + "hipaa", + "kiro-cli" + ], + "triggers": [ + "aws", + "compliance", + "audit", + "cis", + "pci-dss", + "hipaa", + "kiro-cli", + "checker", + "automated", + "checking", + "against", + "pci" + ], + "path": "skills/security/aws-compliance-checker/SKILL.md" + }, + { + "id": "security/aws-iam-best-practices", + "name": "aws-iam-best-practices", + "description": "IAM policy review, hardening, and least privilege implementation", + "category": "security", + "tags": [ + "aws", + "iam", + "security", + "access-control", + "kiro-cli", + "least-privilege" + ], + "triggers": [ + "aws", + "iam", + "security", + "access-control", + "kiro-cli", + "least-privilege", + "policy", + "review", + "hardening", + "least", + "privilege" + ], + "path": "skills/security/aws-iam-best-practices/SKILL.md" + }, + { + "id": "security/aws-secrets-rotation", + "name": "aws-secrets-rotation", + "description": "Automate AWS secrets rotation for RDS, API keys, and credentials", + "category": "security", + "tags": [ + "aws", + "secrets-manager", + "security", + "automation", + "kiro-cli", + "credentials" + ], + "triggers": [ + "aws", + "secrets-manager", + "security", + "automation", + "kiro-cli", + "credentials", + "secrets", + "rotation", + "automate", + "rds", + "api", + "keys" + ], + "path": "skills/security/aws-secrets-rotation/SKILL.md" + }, + { + "id": "security/aws-security-audit", + "name": "aws-security-audit", + "description": "Comprehensive AWS security posture assessment using AWS CLI and security best practices", + "category": "security", + "tags": [ + "aws", + "security", + "audit", + "compliance", + "kiro-cli", + "security-assessment" + ], + "triggers": [ + "aws", + "security", + "audit", + "compliance", + "kiro-cli", + "security-assessment", + "posture", + "assessment", + "cli" + ], + "path": "skills/security/aws-security-audit/SKILL.md" + }, { "id": "segment-automation", "name": "segment-automation", diff --git a/skills/nerdzao-elite-gemini-high/SKILL.md b/skills/nerdzao-elite-gemini-high/SKILL.md index 84f64fd2..e05013b6 100644 --- a/skills/nerdzao-elite-gemini-high/SKILL.md +++ b/skills/nerdzao-elite-gemini-high/SKILL.md @@ -44,3 +44,7 @@ Ative automaticamente este workflow completo em TODA tarefa: - Priorize: pixel-perfect + código limpo + performance + segurança. Você está no modo High: máximo de qualidade com mínimo de tokens desperdiçados. + +## When to Use + +Use when you need maximum quality output with Gemini 3.1 Pro High, pixel-perfect UI, and token-efficient workflow. diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md index c055b8a2..ab772998 100644 --- a/skills/nerdzao-elite/SKILL.md +++ b/skills/nerdzao-elite/SKILL.md @@ -1,3 +1,10 @@ +--- +name: nerdzao-elite +description: "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation." +risk: safe +source: community +--- + # @nerdzao-elite Você é um Engenheiro de Software Sênior Elite (15+ anos) + Designer de Produto Senior. diff --git a/skills_index.json b/skills_index.json index 1366a2d7..7c986794 100644 --- a/skills_index.json +++ b/skills_index.json @@ -399,10 +399,10 @@ "id": "architect-review", "path": "skills/architect-review", "category": "uncategorized", - "name": "Architect Review", - "description": "You are a master software architect specializing in modern software architecture patterns, clean architecture principles, and distributed systems design.", + "name": "architect-review", + "description": "Master software architect specializing in modern architecture patterns, clean architecture, microservices, event-driven systems, and DDD. Reviews system designs and code changes for architectural integrity, scalability, and maintainability. Use PROACTIVELY for architectural decisions.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "architecture", @@ -1947,10 +1947,10 @@ "id": "c-pro", "path": "skills/c-pro", "category": "uncategorized", - "name": "C Pro", - "description": "- Working on c pro tasks or workflows - Needing guidance, best practices, or checklists for c pro", + "name": "c-pro", + "description": "Write efficient C code with proper memory management, pointer arithmetic, and system calls. Handles embedded systems, kernel modules, and performance-critical code. Use PROACTIVELY for C optimization, memory issues, or system programming.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "c4-code", @@ -2258,15 +2258,6 @@ "risk": "unknown", "source": "community" }, - { - "id": "code-reviewer", - "path": "skills/code-reviewer", - "category": "uncategorized", - "name": "Code Reviewer", - "description": "- Working on code reviewer tasks or workflows - Needing guidance, best practices, or checklists for code reviewer", - "risk": "unknown", - "source": "unknown" - }, { "id": "code-documentation-code-explain", "path": "skills/code-documentation-code-explain", @@ -2339,6 +2330,15 @@ "risk": "unknown", "source": "community" }, + { + "id": "code-reviewer", + "path": "skills/code-reviewer", + "category": "uncategorized", + "name": "code-reviewer", + "description": "Elite code review expert specializing in modern AI-powered code analysis, security vulnerabilities, performance optimization, and production reliability. Masters static analysis tools, security scanning, and configuration review with 2024/2025 best practices. Use PROACTIVELY for code quality assurance.", + "risk": "unknown", + "source": "community" + }, { "id": "codebase-cleanup-deps-audit", "path": "skills/codebase-cleanup-deps-audit", @@ -3068,15 +3068,6 @@ "risk": "unknown", "source": "community" }, - { - "id": "design-orchestration", - "path": "skills/design-orchestration", - "category": "uncategorized", - "name": "Design Orchestration", - "description": "Ensure that **ideas become designs**, **designs are reviewed**, and **only validated designs reach implementation**.", - "risk": "unknown", - "source": "unknown" - }, { "id": "design-md", "path": "skills/design-md", @@ -3086,6 +3077,15 @@ "risk": "safe", "source": "https://github.com/google-labs-code/stitch-skills/tree/main/skills/design-md" }, + { + "id": "design-orchestration", + "path": "skills/design-orchestration", + "category": "uncategorized", + "name": "design-orchestration", + "description": "Orchestrates design workflows by routing work through brainstorming, multi-agent review, and execution readiness in the correct order. Prevents premature implementation, skipped validation, and unreviewed high-risk designs.", + "risk": "unknown", + "source": "community" + }, { "id": "devops-troubleshooter", "path": "skills/devops-troubleshooter", @@ -4125,10 +4125,10 @@ "id": "haskell-pro", "path": "skills/haskell-pro", "category": "uncategorized", - "name": "Haskell Pro", - "description": "- Working on haskell pro tasks or workflows - Needing guidance, best practices, or checklists for haskell pro", + "name": "haskell-pro", + "description": "Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "helm-chart-scaffolding", @@ -5187,10 +5187,10 @@ "id": "multi-agent-brainstorming", "path": "skills/multi-agent-brainstorming", "category": "uncategorized", - "name": "Multi Agent Brainstorming", - "description": "Transform a single-agent design into a **robust, review-validated design** by simulating a formal peer-review process using multiple constrained agents.", + "name": "multi-agent-brainstorming", + "description": "Use this skill when a design or idea requires higher confidence, risk reduction, or formal review. This skill orchestrates a structured, sequential multi-agent design review where each agent has a strict, non-overlapping role. It prevents blind spots, false confidence, and premature convergence.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "multi-agent-patterns", @@ -5273,6 +5273,24 @@ "risk": "unknown", "source": "vibeship-spawner-skills (Apache 2.0)" }, + { + "id": "nerdzao-elite", + "path": "skills/nerdzao-elite", + "category": "uncategorized", + "name": "nerdzao-elite", + "description": "Senior Elite Software Engineer (15+) and Senior Product Designer. Full workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation.", + "risk": "safe", + "source": "community" + }, + { + "id": "nerdzao-elite-gemini-high", + "path": "skills/nerdzao-elite-gemini-high", + "category": "uncategorized", + "name": "nerdzao-elite-gemini-high", + "description": "Modo Elite Coder + UX Pixel-Perfect otimizado especificamente para Gemini 3.1 Pro High. Workflow completo com foco em qualidade m\u00e1xima e efici\u00eancia de tokens.", + "risk": "safe", + "source": "community" + }, { "id": "nestjs-expert", "path": "skills/nestjs-expert", @@ -5619,10 +5637,10 @@ "id": "performance-engineer", "path": "skills/performance-engineer", "category": "uncategorized", - "name": "Performance Engineer", - "description": "You are a performance engineer specializing in modern application optimization, observability, and scalable system performance.", + "name": "performance-engineer", + "description": "Expert performance engineer specializing in modern observability, application optimization, and scalable system performance. Masters OpenTelemetry, distributed tracing, load testing, multi-tier caching, Core Web Vitals, and performance monitoring. Handles end-to-end optimization, real user monitoring, and scalability patterns. Use PROACTIVELY for performance optimization, observability, or scalability challenges.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "performance-profiling", @@ -6366,10 +6384,10 @@ "id": "search-specialist", "path": "skills/search-specialist", "category": "uncategorized", - "name": "Search Specialist", - "description": "- Working on search specialist tasks or workflows - Needing guidance, best practices, or checklists for search specialist", + "name": "search-specialist", + "description": "Expert web researcher using advanced search techniques and synthesis. Masters search operators, result filtering, and multi-source verification. Handles competitive analysis and fact-checking. Use PROACTIVELY for deep research, information gathering, or trend analysis.", "risk": "unknown", - "source": "unknown" + "source": "community" }, { "id": "secrets-management", From c8831a47434692ca1cc547f311dffb4364a13e9f Mon Sep 17 00:00:00 2001 From: sck_0 Date: Sun, 22 Feb 2026 08:33:31 +0100 Subject: [PATCH 9/9] chore: release 6.0.0 Co-authored-by: Cursor --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ README.md | 6 +++--- package.json | 2 +- skills/nerdzao-elite/SKILL.md | 4 ++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 765b301a..9b985239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [6.0.0] - 2026-02-22 - "Codex YAML Fix & Community PRs" + +> **Major release: Codex frontmatter fixes, AWS Security & Compliance skills, Antigravity Workspace Manager CLI, and validation fixes.** + +This release addresses Codex invalid YAML warnings (issue #108) via frontmatter fixes, adds AWS Security & Compliance skills and the official Antigravity Workspace Manager CLI companion, and fixes validation for nerdzao-elite skills. + +## New Skills + +- **AWS Security & Compliance** (PR #106): `aws-compliance-checker`, `aws-iam-best-practices`, `aws-secrets-rotation`, `aws-security-audit`. +- **nerdzao-elite**, **nerdzao-elite-gemini-high**: Elite workflow skills (validation fixes in-repo). + +## Improvements + +- **Frontmatter**: Fixed YAML frontmatter in code-reviewer, architect-review, c-pro, design-orchestration, haskell-pro, multi-agent-brainstorming, performance-engineer, search-specialist (PR #111) — reduces Codex "invalid YAML" warnings (fixes #108). +- **Antigravity Workspace Manager**: Official CLI companion to auto-provision skill subsets across environments (PR #110); documented in Community Contributors. +- **Registry**: Now tracking 889 skills. +- **Validation**: Added frontmatter and "When to Use" for nerdzao-elite / nerdzao-elite-gemini-high. + +## Credits + +- **@Vonfry** for frontmatter YAML fixes (PR #111) +- **@ssumanbiswas** for AWS Security & Compliance skills (PR #106) +- **@amartelr** for Antigravity Workspace Manager CLI (PR #110) +- **@fernandorych** for branch sync (PR #109) +- **@Rodrigolmti** for reporting Codex YAML issue (#108) + +--- + +_Upgrade now: `git pull origin main` to fetch the latest skills._ + ## [5.10.0] - 2026-02-21 - "AWS Kiro CLI Integration" > **Native support and integration guide for AWS Kiro CLI, expanding the repository's reach to the AWS developer community.** diff --git a/README.md b/README.md index 75ba736c..7cb4b51e 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ This repository provides essential skills to transform your AI assistant into a ## New Here? Start Here! -**Welcome to the V5.10.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. +**Welcome to the V6.0.0 Workflows Edition.** This isn't just a list of scripts; it's a complete operating system for your AI Agent. ### 1. 🐣 Context: What is this? -**Antigravity Awesome Skills** (Release 5.10.0) is a massive upgrade to your AI's capabilities. +**Antigravity Awesome Skills** (Release 6.0.0) is a massive upgrade to your AI's capabilities. AI Agents (like Claude Code, Cursor, or Gemini) are smart, but they lack **specific tools**. They don't know your company's "Deployment Protocol" or the specific syntax for "AWS CloudFormation". **Skills** are small markdown files that teach them how to do these specific tasks perfectly, every time. @@ -246,7 +246,7 @@ npx antigravity-awesome-skills **Bundles** are curated groups of skills for a specific role or goal (for example: `Web Wizard`, `Security Engineer`, `OSS Maintainer`). -They help you avoid picking from 883+ skills one by one. +They help you avoid picking from 889+ skills one by one. ### ⚠️ Important: Bundles Are NOT Separate Installations! diff --git a/package.json b/package.json index 6ccc937a..01ae0ae0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "antigravity-awesome-skills", - "version": "5.10.0", + "version": "6.0.0", "description": "883+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.", "license": "MIT", "scripts": { diff --git a/skills/nerdzao-elite/SKILL.md b/skills/nerdzao-elite/SKILL.md index ab772998..b3b02d28 100644 --- a/skills/nerdzao-elite/SKILL.md +++ b/skills/nerdzao-elite/SKILL.md @@ -25,3 +25,7 @@ Workflow obrigatório (sempre na ordem): 8. Verificação final Nunca entregue UI quebrada. Priorize sempre pixel-perfect + produção-grade. + +## When to Use + +Use when you need a full senior engineering workflow with planning, architecture, TDD, clean code, and pixel-perfect UX validation in Portuguese (Brazil).